Blob Blame History Raw
# ===========================================================================
#    http://www.gnu.org/software/autoconf-archive/ax_am_override_var.html
# ===========================================================================
#
# SYNOPSIS
#
#   AX_AM_OVERRIDE_VAR([varname1 varname ... ])
#   AX_AM_OVERRIDE_FINALIZE
#
# DESCRIPTION
#
#   This autoconf macro generalizes the approach given in
#   <http://lists.gnu.org/archive/html/automake/2005-09/msg00108.html> which
#   moves user specified values for variable 'varname' given at configure
#   time into the corresponding AM_${varname} variable and clears out
#   'varname', allowing further manipulation by the configure script so that
#   target specific variables can be given specialized versions.  'varname
#   may still be specified on the make command line and will be appended as
#   usual.
#
#   As an example usage, consider a project which might benefit from
#   different compiler flags for different components. Typically this is
#   done via target specific flags, e.g.
#
#    libgtest_la_CXXFLAGS    =                        \
#                     -I $(top_srcdir)/tests          \
#                     -I $(top_builddir)/tests        \
#                     $(GTEST_CXXFLAGS)
#
#   automake will automatically append $(CXXFLAGS) -- provided by the user
#   -- to the build rule for libgtest_la.  That might be problematic, as
#   CXXFLAGS may contain compiler options which are inappropriate for
#   libgtest_la.
#
#   The approach laid out in the referenced mailing list message is to
#   supply a base value for a variable during _configure_ time, during which
#   it is possible to amend it for specific targets. The user may
#   subsequently specify a value for the variable during _build_ time, which
#   make will apply (via the standard automake rules) to all appropriate
#   targets.
#
#   For example,
#
#    AX_AM_OVERRIDE_VAR([CXXFLAGS])
#
#   will store the value of CXXFLAGS specified at configure time into the
#   AM_CXXFLAGS variable, AC_SUBST it, and clear CXXFLAGS. configure may
#   then create a target specific set of flags based upon AM_CXXFLAGS, e.g.
#
#    # googletest uses variadic macros, which g++ -pedantic-errors
#    # is very unhappy about
#    AC_SUBST([GTEST_CXXFLAGS],
#       [`AS_ECHO_N(["$AM_CXXFLAGS"]) \
#             | sed s/-pedantic-errors/-pedantic/`
#        ]
#     )
#
#   which would be used in a Makefile.am as above.  Since CXXFLAGS is
#   cleared, the configure time value will not affect the build for
#   libgtest_la.
#
#   Prior to _any other command_ which may set ${varname}, call
#
#    AX_AM_OVERRIDE_VAR([varname])
#
#   This will preserve the value (if any) passed to configure in
#   AM_${varname} and AC_SUBST([AM_${varname}).  You may pass a space
#   separated list of variable names, or may call AX_AM_OVERRIDE_VAR
#   multiple times for the same effect.
#
#   If any subsequent configure commands set ${varname} and you wish to
#   capture the resultant value into AM_${varname} in the case where
#   ${varname} was _not_ provided at configure time,  call
#
#    AX_AM_OVERRIDE_FINALIZE
#
#   after _all_ commands which might affect any of the variables specified
#   in calls to AX_AM_OVERRIDE_VAR.  This need be done only once, but
#   repeated calls will not cause harm.
#
#   There is a bit of trickery required to allow further manipulation of the
#   AM_${varname} in a Makefile.am file.  If AM_CFLAGS is used as is in a
#   Makefile.am, e.g.
#
#    libfoo_la_CFLAGS = $(AM_CFLAGS)
#
#   then automake will emit code in Makefile.in which sets AM_CFLAGS from
#   the configure'd value.
#
#   If however, AM_CFLAGS is manipulated (i.e. appended to), you will have
#   to explicitly arrange for the configure'd value to be substituted:
#
#    AM_CFLAGS = @AM_CFLAGS@
#    AM_CFLAGS += -lfoo
#
#   or else automake will complain about using += before =.
#
# LICENSE
#
#   Copyright (c) 2013 Smithsonian Astrophysical Observatory
#   Copyright (c) 2013 Diab Jerius <djerius@cfa.harvard.edu>
#
#   Copying and distribution of this file, with or without modification, are
#   permitted in any medium without royalty provided the copyright notice
#   and this notice are preserved. This file is offered as-is, without any
#   warranty.

#serial 1

AC_DEFUN([_AX_AM_OVERRIDE_INITIALIZE],
[
        m4_define([_mst_am_override_vars],[])
])


# _AX_AM_OVERRIDE_VAR(varname)
AC_DEFUN([_AX_AM_OVERRIDE_VAR],
[
  m4_define([_mst_am_override_vars], m4_defn([_mst_am_override_vars]) $1 )
  _mst_am_override_$1_set=false

  AS_IF( [test "${$1+set}" = set],
         [AC_SUBST([AM_$1],["$$1"])
          $1=
          _mst_am_override_$1_set=:
         ]
  )
]) # _AX_AM_OVERRIDE_VAR

# _AX_AM_OVERRIDE_FINALIZE(varname)
AC_DEFUN([_AX_AM_OVERRIDE_FINALIZE],
[
  AS_IF([$_mst_am_override_$1_set = :],
        [],
        [AC_SUBST([AM_$1],["$$1"])
         $1=
         _mst_am_override_$1_set=
        ]
  )
  AC_SUBST($1)
]) # _AX_AM_OVERRIDE_FINALIZE

AC_DEFUN([AX_AM_OVERRIDE_VAR],
[
  AC_REQUIRE([_AX_AM_OVERRIDE_INITIALIZE])
  m4_map_args_w([$1],[_AX_AM_OVERRIDE_VAR(],[)])
])# AX_OVERRIDE_VAR


# AX_AM_OVERRIDE_FINALIZE
AC_DEFUN([AX_AM_OVERRIDE_FINALIZE],
[
  AC_REQUIRE([_AX_AM_OVERRIDE_INITIALIZE])
  m4_map_args_w(_mst_am_override_vars,[_AX_AM_OVERRIDE_FINALIZE(],[)])
]) # AX_AM_OVERRIDE_FINALIZE