Software Carpentry logo

Automated Builds

April 24, 2010: We are pleased to announce that Version 4 of this course is now under development. For updates and an early peek at the content, please check out the Software Carpentry blog at http://www.software-carpentry.org/blog/.

1) Introduction

2) You Can Skip This Lecture If...

3) Automate, Automate, Automate

4) Make

5) Our Example

6) Example Data File

Time: 1.2271
Concentration: 0.0050
Yield: 11.41

Time: 2.5094
Concentration: 0.0055
Yield: 11.20

Time: 3.7440
Concentration: 0.0060
Yield: 10.90

7) Hello, Make

hydroxyl_422.csv : hydroxyl_422.dat
	dat2csv hydroxyl_422.dat > hydroxyl_422.csv

8) Terminology

Structure of a Make Rule

Figure 11.1: Structure of a Make Rule

9) Multiple Targets

hydroxyl_422.csv : hydroxyl_422.dat
	dat2csv hydroxyl_422.dat > hydroxyl_422.csv

methyl_422.csv : methyl_422.dat
	dat2csv methyl_422.dat > methyl_422.csv

10) Phony Targets

all : hydroxyl_422.csv methyl_422.csv

hydroxyl_422.csv : hydroxyl_422.dat
	dat2csv hydroxyl_422.dat > hydroxyl_422.csv

methyl_422.csv : methyl_422.dat
	dat2csv methyl_422.dat > methyl_422.csv

11) Dependencies

Visualizing Dependencies

Figure 11.2: Visualizing Dependencies

12) Updating Dependencies

13) Conventions

14) Automatic Variables

15) Automatic Variables Example

all : hydroxyl_422.csv methyl_422.csv

hydroxyl_422.csv : hydroxyl_422.dat
	@dat2csv $< > $@

methyl_422.csv : methyl_422.dat
	@dat2csv $< > $@

clean :
	@rm -f *.csv

16) Pattern Rules

all : hydroxyl_422.csv methyl_422.csv

%.csv : %.dat
	@dat2csv $< > $@

clean :
	@rm -f *.csv

17) Adding More Dependencies

all : hydroxyl_all.csv methyl_all.csv

%_all.csv : %_422.csv %_480.csv
	summarize $^ > $@

%.csv : %.dat dat2csv
	dat2csv $< > $@

clean :
	@rm -f *.csv
dat2csv hydroxyl_422.dat > hydroxyl_422.csv
dat2csv hydroxyl_480.dat > hydroxyl_480.csv
summarize hydroxyl_422.csv hydroxyl_480.csv > hydroxyl_all.csv
dat2csv methyl_422.dat > methyl_422.csv
dat2csv methyl_480.dat > methyl_480.csv
summarize methyl_422.csv methyl_480.csv > methyl_all.csv
rm hydroxyl_480.csv methyl_422.csv hydroxyl_422.csv methyl_480.csv

18) Tidying Up

$ make -f depend.mk

19) Defining Macros

INPUT_DIR = /lab/gamma2100
OUTPUT_DIR = /tmp

all : ${OUTPUT_DIR}/hydroxyl_all.csv ${OUTPUT_DIR}/methyl_all.csv

${OUTPUT_DIR}/%_all.csv : ${OUTPUT_DIR}/%_422.csv ${OUTPUT_DIR}/%_480.csv
	@summarize $^ > $@

${OUTPUT_DIR}/%.csv : ${INPUT_DIR}/%.dat
	@dat2csv $< > $@

clean :
	@rm -f *.csv

20) Passing Values to Make

VAL = original
echo :
	@echo "VAL is" ${VAL}
$ make -f env.mk echo
VAL is original
$ make VAL=changed -f env.mk echo
VAL is changed

21) Functions

INPUT_DIR = /lab/gamma2100
OUTPUT_DIR = /tmp
CHEMICALS = hydroxyl methyl
SUMMARIES = $(addprefix ${OUTPUT_DIR}/,$(addsuffix _all.csv,${CHEMICALS}))

all : ${SUMMARIES}

${OUTPUT_DIR}/%_all.csv : ${OUTPUT_DIR}/%_422.csv ${OUTPUT_DIR}/%_480.csv
	@summarize $^ > $@

${OUTPUT_DIR}/%.csv : ${INPUT_DIR}/%.dat
	@dat2csv $< > $@

clean :
	@rm -f *.csv
Function Purpose
$(addprefix prefix,filenames) Add a prefix to each filename in a list
$(addsuffix suffix,filenames) Add a suffix to each filename in a list
$(dir filenames) Extract the directory name portion of each filename in a list
$(filter pattern,text) Keep words in text that match pattern
$(filter-out pattern,text) Keep words in text that don't match pattern
$(patsubst pattern,replacement,text) Replace everything that matches pattern in text
$(sort text) Sort the words in text, removing duplicates
$(strip text) Remove leading and trailing whitespace from text
$(subst from,to,text) Replace from with to in text
$(wildcard pattern) Create a list of filenames that match a pattern

Table 11.2: Commonly-Used Functions

22) Pros and Cons

23) Alternatives

24) Summary