Резюме:
Я использую GNU Make (3.81) в unix-подобной системе, и я столкнулся с проблемой, когда функция $(wildcard, pattern) не может найти файл, сгенерированный ранее (по-видимому?), Ранее выполненный рецепт, тогда как другие программы (например, ls) могут проверить свое существование. Я хотел бы знать, почему функция wildcard ничего не возвращает, когда она расширена (до пустой строки) и как я могу заставить ее найти сгенерированный файл.
Тестовый пример:
Следующий тестовый пример иллюстрирует проблему.
Содержимое Makefile:
.PHONY: build clean
test:
@echo "Creating test file 'test'."
@echo "this is a test file" > test
build: test
@echo "Directory contents:"
@ls
@echo "Test file contents:"
@cat test
@echo "Wildcard output:"
@echo $(wildcard test)
clean:
@rm -f test
Запуск make файла дважды (затем очистка) показывает, что только при втором запуске он обнаруживает созданный файл.
Выход:
Creating test file 'test'.
Directory contents:
makefile test
Test file contents:
this is a test file
Wildcard output:
Directory contents:
makefile test
Test file contents:
this is a test file
Wildcard output:
test
Воспроизведение:
Сохраните make файл в пустом каталоге, затем запустите команду make make make make make make make clean.
Исследование:
Порядок, в котором обрабатываются предпосылки для цели, не зависит от порядка, в котором они отображаются в списке после двоеточия, поэтому должны быть введены явные взаимозависимые зависимости если вы хотите определить порядок их обработки.
Тем не менее, я не думаю, что я могу разграничить зависимости; build зависит от test, а test соответствует файлу, который не существует и генерируется его рецептом. Я предположил, что он будет присутствовать к тому времени, когда должен был быть обработан рецепт build.
Из моего знания того, как make анализирует make файл, подстановочная функция внутри рецепта не должна расширяться до его обработки. Тем не менее, я отчетливо вижу разницу между выходом встроенной функции make и выходом общих утилит, доступ к которым осуществляется через оболочку, поэтому эта презумпция, вероятно, неверна, но я не нашел никаких хороших объяснений того, что должно было происходят здесь, даже в GNU не делают руководство.
N.B. Цель этого вопроса - просто понять понимание работы подстановочной функции, имеющей отношение к этой проблеме; есть практический случай использования, из которого я перегонял эту политую версию, но меня больше интересует этот случай.