我正在尝试在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)变量时,引号会消失。
答案 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中。