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