I\'m trying to build an object file using CMake, but I can\'t seem to get CMake to build something other than a complete executable. I\'m basically looking for the result of the
Since CMake 3.1, CMake has had the ability to create Object libraries:
The
OBJECT
library type defines a non-archival collection of object files resulting from compiling the given source files.
To only create the object file (no library or executable), use this OBJECT
keyword with the add_library() command:
# This will create object.c.o (or object.c.obj on Windows) when built.
add_library(MyObj OBJECT ${CMAKE_CURRENT_SOURCE_DIR}/src/object.c)
You can later reference the object file(s) to be compiled into other libraries or executables:
add_library(MyLibrary STATIC $<TARGET_OBJECTS:MyObj> MyClass1.cpp Helpers.cpp)
I would go the custom command path. Remember you can still use those object files for compilation with CMake latter if you set the GENERATED and EXTERNAL_OBJECT source file properties.
This answer was given to me in the CMake mailing list and it worked like a charm:
Look at the following ${CMAKE_SOURCE_DIR}/cpo
script:
#!/bin/sh
d=$1; shift
while [ "$1" != "--" ]; do
cp $1 $d/$(basename $1); shift
done
Now, look at the following CMakeLists.txt:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR)
PROJECT(CPO C)
FILE(WRITE ${CMAKE_BINARY_DIR}/f.c "void f(void){}\n")
ADD_LIBRARY(f SHARED f.c)
SET_TARGET_PROPERTIES(f PROPERTIES RULE_LAUNCH_LINK
"${CMAKE_SOURCE_DIR}/cpo ${CMAKE_BINARY_DIR} <OBJECTS> --"
)
The launch script "cpo" makes the target "f" produce object files in
the directory passed in as the first parameter instead of a library;
everything else should be business as usual. The key is the script's
access to the <OBJECTS>
placeholder, so it can operate on the object
files while the actual link command after the "--" is ignored. That
way, you can use all of CMake's capabilities for the compilation and
intercept right before linking takes place. IMO, that's a quite clean
solution which should be easily adaptable to your needs; the downside
is that the use of RULE_LAUNCH_LINK
is limited to Makefile
generators.