manpagez: man pages & more
info autoconf
Home | html | info | man

File: autoconf.info,  Node: Macros and Submakes,  Next: The Make Macro MAKEFLAGS,  Prev: Long Lines in Makefiles,  Up: Portable Make

12.7 ‘make macro=value’ and Submakes
====================================

A command-line variable definition such as ‘foo=bar’ overrides any
definition of ‘foo’ in a makefile.  Some ‘make’ implementations (such as
GNU ‘make’) propagate this override to subsidiary invocations of ‘make’.
Some other implementations do not pass the substitution along to
submakes.

     $ cat Makefile
     foo = foo
     one:
             @echo $(foo)
             $(MAKE) two
     two:
             @echo $(foo)
     $ make foo=bar            # GNU make 3.79.1
     bar
     make two
     make[1]: Entering directory `/home/adl'
     bar
     make[1]: Leaving directory `/home/adl'
     $ pmake foo=bar           # BSD make
     bar
     pmake two
     foo

   You have a few possibilities if you do want the ‘foo=bar’ override to
propagate to submakes.  One is to use the ‘-e’ option, which causes all
environment variables to have precedence over the makefile macro
definitions, and declare foo as an environment variable:

     $ env foo=bar make -e

   The ‘-e’ option is propagated to submakes automatically, and since
the environment is inherited between ‘make’ invocations, the ‘foo’ macro
is overridden in submakes as expected.

   This syntax (‘foo=bar make -e’) is portable only when used outside of
a makefile, for instance from a script or from the command line.  When
run inside a ‘make’ rule, GNU ‘make’ 3.80 and prior versions forget to
propagate the ‘-e’ option to submakes.

   Moreover, using ‘-e’ could have unexpected side effects if your
environment contains some other macros usually defined by the makefile.
(See also the note about ‘make -e’ and ‘SHELL’ below.)

   If you can foresee all macros that a user might want to override,
then you can propagate them to submakes manually, from your makefile:

     foo = foo
     one:
             @echo $(foo)
             $(MAKE) foo=$(foo) two
     two:
             @echo $(foo)

   Another way to propagate a variable to submakes in a portable way is
to expand an extra variable in every invocation of ‘$(MAKE)’ within your
makefile:

     foo = foo
     one:
             @echo $(foo)
             $(MAKE) $(SUBMAKEFLAGS) two
     two:
             @echo $(foo)

   Users must be aware that this technique is in use to take advantage
of it, e.g. with ‘make foo=bar SUBMAKEFLAGS='foo=bar'’, but it allows
any macro to be overridden.  Makefiles generated by ‘automake’ use this
technique, expanding ‘$(AM_MAKEFLAGS)’ on the command lines of submakes
(*note Automake: (automake)Subdirectories.).

© manpagez.com 2000-2025
Individual documents may contain additional copyright information.