The library interface again

H.J. Lu hjl@lucon.org
Fri Jul 17 14:03:00 GMT 1998


I hope it can go into egcs 1.1. It will solve many problems with
chaning ABI/API.

Thanks.

-- 
H.J. Lu (hjl@gnu.org)
----
Sat Jun 27 19:06:04 1998  H.J. Lu  (hjl@gnu.org)

	* configure (gxx_include_dir): Changed to
	'${prefix}/include/g++'-${libstdcxx_interface}.

	* config.if: New to determine the interfaces.

--- ../../import/egcs/configure	Wed Jul 15 08:04:51 1998
+++ ./configure	Wed Jul 15 08:37:51 1998
@@ -1244,7 +1244,8 @@
 	        if test x${enable_version_specific_runtime_libs} = xyes; then
 		    echo gxx_include_dir = '${libsubdir}/include/g++' >> ${Makefile}
 		else
-		    echo gxx_include_dir = '${prefix}/include/g++' >> ${Makefile}
+		    . ${topsrcdir}/config.if
+		    echo gxx_include_dir = '${prefix}/include/g++'-${libstdcxx_interface} >> ${Makefile}
 		fi
 	    else
 		echo gxx_include_dir = ${with_gxx_include_dir} >> ${Makefile}
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ config.if	Fri Jul 17 07:52:15 1998
@@ -0,0 +1,79 @@
+#! /dev/null
+# Don't call it directly. This shell script fragment is called to
+# determine:
+#
+#	1. libstcxx_interface: the interface name for libstdc++.
+#	2. cxx_interface: the interface name for c++.
+#	3. libc_interface: the interface name for libc.
+#
+
+# Get the top level src dir.
+if [ -z "${topsrcdir}" -a -z "${top_srcdir}" ]
+then
+  echo "Undefined top level src dir: topsrcdir and top_srcdir are empty" >&2
+  exit 1
+fi
+
+if [ -n "${topsrcdir}" ]
+then
+  if_topsrcdir=${topsrcdir}
+else
+  if_topsrcdir=${top_srcdir}
+fi
+
+# We check libstdc++ for libstdcxx_interface.
+libstdcxx_interface=`grep "^INTERFACE" ${if_topsrcdir}/libstdc++/Makefile.in | sed 's/INTERFACE[ 	]*=[ 	]*\(.*\)/\1/'`
+
+# We check gcc/cp for cxx_interface.
+cxx_interface=`grep "^INTERFACE" ${if_topsrcdir}/gcc/cp/Makefile.in | sed 's/INTERFACE[ 	]*=[ 	]*\(.*\)/\1/'`
+
+# The trickiest part is libc_interface.
+if [ -z "${libc_interface}" ]
+then
+  case ${target_os} in
+  *linux*libc1*|*linux*libc5*)
+    case ${target_alias} in
+    *alpha*|*powerpc*)
+      libc_interface=-libc5.9-
+      ;;
+    *)
+      libc_interface=-libc5-
+      ;;
+    esac
+    ;;
+  *linux*gnu*)
+    # We have to work harder to figure it out.
+    if [ ${target_alias} = ${build_alias} ]
+    then
+      dummy=if$$
+      cat >$dummy.c <<EOF
+#include <features.h>                      
+main(argc, argv)
+     int argc;          
+     char *argv[];
+{
+  printf("%d\n", __GLIBC_MINOR__);
+  return 0;
+}
+EOF
+      ${CC-cc} $dummy.c -o $dummy 2>/dev/null
+      if [ "$?" = 0 ]
+      then
+	libc_interface=-libc6.`./$dummy`-
+	rm -f $dummy.c $dummy
+      else
+	# It should never happen.
+	echo "Cannot find the GNU C library minor version number." >&2
+	rm -f $dummy.c $dummy
+	exit 1
+      fi
+    else
+      # Cross compiling. Assume glibc 2.1.
+      libc_interface=-libc6.1-
+    fi
+    ;;
+  *)
+    libc_interface=-
+    ;;
+  esac
+fi
Sat Jun 27 19:09:29 1998  H.J. Lu  (hjl@gnu.org)

	* configure.in (gxx_include_dir): Changed to
	'${prefix}/include/g++'-${libstdcxx_interface}.

--- ../../import/egcs/gcc/configure.in	Wed Jul 15 08:04:58 1998
+++ gcc/configure.in	Wed Jul 15 08:37:51 1998
@@ -73,7 +73,10 @@
 gxx_include_dir=$with_gxx_include_dir,
 if test x${enable_version_specific_runtime_libs} = xyes; then
 gxx_include_dir='${libsubdir}/include/g++'
-else gxx_include_dir='${prefix}/include/g++'; fi)
+else
+  topsrcdir=${srcdir}/.. . ${srcdir}/../config.if
+  gxx_include_dir='${prefix}/include/g++'-${libstdcxx_interface}
+fi)
 
 # Enable expensive internal checks
 AC_ARG_ENABLE(checking,
Sat Jun 27 19:09:29 1998  H.J. Lu  (hjl@gnu.org)

	* Makefile.in (INTERFACE): New, set to 1.

Index: gcc/cp/Makefile.in
===================================================================
RCS file: /home/work/cvs/gnu/egcs/gcc/cp/Makefile.in,v
retrieving revision 1.1.1.21
diff -u -r1.1.1.21 Makefile.in
--- gcc/cp/Makefile.in	1998/06/27 15:38:09	1.1.1.21
+++ gcc/cp/Makefile.in	1998/06/27 23:49:06
@@ -34,6 +34,10 @@
 # Suppress smart makes who think they know how to automake Yacc files
 .y.c:
 
+# It defines the c++ interface name. It should be changed when the
+# c++ interface is changed.
+INTERFACE = 1
+
 # Variables that exist for you to override.
 # See below for how to change them for certain systems.
 

Sat Jun 27 19:09:29 1998  H.J. Lu  (hjl@gnu.org)

	* config.shared: Set libsubdir.

Index: libio/config.shared
===================================================================
RCS file: /home/work/cvs/gnu/egcs/libio/config.shared,v
retrieving revision 1.1.1.12
diff -u -r1.1.1.12 config.shared
--- libio/config.shared	1998/06/26 18:18:51	1.1.1.12
+++ libio/config.shared	1998/06/27 23:49:06
@@ -79,6 +79,7 @@
 
 echo 'bindir = $(exec_prefix)/bin'
 echo 'libdir = $(exec_prefix)/lib'
+echo 'libsubdir = $(libdir)/gcc-lib/$(target_alias)/$(gcc_version)'
 
 echo 'datadir = $(prefix)/lib'
 echo 'mandir = $(prefix)/man'

Sat Jun 27 19:13:53 1998  H.J. Lu  (hjl@gnu.org)

	* Makefile.in (INTERFACE): New, set to 2.
	(ARLIB): Set to libstdc++.a.$(VERSION)
	(ARLINK, MARLINK): New macros.
	(LIBS): Add $(ARLINK).
	($(ARLINK), marlink): New targets.
	(install): Don't check $(libsubdir). Handle versioned libraries.

	* config/linux.ml (ARLIB, MARLINK, SHLIB, MSHLINK): New macros.
	(LIBS): Add marlink $(ARLINK).

	* config/aix.ml (ARLIB): Set to libstdc++-ar.a.$(VERSION)
	(ARLINK): New macros.
	(BUILD_LIBS): Add $(ARLINK).

	* config/dec-osf.ml (LIBS): Add $(ARLINK).
	* config/elf.ml (LIBS): Likewise.
	* config/elfshlibm.ml (LIBS): Likewise.
	* config/hpux.ml (LIBS): Likewise.
	* config/iris5.ml (LIBS): Likewise.
	* config/sol2shm.ml (LIBS): Likewise.
	* config/sunos4.ml (LIBS): Likewise.

	* configure.in: Use ${topsrcdir}/config.if to put
	LIBSTDCXX_INTERFACE, CXX_INTERFACE, LIBC_INTERFACE in
	${package_makefile_frag}.

Index: libstdc++/Makefile.in
===================================================================
RCS file: /home/work/cvs/gnu/egcs/libstdc++/Makefile.in,v
retrieving revision 1.1.1.12
diff -u -r1.1.1.12 Makefile.in
--- libstdc++/Makefile.in	1998/06/24 16:47:29	1.1.1.12
+++ libstdc++/Makefile.in	1998/06/28 01:48:02
@@ -15,6 +15,7 @@
 # Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 VERSION = 2.9.0
+INTERFACE = 2
 
 OBJS  = cstringi.o stdexcepti.o cstdlibi.o cmathi.o stlinst.o
 SUBLIBS = $(STAMP)-string $(STAMP)-complx
@@ -27,7 +28,9 @@
 	 memory numeric pthread_alloc queue rope set slist stack utility \
 	 vector fstream iomanip iostream strstream iosfwd
 
-ARLIB   = libstdc++.a
+ARLIB   = libstdc++.a.$(VERSION)
+ARLINK  = libstdc++.a
+MARLINK = libstdc++.a.`echo $(VERSION) | sed 's/\([0-9][.][0-9]\).*/\1/'`
 SHLIB   = libstdc++.so.$(VERSION)
 SHARLIB = libstdc++-sh.a
 SHLINK  = libstdc++.so
@@ -37,7 +40,7 @@
 
 STAMP   = bigstmp
 
-LIBS    = $(ARLIB)
+LIBS    = $(ARLIB) $(ARLINK)
 
 #### package, host, target, and site dependent Makefile fragments come in here.
 ##
@@ -89,6 +92,12 @@
 	mv t$(ARLIB) $(ARLIB)
 	$(RANLIB) $(ARLIB)
 
+$(ARLINK):
+	ln -f -s $(ARLIB) $(ARLINK)
+
+marlink:
+	@$(MAKE) $(MARLINK) "ARLINK=$(MARLINK)"
+
 $(SHLIB): piclist
 	$(CC) $(LIBCXXFLAGS) $(SHFLAGS) -shared -o $(SHLIB) `cat piclist` $(SHDEPS)
 
@@ -274,20 +283,37 @@
 	else true ; \
 	fi
 	rootme=`pwd`/ ; export rootme ; \
-	if [ x$(libsubdir) = x ] || [ x$(enable_version_specific_runtime_libs) != xyes ]; then \
+	if [ x$(enable_version_specific_runtime_libs) != xyes ]; then \
 	  INSTALLDIR=$(libdir); \
 	else \
 	  INSTALLDIR=$(libsubdir); \
 	fi; \
-	rm -f $${INSTALLDIR}$(MULTISUBDIR)/$(SHLINK) ; \
+	INSTALLLINKDIR=$(libsubdir); \
+	rm -f $${INSTALLLINKDIR}$(MULTISUBDIR)/$(SHLINK) ; \
+	rm -f $${INSTALLLINKDIR}$(MULTISUBDIR)/$(ARLINK) ; \
 	for FILE in $(LIBS) ; do \
 	  rm -f $${INSTALLDIR}$(MULTISUBDIR)/$$FILE ; \
 	  if [ $$FILE = $(SHLINK) ] ; then \
-	    ln -f -s $(SHLIB) $${INSTALLDIR}$(MULTISUBDIR)/$$FILE ; \
+	    if [ -f $${INSTALLDIR}/$(MSHLINK) ]; then \
+	      ln -f -s $${INSTALLDIR}/$(MSHLINK) $${INSTALLLINKDIR}$(MULTISUBDIR)/$$FILE ; \
+	    else \
+	      ln -f -s $${INSTALLDIR}/$(SHLIB) $${INSTALLLINKDIR}$(MULTISUBDIR)/$$FILE ; \
+	    fi; \
+	  elif [ $$FILE = $(ARLINK) ] ; then \
+	    if [ -f $${INSTALLDIR}/$(MARLINK) ]; then \
+	      ln -f -s $${INSTALLDIR}/$(MARLINK) $${INSTALLLINKDIR}$(MULTISUBDIR)/$$FILE ; \
+	    else \
+	      ln -f -s $${INSTALLDIR}/$(ARLIB) $${INSTALLLINKDIR}$(MULTISUBDIR)/$$FILE ; \
+	    fi; \
 	  elif [ $$FILE = mshlink ]; then \
 	    for FILE in $(MSHLINK) ; do \
 	      rm -f $${INSTALLDIR}$(MULTISUBDIR)/$$FILE ; \
 	      ln -f -s $(SHLIB) $${INSTALLDIR}$(MULTISUBDIR)/$$FILE ; \
+	    done; \
+	  elif [ $$FILE = marlink ]; then \
+	    for FILE in $(MARLINK) ; do \
+	      rm -f $${INSTALLDIR}$(MULTISUBDIR)/$$FILE ; \
+	      ln -f -s $(ARLIB) $${INSTALLDIR}$(MULTISUBDIR)/$$FILE ; \
 	    done; \
 	  elif [ $$FILE = $(SHLIB) ]; then \
 	    $(INSTALL_PROGRAM) $$FILE $${INSTALLDIR}$(MULTISUBDIR)/$$FILE ; \
Index: libstdc++/configure.in
===================================================================
RCS file: /home/work/cvs/gnu/egcs/libstdc++/configure.in,v
retrieving revision 1.1.1.7
diff -u -r1.1.1.7 configure.in
--- libstdc++/configure.in	1998/03/05 21:00:21	1.1.1.7
+++ libstdc++/configure.in	1998/06/27 23:49:06
@@ -94,6 +94,13 @@
 
 (. ${srcdir}/${TO_TOPDIR}libio/config.shared) >${package_makefile_frag} 2>${package_makefile_rules_frag}
 
+. ${topsrcdir}/config.if
+echo "
+LIBSTDCXX_INTERFACE=${libstdcxx_interface}
+CXX_INTERFACE=${cxx_interface}
+LIBC_INTERFACE=${libc_interface}
+" >> ${package_makefile_frag}
+
 # post-target:
 
 # If cross-compiling, we install in $(tooldir).
Index: libstdc++/config/aix.ml
===================================================================
RCS file: /home/work/cvs/gnu/egcs/libstdc++/config/aix.ml,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 aix.ml
--- libstdc++/config/aix.ml	1997/08/26 00:21:28	1.1.1.1
+++ libstdc++/config/aix.ml	1998/06/28 01:51:17
@@ -1,8 +1,9 @@
 # AIX has wierd shared/non-shared libraries.
 
-ARLIB	 = libstdc++-ar.a 
+ARLIB	 = libstdc++-ar.a.$(VERSION)
+ARLINK	 = libstdc++-ar.a
 SHLINK   = libstdc++.a
-LIBS     = $(ARLIB) $(SHLIB) $(SHLINK)
+LIBS     = $(ARLIB) $(ARLINK) $(SHLIB) $(SHLINK)
 DEPLIBS  = ../$(SHLIB)
 SHDEPS   = -lm
 SHFLAGS  = -Wl,-unix
Index: libstdc++/config/dec-osf.ml
===================================================================
RCS file: /home/work/cvs/gnu/egcs/libstdc++/config/dec-osf.ml,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 dec-osf.ml
--- libstdc++/config/dec-osf.ml	1997/08/26 00:21:28	1.1.1.1
+++ libstdc++/config/dec-osf.ml	1998/06/28 01:51:22
@@ -1,6 +1,6 @@
 # We don't need -fpic on the alpha, so let's install both the shared and
 # non-shared versions.
 
-LIBS     = $(ARLIB) $(SHLIB) $(SHLINK)
+LIBS     = $(ARLIB) $(ARLINK) $(SHLIB) $(SHLINK)
 DEPLIBS  = ../$(SHLIB)
 SHDEPS   = -lm
Index: libstdc++/config/elf.ml
===================================================================
RCS file: /home/work/cvs/gnu/egcs/libstdc++/config/elf.ml,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 elf.ml
--- libstdc++/config/elf.ml	1997/08/26 00:21:28	1.1.1.1
+++ libstdc++/config/elf.ml	1998/06/28 01:51:26
@@ -1,7 +1,7 @@
 # Elf without shared libm -- we have to link with the archive library, even
 # for programs that don't use complex.
 
-LIBS    = $(ARLIB) $(SHLIB) $(SHLINK)
+LIBS    = $(ARLIB) $(ARLINK) $(SHLIB) $(SHLINK)
 SHFLAGS = -h $(SHLIB)
 DEPLIBS = ../$(SHLIB)
 LDLIBS  = -L.. -lstdc++ -lm
Index: libstdc++/config/elfshlibm.ml
===================================================================
RCS file: /home/work/cvs/gnu/egcs/libstdc++/config/elfshlibm.ml,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 elfshlibm.ml
--- libstdc++/config/elfshlibm.ml	1997/08/26 00:21:28	1.1.1.1
+++ libstdc++/config/elfshlibm.ml	1998/06/28 01:51:31
@@ -1,6 +1,6 @@
 # Elf with shared libm, so we can link it into the shared libstdc++.
 
-LIBS    = $(ARLIB) $(SHLIB) $(SHLINK)
+LIBS    = $(ARLIB) $(ARLINK) $(SHLIB) $(SHLINK)
 SHFLAGS = -h $(SHLIB)
 SHDEPS  = -lm
 DEPLIBS = ../$(SHLIB)
Index: libstdc++/config/hpux.ml
===================================================================
RCS file: /home/work/cvs/gnu/egcs/libstdc++/config/hpux.ml,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 hpux.ml
--- libstdc++/config/hpux.ml	1997/08/26 00:21:28	1.1.1.1
+++ libstdc++/config/hpux.ml	1998/06/28 01:51:36
@@ -1,6 +1,6 @@
 # HPUX uses the .sl suffix for shared libraries.
 
 SHLIB   = libstdc++.sl
-LIBS    = $(ARLIB) $(SHLIB)
+LIBS    = $(ARLIB) $(ARLINK) $(SHLIB)
 DEPLIBS = ../$(SHLIB)
 SHFLAGS = $(PICFLAG)
Index: libstdc++/config/irix5.ml
===================================================================
RCS file: /home/work/cvs/gnu/egcs/libstdc++/config/irix5.ml,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 irix5.ml
--- libstdc++/config/irix5.ml	1997/08/26 00:21:28	1.1.1.1
+++ libstdc++/config/irix5.ml	1998/06/28 01:51:40
@@ -1,6 +1,6 @@
 # We don't need -fpic on IRIX, so let's install both the shared and
 # non-shared versions.
 
-LIBS     = $(ARLIB) $(SHLIB) $(SHLINK)
+LIBS     = $(ARLIB) $(ARLINK) $(SHLIB) $(SHLINK)
 DEPLIBS  = ../$(SHLIB)
 SHDEPS   = -lm
Index: libstdc++/config/linux.ml
===================================================================
RCS file: /home/work/cvs/gnu/egcs/libstdc++/config/linux.ml,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 linux.ml
--- libstdc++/config/linux.ml	1997/08/26 00:21:28	1.1.1.1
+++ libstdc++/config/linux.ml	1998/06/28 01:51:58
@@ -1,6 +1,11 @@
 # Elf with shared libm, so we can link it into the shared libstdc++.
 
-LIBS    = $(ARLIB) $(SHLIB) $(SHLINK) mshlink
+ARLIB   = libstdc++-$(LIBSTDCXX_INTERFACE)$(LIBC_INTERFACE)$(CXX_INTERFACE)-$(VERSION).a
+MARLINK = libstdc++$(LIBC_INTERFACE)$(CXX_INTERFACE).a.$(LIBSTDCXX_INTERFACE)
+SHLIB   = libstdc++-$(LIBSTDCXX_INTERFACE)$(LIBC_INTERFACE)$(CXX_INTERFACE)-$(VERSION).so
+MSHLINK = libstdc++$(LIBC_INTERFACE)$(CXX_INTERFACE).so.$(LIBSTDCXX_INTERFACE)
+
+LIBS    = $(ARLIB) marlink $(ARLINK) $(SHLIB) mshlink $(SHLINK)
 SHFLAGS = -Wl,-soname,$(MSHLINK)
 SHDEPS  = -lm
 DEPLIBS = ../$(SHLIB)
Index: libstdc++/config/sol2shm.ml
===================================================================
RCS file: /home/work/cvs/gnu/egcs/libstdc++/config/sol2shm.ml,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 sol2shm.ml
--- libstdc++/config/sol2shm.ml	1997/08/26 00:21:28	1.1.1.1
+++ libstdc++/config/sol2shm.ml	1998/06/28 01:52:04
@@ -1,6 +1,6 @@
 # Solaris2 with shared libm, so we can link it into the shared libstdc++.
 
-LIBS    = $(ARLIB) $(SHLIB) $(SHLINK)
+LIBS    = $(ARLIB) $(ARLINK) $(SHLIB) $(SHLINK)
 SHFLAGS = -h $(SHLIB)
 SHDEPS  = -lm
 DEPLIBS = ../$(SHLIB)
Index: libstdc++/config/sunos4.ml
===================================================================
RCS file: /home/work/cvs/gnu/egcs/libstdc++/config/sunos4.ml,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 sunos4.ml
--- libstdc++/config/sunos4.ml	1997/08/26 00:21:28	1.1.1.1
+++ libstdc++/config/sunos4.ml	1998/06/28 01:52:10
@@ -2,7 +2,7 @@
 # library, even for programs that don't use complex.
 # SunOS requires a version number in shared library filenames.
 
-LIBS    = $(ARLIB) $(SHLIB)
+LIBS    = $(ARLIB) $(ARLINK) $(SHLIB)
 SHFLAGS = $(PICFLAG)
 DEPLIBS = ../$(SHLIB)
 LDLIBS	= -L.. -lstdc++ -lm



More information about the Gcc-patches mailing list