CMake: как заставить execute_process ждать завершения работы подкаталога? - PullRequest
1 голос
/ 03 июля 2019

Часть моего исходного кода генерируется инструментом, который также построен в рамках нашего основного проекта с add_subdirectory. Мы запускаем этот инструмент командой execute_process. Очевидно, что если инструмент не создан до того, как мы достигнем оператора execute_process, он потерпит неудачу.

Я использую ГЛОБ (file(GLOB...)), чтобы найти сгенерированные исходные файлы. Я делаю это потому, что заранее невозможно узнать, сколько файлов сгенерировано, ни их имена.

Как заставить cmake дождаться компиляции подпроекта перед выполнением процесса? Мне нужно что-то вроде DEPENDS свойства для execute_process, но эта опция недоступна.

# This subproject will source generator the tool
add_subdirectory(generator)


# I need something like: wait_for(generator)
execute_process(COMMAND generator ${CMAKE_SOURCE_DIR}/src)

file(GLOB GeneratedSources ${CMAKE_SOURCE_DIR}/src/*.cpp)
add_executable(mainprject.exe ${ProcessorSourceFiles}

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Команда execute_process выполняет свою КОМАНДУ немедленно, на этапе конфигурация . Поэтому его нельзя упорядочить после создания исполняемого файла командой add_executable: этот исполняемый файл будет собран только на этапе build .

Вам также необходимо создать подпроект на этапе настройки. Например. с

execute_process(COMMAND ${CMAKE_COMMAND}
    -S ${CMAKE_SOURCE_DIR}/generator
    -B ${CMAKE_BINARY_DIR}/generator
    -G ${CMAKE_GENERATOR}
    )

execute_process(COMMAND ${CMAKE_COMMAND}
    --build ${CMAKE_BINARY_DIR}/generator
    )

Первая команда вызывает cmake для настройки проекта генератора, расположенного в каталоге ${CMAKE_SOURCE_DIR}/generator. С опцией -G мы используем для подпроекта тот же генератор CMake, что и для основного проекта.

Вторая команда создает этот проект, поэтому создает исполняемый файл generator.

После создания generator исполняемого файла вы можете использовать его для своего проекта:

execute_process(COMMAND ${CMAKE_BINARY_DIR}/generator/<...>/generator ${CMAKE_SOURCE_DIR}/src)

Здесь вам нужно передать абсолютный путь к исполняемому файлу generator в качестве первого параметра для команды: команда CMake больше не имеет исполняемой цели generator, поэтому он не будет подставлять свой путь автоматически.

0 голосов
/ 03 июля 2019

Вам нужно смоделировать это с целевыми зависимостями. Инструмент «генератор» должен быть целью cmake. В этом случае используйте add_custom_target вместо execute_process, например:

add_custom_target(generate_sources ALL COMMAND generator ${CMAKE_SOURCE_DIR}/src))

Затем добавьте целевую зависимость к «генератору», используя add_dependencies :

add_dependencies(generate_sources generator)

Это позволит убедиться, что ваша цель «generate_sources», которая запускает инструмент, будет работать только во время сборки после того, как целевой «генератор» был скомпилирован.

Следующее неверно , см. Комментарии для получения дополнительной информации:

Используйте add_dependencies, чтобы добавить зависимость от "mainproject.exe" в "generate_sources". Теперь это я никогда не проверял, так что возьмем немного соли: С CMake, более поздней, чем версия 3.12, согласно записи в file , вы сможете изменить команду file на:

file(GLOB GeneratedSources CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR}/src/*.cpp)

То, что я интерпретирую, так как это будет перетаскивать файлы во время сборки, если каталог изменится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...