我目前的工作流程:
hg update
(或任何用于检查修订的方法)MyProject.pro
→qmake
→MyProject.vcproj
- 打开 Visual Studio,编辑文件
- 构建项目
在构建步骤中,如何config.h
使用来自版本控制系统的信息(例如)更新我的头文件hg id
?
MyProject.vcproj
由 生成qmake
,所以我不应该手动编辑它。
我目前的工作流程:
hg update
(或任何用于检查修订的方法)MyProject.pro
→ qmake
→MyProject.vcproj
在构建步骤中,如何config.h
使用来自版本控制系统的信息(例如)更新我的头文件hg id
?
MyProject.vcproj
由 生成qmake
,所以我不应该手动编辑它。
您可以从 qmake 内部执行外部命令。使信息在您的来源中可用的最简单方法是使用定义:
HGID = $$system(hg id)
DEFINES += HGID=\\\"$$HGID\\\"
我不确定您是否可以从 qmake 编辑外部文件。您可以使用外部工具,但在 Windows 上,您通常没有类似的东西sed
,因此可能会有更多问题。
您可以使用自定义构建目标和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
一个选项是启用Keyword Extension。把这样的东西放在你的 hgrc 中(或者 Mercurial.ini 如果这是你的东西):
[extensions]
hgext.keyword=
[keyword]
config.h =
[keywordmaps]
HGREV = {node}
然后在 config.h 中输入:
#define HGREV "$HGREV$"
您可能需要从您将获得的“$HGREV: deadbeefdeadbeef $”中解析出十六进制值,但这很容易通过访问 HGREV 定义的任何代码来完成。
除了 Lukáš Lalinský 和 goodrone 的评论,我想提一下 qmake 可以直接链接到脚本,而不仅仅是它的输出。所以可以说
DEFINES += REPO_ID=\\\"`./setlocalversion.sh`\\\"
并且脚本将为每个目标重新执行。