🛠️ 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.