Алгоритм поиска неявных правил
Вот процедура make, используемая для поиска неявного правила для целевого значения t. Эта процедура выполняется для каждого правила с двойным двоеточием без рецепта, для каждой цели обычных правил, ни одно из которых не имеет рецепта, и для каждого предварительного условия, которое не является целью какого-либо правила. Она также выполняется рекурсивно для предварительных условий, полученных из неявных правил, при поиске цепочки правил.
Правила суффикса не упоминаются в этом алгоритме, поскольку правила суффикса преобразуются в эквивалентные правила шаблонов после чтения файлов make.
Для целевого члена архива в форме ‘archive(member)’ следующий алгоритм выполняется дважды: сначала с использованием всего имени цели t, а во-вторых, используя ‘(member)’ в качестве целевого значения t, если при первом выполнении правило не найдено.
- Разделить t на часть каталога, называемую d, и остальную часть, называемую n. Например, если t равно ‘src/foo.o’, то d равно ‘src/’, а n равно ‘foo.o’.
- Создать список всех правил шаблонов, одна из целей которых совпадает с t или n. Если целевой шаблон содержит слеш, он сопоставляется с t; в противном случае — с n.
- Если какое-либо правило в этом списке не является правилом сопоставления всего, или если t является предварительным условием неявного правила, удалить из списка все нетерминальные правила сопоставления всего.
- Удалить из списка все правила без рецепта.
- Для каждого правила шаблона в списке:
- Найти ствол s, который является непустой частью t или n, совпадающей с ‘%’ в целевом шаблоне.
- Вычислить имена предварительных условий, заменив s на ‘%’; если целевой шаблон не содержит слеш, добавить d в начало каждого имени предварительного условия.
- Проверить, существуют ли или должны существовать все предварительные условия. (Если имя файла упоминается в файле make как цель или как явное предварительное условие цели T, то мы говорим, что оно должно существовать.)
Если все предварительные условия существуют или должны существовать, или предварительных условий нет, то это правило применяется.
- Если до сих пор не найдено ни одного правила шаблона, попробуйте ещё раз. Для каждого правила шаблона в списке:
- Если правило является терминальным, проигнорировать его и перейти к следующему правилу.
- Вычислить имена предварительных условий, как и раньше.
- Проверить, существуют ли или должны существовать все предварительные условия.
- Для каждого предварительного условия, которое не существует, выполнить этот алгоритм рекурсивно, чтобы проверить, можно ли создать предварительное условие с помощью неявного правила.
- Если все предварительные условия существуют, должны существовать или могут быть созданы с помощью неявных правил, то это правило применяется.
- Если ни одно правило шаблона не найдено, повторить шаги 5 и 6 с изменённым определением «должно существовать»: если имя файла упомянуто как цель или как явное предварительное условие любой цели, то оно должно существовать. Эта проверка присутствует только для обратной совместимости со старыми версиями GNU make: мы не рекомендуем полагаться на неё.
- Если ни одно неявное правило не применяется, применяется правило для
.DEFAULT, если таковое имеется. В этом случае присвойте t тот же рецепт, что и у.DEFAULT. В противном случае рецепта для t нет.
После того как найдено применяемое правило, для каждого целевого шаблона правила, отличного от шаблона, соответствующего t или n, символ ‘%’ в шаблоне заменяется на s, а полученное имя файла сохраняется до тех пор, пока не будет выполнен рецепт для пересоздания целевого файла t. После выполнения рецепта каждое из этих сохранённых имён файлов вводится в базу данных и помечается как обновлённое и имеющее тот же статус обновления, что и файл t.
При выполнении рецепта правила шаблона для t автоматические переменные устанавливаются соответствующим образом для цели и предварительных условий. См. Автоматические переменные.
Copyright © 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Free Software Foundation, Inc.
Licensed under the GNU Free Documentation License.
https://www.gnu.org/software/make/manual/html_node/Implicit-Rule-Search.html