# This file defines the shared library version numbers we will install.

# The following lines list filename patterns matching canonical configurations,
# and the associated versions to use for various libraries.  The entire
# list is processed, with earlier entries taking precedence over later
# entries.  So loose patterns at the end of the list can give defaults.

# This file can use cpp-style conditionals starting with % instead of #
# to test the symbols defined in config.h by configure.

# In the optional third column, there can one or more symbol set names
# listed, which must be in ascending version order reading left to right
# and must appear in this same order in the Versions.def file.  Each listed
# version subsumes all prior versions back to the previous listed version.
#
# An entry with DEFAULT in the second column gives a default third column
# to apply on matching configurations when the matching entry for a particular
# library has no third column.  The defaults must precede the entries they
# apply to.
#
# An entry with WORDSIZE* in the second column gives an alternate
# configuration tuple whose macros will be conditionally defined in
# gnu/lib-names.h; @CPU@, @VENDOR@, @OS@ can be used in the third
# column to compose the alternate tuple matched against the patterns here.

# Configuration		DEFAULT			Earliest symbol set
# -------------		---------------		------------------------------

s390x-.*-linux.*        DEFAULT			GLIBC_2.2
cris-.*-linux.*		DEFAULT			GLIBC_2.2
x86_64-.*-linux.*       DEFAULT			GLIBC_2.2.5
powerpc64-.*-linux.*	DEFAULT			GLIBC_2.3
.*-.*-gnu-gnu.*		DEFAULT			GLIBC_2.2.6

# Configuration		WORDSIZE[32|64]		Alternate configuration
# -------------		----------		-----------------------
x86_64-.*-.*		WORDSIZE32		i686-@VENDOR@-@OS@
i.86-.*-.*		WORDSIZE64		x86_64-@VENDOR@-@OS@
s390x-.*-.*		WORDSIZE32		s390-@VENDOR@-@OS@
s390-.*-.*		WORDSIZE64		s390x-@VENDOR@-@OS@
powerpc64-.*-.*		WORDSIZE32		powerpc-@VENDOR@-@OS@
powerpc.*-.*-.*		WORDSIZE64		powerpc64-@VENDOR@-@OS@
sparc64.*-.*-.*		WORDSIZE32		sparc-@VENDOR@-@OS@
sparc.*-.*-.*		WORDSIZE64		sparc64-@VENDOR@-@OS@

# Configuration		ABI			Identifier for ABI data files
# -------------		----------		-----------------------------
sparc64.*-.*-.*		ABI			sparc64-@OS@
sparc.*-.*-.*		ABI			sparc-@OS@

# Configuration		Library=version		Earliest symbol set (optional)
# -------------		---------------		------------------------------

# The interface to -lm depends mostly only on cpu, not on operating system.
sparc64.*-.*-linux.*	libm=6			GLIBC_2.2
alpha.*-.*-linux.*	libm=6.1
ia64-.*-linux.*		libm=6.1		GLIBC_2.2
sh.*-.*-linux.*		libm=6			GLIBC_2.2
.*-.*-linux.*		libm=6
.*-.*-gnu-gnu.*		libm=6

# We provide libc.so.6 for Linux kernel versions 2.0 and later.
alpha.*-.*-linux.*	libc=6.1
ia64-.*-linux.*		libc=6.1		GLIBC_2.2
sh.*-.*-linux.*		libc=6			GLIBC_2.2
sparc64.*-.*-linux.*	libc=6			GLIBC_2.2
.*-.*-linux.*		libc=6

# libmachuser.so.1 corresponds to mach/*.defs as of Utah's UK22 release.
.*-.*-gnu-gnu.*		libmachuser=1

# libhurduser.so.0.3 corresponds to hurd/*.defs as of 11 June 2002.
.*-.*-gnu-gnu.*		libhurduser=0.3

# libc.so.0.3 is the first Hurd libc using libio.
.*-.*-gnu-gnu.*		libc=0.3

# The dynamic loader also requires different names.
i.86-.*-linux.*		ld=ld-linux.so.2
sparc64.*-.*-linux.*	ld=ld-linux.so.2	GLIBC_2.2
sparc.*-.*-linux.*	ld=ld-linux.so.2
alpha.*-.*-linux.*	ld=ld-linux.so.2
sh.*-.*-linux.*		ld=ld-linux.so.2	GLIBC_2.2
ia64-.*-linux.*		ld=ld-linux-ia64.so.2	GLIBC_2.2
s390x-.*-linux.*	ld=ld64.so.1		GLIBC_2.2
powerpc64.*-.*-linux.*	ld=ld64.so.1		GLIBC_2.3
cris-.*-linux.*		ld=ld.so.1		GLIBC_2.2
x86_64-.*-linux.*	ld=ld-linux-x86-64.so.2	GLIBC_2.2.5
# We use the ELF ABI standard name for the default.
.*-.*-.*		ld=ld.so.1

# The -ldl interface (see <dlfcn.h>) is the same on all platforms.
alpha.*-.*-linux.*	libdl=2.1
.*-.*-.*		libdl=2

# So far the -lutil interface is the same on all platforms, except for the
# `struct utmp' format, which depends on libc.
alpha.*-.*-linux.*	libutil=1.1
.*-.*-.*		libutil=1

# Version number 2 is used on other systems for the BIND 4.9.5 resolver
# interface.
alpha.*-.*-linux.*	libresolv=2.1
.*-.*-.*		libresolv=2

# Interface revision of nss_* modules.  This must match NSS_SHLIB_REVISION
# in nss/nsswitch.h, which determines the library names used for service
# names given in /etc/nsswitch.conf.
.*-.*-.*		libnss_files=2
.*-.*-.*		libnss_dns=2
.*-.*-.*		libnss_compat=2
.*-.*-.*		libnss_nis=2
.*-.*-.*		libnss_nisplus=2
.*-.*-.*		libnss_ldap=2
.*-.*-.*		libnss_hesiod=2

# Tests for NSS.  They must have the same NSS_SHLIB_REVISION number as
# the rest.
.*-.*-.*		libnss_test1=2

# Version for libnsl with YP and NIS+ functions.
alpha.*-.*-linux.*	libnsl=1.1
.*-.*-.*		libnsl=1

# This defines the shared library version numbers we will install.
alpha.*-.*-linux.*	libcrypt=1.1
.*-.*-.*		libcrypt=1

# The gross patch for programs assuming broken locale implementations.
alpha.*-.*-linux.*	libBrokenLocale=1.1
ia64-.*-.*		libBrokenLocale=1	GLIBC_2.2
sh.*-.*-.*		libBrokenLocale=1	GLIBC_2.2
sparc64.*-.*-.*		libBrokenLocale=1	GLIBC_2.2
.*-.*-.*		libBrokenLocale=1

# The real-time library from POSIX.1b.
.*-.*-.*		librt=1

# The asynchronous name lookup library.
.*-.*-.*		libanl=1
