Spec-Zone.ru › GNU Make

Как пересоздаются файлы makefile

Иногда файлы makefile могут быть пересозданы из других файлов, таких как RCS или SCCS. Если файл makefile может быть пересоздан из других файлов, вы, вероятно, захотите make получить актуальную версию файла makefile для чтения.

Для этого, после чтения всех файлов makefile make будет рассматривать каждый из них как целевой объект в порядке обработки и попытается обновить его. Если включены параллельные сборки (см. Параллельное выполнение), файлы makefile будут пересозданы также параллельно.

Если в файле makefile есть правило, описывающее, как обновить его (найденное либо в этом же файле makefile, либо в другом), или если к нему применяется неявное правило (см. Использование неявных правил), он будет обновлен при необходимости. После проверки всех файлов makefile, если какие-либо из них были фактически изменены, make начинает с чистого листа и снова читает все файлы makefile. (Он также попытается обновить каждый из них снова, но обычно это не изменит их, поскольку они уже актуальны.) Каждое перезапускание приведет к обновлению специальной переменной MAKE_RESTARTS (см. Специальные переменные).

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

Если файлы makefile содержат правило с двойными двоеточиями для пересоздания файла с рецептом, но без предшественников, этот файл всегда будет пересоздан (см. Двойные двоеточия). В случае файлов makefile, файл makefile, содержащий правило с двойными двоеточиями, с рецептом, но без предшественников, будет пересоздан каждый раз, когда make выполняется, и затем снова после того, как make начинает сначала и снова читает файлы makefile. Это приведет к бесконечной петле: make будет постоянно пересоздавать файл makefile и перезапускаться, и никогда не сделает ничего другого. Таким образом, чтобы избежать этого, make не будет пытаться пересоздавать файлы makefile, указанные как цели правила с двойными двоеточиями, с рецептом, но без предшественников.

Ложные цели (см. Ложные цели) имеют тот же эффект: они никогда не считаются актуальными, поэтому включенный файл, помеченный как ложный, заставит make постоянно перезапускаться. Чтобы избежать этого, make не будет пытаться пересоздавать файлы makefile, помеченные как ложные.

Вы можете использовать это для оптимизации времени запуска: если вам не нужно, чтобы ваш Makefile пересоздавался, вы можете предотвратить попытку make пересоздать его, добавив либо:

.PHONY: Makefile

или:

Makefile:: ;

Если вы не указываете какие-либо файлы makefile для чтения с опциями ‘-f’ или ‘--file’, make будет пытаться использовать имена файлов makefile по умолчанию; см. Какое имя дать вашему Makefile. В отличие от файлов makefile, явно запрошенных с опциями ‘-f’ или ‘--file’, make не уверен, что эти файлы makefile должны существовать. Однако, если файл makefile по умолчанию не существует, но может быть создан путем выполнения make правил, вы, вероятно, хотите, чтобы правила были выполнены, чтобы файл makefile мог быть использован.

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

Когда вы используете опцию ‘-t’ или ‘--touch’ (см. Вместо выполнения рецептов), вы не хотели бы использовать устаревший файл makefile, чтобы определить, какие цели нужно отметить. Поэтому опция ‘-t’ не влияет на обновление файлов makefile; они действительно обновляются, даже если опция ‘-t’ указана. Аналогично, ‘-q’ (или ‘--question’) и ‘-n’ (или ‘--just-print’) не предотвращают обновление файлов makefile, потому что устаревший файл makefile приведет к неправильному выводу для других целей. Таким образом, ‘make -f mfile -n foo’ обновит mfile, прочитает его и затем выведет рецепт обновления foo и его предшественников без его выполнения. Выведенный рецепт для foo будет тем, что указано в обновленном содержимом mfile.

Однако в некоторых случаях вам может потребоваться предотвратить обновление даже файлов makefile. Вы можете сделать это, указав файлы makefile как цели в командной строке, а также указав их как файлы makefile. Когда имя файла makefile явно указано как цель, опции ‘-t’ и т. д. применяются к ним.

Таким образом, ‘make -f mfile -n mfile foo’ прочитает файл makefile mfile, выведет рецепт, необходимый для его обновления без фактического выполнения, и затем выведет рецепт, необходимый для обновления foo без выполнения. Рецепт для foo будет тем, что указано в существующем содержимом mfile.

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/Remaking-Makefiles.html

Spec-Zone.ru

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