在 GNU Make 3.81 中保留先决条件的尾部斜杠
Preserving trailing slashes of prerequisites in GNU Make 3.81
考虑这个非常简单的 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
选项打印处理此 makefile 所产生的规则:
$ make -p 2>/dev/null | grep foo:
foo: bar
我们可以看到原来的 bar/
中的尾部斜杠被删除了。但是,较新版本的 GNU Make(例如 4.2.1)中不存在此问题。
如何在 GNU Make 3.81 中保留规则先决条件名称中的尾部斜杠?
普通尾随 /
似乎不可能,但也许 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/
考虑这个非常简单的 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
选项打印处理此 makefile 所产生的规则:
$ make -p 2>/dev/null | grep foo:
foo: bar
我们可以看到原来的 bar/
中的尾部斜杠被删除了。但是,较新版本的 GNU Make(例如 4.2.1)中不存在此问题。
如何在 GNU Make 3.81 中保留规则先决条件名称中的尾部斜杠?
普通尾随 /
似乎不可能,但也许 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/