Переменные упрощают Makefiles
В нашем примере нам пришлось дважды перечислить все объектные файлы в правиле для edit (повторено здесь):
edit : main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
Такое дублирование чревато ошибками; если к системе добавляется новый объектный файл, мы можем добавить его в один список и забыть о другом. Мы можем устранить риск и упростить makefile, используя переменную. Переменные позволяют один раз определить текстовую строку и подставить ее в нескольких местах позже (см. Как использовать переменные).
Стандартной практикой для каждого makefile является наличие переменной, названной objects, OBJECTS, objs, OBJS, obj, или OBJ, которая является списком всех имен объектных файлов. Мы бы определили такую переменную objects строкой такого вида в makefile:
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
Затем, в каждом месте, где нам нужно поместить список имен объектных файлов, мы можем заменить значение переменной, написав ‘$(objects)’ (см. Как использовать переменные).
Вот как выглядит завершенный упрощённый makefile, когда вы используете переменную для объектных файлов:
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit $(objects)
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/Variables-Simplify.html