Jim Meyering wrote: > It is inaccurate and uncharitable to call that automake work > short-sighted. The problem is that development on that front seems to > have stalled. Since that part of automake is incomplete, if you don't > know the history, I can see how you would think it short-sighted.
OK, I withdraw the word "short-sighted". I don't know much about how automake evolved. > However, that change breaks coreutils' build-from-bootstrap process: > > doc/Makefile.am:21: installing `build-aux/texinfo.tex' > lib/gnulib.mk:21: automatically discovered file `alloca.c' should not be > explicitly mentioned > lib/Makefile.am:20: `lib/gnulib.mk' included from here > lib/gnulib.mk:21: automatically discovered file `error.c' should not be > explicitly mentioned > lib/Makefile.am:20: `lib/gnulib.mk' included from here > lib/gnulib.mk:21: automatically discovered file `lstat.c' should not be > explicitly mentioned > lib/Makefile.am:20: `lib/gnulib.mk' included from here > lib/gnulib.mk:21: automatically discovered file `obstack.c' should not be > explicitly mentioned > lib/Makefile.am:20: `lib/gnulib.mk' included from here These are apparently triggered by the use of $(LIBOBJS) in coreutils' lib/Makefile.am. Although it is a bit uncommon to combine pieces of gnulib and different pieces from outside gnulib in the same library, I think gnulib-tool should support this. 3 among the 4 errors go away with the following gnulib-tool patch. 2006-11-13 Bruno Haible <[EMAIL PROTECTED]> * gnulib-tool (func_emit_initmacro_start): Also override AC_LIBSOURCES. (func_emit_initmacro_end): Undo the override here. (func_emit_initmacro_done): Emit a definition for gl_LIBSOURCES. Works around the famous automake error in coreutils. diff -c -3 -r1.194 gnulib-tool *** gnulib-tool 13 Nov 2006 12:35:41 -0000 1.194 --- gnulib-tool 13 Nov 2006 18:38:44 -0000 *************** *** 1394,1401 **** --- 1394,1415 ---- # - macro_prefix prefix of gl_EARLY, gl_INIT macros to use func_emit_initmacro_start () { + # Overriding AC_LIBOBJ and AC_REPLACE_FUNCS has the effect of storing + # platform-dependent object files in ${macro_prefix}_LIBOBJS instead of + # LIBOBJS. The purpose is to allow several gnulib instantiations under + # a single configure.ac file. (AC_CONFIG_LIBOBJ_DIR does not allow this + # flexibility.) + # Furthermore it avoids an automake error like this when a Makefile.am + # that uses pieces of gnulib also uses $(LIBOBJ): + # automatically discovered file `error.c' should not be explicitly mentioned echo " m4_pushdef([AC_LIBOBJ], m4_defn([${macro_prefix}_LIBOBJ]))" echo " m4_pushdef([AC_REPLACE_FUNCS], m4_defn([${macro_prefix}_REPLACE_FUNCS]))" + # Overriding AC_LIBSOURCES has the same purpose of avoiding the automake + # error when a Makefile.am that uses pieces of gnulib also uses $(LIBOBJ): + # automatically discovered file `error.c' should not be explicitly mentioned + # We let automake know about the files to be distributed through the + # EXTRA_lib_SOURCES variable. + echo " m4_pushdef([AC_LIBSOURCES], m4_defn([${macro_prefix}_LIBSOURCES]))" } # func_emit_initmacro_end *************** *** 1403,1408 **** --- 1417,1423 ---- # - macro_prefix prefix of gl_EARLY, gl_INIT macros to use func_emit_initmacro_end () { + echo " m4_popdef([AC_LIBSOURCES])" echo " m4_popdef([AC_REPLACE_FUNCS])" echo " m4_popdef([AC_LIBOBJ])" echo " AC_CONFIG_COMMANDS_PRE([" *************** *** 1436,1441 **** --- 1451,1461 ---- echo "# into ${macro_prefix}_LIBOBJS instead of into LIBOBJS." echo "AC_DEFUN([${macro_prefix}_REPLACE_FUNCS]," echo " [AC_CHECK_FUNCS([\$1], , [${macro_prefix}_LIBOBJ(\$ac_func)])])" + echo + echo "# Like AC_LIBSOURCES, except that it does nothing." + echo "# We rely on EXTRA_lib..._SOURCES instead." + echo "AC_DEFUN([${macro_prefix}_LIBSOURCES]," + echo " [])" } # func_import modules The remaining error, regarding lstat.c, is because coreutils/m4/root-dev-ino.m4 invokes AC_FUNC_LSTAT from outside the gnulib scope, but it is also invoked from inside the gnulib scope. (I.e. lstat.o will end up in both LIBOBJS and gl_LIBOBJS.) This situation can not be well supported in gnulib-tool. A workaround I found for this is appended: to move the gnulib-like stuff "into the gnulib scope". It is a bit hairy; alternatively you can use a gnulib-local-dir to ensure that all calls to AC_FUNC_LSTAT come from inside the gnulib scope. Bruno diff -c -3 -r1.132 prereq.m4 *** m4/prereq.m4 21 Aug 2006 07:30:47 -0000 1.132 --- m4/prereq.m4 13 Nov 2006 18:33:03 -0000 *************** *** 35,40 **** --- 35,50 ---- # We don't use c-stack.c. # AC_REQUIRE([gl_C_STACK]) + # The lib/Makefile.am compiles both LIBOBJS from autoconf and gl_LIBOBJS + # from gnulib. Where they overlap, automake signals an error: + # "automatically discovered file `lstat.c' should not be explicitly mentioned". + # The pushdefs here move the object file from LIBOBJS to gl_LIBOBJS and, as a + # side effect, make the automake error go away. + m4_pushdef([AC_LIBOBJ], m4_defn([gl_LIBOBJ])) + m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gl_REPLACE_FUNCS])) + # Do *not* override AC_LIBSOURCES here, otherwise "make dist" will fail to + # distribute all files. + # Invoke macros of modules that may migrate into gnulib. # There's no need to list gnulib modules here, since gnulib-tool # handles that; see ../bootstrap.conf. *************** *** 50,53 **** --- 60,66 ---- AC_REQUIRE([gl_SHA512]) AC_REQUIRE([gl_STRINTCMP]) AC_REQUIRE([gl_STRNUMCMP]) + + m4_popdef([AC_REPLACE_FUNCS]) + m4_popdef([AC_LIBOBJ]) ])