2016-07-24 3 views
0

Я хочу, чтобы кодировать правила «, чтобы сделать <name>.done, вам нужны все файлы шаблона <name>.needed.* я попытался написать это с этим Makefile:.

%.done: $(wildcard %.needed.*) 
    cat $^ > [email protected] 

Но когда я бегу touch foo.needed.bar && make foo.done, все это я получаю является

cat > foo.done 

он появляется % внутри $(wildcard) интерпретируется как литерал «%». Как я могу получить это расширилось в нужное значение («Foo» в данном случае)?

+0

'widcard' ->' wildcard' предположительно –

+0

Yup, исправлено. –

+0

Объяснение, почему это не работает: параметры рецепта (источник, вход и зависимости) оцениваются/расширяются уже во время разбора, поэтому '$ (wildcard)' вызывается с буквальным '%', не находит файлов и заменяется на пустая строка. Отсроченная оценка применяется только к команде. FYI. – Dummy00001

ответ

1

% является просто заполнителем для «любой строки» в соответствии с шаблоном. Он не имеет особого значения в функции wildcard и интерпретируется буквально.

Вы можете попытаться с помощью $* вместо (который будет расширяться на стебле файла), но, к сожалению, она не будет работать:

%.done: $(wildcard $*.needed.*) 

Причина, по которой не работает, что автоматический переменные ($* - один из них) недоступны для использования в списке зависимостей.

Чтобы обойти эту проблему, чтобы запросить secondary expansion для цели:

.SECONDEXPANSION: 
%.done: $$(wildcard $$*.needed.*) 

Это подскажет GNU Make идти по правилу второй раз после обработки Makefile, как обычно, расширяя любой ушедший переменные, которые не были в первый раз. Во второй раз автоматическая переменная имеет свои соответствующие значения.

+1

Спасибо, это решает мою проблему. Кроме того, кто-то прокомментировал ранее более простое, но менее общее решение: '% .done:% .needed. *'. –

+0

@BrianMalehorn Ну, это будет работать в некоторых случаях, но если вы используете '$ <' или '$ +' или что-то в командах для переустановки цели, это может забрать неправильные файлы. – Kusalananda

Смежные вопросы