Skip to content

Glossary

Page Maps

graph LR
  family["Reproducible Research"]
  program["Deep Dive Make"]
  section["Rule Semantics Precedence Edge Cases"]
  page["Glossary"]
  capstone["Capstone evidence"]

  family --> program --> section --> page
  page -.applies in.-> capstone
flowchart LR
  orient["Orient on the page map"] --> read["Read the main claim and examples"]
  read --> inspect["Inspect the related code, proof, or capstone surface"]
  inspect --> verify["Run or review the verification path"]
  verify --> apply["Apply the idea back to the module and capstone"]

Use this glossary when two explanations sound similar but imply different evidence. Terms are grouped by the boundary where they matter.

Evaluation timeline

flowchart LR
  startup["Invocation and environment"]
  parse["Parse makefiles"]
  remake["Remake stale makefiles"]
  restart["Restart parsing"]
  graph["Select rules and expand prerequisites"]
  recipe["Expand recipe"]
  shell["Run shell or child Make"]

  startup --> parse --> remake
  remake -->|makefile changed| restart --> parse
  remake -->|settled| graph --> recipe --> shell
Term Meaning Useful evidence
parse time When Make reads definitions, expands immediate constructs, and evaluates conditionals. $(info ...), controlled -n state comparison
makefile-remake boundary The point after parsing where Make checks makefiles as targets. --trace, makefile rule prerequisites
restart A fresh read from the top after one or more makefiles were remade. MAKE_RESTARTS
secondary expansion A second expansion of escaped prerequisite text in automatic-variable context after .SECONDEXPANSION. bounded gmake -np target entry
rule selection Make's choice among explicit, static pattern, and implicit candidates. --trace, --debug=implicit
recipe expansion Make's substitution of variables and automatic variables before handing commands to a shell. recipe echo or focused trace
recipe execution The shell or direct process work that updates a target. process log, exit status, output state
recursive Make boundary A recipe invocation of $(MAKE) that creates a child Make process. MAKELEVEL, child origin, MAKEFLAGS

Diagnostic modes

Term Exact meaning
dry-run mode (-n) Print most recipes without running them; parsing still occurs, and recursive Make recipe lines receive special treatment.
query mode (-q) Run no ordinary recipes and report freshness through status: 0 current, 1 work needed, 2 error.
touch mode (-t) Mark applicable targets current instead of running ordinary recipes; it is a mutation, not a diagnostic transcript.
database print (-p) Print Make's evaluated database; combine with other flags deliberately because requested goals and parsing still matter.
trace Focused explanation of why Make updates targets and which rule location it chose.
parse effect External observation or mutation caused by constructs such as $(shell ...), $(file ...), or != while parsing.

-n means "do not execute ordinary recipes," not "evaluate nothing":

flowchart TD
  invoke["gmake -n target"]
  parse["Parse functions still evaluate"]
  graph["Graph and makefile remakes still matter"]
  ordinary["Ordinary recipe is printed"]
  recursive["Recursive Make line may execute"]

  invoke --> parse --> graph
  graph --> ordinary
  graph --> recursive

Variable provenance

Term Meaning
origin The winning source reported by $(origin NAME), such as file, environment, command line, or override.
precedence The rule deciding which origin wins when several sources define one name.
flavor Storage behavior reported by $(flavor NAME): simple, recursive, or undefined.
raw value Stored, unexpanded text returned by $(value NAME).
expanded value Text after Make resolves the stored expression in the current context.
simple variable A := definition whose right side is evaluated immediately.
recursive variable An = definition whose right side is retained for later expansion. "Recursive" here describes expansion, not child Make.
command-line definition A name supplied with the Make invocation; normally forwarded to child Make with command-line origin.
override directive A makefile definition that outranks command-line definitions. It is an enforcement mechanism, not a stronger default.
environment override The origin reported when -e promotes an environment definition above an ordinary file definition.
target-specific variable A value installed for one target context and normally inherited by prerequisites built in that context.
private A modifier preventing a target-specific value from propagating to prerequisites.
export Transmission of a Make variable into recipe process environments.
unexport Explicit removal of a variable from that process-environment channel.
recursive forwarding GNU Make's propagation of command-line definitions to child Make through MAKEOVERRIDES and MAKEFLAGS.
MAKELEVEL Recursion depth: parent starts at 0, and a child observes a larger value.
flowchart LR
  definition["Parent MODE definition"]
  export["Export channel"]
  override["Recursive command-line channel"]
  environment["Child origin: environment"]
  command["Child origin: command line"]

  definition --> export --> environment
  definition --> override --> command

Capability decisions

Term Meaning
capability A behavior the build requires, stated without using platform identity as a proxy.
discovery Observation of whether the environment provides a capability.
caller policy The user's explicit choice, commonly auto, enabled, or disabled.
implementation decision The concrete tool or rule path selected after combining discovery and policy.
capability gate The conditional that enforces that decision and rejects unsupported combinations.
feature token A capability advertised directly in $(.FEATURES), such as grouped-target support.
probe seam A narrow input that lets tests force available and unavailable discovery outcomes.
equivalence contract Evidence that native and fallback paths satisfy the same output and failure promises.
fail closed Reject a required unavailable capability instead of silently weakening behavior.

Included makefiles and identity

Term Meaning
required include include file, which treats unresolved absence as an incomplete build definition.
optional include -include file or sinclude file, whose absence has explicitly defined behavior.
generated include A makefile produced by a rule and then parsed as build definition.
convergence Repeating the same settled invocation produces no further justified work or semantic change.
compare-before-replace Publish a generated file only if candidate content differs, preserving identity when meaning is unchanged.
MAKE_RESTARTS Count of makefile-remake restarts within the current Make process; undefined before any restart.
MAKEFILE_LIST Ordered names of makefiles read so far, appended immediately before each is parsed.
include search Resolution of include names through the current directory and configured -I directories.
prerequisite search Resolution through VPATH or selective vpath; distinct from include search.
include order Definition order that participates in file-origin precedence and rule visibility.

Rule ownership and publication

Term Meaning
explicit rule A rule naming a concrete target path.
implicit pattern rule A generally eligible % rule considered during implicit search.
static pattern rule A pattern transformation restricted to an explicit target set.
overlapping rule space Several candidates can claim one target path, making selection policy nonlocal.
automatic variable Context supplied for a selected rule, such as $@, $<, $^, or $*.
grouped targets The GNU Make &: form declaring that one recipe invocation updates every named member.
independent multi-target rule A rule with several targets under : whose targets can represent independent update events.
publication event The transition after which a complete validated artifact or coordinated set becomes visible.
stamp A file representing successful completion of an event; it does not automatically restore a deleted side output.
candidate publication Write a process-local complete candidate, validate it, then rename it to the final path.
flowchart LR
  inputs["Declared inputs"]
  owner["One recipe owner"]
  candidate["Complete validated candidates"]
  publish["Atomic publication"]
  group["Coherent output group"]

  inputs --> owner --> candidate --> publish --> group

Special targets

Term Narrow guarantee
.PHONY Names orchestration targets that are always considered; it must not erase real file identity.
.DELETE_ON_ERROR Removes a changed declared target after recipe failure unless .PRECIOUS protects it.
.PRECIOUS Preserves named targets across interruption and failure.
.SECONDARY Retains selected intermediate files. It is unrelated to .SECONDEXPANSION.
.SECONDEXPANSION Enables the second prerequisite-expansion boundary; it is unrelated to file retention.
.NOTPARALLEL Serializes its defined scope; it does not establish missing content edges.
.WAIT Places a scheduling barrier in a prerequisite list on supported Make versions.
.ONESHELL Runs all lines of each recipe in one shell, changing state sharing and failure observation.

Confusable pairs

Do not conflate Distinction
recursive variable / recursive Make delayed variable expansion / child Make process
export / command-line forwarding child environment origin / child command-line origin
include search / VPATH makefile lookup / prerequisite lookup
restart / rebuild reparse after makefile remake / target update based on freshness
.SECONDARY / .SECONDEXPANSION file retention / prerequisite evaluation
grouped target / stamp native member-aware ownership / event marker with explicit recovery limits
successful recipe / valid publication zero exit status / complete outputs satisfying the contract
serialization / dependency scheduling restriction / semantic input edge

Incident language

Prefer explanations that identify a boundary and its evidence:

  • "The dry run mutated state during parsing through $(shell ...)."
  • "The child saw MODE with command-line origin through recursive forwarding."
  • "The generated include was remade once, so parsing restarted with MAKE_RESTARTS=1."
  • "The prerequisite expression needed target context and was consumed before secondary expansion."
  • "Two implicit candidates gave one target path order-dependent ownership."
  • "The stamp remained current after a group member was deleted, so the compatibility design lacked missing-member recovery."

These statements can be tested. "Make got confused" cannot.