我知道-P
用于执行cmake脚本文件。但是我不想为简单的逻辑创建文件。我想执行这样的语句:
cmake“ if(foo)do_something endif()”
我想要此功能的原因是我想根据是否定义了 CMAKE变量,在add_custom_target
和add_custom_command
中使用if / else来执行一些命令。
答案 0 :(得分:0)
最后,我对此有了一个很好的解决方案。现在描述如下。
假设我要添加两个目标,它们的目的是创建docker映像并在发布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
可以从内存中获取变量的值,此时{{1} } 已被删除。因此,在第二轮中,变量没有值。