возвращаемое значение patsubst, когда шаблон не найден - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь отправить команды «sub-make» в подкаталог. У меня есть родительский каталог с Makefile "top_level" и дочерний каталог с собственным Makefile.

Мой родительский Makefile имеет следующую строку:

target%:
    make -C sub_dir $(patsubst target-%,%,$@)

Я могу сделать в родительской папке:

make target-clean && make target-all

Это будет интерпретироваться как:

make -C sub_dir clean && make -C sub_dir all

Я хочу быть в состоянии сделать:

сделать цель

но в этом случае я получаю:

make -C sub_dir target.o

Я ожидал, что хотя patsubst не найдет шаблон, он ничего не вернет или проверенное выражение. Но он возвращает это "target.o".

Может кто-нибудь объяснить это мне? Как мне ничего не получить?

Я попробовал эти выражения безуспешно:

make -C sub_dir $(patsubst target%,%,$@)
make -C sub_dir $(patsubst -%,%,$(patsubst target%,%,$@))
make -C sub_dir $($(patsubst -%,%,$(patsubst target%,%,$@)):.o=)

Последний хитрый, он дает:

make -C sub_dir
make [1]: вход в каталог / home / aurelien / документы / проекты / parent / sub_dir '
make [1]: 'subtarget' обновлено.
make [1]: выход из каталога '/ home / aurelien / документы / проекты / parent / sub_dir'
cc target.o -o target
cc: target.o: такого файла или каталога нет
Копия: нет входных файлов
make: *** [target] Ошибка 1

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Проблема в том, что шаблон должен соответствовать одному или нескольким символам. Итак, этот шаблон:

target%:

не соответствует целевому имени target, потому что не осталось символов, соответствующих шаблону.

Итак, make ищет другое неявное правило, которое можно использовать для построения target, и находит встроенное правило:

% : %.o

поэтому он пытается построить target.o. Эта цель будет соответствовать шаблону target% со стеблем .o, поэтому она пытается использовать ваше правило для ее построения.

Чтобы конкретно ответить на ваш вопрос, любое слово, которое не соответствует шаблону подстановки в patsubst, будет пропущено без его изменения.

0 голосов
/ 05 июля 2018

Шаблон target% соответствует, но только с хотя бы одним символом для %, но не с нулем. Из GNU сделайте инструкцию:

Шаблонное правило содержит символ «%» (ровно один из них) в цель; в противном случае это выглядит как обычное правило. Цель шаблон сопоставления имен файлов; «%» соответствует любому непустому подстрока, в то время как другие символы соответствуют только себе.

Таким образом, target не соответствует и make использует свои неявные правила для сборки target: сборка target.o и затем target из target.o. При попытке найти способ построить target.o, шаблонное правило совпадает и рецепт:

make -C sub_dir $(patsubst target-%,%,$@)

расширен. Но поскольку target.o не соответствует target-%, patsubst ничего не делает, и ваш рецепт становится:

make -C sub_dir target.o
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...