CMake: как запустить add_custom_command перед всем остальным
У меня есть пользовательская команда
add_custom_command(
OUTPUT config.h
PRE_BUILD
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/mk_config_h.py ${CMAKE_CURRENT_BINARY_DIR}/config.h
)
Я пытаюсь запустить его перед всем остальным, и я создаю make файлы unix.
Однако PRE_BUILD поддерживается только для VS2010, что означает, что config.h
создается до компоновки.
как создать пользовательскую команду перед запуском компиляции cmake.
Ответы
Ответ 1
Вместо add_custom_target
вы должны использовать add_dependencies
, чтобы ваша нормальная цель зависела от него
add_custom_target(
myCustomTarget
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/mk_config_h.py ${CMAKE_CURRENT_BINARY_DIR}/config.h
)
add_dependencies(myTarget myCustomTarget)
Это должно гарантировать, что команда выполняется перед компиляцией источников myTarget
.
Ответ 2
Обычно в системах сборки, основанных на make файлах, нет необходимости упоминать заголовки как часть цели. Более того, добавление заголовков в цель считается антипаттерном. Но генерация заголовка является исключением из этого правила.
http://voices.canonical.com/jussi.pakkanen/2013/03/26/a-list-of-common-cmake-antipatterns/
Вы должны установить ${CMAKE_CURRENT_BINARY_DIR}/config.h
как часть какой-либо другой скопированной цели.
Например:
set(PROGRAM1_SOURCES main_program1.cpp)
set(PROGRAM1_HEADERS main_program1.h ${CMAKE_CURRENT_BINARY_DIR}/config.h)
add_executable(program1 ${PROGRAM1_SOURCES} ${PROGRAM1_HEADERS})
Таким образом, CMake узнает, какой цели на самом деле нужен сгенерированный config.h
, и он сможет вставить команды генерации в правильные шаги сборки.
Также см. пример в https://cmake.org/cmake-tutorial/#s5