Download presentation
Presentation is loading. Please wait.
Published byMabel Powers Modified over 8 years ago
1
Patterns Copyright © Software Carpentry 2010 This work is licensed under the Creative Commons Attribution License See http://software-carpentry.org/license.html for more information. Automated Builds
2
Patterns Manage tasks and dependencies
3
Automated BuildsPatterns figure-1.svg summary-1.dat Manage tasks and dependencies figure-2.svg data-1-1.datdata-1-3.datdata-1-2.dat paper.pdf paper.wdp
4
Automated BuildsPatterns figure-1.svg summary-1.dat Manage tasks and dependencies figure-2.svg data-1-1.datdata-1-3.datdata-1-2.dat paper.pdf paper.wdp stats.py stats.py summary-1.dat data-1-*.dat
5
Automated BuildsPatterns figure-1.svg summary-1.dat Manage tasks and dependencies figure-2.svg data-1-1.datdata-1-3.datdata-1-2.dat paper.pdf paper.wdp stats.py stats.py summary-1.dat data-1-*.dat ?
6
Automated BuildsPatterns figure-1.svg summary-1.dat Manage tasks and dependencies figure-2.svg data-1-1.datdata-1-3.datdata-1-2.dat paper.pdf paper.wdp stats.py stats.py summary-1.dat data-1-*.dat ?
7
Automated BuildsPatterns summary-1.dat data-1-1.datdata-1-3.datdata-1-2.dat stats.py summary-1.dat data-1-2.dat 1 3 # multiple.mk summary-1.dat : data-1-1.dat data-1-2.dat data-1-3.dat stats.py summary-1.dat data-1-1.dat data-1-2.dat data-1-3.dat
8
Automated BuildsPatterns summary-1.dat data-1-1.datdata-1-3.datdata-1-2.dat stats.py summary-1.dat data-1-2.dat 1 3 # target-variable.mk summary-1.dat : data-1-1.dat data-1-2.dat data-1-3.dat stats.py summary-1.dat data-1-1.dat data-1-2.dat data-1-3.dat
9
Automated BuildsPatterns summary-1.dat data-1-1.datdata-1-3.datdata-1-2.dat stats.py summary-1.dat data-1-2.dat 1 3 # target-variable.mk summary-1.dat : data-1-1.dat data-1-2.dat data-1-3.dat stats.py summary-1.dat data-1-1.dat data-1-2.dat data-1-3.dat stats.py $@ data-1-1.dat data-1-2.dat data-1-3.dat
10
Automated BuildsPatterns summary-1.dat data-1-1.datdata-1-3.datdata-1-2.dat stats.py summary-1.dat data-1-2.dat 1 3 # target-variable.mk summary-1.dat : data-1-1.dat data-1-2.dat data-1-3.dat stats.py summary-1.dat data-1-1.dat data-1-2.dat data-1-3.dat stats.py $@ data-1-1.dat data-1-2.dat data-1-3.dat
11
Automated BuildsPatterns summary-1.dat data-1-1.datdata-1-3.datdata-1-2.dat stats.py summary-1.dat data-1-2.dat 1 3 # target-variable.mk summary-1.dat : data-1-1.dat data-1-2.dat data-1-3.dat stats.py summary-1.dat data-1-1.dat data-1-2.dat data-1-3.dat stats.py $@ data-1-1.dat data-1-2.dat data-1-3.dat Automatic variable
12
Automated BuildsPatterns summary-1.dat data-1-1.datdata-1-3.datdata-1-2.dat stats.py summary-1.dat data-1-2.dat 1 3 # target-variable.mk summary-1.dat : data-1-1.dat data-1-2.dat data-1-3.dat stats.py summary-1.dat data-1-1.dat data-1-2.dat data-1-3.dat stats.py $@ data-1-1.dat data-1-2.dat data-1-3.dat Automatic variable "the target of this rule"
13
Automated BuildsPatterns summary-1.dat data-1-1.datdata-1-3.datdata-1-2.dat stats.py summary-1.dat data-1-2.dat 1 3 # target-variable.mk summary-1.dat : data-1-1.dat data-1-2.dat data-1-3.dat stats.py summary-1.dat data-1-1.dat data-1-2.dat data-1-3.dat stats.py $@ data-1-1.dat data-1-2.dat data-1-3.dat Automatic variable "the target of this rule" No, there isn't a more readable form
14
Automated BuildsPatterns # target-variable.mk summary-1.dat : data-1-1.dat data-1-2.dat data-1-3.dat stats.py $@ data-1-1.dat data-1-2.dat data-1-3.dat Still a lot of redundancy summary-1.dat data-1-1.datdata-1-3.datdata-1-2.dat stats.py summary-1.dat data-1-2.dat 1 3
15
Automated BuildsPatterns # variables.mk summary-1.dat : data-1-1.dat data-1-2.dat data-1-3.dat stats.py $@ data-1-1.dat data-1-2.dat data-1-3.dat summary-1.dat data-1-1.datdata-1-3.datdata-1-2.dat stats.py summary-1.dat data-1-2.dat 1 3
16
Automated BuildsPatterns # variables.mk summary-1.dat : data-1-1.dat data-1-2.dat data-1-3.dat stats.py $@ data-1-1.dat data-1-2.dat data-1-3.dat stats.py $@ $^ summary-1.dat data-1-1.datdata-1-3.datdata-1-2.dat stats.py summary-1.dat data-1-2.dat 1 3
17
Automated BuildsPatterns # variables.mk summary-1.dat : data-1-1.dat data-1-2.dat data-1-3.dat stats.py $@ data-1-1.dat data-1-2.dat data-1-3.dat stats.py $@ $^ All prerequisites of this rule summary-1.dat data-1-1.datdata-1-3.datdata-1-2.dat stats.py summary-1.dat data-1-2.dat 1 3
18
Automated BuildsPatterns # variables.mk summary-1.dat : data-1-1.dat data-1-2.dat data-1-3.dat stats.py $@ data-1-1.dat data-1-2.dat data-1-3.dat stats.py $@ $^ All prerequisites of this rule $< is "the first prerequisite" summary-1.dat data-1-1.datdata-1-3.datdata-1-2.dat stats.py summary-1.dat data-1-2.dat 1 3
19
Automated BuildsPatterns # variables.mk summary-1.dat : data-1-1.dat data-1-2.dat data-1-3.dat stats.py $@ data-1-1.dat data-1-2.dat data-1-3.dat stats.py $@ $^ All prerequisites of this rule $< is "the first prerequisite" $? is "all out-of-date prerequisites" summary-1.dat data-1-1.datdata-1-3.datdata-1-2.dat stats.py summary-1.dat data-1-2.dat 1 3
20
Automated BuildsPatterns # variables.mk summary-1.dat : data-1-1.dat data-1-2.dat data-1-3.dat stats.py $@ $^ summary-1.dat data-1-1.datdata-1-3.datdata-1-2.dat stats.py summary-1.dat data-1-2.dat 1 3
21
Automated BuildsPatterns # variables.mk summary-1.dat : data-1-1.dat data-1-2.dat data-1-3.dat stats.py $@ $^ summary-1.dat data-1-1.datdata-1-3.datdata-1-2.dat stats.py summary-1.dat data-1-2.dat 1 3 Expect more data files
22
Automated BuildsPatterns # variables.mk summary-1.dat : data-1-1.dat data-1-2.dat data-1-3.dat stats.py $@ $^ summary-1.dat data-1-1.datdata-1-3.datdata-1-2.dat stats.py summary-1.dat data-1-*.dat Want to do this
23
Automated BuildsPatterns # wildcard.mk summary-1.dat : data-1-*.dat stats.py $@ $^ summary-1.dat data-1-1.datdata-1-3.datdata-1-2.dat stats.py summary-1.dat data-1-*.dat
24
Automated BuildsPatterns # wildcard.mk summary-1.dat : data-1-*.dat stats.py $@ $^ summary-1.dat data-1-1.datdata-1-3.datdata-1-2.dat stats.py summary-1.dat data-1-*.dat Just like shell wildcard
25
Automated BuildsPatterns # wildcard.mk summary-1.dat : data-1-*.dat stats.py $@ $^ summary-1.dat data-1-1.datdata-1-3.datdata-1-2.dat stats.py summary-1.dat data-1-*.dat Just like shell wildcard Must use $^ in action, since filenames not fixed in advance
26
Automated BuildsPatterns figure-1.svg summary-1.dat figure-2.svg data-1-1.datdata-1-3.datdata-1-2.dat paper.pdf paper.wdp wdp2pdf paper.wdp stats.py sgr -N -r summary-1.dat \ > figure-1.svg stats.py summary-1.dat data-1-*.dat The whole tree one more time
27
Automated BuildsPatterns The makefile so far paper.pdf : paper.wdp figure-1.svg figure-2.svg wdp2pdf $< figure-1.svg : summary-1.dat sgr -N -r $@ $^ figure-2.svg : summary-2.dat sgr -N -r $@ $^ summary-1.dat : data-1-*.dat stats.py $@ $^ summary-2.dat : data-2-*.dat stats.py $@ $^
28
Automated BuildsPatterns Still some redundancy paper.pdf : paper.wdp figure-1.svg figure-2.svg wdp2pdf $< figure-1.svg : summary-1.dat sgr -N -r $@ $^ figure-2.svg : summary-2.dat sgr -N -r $@ $^ summary-1.dat : data-1-*.dat stats.py $@ $^ summary-2.dat : data-2-*.dat stats.py $@ $^ The makefile so far
29
Automated BuildsPatterns Still some redundancy Fix in next episode paper.pdf : paper.wdp figure-1.svg figure-2.svg wdp2pdf $< figure-1.svg : summary-1.dat sgr -N -r $@ $^ figure-2.svg : summary-2.dat sgr -N -r $@ $^ summary-1.dat : data-1-*.dat stats.py $@ $^ summary-2.dat : data-2-*.dat stats.py $@ $^ The makefile so far
30
Automated BuildsPatterns Still some redundancy Fix in next episode paper.pdf : paper.wdp figure-1.svg figure-2.svg wdp2pdf $< figure-1.svg : summary-1.dat sgr -N -r $@ $^ figure-2.svg : summary-2.dat sgr -N -r $@ $^ summary-1.dat : data-1-*.dat stats.py $@ $^ summary-2.dat : data-2-*.dat stats.py $@ $^ Doesn't handle summaries' dependency on stats.py The makefile so far
31
Automated BuildsPatterns paper.pdf : paper.wdp figure-1.svg figure-2.svg wdp2pdf $< figure-1.svg : summary-1.dat sgr -N -r $@ $^ figure-2.svg : summary-2.dat sgr -N -r $@ $^ summary-1.dat : stats.py data-1-*.dat stats.py $@ $^ summary-2.dat : stats.py data-2-*.dat stats.py $@ $^ Option 1: add to existing rules
32
Automated BuildsPatterns ⋮ summary-1.dat : stats.py data-1-*.dat stats.py $@ $^ summary-2.dat : stats.py data-2-*.dat stats.py $@ $^ ⋮ Option 1: add to existing rules $^ is now stats.py data-1-1.dat data-1-1.dat...
33
Automated BuildsPatterns ⋮ summary-1.dat : stats.py data-1-*.dat stats.py $@ $^ summary-2.dat : stats.py data-2-*.dat stats.py $@ $^ ⋮ $^ is now stats.py data-1-1.dat data-1-1.dat... So the invocation of stats.py is wrong Option 1: add to existing rules
34
Automated BuildsPatterns ⋮ summary-1.dat : stats.py data-1-*.dat stats.py $@ $^ summary-2.dat : stats.py data-2-*.dat stats.py $@ $^ ⋮ $^ is now stats.py data-1-1.dat data-1-1.dat... So the invocation of stats.py is wrong Having it ignore one argument is an ugly hack Option 1: add to existing rules
35
Automated BuildsPatterns figure-2.svg : summary-2.dat sgr -N -r $@ $^ summary-1.dat : data-1-*.dat stats.py $@ $^ summary-2.dat : data-2-*.dat stats.py $@ $^ data-1-1.dat : stats.py touch $@ data-1-2.dat : stats.py touch $@ Option 2: make data files depend on stats.py
36
Automated BuildsPatterns ⋮ data-1-1.dat : stats.py touch $@ data-1-2.dat : stats.py touch $@ ⋮ Option 2: make data files depend on stats.py A false dependency
37
Automated BuildsPatterns Option 2: make data files depend on stats.py ⋮ data-1-1.dat : stats.py touch $@ data-1-2.dat : stats.py touch $@ ⋮ A false dependency Updating raw data files triggers update of summary
38
Automated BuildsPatterns Option 2: make data files depend on stats.py ⋮ data-1-1.dat : stats.py touch $@ data-1-2.dat : stats.py touch $@ ⋮ A false dependency Updating raw data files triggers update of summary Back to listing all raw data files explicitly…
39
Automated BuildsPatterns paper.pdf : paper.wdp figure-1.svg figure-2.svg wdp2pdf $< figure-1.svg : summary-1.dat sgr -N -r $@ $^ figure-2.svg : summary-2.dat sgr -N -r $@ $^ summary-1.dat : data-1-*.dat stats.py $@ $^ summary-2.dat : data-2-*.dat stats.py $@ $^ summary-1.dat : stats.py summary-2.dat : stats.py Option 3: add additional dependencies
40
Automated BuildsPatterns ⋮ summary-1.dat : data-1-*.dat stats.py $@ $^ summary-2.dat : data-2-*.dat stats.py $@ $^ summary-1.dat : stats.py summary-2.dat : stats.py ⋮ Option 3: add additional dependencies Full set of dependencies is union of lists
41
Automated BuildsPatterns ⋮ summary-1.dat : data-1-*.dat stats.py $@ $^ summary-2.dat : data-2-*.dat stats.py $@ $^ summary-1.dat : stats.py summary-2.dat : stats.py ⋮ Option 3: add additional dependencies Full set of dependencies is union of lists But $^ in the action is still just data-1-*.dat
42
August 2010 created by Greg Wilson Copyright © Software Carpentry 2010 This work is licensed under the Creative Commons Attribution License See http://software-carpentry.org/license.html for more information.
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.