Variable values of the top-level
make can be passed to the
make through the environment by explicit request. These
variables are defined in the sub-
make as defaults, but do not
override what is specified in the makefile used by the sub-
makefile unless you use the ‘-e’ switch (see Summary of Options).
To pass down, or export, a variable,
make adds the
variable and its value to the environment for running each line of the
recipe. The sub-
make, in turn, uses the environment to
initialize its table of variable values. See Variables from the Environment.
Except by explicit request,
make exports a variable only if it
is either defined in the environment initially or set on the command
line, and if its name consists only of letters, numbers, and underscores.
Some shells cannot cope with environment variable names consisting of
characters other than letters, numbers, and underscores.
The value of the
SHELL is not exported.
Instead, the value of the
SHELL variable from the invoking
environment is passed to the sub-
make. You can force
make to export its value for
SHELL by using the
export directive, described below. See Choosing the Shell.
The special variable
MAKEFLAGS is always exported (unless you
MAKEFILES is exported if you set it to anything.
make automatically passes down variable values that were defined
on the command line, by putting them in the
Variables are not normally passed down if they were created by
make (see Variables Used by Implicit Rules). The sub-
make will define these for
If you want to export specific variables to a sub-
make, use the
export directive, like this:
export variable ...
If you want to prevent a variable from being exported, use the
unexport directive, like this:
unexport variable ...
In both of these forms, the arguments to
unexport are expanded, and so could be variables or functions
which expand to a (list of) variable names to be (un)exported.
As a convenience, you can define a variable and export it at the same time by doing:
export variable = value
has the same result as:
variable = value export variable
export variable := value
has the same result as:
variable := value export variable
export variable += value
is just like:
variable += value export variable
See Appending More Text to Variables.
You may notice that the
make in the same way they work in the shell,
If you want all variables to be exported by default, you can use
export by itself:
make that variables which are not explicitly mentioned
unexport directive should be exported.
Any variable given in an
unexport directive will still not
be exported. If you use
export by itself to export variables by
default, variables whose names contain characters other than
alphanumerics and underscores will not be exported unless specifically
mentioned in an
The behavior elicited by an
export directive by itself was the
default in older versions of GNU
make. If your makefiles depend
on this behavior and you want to be compatible with old versions of
make, you can write a rule for the special target
.EXPORT_ALL_VARIABLES instead of using the
This will be ignored by old
makes, while the
directive will cause a syntax error.
Likewise, you can use
unexport by itself to tell
not to export variables by default. Since this is the default
behavior, you would only need to do this if
export had been used
by itself earlier (in an included makefile, perhaps). You
unexport by themselves to
have variables exported for some recipes and not for others. The last
unexport directive that appears by itself
determines the behavior for the entire run of
As a special feature, the variable
MAKELEVEL is changed when it
is passed down from level to level. This variable's value is a string
which is the depth of the level as a decimal number. The value is
‘0’ for the top-level
make; ‘1’ for a sub-
‘2’ for a sub-sub-
make, and so on. The incrementation
make sets up the environment for a recipe.
The main use of
MAKELEVEL is to test it in a conditional
directive (see Conditional Parts of Makefiles); this
way you can write a makefile that behaves one way if run recursively and
another way if run directly by you.
You can use the variable
MAKEFILES to cause all sub-
commands to use additional makefiles. The value of
a whitespace-separated list of file names. This variable, if defined in
the outer-level makefile, is passed down through the environment; then
it serves as a list of extra makefiles for the sub-
make to read
before the usual or specified ones. See The Variable