-
Makefile之书写命令
-
命令书写位置:
1.[Tab]键后
2.依赖规则的分号后
3.注释符:“#”。
一、显示命令
1.不显示命令: 在命令行前添加@
例如:
@echo 正在编译XXX模块......
该命令在make执行时,屏幕显示:“正在编译XXX模块......”。
但是如果不添加@,将显示“echo 正在编译XXX模块......”。2.只显示命令:
make执行时,带参数“-n”或“--just-print”有利于调试Makefile。
3.全面禁止命令的显示:
make执行时,带参数“-s”或“--slient”。
二、命令执行
1.条件命令
上一条命令的结果应用于下一条命令,使用分号分隔这两条命令(同一行)。例如:比如第一条命令是cd,第二条命令在cd之后的基础上运行。那么不能把这两条命令写在两行上,应该将两命令写在一行上,用分号分隔。示例一:
exec:
cd /home/hchen
pwd示例二:
exec:
cd /home/hchen; pwd说明:第一个例子cd没有作用;pwd不会打印出“/home/hchen”
第二个例子cd起作用了,pwd会打印出“/home/hchen”。三、命令出错
make执行时,检测每个命令执行结果的返回码,如果成功,make执行下一条命令;如果规则中某个命令出错了(命令退出码非零),终止执行当前规则,这将有可能终止所有规则的执行。忽略出错命令:
1.在Makefile命令行前加一个减号“-”(在Tab键之后)。
示例一:
clean:
-rm -f *.o2.添加“-i”或是“--ignore-errors”参数执行make命令。
注意:1.如果一个规则以“.IGNORE”为目标,该规则中所有命令将会忽略错误。
2.make参数“-k”或“--keep-going”意思为:如果某规则中的命令出错了,终止该规则的执行,但继续执行其它规则。四、嵌套执行make
一些大工程,把不同模块或不同功能源文件放在不同的目录中,在每个目录中都书写该目录的Makefile,这样的Makefile不仅简洁,而且有利于维护同时有利于模块编译和分段编译。示例一:有一个子目录subdir,该目录下有个Makefile文件来指明该目录下文件的编译规则。
总控的Makefile可以这样书写:
subsystem:
cd subdir && $(MAKE)其等价于:
subsystem:
$(MAKE) -C subdir说明:1.宏变量$(MAKE)是带有些参数的make命令,这样有利于维护。
2.上面命令的意思是先进入"subdir"目录,然后执行make命令。
3.总控Makefile的变量可以传递到下级Makefile中(如果你显示的声明),不会覆盖下层的Makefile中所定义的变量。Makefile变量说明:
1.总控Makefile中使用“-e”参数覆盖下一层Makefile中的变量。
2.父级Makefile向子级Makefile传送变量方式:export <variable ...>
3.禁止父级Makefile向子级Makefile传送变量:unexport <variable ...>
4.传递所有只要一个export就行,后面什么也不用跟.
5.两个系统变量SHELL,MAKEFLAGS,总是要传递到下层Makefile中
6.MAKEFILES包含了make的参数信息
7.make命令中不往下传递的参数“-C”,“-f”,“-h”“-o”和“-W”
8.如果不想向下传递MAKEFILES变量,可以这样:
subsystem:
cd subdir && $(MAKE) MAKEFLAGS=
9.MAKEFLAGS使用时确保其中的选项是大家都会用到,特别注意“-t”,“-n”,和“-q”参数
10.make的过程中输出目前工作目录的信息可以使用“-w”或是“--print-directory”参数
11.自动打开下层Makefile的"-w"参数使用“-C”参数
12.关闭Makefile的"-w"参数使用“-s”(“--slient”)或是“--no-print-directory”参数示例一:父级Makefile向子级Makefile传送变量
export variable = value
其等价于:
variable = value示例二:
export variable := value
其等价于:
variable := value
export variable示例三:
export variable += value
其等价于:
variable += value
export variable
示例四:
我们下级make目录是“/home/hchen/gnu/make”,使用“make -w”执行。
进入该目录时,我们会看到:
make: Entering directory `/home/hchen/gnu/make'.
而在完成下层make后离开目录时,我们会看到:
make: Leaving directory `/home/hchen/gnu/make'
五、定义命令包
命令包功能:
简化相同命令的序列,相当于C程序中宏,函数的作用说明:
如果Makefile中出现一些相同命令序列,那么可以为这些相同的命令序列定义一个变量。在使用该命令序列的地方使用命令包。命令包定义:以“define”开始,以“endef”结束。示例一:
define run-yacc
yacc $(firstword $^)
mv y.tab.c $@
endef示例说明:1."run-yacc":命令包的名字,注意不要和Makefile中的变量重名。
2.在“define”和“endef”中的两行就是命令序列。
3.yacc为语法分析器。因为Yacc程序总是生成“y.tab.c”的文件,所以第二行的命令就是把这个文件改名字。
4.详细说明:
foo.c : foo.y
$(run-yacc)
命令包“run-yacc”中的“$^”就是“foo.y”;
“$@”就是“foo.c”;
make在执行命令包时,命令包中的每个命令会被依次独立执行。(整理自网络)最近更新时间:2007-09-04 14:59:59
2007-09-04 14:59:59