4

我目前的工作流程:

  1. hg update(或任何用于检查修订的方法)
  2. MyProject.proqmakeMyProject.vcproj
  3. 打开 Visual Studio,编辑文件
  4. 构建项目

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

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

4

4 回答 4

4

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

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

我不确定您是否可以从 qmake 编辑外部文件。您可以使用外部工具,但在 Windows 上,您通常没有类似的东西sed,因此可能会有更多问题。

于 2009-10-08T16:38:53.980 回答
4

您可以使用自定义构建目标和PRE_TARGETDEPS关键字来完成此操作。假设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
于 2009-10-09T20:02:18.390 回答
1

一个选项是启用Keyword Extension。把这样的东西放在你的 hgrc 中(或者 Mercurial.ini 如果这是你的东西):

[extensions]
hgext.keyword=

[keyword]
config.h =

[keywordmaps]
HGREV = {node}

然后在 config.h 中输入:

#define HGREV "$HGREV$"

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

于 2009-10-09T02:49:34.337 回答
1

除了 Lukáš Lalinský 和 goodrone 的评论,我想提一下 qmake 可以直接链接到脚本,而不仅仅是它的输出。所以可以说

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

并且脚本将为每个目标重新执行。

于 2010-07-05T14:50:36.933 回答