在GNU Make 3.81中保留前提条件的尾部斜杠

时间:2019-03-05 10:45:11

标签: makefile gnu-make

考虑这个非常简单的makefile:

foo: bar/

在此makefile上运行GNU Make 3.81会导致:

make: *** No rule to make target `bar', needed by `foo'. Stop.

如我们所见,尾随/已从bar/中删除。

或者,使用--print-data-base or -p选项来打印处理该文件所产生的规则:

$ make -p 2>/dev/null | grep foo:
foo: bar

我们可以看到尾部的斜杠已从原始bar/中删除。但是,较新版本的GNU Make(例如4.2.1)中不存在此问题。

如何在GNU Make 3.81中以规则的先决条件名称保留斜杠?

1 个答案:

答案 0 :(得分:3)

似乎不太可能使用/,但是bar/.可以帮助您吗?它将需要重写所有目录目标以包括结尾的/.

_empty :=
_space := $(_empty) $(_empty)

.PHONY: bar bar/.
bar bar/.:
       @echo "$@ -> $(dir $@)"

foo: bar/

foo_quoted: "bar/ "

foo_space: bar/$(_space)

foo_space_quoted: "bar/$(_space)"

BAR = "bar/ "

foo_var: $(BAR)

BAR_DIR = bar/

foo_dir: $(dir $(BAR_DIR))

BAR_SPACE = bar/$(_space)

foo_var_space: $(BAR_SPACE)

foo_dot: bar/.

foo_double: bar//

所有其他尝试都将寻找bar,即在解析或执行过程中处理依赖项时,GNU make去除尾随的/。另一方面,foo_dot示例导致

$ ./make --version
GNU Make 3.81
...
$ ./make foo_dot
bar/. -> bar/

$ make --version
GNU Make 4.2.1
...
$ make foo_dot
bar/. -> bar/