2009-10-08 67 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