Dum Ka Biryani, Make for each other
Version 1.0 February 2011 GNU Free Documentation License Shakthi Kannan [email protected] http://www.shakthimaan.com
() Dum Ka Biryani, Make for each other 1 / 1 Dum Ka Biryani
() Dum Ka Biryani, Make for each other 2 / 1 2.1 What a Rule Looks Like
Makefile target : prerequisites ... recipe ......
Tab before recipe!
() Dum Ka Biryani, Make for each other 3 / 1 2.2 A Simple Makefile
Makefile biryani : masala.o rice.o onion.o curd.o coriander.o meat.o cc -o biryani masala.o rice.o onion.o curd.o coriander.o meat.o
masala.o : masala.c masala.h defs.h cc -c masala.c
rice.o : rice.c rice.h defs.h cc -c rice.c
onion.o : onion.c defs.h cc -c onion.c
curd.o : curd.c defs.h cc -c curd.c
coriander.o : coriander.c defs.h cc -c coriander.c
meat.o : meat.c defs.h cc -c meat.c
clean: rm biryani \ masala.o rice.o onion.o curd.o coriander.o meat.o
() Dum Ka Biryani, Make for each other 4 / 1 2.4 Variables Make Makefiles Simpler
Makefile objects = masala.o rice.o onion.o curd.o coriander.o meat.o
biryani : $(objects) cc -o biryani $(objects)
masala.o : masala.c masala.h defs.h cc -c masala.c
rice.o : rice.c rice.h defs.h cc -c rice.c
onion.o : onion.c defs.h cc -c onion.c
curd.o : curd.c defs.h cc -c curd.c
coriander.o : coriander.c defs.h cc -c coriander.c
meat.o : meat.c defs.h cc -c meat.c
clean: rm biryani $(objects)
() Dum Ka Biryani, Make for each other 5 / 1 2.5 Letting make Deduce the Recipes
Makefile objects = masala.o rice.o onion.o curd.o coriander.o meat.o
biryani : $(objects) cc -o biryani $(objects)
masala.o : masala.h defs.h
rice.o : rice.h defs.h
onion.o : defs.h
curd.o : defs.h
coriander.o : defs.h
meat.o : defs.h
clean: rm biryani $(objects)
() Dum Ka Biryani, Make for each other 6 / 1 2.6 Another Style of Makefile
Makefile objects = masala.o rice.o onion.o curd.o coriander.o meat.o
biryani : $(objects) cc -o biryani $(objects)
$(objects) : defs.h
masala.o : masala.h
rice.o : rice.h
clean: rm biryani $(objects)
() Dum Ka Biryani, Make for each other 7 / 1 2.7 Rules for Cleaning the Directory
Makefile objects = masala.o rice.o onion.o curd.o coriander.o meat.o
biryani : $(objects) cc -o biryani $(objects)
$(objects) : defs.h
masala.o : masala.h
rice.o : rice.h
.PHONY : clean clean: -rm biryani $(objects)
() Dum Ka Biryani, Make for each other 8 / 1 3.1 What Makefiles Contain
* Explicit rule onion.o : onion.c defs.h cc -c onion.c
* Implicit rule masala.o : masala.h
* Variable definition objects = masala.o rice.o onion.o curd.o coriander.o meat.o
* Directive ifeq ($(CC), gcc) libs=$(libs for gcc) else libs=$(normal libs) endif
* Comments # This is a comment
() Dum Ka Biryani, Make for each other 9 / 1 $ make $ make -f myMakefile $ make --file=myMakefile
3.2 What Name to Give Your Makefile
Default * GNUMakefile * makefile * Makefile
() Dum Ka Biryani, Make for each other 10 / 1 3.2 What Name to Give Your Makefile
Default * GNUMakefile * makefile * Makefile
$ make $ make -f myMakefile $ make --file=myMakefile
() Dum Ka Biryani, Make for each other 10 / 1 $ make $ make -I $ make --include-dir
3.3 Including Other Makefiles
* Syntax include filenames... * Regex and variables allowed include foo *.mk $(bar) * To ignore Makefile if not found -include filenames...
() Dum Ka Biryani, Make for each other 11 / 1 3.3 Including Other Makefiles
* Syntax include filenames... * Regex and variables allowed include foo *.mk $(bar) * To ignore Makefile if not found -include filenames...
$ make $ make -I $ make --include-dir
() Dum Ka Biryani, Make for each other 11 / 1 $ make $ make meat
3.6 Overriding Part of Another Makefile
GNUmakefile meat: cc -c vegetables.c
%: force @$(MAKE) -f Makefile $@ force: ;
() Dum Ka Biryani, Make for each other 12 / 1 3.6 Overriding Part of Another Makefile
GNUmakefile meat: cc -c vegetables.c
%: force @$(MAKE) -f Makefile $@ force: ;
$ make $ make meat
() Dum Ka Biryani, Make for each other 12 / 1 3.7 How make Reads a Makefile
First phase * Reads all makefiles * Reads included makefiles * Internalize variables, values, implicit and explicit rules * Constructs dependency graph of targets and pre-requisites * immediate: expansion in phase one Second phase * Determines which targets need to be re-built * Invokes the necessary rules * deferred: expansion in phase two
() Dum Ka Biryani, Make for each other 13 / 1 3.7 How make Reads a Makefile
Variable assignment * immediate = deferred * immediate ?= deferred * immediate := immediate * immediate += deferred or immediate immediate, if variable was previously set as a simple variable (:=) deferred, otherwise Second phase * Determines which targets need to be re-built * Invokes the necessary rules * deferred: expansion in phase two
() Dum Ka Biryani, Make for each other 14 / 1 3.7 How make Reads a Makefile
Conditional Directives * immediate Rule Definition Makefile target : prerequisites ... recipe ......
Makefile immediate : immediate ; deferred deferred
() Dum Ka Biryani, Make for each other 15 / 1 4.2 Rule Syntax
* First target as default, if not specified. * A rule tells make two things: when the targets are out of date (prerequisites), and how to update them (recipe) when necessary.
Makefile target : prerequisites ... recipe ......
Makefile target : prerequisites ; recipe recipe ......
() Dum Ka Biryani, Make for each other 16 / 1 4.4 Using Wildcard Characters in File Names
Makefile clean : rm -f *.o
Wildcard expansion does not happen in variable definition
Makefile objects = *.o
Use Wildcard function! Makefile objects = $(wildcard *.o)
() Dum Ka Biryani, Make for each other 17 / 1 4.5 Searching Directories for Prerequisites
VPATH make variable VPATH = src:../headers vpath Directive
Makefile vpath pattern directories vpath %.h ../headers
To clear search paths:
Makefile vpath pattern vpath %.h
vpath
() Dum Ka Biryani, Make for each other 18 / 1 4.5.4 Writing Recipes with Directory Search
Automatic variables $ˆ all prerequisites $@ target $< first prerequisite
Makefile coriander.o : coriander.c cc -c $(CFLAGS) $^ -o $@
Makefile masala.o : masala.c masala.h defs.h cc -c $(CFLAGS) $< -o $@
() Dum Ka Biryani, Make for each other 19 / 1 4.6 Phony Targets Error in submake ignored: Makefile SUBDIRS = masala rice onion
subdirs : for dir in $(SUBDIRS); do \ $(MAKE) -C $$dir; \ done
Makefile SUBDIRS = masala rice onion
.PHONY : subdirs $(SUBDIRS) subdirs: $(SUBDIRS)
$(SUBDIRS): $(MAKE) -C $@
() Dum Ka Biryani, Make for each other 20 / 1 4.12 Static Pattern Rules
* Override implicit rule. * No uncertainity.
Makefile targets ... : target-pattern: prereq-patterns ... recipe ...
Makefile objects = curd.o coriander.o masala.o
all: $(objects)
$(objects): %.o: %.c $(CC) -c $(CFLAGS) $< -o $@
() Dum Ka Biryani, Make for each other 21 / 1 $ make In a cooking vessel add a layer of semi-cooked Basmati rice Add meat on this rice layer Add another layer of rice Sprinkle the ingredients with water and cook
5.1 Recipe Syntax
* Follows shell syntax. * Backslash-newline pairs are preserved and passed to the shell.
Makefile all : @echo In a cooking vessel\ add a layer of semi-cooked Basmati rice @echo Add meat on this\ rice layer @echo Add another layer \ of rice @echo Sprinkle the ingredients with water and cook
() Dum Ka Biryani, Make for each other 22 / 1 5.1 Recipe Syntax
* Follows shell syntax. * Backslash-newline pairs are preserved and passed to the shell.
Makefile all : @echo In a cooking vessel\ add a layer of semi-cooked Basmati rice @echo Add meat on this\ rice layer @echo Add another layer \ of rice @echo Sprinkle the ingredients with water and cook
$ make In a cooking vessel add a layer of semi-cooked Basmati rice Add meat on this rice layer Add another layer of rice Sprinkle the ingredients with water and cook
() Dum Ka Biryani, Make for each other 22 / 1 $ make masala rice onion
5.1.2 Using Variables in Recipes
Makefile LIST = masala rice onion
all: for i in $(LIST); do \ echo $$i; \ done
() Dum Ka Biryani, Make for each other 23 / 1 5.1.2 Using Variables in Recipes
Makefile LIST = masala rice onion
all: for i in $(LIST); do \ echo $$i; \ done
$ make masala rice onion
() Dum Ka Biryani, Make for each other 23 / 1 $ make $ make -j $ make --jobs
$ make -l $ make --max-load
5.4 Parallel Execution
* -j number, number of recipies to execute in parallel. * -l number, number (limit) of jobs to run in parallel.
() Dum Ka Biryani, Make for each other 24 / 1 5.4 Parallel Execution
* -j number, number of recipies to execute in parallel. * -l number, number (limit) of jobs to run in parallel.
$ make $ make -j $ make --jobs
$ make -l $ make --max-load
() Dum Ka Biryani, Make for each other 24 / 1 5.5 Errors in Recipes
* Ignore errors in a recipe line.
Makefile clean : -rm -f *.o
() Dum Ka Biryani, Make for each other 25 / 1 5.7 Recursive Use of make
* Recursive make commands should always use the variable MAKE.
Makefile subsystem : cd subdir && $(MAKE)
Makefile subsystem : $(MAKE) -C subdir
() Dum Ka Biryani, Make for each other 26 / 1 5.7.2 Communicating Variables to Sub-make
Makefile variable = value
export variable ...
unexport variable ...
Makefile export variable = value
export variable := value
export variable += value
() Dum Ka Biryani, Make for each other 27 / 1 $ make $ make mix Adding green chillies Adding ginger garlic paste Adding cinnamon, cardamom Adding fried onions Adding coriander and mint leaves
5.8 Defining Canned Recipes
Makefile define mix-masala= @echo "Adding green chillies" @echo "Adding ginger garlic paste" @echo "Adding cinnamon, cardamom" @echo "Adding fried onions" @echo "Adding coriander and mint leaves" endef
mix: $(mix-masala)
() Dum Ka Biryani, Make for each other 28 / 1 5.8 Defining Canned Recipes
Makefile define mix-masala= @echo "Adding green chillies" @echo "Adding ginger garlic paste" @echo "Adding cinnamon, cardamom" @echo "Adding fried onions" @echo "Adding coriander and mint leaves" endef
mix: $(mix-masala)
$ make $ make mix Adding green chillies Adding ginger garlic paste Adding cinnamon, cardamom Adding fried onions Adding coriander and mint leaves
() Dum Ka Biryani, Make for each other 28 / 1 $ make green chillies and red chillie powder
6.2 The Two Flavors of Variables
* Recursively Expanded variable
Makefile spice = $(chillies) chillies = $(both) both = green chillies and red chillie powder
all: ; echo $(spice)
() Dum Ka Biryani, Make for each other 29 / 1 6.2 The Two Flavors of Variables
* Recursively Expanded variable
Makefile spice = $(chillies) chillies = $(both) both = green chillies and red chillie powder
all: ; echo $(spice)
$ make green chillies and red chillie powder
() Dum Ka Biryani, Make for each other 29 / 1 $ make red chillie powder, green chillies green chillies
6.2 The Two Flavors of Variables
* Simply Expanded variable
Makefile chillie := red chillie spice := $(chillie) powder, green chillies chillie := green chillies
all: echo $(spice) echo $(chillie)
() Dum Ka Biryani, Make for each other 30 / 1 6.2 The Two Flavors of Variables
* Simply Expanded variable
Makefile chillie := red chillie spice := $(chillie) powder, green chillies chillie := green chillies
all: echo $(spice) echo $(chillie)
$ make red chillie powder, green chillies green chillies
() Dum Ka Biryani, Make for each other 30 / 1 6.2 The Two Flavors of Variables
* Conditional Variable assignment operator
Makefile ifeq ($(origin RICE), undefined) RICE = Basmati rice endif
Makefile RICE ?= Basmati rice
() Dum Ka Biryani, Make for each other 31 / 1 6.3.1 Substitution References
Makefile masala := chillies.o onions.o garlic.o ginger.o biryani := $(masala:.o=.c)
Makefile masala := chillies.o onions.o garlic.o ginger.o biryani := $(masala:%.o=%.c)
* ’biryani’ is set to ’chillies.c onions.c garlic.c ginger.c’
() Dum Ka Biryani, Make for each other 32 / 1 $ make green coriander leaves
6.3.2 Computed Variable Names
Makefile greeny = coriander coriander = green coriander leaves leaves := $($(greeny))
all: @echo $(leaves)
() Dum Ka Biryani, Make for each other 33 / 1 6.3.2 Computed Variable Names
Makefile greeny = coriander coriander = green coriander leaves leaves := $($(greeny))
all: @echo $(leaves)
$ make green coriander leaves
() Dum Ka Biryani, Make for each other 33 / 1 6.6 Appending More Text to Variables
Makefile objects = masala.o rice.o onion.o curd.o ... objects += coriander.o
Makefile CFLAGS = $(includes) -O ... CFLAGS += -pg
() Dum Ka Biryani, Make for each other 34 / 1 6.7 The override Directive
Makefile override variable = value
override variable := value
override variable += more text
Makefile override CFLAGS += -g
override define masala= more-masala endef
() Dum Ka Biryani, Make for each other 35 / 1 6.9 Undefining Variables
Makefile water := saffron water leaves = mint leaves
undefine water undefine leaves
Makefile override undefine CFLAGS
() Dum Ka Biryani, Make for each other 36 / 1 6.11 Target-specific Variable Values
Makefile target ... : variable-assignment
Makefile prog : CFLAGS = -g prog : masala.o rice.o onion.o
() Dum Ka Biryani, Make for each other 37 / 1 6.12 Pattern-specific Variable Values
Makefile pattern ... : variable-assignment
Makefile %.o : CFLAGS = -O
Makefile %.o: %.c $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
lib/%.o: CFLAGS := -fPIC -g %.o: CFLAGS := -g
all: rice.o lib/masala.o
() Dum Ka Biryani, Make for each other 38 / 1 7.1 Example of a Conditional
Makefile libs for gcc = -lgnu
normal libs =
biryani : $(objects) ifeq ($(CC), gcc) libs=$(libs for gcc) else libs=$(normal libs) endif
() Dum Ka Biryani, Make for each other 39 / 1 7.2 Syntax of Conditionals
Makefile conditional-directive text-if-true endif
Makefile conditional-directive text-if-true else text-if-false endif
Makefile conditional-directive text-if-one-is-true endif else conditional-directive text-if-true else text-if-false endif
() Dum Ka Biryani, Make for each other 40 / 1 7.2 Syntax of Conditionals
Four conditional directives: * ifeq ifeq ($(CC), gcc) * ifneq ifneq ($(STRIP), strip) * ifdef ifdef $(LIBS) * ifndef ifndef $(CFLAGS)
() Dum Ka Biryani, Make for each other 41 / 1 8.1 Function Call Syntax
Makefile $(function arguments)
${function arguments}
Makefile comma := , empty := space:= $(empty) $(empty)
masala:= chillies onion garlic ginger list:= $(subst $(space),$(comma),$(masala))
’list’ is now ’chillies,onion,garlic,ginger’
() Dum Ka Biryani, Make for each other 42 / 1 8.2 Functions for String Substitution and Analysis
Makefile $(subst from,to,text )
$(patsubst pattern,replacement,text )
$(strip string )
$(findstring find,in )
$(filter pattern...,text )
$(filter-out pattern...,text )
$(sort list )
$(word n, text )
() Dum Ka Biryani, Make for each other 43 / 1 8.3 Functions for File Names
Makefile $(dir names... )
$(notdir names... )
$(suffix names... )
$(basename names... )
$(addsuffix suffix,names... )
$(addprefix prefix,names... )
$(join list1, list2 )
$(wildcard pattern )
() Dum Ka Biryani, Make for each other 44 / 1 8.4 Functions for Conditionals
Makefile $(if condition,then-part[,else-part] )
$(or condition1[,condition2[,condition3...]] )
$(and condition1[,condition2[,condition3...]] )
() Dum Ka Biryani, Make for each other 45 / 1 8.5 The foreach Function
Makefile $(foreach var,list,text )
Makefile find files = $(wildcard $(dir)/*)
dirs := masala rice leaves
files := $(foreach dir, $(dirs), $(find files))
() Dum Ka Biryani, Make for each other 46 / 1 8.6 The call Function
Makefile $(call variable,param,param,... )
Makefile reverse = $(2) $(1)
make = $(call reverse,cook,mix)
’make’ contains ’mix cook’
() Dum Ka Biryani, Make for each other 47 / 1 $ make ATH /usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
8.7 The value Function
Makefile $(value variable )
Makefile LIST = $PATH
all: @echo $(LIST) @echo $(value LIST)
() Dum Ka Biryani, Make for each other 48 / 1 8.7 The value Function
Makefile $(value variable )
Makefile LIST = $PATH
all: @echo $(LIST) @echo $(value LIST)
$ make ATH /usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
() Dum Ka Biryani, Make for each other 48 / 1 8.9 The origin Function
Makefile $(origin variable )
How the variable was defined: * undefined * default * environment * environment override * file * command line * automatic
() Dum Ka Biryani, Make for each other 49 / 1 8.10 The flavor Function
Makefile $(flavor variable )
Flavor of the variable: * undefined * recursively expanded variable * simply expanded variable
() Dum Ka Biryani, Make for each other 50 / 1 8.11 The shell Function
Makefile contents := $(shell cat onion.c)
Makefile files := $(shell echo *.c)
() Dum Ka Biryani, Make for each other 51 / 1 References
GNU Make: http://www.gnu.org/software/make/
GNU Make Manual: http://www.gnu.org/software/make/manual/
Dum Ka Biryani, Make for each other (sources): http://www.shakthimaan.com/downloads.html#dum-ka-biryani-make-for-each-other
Symbols in LaTeX and HTML: http://newton.ex.ac.uk/research/qsystems/people/sque/symbols/
() Dum Ka Biryani, Make for each other 52 / 1