2010-11-09 58 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]