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