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 начнет компилировать исходники.
2 ответа
Вы должны использовать 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
,
Обычно системы сборки, основанные на 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/