make规则中的编译顺序

时间:2014-02-20 21:59:22

标签: makefile gnu-make

我有一个编译规则如下,

    $(compiled_objs) : $(obj_dir)/%.o: $(src_base)/%.cpp

它从src_base中的特定.cpp文件创建.o dso对象,并且工作正常。

问题: 我的问题是,在gnu Makefiles中有一种方法可以对处理%.cpp文件的顺序进行排序。例如,在每个src_base中,我有一个名为xxxLast.cpp的文件,我想在$ src_dir目录中的所有其他.cpp文件已经被处理之后为* Last.cpp创建对象。

用例: 我的用例并不常见,但我想嵌入xxxLast.cpp文件中所有其他.o对象的md5sum,我可以在其规则中添加其他处理。

我在makefile上做了很多工作。将非常感谢帮助,并提前感谢。

1 个答案:

答案 0 :(得分:1)

在makefile中的其他位置,您将拥有一个取决于$(compiled_objs)的目标:

all_objects: $(compiled_objs)

Make将按照列出的顺序构建任何目标的先决条件。因此,如果您希望最后构建一个特定对象,那么您只需将它放在compiled_objs宏的末尾。

请注意,在并行构建期间make仍然会按照相同的顺序运行命令,但是由于并行化效果,它们实际上可能以不同的顺序运行,或者至少你不知道最后一个将是在所有之前的完成之后开始。

根据您的情况,我真的不建议只是在最后粘贴最后一个对象并希望。您应该使用make规则明确定义此关系,所以:

all_objects: xxxLast.o

xxxLast.o: $(compiled_objs-but-not-xxxLast.o)
        ...generate md5sums for $^...

xxxLast.o $(compiled_objs-but-not-xxxLast.o): $(obj_dir)/%.o: $(src_base)/%.cpp