Как вызывать функции в рамках предварительных условий только для заказа? - PullRequest
5 голосов
/ 02 марта 2012

С учетом этого бита 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). - руководство

Тот факт, что ствол доступен, демонстрируется на примере: ствол расширяется до правильного значения, когда используется один, а не когда передается функции.

Ответы [ 2 ]

2 голосов
/ 02 марта 2012

Как видно из этого раздела GNU make manual , ссылки на переменные и функции в списке предпосылок немедленно расширяются во время фазы чтения.Это означает, что до сопоставления с образцом % не имеет особого значения;он интерпретируется как буквальный символ в двух ссылках на функции, $(dir %) и $(call my_dir,%), каждая из которых имеет в результате ./, которые объединяются в ссылке на $| в рецепте.

Я не знаю другого обходного пути, кроме того, который вы уже нашли, т.е. вторичного расширения.

2 голосов
/ 02 марта 2012

Примечание $1 - это не специальная переменная, которая расширяется до чего-либо интересного, связанного с правилами шаблонов (или статическими правилами шаблонов). Переменная $1 имеет уникальное поведение только в контексте пользовательского макроса, вызываемого функцией $(call ...).

Вы хотели использовать $*, а не $1; $* - это автоматическая переменная, которая расширяется до основы цели правила.

Однако во всех версиях make (включая стандартное определение make для POSIX) автоматические переменные (включая $*, $<, $@, $^ и т. Д.) Доступны только в контексте рецепт. Они недоступны в контексте целевых или обязательных списков. Для получения дополнительной информации см. Раздел GNU make для автоматических переменных .

Как вы предполагаете, существует псевдоцелевая .SECONDEXPANSION, позволяющая обойти эту особенность GNU make, которая позволяет обойти это ограничение.

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