MAKE手册中的注意点之“多目标”

来源:互联网 发布:proe是什么软件 编辑:程序博客网 时间:2024/06/05 10:20

 

4.10 多目标

一个规则中可以有多个目标,规则所定义的命令对所有的目标有效。一个具有多目标的规则相当于多个规则。规则中命令对不同的目标的执行效果不同,因为在规则的命令中可能使用自动环变量“$@”。多目标规则意味着所有的目标具有相同的依赖文件。多目标通常用在以下两种情况:

Ø        仅需要一个描述依赖关系的规则,而不需要在规则中定义命令。例如

kbd.o command.o files.o: command.h

      

这个规则实现了给同时给三个目标文件指定一个依赖文件。

²       对于多个具有类似重建命令的目标。重建这些目标的命令并不需要是绝对相同,因为我们可以在命令行中使用make的自动环变量“$@”来引用具体一个目标,并完成对它的重建(可参考 9.5.3 自动化变量 一小节)。例如规则:

 

bigoutput littleoutput : text.g

         generate text.g -$(subst output,,$@) > $@

其等价于:

 

bigoutput : text.g

          generate text.g -big > bigoutput

littleoutput : text.g

          generate text.g -little > littleoutput

 

例子中的“generate”根据命令行参数来决定输出文件的类型。使用了make的字符串处理函数“subst”来根据目标产生对应的命令行选项。

虽然在多目标的规则中,可以根据不同的目标使用不同的命令(在命令行中使用自动化变量“$@”)。但是,多目标的规则并不能做到根据目标文件自动改变依赖文件,就像我们在上边例子中使用自动化变量“$@”来改变规则的命令一样。需要实现这个目的是,要用到make的静态模式

 

4.11 多规则目标

Makefile中,一个文件可以作为多个规则的目标出现。这种情况时,此目标文件的所有依赖文件将会被合并成此目标一个依赖文件列表,其中任何一个依赖文件比目标更新(比较目标文件和依赖文件的时间戳)时,make将会执行特定的命令来重建这个目标。

对于一个多规则的目标,重建此目标的命令只能出现在一个规则中(可以是多条命令)。如果多个规则同时给出重建此目标的命令,make将使用最后一个规则所有的命令,同时提示错误信息(一个特殊的例外是:使用“.”开头的多规则目标文件,可以在多个规则中给出多个重建命令。这种方式只是为了和其他版本make进行兼容,一般在GNU make中应该避免使用这个功能)。某些情况下,需要对相同的目标使用不同的规则中所定义的命令,这种情况我们可使用另外一种方式“双冒号”规则来实现。

一个仅仅描述依赖关系的描述规则可用来给出一个或做多个目标文件的依赖文件。例如,Makefile中通常存在一个变量,就像以前我们提到的“objects”,它定义为所有的需要编译生成的.o文件的列表。当这些.o文件在其源文件所包含的头文件“config.h”发生变化之后能够自动的被重建,我们可以使用多目标像下边那样来书写我们的Makefile

 

 

objects = foo.o bar.o

foo.o : defs.h

bar.o : defs.h test.h

$(objects) : config.h

 

这样做的好处是:我们可以在源文件中增加或者删除了包含的头文件以后不用修改已经存在的Makefile的规则,只需要增加或者删除某一个.o文件依赖的头文件。这种方式很简单也很方便。对于一个大的工程来说,这样做的好处是显而易见的。在一个大的工程中,对于一个单独目录下的.o文件的依赖规则建议使用此方式。规则中头文件的依赖描述也可以使用GCC自动产生。可参考 3.14 自动产生依赖 一节

另外,我们也可以通过一个变量来增加目标的依赖文件,使用make的命令行来指定某一个目标的依赖头文件,例如:

 

extradeps=

$(objects) : $(extradeps)

 

它的意思是:如果我们执行“make extradeps=foo.h”那么“foo.h”将作为所有的.o文件的依赖文件。当然我们只执行“make”的话,就没有指定任何文件作为.o文件的依赖文件。

在多规则的目标中,如果目标的任何一个规则没有定义重建此目标的命令,make将会寻找一个合适的隐含规则来重建此目标。关于隐含规则可参考 第九章 make的隐含规则

 

 

 

 

 

原创粉丝点击