Variables
Last updated on 2023-04-24 | Edit this page
Overview
Questions
- 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, i.e.
the name of our script – countwords.py
, and the program we
use to run it – python
. If we renamed our script we’d have
to update our Makefile in multiple places.
We can introduce a Make variable (called a macro in some versions of Make) to hold our script name:
COUNT_SRC=countwords.py
This is a variable assignment
- COUNT_SRC
is assigned the value
countwords.py
.
We can do the same thing with the interpreter language used to run the script:
LANGUAGE=python
$(...)
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 variables LANGUAGE
and
COUNT_SRC
. This tells Make to replace the variable
LANGUAGE
with its value python
, and to replace
the variable COUNT_SRC
with its value
countwords.py
.
Defining the variable LANGUAGE
in this way avoids
repeating python
in our Makefile, and allows us to easily
change how our script is run (e.g. we might want to use a different
version of Python and need to change python
to
python2
– or we might want to rewrite the script using
another language (e.g. switch from Python to R)).
Use Variables
Update Makefile
so that the %.dat
rule
references the variable COUNT_SRC
. Then do the same for the
testzipf.py
script and the results.txt
rule,
using ZIPF_SRC
as the variable name.
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 config.mk
:
# Count words script.
LANGUAGE=python
COUNT_SRC=countwords.py
# Test Zipf's rule
ZIPF_SRC=testzipf.py
We can then import config.mk
into Makefile
using:
include config.mk
We can re-run Make to see that everything still works:
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
This Makefile and its accompanying
config.mk
contain all of our work so far.
Key Points
- Define variables by assigning values to names.
- Reference variables using
$(...)
.