Учебники

Makefile — другие функции

В этой главе мы рассмотрим различные другие особенности 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, используйте следующую команду: