Occasionally we want to disable automatic variable definitions of AC_SUBSTitutions. Two cases were already hardcoded into automake (AMDEPBACKSLASH and ANSI2KNR). I had been considering adding such a feature since Autoconf introduced multiline AC_SUBSTitutions. Now I think Ralf's suggestion in PR/477 makes it even more relevant.
Any thought ? 2005-10-17 Alexandre Duret-Lutz <[EMAIL PROTECTED]> * automake.in (%ignored_configure_vars): New variable. (scan_autoconf_traces): Scan for AM_SUBST_IGNORE_TRACE and fill %ignored_configure_vars. (define_configure_variable): Declare ignored configure variables as VAR_SILENT. Do not special-case AMDEPBACKSLASH and ANSI2KNR w.r.t. VAR_SILENT. * doc/automake.texi (Optional): Document AM_SUBST_IGNORE. * m4/substign.m4: New file. * m4/Makefile.am (dist_m4data_DATA): Add substign.m4. * m4/cond.m4: AM_SUBST_IGNORE $1_TRUE and $1_FALSE (PR automake/477). * m4/depend.m4: AM_SUBST_IGNORE AMDEPBACKSLASH. * m4/protos.m4: AM_SUBST_IGNORE ANSI2KNR. * tests/cond.test: Make sure TEST_FALSE and TEST_TRUE are not defined. Index: NEWS =================================================================== RCS file: /cvs/automake/automake/NEWS,v retrieving revision 1.300 diff -u -r1.300 NEWS --- NEWS 14 May 2005 20:28:50 -0000 1.300 +++ NEWS 17 Oct 2005 20:35:43 -0000 @@ -89,6 +89,10 @@ $(LIBOBJS), $(LTLIBOBJS), $(ALLOCA), and $(LTALLOCA) can be used in different directories. + - New macro: AM_SUBST_IGNORE. It works like AC_SUBST, except Automake + will not produce a `VAR = @VAR@' definition in Makefile.in. This comes + handy when @VAR@ ends with a backslash, contains multiple lines, or + if the definition simply bloats the Makefile.in. New in 1.9: Index: automake.in =================================================================== RCS file: /cvs/automake/automake/automake.in,v retrieving revision 1.1613 diff -u -r1.1613 automake.in --- automake.in 3 Oct 2005 20:52:27 -0000 1.1613 +++ automake.in 17 Oct 2005 20:35:44 -0000 @@ -390,6 +390,10 @@ # generation. my %configure_vars = (); +# Ignored configure substitutions (i.e., variables not to be output in +# Makefile.in) +my %ignored_configure_vars = (); + # Files included by $configure_ac. my @configure_deps = (); @@ -4771,6 +4775,7 @@ AM_INIT_AUTOMAKE => 0, AM_MAINTAINER_MODE => 0, AM_PROG_CC_C_O => 0, + AM_SUBST_IGNORE_TRACE => 1, LT_SUPPORTED_TAG => 1, _LT_AC_TAGCONFIG => 0, m4_include => 1, @@ -4882,6 +4887,12 @@ { $libsources{$args[1]} = $here; } + elsif ($macro eq 'AC_REQUIRE_AUX_FILE') + { + # Only remember the first time a file is required. + $required_aux_file{$args[1]} = $where + unless exists $required_aux_file{$args[1]}; + } elsif ($macro eq 'AC_SUBST_TRACE') { # Just check for alphanumeric in AC_SUBST_TRACE. If you do @@ -4939,11 +4950,9 @@ { $seen_cc_c_o = $where; } - elsif ($macro eq 'AC_REQUIRE_AUX_FILE') + elsif ($macro eq 'AM_SUBST_IGNORE_TRACE') { - # Only remember the first time a file is required. - $required_aux_file{$args[1]} = $where - unless exists $required_aux_file{$args[1]}; + $ignored_configure_vars{$args[1]} = $where; } elsif ($macro eq 'm4_include' || $macro eq 'm4_sinclude' @@ -5835,16 +5844,16 @@ my $pretty = VAR_ASIS; my $owner = VAR_CONFIGURE; - # Do not output the ANSI2KNR configure variable -- we AC_SUBST - # it in protos.m4, but later redefine it elsewhere. This is - # pretty hacky. We also don't output AMDEPBACKSLASH: it might - # be subst'd by `\', which certainly would not be appreciated by - # Make. - if ($var eq 'ANSI2KNR' || $var eq 'AMDEPBACKSLASH') - { - $pretty = VAR_SILENT; - $owner = VAR_AUTOMAKE; - } + # Some variables we do not want to output. For instance it + # would be a bad idea to output `U = @[EMAIL PROTECTED] when [EMAIL PROTECTED]@` can be + # substituted as `\`. + $pretty = VAR_SILENT if exists $ignored_configure_vars{$var}; + + # ANSI2KNR is a variable that Automake wants to redefine, so + # it must be owned by Automake. (It is also used as a proof + # that AM_C_PROTOTYPES has been run, that's why we do not simply + # omit the AC_SUBST.) + $owner = VAR_AUTOMAKE if $var eq 'ANSI2KNR'; Automake::Variable::define ($var, $owner, '', TRUE, subst $var, '', $configure_vars{$var}, $pretty); Index: doc/automake.texi =================================================================== RCS file: /cvs/automake/automake/doc/automake.texi,v retrieving revision 1.122 diff -u -r1.122 automake.texi --- doc/automake.texi 13 Sep 2005 23:14:55 -0000 1.122 +++ doc/automake.texi 17 Oct 2005 20:35:45 -0000 @@ -1588,6 +1588,9 @@ you can use these variables in any @file{Makefile.am} if @code{AC_PATH_XTRA} is called. [EMAIL PROTECTED] (see below) can be used to declare +substitutions that should not be defined as @file{Makefile} variables. + @item AM_C_PROTOTYPES This is required when using automatic de-ANSI-fication; see @ref{ANSI}. @@ -1606,6 +1609,16 @@ @code{MAINTAINER_MODE} conditional, which you can use in your own @file{Makefile.am}. @xref{maintainer-mode}. [EMAIL PROTECTED] AM_SUBST_IGNORE +This is similar to and uses the same syntax as @code{AC_SUBST} (see +above), except @command{automake} will not output a definition of the +variable in any @file{Makefile.in} it produces. + +It is occasionally necessary to let Automake ignore some substitutions +that are not meant to be used as @file{Makefile} variables. For +instance values that are terminated by a backslash would cause syntax +error is they were defined as @file{Makefile} variables. + @item m4_include Files included by @file{configure.ac} using this macro will be detected by Automake and automatically distributed. They will also Index: m4/Makefile.am =================================================================== RCS file: /cvs/automake/automake/m4/Makefile.am,v retrieving revision 1.54 diff -u -r1.54 Makefile.am --- m4/Makefile.am 14 May 2005 20:28:53 -0000 1.54 +++ m4/Makefile.am 17 Oct 2005 20:35:45 -0000 @@ -2,7 +2,7 @@ ## Makefile for Automake m4. -## Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004 +## Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005 ## Free Software Foundation, Inc. ## This program is free software; you can redistribute it and/or modify @@ -54,6 +54,7 @@ runlog.m4 \ sanity.m4 \ strip.m4 \ +substign.m4 \ tar.m4 EXTRA_DIST = dirlist amversion.in Index: m4/cond.m4 =================================================================== RCS file: /cvs/automake/automake/m4/cond.m4,v retrieving revision 1.13 diff -u -r1.13 cond.m4 --- m4/cond.m4 9 Jan 2005 14:46:21 -0000 1.13 +++ m4/cond.m4 17 Oct 2005 20:35:45 -0000 @@ -16,8 +16,8 @@ [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl -AC_SUBST([$1_TRUE]) -AC_SUBST([$1_FALSE]) +AM_SUBST_IGNORE([$1_TRUE]) +AM_SUBST_IGNORE([$1_FALSE]) if $2; then $1_TRUE= $1_FALSE='#' Index: m4/depend.m4 =================================================================== RCS file: /cvs/automake/automake/m4/depend.m4,v retrieving revision 1.35 diff -u -r1.35 depend.m4 --- m4/depend.m4 9 Jan 2005 14:46:21 -0000 1.35 +++ m4/depend.m4 17 Oct 2005 20:35:45 -0000 @@ -152,5 +152,5 @@ AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -AC_SUBST([AMDEPBACKSLASH]) +AM_SUBST_IGNORE([AMDEPBACKSLASH]) ]) Index: m4/protos.m4 =================================================================== RCS file: /cvs/automake/automake/m4/protos.m4,v retrieving revision 1.11 diff -u -r1.11 protos.m4 --- m4/protos.m4 9 Jan 2005 14:46:21 -0000 1.11 +++ m4/protos.m4 17 Oct 2005 20:35:45 -0000 @@ -20,9 +20,9 @@ fi # Ensure some checks needed by ansi2knr itself. AC_REQUIRE([AC_HEADER_STDC]) -AC_CHECK_HEADERS(string.h) -AC_SUBST(U)dnl -AC_SUBST(ANSI2KNR)dnl +AC_CHECK_HEADERS([string.h]) +AC_SUBST([U])dnl +AM_SUBST_IGNORE([ANSI2KNR])dnl ]) AU_DEFUN([fp_C_PROTOTYPES], [AM_C_PROTOTYPES]) Index: m4/substign.m4 =================================================================== RCS file: m4/substign.m4 diff -N m4/substign.m4 --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ m4/substign.m4 17 Oct 2005 20:35:45 -0000 @@ -0,0 +1,22 @@ +## -*- Autoconf -*- +# Copyright (C) 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SUBST_IGNORE(VARIABLE, [VALUE]) +# ---------------------------------- +# AC_SUBST the VARIABLE, but do not output +# VARIABLE = @VARIABLE@ in Makefile.in. +AC_DEFUN([AM_SUBST_IGNORE], +[AC_SUBST($@)dnl +AM_SUBST_IGNORE_TRACE([$1])]) + +# AM_SUBST_IGNORE_TRACE(VARIABLE) +# ------------------------------- +# Prevent Automake from outputing VARIABLE = @VARIABLE@ in Makefile.in. +# Making this macro distinct from AM_SUBST_IGNORE makes it possible to +# ignore variables that have been AC_SUBST_TRACEd without being AC_SUBSTed, +# should we ever have to do that. +AC_DEFUN([AM_SUBST_IGNORE_TRACE]) Index: tests/cond.test =================================================================== RCS file: /cvs/automake/automake/tests/cond.test,v retrieving revision 1.8 diff -u -r1.8 cond.test --- tests/cond.test 14 May 2005 20:28:54 -0000 1.8 +++ tests/cond.test 17 Oct 2005 20:35:45 -0000 @@ -1,5 +1,5 @@ #! /bin/sh -# Copyright (C) 1997, 2001, 2002 Free Software Foundation, Inc. +# Copyright (C) 1997, 2001, 2002, 2005 Free Software Foundation, Inc. # # This file is part of GNU Automake. # @@ -22,6 +22,8 @@ . ./defs || exit 1 +set -e + cat > configure.in << 'END' AC_INIT AM_INIT_AUTOMAKE(nonesuch, nonesuch) @@ -37,11 +39,10 @@ endif END -set -e -$ACLOCAL || exit 1 +$ACLOCAL $AUTOMAKE +grep '^TEST_FALSE' Makefile.in && exit 1 +grep '^TEST_TRUE' Makefile.in && exit 1 grep '[EMAIL PROTECTED]@VAR = true$' Makefile.in grep '[EMAIL PROTECTED]@VAR = false$' Makefile.in - -exit 0 -- Alexandre Duret-Lutz Shared books are happy books. http://www.bookcrossing.com/friend/gadl