繁体   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