Hi there, in the hope of achieving platform independence of my plain-C project I have started looking into CMake, trying to duplicate what my manually created makefiles do.
A minimalistic description of my problem is the following: * I have 2 executable targets * both having the same main program source MAIN/main.c * both linking to a library libvehicle.a that is built from the same set of sources, e.g. VEHICLE/read_hydrodynamic_coeffs.c The difference between both targets is a compiler definition -D_TYPE1_ or -D_TYPE2_ that is used in the sourcecode, e.g. hydro_par_t read_hydrodynamic_coeffs(sys_par_t sys_par) { #if defined(_TYPE1_) return(read_hydrodynamic_coeffs_type1(sys_par)); #elif defined(_TYPE2_) return(read_hydrodynamic_coeffs_type2(sys_par)); #endif } So the in both cases the library libvehicle.a will contain a function read_hydrodynamic_coeffs but the actual content of this function will be different. [ In realiter it's more complicated because there are more executables and combinations of several switches, so I really don't want to change the sources. ] What I've done so far is * in the main CMakeLists.txt: add_subdirectory(CMakeTargets/sim_type1) * in CMakeTargets/sim_type1/CMakeLists.txt: add_definitions(-D_TYPE1_) include_directories("../../VEHICLE/INCLUDE") add_subdirectory(../../VEHICLE VEHICLE) add_executable(sim_type1 ../../MAIN/main) target_link_libraries(sim_type1 vehicle) * in CMakeTargets/VEHICLE/CMakeLists.txt: set(SRC "read_hydrodynamic_coeffs") set(SRC "${SRC} read_hydrodynamic_coeffs_type1") set(SRC "${SRC} read_hydrodynamic_coeffs_type2") add_library(vehicle ${SRC}) For one target only this gives a executable CMakeTargets/sim_type1/sim_type1 that is working as expected. As specified by add_subdirectory(../../VEHICLE VEHICLE), object file and library are created locally: ./CMakeTargets/sim_type1/VEHICLE/CMakeFiles/vehicle.dir/read_hydrodynamic_coeffs.c.o ./CMakeTargets/sim_type1/VEHICLE/libvehicle.a But as soon as I try to add_subdirectory(CMakeTargets/sim_type2) [rest as above, only 1->2] I get an error message add_library cannot create target "vehicle" because another target with the same name already exists. The existing target is a static library created in source directory "./VEHICLE". See documentation for policy CMP0002 for more details. Trying to cheat with cmake_policy(SET CMP0002 OLD) I can compile both executables but they are messed up, obviously trying to execute read_hydrodynamic_coeffs for the wrong type. So, how do I define a set of executable make targets, differing only in the -D_defines_ that are used to build all of the source needed? Thanks in advance, Eike _______________________________________________ Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Follow this link to subscribe/unsubscribe: http://www.cmake.org/mailman/listinfo/cmake