c++ - Linux exec 程序没有得到输出值

标签 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 仍然是空的。什么会导致这个?有变通办法吗?

最佳答案

看起来像是 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/

相关文章:

c++ - 在 union 中访问结构

mercurial - 如何将单个 hg 存储库转换为多个存储库

svn - 使用CMake获取构建时Subversion修订版

c++ - 使用 protobuf 构建 CMake 项目

c++ - 将 Image*[3] 传递给 const Image*[3] 不能用 const_cast<Image*[3]> 完成,替代方案?

c++ - 提高可读性的 C++ 结构,计算结果为非宏

mercurial - 构建后提交 : good or bad?

c++ - Boost cmake 组件索引

c++ - Eclipse C++ OpenGL - 无法构建项目

svn - 是什么让一些版本控制系统更擅长 merge ?