Linux exec程序没有获得输出值

时间:2013-12-12 15:42:26

标签: c++ mercurial cmake fedora

不确定为什么这不起作用......以下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仍为空。什么会导致这个?有工作吗?

1 个答案:

答案 0 :(得分:1)

看起来像是CMake中的一个错误:输出变量不会添加不以新行结尾的流的部分。

exec_program(cat ARGS test OUTPUT_VARIABLE TEST_VAR)

如果测试没有以新行结束,则尽管shell终端中的输出有效,但未填充TEST_VAR。

如果测试以新行结束,则填写输出。

在我的情况下,修复是将模板更改为包含换行符:

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中)。