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

File: make.info,  Node: Command Variables,  Next: DESTDIR,  Prev: Utilities in Makefiles,  Up: Makefile Conventions

16.3 Variables for Specifying Commands
======================================

Makefiles should provide variables for overriding certain commands,
options, and so on.

   In particular, you should run most utility programs via variables.
Thus, if you use Bison, have a variable named 'BISON' whose default
value is set with 'BISON = bison', and refer to it with '$(BISON)'
whenever you need to use Bison.

   File management utilities such as 'ln', 'rm', 'mv', and so on, need
not be referred to through variables in this way, since users don't need
to replace them with other programs.

   Each program-name variable should come with an options variable that
is used to supply options to the program.  Append 'FLAGS' to the
program-name variable name to get the options variable name--for
example, 'BISONFLAGS'.  (The names 'CFLAGS' for the C compiler, 'YFLAGS'
for yacc, and 'LFLAGS' for lex, are exceptions to this rule, but we keep
them because they are standard.)  Use 'CPPFLAGS' in any compilation
command that runs the preprocessor, and use 'LDFLAGS' in any compilation
command that does linking as well as in any direct use of 'ld'.

   If there are C compiler options that _must_ be used for proper
compilation of certain files, do not include them in 'CFLAGS'.  Users
expect to be able to specify 'CFLAGS' freely themselves.  Instead,
arrange to pass the necessary options to the C compiler independently of
'CFLAGS', by writing them explicitly in the compilation commands or by
defining an implicit rule, like this:

     CFLAGS = -g
     ALL_CFLAGS = -I. $(CFLAGS)
     .c.o:
             $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $<

   Do include the '-g' option in 'CFLAGS', because that is not
_required_ for proper compilation.  You can consider it a default that
is only recommended.  If the package is set up so that it is compiled
with GCC by default, then you might as well include '-O' in the default
value of 'CFLAGS' as well.

   Put 'CFLAGS' last in the compilation command, after other variables
containing compiler options, so the user can use 'CFLAGS' to override
the others.

   'CFLAGS' should be used in every invocation of the C compiler, both
those which do compilation and those which do linking.

   Every Makefile should define the variable 'INSTALL', which is the
basic command for installing a file into the system.

   Every Makefile should also define the variables 'INSTALL_PROGRAM' and
'INSTALL_DATA'.  (The default for 'INSTALL_PROGRAM' should be
'$(INSTALL)'; the default for 'INSTALL_DATA' should be '${INSTALL} -m
644'.)  Then it should use those variables as the commands for actual
installation, for executables and non-executables respectively.  Minimal
use of these variables is as follows:

     $(INSTALL_PROGRAM) foo $(bindir)/foo
     $(INSTALL_DATA) libfoo.a $(libdir)/libfoo.a

   However, it is preferable to support a 'DESTDIR' prefix on the target
files, as explained in the next section.

   It is acceptable, but not required, to install multiple files in one
command, with the final argument being a directory, as in:

     $(INSTALL_PROGRAM) foo bar baz $(bindir)

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