我在一个软件的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或者我遗漏了什么。
也许有人能帮助我。
问好
正如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'
正如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.
预期的行为是 +=
到一个空的变量已经改变了......所以这就是问题所在!
非常感谢您!