libtool/m4/ltsugar.m4

116 lines
3.9 KiB
Plaintext
Raw Normal View History

A complete rewrite of the m4 code involved in the generation of libtool via config.status. The old way involved manually synchronising disparate bits of shell code in several macros, to quote a copy of a shell variable, put that in config.status, maybe add it to some quotation loops to prevent early expansion, and then add a block to _LT_CONFIG_COMMANDS to bring it into the libtool script. The new way is to mark shell variables for propogation using _LT_DECL for language independent variables, or _LT_TAGDECL for those that need to be propogated in several language flavours. The marking can be done in the macro that probes the variables, and this new m4 machinery takes care of synchronising all the other bits of code at autoconf time: * m4/ltsugar.m4: New file. Macros that are useful outside the context of libtool. Initially, contains some generalised list management macros, and the scaffolding for dictionary type data storage and retrieval. * Makefile.am (aclocal_macros): Install ltsugar.m4. * m4/libtool.m4 (_LT_DECL): Mark a shell variable for export to the libtool script, along with a comment, and hints for quoting and renaming. (_LT_TAGDECL): Similarly mark a tagged shell variable for export in each tag. (lt_decl_tag_varnames, lt_decl_quote_varnames) (lt_decl_dquote_varnames, lt_decl_varnames_tagged) (lt_decl_all_varnames): New utility macros for managing lists of shell variable names from _LT_DECL and _LT_TAGDECL. (_LT_CONFIG_STATUS_DECLARATIONS, _LT_CONFIG_STATUS_DECLARE): Expand to correctly quoted variable declarations in config.status from all marked shell variables. (_LT_LIBTOOL_DECLARE): Expand to commented and quoted variable declaration for libtool tag section. (_LT_LIBTOOL_CONFIG_VARS, _LT_LIBTOOL_TAG_VARS): Pass all marked variables to _LT_LIBTOOL_DECLARE. (_LT_CONFIG_COMMANDS): Use _LT_CONFIG_STATUS_DECLARATIONS and friends to generate all the variable passing shell code for config.status, to get marked variables from libtool.m4 into libtool itself eventually. (AC_LIBTOOL_CONFIG): Generate marked variable code for libtool tag configuration. Changed all client macros to mark variables suitably rather than the hand pasting that was necessary previously. (AC_PROG_SED): Renamed from LT_AC_PROG_SED. (LT_AC_PROG_SED): Wrap AC_PROG_SED, and mark shell variables for propogation to the libtool script.
2004-01-07 20:26:25 +08:00
# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*-
#
# Copyright (C) 2004 Free Software Foundation, Inc.
# Written by Gary V. Vaughan.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
# serial 1
A complete rewrite of the m4 code involved in the generation of libtool via config.status. The old way involved manually synchronising disparate bits of shell code in several macros, to quote a copy of a shell variable, put that in config.status, maybe add it to some quotation loops to prevent early expansion, and then add a block to _LT_CONFIG_COMMANDS to bring it into the libtool script. The new way is to mark shell variables for propogation using _LT_DECL for language independent variables, or _LT_TAGDECL for those that need to be propogated in several language flavours. The marking can be done in the macro that probes the variables, and this new m4 machinery takes care of synchronising all the other bits of code at autoconf time: * m4/ltsugar.m4: New file. Macros that are useful outside the context of libtool. Initially, contains some generalised list management macros, and the scaffolding for dictionary type data storage and retrieval. * Makefile.am (aclocal_macros): Install ltsugar.m4. * m4/libtool.m4 (_LT_DECL): Mark a shell variable for export to the libtool script, along with a comment, and hints for quoting and renaming. (_LT_TAGDECL): Similarly mark a tagged shell variable for export in each tag. (lt_decl_tag_varnames, lt_decl_quote_varnames) (lt_decl_dquote_varnames, lt_decl_varnames_tagged) (lt_decl_all_varnames): New utility macros for managing lists of shell variable names from _LT_DECL and _LT_TAGDECL. (_LT_CONFIG_STATUS_DECLARATIONS, _LT_CONFIG_STATUS_DECLARE): Expand to correctly quoted variable declarations in config.status from all marked shell variables. (_LT_LIBTOOL_DECLARE): Expand to commented and quoted variable declaration for libtool tag section. (_LT_LIBTOOL_CONFIG_VARS, _LT_LIBTOOL_TAG_VARS): Pass all marked variables to _LT_LIBTOOL_DECLARE. (_LT_CONFIG_COMMANDS): Use _LT_CONFIG_STATUS_DECLARATIONS and friends to generate all the variable passing shell code for config.status, to get marked variables from libtool.m4 into libtool itself eventually. (AC_LIBTOOL_CONFIG): Generate marked variable code for libtool tag configuration. Changed all client macros to mark variables suitably rather than the hand pasting that was necessary previously. (AC_PROG_SED): Renamed from LT_AC_PROG_SED. (LT_AC_PROG_SED): Wrap AC_PROG_SED, and mark shell variables for propogation to the libtool script.
2004-01-07 20:26:25 +08:00
# This is to help aclocal find these macros, as it can't see m4_define.
AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
# lt_join(SEP, ARG1, [ARG2...])
# -----------------------------
# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
# associated separator.
m4_define([lt_join],
[m4_case([$#],
[0], [m4_fatal([$0: too few arguments: $#])],
[1], [],
[2], [[$2]],
[m4_ifval([$2],
[m4_ifval([$3],
[[$2][$1][]$0([$1], m4_shiftn(2, $@))],
[m4_if([$#], [3],
[$2],
[$0([$1], [$2], m4_shiftn(3, $@))])])],
[$0([$1], m4_shiftn(2, $@))])])[]dnl
])
# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
# ----------------------------------------------------------
# Produce a SEP delimited list of all paired combinations of elements of
# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list
# has the form PREFIXmINFIXSUFFIXn.
m4_define([lt_combine],
[m4_if([$2], [[]], [],
[lt_join(m4_quote(m4_default([$1], [, ])),
_$0([$1], m4_car($2)[$3], m4_shiftn(3, $@)),
$0([$1], m4_cdr($2), m4_shiftn(2, $@)))])])
m4_define([_lt_combine],
[m4_if([$3], [], [],
[lt_join(m4_quote(m4_default([$1], [, ])),
[$2$3],
$0([$1], [$2], m4_shiftn(3, $@)))])[]dnl
])
# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
# -----------------------------------------------------------------------
# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
m4_define([lt_if_append_uniq],
[m4_ifdef([$1],
[m4_bmatch($3[]m4_defn([$1])$3, $3[]m4_re_escape([$2])$3,
[$5],
[m4_append([$1], [$2], [$3])$4])],
[m4_append([$1], [$2], [$3])$4])])
# lt_dict_add(DICT, KEY, VALUE)
# -----------------------------
m4_define([lt_dict_add],
[m4_define([$1($2)], [$4])])
# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
# --------------------------------------------
m4_define([lt_dict_add_subkey],
[m4_define([$1($2:$3)], [$4])])
# lt_dict_fetch(DICT, KEY, [SUBKEY])
# ----------------------------------
m4_define([lt_dict_fetch],
[m4_ifval([$3],
m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
# -----------------------------------------------------------------
m4_define([lt_if_dict_fetch],
[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
[$5],
[$6])])
# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
# ------------------------------------------------------------
m4_define([lt_dict_filter],
[m4_if([$5], [], [],
[lt_join(m4_quote(m4_default([$4], [[, ]])),
m4_quote(lt_if_dict_fetch([$1], [$5], [$2], [$3], [$5])),
m4_quote($0([$1], [$2], [$3], [$4], m4_shiftn(5, $@))))])dnl
])