I have a C++ project which contains a generated file that all the other C++ files depend on. I'm trying to force that file to be generated and compiled before any other compilation begins. Usually it'd be as simple as putting that file first in the all:
target, but the complication is that my Makefile is also generated by a build system, and I can only append fragments to the Makefile, not edit it in general.
So, is there a way to force that generated file target to run first, via dependencies or otherwise? I've thought of using something like this:
cpp_files := $(wildcard src/*.cpp)
$(cpp_files): generated_file.cpp
generated_file.cpp:
# generate the file here
But it doesn't seem to work. For reference, my source dir structure is like this, so I need to collect the cpp files recursively:
src/
|---file1.cpp
|---file2.cpp
|---subdir1/
|---file3.cpp
gen/
|---generated_file.cpp
Actually, other
cpp
files don't depend on the generated one (in terms of Make rules). Dependency graph still looks like:Your source files could only depend on some kind of generated header file (in case when it is
#include
d by these sources).If you need to generate only a
cpp
file then the following makefile should be sufficient:UPD.
A little improvement based on Beta's answer.
Instead of running generator on each invocation of Make, this will only regenerate a file when one of its prerequisites would change.
If you're sure that's really what you want, here's one way to do it: have a rule for a dummy file which the makefile will
include
.No matter what target you specify, Make will first run the
dummy
rule, then restart itself.