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