簡體   English   中英

在Windows上定義和使用GNU Make的構建時間戳

[英]Defining and using a build timestamp for GNU Make on Windows

我正在嘗試在Windows上使用GNU make 3.81和隨Wind River Tornado(make 3.76)一起分發的一個古老的make構建一些軟件。

到目前為止,我設法從Windows捕獲了日期:

NOW=\"$(shell cmd /C date /T) $(shell cmd /C time /T)\"

但是當我在編譯器上傳遞它時

CFLAGS = ... -DBUILD_TIMESTAMP=$(NOW) ...

由於時間戳中存在空格,冒號和斜線,因此出現構建錯誤。 如果我回顯$(NOW)變量,則將其正確引用,但是當我回顯$(CFLAGS)變量時,引號將消失。

您想要為shell引用變量(因此它不受單詞拆分的影響),然后再次為C引用它(因此,當它被cpp替換時,您就有一個字符串文字)。 嘗試這個:

NOW := "\"$(shell cmd /C date /T) $(shell cmd /C time /T)\""

另請注意,我使用的是:=而不是= 除非您的舊make不支持它,否則請使用:= ,它會在定義點而不是擴展點評估替換。 每次嘗試編譯文件時,使用=將使其兩次調用這兩個Shell命令。 性能不太好。

我認為您應該設置:CFLAGS = ... -DBUILD_TIMESTAMP =“ $(NOW)” ...

即添加引號。

還有另一個“ hacky”解決方案-刪除$(NOW)中的空格->嘗試:

empty:=
space:= $(empty) $(empty)
NOW:=$(subst $space,_,$(NOW))

如果消除了在編譯器命令行中傳遞帶引號的字符串的麻煩,您可能會發現問題更容易調試,例如:

.PHONY: force
timestamp.h: force
    echo "#define BUILD_TIMESTAMP \"`cmd /c date /t` `cmd /c time /t`\"" > $@

...並在代碼中#include "timestamp.h" 這樣,您只需要擔心外殼的引用行為,而不必擔心make和編譯器的引用行為。

已經有一段時間了,但是我我記得,Tornado附帶了csh樣式的外殼,與更常見的Bourne外殼相比,它處理引號的方法不同 它還包括一個TCL解釋器,您可以通過創建帶有以下內容的timestamp.tcl使用它

puts "#define BUILD_TIMESTAMP \"[clock format [clock seconds] -format {%D %T}]\""

和寫作

timestamp.h: force
    tclsh timestamp.tcl > $@

在makefile中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM