1: shell命令行必须以[TAB]开头,默认使用shell版本为/bin/sh,即环境变量中SHELL变量指定的程序。使用#进行注释。
2: 通过@来关闭命令回显,只显示执行的结果。
Example:
foo.o:foo.c
echo "$@"
Output:
echo foo.o
foo.o
Example1:
foo.o:foo.c
@echo "$@"
Output:
foo.o
3: make -n 或者 --just-print参数,只会打印执行的命令,不去执行,包括被@修饰的命令。有助于makefile排错。
4: make -s 或者 --slient, 禁止所有执行命令显示,就相当于在所有命令前加上@。但是-s没有@灵活,建议使用@来控制命令回显。
5: makefile中的每行的命令是起用单独的shell进程执行的,所以上一行的结果不会影响到下一行,比如
foo.o:foo.c
cd /tmp
touch test.txt
以上makefile,cd和touch这两个命令是在不同的shell中执行的,所以test.txt并没有创建在/tmp中。
如果要让多条shell命令产生关联,则需要写在同一行,即使要写在多行,最后需要用\来多行命令进行连接,\后面不可有空格,tab等字符。
foo.o:foo.c
cd /tmp; \
touch test.txt
foo.o:foo.c
cd /tmp; touch test.txt
6: make -j 或者--job 同一时刻允许多条命令执行,也就是起多个子进程进行执行make命令。
make -j 3 #同时起三个进程进行make
当有个命令执行失败时,其他的所有进程都会失败。选用-k 或者 --keep-going,其他进程都会继续执行。
可通过-l 或者 --max-load来设置超过预定的负载时,不起用多进程。
make -j 3 -l 2.5 # 当系统负载超过2.5时,不启用多进程make
7: '-',可以忽略shell执行的失败,而不退出make执行。
clean:
-rm -rf *.o #当shell命令执行错误时,忽略错误
8: make -k 或 --keep-going,在工程中,如果命令执行错误,还会继续执行,直到最后连接失败。
这样可以在多个文件同时修改时,可以一次直到那些文件编译成功,那些编译失败。
9: make递归执行,在存在多级子目录的项目中很有用。通过-C参数,执行子目录下的makefile。
make -C xx/ #执行xx目录下的makefile
10: make通过CURDIR来获取当前的工作目录。当make在子目录下执行时,CURDIR将会被重新赋值。
11: 使用MAKE变量替换make命令,通过$(MAKE)引用变量的值,当make版本发生改变时,不需要大面积需改,只需修改MAKE变量即可。
12: make -t 只更新目标的时间戳,不执行命令
make -n 只打印命令,不执行命令
make -q 只检查目标是否过期,过期则返回1,没过期则返回0.
make的参数可以放在MAKEFLAGS,这个参数会传递给下一个子目录的程序中
13:
1)需要将变量在所有makefile中被引用,则需要使用export修饰。没有export修饰的,只在本makefile中生效。
export AAA = 100 #那么这个AAA在所有makefile中都可以被使用,其值为100
也可使用 make -e AAA = 100
2)可以使用unexport参数来使得export参数失效。
unexport AAA
3)MAKEFILES这个变量默认传递到所有makefile中,除非特意unexport
Example:
export CFLAGS += -g
等价于
CFLAGS += -g
export CFLAGS
14: MAKELEVEL 表示当前makefile的深度。主控的MAKELEVEL为0
ifeq($(MAKELEVEL), 0)
all : msg
else
all : other
endif
15: make -w 或者 --print-drectory,来打印进入和离开目录的信息(执行cd或者-C,目录切换的信息)
make --no-print-directory ,禁止打印目录相关信息
16: 定义命令包,通过引用命令包,执行多个命令。
define mycmd
@echo "xxxx $<"
@echo "yyyy $@"
@-rm -rf a.txt
endef
foo.o:foo.c
@$(mycmd)
阅读(1901) | 评论(0) | 转发(0) |