[CMake] Targets where the command decides if the target needs rebuilding

David Gobbi david.gobbi at gmail.com
Mon May 31 12:13:35 EDT 2010


Hi all,

There are times when a CMake custom command will generate exactly the
same output file even if its inputs have changed.  In these cases, I
would like the timestamp on the output file to remain unchanged, but
to generate a fake ".target" file with the current timestamp so the
custom command will not be re-execute the next time I run CMake.

Here is an example:

I've written a tool called vtkBuildHeirarchy that goes through the VTK
header files and writes a text file that describes the class
hierarchy.  Then, I have some special wrappers that use this text file
to do compile-time type introspection.

A naive approach would force a complete re-build of the wrappers if
even a single header file has changed.  However, the only important
changes to the wrapper are those that change the actual hierarchy.

So, I have made my vtkBuildHeirarchy executable so that it pre-reads
the output and then only overwrites it if the hierarchy has changed.
This keeps my wrappers from re-compiling when they don't have to.
However, now the vtkBuildHeirarchy executable runs every time
(actually several times) when I run cmake because its output file's
timestamp is not updated.

This is why I want to create a second, "fake" output file with a
.target extension, so that vtkBuildHeirarchy won't execute if this
"target" file is more recent than its inputs.  However, commands that
depend on vtkBuildHeirachy's output will have to continue to check the
timestamp of the "real" output file.

Is there a way of splitting a target into a real target/fake target in cmake?

   David


More information about the CMake mailing list