all clean:
@echo "\$$@ = $@"
@echo "MAKECMDGOALS = $(MAKECMDGOALS)"
@MAKECMDGOALS是你给这个Makefile输入的目标是什么.(如果不输入,就是空,输入什么就是什么)
root@ubuntu:/home/makefile# make
$@ = all //不输入目标,默认第一个目标就是最终目标MAKECMDGOALS = //不输入就为空.
root@ubuntu:/home/makefile# make all
$@ = all
MAKECMDGOALS = all
root@ubuntu:/home/makefile# make clean //输入哪个,哪个就是这个Makefile的最终目标.
$@ = clean
MAKECMDGOALS = clean
root@ubuntu:/home/makefile# make all clean //两个目标都执行.
$@ = all
MAKECMDGOALS = all clean //不管怎么样, 你给这个Makefile输入了几个目标,MAKECMDGOALS就是那个目标值.
$@ = clean
MAKECMDGOALS = all clean
///
x = foo
y = $(x) z //对于这种变量= ,Makefile只对他进行从头到尾的扫描. 第一次扫描得到 $(x) = foo后,继续扫描得到$(x)=later --->y = later z
x = later
xx := foo
yy := $(xx) z //对于这种变量:= ,Makefile只对他进行一次扫描. 第一次扫描得到 $(xx) = foo后,就不再扫描下面有没有$(xx)
xx := later
xxx =
xxx ?= zhang //对于这种变量?=,如果前面赋值了,就以前面的为主,如果没有赋值,就以后面的为主.
yyy ?=quan
//可以在make后面带参数 make yyy=12345 就相当在里面赋值了 , 也可以在终端 里面 export yyy=12345,两种结果一样.
//先xxx = () 已经赋值了,我们不希望这个值被make后面带的参数给覆盖了, 可以这样来修饰xxx ---> (oveeride xxx= () ) .
all:
@echo "$(x)"
@echo "$(y)"
@echo "$(xx)"
@echo "$(yy)"
@echo "$(xxx)"
@echo "$(yyy)"
later
later z
later
foo z
(空)
quan
/
object1 = main.c foo.c bar.c
object1 += anoter.c //对于这种+=Makefile, 就相当于a+=b -------------------> a = a + b;
object2 = main.c foo.c bar.c
object2 := $(object2) anoter.c
object3 := main.c foo.c bar.c
object3 += anoter.c
all:
@echo $(object1)
@echo $(object2)
@echo $(object3)
main.c foo.c bar.c anoter.c
main.c foo.c bar.c anoter.c
main.c foo.c bar.c anoter.c