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/

Другие вопросы по тегам