如何确保在makefile中的所有其他构建规则之前运行目标?

时间:2012-05-23 19:09:47

标签: makefile

我有一个C ++项目,其中包含所有其他C ++文件所依赖的生成文件。我试图在任何其他编译开始之前强制生成和编译该文件。通常它就像将该文件放在all:目标中一样简单,但复杂的是我的Makefile也是由构建系统生成的,我只能将片段附加到Makefile,而不是编辑它一般

那么,有没有办法强制生成的文件目标首先通过依赖项或其他方式运行?我想过要用这样的东西:

cpp_files := $(wildcard src/*.cpp)
$(cpp_files): generated_file.cpp
generated_file.cpp:
    # generate the file here

但它似乎不起作用。作为参考,我的源目录结构是这样的,所以我需要递归地收集cpp文件:

src/
|---file1.cpp
|---file2.cpp
|---subdir1/
    |---file3.cpp

gen/
|---generated_file.cpp

2 个答案:

答案 0 :(得分:17)

如果你确定这真的是你想要的,这里有一种方法:为一个伪文件制定一个规则,makefile将include

.PHONY: dummy
dummy:
    # generate the file here

-include dummy

无论您指定的目标是什么,Make都会先运行dummy规则,然后重新启动。

答案 1 :(得分:2)

实际上,其他cpp文件不依赖于生成的文件(根据Make规则)。依赖关系图仍然如下:

program
 |
 ^- file1.o
 |   ^- file1.c
 |
 ^- file2.o
 |   ^- file2.c
 |
 ^- generated_file.o
     ^- generated_file.c
         ^- <generator prerequisites>

您的源文件只能依赖于某种生成的头文件(如果这些来源为#include d)。

如果只需要生成cpp文件,则以下makefile就足够了:

srcs := $(wildcard src/*.cpp src/*/*.cpp)

gen_file := gen/generated_file.cpp
srcs += $(gen_file)

objs := $(srcs:.cpp=.o)

.PHONY : all
all : program

program : $(objs)
    @$(LD) ...

%.o : %.c
    @$(CC) ...

$(gen_file) :
    # generate the file here

UPD。

基于Beta's answer的一点改进。

-include generator-task
.PHONY : generator-task

generator-task : $(gen_files)

$(gen_files) : $(gen_prerequisites)
    # generate the file here

不会在每次调用Make时运行生成器,而只会在其中一个先决条件发生更改时重新生成文件。