С учетом этого бита Makefile:
# for pattern matching
$(OBJDIR) := build
# just to see if a level of indirection will work
my_dir = $(dir $(1))
$(OBJECTS) : $(OBJDIR)/% : $(HEADERS) $(SRCDIR)/% | % $(dir %) $(call my_dir,%)
@echo output-only = $|
Это правило статического шаблона с предпосылками только для заказа .
Рассмотримцель "build / utility / debug.js".Вывод вышеупомянутого правила будет следующим:
output-only = utility/debug.js ./
- Первый компонент, "utility / debug.js", правильно скопирован из основы (%).
- Второй компонент, "./", является выходом вызова функции
dir
в списке предварительных условий. - Третий компонент, пустая строка, является выходом вызова функции my
my_dir
всписок предварительных условий.
Если я изменю my_dir
на это:
my_dir = $(1)
Выход остается прежним.Если я изменю это на следующее:
my_dir = "foo"
Тогда подайте жалобу, нет правила делать "foo" (что ожидается).Похоже, что $(1)
не привязывается при вызове к my_dir
.
Что происходит?Почему я не могу передать ствол функции?У меня есть обходной путь, который использует вторичное расширение, но я хочу знать, почему я не могу написать свое правило таким образом.
РЕДАКТИРОВАТЬ: Я новичок в stackoverflow, простите меня, если этоэто не так, как здесь делается.
Я хочу $ (1), потому что я передаю основание в качестве аргумента my_dir
, как указал Алекс.
Я незнаю, почему это было предложено, я хочу "$".Я не верю, что $ само по себе расширяется до чего-либо в любом контексте.
Я знаю, что автоматические переменные доступны только в рецепте.Я не использую автоматическую переменную в предварительных условиях - я использую ствол:
Каждая цель сопоставляется с шаблоном цели для извлечения части имени цели, называемой стволом.Этот стебель подставляется в каждый из шаблонов prereq, чтобы создать необходимые имена (по одному из каждого шаблона prereq). - руководство
Тот факт, что ствол доступен, демонстрируется на примере: ствол расширяется до правильного значения, когда используется один, а не когда передается функции.