Составители:
Рубрика:
27
4.2.2. Описание GNU make
Утилита GNU make разработана для сборки исходного кода и компиляции его в объектные файлы.
Для того чтобы понять необходимость в подобном инструменте рассмотрим несложную программу на
C. Пусть программа prog состоит из пары файлов кода main.c и supp.c и используемого в каждом из
них файла заголовков defs.h. Тогда для создания prog необходимо из пар (main.c defs.h) и (supp.c
defs.h) создать объектные файлы main.o и supp.o, а затем слинковать их в prog. При сборке вручную,
выйдет что-то вроде:
cc -c main.c defs.h
cc -c supp.c defs.h
cc -o prog main.o supp.o
Если в последствии заголовочный файл defs.h будет изменен, то нам потребуется полная
перекомпиляция; а если изменится файл supp.c, например, то перекомпиляцию файла main.o делать не
нужно. Отсюда возникает желание для каждого файла, который должен получиться в процессе
компиляции, указать, на основе каких файлов и с помощью какой команды он создается. Таким
образом, нам необходима программа, которая собирает правильную последовательность команд,
необходимую для получения требуемых результирующих файлов, и которая запускает процесс
создания требуемого файла только если такого файла не существует или он старше чем файлы, от
которых у него есть зависимости. Именно эта функциональность и реализована в утилите make.
Всю информацию о проекте make получает из Makefile, который обычно хранится в том же
каталоге, что и исходные тексты программы. Простейший Makefile состоит из синтаксических
конструкций двух типов: целей и макроопределений.
Цели в Makefile - это файлы, которые предполагается получить после компиляции проекта.
Описание цели состоит из трех частей: имени цели, списка зависимостей и списка команд
интерпретатора sh, требуемых для построения цели. Имя цели - непустой список файлов, которые
предполагается создать. Список зависимостей - список файлов, из которых строится цель. Примером
простого Makefile может послужить уже упоминавшаяся программа prog:
prog: main.o supp.o
cc -o prog main.o supp.0
main.o supp.o defs.h
В рассмотренном Makefile одни и те же объектные файлы перечисляются несколько раз. Для
упрощения таких ситуаций make поддерживает макроопределения.
Макроопределение представляет из себя пару «переменная=значение». Значение может являться
произвольной последовательностью символов, включая пробелы и обращения к значениям уже
определенных переменных. Теперь при обращении к переменной-макроопределению в Makefile
вместо нее будет подставлено ее текущее значение. Обращение к значению переменной при этом
выглядит как $(переменная). Учитывая это, перепишем наш Makefile:
OBJS = main.o supp.o
prog: $(OBJS)
cc -o prog $(OBJS)
$(OBJS): defs.h
Makefile пишется таким образом, чтобы запуск команды make приводил к компиляции проекта.
Но кроме компиляции Makefile может использоваться и для других целей, например, для очистки
проекта от результатов компиляции или для вызова процедуры инсталляции проекта в системе. Для
выполнения подобных действий в Makefile могут быть указаны дополнительные цели, обращение к
которым будет осуществляться указанием их имени аргументом вызова make (например, «make
install»). Подобные вспомогательные цели носят название фальшивых, что связанно с отсутствием в
проекте файлов, соответствующих их именам. Фальшивая цель может содержать список
зависимостей и должна содержать список команд для исполнения. Поскольку она не имеет
соответствующего файла в проекте, при каждом обращении к ней make будет пытаться ее построить.
Однако, возможно возникновение конфликтной ситуации, когда в каталоге проекта окажется файл с
именем, соответствующим имени фальшивой цели. Если для данного имени не определены файловые
зависимости, он будет всегда считаться актуальным (up to date) и цель выполняться не будет. Для
Страницы
- « первая
- ‹ предыдущая
- …
- 25
- 26
- 27
- 28
- 29
- …
- следующая ›
- последняя »
