[CMake] custom target isn't rebuilt if depending on another custom target
Gerhard Stengel
gerhards2 at ast.dfs.de
Mon Sep 13 11:46:10 EDT 2010
Hi,
I have a strange problem with custom targets and their dependencies. I do as follows:
1) create a file 1 and add it to a custom target 1
2) create a file 2 and add it to a custom target 2
3) create a 3rd file by packing #1 and #2 together
4) the 3rd file is added to a custom target which depends on custom targets 1 and 2
This is an example CMakeLists.txt:
----snip ---
add_custom_command(OUTPUT Demo1.out
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/Demo1.in Demo1.out
DEPENDS Demo1.in)
add_custom_target(cust1 ALL DEPENDS Demo1.out)
add_custom_command(OUTPUT Demo2.out
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/Demo2.in Demo2.out
DEPENDS Demo2.in)
add_custom_target(cust2 ALL DEPENDS Demo2.out)
#this would work correctly in all cases
#add_custom_command(OUTPUT Demo.tar
# COMMAND ${CMAKE_COMMAND} -E tar cvf Demo.tar Demo1.out Demo2.out
# DEPENDS Demo1.out Demo2.out)
#without file level dependencies it isn't correctly rebuilt
add_custom_command(OUTPUT Demo.tar
COMMAND ${CMAKE_COMMAND} -E tar cvf Demo.tar Demo1.out Demo2.out)
add_custom_target(cust3 ALL DEPENDS Demo.tar)
add_dependencies(cust3 cust1 cust2)
----snip ---
If I create Demo.tar from a clean project, everything's fine. However, the rebuilt isn't performed completely, that is
if I touch Demo1.in, just Demo1.out is rebuilt, but not Demo.tar that depends on it! This seems wrong to me because I
expect that if the target cust1 is rebuild, even the target cust3 has to be rebuilt due to the relation established by
the add_dependencies() command!
The problem seems to be that add_dependencies() doesn't realize that if cust1 or cust2 becomes out of date cust3 has to
be rebuilt, too.
The solution using file level dependencies (see commented out command) would work, but in my project it's not really
possible to do so because the "source" custom targets which the "final" custom target takes as input contain lots of
files.
Is there an easy workaround or is this a cmake bug?
best regards
Gerhard
More information about the CMake
mailing list