Подтвердить что ты не робот

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.

4b9b3361

Ответ 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