2016-10-10 2 views
3

Я имею следующую структуру каталогов:Выполнить пользовательский сценарий оболочки с CMake

/CMakeLists.txt 
/component-a/CMakeLists.txt 
      /... 
/component-b/CMakeLists.txt 
      /... 
/doc/CMakeLists.txt 
    /create-doc.sh 

Скрипт create-doc.sh создает файл документации (doc.pdf). Как я могу использовать CMake для выполнения этого сценария оболочки во время сборки и скопировать файл doc.pdf в каталог сборки?

Я попробовал его с помощью add_custom_command в файле CMakeLists.txt внутри каталога doc:

add_custom_command (OUTPUT doc.pdf 
        COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/create-doc.sh 
        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/) 

К сожалению, команда никогда не работать.

Я также попытался execute_process:

execute_process (COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/create-doc.sh 
        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/) 

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

+2

Возможный дубликат [CMake add \ _custom \ _command не запускается] (http://stackoverflow.com/questions/2937128/cmake-add-custom-command-not-being-run) – Tsyvarev

ответ

5

У вас почти есть add_custom_command. Это действительно правильный способ сказать CMake, как сгенерировать файл. Однако CMake будет работать только тогда, когда что-то зависит от этого файла.

Когда, как в вашем случае, сам файл является конечным продуктом, и не используется в дальнейшем при последующих стадиях сборки, обычный подход заключается в создании настраиваемых целей для управления соответствующей пользовательской команды (ы):

add_custom_target(
    BuildDocs ALL 
    DEPENDS doc.pdf 
) 

Этот (настраиваемый целевой драйвер для пользовательских команд) является очень распространенной идиомой в CMake.

Вы можете, конечно, поиграть с аргументами для add_custom_target (например, ALL, COMMENT), так как вам это подходит.

+0

Спасибо. :) Должен ли я использовать специальную команду CMake для копирования doc.pdf в каталог сборки? 'doc.pdf' создается в каталоге' doc', но не копируется. – Marcello90

+0

@ Marcello90 Если вы хотите, чтобы файл был создан в двоичном каталоге, и скрипту не хватает возможности сделать это самостоятельно (например, передав нужное местоположение вывода), вы можете использовать дополнительную пользовательскую команду для копирования файла (и цель зависит от конечного * выходного местоположения); '$ {CMAKE_COMMAND} -E copy_if_different' или что-то подобное можно использовать для создания независимой от платформы копии во время сборки. – Angew

Смежные вопросы