我有一个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
答案 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
基于Beta's answer的一点改进。
-include generator-task
.PHONY : generator-task
generator-task : $(gen_files)
$(gen_files) : $(gen_prerequisites)
# generate the file here
不会在每次调用Make时运行生成器,而只会在其中一个先决条件发生更改时重新生成文件。