Несколько правил для одной цели
Один файл может быть целью нескольких правил. Все предшественники, упомянутые во всех правилах, объединяются в один список предшественников для цели. Если цель старше любого предшественника из любого правила, рецепт выполняется.
Может быть только один рецепт для выполнения для файла. Если более одного правила предоставляет рецепт для одного файла, make использует последний и выводит сообщение об ошибке. (В качестве специального случая, если имя файла начинается с точки, сообщение об ошибке не выводится. Это странное поведение только для совместимости с другими реализациями make… следует избегать его использования). Иногда полезно иметь одну и ту же цель, вызывающую несколько рецептов, определённых в разных частях файла make; для этого можно использовать правила с двумя двоеточиями (см. Двоеточие).
Дополнительное правило только с предшественниками может использоваться для добавления нескольких дополнительных предшественников сразу для многих файлов. Например, файлы make часто содержат переменную, такую как objects, содержащую список всех файлов выходных данных компилятора в системе, которая создаётся. Простой способ сказать, что все они должны быть перекомпилированы, если config.h изменится, — написать следующее:
objects = foo.o bar.o foo.o : defs.h bar.o : defs.h test.h $(objects) : config.h
Это можно вставлять или удалять, не изменяя правила, которые фактически определяют, как создавать файлы объектов, что делает его удобной формой использования, если вы хотите периодически добавлять дополнительные предшественники.
Ещё одна тонкость заключается в том, что дополнительные предшественники могут быть указаны с помощью переменной, которую вы задаёте с аргументом командной строки для make (см. Переопределение переменных). Например,
extradeps= $(objects) : $(extradeps)
означает, что команда ‘make extradeps=foo.h’ будет рассматривать foo.h как предшественник каждого файла объекта, но обычная команда ‘make’ — нет.
Если ни одно из явных правил для цели не имеет рецепта, то 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/Multiple-Rules.html