Как я могу создать только объектный файл (*.o) из цели сборки CMake?

Я пытаюсь создать объектный файл с помощью CMake, но я не могу заставить CMake создавать нечто, отличное от полного исполняемого файла. Я в основном ищу результат следующей компиляции (результат будет загружен на целевую VxWorks и затем связан):

$(CC) $(CFLAGS) $(INC_DIRS) -c src/object.c

Я попытался изменить свойство OUTPUT_NAME для цели, но это тоже не помогает.

Я думаю, что я мог бы обойти это, используя пользовательскую команду, но похоже, что я также работаю над хорошими вещами, которые предоставляет CMake.

Спасибо за вашу помощь!

Ответ 1

Этот ответ был предоставлен мне в списке рассылки CMake, и он работал как шарм:

Посмотрите на следующий ${CMAKE_SOURCE_DIR}/cpo script:

#!/bin/sh
d=$1; shift
while [ "$1" != "--" ]; do
    cp $1 $d/$(basename $1); shift
done

Теперь посмотрим на следующий 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> --"
)

Запуск script "cpo" делает целевое "f" создавать объектные файлы в каталог передан как первый параметр вместо библиотеки; все остальное должно быть обычным делом. Ключом является script доступ к заполнителю <OBJECTS>, поэтому он может работать на объекте файлов, а фактическая ссылка после "-" игнорируется. Что путь, вы можете использовать все возможности CMake для компиляции и перехват справа до того, как происходит соединение. ИМО, что довольно чистый решение, которое должно быть легко адаптировано к вашим потребностям; Обратная сторона заключается в том, что использование RULE_LAUNCH_LINK ограничено генераторами Makefile.

Ответ 2

Я бы пошел по пути командной строки. Помните, что вы все равно можете использовать эти объектные файлы для компиляции с CMake последним, если задаете свойства исходного файла GENERATED и EXTERNAL_OBJECT.