Hi, I am trying to get dependencies right in a project that uses auto-generated sources. I have a library, that uses auto-generated files, and other executables that use that library. I created a set of CMakeLists.txt files that show the problem.
To run it you need test.c and org.c in the source directory, and one of them should contain int main(void) { return 0; } in it, the other can be empty. First try - the simplest approach: project(Test) add_custom_command(OUTPUT file.c COMMAND echo "GENERATING FILE" COMMAND rm -f file.c COMMAND cp -i ${CMAKE_CURRENT_SOURCE_DIR}/org.c file.c DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/org.c ) add_library(LibFile file.c) add_executable(test1 test.c) target_link_libraries(test1 LibFile) add_executable(test2 test.c) target_link_libraries(test2 LibFile) When I build it with 'make' it builds just fine. However, if (from the build/) directory I run: touch ../org.c; make -j test1 test2 it sometimes gives me this: [ 25%] [ 25%] Generating file.c Generating file.c GENERATING FILE GENERATING FILE cp: overwrite ‘file.c’? [ 25%] [ 25%] Built target gen_file Built target gen_file Scanning dependencies of target LibFile Scanning dependencies of target LibFile [ 50%] [ 50%] Building C object CMakeFiles/LibFile.dir/file.o Building C object CMakeFiles/LibFile.dir/file.o Linking C static library libLibFile.a Linking C static library libLibFile.a [ 75%] [ 75%] Built target LibFile Built target LibFile Linking C executable test1 Linking C executable test2 [125%] [125%] Built target test2 Built target test1 It builds (because it isn't very sophisticated example), but it clearly tries to generate 'file.c' twice. I tried several other options and they all have the same problem: (the add_custom_command is exactly the same in all cases) 2. add_library(LibFile file.c) add_executable(test1 test.c) target_link_libraries(test1 LibFile) add_dependencies(test1 LibFile) add_executable(test2 test.c) target_link_libraries(test2 LibFile) add_dependencies(test2 LibFile) 3. add_custom_target(gen_file DEPENDS file.c) add_library(LibFile file.c) add_dependencies(LibFile gen_file) add_executable(test1 test.c) target_link_libraries(test1 LibFile) add_dependencies(test1 LibFile) add_executable(test2 test.c) target_link_libraries(test2 LibFile) add_dependencies(test2 LibFile) 4. add_custom_target(gen_file DEPENDS file.c) add_library(LibFile file.c) add_dependencies(LibFile gen_file) add_executable(test1 test.c) target_link_libraries(test1 LibFile) add_dependencies(test1 LibFile gen_file) add_executable(test2 test.c) target_link_libraries(test2 LibFile) add_dependencies(test2 LibFile gen_file) What am I doing wrong? Is it a problem with CMake? How to solve this? Thanks!
-- Powered by www.kitware.com Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: http://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: http://www.cmake.org/mailman/listinfo/cmake