5.3.6 · HinglishBuild Systems & Toolchain

Makefiles — targets, prerequisites, recipes, variables, automatic variables

1,857 words8 min readRead in English

5.3.6 · Coding › Build Systems & Toolchain


Make kyun exist karta hai?

Make asliye ek file ka graph (DAG — Directed Acyclic Graph) ke baare mein sochta hai. Har node ek file hai; ek edge ka matlab hai "yeh file uss file se build hoti hai."


Ek rule ki anatomy

Make kaise decide karta hai recipe run karne ka

Yeh recursive hai: check karne se pehle, Make pehle ensure karta hai ki har khud up-to-date hai (prerequisites pehle build karo). Yeh dependency DAG ka post-order traversal hai.

Figure — Makefiles — targets, prerequisites, recipes, variables, automatic variables

Variables — build rules ke liye DRY

Variables ko $(VAR) ya ${VAR} se use karo. Single character ke liye parens ki zaroorat nahi: $@.


Automatic variables — secret weapon


Ek complete, real Makefile


Forecast-then-Verify


Flashcards

Make rule ke teen parts kya hain?
Target, prerequisites, aur recipe.
Recipe line TAB se kyun shuru honi chahiye?
Make literal TAB ko separator ke roop mein use karta hai jo line ko recipe mark karta hai; spaces se "missing separator" error aata hai.
Target T ke liye Make ka rebuild condition
Rebuild karo agar T exist nahi karta YA koi bhi prerequisite T se newer hai (t(P_i) > t(T)).
= aur := mein antar
= recursive/lazy hai (har use par expand hota hai); := simple/eager hai (definition par ek baar expand hota hai).
$@ ka kya matlab hai?
Current rule ka target naam.
$< ka kya matlab hai?
Pehla prerequisite.
$^ ka kya matlab hai?
Saare prerequisites, space-separated, duplicates removed.
$? ka kya matlab hai?
Sirf woh prerequisites jo target se newer hain (stale wale).
$* ka kya matlab hai?
Woh stem jo pattern rule mein % se match hua.
.PHONY kya karta hai?
Target ko real file nahi declare karta, isliye uski recipe hamesha run hoti hai chahe us naam ki file exist kare.
$(SRCS:.c=.o) kya produce karta hai?
Ek substitution reference jo SRCS ke har word mein .c suffix ko .o se replace karta hai.
app: main.o utils.o mein, recipe $(CC) $^ -o $@, kya link hoga?
main.o aur utils.o ko app mein link karta hai; $^=saari objects, $@=app.
Make dependency DAG par kaunsa traversal order use karta hai?
Post-order — target se pehle prerequisites build karo.
?= kyun use karo?
Variable ko sirf tab assign karo agar already defined nahi hai (overridable defaults ke liye acha hai).

Recall Feynman: ek 12-saal ke bachche ko explain karo

Socho tumhare paas ek sandwich-banane wala robot hai. Tum use batate ho: "Sandwich banane ke liye, pehle bread aur filling chahiye." Robot ek smart tarike se aalsi hai: agar sandwich already bani hai aur tab se kisi ne bread ya filling nahi chhuyi, toh woh doosri banane mein time waste nahi karega. Lekin agar tumne fresh bread kharidi (sandwich se newer!), toh woh jaanta hai purani sandwich out of date hai aur nayi banata hai. Target sandwich hai, prerequisites bread aur filling hain, aur recipe hai "filling ko bread ke beech rakh do." Chhote symbols jaise $@ sirf shortcuts hain taaki robot keh sake "jo cheez main bana raha hun" bina uska naam dobara likhe.


Connections

  • Compilation Pipeline — Make preprocess→compile→assemble→link stages orchestrate karta hai.
  • Linkers and Object Files — kyun $^ (saari .o) linker ko feed hoti hai.
  • Directed Acyclic Graphs (DAG) — Make ka dependency model ek DAG hai jo post-order traverse hota hai.
  • CMake and Build Generators — higher-level tools jo Makefiles generate karte hain.
  • Incremental Compilation — woh timestamp principle jo Make ko fast banata hai.
  • Shell Scripting Basics — recipes sirf shell commands hain.

Concept Map

reasons about

defined by

has

has

has

must start with

triggers

rebuild if prereq newer

requires

walks

kept DRY by

differ by

uses

Make build tool

File dependency DAG

Rule

Target

Prerequisites

Recipe

Recipe needs literal TAB

Rebuild decision

Post-order traversal

Variables

= vs := vs ?= vs +=

Automatic variables