Использование неявных правил
Чтобы позволить make найти обычный способ обновления целевого файла, вам нужно только воздержаться от указания рецептов самостоятельно. Либо напишите правило без рецепта, либо вообще не пишите правила. Тогда make определит, какое неявное правило использовать, в зависимости от того, какой тип исходного файла существует или может быть создан.
Например, предположим, что файл makefile выглядит так:
foo : foo.o bar.o
cc -o foo foo.o bar.o $(CFLAGS) $(LDFLAGS)
Поскольку вы упоминаете foo.o, но не даёте правило для него, make автоматически ищет неявное правило, которое указывает, как его обновить. Это происходит независимо от того, существует ли файл foo.o в данный момент.
Если неявное правило найдено, оно может предоставить как рецепт, так и один или несколько предшественников (исходные файлы). Вам необходимо написать правило для foo.o без рецепта, если необходимо указать дополнительные предшественники, такие как заголовочные файлы, которые неявное правило предоставить не может.
У каждого неявного правила есть шаблон целевого файла и шаблоны предшественников. Может быть много неявных правил с одним и тем же шаблоном целевого файла. Например, существуют многочисленные правила для файлов ‘.o’: одно — из файла ‘.c’ с помощью компилятора C; другое — из файла ‘.p’ с помощью компилятора Паскаля; и так далее. Правило, которое фактически применяется, — это то, предшественники которого существуют или могут быть созданы. Таким образом, если у вас есть файл foo.c, make запустит компилятор C; в противном случае, если у вас есть файл foo.p, make запустит компилятор Паскаля; и так далее.
Конечно, когда вы пишете файл makefile, вы знаете, какое неявное правило вы хотите make использовать, и вы знаете, что оно будет выбрано, потому что вы знаете, какие возможные файлы-предшественники должны существовать. См. Каталог встроенных правил для каталога всех предварительно определённых неявных правил.
Выше мы сказали, что неявное правило применяется, если необходимые предшественники «существуют или могут быть созданы». Файл «может быть создан», если он явно указан в файле makefile в качестве цели или предшественника, или если для его создания можно рекурсивно найти неявное правило. Когда неявный предшественник является результатом другого неявного правила, мы говорим, что происходит цепление. См. Цепочки неявных правил.
В общем, make ищет неявное правило для каждой цели и для каждого правила с двойными двоеточиями, у которых нет рецепта. Файл, который упомянут только в качестве предшественника, считается целью, правило которой ничего не задаёт, поэтому для него выполняется поиск неявного правила. См. Алгоритм поиска неявного правила для получения подробностей о том, как выполняется поиск.
Обратите внимание, что явные предшественники не влияют на поиск неявного правила. Например, рассмотрите это явное правило:
foo.o: foo.p
Предшественник foo.p не обязательно означает, что make пересоздаст foo.o в соответствии с неявным правилом создания объектного файла, файла .o, из исходного файла Паскаля, файла .p. Например, если foo.c также существует, будет использовано неявное правило создания объектного файла из исходного файла C, потому что оно стоит перед правилом Паскаля в списке предопределённых неявных правил (см. Каталог встроенных правил).
Если вы не хотите использовать неявное правило для цели, у которой нет рецепта, вы можете присвоить этой цели пустой рецепт, написав точку с запятой (см. Определение пустых рецептов).
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/Using-Implicit.html