如何不使用-P直接执行cmake脚本?

时间:2018-09-29 12:40:49

标签: cmake

我知道-P用于执行cmake脚本文件。但是我不想为简单的逻辑创建文件。我想执行这样的语句:

  

cmake“ if(foo)do_something endif()”

我想要此功能的原因是我想根据是否定义了 CMAKE变量,在add_custom_targetadd_custom_command中使用if / else来执行一些命令。

1 个答案:

答案 0 :(得分:0)

最后,我对此有了一个很好的解决方案。现在描述如下。

假设我要添加两个目标,它们的目的是创建docker映像并在发布make imagesmake publish时上传到远程存储库。我使用VERSIONGIT_COMMITPATCH组成图片标签。可以使用GIT_COMMITgit log获得execute_process,并且每次我要创建图像时,都需要从命令行传递更新的VERSIONPATCH。 (但是,如果我不打算创建,则不会给出它们)

因此完整的语句如下:

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=xxxmake imagesmake publish

有些奇怪的事。当我第一次发布cmake .. -DVERSION=xxx -DPATCH=xxx,然后执行make imagessh command时。然后,我再次发出make images,将不会执行sh command。我的猜测是:在make images的第一次运行中,cmake首先将变量CMakeCache.txt加载到内存中,然后sh command可以从内存中获取变量的值,此时{{1} } 已被删除。因此,在第二轮中,变量没有值。