Spec-Zone.ru › GNU Make

Правила шаблонов для сопоставления с любым образцом

Когда целевой объект правила шаблона — просто «%», оно сопоставляется с любым именем файла. Мы называем такие правила правилами сопоставления с любым образцом. Они очень полезны, но make может тратить много времени на их обработку, так как оно должно учитывать каждое такое правило для каждого имени файла, указанного в качестве цели или предпосылки.

Предположим, в файле makefile упоминается foo.c. Для этой цели make должно было бы рассмотреть возможность создания её путём компоновки объектного файла foo.c.o, или путём компиляции и компоновки на C в одном шаге из foo.c.c, или путём компиляции и компоновки на Паскале из foo.c.p, и многие другие варианты.

Мы знаем, что эти варианты абсурдны, так как foo.c — это файл исходного кода на C, а не исполняемый файл. Если make рассматривало бы эти варианты, оно в конечном итоге отклонило бы их, потому что файлы, такие как foo.c.o и foo.c.p, не существовали бы. Но эти варианты настолько многочисленны, что make работало бы очень медленно, если бы ему приходилось их рассматривать.

Для повышения скорости мы установили различные ограничения на то, как make рассматривает правила сопоставления с любым образцом. Существует два разных ограничения, которые можно применить, и каждый раз, когда вы определяете правило сопоставления с любым образцом, вы должны выбрать одно из них для этого правила.

Один из вариантов — пометить правило сопоставления с любым образцом как терминальное, определив его с помощью двойного двоеточия. Когда правило является терминальным, оно не применяется, если его предпосылки фактически не существуют. Предпосылки, которые могли бы быть созданы с помощью других неявных правил, недостаточно хороши. Другими словами, дальнейшее цепное применение не допускается за пределами терминального правила.

Например, встроенные неявные правила для извлечения исходных файлов из файлов RCS и SCCS являются терминальными; в результате, если файл foo.c,v не существует, make даже не будет рассматривать возможность создания его в качестве промежуточного файла из foo.c,v.o или из RCS/SCCS/s.foo.c,v. Файлы RCS и SCCS обычно являются конечными исходными файлами, которые не должны быть пересозданы из других файлов; поэтому make может сэкономить время, не пытаясь найти способы их пересоздания.

Если вы не помечаете правило сопоставления с любым образцом как терминальное, оно является нетерминальным. Нетерминальное правило сопоставления с любым образцом не может применяться к предпосылке неявного правила или к имени файла, указывающему на определённый тип данных. Имя файла указывает на определённый тип данных, если какая-либо не являющаяся правилом сопоставления с любым образцом целевая строка неявного правила ему соответствует.

Например, имя файла foo.c соответствует цели правила шаблона ‘%.c : %.y’ (правило для запуска Yacc). Независимо от того, действительно ли это правило применимо (что происходит только в том случае, если есть файл foo.y), тот факт, что его цель совпадает, достаточно, чтобы предотвратить рассмотрение каких-либо нетерминальных правил сопоставления с любым образцом для файла foo.c. Таким образом, make даже не будет пытаться создавать foo.c в качестве исполняемого файла из foo.c.o, foo.c.c, foo.c.p и т. д.

Мотивация этого ограничения заключается в том, что нетерминальные правила сопоставления с любым образцом используются для создания файлов, содержащих определённые типы данных (например, исполняемые файлы), а имя файла с распознаваемым суффиксом указывает на какой-либо другой конкретный тип данных (например, файл исходного кода на C).

Предоставляются специальные встроенные фиктивные правила шаблонов исключительно для распознавания определённых имён файлов, чтобы не рассматривались нетерминальные правила сопоставления с любым образцом. Эти фиктивные правила не имеют предпосылок и рецептов и игнорируются для всех других целей. Например, встроенное неявное правило

%.p :

существует для того, чтобы убедиться, что файлы исходного кода Паскаля, такие как foo.p, соответствуют определённому шаблону цели и тем самым предотвращается трата времени на поиск foo.p.o или foo.p.c.

Фиктивные правила шаблонов, такие как правило для ‘%.p’, создаются для каждого суффикса, указанного как допустимый для использования в правилах суффиксов (см. Правила суффиксов старого образца).

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/Match_002dAnything-Rules.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API