GNU make 4.3中可能存在的错误?

问题描述 投票:0回答:1

我在一个软件的Makefile里有以下一行。

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

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

我不是Makefiles的专家,但这一行应该返回主要版本(不含 v 表示TAG),在本例中是3.12。它确实如此,或者说,至少,当你用GNU make <= 4.2运行它时,它确实如此。

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

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

我确认这个问题只出现在GNU make 4.3上(在make 4.2上也能用),我想知道是否有bug或者我遗漏了什么。

也许有人能帮助我。

问好

makefile gnu-make
1个回答
1
投票

正如G.M.所提到的,这一切都取决于你如何定义了 space你还没有给我们看。

我用 "正常 "的方式来定义它,它的工作原理是什么?space,使用GNU make 4.3。

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

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

3: 那么:

$ cat VERSION
v3.12.3

$ make --version
GNU Make 4.3
 ...

$ make
VERSION='3.12'

0
投票

正如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.

预期的行为是 += 到一个空的变量已经改变了......所以这就是问题所在!

非常感谢您!

© www.soinside.com 2019 - 2024. All rights reserved.