GNU Make - это утилита разработки, которая определяет части конкретной базы кода, которые необходимо перекомпилировать, и может выдавать команды для выполнения этих операций с базой кода. Этот конкретный делать Утилита может использоваться с любым языком программирования при условии, что их компиляция может выполняться из оболочки путем ввода команд.
Чтобы использовать GNU Make, нам нужен некий набор правил, который определяет отношения между различными файлами в нашей программе и команды для обновления каждого файла. Они записываются в специальный файл под названием ‘makefile‘. ‘делать‘Команда использует‘makefileБаза данных и время последней модификации файлов, чтобы решить, какие файлы нужно перекомпилировать заново.
Обычно 'make-файлы‘Содержат 5 видов вещей, а именно: неявные правила, явные правила, определения переменных, директивы, и Комментарии.
Информация, которая говорит делать как перекомпилировать систему, зависит от чтения базы данных, называемой makefile. Простой makefile будет состоять из правил следующего синтаксиса:
цель...: предпосылки... рецепт блюда... ...
А цель определяется как выходной файл, созданный программой. Это также может быть фальшивые цели, что будет объяснено ниже. Примеры целевых файлов включают исполняемые файлы, объектные файлы или фальшивые цели как чистый, установить, удалить и т.п.
А предпосылка - это файл, который используется в качестве входных данных для создания целевых файлов.
А рецепт блюда это действие, которое делать выполняет для создания целевого файла на основе предварительных требований. Перед каждым рецептом внутри поля необходимо ставить табуляцию. make-файлы если мы не укажем ".RECIPEPREFIX‘Переменная, чтобы определить какой-либо другой символ в качестве префикса рецепта.
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. чистый: rm -f main.o end.o inter.o start.o
В приведенном выше примере мы использовали 4 С исходные файлы и два файла заголовков для создания исполняемого файла окончательный. Здесь каждый ".o’Является одновременно целью и необходимым условием внутри makefile. Теперь посмотрим на последнее имя цели. чистый. Это просто действие, а не целевой файл.
Поскольку обычно во время компиляции это не требуется, это не является обязательным требованием в каких-либо других правилах. Цели, которые не относятся к файлам, а являются просто действиями, называются фальшивые цели. У них не будет никаких предварительных требований, как у других целевых файлов.
По умолчанию делать начинается с первой цели в "makefile‘И называется‘цель по умолчанию’. Рассматривая наш пример, мы имеем окончательный в качестве нашей первой цели. Поскольку его предварительные требования включают другие объектные файлы, которые необходимо обновить перед созданием окончательный. Каждая из этих предпосылок обрабатывается в соответствии со своими правилами.
Перекомпиляция происходит, если в исходные файлы или файлы заголовков или если объектный файл вообще не существует. После перекомпиляции необходимых объектных файлов, делать решает, подключать ли заново окончательныйили нет. Это необходимо сделать, если файл окончательный не существует, или если какой-либо из объектных файлов новее, чем он.
Таким образом, если мы изменим файл inter.c, затем по бегу делать он перекомпилирует исходный файл для обновления объектного файла inter.o а затем ссылку окончательный.
В нашем примере нам нужно было перечислить все объектные файлы дважды в правиле для окончательный как показано ниже.
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. чистый: rm -f $ (OBJ)
Как мы видели в примере makefile, мы можем определить правила для убирать исходный каталог, удалив ненужные объектные файлы после компиляции. Предположим, у нас есть целевой файл с именем чистый. Как может делать различать две вышеупомянутые ситуации? А вот и концепция фальшивые цели.
А фальшивая цель - это имя, которое на самом деле не является именем файла, скорее это просто имя рецепта, который будет выполняться всякий раз, когда делается явный запрос из makefile. Одна из основных причин использовать фальшивая цель состоит в том, чтобы избежать конфликта с одноименным файлом. Другая причина - повысить производительность.
Чтобы объяснить это, я открою один неожиданный поворот. Рецепт чистый не будет выполняться по умолчанию при запуске делать. Вместо этого необходимо вызвать то же самое, введя команду очистить.
.PHONY: чистый. чистый: rm -f $ (OBJ)
Теперь попробуйте создать make-файлы для вашей собственной кодовой базы. Не стесняйтесь комментировать здесь свои сомнения.