Makefile — это текстовый файл, который содержит набор правил и команд для автоматизации процесса сборки программного продукта. Он используется для упрощения и автоматизации процесса компиляции, линковки и запуска программы, а также для управления зависимостями между файлами и компонентами проекта. В этой статье мы рассмотрим основные правила и команды, которые могут быть использованы при написании makefile.
Основной элемент makefile — это правило. Каждое правило состоит из цели, списка зависимостей и команды. Цель — это файл, который должен быть создан или обновлен при выполнении правила. Зависимости — это файлы, от которых зависит цель. Команда — это командная строка, которая будет выполнена при создании или обновлении цели.
Команда в правиле может быть представлена как с помощью встроенных команд оболочки, так и с помощью пользовательских команд. Примером встроенной команды может быть компиляция исходных файлов с помощью gcc, а примером пользовательской команды может быть копирование файлов или запуск тестов.
Основы написания makefile
Рассмотрим основные принципы и команды, которые можно использовать при написании makefile:
Цель (target): каждая команда в makefile должна иметь цель, которую она выполняет. Цель — это файл или действие, которое необходимо выполнить. Например, цель может быть сборка исполняемого файла или копирование файлов в определенную директорию.
Зависимости (dependencies): каждая цель может иметь зависимости — файлы или другие цели, от которых зависит данная цель. Если один из файлов, от которых зависит цель, изменялся после последней сборки, make запускает команды для обновления или создания этой цели.
Команды: каждая цель должна иметь соответствующие команды для ее выполнения. Команды выполняются в командной оболочке, по умолчанию — /bin/sh. Каждая команда должна начинаться с символа табуляции (не пробела).
Переменные: makefile позволяет использовать переменные для упрощения написания и поддержки кода. Переменные представляют собой именованные значения, которые могут быть использованы в командах, зависимостях, целях и т.д.
Правила: основные элементы makefile — это правила, которые описывают цели, зависимости и команды для сборки проекта. Правила состоят из строки цели, затем символа двоеточия (:), затем строки зависимостей и, наконец, строк команд.
Файлы по умолчанию: makefile может содержать файлы по умолчанию, которые будут собираться при вызове make без указания цели. Это удобно, когда в проекте есть несколько исполняемых файлов или библиотек, которые нужно собрать.
Это основные принципы и команды, которые следует знать при написании makefile. С их помощью можно удобно и эффективно управлять сборкой и обновлением проекта.
Правила и команды
Основные правила в makefile:
all: это основное правило, которое задает цели по умолчанию. Если не указано другое правило, то при выполнении команды make будет выполнено правило all.
clean: это правило используется для удаления временных файлов или файлов, созданных в процессе сборки.
install: это правило используется для установки скомпилированных файлов в систему или на другое устройство.
uninstall: это правило используется для удаления установленных файлов или программ из системы.
target: это правило описывает зависимости и команды для сборки конкретного файла или программы.
Основные команды в makefile:
mkdir: эта команда используется для создания новой директории.
cp: эта команда используется для копирования файлов или директорий.
rm: эта команда используется для удаления файлов или директорий.
gcc: эта команда используется для компиляции программ на языке C.
g++: эта команда используется для компиляции программ на языке C++.
javac: эта команда используется для компиляции программ на языке Java.
python: эта команда используется для выполнения программ на языке Python.
make: эта команда используется для выполнения makefile.
Правила и команды в makefile позволяют автоматизировать процесс сборки и управления проектом, делая его более удобным и эффективным.
Структура и формат файла
Цели и правила
Каждая строка в makefile обычно содержит одну цель и связанное с ней правило. Цель — это название файла или директории, которую нужно создать или обновить. Правило говорит make, как и при помощи каких файлов создать цель.
Обратные отступы и комментарии
В makefile используются обратные отступы, чтобы обозначить блоки кода, принадлежащие одному правилу. Обычно используются символы табуляции, хотя в некоторых реализациях makefile это может быть настраиваемое значение.
Комментарии начинаются с символа # и продолжаются до конца строки. Они используются, чтобы описать, что делает каждое правило или просто выделить важную информацию.
Формат правил
Стандартный формат правила выглядит так:
цель: зависимости
[таб] команда 1
[таб] команда 2
…
Цель представляет собой название файла или задачи. Зависимости — это файлы или другие цели, от которых зависит текущая цель. Команды представляют собой действия, которые нужно выполнить для создания цели.
Цели по умолчанию
В makefile можно указать цель, которая будет выполняться автоматически при вызове make без аргументов. Для этого используется переменная .DEFAULT_GOAL. Например, следующая строка установит target1 в качестве цели по умолчанию:
.DEFAULT_GOAL := target1
Зная структуру и формат файла makefile, вы сможете легко создавать и настраивать правила для сборки ваших проектов.
Параметры и переменные
Makefile предоставляет возможность использовать параметры и переменные для управления сборкой проекта.
В make-файле параметры и переменные определяются с помощью оператора присваивания. Значение переменной в make-файле может быть определено явно, или может быть взято из переменной окружения.
Параметры в makefile часто используются для передачи пользовательских настроек сборки. Например, можно задать параметр для выбора компилятора или флагов компиляции.
Переменные в make-файле используются для хранения значений, которые могут быть использованы в различных частях make-файла, например, в командах сборки или в условных конструкциях.
Ниже приведены примеры определения параметров и переменных в make-файле:
CXX = g++
— определение переменной CXX с значением «g++», которое будет использоваться в качестве компилятора по умолчанию.CXXFLAGS = -Wall -Wextra
— определение переменной CXXFLAGS с флагами компиляции, такими как «-Wall» и «-Wextra».DEBUG = 1
— определение переменной DEBUG с значением «1», которое может быть использовано для управления отладочной информацией.PREFIX ?= /usr/local
— определение переменной PREFIX с значением «/usr/local», которое будет использоваться по умолчанию, если переменная PREFIX не была определена в переменной окружения.CC := gcc
— определение переменной CC с значением «gcc», которое будет использоваться как компилятор в командах сборки. В данном случае значение переменной CC не может быть изменено.
В дальнейшем значения параметров и переменных можно использовать в командах сборки следующим образом:
$(CXX) $(CXXFLAGS) -c source.cpp -o object.o
Вышеуказанный пример демонстрирует использование переменных CXX и CXXFLAGS для компиляции исходного файла source.cpp в объектный файл object.o.
Используя параметры и переменные в make-файле, можно сделать сборку более гибкой и настраиваемой, а также упростить изменение параметров сборки без изменения самих команд.