一。以下可在任何位置执行,因为都是符合gnu make语法的:
$(warning text...) 继续执行, 这个可用来检查make是否走到了这里
$(error text...) 退出,这个可用来检查make是否走到了这里
二。以下要在recipe区域才可执行,因为都是shell命令:
read 等待从键盘输入任意值才继续执行
echo 在屏幕上输出信息
make 的执行顺序是先执行prerequisite,再执行recipe
很多target的recipe是空的。主要目地就是为了执行prerequisite
分析下面的Makefile,可以加深对上述说法的理解。
02 $(sandwich):
03
04 ifeq ($(.DEFAULT_GOAL),)
05 $(warning no default goal is set)
06 else
07 $(warning default goal is $(.DEFAULT_GOAL))
08 endif
09 ifeq (0,1)
10 else
11 .PHONY: bar
12 bar:
13 @echo "in bar"
14 ifeq ($(.DEFAULT_GOAL),)
15 $(warning no default goal is set)
16 else
17 $(warning default goal is $(.DEFAULT_GOAL))
18 endif
19 .PHONY: dist_libraries
20 dist_libraries:
21 @echo "in dist_libraries"
22 .PHONY: droidcore
23 droidcore: droidcore-2
24 @echo "in droidcore"
25 droid: droidcore dist_libraries
26 $(warning in 1st line)
27 $(warning in 2nd line)
28 @echo $(shell pwd)
29 date
30 @echo "in droid"
31
32 $(warning after droid 1)
33 $(warning after droid 2)
34 .PHONY: clean
35 clean:
36 @echo "in clean"
37 .PHONY:droidcore-4
38 .PHONY:droidcore-3
39 droidcore-4:
40 @echo "in droidcore-4"
41 droidcore-3:droidcore-4
42 @echo "in droidcore-3"
43 .PHONY: clobber
44 clobber: clean
45 @echo "in clobber"
46 endif
47
48 .PHONY: showcommands
49 showcommands:
50 @echo >/dev/null
51
52
53 .PHONY:droidcore-2
54 droidcore-2:droidcore-3
55 @echo "in droidcore-2"
make执行后的结果是:
$ make
Makefile:7: default goal is droid
Makefile:17: default goal is droid
Makefile:33: after droid 2
in droidcore-4
in droidcore-3
in droidcore-2
in droidcore
in dist_libraries
Makefile:26: in 1st line
Makefile:26: in 2nd line
Makefile:26: after droid 1
/home/android/Documents/test
date
Mon Nov 28 11:50:00 CST 2011
in droid
但如果把makefile改为如下:
Makefile语言: Codee#24288
01 sandwich := droid
02 #$(sandwich):
03
04 ifeq ($(.DEFAULT_GOAL),)
05 $(warning no default goal is set)
06 else
07 $(warning default goal is $(.DEFAULT_GOAL))
08 endif
09 ifeq (0,1)
10 else
11 .PHONY: bar
12 bar:
13 @echo "in bar"
14 ifeq ($(.DEFAULT_GOAL),)
15 $(warning no default goal is set)
16 else
17 $(warning default goal is $(.DEFAULT_GOAL))
18 endif
19 .PHONY: dist_libraries
20 dist_libraries:
21 @echo "in dist_libraries"
22 .PHONY: droidcore
23 droidcore: droidcore-2
24 @echo "in droidcore"
25 droid: droidcore dist_libraries
26 $(warning in 1st line)
27 $(warning in 2nd line)
28 @echo $(shell pwd)
29 date
30 @echo "in droid"
31
32 $(warning after droid 1)
33 $(warning after droid 2)
34 .PHONY: clean
35 clean:
36 @echo "in clean"
37 .PHONY:droidcore-4
38 .PHONY:droidcore-3
39 droidcore-4:
40 @echo "in droidcore-4"
41 droidcore-3:droidcore-4
42 @echo "in droidcore-3"
43 .PHONY: clobber
44 clobber: clean
45 @echo "in clobber"
46 endif
47
48 .PHONY: showcommands
49 showcommands:
50 @echo >/dev/null
51
52
53 .PHONY:droidcore-2
54 droidcore-2:droidcore-3
55 @echo "in droidcore-2"
则输出如下内容:
$ make
Makefile:5: no default goal is set
Makefile:17: default goal is bar
Makefile:33: after droid 2
in bar