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