2009-10-08 94 views
4

我目前的工作流程:检索版本号在VS与QMAKE

  1. hg update(或任何一个用来签出修订版)
  2. MyProject.proqmakeMyProject.vcproj
  3. 打开Visual Studio ,编辑文件
  4. 构建项目

在构建步骤中,如何使用来自版本控制系统(例如,Windows)的信息更新我的config.h头文件。 hg id)?

MyProject.vcproj产生qmake,所以我不应该手动编辑它。

回答

4

您可以在qmake中执行外部命令。使你的来源提供的信息最简单的方法是使用一个定义:

HGID = $$system(hg id) 
DEFINES += HGID=\\\"$$HGID\\\" 

我不知道您是否可以从QMAKE编辑外部文件。您可以使用外部工具,但在Windows上,您通常没有像sed这样的东西,所以它可能会有点问题。

+2

该命令将在qmake运行期间执行。我想在编译源代码之前执行它。似乎没有简单的方法来做到这一点。 – 2009-10-08 18:30:46

1

一个opton是为了启用Keyword Extension。把这样的事情在你的hgrc(或Mercurial.ini如果那是你的事):config.h中放

[extensions] 
hgext.keyword= 

[keyword] 
config.h = 

[keywordmaps] 
HGREV = {node} 

然后:

#define HGREV "$HGREV$" 

您可能需要解析的十六进制值出来的“$ HGREV:deadbeefdeadbeef $”你会得到,但这很容易通过访问HGREV定义的任何代码完成。

4

您可以使用自定义构建目标和​​关键字来完成此操作。假设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 
+0

转换为Visual Studio项目(使用qmake)后,我无法使其工作。它似乎消失了。如果将相同的命令添加到'QMAKE_POST_LINK',那么它将在后期构建步骤中正确显示。(但是对于这种用例来说,已经晚了很多。) – 2013-02-06 11:50:09

1

除了卢卡斯·拉林斯基和goodrone的评论,我想提一下,qmake可以直接链接到脚本,不仅仅是它的输出。所以可以说

DEFINES += REPO_ID=\\\"`./setlocalversion.sh`\\\" 

并且脚本将被新鲜地执行每个单个目标。

+0

如果shell命令包含空格,qmake会在命令中插入'-D',这不起作用。你必须用'''围绕这个: ''\\\“\'./setlocalversion.sh --some --parameters \'\\\”''' (什么逃脱地狱:SO标记, qmake,make,shell ...) – iliis 2014-06-03 08:30:17

+0

另一个复杂因素是:如果您的命令的输出中包含空格,那么您需要另一层双引号。但是,你不能用反引号执行代码,你必须使用'$(shell)':详细信息请参见http://stackoverflow.com/a/24010395/211520。 – iliis 2014-06-03 08:51:54