OverviewTeaching: 15 min
Exercises: 15 minQuestions
How can I eliminate redundancy in my Makefiles?Objectives
Use variables in a Makefile.
Explain the benefits of decoupling configuration from computation.
Despite our efforts, our Makefile still has repeated content, namely
the name of our script,
wordcount.py. If we renamed our script we’d
have to update our Makefile in multiple places.
This is a variable assignment -
COUNT_SRC is assigned the value
wordcount.py is our script and it is invoked by passing it to
python. We can introduce another variable to represent this
$(...) tells Make to replace a variable with its value when Make
is run. This is a variable reference. At
any place where we want to use the value of a variable we have to
write it, or reference it, in this way.
Here we reference the variable
COUNT_SRC. This tells Make to
replace the variable
COUNT_SRC with its value
Make is run it will assign to
COUNT_EXE the value
Defining the variable
COUNT_EXE in this way allows us to easily
change how our script is run (if, for example, we changed the language
used to implement our script from Python to R).
Makefileso that the
%.datrule references the variables
COUNT_EXE. Then do the same for the
zipf-test.pyscript and the
ZIPF_EXEas variable names
This Makefile contains a solution to this challenge.
We place variables at the top of a Makefile so they are easy to
find and modify. Alternatively, we can pull them out into a new
file that just holds variable definitions (i.e. delete them from
the original makefile). Let us create
# Count words script. COUNT_SRC=wordcount.py COUNT_EXE=python $(COUNT_SRC) # Test Zipf's rule ZIPF_SRC=zipf_test.py ZIPF_EXE=python $(ZIPF_SRC)
We can then import
We can re-run Make to see that everything still works:
$ make clean $ make dats $ make results.txt
We have separated the configuration of our Makefile from its rules,
the parts that do all the work. If we want to change our script name
or how it is executed we just need to edit our configuration file, not
our source code in
Makefile. Decoupling code from configuration in
this way is good programming practice, as it promotes more modular,
flexible and reusable code.
Where We Are
Define variables by assigning values to names.
Reference variables using