How do I produce only an object file (*.o) from a CMake build target?

后端 未结 3 1310
南笙
南笙 2021-02-04 09:24

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

3条回答
  •  北恋
    北恋 (楼主)
    2021-02-04 10:01

    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}  --"
    )
    

    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 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.

提交回复
热议问题