[CMake] add_custom_target always runs?

Eric NOULARD eric.noulard at gmail.com
Tue Dec 16 15:44:38 EST 2008


Le Tue, 16 Dec 2008 12:26:26 -0800,
Tyler Roscoe <tyler at cryptio.net> a écrit :

> I am using what I think is a common pattern to create some headers.
> Following the example at
> http://www.cmake.org/Wiki/CMake_FAQ#How_do_I_generate_an_executable.2C_then_use_the_executable_to_generate_a_file.3F,
> I have an add_custom_command which calls a script (generateheader.py):
> 
> add_custom_command (
>     DEPENDS generateheader.py
>     OUTPUT  results/header.h
>     COMMAND ${PYTHON_EXECUTABLE}
>     ARGS generateheader.py --infile=src/header.in.h
> --outfile=results/header.h )
> 
> And then I have an add_custom_target to wrap the command in a target:
> 
> add_custom_target (
>     generateheader ALL
>     DEPENDS results/header.h
> )
> 
> This seems to mostly do what it's supposed to do. When I run "make
> all", the generateheader target runs and results/header.h is created.
> When I run "make generateheader", same thing.
> 
> So now the problem.
> 
> When I do "make all", the generateheader target *always* runs, even if
> results/header.h and generateheader.py are up-to-date.
> 
> This is a problem because other targets depend on generateheader, so
> when generateheader runs, all the dependent targets also run. This
> makes it impossible for me to do a delta build.
> 
> Some closer reading of the manual suggests that this is by design.
> From
> http://www.cmake.org/cmake/help/cmake2.6docs.html#command:add_custom_target:
> 
> "Adds a target with the given name that executes the given commands.
> The target has no output file and is ALWAYS CONSIDERED OUT OF DATE
> even if the commands try to create a file with the name of the
> target."
> 
> Ok, so is it simply impossible to do delta builds if my build process
> needs add_custom_command/add_custom_target invocations? Is there some
> better way to have CMake create the headers for me? Does this behavior
> of add_custom_target only occur when I add a new target dependent on
> ALL?

Why do you add "ALL" in your case?
Won't generateheader be called when needed when you remove the ALL
argument to add_custom_target?

Note that another way to go is completely remove the add_custom_target
and add the generated header to the concerned add_executable /
add_library command.

then you have to:

set_source_files_properties(results/header.h PROPERTIES GENERATED true)
 in order to avoid to make add_library/add_executable shout at you
about missing files.

Then when the concerned libraries and/or executable are built
CMake should automatically run your add_custom_command since it
advertise it has the missing "results/header.h" as output.




-- 
Erk


More information about the CMake mailing list