Как напрямую выполнить скрипт cmake без -P? - PullRequest
0 голосов
/ 29 сентября 2018

Я знаю, -P используется для выполнения файла скрипта cmake.Но я не хочу создавать файл для простой логики.Я хочу выполнить оператор следующим образом:

cmake "if (foo) do_something endif ()"

Причина, по которой я хочу использовать эту функцию, заключается в том, что я хочу использовать/ else в add_custom_target и add_custom_command для выполнения некоторой команды в зависимости от того, определена ли переменная CMAKE .

1 Ответ

0 голосов
/ 29 сентября 2018

Наконец-то я нашел хорошее решение для этого.Теперь опишите следующее.

Допустим, я хочу добавить две цели, цель которых состоит в создании образов докера и загрузке в удаленный репозиторий при выдаче make images и make publish.Я использую VERSION, GIT_COMMIT и PATCH для создания тега изображения.GIT_COMMIT можно получить из git log с помощью execute_process, и мне нужно передавать новые VERSION и PATCH из командной строки каждый раз, когда я хочу создать изображения.(Но если я не планирую создавать, они не будут предоставлены)

Таким образом, полные утверждения будут такими:

execute_process(COMMAND git log --pretty=format:%h -n 1 OUTPUT_VARIABLE GIT_COMMIT) 

set(DOCKER_CERBERUS_URL "docker-registry.com/db/cerberus:${VERSION}-${GIT_COMMIT}.${PATCH}")

add_custom_target(images
    COMMENT "Creating docker images ..."
    # clean the cache
    COMMAND rm -f CMakeCache.txt # important !

    # if VERSION and PATCH are not given, don't build it
    COMMAND /bin/sh -c "if [ x${VERSION} != x -a x${PATCH} != x ]; then docker build -t ${DOCKER_CERBERUS_URL} ${CMAKE_CURRENT_SOURCE_DIR}/docker/; fi"
    DEPENDS cerberus
    VERBATIM )

add_custom_target(publish
    COMMENT "Uploading images ..."
    COMMAND docker push ${DOCKER_CERBERUS_URL}
    DEPENDS images )

Затем каждый раз, когда я хочу создать или опубликоватьс более новым номером версии и номером патча я использую cmake .. -DVERSION=xxx -DPATCH=xxx, make images или make publish.

Есть что-то странное.Когда я впервые выдаю cmake .. -DVERSION=xxx -DPATCH=xxx, то make images, sh command будут выполнены.Затем я снова выдаю make images, sh command не будет выполнено.Я предполагаю: при первом запуске make images cmake сначала загрузит переменную из CMakeCache.txt в память, затем sh command сможет получить значение переменной из памяти, и в это время CMakeCache.txt было удалено.Поэтому во втором запуске переменные не имеют значения.

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