gcc -c -Wall -ansi -I/pkg/chempak/include dat2csv.c
once is bad enoughMake
Make
is freely available for every major platform, and very well documentedMake
's syntaxTime: 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
dat2csv
hello.mk
:hydroxyl_422.csv : hydroxyl_422.dat dat2csv hydroxyl_422.dat > hydroxyl_422.csv
make -f hello.mk
make -f hello.mk
againhydroxyl_422.csv
is newer than hydroxyl_422.dat
, Make
does not run the command againFigure 6.1: Structure of a Make Rule
hydroxyl_422.csv
is the target
of the rule
hydroxyl_422.dat
is its prerequisite
Make
runs them on your behalf, just as the shell runs the command you typehydroxyl_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
make -f double.mk
, only hydroxyl_422.csv
is compiledMake
will updatemake -f double.mk methyl_422.csv
to build methyl_422.csv
Make
separately for each target would hardly count as "automation"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
make -f phony.mk all
now creates both .csv
files
Make
's built-in processing cycle:
Make
can execute actions in any order it wants to, as long as it doesn't violate dependency orderinghydroxyl_422.cv
or methyl_422.csv
firstall
make
with no arguments, it automatically looks for a file called Makefile
make
only updates the first one it finds"all"
: recompile everything"clean"
: delete all temporary files, and everything produced by compilation"install"
: copy files to system directories./configure
make
make test
make install
Make
defines automatic variables
to represent parts of rules
"$@"
|
The rule's target |
"$<"
|
The rule's first prerequisite |
"$?"
|
All of the rule's out-of-date prerequisites |
"$^"
|
All prerequisites |
Table 6.1: Automatic Variables in Make |
---|
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
Make
echoes actions before executing them"@"
at the start of the action line prevents thisclean
to tidy up generated filesrm -f
instead of just rm
?all : hydroxyl_422.csv methyl_422.csv %.csv : %.dat @dat2csv $< > $@ clean : @rm -f *.csv
"%"
represents the stem of the file's name in the target and prerequisitessummarize
to combine data from hydroxyl_422.csv
and hydroxyl_480.csv
hydroxyl_all.csv
all : hydroxyl_all.csv methyl_all.csv %_all.csv : %_422.csv %_480.csv summarize $^ > $@ %.csv : %.dat dat2csv dat2csv $< > $@ clean : @rm -f *.csv
%_all.csv
takes precedence over the rule for %.csv
Make
uses the most specific rule available$ make -f depend.mk
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
Make
automatically removes intermediate files created by pattern rules when it's doneMake
is a little programming languageINPUT_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
"$"
in front of the name and parentheses or braces around it$(XYZ)
or ${XYZ}
Make
interprets "$XYZ"
as the value of "X"
, followed by the characters "YZ"
Make
when invoking itname=value
pairs on the command linemake -f macro.mk
sets INPUT_DIR
to /lab/gamma2100
make INPUT_DIR=/newlab -f macro.mk
uses /newlab
Make
also looks at environment variables${HOME}
in a Makefile without having defined itVAL = original echo : @echo "VAL is" ${VAL}
$ make -f env.mk echo
VAL is original
$ make VAL=changed -f env.mk echo
VAL is changed
addprefix
and addsuffix
to build a list of filenameshydroxyl
into /tmp/hydroxyl_all.csv
and methyl
into /tmp/methyl_all.csv
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 6.2: Commonly-Used Functions |
echo
to print things as Make
executesdel
or rm
to delete files?
Ant
: primary for Java, but equivalent tools now exist for .NET
SCons
CruiseControl
and Bitten
Exercise 6.1:
Make
gets definitions from environment variables,
command-line parameters, and explicit definitions in Makefiles.
What order does it check these in?