[CMake] Produce only an object file (*.o) from a CMake build target
Michael Hertling
mhertling at online.de
Tue Jan 25 03:07:57 EST 2011
On 01/24/2011 06:37 PM, Helseth, Nicholas H wrote:
> 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 following compilation (the result will be loaded on a VxWorks target and linked then-it needs to be a *.o because of the way our build system works):
> $(CC) $(CFLAGS) $(INC_DIRS) -c src/object.c
> I've tried changing the OUTPUT_NAME property of the target, but that doesn't seem to help, either.
> I think I could work around this by using a custom command, but that seems like I'm also working around the nice things that CMake provides.
> Thanks for your help!
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.
Regards,
Michael
More information about the CMake
mailing list