User manuals
The official GNU Make manualManaging Projects with GNU Make
Debugging makefile
GNU Make DebuggerBasic makefile syntax
target1 target2 ... : prerequisite1 prerequisite2 ... command1 command2 ...It's important to put a TAB in front of every command.
Note that the above multi-target syntax is equivalent to:
target1: prerequisite1 prerequisite2 ... command1 command2 ... target2: prerequisite1 prerequisite2 ... command1 command2 ...
Regular variables
To get the value of variable VAR:$(VAR)(If VAR is a single letter, one can remove the parentheses.)
To assign or define a variable VAR:
Assignment operator | Meaning |
---|---|
VAR = right-hand-side | Recursively expand: The variable is evaluated every time VAR is referred and is evaluated only when VAR is referred. |
VAR := right-hand-side | Simply expand: The variable is evaluated immediately on reading the line VAR := .. It is evaluated only once. |
VAR ?= right-hand-side | Conditional: VAR is assigned only if it is undefined.
Note that this is the same as: ifeq ($(origin VAR), undefined) VAR = right-hand-side endif |
VAR += right-hand-side | Appending |
undefine VAR | Undefining |
A more flexible way of defining a variable is the define/endef directives. It has the following form:
define VAR command1 command2 ... ... endefFor example, the following two are equivalent:
define two-lines echo foo echo $(bar) endefand
two-lines = echo foo ; echo $(bar)
To pass down the value of variable VAR when invoking make recursively:
export VARor
export VAR = right-hand-side
Advanced variable manipulations
To substitute certain part of the value of variable VAR, one can do, for example:foo := a.o b.o c.o bar := $(foo:.o=.c)or better yet,
bar := $(foo:%.o=%.c)and bar's value would be a.c b.c c.c
Target/Pattern-specific variable assignments
prog: CFLAGS=-g prog: prog.o foo.o bar.owill set CFLAGS to -g when building prog and all of its prerequisites (prog.o, foo.o, and bar.o)
Similarly,
%.o: CFLAGS=-Owill assign CFLAGS to -O for all targets matching the pattern %.o
Where do variables come from ?
- Defined in the makefile, as above.
- Command line. For example: make CFLAGS=-g CPPFLAGS='-DDEBUG -DLINUX'
- Internal database. To see them, execute make -p
- Environmental variables. One can also see them by executing make -p
Special variables
Variable | Meaning |
---|---|
$@ | The targets |
$* | The root of targets (i.e. without extension) |
$< | The first prerequisite |
$^ | All prerequisites. |
$+ | Like $^, but includes duplicates. |
$? | All prerequisites that are newer than the target.
This is useful when building archive libraries, e.g. libfoo.a: bar.o baz.o $(AR) $(ARFLAGS) $@ $? $(RANLIB) $@Some useful suffix rules for managing archive libraries are here. |
$% | File name of the
archive member (libxxx.a) of the target, e.g.
libfoo.a(bar.o): bar.o $(AR) $(ARFLAGS) $@ $?Then $% would be the bar.o inside the parentheses, and $@ would be libfoo.a. |
All of above variables have two variants by appending D or F. For example:
$(@D) | The directory part of targets It's defined as $(patsubst %/,%,$(dir $@)) |
$(@F) | The file name part of targets It's defined as $(notdir $@) |
Commonly-defined/Implicit variables in Make
One can also see them by executing make -p
Variable | Meaning |
---|---|
AR | Archive-maintaining program |
ARFLAGS | Flags passed to the archiver |
AS | Assembler |
CC | C compiler |
CFLAGS | Flags passed to the C compiler |
COMPILE.c | Defined as $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c |
COMPILE.cpp COMPILE.cc COMPILE.C | Defined as $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c |
COMPILE.f COMPILE.F | Defined as $(FC) $(FFLAGS) $(TARGET_ARCH) -c |
CPP | The command to run the C preprocessor. |
CPPFLAGS | Flags passed to the C preprocessor (which in fact will be passed to C/C++ compiler as well) |
CURDIR | Current working directory |
CXX | C++ compiler |
CXXFLAGS | Flags passed to the C++ compiler |
FC F77 | Fortran 77 compiler |
FFLAGS F77FLAGS | Flags passed to the Fortran 77 compiler |
.INCLUDE_DIRS | List of directories that make searches for included makefiles |
LD | Link editor |
.LIBPATTERNS | Naming of the libraries make searches for, and their order. This
is used in the following situation, for example:
foo: foo.c -lbar $(CC) $^ -o $@Then make would execute cc foo.c libbar.so -o fooif foo.c or libbar.so are newer than foo. (By default, .LIBPATTERNS is defined as lib%.so lib%.a) Make searchs for libbar.so first in the current working directory, then vpath, then VPATH, and finally, /lib and /usr/lib
|
LINK.c | Defined as $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) |
LINK.cpp LINK.cc LINK.C | Defined as $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) |
MAKECMDGOALS | The targets given to make on the command-line |
MAKEFLAGS | Command-line options passed to invoke this make |
MAKEFILES | Makefiles to be read on every invocation of make |
MAKEFILE_LIST | List of makefiles parsed so far, in the order in which it is parsed |
MAKELEVEL | The number of levels of recursion. |
MAKE_VERSION | Version of GNU make. |
OUTPUT_OPTION | Defined as -o $@ |
RM | The command to delete files. |
SHELL | Current shell |
.VARIABLES | List of all global variables defined so far |
VPATH | Directory search path for files not found in the current working directory |
Special targets
.PHONY | When it is time to consider such a target, make will run its commands
unconditionally, regardless of whether a file with that name exists
or what its last modification.
Common/standard phony targets are, for example: .PHONY: all install clean clobber |
.DEFAULT_GOAL | If make is invoked without specifying a specific target, then by default
make will just achieve the first target in the makefile and stops. This variable can override it. |
.EXPORT_ALL_VARIABLES | Export all variables when invoking make recursively |
.INTERMEDIATE | Prerequisites of this special targets are treated as intermediate files an will be deleted when make finishes. |
.DELETE_ON_ERROR | Always delete the targets if there is any error during make. |
.PRECIOUS | Never delete the targets even if there is an error during make. |
.SILENT | Do not echo the commands before executing them. Also see the "Commands" section below. |
.IGNORE | Ignore the error if the commands fail. Also see the "Commands" section below. |
.ONESHELL | Execute all commands in a single subshell. This is useful if the commands use shell built-in commands such as cd, pushd, popd, etc. |
Where to find prerequisites ?
If the prerequisites are not in the current working directory, one can specify paths to search for prerequisites:- Special make variable VPATH. For example:
VPATH = ../headers:../src
- vpath directive. For example:
vpath %.c src/:src2/ vpath %.h include/
Commands
Each command is executed in a separate subshell. This can cause issues if the command is actually a shell built-in command, such as cd, pushd, popd, etc. To fix this issue, either use the special target .ONESHELL, or put all relevant commands in one line:foo: bar/lose cd $(@D) && gobble $(@F) > ../$@
The default shell is /bin/sh. To override it, set the special variable SHELL.
Some special characters ("command modifiers"), when they appear in front of a command, can have different effects:
Command modifiers | Effect |
@ | Do not echo the command. Also see the special target .SILENT |
+ | Echo the command, but do not execute. |
- | Ignore the error if the command fails. Also see the special target .IGNORE |
Pattern rules/Suffix rules
A pattern rule contains the character % in the target. It behaves similar to the wildcard character * in UNIX shells.Suffix rules are the old-fashioned (and obsolete) way of defining implicit rules for make.
For example:
Pattern rule | Suffix rule |
---|---|
%.o: %.c $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ |
.c.o: $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ |
(%.o): %.c $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ $(AR) $(ARFLAGS) $@ $*.o $(RM) $*.o |
.c.a: $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ $(AR) $(ARFLAGS) $@ $*.o $(RM) $*.o |
%: %.c $(CC) $(CFLAGS) $(CPPFLAGS) $< -o $@ |
.c: $(CC) $(CFLAGS) $(CPPFLAGS) $< -o $@ |
%.tab.c %.tab.h: %.y bison -d $< |
(No equivalent) |
Implicit rules and variables
Make's internal database already contains many pattern rules, and they are called implicit rules because one can use them without defining them in a makefile. To see them, execute make -p.For example, if one has a file foo.c in the current working directory, then executing
make foowill execute the following command
cc foo.c -o fooeven if there is no makefile in the current working directory. This is because there is a pattern rule in make's default database:
%: %.c $(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@
Control flows
makefile can have conditionals as below:if-conditional command1 command2 ... else more commands ... endifwhere if-conditional can be:
ifdef VAR ifndef VAR ifeq (arg1, arg2) ifneq (arg1, arg2)
Automatic dependency rule generation
With gcc's -M and -MM command-line options, one can create dependency rule automatically. However, to incorporate them into a makefile requires some efforts. See here for details.Functions
make has many built-in functions. A function call syntax is$(function arg1,arg2,..)Note that there must NOT be any extraneous spaces around the commas, or between the last argument and ).
Arguments can be texts (space-separated words) or variables.
Functions | Effect |
---|---|
$(filter patterns,text)
$(filter-out patterns,text) |
Return words in text which match/don't match
patterns (each of which can contain
%'s). For example: $(filter foo% %bar,$(word)) |
$(findstring hay,stack) | Return hay if it appears in stack, or nothing otherwise. |
$(strip string) | Remove leading and trailing spaces of string. |
$(subst from,to,text)
$(patsubst fromPat,toPat,text) |
Replace from by to
in text.
For patsubst, the fromPat and toPat are patterns which may contain at most one % (the rest %'s would be ignored). For example $(patsubst %.c,%.o,x.c.c bar.c)generates x.o.c bar.o |
$(sort list) | Sort the words of list. |
$(words list) | Get the number of words in list. |
$(word n,list) $(wordlist s,e,list) $(firstword list) $(lastword list) |
Return the nth word of list,
n starts from 1.
For wordlist, return words from the sth position to the eth position. firstword and lastword return the first and last word, respectively. |
$(dir list)
$(notdir list) |
Each word in list is treated as a file name, and dir will extract the directory part of the word, while notdir will remove the directory part. |
$(suffix list) $(basename list) $(realpath list) $(abspath list) |
Extract the extension of a file name. If no extension,
return an empty string. basename extracts all but the extension of a file name. realpath returns the canonical absolute name. abspath is like realpath, but it does not resolve symbolic links. |
$(addsuffix suffix,list) $(addprefix prefix,list) |
Append suffix or prepend prefix to each file name in list. |
$(join list1,list2) |
Concatenate the two lists word by word. For example, $(join a b,.c .o)produces a.c b.o |
$(wildcard pattern) | Get a list of file names matching pattern, which can contain UNIX shell wildcards such as * or ? |
$(shell command) | Execute the command in a subshell and return the results. |
$(info text) $(warning text) $(error text) |
Display text. For error, make will also terminate. |