-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 [reviving an old thread, replies can probably drop bug-autoconf]
According to Noah Misch on 6/23/2007 8:54 PM: >> On 23 Jun 2007, at 06:25, Eric Blake wrote: >>>> My system has a /usr/bison/m4 and a /usr/bin/gm4, but no >>>> /usr/local/bin/gm4, because later version of M4 odes not install it. > > >>> The current algorithm is in autoconf's m4/m4.m4: >>> AC_PATH_PROGS([M4], [gm4 gnum4 m4], [m4]) >>> AC_CACHE_CHECK([whether m4 supports accurate traces], >>> ... >>> >>> In other words, during configuration, autoconf finds the first >>> program on >>> your PATH named gm4, gnum4, and then m4, which also meets the minimum >>> requirements of m4 1.4.5 or later. If you have suggestions for a >>> better >>> algorithm, we'd like to know about it. > > This sounds like a fine algorithm, but it not the one that the above code > implements. Rather, the code finds the first program so-named and checks > whether that one program meets the version requirement. It does not continue > the search upon rejecting a candidate. The attached patch implements the above algorithm. However, before I apply it, I wonder if it is time to make a documented public macro that makes this idiom kosher, rather than using an internal macro. Note that _AC_PATH_PROG_FEATURE_CHECK already has a bug in its current usage in programs.m4 - it is currently only used by AC_PROG_GREP and AC_PROG_SED, both of which invoke it inside AC_CACHE_CHECK. Therefore, its attempt to do AC_SUBST([$1]) is useless - if you run ./configure -C with the program variable unset, the first run will set the variable, but the second run will leave it unset. Fortunately, both AC_PROG_GREP and AC_PROG_SED (and my patch below) work around this bug, by re-calling AC_SUBST(variable) after the cache context ends. I'm thinking a public macro should look like: # AC_PATH_PROG_FEATURE_CHECK(VARIABLE, PROGNAME-LIST, MSG, # FEATURE-TEST, [PATH=$PATH]) # -------------------------------------------------------- # Cache a search for a program, using MSG as in AC_CACHE_CHECK. # If VARIABLE is set, use it without any questions. Otherwise, # call FEATURE_TEST repeatedly with $ac_path_VARIABLE set to the # name of a program in PROGNAME-LIST found in PATH. FEATURE-TEST # must set $ac_cv_path_VARIABLE to the path of an acceptable # program, or else _AC_PATH_PROG_FEATURE_CHECK will report that # no acceptable program was found, and abort. If a suitable # $ac_path_VARIABLE is found in the FEATURE-TEST macro, it can # set $ac_path_VARIABLE_found=':' to accept that value without # any further checks. On success, VARIABLE will contain the # final program found, and will be AC_SUBST'd. 2007-08-30 Eric Blake <[EMAIL PROTECTED]> Improve M4 path searching during configure. * m4/m4.m4 (AC_PROG_GNU_M4): Don't stop searching until working m4 is found. Make M4 precious. * configure.ac (M4): AC_PROG_GNU_M4 now exits on failure. * configure: Regenerate. - -- Don't work too hard, make some time for fun as well! Eric Blake [EMAIL PROTECTED] -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.5 (Cygwin) Comment: Public key at home.comcast.net/~ericblake/eblake.gpg Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFG2A5/84KuGfSFAYARAi3WAJ4hU7/TcjMNn7VE/cLDSb1UGvBqdACgvZh1 3G8fHlH2RZaZTjztaLLqfFE= =57RH -----END PGP SIGNATURE-----
Index: configure.ac =================================================================== RCS file: /sources/autoconf/autoconf/configure.ac,v retrieving revision 1.89 diff -u -p -r1.89 configure.ac --- configure.ac 20 Jul 2007 23:11:50 -0000 1.89 +++ configure.ac 31 Aug 2007 12:46:30 -0000 @@ -79,12 +79,9 @@ AC_PATH_PROG([EXPR], [expr]) # We use an absolute name for GNU m4 so even if users have another m4 first in # their path, the installer can configure with a path that has GNU m4 -# first and get that path embedded in the installed autoconf and +# on it and get that path embedded in the installed autoconf and # autoheader scripts. AC_PROG_GNU_M4 -if test x"$ac_cv_prog_gnu_m4" != xyes; then - AC_MSG_ERROR([GNU M4 1.4.5 or later is required; 1.4.8 is recommended]) -fi ## ----------- ## ## Man pages. ## Index: m4/m4.m4 =================================================================== RCS file: /sources/autoconf/autoconf/m4/m4.m4,v retrieving revision 1.7 diff -u -p -r1.7 m4.m4 --- m4/m4.m4 2 Feb 2007 14:07:38 -0000 1.7 +++ m4/m4.m4 31 Aug 2007 12:46:30 -0000 @@ -1,4 +1,4 @@ -# m4.m4 serial 3 +# m4.m4 serial 4 dnl Copyright (C) 2000, 2006, 2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -12,20 +12,19 @@ dnl with or without modifications, as lo # Also, check whether --error-output (through 1.4.x) or --debugfile (2.0) # is supported, and AC_SUBST M4_DEBUGFILE accordingly. AC_DEFUN([AC_PROG_GNU_M4], -[AC_PATH_PROGS([M4], [gm4 gnum4 m4], [m4]) -AC_CACHE_CHECK([whether m4 supports accurate traces], [ac_cv_prog_gnu_m4], -[ac_cv_prog_gnu_m4=no -dnl Creative quoting here to avoid raw dnl and ifdef in configure. -if test x"$M4" != x \ - && test -z "`echo if'def(mac,bug)d'nl | $M4 --trace=mac 2>&1`" ; then - ac_cv_prog_gnu_m4=yes -fi]) -if test $ac_cv_prog_gnu_m4 = yes ; then + [AC_ARG_VAR([M4], [Location of GNU M4 1.4.5 or later. Defaults to the first + program of `m4', `gm4', or `gnum4' on PATH that meets Autoconf needs.]) + AC_CACHE_CHECK([for GNU M4 that supports accurate traces], [ac_cv_path_M4], + [dnl FIXME _AC_PATH_PROG_FEATURE_CHECK should be made public + _AC_PATH_PROG_FEATURE_CHECK([M4], [m4 gm4 gnum4], + [dnl Creative quoting here to avoid raw dnl and ifdef in configure. + test -z "`echo if'def(mac,bug)d'nl | $ac_path_M4 --trace=mac 2>&1`" \ + && ac_cv_path_M4=$ac_path_M4 ac_path_M4_found=:])]) + M4=$ac_cv_path_M4 AC_CACHE_CHECK([how m4 supports trace files], [ac_cv_prog_gnu_m4_debugfile], - [case `$M4 --help < /dev/null 2>&1` in - *debugfile*) ac_cv_prog_gnu_m4_debugfile=--debugfile ;; - *) ac_cv_prog_gnu_m4_debugfile=--error-output ;; - esac]) - AC_SUBST([M4_DEBUGFILE], $ac_cv_prog_gnu_m4_debugfile) -fi + [case `$M4 --help < /dev/null 2>&1` in + *debugfile*) ac_cv_prog_gnu_m4_debugfile=--debugfile ;; + *) ac_cv_prog_gnu_m4_debugfile=--error-output ;; + esac]) + AC_SUBST([M4_DEBUGFILE], [$ac_cv_prog_gnu_m4_debugfile]) ])