Makefile之书写命令 2007-09-04 14:59:59
命令书写位置: 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”。
三、命令出错
忽略出错命令:
1.在Makefile命令行前加一个减号“-”(在Tab键之后)。 示例一: clean: -rm -f *.o
2.添加“-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
















