مرجع سريع

ورقة غش Makefile و GNU Make

دليل مرجعي شامل لأداة GNU Make: أنواع إسناد المتغيرات، المتغيرات التلقائية السحرية، بادئات الأوامر، قواعد الأنماط، والشروط.

· تاريخ النشر

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

المراجع

موضوعات ذات صلة