不确定为什么这不起作用...以下 cmake 脚本在 Windows 上运行良好:
exec_program(hg ${${PROJECT_NAME}_HGREMOTEDIR}
ARGS "log" "-r" ${${PROJECT_NAME}_HG_HASH_CODE} "--template" "{latesttag}"
OUTPUT_VARIABLE ${PROJECT_NAME}_HG_LAST_TAG)
获取最新标签。但是,在 Fedora 17 中,当我尝试运行 ${PROJECT_NAME}_HG_LAST_TAG
时,结果为空。
我的第一个想法是存储库位置有问题。所以我试着运行:
exec_program(hg ${${PROJECT_NAME}_HGREMOTEDIR}
ARGS "log" "-r" ${${PROJECT_NAME}_HG_HASH_CODE}
OUTPUT_VARIABLE ${PROJECT_NAME}_HG_LAST_TAG)
这会在 ${PROJECT_NAME}_HG_LAST_TAG
中填写:
changeset: 368:a7ab3c8aca83
branch: Integration
tag: tip
user: ******
date: Wed Dec 11 10:59:33 2013 -0500
summary: ******
然后我想也许不支持“latesttag”..但是终端中的最新标签“有效”。
>hg log -r a7ab3c8aca83 --template "{latesttag}"
2.0>
所以我的最后一个想法是,出于某种原因,--template 命令使它变得糟糕。所以我做了一个没有外部数据的模板
hg log -r a7ab3c8aca83 --template foo
然后在CMake文件中
exec_program(hg ${${PROJECT_NAME}_HGREMOTEDIR}
ARGS "log" "-r" ${${PROJECT_NAME}_HG_HASH_CODE} "--template" "foo"
OUTPUT_VARIABLE ${PROJECT_NAME}_HG_LAST_TAG)
并且 ${PROJECT_NAME}_HG_LAST_TAG
仍然是空的。什么会导致这个?有变通办法吗?
最佳答案
看起来像是 CMake 中的错误:输出变量不会添加不以换行结尾的流部分。
exec_program(cat ARGS 测试 OUTPUT_VARIABLE TEST_VAR)
如果测试没有以新行结束,则 TEST_VAR 不会被填充,尽管 shell 终端中的输出有效。
如果测试以新行结束,则输出被填充。
就我而言,解决方法是更改模板以包含换行符:
exec_program(hg ${${PROJECT_NAME}_HGREMOTEDIR}
ARGS "log" "-r" ${${PROJECT_NAME}_HG_HASH_CODE} "--template" "\"{latesttag}\\n\""
OUTPUT_VARIABLE ${PROJECT_NAME}_HG_LAST_TAG)
然后代码就可以工作了(在 windows 和 linux 中)。
关于c++ - Linux exec 程序没有得到输出值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20547793/