在Windows上为GNU Make定义和使用构建时间戳

时间:2010-11-09 15:49:16

标签: windows shell makefile timestamp quote

我正在尝试在Windows上使用GNU make 3.81和与Wind River Tornado一起发布的古代make(制作3.76)来构建一些软件。

到目前为止,我设法从windows中捕获日期:

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

但是当我在编译器上传递它时

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

由于时间戳中的空格和冒号和斜杠,我遇到了构建错误。如果我回显$(NOW)变量,它被正确引用,但是当我回显$(CFLAGS)变量时,引号会消失。

3 个答案:

答案 0 :(得分:0)

你想引用shell的变量(所以它不受分词限制)并再次为C引用它(所以当它被cpp代替时,你有一个字符串文字)。试试这个:

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

另请注意,我使用的是:=而不是=。除非您的旧make不支持它,否则请使用:=,它会在定义时评估替换,而不是扩展点。每次尝试编译文件时,使用=将使它调用两次shell命令。表现不太好。

答案 1 :(得分:0)

我认为你应该设置: CFLAGS = ... -DBUILD_TIMESTAMP =“$(NOW)”......

即。添加引号。

还有另一个“hacky”解决方案 - 删除$(NOW)中的空格 - >尝试:

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

答案 2 :(得分:0)

如果您消除了在编译器命令行上传递带引号的字符串的棘手问题,您可能会发现问题更容易调试,如下所示:

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

...和#include "timestamp.h"。这样你只需要担心shell的引用行为,而不是make和编译器。

已经有一段时间了,但是我想想我记得Tornado附带了一个csh风格的shell,它比更常见的Bourne shell处理引用,呃,不同 。它还包括一个TCL解释器,您可以通过创建包含

等内容的timestamp.tcl来使用它
puts "#define BUILD_TIMESTAMP \"[clock format [clock seconds] -format {%D %T}]\""

并撰写

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

在makefile中。