Переопределение части другого файла Makefile
Иногда полезно иметь makefile, который в основном похож на другой makefile. Часто можно использовать директиву «include» для включения одного в другой и добавления дополнительных целей или определений переменных. Однако не допускается, чтобы два makefile предоставляли разные рецепты для одной и той же цели. Но есть и другой способ.
В содержащем makefile (том, который хочет включить другой), можно использовать правило шаблона, которое подбирает любой шаблон, для того, чтобы пересоздать любую цель, которую нельзя создать из информации в содержащем makefile, make должен обратиться к другому makefile. См. Правила шаблонов для получения дополнительной информации о правилах шаблонов.
Например, если у вас есть makefile под названием Makefile, который описывает, как создать цель «foo» (и другие цели), вы можете написать makefile под названием GNUmakefile, который содержит:
foo:
frobnicate > foo
%: force
@$(MAKE) -f Makefile $@
force: ;
Если вы скажете «make foo», make найдёт GNUmakefile, прочитает его и увидит, что для создания foo необходимо выполнить рецепт «frobnicate > foo». Если вы скажете «make bar», make не найдёт способа создать bar в GNUmakefile, поэтому он воспользуется рецептом из правила шаблона: «make -f Makefile bar». Если Makefile предоставляет правило для обновления bar, make применит это правило. И аналогично для любой другой цели, способ создания которой не описан в GNUmakefile.
Этот механизм работает так, что правило шаблона имеет шаблон только «%», поэтому оно соответствует любой цели. Правило задает предварительную цель force, чтобы гарантировать, что рецепт будет выполнен, даже если целевой файл уже существует. Мы даём цели force пустой рецепт, чтобы предотвратить make поиск неявного правила для его построения — в противном случае оно применит то же правило подбора любого шаблона к force самому и создаст цикл зависимостей!
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/Overriding-Makefiles.html