2014-09-05 3 views
7

Я пытаюсь, чтобы CMake запускал три команды bash или скрипт bash. Однако я не могу заставить его работать.Выполнение команды bash с помощью CMake

Команды Баш являются:

cd ${CMAKE_SOURCE_DIR}/dependencies/library 
    make 
    cd ${CMAKE_BINARY_DIR} 

По сути, я хотел бы CMake построить библиотеку в этот каталог, если он еще не существует.

Вот код CMake Я пробовал:

if(NOT "${CMAKE_SOURCE_DIR}/dependencies/library/lib.o") 
    execute_process(COMMAND cd ${CMAKE_SOURCE_DIR}/dependencies/library) 
    execute_process(COMMAND make) 
    execute_process(COMMAND cd ${CMAKE_BINARY_DIR}) 
endif(NOT "${CMAKE_SOURCE_DIR}/dependencies/library/lib.o") 

Однако, это ничего не строит. Что я делаю не так?

Кроме того, пока я здесь спрашиваю: должна ли быть включена третья команда, чтобы перейти в двоичную папку?

Спасибо!

+3

Прежде всего, почему вы не используете параметр 'WORKING_DIRECTORY' вместо этих команд' cd'? Что-то вроде 'execute_process (COMMAND make WORKING_DIRECTORY $ {CMAKE_SOURCE_DIR}/dependencies/library)'. Я полагаю, 'execute_process()' вызовы не разделяют одну и ту же среду. Кроме того, если бы я был вами, я бы посмотрел ['add_custom_target()') (http://www.cmake.org/cmake/help/v3.0/command/add_custom_target.html?highlight=add_custom_target) и ['add_custom_command()'] (http://www.cmake.org/cmake/help/v3.0/command/add_custom_command.html?highlight=add_custom_command) для такого рода вещей. – Kamiccolo

+1

Я не могу прокомментировать большую часть того, что сказал @Kamiccolo, но я могу сказать, что я думаю, что детали о состоянии 'execute_process', которые не разделяют, почти наверняка точны. * * Невероятно * вероятно, что 'cd' в первой команде изменяет каталог только для этого процесса, а не для каких-либо других. –

+1

Если вы планируете создавать стороннюю библиотеку, вам, вероятно, лучше использовать модуль [ExternalProject] (http://www.cmake.org/cmake/help/v3.0/module/ExternalProject.html). – sakra

ответ

11

execute_process() выполнен во время настройки. Но вы хотите, чтобы это выполнялось во время сборки, поэтому add_custom_command() и add_custom_target() - это то, что вы ищете.

В этом частном случае, если вы хотите, чтобы сгенерировать выходной файл, так что вы должны пойти на add_custom_command() (оба, по существу, то же самое, но command производит один или несколько выходных файлов, в то время как target нет.

В CMake сниппет для этого должно выглядеть примерно следующий:

add_custom_command(
    OUTPUT ${CMAKE_SOURCE_DIR}/dependencies/library/lib.o 
    WORKING_DIR ${CMAKE_SOURCE_DIR}/dependencies/library 
    COMMAND make 
) 

затем вы должны добавить выходной файл в другой цели, как зависимость, и все (надеюсь) работать, как ожидалось

.

Вы также можете добавить операторы DEPENDS к вызову add_custom_command(), чтобы восстановить файл объекта в случае, если некоторые источники ввода были изменены.

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