[CMake] target DEPENDS are ignored if the target is also used for the COMMAND

Brad King brad.king at kitware.com
Tue Oct 27 12:03:32 EDT 2009


Alan W. Irwin wrote:
> The following CMake logic fragment illustrates the issue:
> 
> add_executable(plhershey-unicode-gen ${plhershey-unicode-gen_SRCS})
> 
> add_custom_command(
>   OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/plhershey-unicode.h
>   COMMAND plhershey-unicode-gen
>   ${CMAKE_SOURCE_DIR}/fonts/plhershey-unicode.csv
>   ${CMAKE_CURRENT_BINARY_DIR}/plhershey-unicode.h
>   DEPENDS
>   plhershey-unicode-gen
>   ${CMAKE_SOURCE_DIR}/fonts/plhershey-unicode.csv
>   )
> 
> add_custom_target(
>   plhershey-unicode.h_built
>   DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/plhershey-unicode.h
>   )
> 
> If I touch the source for plhershey-unicode-gen and run "make
> plhershey-unicode.h_built", then plhershey-unicode-gen gets rebuilt but the
> custom command is not re-run.  Apparently, a target is ignored as a DEPENDS
> if it is also used as a COMMAND.  That doesn't seem correct to me.
> 
> The workaround is to replace the COMMAND by the location of the
> plhershey-unicode-gen executable.  In that case, if I touch the source for
> plhershey-unicode-gen and run "make plhershey-unicode.h_built", then
> plhershey-unicode-gen gets rebuilt, and so does plhershey-unicode.h.
> 
> According to the documentation you should be able to use targets for
> COMMANDs, and targets for DEPENDS.  Furthermore according to the
> documention, in the former case the file depends are not taken care of, but
> in the latter case they should be (for add_executable or add_library
> targets).  I believe it is a bug in the implemention that the latter
> case is
> ignored when the target is also used for the COMMAND.

CMake has a test for this (BuildDepends), and it has this code:

  add_custom_command(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/regen.h
    COMMAND generator ${CMAKE_CURRENT_BINARY_DIR}/regen.h regen
    DEPENDS generator # adds file-level dependency to re-run rule
    )

The test passes, and if I comment out the DEPENDS line it fails.

What version of CMake are you using?  What generator?  What platform?

-Brad


More information about the CMake mailing list