Найти в Дзене

Makefile linux

Makefile — это специальный файл с инструкциями для утилиты make, которая автоматизирует сборку программ и выполнение задач в Linux. Утилита make: цель: реквизит1 реквизит2 ...
команда1
команда2
...
<пустая строка> Важные правила: all: hello
hello: main.c
gcc -o hello main.c
clean:
rm -f hello Объяснение: Чтобы make не путал такие цели с файлами, их можно пометить как «фиктивные»: .PHONY: all clean install make знает стандартные шаблоны для компиляции: Пример упрощённого Makefile (без явных команд): hello: main.o
gcc -o hello main.o
main.o: main.c Здесь make автоматически вызовет gcc -c main.c для создания main.o. Переменные упрощают поддержку: CC = gcc
CFLAGS = -Wall -O2
TARGET = hello
$(TARGET): main.c
$(CC) $(CFLAGS) -o $(TARGET) main.c Ключевые переменные:
Оглавление

Makefile в Linux: основы работы

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

Как работает make

Утилита make:

  • анализирует зависимости между файлами проекта;
  • определяет, какие части программы нужно перекомпилировать;
  • запускает необходимые команды для сборки.

Базовый синтаксис Makefile

цель: реквизит1 реквизит2 ...
команда1
команда2
...

<пустая строка>

Важные правила:

  • Отступы делаются табуляцией (не пробелами!).
  • После каждой цели должна идти пустая строка.
  • Команды выполняются, если пререквизиты изменились или целевой файл отсутствует.

Пример простого Makefile

all: hello

hello: main.c
gcc -o hello main.c

clean:
rm -f hello

Объяснение:

  • all — целевая задача по умолчанию (запускается первой).
  • hello — цель, зависящая от файла main.c.
  • Команда gcc -o hello main.c компилирует код.
  • clean — цель для удаления собранного файла.

Распространённые цели (конвенция)

  • all — собрать весь проект.
  • clean — удалить сгенерированные файлы.
  • install — установить файлы в систему.
  • release или dist — подготовить дистрибутив.

Чтобы make не путал такие цели с файлами, их можно пометить как «фиктивные»:

.PHONY: all clean install

Запуск make

  1. Базовая команда (выполняет первую цель в Makefile):make
  2. Запуск конкретной цели:make цель
    Например: make clean.
  3. Использование другого файла (если Makefile назван иначе):make -f имя_файла

Полезные опции make

  • -f <файл> — указать имя Makefile.
  • -jN — запустить N параллельных задач (ускоряет сборку).
  • -k — продолжать выполнение после ошибки.
  • -n — показать команды без выполнения (режим «сухого прогона»).
  • -s — тихий режим (не выводить команды).
  • --version — показать версию утилиты.

Встроенные правила

make знает стандартные шаблоны для компиляции:

  • .c → .o (компиляция C-кода).
  • .cpp → .o (компиляция C++).

Пример упрощённого Makefile (без явных команд):

hello: main.o
gcc -o hello main.o

main.o: main.c

Здесь make автоматически вызовет gcc -c main.c для создания main.o.

Переменные в Makefile

Переменные упрощают поддержку:

CC = gcc
CFLAGS = -Wall -O2
TARGET = hello

$(TARGET): main.c
$(CC) $(CFLAGS) -o $(TARGET) main.c

Ключевые переменные:

  • CC — компилятор.
  • CFLAGS — флаги компилятора.
  • LDLIBS — подключаемые библиотеки.
  • RM — команда удаления (безопаснее, чем rm).

Советы

  1. Называйте файл Makefile (с заглавной буквы) — он будет виден в начале списка файлов.
  2. Используйте .PHONY для целей вроде clean, чтобы избежать конфликтов с файлами.
  3. Для сложных проектов применяйте шаблонные правила и переменные.
  4. Проверяйте синтаксис табуляции — ошибки отступов часты и критичны.