问题
I have some targets that need to be built in order to determine what some of my other targets are. How do I tell SCons?
An example:
A script, generate
is run on some configuration files. This script generates include path and build flags based on information in the configuration files. In order to build a SCons Object
, I need to read the generated files.
I was just running Execute()
on generate
but it's now got lots of files to generate and it takes a good amount of time, so I only want to run it when it or a configuration file changes. How do I tell SCons to ask me at build time for some more targets once this Command
has done anything it needs to do?
回答1:
ok, some SCons clarifications first. Scons have two phases in doing a build. First, in the analysis phase all Scons scripts are executed and the result is a static dependency tree describing source and target files for all the builders defined in the scripts. Next, based on that tree, the build database from last build and the signatures of the files on disc, all builders with out of date targets are rebuild.
Now to your question. If you want to only run generate
when necessary (when generate
or configuration files changes), then running generate
as a part of the analysis phase is out of the question. So don't use Execute()
. Instead generate
must be a builder of its own. So far so good.
Now you have two builders, the first builder generate
and the second builder, I call it buildObject
. buildObject
depend in the targets of generate
, but as you state, the generate
targets are unknown at analysis time (because generate
is not run, it is only set up as a builder). Having unknown targets at analysis time is a classic challenge with SCons, and there are no easy way to solve it.
I normally solve it by using what I call a SCons.pleaser
file.
In your case it would be a known target that generate
generates containing a high res timestamp. The buildObject
builder then take this file as a source.
Now, if your configuration files has not changed, generate
will not run, the SCons.pleaser will not change, and the buildObject
will not run. If you change you configuration files, generate will run, the SCons.pleaser will change, and the buildObject
will run as well.
Regards
回答2:
The solution I went with was to make a new SConstruct that knows how to do the generate phase, and Execute()
it early in my SConscripts before I get to the bits where its output is needed. It works well, since it just builds things as necessary with the small fixed overhead of invoking SCons from within SCons.
来源:https://stackoverflow.com/questions/13870092/build-time-determination-of-scons-targets