В этой главе мы рассмотрим различные другие особенности Makefile.
Рекурсивное использование Make
Рекурсивное использование make означает использование make в качестве команды в make-файле. Этот метод полезен, когда вам нужны отдельные make-файлы для различных подсистем, составляющих большую систему. Например, предположим, что у вас есть подкаталог с именем `subdir ‘, который имеет свой собственный make-файл, и вы хотели бы, чтобы make-файл содержащего каталога запускал make в этом подкаталоге. Вы можете сделать это, написав следующий код —
subsystem: cd subdir && $(MAKE) or, equivalently: subsystem: $(MAKE) -C subdir
Вы можете написать рекурсивные команды make, просто скопировав этот пример. Тем не менее, вам необходимо знать, как они работают и почему, и как подзадача связана с маркой верхнего уровня.
Передача переменных в суб-марку
Значения переменных make верхнего уровня могут быть переданы подкоманде через окружение по явному запросу. Эти переменные определены в дополнительном производстве как значения по умолчанию. Вы не можете переопределить то, что указано в make-файле, используемом подфайл-make-файлом, если вы не используете ключ `-e ‘.
Чтобы передать или экспортировать переменную, make добавляет переменную и ее значение в среду для выполнения каждой команды. Подзадача, в свою очередь, использует среду для инициализации своей таблицы значений переменных.
Специальные переменные SHELL и MAKEFLAGS всегда экспортируются (если вы не экспортируете их). MAKEFILES экспортируется, если вы установите его на что-либо.
Если вы хотите экспортировать определенные переменные в подкомпонент, используйте директиву экспорта, как показано ниже —
export variable ...
Если вы хотите предотвратить экспорт переменной, воспользуйтесь директивой unsport, как показано ниже:
unexport variable ...
Переменная MAKEFILES
Если переменная окружения MAKEFILES определена, make рассматривает ее значение как список имен (разделенных пробелом) дополнительных make-файлов, которые должны быть прочитаны перед остальными. Это работает так же, как директива include: для поиска этих файлов используются разные каталоги.
Основное использование MAKEFILES — это связь между рекурсивными вызовами make .
Включая заголовочный файл из разных каталогов
Если вы поместили файлы заголовков в разные каталоги и запускаете make в другом каталоге, то необходимо указать путь к файлам заголовков. Это можно сделать с помощью опции -I в make-файле. Если предположить, что файл functions.h находится в папке / home / tutorialspoint / header, а остальные файлы находятся в папке / home / tutorialspoint / src /, то файл makefile будет записан следующим образом:
INCLUDES = -I "/home/tutorialspoint/header" CC = gcc LIBS = -lm CFLAGS = -g -Wall OBJ = main.o factorial.o hello.o hello: ${OBJ} ${CC} ${CFLAGS} ${INCLUDES} -o $@ ${OBJS} ${LIBS} .cpp.o: ${CC} ${CFLAGS} ${INCLUDES} -c $<
Добавление дополнительного текста к переменным
Часто полезно добавить больше текста к значению уже определенной переменной. Вы делаете это со строкой, содержащей `+ = ‘, как показано —
objects += another.o
Он берет значение переменных объектов и добавляет к нему текст «another.o», которому предшествует один пробел, как показано ниже.
objects = main.o hello.o factorial.o objects += another.o
Приведенный выше код устанавливает объекты в main.o hello.o factorial.o another.o.
Использование `+ = ‘похоже на:
objects = main.o hello.o factorial.o objects := $(objects) another.o
Строка продолжения в Makefile
Если вам не нравятся слишком большие строки в вашем файле Makefile, вы можете разбить вашу строку, используя обратную косую черту «\», как показано ниже —
OBJ = main.o factorial.o \ hello.o is equivalent to OBJ = main.o factorial.o hello.o
Запуск Makefile из командной строки
Если вы подготовили Makefile с именем «Makefile», просто напишите make в командной строке, и он запустит файл Makefile. Но если вы дали другое имя Makefile, используйте следующую команду: