[CMake] DEPENDS fails on a target created by add_custom_target

Giampiero Salvi giampi at kth.se
Thu Aug 28 12:10:12 EDT 2008


Here is some valuable info:
cmake version 2.6-patch 1
system: Ubuntu Hardy

Giampiero

Giampiero Salvi wrote:
> Dear list,
> I am a bit confused on the use of add_custom_target, I hope someone can 
> help me.
> 
> Here is what I am trying to do:
> I have a number of subdirectories that build libraries, and then I build 
> the final executable with a custom command (I am wrapping all the 
> libraries in a tclkit executable). Some libraries consist of c++ code, 
> others of just tcl code (I just need to copy the tcl files at 
> compilation time).
> 
> Here is how I tried to do it:
> - In case of c++ libraries I use add_library,
> - in case of pure tcl libraries I use add_custom_command and 
> add_custom_target to copy the files (I do not use configure_file because 
> I want to copy the files at build time and not configuration time).
> - In the main CMakeLists.txt I use add_custom_command and 
> add_custom_target to wrap the libraries into an tclkit executable.
> 
> Here is the problem:
> when I use DEPENDS in the main add_custom_command, it finds the targets 
> generated by add_library, but it complains about the ones generated by 
> add_custom_target with a "No rule to make target" even though the 
> targets are built ("[ 82%] Built target targetB")
> 
> Here is a simplified example (in case the above didn't make too much 
> sense):
> 
> main_dir/CMakeLists.txt: --------------------
> PROJECT(main)
> subdirs(dirA dirB)
> ADD_CUSTOM_COMMAND(
>   OUTPUT ${EXECUTABLE_OUTPUT_PATH}/main_custom${CMAKE_EXECUTABLE_SUFFIX}
>   COMMAND wrap_libs_to_tclkit_exe
>   DEPENDS targetA targetB
> )
> ADD_CUSTOM_TARGET(main_custom ALL
>   DEPENDS ${EXECUTABLE_OUTPUT_PATH}/main_custom${CMAKE_EXECUTABLE_SUFFIX}
> )
> 
> main_dir/dirA/CMakeLists.txt: -----------------
> PROJECT(targetA)
> ADD_LIBRARY(${PROJECT_NAME} SHARED file1.cxx file2.cxx file3.cxx)
> TARGET_LINK_LIBRARIES(${PROJECT_NAME} blabla)
> 
> main_dir/dirB/CMakeLists.txt: -----------------
> PROJECT(targetB)
> SET(TCL_FILES file1.tcl file2.tcl file3.tcl)
> ADD_CUSTOM_TARGET(${PROJECT_NAME} ALL)
> FOREACH(file ${TCL_FILES})
>   GET_FILENAME_COMPONENT(name ${file} NAME)
>   SET(tgt ${LIBRARY_OUTPUT_PATH}/${name})
>   SET(src ${file})
>   ADD_CUSTOM_COMMAND(
>     TARGET ${PROJECT_NAME}
>     COMMAND ${CMAKE_COMMAND}
>     ARGS -E copy_if_different ${src} ${tgt}
>     DEPENDS ${src}
>     COMMENT "copying file: ${src} ${tgt}"
>     )
> ENDFOREACH(file)
> 
> The result is that both targetA and targetB are built, but when building 
> main_custom I get the "No rule to make target `targetB'" problem. I 
> don't get any error with only targets on the same type as targetA.
> 
> What am I doing wrong?
> 
> Thank you!
> Giampiero
> _______________________________________________
> CMake mailing list
> CMake at cmake.org
> http://www.cmake.org/mailman/listinfo/cmake



More information about the CMake mailing list