Dum Ka Biryani, Make for each other - shakthimaan.com

63
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

Transcript of Dum Ka Biryani, Make for each other - shakthimaan.com

Page 1: Dum Ka Biryani, Make for each other - shakthimaan.com

Dum Ka Biryani,Make for each other

Version 1.0February 2011

GNU Free Documentation LicenseShakthi Kannan

[email protected]://www.shakthimaan.com

() Dum Ka Biryani, Make for each other 1 / 1

Page 2: Dum Ka Biryani, Make for each other - shakthimaan.com

Dum Ka Biryani

() Dum Ka Biryani, Make for each other 2 / 1

Page 3: Dum Ka Biryani, Make for each other - shakthimaan.com

2.1 What a Rule Looks Like

Makefile

target : prerequisites ...recipe......

Tab before recipe!

() Dum Ka Biryani, Make for each other 3 / 1

Page 4: Dum Ka Biryani, Make for each other - shakthimaan.com

2.2 A Simple Makefile

Makefile

biryani : masala.o rice.o onion.o curd.o coriander.o meat.occ -o biryani masala.o rice.o onion.o curd.o coriander.o meat.o

masala.o : masala.c masala.h defs.hcc -c masala.c

rice.o : rice.c rice.h defs.hcc -c rice.c

onion.o : onion.c defs.hcc -c onion.c

curd.o : curd.c defs.hcc -c curd.c

coriander.o : coriander.c defs.hcc -c coriander.c

meat.o : meat.c defs.hcc -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

Page 5: Dum Ka Biryani, Make for each other - shakthimaan.com

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.hcc -c masala.c

rice.o : rice.c rice.h defs.hcc -c rice.c

onion.o : onion.c defs.hcc -c onion.c

curd.o : curd.c defs.hcc -c curd.c

coriander.o : coriander.c defs.hcc -c coriander.c

meat.o : meat.c defs.hcc -c meat.c

clean:rm biryani $(objects)

() Dum Ka Biryani, Make for each other 5 / 1

Page 6: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 7: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 8: Dum Ka Biryani, Make for each other - shakthimaan.com

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 : cleanclean:

-rm biryani $(objects)

() Dum Ka Biryani, Make for each other 8 / 1

Page 9: Dum Ka Biryani, Make for each other - shakthimaan.com

3.1 What Makefiles Contain

* Explicit ruleonion.o : onion.c defs.h

cc -c onion.c

* Implicit rulemasala.o : masala.h

* Variable definitionobjects = masala.o rice.o onion.o curd.o coriander.o meat.o

* Directiveifeq ($(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

Page 10: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 11: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 12: Dum Ka Biryani, Make for each other - shakthimaan.com

3.3 Including Other Makefiles

* Syntaxinclude filenames...

* Regex and variables allowedinclude 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

Page 13: Dum Ka Biryani, Make for each other - shakthimaan.com

3.3 Including Other Makefiles

* Syntaxinclude filenames...

* Regex and variables allowedinclude 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

Page 14: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 15: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 16: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 17: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 18: Dum Ka Biryani, Make for each other - shakthimaan.com

3.7 How make Reads a Makefile

Conditional Directives

* immediate

Rule Definition

Makefile

target : prerequisites ...recipe......

Makefile

immediate : immediate ; deferreddeferred

() Dum Ka Biryani, Make for each other 15 / 1

Page 19: Dum Ka Biryani, Make for each other - shakthimaan.com

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 ; reciperecipe......

() Dum Ka Biryani, Make for each other 16 / 1

Page 20: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 21: Dum Ka Biryani, Make for each other - shakthimaan.com

4.5 Searching Directories for Prerequisites

VPATH make variable

VPATH = src:../headers

vpath Directive

Makefile

vpath pattern directoriesvpath %.h ../headers

To clear search paths:

Makefile

vpath patternvpath %.h

vpath

() Dum Ka Biryani, Make for each other 18 / 1

Page 22: Dum Ka Biryani, Make for each other - shakthimaan.com

4.5.4 Writing Recipes with Directory Search

Automatic variables$ˆ all prerequisites$@ target$< first prerequisite

Makefile

coriander.o : coriander.ccc -c $(CFLAGS) $^ -o $@

Makefile

masala.o : masala.c masala.h defs.hcc -c $(CFLAGS) $< -o $@

() Dum Ka Biryani, Make for each other 19 / 1

Page 23: Dum Ka Biryani, Make for each other - shakthimaan.com

4.6 Phony TargetsError 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

Page 24: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 25: Dum Ka Biryani, Make for each other - shakthimaan.com

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

$ makeIn a cooking vessel add a layer of semi-cooked Basmati riceAdd meat on this rice layerAdd another layer of riceSprinkle the ingredients with water and cook

() Dum Ka Biryani, Make for each other 22 / 1

Page 26: Dum Ka Biryani, Make for each other - shakthimaan.com

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

$ makeIn a cooking vessel add a layer of semi-cooked Basmati riceAdd meat on this rice layerAdd another layer of riceSprinkle the ingredients with water and cook

() Dum Ka Biryani, Make for each other 22 / 1

Page 27: Dum Ka Biryani, Make for each other - shakthimaan.com

5.1.2 Using Variables in Recipes

Makefile

LIST = masala rice onion

all:for i in $(LIST); do \

echo $$i; \done

$ makemasalariceonion

() Dum Ka Biryani, Make for each other 23 / 1

Page 28: Dum Ka Biryani, Make for each other - shakthimaan.com

5.1.2 Using Variables in Recipes

Makefile

LIST = masala rice onion

all:for i in $(LIST); do \

echo $$i; \done

$ makemasalariceonion

() Dum Ka Biryani, Make for each other 23 / 1

Page 29: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 30: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 31: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 32: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 33: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 34: Dum Ka Biryani, Make for each other - shakthimaan.com

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 mixAdding green chilliesAdding ginger garlic pasteAdding cinnamon, cardamomAdding fried onionsAdding coriander and mint leaves

() Dum Ka Biryani, Make for each other 28 / 1

Page 35: Dum Ka Biryani, Make for each other - shakthimaan.com

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 mixAdding green chilliesAdding ginger garlic pasteAdding cinnamon, cardamomAdding fried onionsAdding coriander and mint leaves

() Dum Ka Biryani, Make for each other 28 / 1

Page 36: Dum Ka Biryani, Make for each other - shakthimaan.com

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)

$ makegreen chillies and red chillie powder

() Dum Ka Biryani, Make for each other 29 / 1

Page 37: Dum Ka Biryani, Make for each other - shakthimaan.com

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)

$ makegreen chillies and red chillie powder

() Dum Ka Biryani, Make for each other 29 / 1

Page 38: Dum Ka Biryani, Make for each other - shakthimaan.com

6.2 The Two Flavors of Variables

* Simply Expanded variable

Makefile

chillie := red chilliespice := $(chillie) powder, green chillieschillie := green chillies

all:echo $(spice)echo $(chillie)

$ makered chillie powder, green chilliesgreen chillies

() Dum Ka Biryani, Make for each other 30 / 1

Page 39: Dum Ka Biryani, Make for each other - shakthimaan.com

6.2 The Two Flavors of Variables

* Simply Expanded variable

Makefile

chillie := red chilliespice := $(chillie) powder, green chillieschillie := green chillies

all:echo $(spice)echo $(chillie)

$ makered chillie powder, green chilliesgreen chillies

() Dum Ka Biryani, Make for each other 30 / 1

Page 40: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 41: Dum Ka Biryani, Make for each other - shakthimaan.com

6.3.1 Substitution References

Makefile

masala := chillies.o onions.o garlic.o ginger.obiryani := $(masala:.o=.c)

Makefile

masala := chillies.o onions.o garlic.o ginger.obiryani := $(masala:%.o=%.c)

* ’biryani’ is set to ’chillies.c onions.c garlic.c ginger.c’

() Dum Ka Biryani, Make for each other 32 / 1

Page 42: Dum Ka Biryani, Make for each other - shakthimaan.com

6.3.2 Computed Variable Names

Makefile

greeny = coriandercoriander = green coriander leavesleaves := $($(greeny))

all:@echo $(leaves)

$ makegreen coriander leaves

() Dum Ka Biryani, Make for each other 33 / 1

Page 43: Dum Ka Biryani, Make for each other - shakthimaan.com

6.3.2 Computed Variable Names

Makefile

greeny = coriandercoriander = green coriander leavesleaves := $($(greeny))

all:@echo $(leaves)

$ makegreen coriander leaves

() Dum Ka Biryani, Make for each other 33 / 1

Page 44: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 45: Dum Ka Biryani, Make for each other - shakthimaan.com

6.7 The override Directive

Makefile

override variable = value

override variable := value

override variable += more text

Makefile

override CFLAGS += -g

override define masala=more-masalaendef

() Dum Ka Biryani, Make for each other 35 / 1

Page 46: Dum Ka Biryani, Make for each other - shakthimaan.com

6.9 Undefining Variables

Makefile

water := saffron waterleaves = mint leaves

undefine waterundefine leaves

Makefile

override undefine CFLAGS

() Dum Ka Biryani, Make for each other 36 / 1

Page 47: Dum Ka Biryani, Make for each other - shakthimaan.com

6.11 Target-specific Variable Values

Makefile

target ... : variable-assignment

Makefile

prog : CFLAGS = -gprog : masala.o rice.o onion.o

() Dum Ka Biryani, Make for each other 37 / 1

Page 48: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 49: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 50: Dum Ka Biryani, Make for each other - shakthimaan.com

7.2 Syntax of Conditionals

Makefile

conditional-directivetext-if-trueendif

Makefile

conditional-directivetext-if-trueelsetext-if-false endif

Makefile

conditional-directivetext-if-one-is-trueendifelse conditional-directivetext-if-trueelsetext-if-false endif

() Dum Ka Biryani, Make for each other 40 / 1

Page 51: Dum Ka Biryani, Make for each other - shakthimaan.com

7.2 Syntax of Conditionals

Four conditional directives:

* ifeqifeq ($(CC), gcc)

* ifneqifneq ($(STRIP), strip)

* ifdefifdef $(LIBS)

* ifndefifndef $(CFLAGS)

() Dum Ka Biryani, Make for each other 41 / 1

Page 52: Dum Ka Biryani, Make for each other - shakthimaan.com

8.1 Function Call Syntax

Makefile

$(function arguments)

${function arguments}

Makefile

comma := ,empty :=space:= $(empty) $(empty)

masala:= chillies onion garlic gingerlist:= $(subst $(space),$(comma),$(masala))

’list’ is now ’chillies,onion,garlic,ginger’

() Dum Ka Biryani, Make for each other 42 / 1

Page 53: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 54: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 55: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 56: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 57: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 58: Dum Ka Biryani, Make for each other - shakthimaan.com

8.7 The value Function

Makefile

$(value variable )

Makefile

LIST = $PATH

all:@echo $(LIST)@echo $(value LIST)

$ makeATH/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin

() Dum Ka Biryani, Make for each other 48 / 1

Page 59: Dum Ka Biryani, Make for each other - shakthimaan.com

8.7 The value Function

Makefile

$(value variable )

Makefile

LIST = $PATH

all:@echo $(LIST)@echo $(value LIST)

$ makeATH/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin

() Dum Ka Biryani, Make for each other 48 / 1

Page 60: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 61: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 62: Dum Ka Biryani, Make for each other - shakthimaan.com

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

Page 63: Dum Ka Biryani, Make for each other - shakthimaan.com

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