GNU Make هي أداة أتمتة بناء تنشئ البرامج القابلة للتنفيذ والمكتبات تلقائياً من الشيفرة المصدرية عبر قراءة ملفات تُسمى Makefiles.
إسناد المتغيرات
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+)
المتغيرات التلقائية السحرية
داخل تنفيذ الوصفة (Recipe)، يكشف Make عن متغيرات تلقائية للإشارة إلى الهدف والمتطلبات المسبقة:
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")
بادئات أوامر الوصفة
| البادئة | السلوك |
|---|---|
@ |
عدم طباعة الأمر إلى المخرجات القياسية قبل التنفيذ |
- |
تجاهل رموز الخروج غير الصفرية (متابعة البناء عند الخطأ) |
+ |
تنفيذ الأمر حتى عند تشغيل Make بالخيار -n (تشغيل تجريبي) |
build:
@echo "Compiling binary..."
-rm -rf temp/
gcc -o main main.c
الدوال ومطابقة الملفات
أحرف البدل والصدفة (Wildcards & Shell)
js_files := $(wildcard src/*.js)
all_files := $(shell find images/ -type f)
استبدال النصوص والتصفية
# 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))
الشروط
ifeq ($(CC),gcc)
CFLAGS += -Wall -O2
else ifeq ($(CC),clang)
CFLAGS += -Weverything
else
CFLAGS += -O0
endif
خيارات سطر الأوامر
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