Hello Pietro. OK. Thanks for the patch.
> libga68/ChangeLog: > > * configure.ac: New test to determine if symbol versioning is > supported. > * Makefile.am: Use result of above test to add appropriate linker > flags. > * Makefile.in: Regenerated. > * configure: Likewise. > * ga68.map: New file. > * libtool-version: New file. > > Signed-off-by: Pietro Monteiro <[email protected]> > --- > libga68/Makefile.am | 27 ++++++- > libga68/Makefile.in | 22 +++++- > libga68/aclocal.m4 | 1 + > libga68/configure | 157 ++++++++++++++++++++++++++++++++++++++-- > libga68/configure.ac | 51 ++++++++++++- > libga68/ga68.map | 41 +++++++++++ > libga68/libtool-version | 6 ++ > 7 files changed, 289 insertions(+), 16 deletions(-) > create mode 100644 libga68/ga68.map > create mode 100644 libga68/libtool-version > > diff --git a/libga68/Makefile.am b/libga68/Makefile.am > index accdd910d8d..16917554da7 100644 > --- a/libga68/Makefile.am > +++ b/libga68/Makefile.am > @@ -44,6 +44,27 @@ endif > > A68_BUILDDIR := $(shell pwd) > > +if LIBGA68_USE_SYMVER > +if LIBGA68_USE_SYMVER_GNU > +version_arg = -Wl,--version-script=$(srcdir)/ga68.map > +version_dep = $(srcdir)/ga68.map > +endif > +if LIBGA68_USE_SYMVER_SUN > +version_arg = -Wl,-M,ga68.map-sun > +version_dep = ga68.map-sun > +ga68.map-sun : $(srcdir)/ga68.map \ > + $(top_srcdir)/../contrib/make_sunver.pl \ > + $(libga68_la_OBJECTS) $(libga68_la_LIBADD) > + perl $(top_srcdir)/../contrib/make_sunver.pl \ > + $(srcdir)/ga68.map \ > + $(libga68_la_OBJECTS) $(libga68_la_LIBADD) \ > + > $@ || (rm -f $@ ; exit 1) > +endif > +else > +version_arg = > +version_dep = > +endif > + > # Work around what appears to be a GNU make bug handling MAKEFLAGS > # values defined in terms of make variables, as is the case for CC and > # friends when we are called from the top level Makefile. > @@ -111,9 +132,9 @@ libga68_la_SOURCES = libga68.c \ > ga68.h > libga68_la_LIBTOOLFLAGS = > libga68_la_CFLAGS = $(LIBGA68_GCFLAGS) $(LIBGA68_BOEHM_GC_INCLUDES) > -libga68_la_LDFLAGS = -version-info $(libga68_VERSION) \ > - $(extra_darwin_ldflags_libga68) > -libga68_la_DEPENDENCIES = libga68.spec > +libga68_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` > \ > + $(version_arg) $(lt_host_flags) > $(extra_darwin_ldflags_libga68) > +libga68_la_DEPENDENCIES = libga68.spec $(version_dep) > libga68_la_LIBADD = $(LIBGA68_BOEHM_GC_LIBS) > > # target overrides > diff --git a/libga68/Makefile.in b/libga68/Makefile.in > index efba8b8ee11..7f4fd870192 100644 > --- a/libga68/Makefile.in > +++ b/libga68/Makefile.in > @@ -121,6 +121,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \ > $(top_srcdir)/../config/depstand.m4 \ > $(top_srcdir)/../config/gcc-plugin.m4 \ > $(top_srcdir)/../config/lead-dot.m4 \ > + $(top_srcdir)/../config/lthostflags.m4 \ > $(top_srcdir)/../config/multi.m4 \ > $(top_srcdir)/../config/no-executables.m4 \ > $(top_srcdir)/../config/override.m4 \ > @@ -357,9 +358,9 @@ infodir = @infodir@ > install_sh = @install_sh@ > libdir = @libdir@ > libexecdir = @libexecdir@ > -libga68_VERSION = @libga68_VERSION@ > localedir = @localedir@ > localstatedir = @localstatedir@ > +lt_host_flags = @lt_host_flags@ > mandir = @mandir@ > mkdir_p = @mkdir_p@ > multi_basedir = @multi_basedir@ > @@ -395,6 +396,12 @@ GCC_DIR = $(TOP_GCCDIR)/gcc > A68_SRC = $(GCC_DIR)/algol68 > A68_FOR_TARGET = @A68_FOR_TARGET@ > A68_BUILDDIR := $(shell pwd) > +@LIBGA68_USE_SYMVER_FALSE@version_arg = > +@LIBGA68_USE_SYMVER_GNU_TRUE@@LIBGA68_USE_SYMVER_TRUE@version_arg = > -Wl,--version-script=$(srcdir)/ga68.map > +@LIBGA68_USE_SYMVER_SUN_TRUE@@LIBGA68_USE_SYMVER_TRUE@version_arg = > -Wl,-M,ga68.map-sun > +@LIBGA68_USE_SYMVER_FALSE@version_dep = > +@LIBGA68_USE_SYMVER_GNU_TRUE@@LIBGA68_USE_SYMVER_TRUE@version_dep = > $(srcdir)/ga68.map > +@LIBGA68_USE_SYMVER_SUN_TRUE@@LIBGA68_USE_SYMVER_TRUE@version_dep = > ga68.map-sun > > # Work around what appears to be a GNU make bug handling MAKEFLAGS > # values defined in terms of make variables, as is the case for CC and > @@ -462,10 +469,10 @@ libga68_la_SOURCES = libga68.c \ > > libga68_la_LIBTOOLFLAGS = > libga68_la_CFLAGS = $(LIBGA68_GCFLAGS) $(LIBGA68_BOEHM_GC_INCLUDES) > -libga68_la_LDFLAGS = -version-info $(libga68_VERSION) \ > - $(extra_darwin_ldflags_libga68) > +libga68_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` > \ > + $(version_arg) $(lt_host_flags) > $(extra_darwin_ldflags_libga68) > > -libga68_la_DEPENDENCIES = libga68.spec > +libga68_la_DEPENDENCIES = libga68.spec $(version_dep) > libga68_la_LIBADD = $(LIBGA68_BOEHM_GC_LIBS) > MULTISRCTOP = > MULTIBUILDTOP = > @@ -868,6 +875,13 @@ uninstall-am: uninstall-toolexeclibDATA \ > > .PRECIOUS: Makefile > > +@LIBGA68_USE_SYMVER_SUN_TRUE@@[email protected] : > $(srcdir)/ga68.map \ > +@LIBGA68_USE_SYMVER_SUN_TRUE@@LIBGA68_USE_SYMVER_TRUE@ > $(top_srcdir)/../contrib/make_sunver.pl \ > +@LIBGA68_USE_SYMVER_SUN_TRUE@@LIBGA68_USE_SYMVER_TRUE@ > $(libga68_la_OBJECTS) $(libga68_la_LIBADD) > +@LIBGA68_USE_SYMVER_SUN_TRUE@@LIBGA68_USE_SYMVER_TRUE@ perl > $(top_srcdir)/../contrib/make_sunver.pl \ > +@LIBGA68_USE_SYMVER_SUN_TRUE@@LIBGA68_USE_SYMVER_TRUE@ > $(srcdir)/ga68.map \ > +@LIBGA68_USE_SYMVER_SUN_TRUE@@LIBGA68_USE_SYMVER_TRUE@ > $(libga68_la_OBJECTS) $(libga68_la_LIBADD) \ > +@LIBGA68_USE_SYMVER_SUN_TRUE@@LIBGA68_USE_SYMVER_TRUE@ > $@ || (rm -f > $@ ; exit 1) > > # target overrides > -include $(tmake_file) > diff --git a/libga68/aclocal.m4 b/libga68/aclocal.m4 > index 1d3f9eceae1..21d6365e326 100644 > --- a/libga68/aclocal.m4 > +++ b/libga68/aclocal.m4 > @@ -1192,6 +1192,7 @@ m4_include([../config/clang-plugin.m4]) > m4_include([../config/depstand.m4]) > m4_include([../config/gcc-plugin.m4]) > m4_include([../config/lead-dot.m4]) > +m4_include([../config/lthostflags.m4]) > m4_include([../config/multi.m4]) > m4_include([../config/no-executables.m4]) > m4_include([../config/override.m4]) > diff --git a/libga68/configure b/libga68/configure > index ce2c780ac32..705694a1891 100755 > --- a/libga68/configure > +++ b/libga68/configure > @@ -638,7 +638,12 @@ LIBGA68_BOEHM_GC_LIBS > LIBGA68_BOEHM_GC_INCLUDES > LIBGA68_GCFLAGS > extra_darwin_ldflags_libga68 > -libga68_VERSION > +LIBGA68_USE_SYMVER_SUN_FALSE > +LIBGA68_USE_SYMVER_SUN_TRUE > +LIBGA68_USE_SYMVER_GNU_FALSE > +LIBGA68_USE_SYMVER_GNU_TRUE > +LIBGA68_USE_SYMVER_FALSE > +LIBGA68_USE_SYMVER_TRUE > SPEC_LIBGA68_DEPS > get_gcc_base_ver > CC_FOR_BUILD > @@ -646,6 +651,7 @@ enable_static > enable_shared > ENABLE_DARWIN_AT_RPATH_FALSE > ENABLE_DARWIN_AT_RPATH_TRUE > +lt_host_flags > OTOOL64 > OTOOL > LIPO > @@ -798,6 +804,7 @@ with_gnu_ld > enable_libtool_lock > enable_darwin_at_rpath > with_gcc_major_version_only > +enable_symvers > enable_algol68_gc > with_target_bdw_gc > with_target_bdw_gc_include > @@ -1451,6 +1458,7 @@ Optional Features: > --enable-darwin-at-rpath > install libraries with @rpath/library-name, > requires > rpaths to be added to executables > + --disable-symvers disable symbol versioning for libga68 > --enable-algol68-gc enable use of Boehm's garbage collector with the > GNU > Algol runtime > > @@ -12593,7 +12601,7 @@ else > lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 > lt_status=$lt_dlunknown > cat > conftest.$ac_ext <<_LT_EOF > -#line 12596 "configure" > +#line 12604 "configure" > #include "confdefs.h" > > #if HAVE_DLFCN_H > @@ -12699,7 +12707,7 @@ else > lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 > lt_status=$lt_dlunknown > cat > conftest.$ac_ext <<_LT_EOF > -#line 12702 "configure" > +#line 12710 "configure" > #include "confdefs.h" > > #if HAVE_DLFCN_H > @@ -12937,6 +12945,28 @@ CC="$lt_save_CC" > > > > + > + > +case $host in > + *-cygwin* | *-mingw*) > + # 'host' will be top-level target in the case of a target lib, > + # we must compare to with_cross_host to decide if this is a native > + # or cross-compiler and select where to install dlls appropriately. > + if test -n "$with_cross_host" && > + test x"$with_cross_host" != x"no"; then > + lt_host_flags='-no-undefined -bindir "$(toolexeclibdir)"'; > + else > + lt_host_flags='-no-undefined -bindir "$(bindir)"'; > + fi > + ;; > + *) > + lt_host_flags= > + ;; > +esac > + > + > + > + > if test x$enable_darwin_at_rpath = xyes; then > ENABLE_DARWIN_AT_RPATH_TRUE= > ENABLE_DARWIN_AT_RPATH_FALSE='#' > @@ -13100,8 +13130,113 @@ fi > SPEC_LIBGA68_DEPS="$LIBS" > > > -# libga68 soname version > -libga68_VERSION=2:0:0 > +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether symbol versioning > is supported" >&5 > +$as_echo_n "checking whether symbol versioning is supported... " >&6; } > +# Check whether --enable-symvers was given. > +if test "${enable_symvers+set}" = set; then : > + enableval=$enable_symvers; ga68_use_symver=$enableval > +else > + ga68_use_symver=yes > +fi > + > +if test "x$ga68_use_symver" != xno; then > + if test x$gcc_no_link = xyes; then > + # If we cannot link, we cannot build shared libraries, so do not use > + # symbol versioning. > + ga68_use_symver=no > + else > + save_LDFLAGS="$LDFLAGS" > + LDFLAGS="$LDFLAGS -fPIC -shared -Wl,--version-script,./conftest.map" > + cat > conftest.map <<EOF > +FOO_1.0 { > + global: *foo*; bar; local: *; > +}; > +EOF > + if test x$gcc_no_link = xyes; then > + as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." > "$LINENO" 5 > +fi > +cat confdefs.h - <<_ACEOF >conftest.$ac_ext > +/* end confdefs.h. */ > +int foo; > +int > +main () > +{ > + > + ; > + return 0; > +} > +_ACEOF > +if ac_fn_c_try_link "$LINENO"; then : > + ga68_use_symver=gnu > +else > + ga68_use_symver=no > +fi > +rm -f core conftest.err conftest.$ac_objext \ > + conftest$ac_exeext conftest.$ac_ext > + if test x$ga68_use_symver = xno; then > + case "$target_os" in > + solaris2*) > + LDFLAGS="$save_LDFLAGS" > + LDFLAGS="$LDFLAGS -fPIC -shared -Wl,-M,./conftest.map" > + # Sun ld cannot handle wildcards and treats all entries as > undefined. > + cat > conftest.map <<EOF > +FOO_1.0 { > + global: foo; local: *; > +}; > +EOF > + if test x$gcc_no_link = xyes; then > + as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." > "$LINENO" 5 > +fi > +cat confdefs.h - <<_ACEOF >conftest.$ac_ext > +/* end confdefs.h. */ > +int foo; > +int > +main () > +{ > + > + ; > + return 0; > +} > +_ACEOF > +if ac_fn_c_try_link "$LINENO"; then : > + ga68_use_symver=sun > +else > + ga68_use_symver=no > +fi > +rm -f core conftest.err conftest.$ac_objext \ > + conftest$ac_exeext conftest.$ac_ext > + ;; > + esac > + fi > + LDFLAGS="$save_LDFLAGS" > + fi > +fi > + > +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ga68_use_symver" >&5 > +$as_echo "$ga68_use_symver" >&6; } > + if test "x$ga68_use_symver" != xno; then > + LIBGA68_USE_SYMVER_TRUE= > + LIBGA68_USE_SYMVER_FALSE='#' > +else > + LIBGA68_USE_SYMVER_TRUE='#' > + LIBGA68_USE_SYMVER_FALSE= > +fi > + > + if test "x$ga68_use_symver" = xgnu; then > + LIBGA68_USE_SYMVER_GNU_TRUE= > + LIBGA68_USE_SYMVER_GNU_FALSE='#' > +else > + LIBGA68_USE_SYMVER_GNU_TRUE='#' > + LIBGA68_USE_SYMVER_GNU_FALSE= > +fi > + > + if test "x$ga68_use_symver" = xsun; then > + LIBGA68_USE_SYMVER_SUN_TRUE= > + LIBGA68_USE_SYMVER_SUN_FALSE='#' > +else > + LIBGA68_USE_SYMVER_SUN_TRUE='#' > + LIBGA68_USE_SYMVER_SUN_FALSE= > +fi > > > # The Boehm GC > @@ -13477,6 +13612,18 @@ if test -z "${ENABLE_DARWIN_AT_RPATH_TRUE}" && test > -z "${ENABLE_DARWIN_AT_RPATH > as_fn_error $? "conditional \"ENABLE_DARWIN_AT_RPATH\" was never defined. > Usually this means the macro was only invoked conditionally." "$LINENO" 5 > fi > +if test -z "${LIBGA68_USE_SYMVER_TRUE}" && test -z > "${LIBGA68_USE_SYMVER_FALSE}"; then > + as_fn_error $? "conditional \"LIBGA68_USE_SYMVER\" was never defined. > +Usually this means the macro was only invoked conditionally." "$LINENO" 5 > +fi > +if test -z "${LIBGA68_USE_SYMVER_GNU_TRUE}" && test -z > "${LIBGA68_USE_SYMVER_GNU_FALSE}"; then > + as_fn_error $? "conditional \"LIBGA68_USE_SYMVER_GNU\" was never defined. > +Usually this means the macro was only invoked conditionally." "$LINENO" 5 > +fi > +if test -z "${LIBGA68_USE_SYMVER_SUN_TRUE}" && test -z > "${LIBGA68_USE_SYMVER_SUN_FALSE}"; then > + as_fn_error $? "conditional \"LIBGA68_USE_SYMVER_SUN\" was never defined. > +Usually this means the macro was only invoked conditionally." "$LINENO" 5 > +fi > > : "${CONFIG_STATUS=./config.status}" > ac_write_fail=0 > diff --git a/libga68/configure.ac b/libga68/configure.ac > index 56ef197e5f4..5ff5e124f8f 100644 > --- a/libga68/configure.ac > +++ b/libga68/configure.ac > @@ -155,6 +155,7 @@ AC_PROG_INSTALL > > # Initialize libtool. > LT_INIT > +ACX_LT_HOST_FLAGS > > AM_CONDITIONAL([ENABLE_DARWIN_AT_RPATH], [test x$enable_darwin_at_rpath = > xyes]) > > @@ -162,7 +163,7 @@ AC_SUBST(enable_shared) > AC_SUBST(enable_static) > > # Do compilation tests using the C compiler and preprocessor. > -AC_LANG_C([C]) > +AC_LANG([C]) > > # Allow the user to set CC_FOR_BUILD in the environment. > CC_FOR_BUILD=${CC_FOR_BUILD:-gcc} > @@ -179,9 +180,51 @@ GCC_BASE_VER > SPEC_LIBGA68_DEPS="$LIBS" > AC_SUBST(SPEC_LIBGA68_DEPS) > > -# libga68 soname version > -libga68_VERSION=2:0:0 > -AC_SUBST(libga68_VERSION) > +AC_MSG_CHECKING([whether symbol versioning is supported]) > +AC_ARG_ENABLE(symvers, > +AS_HELP_STRING([--disable-symvers], > + [disable symbol versioning for libga68]), > +ga68_use_symver=$enableval, > +ga68_use_symver=yes) > +if test "x$ga68_use_symver" != xno; then > + if test x$gcc_no_link = xyes; then > + # If we cannot link, we cannot build shared libraries, so do not use > + # symbol versioning. > + ga68_use_symver=no > + else > + save_LDFLAGS="$LDFLAGS" > + LDFLAGS="$LDFLAGS -fPIC -shared -Wl,--version-script,./conftest.map" > + cat > conftest.map <<EOF > +FOO_1.0 { > + global: *foo*; bar; local: *; > +}; > +EOF > + AC_LINK_IFELSE([AC_LANG_PROGRAM([[int foo;]], [[]])], > + [ga68_use_symver=gnu],[ga68_use_symver=no]) > + if test x$ga68_use_symver = xno; then > + case "$target_os" in > + solaris2*) > + LDFLAGS="$save_LDFLAGS" > + LDFLAGS="$LDFLAGS -fPIC -shared -Wl,-M,./conftest.map" > + # Sun ld cannot handle wildcards and treats all entries as > undefined. > + cat > conftest.map <<EOF > +FOO_1.0 { > + global: foo; local: *; > +}; > +EOF > + AC_LINK_IFELSE([AC_LANG_PROGRAM([[int foo;]], [[]])], > + [ga68_use_symver=sun],[ga68_use_symver=no]) > + ;; > + esac > + fi > + LDFLAGS="$save_LDFLAGS" > + fi > +fi > + > +AC_MSG_RESULT($ga68_use_symver) > +AM_CONDITIONAL(LIBGA68_USE_SYMVER, [test "x$ga68_use_symver" != xno]) > +AM_CONDITIONAL(LIBGA68_USE_SYMVER_GNU, [test "x$ga68_use_symver" = xgnu]) > +AM_CONDITIONAL(LIBGA68_USE_SYMVER_SUN, [test "x$ga68_use_symver" = xsun]) > > # The Boehm GC > > diff --git a/libga68/ga68.map b/libga68/ga68.map > new file mode 100644 > index 00000000000..f956655de03 > --- /dev/null > +++ b/libga68/ga68.map > @@ -0,0 +1,41 @@ > +LIBGA68_2.0 { > + global: > + _libga68_assert; > + _libga68_bitsboundserror; > + _libga68_bounds; > + _libga68_bounds_mismatch; > + _libga68_derefnil; > + _libga68_dim; > + _libga68_invalidcharerror; > + _libga68_longlongrandom; > + _libga68_longrandom; > + _libga68_lower_bound; > + _libga68_malloc; > + _libga68_posixargc; > + _libga68_posixargv; > + _libga68_posixclose; > + _libga68_posixcreat; > + _libga68_posixerrno; > + _libga68_posixfconnect; > + _libga68_posixfgetc; > + _libga68_posixfgets; > + _libga68_posixfopen; > + _libga68_posixfputc; > + _libga68_posixfputs; > + _libga68_posixfsize; > + _libga68_posixgetchar; > + _libga68_posixgetenv; > + _libga68_posixgets; > + _libga68_posixlseek; > + _libga68_posixperror; > + _libga68_posixputchar; > + _libga68_posixputs; > + _libga68_posixstrerror; > + _libga68_random; > + _libga68_set_exit_status; > + _libga68_u32_cmp2; > + _libga68_unreachable; > + _libga68_upper_bound; > + local: > + *; > +}; > diff --git a/libga68/libtool-version b/libga68/libtool-version > new file mode 100644 > index 00000000000..1b1da6a4a41 > --- /dev/null > +++ b/libga68/libtool-version > @@ -0,0 +1,6 @@ > +# This file is used to maintain libtool version info for libga68. > +# See the libtool manual to understand the meaning of the fields. > +# This is a separate file so that version updates don't involve re-running > +# automake. > +# CURRENT:REVISION:AGE > +2:0:0 > > base-commit: c388d56a889469cf05a1512403e3267af7bb62be
