[CMake] How to add file dependencies to a target?

Tyler Roscoe tyler at cryptio.net
Thu Mar 4 16:27:48 EST 2010


On Thu, Mar 04, 2010 at 11:50:14AM -0800, Aaron_Wright at selinc.com wrote:
> For example, this doesn't work:
> 
> ADD_EXECUTABLE(foo ${foo_SOURCES} ${foo_HEADERS})
> 
> ADD_CUSTOM_COMMAND(
>    OUTPUT "${PROJECT_BINARY_DIR}/bar.ini"
>    COMMAND ${CMAKE_COMMAND} -E copy "${PROJECT_SOURCE_DIR}/bar.ini" 
> "${PROJECT_BINARY_DIR}"
>    DEPENDS "${PROJECT_SOURCE_DIR}/bar.ini"
>    COMMENT "Localizing \"bar.ini\"")
> 
> ADD_DEPENDENCIES(foo "${PROJECT_BINARY_DIR}/bar.ini")

add_dependencies() is for adding dependencies on targets, not on files.

> I can also get it to work if I add another target like so:
> 
> ADD_EXECUTABLE(foo ${foo_SOURCES} ${foo_HEADERS})
> 
> ADD_CUSTOM_COMMAND(
>    OUTPUT "${PROJECT_BINARY_DIR}/bar.ini"
>    COMMAND ${CMAKE_COMMAND} -E copy "${PROJECT_SOURCE_DIR}/bar.ini" 
> "${PROJECT_BINARY_DIR}"
>    DEPENDS "${PROJECT_SOURCE_DIR}/bar.ini"
>    COMMENT "Localizing \"bar.ini\"")
> 
> ADD_CUSTOM_TARGET(copy_bar.ini DEPENDS "${PROJECT_BINARY_DIR}/bar.ini")
> 
> ADD_DEPENDENCIES(foo copy_bar.ini)

AFIAK this is the "right" way to do what you want.

> So do I have to have this additional indirection with the extra target? I 
> have way too many targets as is. Is there anyway to get the first approach 
> to work? It's like I need to add a file to ${foo_SOURCES} or 
> ${foo_HEADERS} that isn't compiled or that doesn't show up in the IDE. And 
> can this be done after the ADD_EXECUTABLE call, or does it have to be 
> before?

You could try a PRE_BUILD custom_command instead. I think that will run
every time instead of just when bar.ini has changed.

If you are going to tweak foo_SOURCES, you will need to do it before you
call add_executable().

tyler


More information about the CMake mailing list