[CMake] Disable linker / only build object files

Tyler Roscoe tyler at cryptio.net
Wed Apr 29 13:29:27 EDT 2009


I have a fairly complex library with a bunch of small pieces scattered
throughout subdirectories. 

Each subdirectory has its own CMakeLists.txt. This is nice because the
list of .cpp files for each subdirectory is right there in the
subdirectory, and because these subdirectories behave just like all the
other subdirectories in the system (you can go to them and build them
and get something useful dropped into a results directory).

What I would like is for each subdirectory to compile its .cpp files
into object files and then stop. There is no need for each subdir to
generate a library because the object files will later be collected into
a single higher-level library.

Is there a way to tell CMake to only compile a list of source files and
not to link them? I tried setting CMAKE_CXX_LINK_EXECUTABLE,
CMAKE_LINKER, and LINKER_LANGUAGE to nothing but the generated Makefiles
still happily call g++.

Should I give up on this approach and just list all my .cpp files in the
CMakeLists for the higher-level. Maybe I could include() stubs from the
subdirectories into my higher-level CMakeLists?

A related problem: how can I get the path to the object files that are
created in my binary directory? We are currently using this, but it's
kinda ugly and probably quite fragile:

if (WIN32)
    set (TEST_OBJ_LOC ${${local_project_name}_BINARY_DIR}/${local_project_name}.dir/debug)
    set (OBJ_EXTENSION ${CMAKE_CXX_OUTPUT_EXTENSION})
else ()
    string(REPLACE "/_build/.." "/" ABS_OBJ_LOC ${${local_project_name}_SRC})
    set (TEST_OBJ_LOC ${${local_project_name}_BINARY_DIR}/CMakeFiles/${local_project_name}.dir${ABS_OBJ_LOC})
    set (OBJ_EXTENSION .cpp${CMAKE_CXX_OUTPUT_EXTENSION})
endif ()


thanks,
tyler


More information about the CMake mailing list