GNU Make este un instrument de automatizare a compilării care construiește executabile și biblioteci din codul sursă citind fișiere Makefile.
Atribuiri de variabile
foo = "bar" # Lazy (dynamically expanded when used)
bar = $(foo) foo # Dynamically references $(foo)
foo := "boo" # Immediate (simply expanded once at declaration)
foo ?= /usr/local # Conditional (assign only if foo is not already set)
bar += world # Append to existing value
foo != echo hello # Shell execution (GNU Make 4.0+)
Variabile automate
În timpul execuției rețetelor, Make expune variabile automate pentru ținte și dependențe:
out.o: src.c src.h
$@ # "out.o" (the target name)
$< # "src.c" (first prerequisite)
$^ # "src.c src.h" (all prerequisites with duplicates omitted)
$+ # "src.c src.h" (all prerequisites preserving duplicates)
$? # Prerequisites newer than the target
$| # Order-only prerequisites
%.o: %.c
$* # The matched pattern stem ("foo" in "foo.c")
$(@D) # Directory part of the target ("build" in "build/out.o")
$(@F) # File part of the target ("out.o" in "build/out.o")
Prefixe de comenzi în rețetă
| Prefix | Comportament |
|---|---|
@ |
Nu afișa comanda pe stdout înainte de execuție |
- |
Ignoră codurile de ieșire nenule (continuă la eroare) |
+ |
Execută comanda chiar și când Make rulează cu -n (dry-run) |
build:
@echo "Compiling binary..."
-rm -rf temp/
gcc -o main main.c
Funcții și potrivirea fișierelor
Caractere wildcard și Shell
js_files := $(wildcard src/*.js)
all_files := $(shell find images/ -type f)
Înlocuirea șirurilor și filtrare
# Extension substitution
objects = $(sources:.cpp=.o)
# Pattern substitution
outputs = $(patsubst src/%.c, build/%.o, $(wildcard src/*.c))
# Filter and filter-out
c_files = $(filter %.c, $(files))
non_c = $(filter-out %.c, $(files))
# Whitespace stripping
clean_var = $(strip $(dirty_var))
Condiționale
ifeq ($(CC),gcc)
CFLAGS += -Wall -O2
else ifeq ($(CC),clang)
CFLAGS += -Weverything
else
CFLAGS += -O0
endif
Opțiuni în linia de comandă
make -j 8 # Run parallel jobs (8 concurrent threads)
make -B, --always-make # Unconditionally build all targets
make -n, --dry-run # Print commands without executing
make -s, --silent # Do not print recipe commands
make -e # Environment variables override Makefile variables