Запись рецептов с помощью поиска по каталогам
Когда необходимый компонент находится в другом каталоге через поиск по каталогам, это не может изменить рецепт правила; они будут выполняться так, как написано. Поэтому вы должны тщательно составить рецепт, чтобы он искал необходимый компонент в том каталоге, где make его находит.
Это делается с помощью автоматических переменных, таких как ‘$^’ (см. Автоматические переменные). Например, значение ‘$^’ — это список всех необходимых компонентов правила, включая имена каталогов, в которых они были найдены, а значение ‘$@’ — это целевой объект. Таким образом:
foo.o : foo.c
cc -c $(CFLAGS) $^ -o $@
(Переменная CFLAGS существует, чтобы вы могли указать флаги для компиляции C неявными правилами; мы используем ее здесь для согласованности, чтобы она влияла на все компиляции C одинаково; см. Переменные, используемые неявными правилами.)
Часто необходимые компоненты включают заголовочные файлы, которые вы не хотите упоминать в рецепте. Автоматическая переменная ‘$<’ — это просто первый необходимый компонент:
VPATH = src:../headers
foo.o : foo.c defs.h hack.h
cc -c $(CFLAGS) $< -o $@
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/Recipes_002fSearch.html