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

Reply via email to