GNU make 4.3 中可能存在错误?

Possible bug in GNU make 4.3?

我正在使用的软件的 Makefile 中有以下行:

VERSION = $(subst $(space),.,$(wordlist 1,2,$(subst ., ,$(patsubst v%,%,$(shell cat VERSION)))))

其中 VERSION 是包含软件确切版本的文件 (f.e 3.12.3)

我不是 Makefile 方面的专家,但这一行应该 return 主要版本(没有 v 表示 TAG),在本例中为 3.12。它确实如此,或者至少,当你使用 GNU make <= 4.2

运行 它时它确实如此

我最近更新到 4.3(因为我使用滚动发布,Arch Linux)然后在我的 makefile 中执行相同的行,我得到 3 12. 而不是 3.12

我一直在阅读 Make changelog 以检查与负责检索主要版本的行相关的内容是否有任何更改,但我找不到问题所在。

我已经确认问题只出现在 GNU make 4.3(它适用于 make 4.2),我想知道是否存在错误或我遗漏了什么。

也许有人可以帮助我。

此致

如G.M。提到,这完全取决于您如何定义 space,您没有向我们展示。

使用 GNU make 4.3 使用 "normal" 定义 space 的方式对我有用:

E =
space = $E $E
VERSION = $(subst $(space),.,$(wordlist 1,2,$(subst ., ,$(patsubst v%,%,$(shell cat VERSION)))))

$(info VERSION='$(VERSION)')

然后:

$ cat VERSION
v3.12.3

$ make --version
GNU Make 4.3
 ...

$ make
VERSION='3.12'

正如 MadScientist 和 G.M 提到的,问题出在 space 的定义中。我没有注意到它被定义为

space =
space +=

并且,根据 Makefile 4.3 更改日志:

* WARNING: Backward-incompatibility!
  Previously appending using '+=' to an empty variable would result in a value
  starting with a space.  Now the initial space is only added if the variable
  already contains some value.  Similarly, appending an empty string does not
  add a trailing space.

+= 对空变量的预期行为已更改...所以这就是问题所在!

非常感谢!