Сохранение конечных слешей предпосылок в GNU Make 3.81 - PullRequest
1 голос
/ 05 марта 2019

Рассмотрим этот очень простой make-файл:

foo: bar/

Запуск GNU Make 3.81 на этом make-файле приводит к:

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

Как мы видим, трейлинг / удален изbar/.

В качестве альтернативы, используя опцию --print-data-base или -p, чтобы напечатать правила, полученные в результате обработки этого make-файла:

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

Мы можем видетьчто косая черта удалена из оригинала bar/.Эта проблема, однако, отсутствует в более новых версиях GNU Make (например, 4.2.1).

Как сохранить косую черту в имени предварительных требований правила в GNU Make 3.81?

1 Ответ

3 голосов
/ 05 марта 2019

Простой трейлинг / не представляется возможным, но, возможно, 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/
...