2

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

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

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

但是当我将它传递给编译器时

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

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

4

3 回答 3

0

您想为 shell 引用变量(因此它不受分词的影响)并为 C 再次引用它(所以当它被替换时cpp,您有一个字符串文字)。尝试这个:

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

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

于 2010-11-09T19:42:47.073 回答
0

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

即添加引号。

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

empty:=
space:= $(empty) $(empty)
NOW:=$(subst $space,_,$(NOW))
于 2010-11-09T20:00:25.210 回答
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 > $@

在生成文件中。

于 2010-12-05T15:30:46.573 回答