Этот ответ был дан мне в списке рассылки 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
.