Something to start with

Daniel Jacobowitz drow at false.org
Fri Jun 13 04:19:25 UTC 2003


OK, folks, I know you're out there :)

Here are three tidbits to consider:

 - Because 2.57 still has the deprecated support for not cross compiling
when $build = $host, we can get by in a partial per-directory conversion
without needing any magic at the top level at all.  I did gas to prove the
point.

 -  Alex prefers we arrange to pass the right arguments to 2.5x-ized
subdirectories.  This is a simple piece of makefile trickery.  Anyone care
to do it?

 - I also did libiberty.  I have not tested a combined tree cygwin build
yet, which needs to happen, since it exercises the relevant hard case.  I
also reimplemented AC_NO_EXECUTABLES based on another of Alexandre's
suggestions, which proved quite good: disable link tests at runtime if
GCC_NO_EXECUTABLES is encountered, rather than at autoconf time if it is
seen in the file.

I've attached the patch for libiberty in case someone wants to give it a
whirl before I do, in more combinations.  I'm testing eight kinds of builds
right now and I'll have a few more before I'm satisfied, but I won't have
time to work on this for a day or two, so I wanted to give the list a kick.

Oh, if you try the patch be sure to invoke the right autoconf.  I forgot to
bump AC_PREREQ, so distributions with autoconf wrappers are likely to pick
2.13 instead.

-- 
Daniel Jacobowitz
MontaVista Software                         Debian GNU/Linux Developer

2003-06-13  Daniel Jacobowitz  <drow at mvista.com>

	* no-executables.m4: New file.

2003-06-13  Daniel Jacobowitz  <drow at mvista.com>

	* aclocal.m4: Include no-executables.m4.  Use AC_LIBOBJ.  Remove
	LIB_AC_PROG_CC.
	* configure.in: Use GCC_NO_EXECUTABLES and AC_PROG_CC instead of
	LIB_AC_PROG_CC.  Also substitue ac_libiberty_warn_cflags here.
	Use AC_LIBOBJ.  Remove AC_PROG_CC_WORKS call.
	* configure: Regenerate using autoconf 2.57.

Index: config/no-executables.m4
===================================================================
RCS file: config/no-executables.m4
diff -N config/no-executables.m4
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ config/no-executables.m4	13 Jun 2003 03:59:34 -0000
@@ -0,0 +1,49 @@
+# GCC_NO_EXECUTABLES
+# -----------------
+# FIXME: The GCC team has specific needs which the current Autoconf
+# framework cannot solve elegantly.  This macro implements a dirty
+# hack until Autoconf is abble to provide the services its users
+# needs.
+#
+# Several of the support libraries that are often built with GCC can't
+# assume the tool-chain is already capable of linking a program: the
+# compiler often expects to be able to link with some of such
+# libraries.
+#
+# In several of these libraries, workarounds have been introduced to
+# avoid the AC_PROG_CC_WORKS test, that would just abort their
+# configuration.  The introduction of AC_EXEEXT, enabled either by
+# libtool or by CVS autoconf, have just made matters worse.
+#
+# Unlike the previous AC_NO_EXECUTABLES, this test does not
+# disable link tests at autoconf time, but at configure time.
+# This allows AC_NO_EXECUTABLES to be invoked conditionally.
+AC_DEFUN_ONCE([GCC_NO_EXECUTABLES],
+[m4_divert_push([KILL])
+
+AC_BEFORE([$0], [_AC_COMPILER_EXEEXT])
+AC_BEFORE([$0], [AC_LINK_IFELSE])
+
+m4_define([_AC_COMPILER_EXEEXT],
+AC_LANG_CONFTEST([AC_LANG_PROGRAM()])
+# FIXME: Cleanup?
+AS_IF([AC_TRY_EVAL(ac_link)], [gcc_no_link=no], [gcc_no_link=yes])
+if test x$gcc_no_link = xyes; then
+  # Setting cross_compile will disable run tests; it will
+  # also disable AC_CHECK_FILE but that's generally
+  # correct if we can't link.
+  cross_compiling=yes
+  EXEEXT=
+else
+  m4_defn([_AC_COMPILER_EXEEXT])dnl
+fi
+)
+
+m4_define([AC_LINK_IFELSE],
+if test x$gcc_no_link = xyes; then
+  AC_MSG_ERROR([Link tests are not allowed after [[$0]].])
+fi
+m4_defn([AC_LINK_IFELSE]))
+
+m4_divert_pop()dnl
+])# GCC_NO_EXECUTABLES
Index: libiberty/aclocal.m4
===================================================================
RCS file: /big/fsf/rsync/gcc-cvs/gcc/libiberty/aclocal.m4,v
retrieving revision 1.7
diff -u -p -r1.7 aclocal.m4
--- libiberty/aclocal.m4	7 May 2003 18:06:53 -0000	1.7
+++ libiberty/aclocal.m4	13 Jun 2003 04:04:55 -0000
@@ -1,4 +1,5 @@
 sinclude(../config/accross.m4)
+sinclude(../config/no-executables.m4)
 
 dnl See whether strncmp reads past the end of its string parameters.
 dnl On some versions of SunOS4 at least, strncmp reads a word at a time
@@ -71,7 +72,7 @@ main ()
   ac_cv_func_strncmp_works=no)
 rm -f core core.* *.core])
 if test $ac_cv_func_strncmp_works = no ; then
-  LIBOBJS="$LIBOBJS strncmp.o"
+  AC_LIBOBJ([strncmp])
 fi
 ])
 
@@ -117,48 +118,6 @@ if test $libiberty_cv_decl_needed_$1 = y
             [Define if $1 is not declared in system header files.])
 fi
 ])dnl
-
-# FIXME: We temporarily define our own version of AC_PROG_CC.  This is
-# copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS.  We
-# are probably using a cross compiler, which will not be able to fully
-# link an executable.  This should really be fixed in autoconf
-# itself.
-
-AC_DEFUN(LIB_AC_PROG_CC,
-[AC_BEFORE([$0], [AC_PROG_CPP])dnl
-AC_PROVIDE([AC_PROG_CC])
-AC_CHECK_PROG(CC, gcc, gcc)
-if test -z "$CC"; then
-  AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc)
-  test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH])
-fi
-
-AC_PROG_CC_GNU
-
-if test $ac_cv_prog_gcc = yes; then
-  GCC=yes
-  ac_libiberty_warn_cflags='-W -Wall -Wtraditional -pedantic'
-dnl Check whether -g works, even if CFLAGS is set, in case the package
-dnl plays around with CFLAGS (such as to build both debugging and
-dnl normal versions of a library), tasteless as that idea is.
-  ac_test_CFLAGS="${CFLAGS+set}"
-  ac_save_CFLAGS="$CFLAGS"
-  CFLAGS=
-  AC_PROG_CC_G
-  if test "$ac_test_CFLAGS" = set; then
-    CFLAGS="$ac_save_CFLAGS"
-  elif test $ac_cv_prog_cc_g = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-O2"
-  fi
-else
-  GCC=
-  ac_libiberty_warn_cflags=
-  test "${CFLAGS+set}" = set || CFLAGS="-g"
-fi
-AC_SUBST(ac_libiberty_warn_cflags)
-])
 
 # Work around a bug in autoheader.  This can go away when we switch to
 # autoconf >2.50.  The use of define instead of AC_DEFUN is
Index: libiberty/configure.in
===================================================================
RCS file: /big/fsf/rsync/gcc-cvs/gcc/libiberty/configure.in,v
retrieving revision 1.69
diff -u -p -r1.69 configure.in
--- libiberty/configure.in	9 Jun 2003 05:20:02 -0000	1.69
+++ libiberty/configure.in	13 Jun 2003 04:04:14 -0000
@@ -99,7 +99,13 @@ dnl to call AC_CHECK_PROG.
 AC_CHECK_TOOL(AR, ar)
 AC_CHECK_TOOL(RANLIB, ranlib, :)
 
-LIB_AC_PROG_CC
+GCC_NO_EXECUTABLES
+AC_PROG_CC
+
+if test x$GCC = xyes; then
+  ac_libiberty_warn_cflags='-W -Wall -Wtraditional -pedantic'
+fi
+AC_SUBST(ac_libiberty_warn_cflags)
 
 AC_PROG_CC_C_O
 # autoconf is lame and doesn't give us any substitution variable for this.
@@ -250,7 +256,12 @@ if test -n "${with_target_subdir}"; then
   # newlib provide and which ones we will be expected to provide.
 
   if test "x${with_newlib}" = "xyes"; then
-    LIBOBJS="asprintf.o basename.o insque.o random.o strdup.o vasprintf.o"
+    AC_LIBOBJ([asprintf])
+    AC_LIBOBJ([basename])
+    AC_LIBOBJ([insque])
+    AC_LIBOBJ([random])
+    AC_LIBOBJ([strdup])
+    AC_LIBOBJ([vasprintf])
 
     for f in $funcs; do
       case "$f" in
@@ -318,8 +329,16 @@ if test -z "${setobjs}"; then
     # Handle VxWorks configuration specially, since on VxWorks the
     # libraries are actually on the target board, not in the file
     # system.
-    LIBOBJS="basename.o getpagesize.o insque.o random.o strcasecmp.o"
-    LIBOBJS="$LIBOBJS strncasecmp.o strdup.o vfork.o waitpid.o vasprintf.o"
+    AC_LIBOBJ([basename])
+    AC_LIBOBJ([getpagesize])
+    AC_LIBOBJ([insque])
+    AC_LIBOBJ([random])
+    AC_LIBOBJ([strcasecmp])
+    AC_LIBOBJ([strncasecmp])
+    AC_LIBOBJ([strdup])
+    AC_LIBOBJ([vfork])
+    AC_LIBOBJ([waitpid])
+    AC_LIBOBJ([vasprintf])
     for f in $funcs; do
       case "$f" in
 	basename | getpagesize | insque | random | strcasecmp)
@@ -366,7 +385,7 @@ if test -z "${setobjs}"; then
     if test -n "${with_target_subdir}"
     then
       funcs="`echo $funcs | sed -e 's/random//'`"
-      LIBOBJS="$LIBOBJS random.o"
+      AC_LIBOBJ([random])
       vars="`echo $vars | sed -e 's/sys_siglist//'`"
       checkfuncs="`echo $checkfuncs | sed -e 's/strsignal//' -e 's/psignal//'`"
     fi
@@ -402,12 +421,11 @@ if test -z "${setobjs}"; then
 
   # We haven't set the list of objects yet.  Use the standard autoconf
   # tests.  This will only work if the compiler works.
-  AC_PROG_CC_WORKS
   AC_REPLACE_FUNCS($funcs)
   libiberty_AC_FUNC_C_ALLOCA
   AC_FUNC_VFORK
   if test $ac_cv_func_vfork_works = no; then
-    LIBOBJS="$LIBOBJS vfork.o"
+    AC_LIBOBJ([vfork])
   fi
   # We only need _doprnt if we might use it to implement v*printf.
   if test $ac_cv_func_vprintf != yes \



More information about the autoconf-conversion mailing list