Наконец-то я нашел хорошее решение для этого.Теперь опишите следующее.
Допустим, я хочу добавить две цели, цель которых состоит в создании образов докера и загрузке в удаленный репозиторий при выдаче 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
было удалено.Поэтому во втором запуске переменные не имеют значения.