Поиск по сайту:

Краткое введение в «Makefiles» при разработке программного обеспечения с открытым исходным кодом с помощью GNU Make


GNU Make — это утилита разработки, которая определяет части конкретной базы кода, которые необходимо перекомпилировать, и может выдавать команды для выполнения этих операций над базой кода. Эту конкретную утилиту make можно использовать с любым языком программирования при условии, что их компиляцию можно выполнить из оболочки путем ввода команд.

Чтобы использовать GNU Make, нам нужен некоторый набор правил, определяющий отношения между различными файлами в нашей программе и командами для обновления каждого файла. Они записываются в специальный файл под названием «makefile». Команда «make» использует базу данных «makefile» и время последнего изменения файлов для принятия решения. все файлы должны быть перекомпилированы еще раз.

Содержимое Makefile

Обычно «makefiles» содержат 5 типов элементов, а именно: неявные правила, явные правила, определения переменных. , директивы и комментарии.

  1. явное правило определяет, как создавать/переделывать один или несколько файлов (называемых целевыми объектами, которые будут объяснены позже) и когда делать то же самое.
  2. Неявное правило определяет, как создать/переделать один или несколько файлов на основе их имен. Он описывает, как имя целевого файла связано с одним файлом с именем, похожим на имя цели.
  3. Определение переменной — это строка, в которой указывается строковое значение переменной, которая будет заменена позже.
  4. Директива — это инструкция для make сделать что-то особенное во время чтения make-файла.
  5. Символ '#' используется для обозначения начала комментария внутри makefiles . Строка, начинающаяся с «#», просто игнорируется.

Структура Make-файлов

Информация, которая сообщает make, как перекомпилировать систему, поступает из базы данных, называемой makefile. Простой makefile будет состоять из правил следующего синтаксиса:

target ... : prerequisites ... 
	recipe 
... 
...

Цель определяется как выходной файл, созданный программой. Это также могут быть фальшивые цели, о чем будет рассказано ниже. Примеры целевых файлов: исполняемые файлы, объектные файлы или фиктивные цели, такие как clean, установить, удалить и т. д.

Необходимое условие — это файл, который используется в качестве входных данных для создания целевых файлов.

Рецепт — это действие, которое make выполняет для создания целевого файла на основе предварительных условий. Необходимо помещать символ табуляции перед каждым рецептом внутри makefiles, если только мы не укажем переменную «.RECIPEPREFIX», чтобы определить какой-либо другой символ в качестве префикса. рецепту.

Пример Makefile

final: main.o end.o inter.o start.o
	gcc -o final main.o end.o inter.o start.o
main.o: main.c global.h
	gcc -c main.c
end.o: end.c local.h global.h
	gcc -c end.c
inter.o: inter.c global.h
	gcc -c inter.c
start.o: start.c global.h
	gcc -c start.c
clean:
	rm -f main.o end.o inter.o start.o

В приведенном выше примере мы использовали исходные файлы 4 C и два заголовочных файла для создания исполняемого финального. Здесь каждый файл «.o» является одновременно целью и обязательным условием внутри makefile. Теперь взгляните на последнее имя цели: чистое. Это просто действие, а не целевой файл.

Поскольку обычно во время компиляции это нам не требуется, ни в каких других правилах это не прописано как обязательное условие. Цели, которые не ссылаются на файлы, а являются просто действиями, называются фальшивыми целями. У них не будет никаких предварительных условий, как у других целевых файлов.

Как GNU Make обрабатывает Makefile

По умолчанию make начинается с первой цели в 'makefile' и называется ' цель по умолчанию'. В нашем примере в качестве первой цели у нас есть final. Поскольку его предварительные требования включают другие объектные файлы, их необходимо обновить перед созданием final. Каждая из этих предпосылок обрабатывается по своим правилам.

Перекомпиляция происходит, если в исходные файлы или файлы заголовков внесены изменения или если объектный файл вообще не существует. После перекомпиляции необходимых объектных файлов make решает, перелинковывать final или нет. Это необходимо сделать, если файл final не существует или какой-либо из объектных файлов новее его.

Таким образом, если мы изменим файл inter.c, то при запуске make он перекомпилирует исходный файл для обновления. объектный файл inter.o, а затем свяжите final.

Использование переменных внутри Makefiles

В нашем примере нам пришлось дважды перечислить все объектные файлы в правиле для final, как показано ниже.

final: main.o end.o inter.o start.o
	gcc -o final main.o end.o inter.o start.o

Чтобы избежать такого дублирования, мы можем ввести переменные для хранения списка объектных файлов, которые используются внутри makefile. Используя переменную OBJ, мы можем переписать образец makefile на аналогичный, показанный ниже.

OBJ = main.o end.o inter.o start.o
final: $(OBJ)
	gcc -o final $(OBJ)
main.o: main.c global.h
	gcc -c main.c
end.o: end.c local.h global.h
	gcc -c end.c
inter.o: inter.c global.h
	gcc -c inter.c
start.o: start.c global.h
	gcc -c start.c
clean:
	rm -f $(OBJ)

Правила очистки исходного каталога

Как мы видели в примере makefile, мы можем определить правила для очистки исходного каталога, удалив ненужные объектные файлы после компиляции. Предположим, у нас есть целевой файл с именем clean. Как можно сделать различие между двумя вышеуказанными ситуациями? Здесь возникает концепция фальшивых целей.

Фальшивая цель – это цель, которая на самом деле не является именем файла, а просто именем рецепта, который будет выполняться всякий раз, когда делается явный запрос из makefile<. Одной из основных причин использования фальшивой цели является избежание конфликта с файлом с таким же именем. Другая причина — улучшение производительности.

Чтобы объяснить эту вещь, я раскрою один неожиданный поворот. Рецепт clean не будет выполняться по умолчанию при запуске make. Вместо этого необходимо вызвать его, введя команду make clean.

.PHONY: clean
clean:
	rm -f $(OBJ)

Теперь попробуйте создать makefile для вашей собственной базы кода. Не стесняйтесь комментировать здесь свои сомнения.