[英]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.