Makefile之书写命令()

来源:互联网 发布:濮阳市网络公务员 编辑:程序博客网 时间:2024/05/06 05:32
 
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”。
 
三、命令出错
    make执行时,检测每个命令执行结果的返回码,如果成功,make执行下一条命令;如果规则中某个命令出错了(命令退出码非零),终止执行当前规则,这将有可能终止所有规则的执行。
忽略出错命令:

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