Spec-Zone.ru › GNU Make

Цепочки неявных правил

Иногда файл можно создать с помощью последовательности неявных правил. Например, файл n.o можно создать из n.y, выполнив сначала Yacc, а затем cc. Такая последовательность называется цепочкой.

Если файл n.c существует или упомянут в файле makefile, особый поиск не требуется: make определяет, что объектный файл можно создать путем компиляции C из n.c; позднее, при рассмотрении того, как создать n.c, используется правило выполнения Yacc. В конечном итоге и n.c, и n.o обновляются.

Однако, даже если n.c не существует и не упомянут, make знает, как представить его как недостающее звено между n.o и n.y! В этом случае n.c называется промежуточным файлом. После того как make решил использовать промежуточный файл, он вносится в базу данных так, как будто он был упомянут в файле makefile, вместе с неявным правилом, которое описывает, как его создать.

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

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

Второе отличие заключается в том, что если make создаёт b для обновления чего-то другого, он удаляет b позднее, после того, как он больше не нужен. Поэтому промежуточный файл, который не существовал до make, также не существует после make. make сообщает об удалении, выведя команду «rm», показывая, какой файл удаляется.

Вы можете явно отметить файл как промежуточный, перечислив его как предшественник специальной цели .INTERMEDIATE. Это действует даже в том случае, если файл упомянут каким-либо другим способом.

Файл не может быть промежуточным, если он указан в файле makefile как цель или предшественник, поэтому один из способов избежать удаления промежуточных файлов — добавить его в качестве предшественника какой-либо цели. Однако это может заставить make выполнять дополнительные операции при поиске правил шаблонов (см. Алгоритм поиска неявных правил).

В качестве альтернативы, перечисление файла в качестве предшественника специальной цели .NOTINTERMEDIATE заставляет его не рассматриваться как промежуточный (как и любое другое упоминание файла). Кроме того, перечисление шаблона цели правила шаблона в качестве предшественника .NOTINTERMEDIATE гарантирует, что никакие цели, сгенерированные с использованием этого правила шаблона, не рассматриваются как промежуточные.

Вы можете полностью отключить промежуточные файлы в своём файле makefile, указав .NOTINTERMEDIATE как цель без предшественников: в этом случае это относится ко всем файлам в файле makefile.

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

Цепочка может включать более двух неявных правил. Например, возможно создать файл foo из RCS/foo.y,v, выполнив RCS, Yacc и cc. Затем и foo.y, и foo.c являются промежуточными файлами, которые удаляются в конце.

Ни одно неявное правило не может появляться более одного раза в цепочке. Это означает, что make не будет даже рассматривать такую нелепую вещь, как создание foo из foo.o.o путём выполнения компоновщика дважды. Это ограничение также предотвращает любые бесконечные циклы при поиске цепочки неявного правила.

Существуют некоторые специальные неявные правила для оптимизации определённых случаев, которые в противном случае обрабатывались бы цепочками правил. Например, создание foo из foo.c можно было бы обработать путём компиляции и компоновки с отдельными правилами цепочки, используя foo.o как промежуточный файл. Но на самом деле происходит то, что специальное правило для этого случая выполняет компиляцию и компоновку с помощью одной cc команды. Оптимизированное правило используется вместо пошаговой цепочки, так как оно располагается раньше в порядке правил.

Наконец, по причинам производительности make не будет рассматривать нетерминальные правила совпадения «всех» (то есть «%:») при поиске правила для построения предшественника неявного правила (см. Правила совпадения «всех»).

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

Spec-Zone.ru

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