🛠️ make и Makefile

Правила, цели, переменные, шаблоны, .PHONY и типовые Makefile для проектов.

Шпаргалки · Администрирование · #make #build #automation

Идея

make собирает цели по правилам из Makefile и пересобирает только то, что изменилось (по времени файлов). Часто используется как «пульт» проекта для команд: make test, make build.

Правило

цель: зависимости
	команда          # перед командой ТАБУЛЯЦИЯ, не пробелы
app: main.o util.o
	$(CC) -o app main.o util.o

main.o: main.c util.h
	$(CC) -c main.c

Переменные

CC     := gcc
CFLAGS ?= -Wall -O2
SRC    := $(wildcard src/*.c)
OBJ    := $(SRC:.c=.o)
NAME   = app

Присваивание: = (вычисляется при использовании), := (сразу), ?= (если не задана), += (дописать). Из командной строки: make CFLAGS=-g.

Автоматические переменные

Переменная Значение
$@ имя цели
$< первая зависимость
$^ все зависимости
$* основа имени в шаблоне

Шаблонные правила

%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

Фальшивые цели (.PHONY)

.PHONY: all clean test run help

all: app

clean:
	rm -rf build *.o app

test:
	pytest -q

run: app
	./app

.PHONY говорит make, что цель не файл: её нужно выполнять всегда.

Типовой Makefile для проекта

.DEFAULT_GOAL := help
.PHONY: install dev test lint build docker help

install: ## Установить зависимости
	npm ci

dev: ## Запустить в режиме разработки
	npm run dev

test: ## Прогнать тесты
	npm test

lint: ## Проверить стиль
	npm run lint

build: ## Собрать
	npm run build

docker: ## Собрать образ
	docker build -t app:latest .

help: ## Показать команды
	@grep -E '^[a-zA-Z_-]+:.*?## ' $(MAKEFILE_LIST) | awk -F':.*?## ' '{printf "%-12s %s\n", $$1, $$2}'

Приёмы

  • @ перед командой скрывает её вывод.
  • - перед командой игнорирует ошибку.
  • make -n показать, что будет выполнено; make -j4 параллельно; make -B пересобрать всё.
  • Условия: ifeq ($(OS),Windows_NT) ... endif.
  • Переменные окружения доступны как $(HOME); в shell-командах пишите $$VAR.
  • Включение файла: include config.mk.

Альтернативы

CMake, Ninja, Just (justfile), Task (Taskfile.yml), npm scripts.