Вторичное расширение Makefile

В разделе 3.8 руководства gnu говорится:

«Во время вторичного расширения явных правил $$@ и $$% оцениваются, соответственно, как имя файла цели, а если целью является элемент архива, имя целевого элемента. Переменная $$< оценивается как первое предварительное условие в первом правиле. для этой цели. $$^ и $$+ оцениваются как список всех предварительных условий правил, которые уже появились для той же цели ($$+ с повторениями и $$^ без). Следующий пример поможет проиллюстрировать это поведение:

.SECONDEXPANSION:
foo: foo.1 bar.1 $$< $$^ $$+ # line #1
foo: foo.2 bar.2 $$< $$^ $$+ # line #2
foo: foo.3 bar.3 $$< $$^ $$+ # line #3

В первом списке обязательных условий все три переменные ($$‹, $$^ и $$+) заменяются на пустую строку».

Мой вопрос: почему $$< расширяется до пустой строки? В приведенном выше абзаце говорится, что он должен оцениваться по первому требованию первого правила для этой цели. Разве это не foo.1 ?


person Lavya    schedule 22.04.2014    source источник


Ответы (1)


Руководство вводит в заблуждение, возможно, из-за опечатки. Первое из двух предложений:

Переменная $$‹ оценивается как первая предпосылка в первом правиле для этой цели. $$^ и $$+ оцениваются как список всех предпосылок правил, которые уже появились для той же цели ($$+ с повторениями и $$^ без).

следует квалифицировать, как и второе, добавляя слова: «то, что уже появилось».

Вы можете убедиться, что это правильно описывает поведение, запустив два make-файла:

Сделать 1

.SECONDEXPANSION:
foo: foo.1 $$<
    @echo $+

Результат:

foo.1

показывая, что $$< расширился до пустой строки. Затем:

Сделать 2

.SECONDEXPANSION:
foo: foo.1
foo: foo.2 $$<
    @echo $+

Теперь вывод:

foo.2 foo.1 foo.1

Здесь объединены явные предпосылки foo.1 и foo.2 из первого и второго правил для цели foo, что составляет начальный foo.2 foo.1 вывода. Кроме того, $$< во втором правиле расширяется до первой предпосылки foo.1 предыдущего правила, которое учитывает или завершает foo.1 выходных данных.

person Mike Kinghan    schedule 22.04.2014