Как создать только объектный файл (* .o) из цели сборки CMake? - PullRequest
11 голосов
/ 22 января 2011

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

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

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

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

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

Ответы [ 2 ]

6 голосов
/ 28 марта 2011

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

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

#!/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> --"
)

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

2 голосов
/ 22 января 2011

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

...