2010-11-09 41 views
2

我想在Windows上使用GNU make 3.81和風河龍捲風(make 3.76)發佈的古代版本構建一些軟件。在Windows上爲GNU Make定義和使用構建時間戳

到目前爲止,我設法捕獲窗口日期:

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

,但是當我將它傳遞出去的編譯器

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

我正在建立,因爲空格和冒號的錯誤並在時間戳中縮減。如果我回顯$(NOW)變量,它被正確引用,但是當我回顯$(CFLAGS)變量時,引號消失。

回答

0

你想引用shell的變量(所以它不受字分割),並再次引用C(所以當它被cpp替代時,你有一個字符串文字)。試試這個:

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

還請注意,我用的:=代替=。除非您的舊make不支持它,否則使用:=,它將在定義點評估替代值,而不是擴展點。每次嘗試編譯文件時,使用=將使它調用這兩個shell命令兩次。表現不佳。

+0

如果我回復$ NOW,我會得到\ Tue 11/09/2010 01:51 PM \。如果我回復$ CFLAGS我得到/週二11/09/2010 01:51 PM /。 – florin 2010-11-09 19:54:45

+0

我沒有看到這個問題,但我正在使用GNU/Linux框來測試(並運行不同的'日期'命令)。在某處複製/粘貼您的終端輸出,或發佈屏幕截圖。 – 2010-11-09 22:23:16

0

我想你應該設置: CFLAGS = ... -DBUILD_TIMESTAMP = 「$(NOW)」 ...

即加引號。

還有一種「哈克」的解決方案 - 在$刪除空格(NOW) - >嘗試:

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

不,它不適用於添加引號。 – florin 2010-11-09 23:35:16

0

您可能會發現問題更容易,如果你消除通過帶引號的字符串的trickiness調試編譯器命令行如下:

.PHONY: force 
timestamp.h: force 
    echo "#define BUILD_TIMESTAMP \"`cmd /c date /t` `cmd /c time /t`\"" > [email protected] 

...和#include "timestamp.h"在您的代碼中。這樣你只需要擔心你的shell的引用行爲,而不是make和編譯器。

這已經有一段時間,但我覺得記得龍捲風附帶csh的風格外殼,它可以處理報價,呃,不同不是更常見的Bourne shell。它還包括TCL解釋器,你也可以使用通過創建內容的timestamp.tcl

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

,並在makefile寫

timestamp.h: force 
    tclsh timestamp.tcl > [email protected]