example-1
PATH=$(shell pwd)
all:
echo ${PATH}
echo $$PATH
echo /Users/mm/Documents/vad_test/rtc/
/Users/mm/Documents/vad_test/rtc/
echo $PATH /
/Users/mm/Documents/vad_test/rtc/
example-2:在test下,建立a.c和b.c两个文件,在sub目录下,建立sa.c和sb.c两个 个文件
src=$(wildcard *.c ./sub/*.c)
dir=$(notdir $(src))
obj=$(patsubst %.c,%.o,$(src))
abc=$(filter-out .%a.c, $(src))
all:
echo $(src)
echo $(dir)
echo $(obj)
echo "end"
echo $(abc)
echo a.c b.c ./sub/sa.c ./sub/sb.c
a.c b.c ./sub/sa.c ./sub/sb.c
echo a.c b.c sa.c sb.c
a.c b.c sa.c sb.c
echo a.o b.o ./sub/sa.o ./sub/sb.o
a.o b.o ./sub/sa.o ./sub/sb.o
echo “end”
end
echo a.c b.c ./sub/sb.c
a.c b.c ./sub/sb.c
example-3:在test下,建立Makefile.config和Makefile.1两个文件
Makefile.1:
CPU_ONLY := 1
Makefile.config
CONFIG_FILE := Makefile.config
# Explicitly check for the config file, otherwise make -k will proceed anyway.
ifeq ($(wildcard $(CONFIG_FILE)),)
$(info $(wildcard $(CONFIG_FILE)) not found. See $(CONFIG_FILE).example.)
endif
include $(CONFIG_FILE)
$(info $(CPU_ONLY))
CPU_ONLY := 8
all:
@echo $(CPU_ONLY)
执行:make -f Makefile.1
1
8
example-4:文件名为abc
PROTO_SRCS := src/caffe/proto/caffe.proto
RESULT := ${PROTO_SRCS:.proto=.pb.h}
all:
@echo $(RESULT)
执行:make -f abc
src/caffe/proto/caffe.pb.h
example-5:|
OBJDIR := objdir
OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o)
$(OBJDIR)/%.o : %.c
$(COMPILE.c) $(OUTPUT_OPTION) $<
$(info COMPILE.c=$(COMPILE.c))
$(info OUTPUT_OPTION=$(OUTPUT_OPTION))
all: $(OBJS)
$(OBJS): | $(OBJDIR)
$(OBJDIR):
@echo "mkdir"
mkdir $(OBJDIR)
objdir目录下新建foo.c,bar.c,baz.c三个文件
执行: make
COMPILE.c=cc -c
OUTPUT_OPTION=-o
cc -c -o objdir/foo.o objdir/foo.c
cc -c -o objdir/bar.o objdir/bar.c
cc -c -o objdir/baz.o objdir/baz.c
说明:
- 从第一个 target(排除以 . 开头的 target,比如 .PHONY)开始,这个就是默认目标,本次任务的终极目标(或者可以显式设定 .DEFAULT_GOAL)。 比如在下面的 基本例子 中,edit 就是终极目标。
- 判断目标是否存在, 依赖的对象是否有更新
- 根据依赖关系一步一步追溯查找,建立依赖关系链,执行需要执行的命令,最终输出终极目标。
- 没有在依赖链上的目标是不会被直接执行到的,比如 clean。
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
# make读取到的第一个target, 默认设置为 终极目标
edit: $(objects)
cc -o edit $(objects)
# 隐含规则, make 根据 xx.o 推导出依赖 xx.c, 以及相应的编译命令
# 如 -> main.o: defs.h
# 等同 :
# -> main.o: main.c defs.h
# -> cc -o main.o main.c defs.h
main.o: defs.h
kbd.o: defs.h command.h
command.o: defs.h command.h
display.o: defs.h buffer.h
insert.o: defs.h buffer.h
search.o: defs.h buffer.h
files.o: defs.h buffer.h command.h
utils.o: defs.h
# .PHONY 定义为目标 clean
# 和 edit 没有依赖关系 直接执行 make 是不会运行到的
# 通过 make clean 执行
.PHONY: clean
clean:
-rm edit $(objects)**
.PHONY:mefirst mefirst2
mefirst:
@echo "I'm first"
mefirst2:
@echo "I'm first too!"
normaltarget:normaltarget2 | mefirst2
@echo "normaltarget done"
normaltarget2:a b c
@echo "normaltarget2 done"
helloworld:normaltarget | mefirst
@echo "helloworld done"
.DEFAULT_GOAL := go
go:helloworld
@echo "go done"
a:
@echo a
b:
@echo b
c:
@echo c
a
b
c
normaltarget2 done
I’m first too!
normaltarget done
I’m first
helloworld done
go done
a:
@echo "a"
b:
@echo "b"
a
make a
a: b
touch a
b: c
touch b
c:
touch c
x: | y
touch x
y: | z
touch y
z:
touch z
touch c
touch b
touch a
make x
touch z
touch y
touch x
:~$ touch c
:~$ make a
touch b
touch a
:~$ touch z
:~$ make x
make: `x' is up to date.
:~$ rm c
:~$ make a
touch c
touch b
touch a
:~$ rm z
:~$ make x
touch z
example-6:Makefile
all: draw f1 f2
draw: gg
@echo "****"
f2:
@echo "----"
f1:
@echo "+++++"
gg:
@echo "000000"
000000
****
+++++
----
example-6:执行流程
.PHONY: all
all: m n $(info pre_all)
$(info recipe_all)
m: m1 m2 $(info pre_m)
$(info recipe_m)
n: n1 n2 m2 $(info pre_n)
$(info recipe_n)
m1: $(info pre_m1)
$(info recipe_m1)
m2: $(info pre_m2)
$(info recipe_m2)
n1: $(info pre_n1)
$(info recipe_n1)
n2: $(info pre_n2)
$(info recipe_n2)
pre_all
recipe_all
pre_m
recipe_m
pre_n
recipe_n
pre_m1
recipe_m1
pre_m2
recipe_m2
pre_n1
recipe_n1
pre_n2
recipe_n2
example-7:.SUFFIXES
https://www.cnblogs.com/gaojian/archive/2012/09/21/2696482.html