我目前的工作流程:检索版本号在VS与QMAKE
hg update
(或任何一个用来签出修订版)MyProject.pro
→qmake
→MyProject.vcproj
- 打开Visual Studio ,编辑文件
- 构建项目
在构建步骤中,如何使用来自版本控制系统(例如,Windows)的信息更新我的config.h
头文件。 hg id
)?
MyProject.vcproj
由产生qmake
,所以我不应该手动编辑它。
我目前的工作流程:检索版本号在VS与QMAKE
hg update
(或任何一个用来签出修订版)MyProject.pro
→qmake
→MyProject.vcproj
在构建步骤中,如何使用来自版本控制系统(例如,Windows)的信息更新我的config.h
头文件。 hg id
)?
MyProject.vcproj
由产生qmake
,所以我不应该手动编辑它。
您可以在qmake中执行外部命令。使你的来源提供的信息最简单的方法是使用一个定义:
HGID = $$system(hg id)
DEFINES += HGID=\\\"$$HGID\\\"
我不知道您是否可以从QMAKE编辑外部文件。您可以使用外部工具,但在Windows上,您通常没有像sed
这样的东西,所以它可能会有点问题。
一个opton是为了启用Keyword Extension。把这样的事情在你的hgrc(或Mercurial.ini如果那是你的事):config.h中放
[extensions]
hgext.keyword=
[keyword]
config.h =
[keywordmaps]
HGREV = {node}
然后:
#define HGREV "$HGREV$"
您可能需要解析的十六进制值出来的“$ HGREV:deadbeefdeadbeef $”你会得到,但这很容易通过访问HGREV定义的任何代码完成。
您可以使用自定义构建目标和关键字来完成此操作。假设config.h.in
有如下因素格式:
#define HGID $HGID
您可以自定义一个构建目标将处理hgid.h.in
并输出到hgid.h
建立你的主要目标如下之前:
hgid.target = hgid
hgid.commands = sed s/\\\$$HGID/`hg id`/ hgid.h.in > hgid.h
QMAKE_EXTRA_TARGETS += hgid
PRE_TARGETDEPS += hgid
转换为Visual Studio项目(使用qmake)后,我无法使其工作。它似乎消失了。如果将相同的命令添加到'QMAKE_POST_LINK',那么它将在后期构建步骤中正确显示。(但是对于这种用例来说,已经晚了很多。) – 2013-02-06 11:50:09
除了卢卡斯·拉林斯基和goodrone的评论,我想提一下,qmake可以直接链接到脚本,不仅仅是它的输出。所以可以说
DEFINES += REPO_ID=\\\"`./setlocalversion.sh`\\\"
并且脚本将被新鲜地执行每个单个目标。
如果shell命令包含空格,qmake会在命令中插入'-D',这不起作用。你必须用'''围绕这个: ''\\\“\'./setlocalversion.sh --some --parameters \'\\\”''' (什么逃脱地狱:SO标记, qmake,make,shell ...) – iliis 2014-06-03 08:30:17
另一个复杂因素是:如果您的命令的输出中包含空格,那么您需要另一层双引号。但是,你不能用反引号执行代码,你必须使用'$(shell)':详细信息请参见http://stackoverflow.com/a/24010395/211520。 – iliis 2014-06-03 08:51:54
该命令将在qmake运行期间执行。我想在编译源代码之前执行它。似乎没有简单的方法来做到这一点。 – 2009-10-08 18:30:46