bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: lib-ignore: link error with Sun C++ compiler


From: Bruno Haible
Subject: Re: lib-ignore: link error with Sun C++ compiler
Date: Sun, 28 Mar 2010 10:33:16 +0100
User-agent: KMail/1.9.9

> * Bruno Haible wrote on Sat, Mar 20, 2010 at 11:52:25PM CET:
> >     lib-ignore: Determine different options for different compilers.
> >     * m4/lib-ignore.m4 (gl_IGNORE_UNUSED_LIBRARIES): Set a variable which
> >     depends on the current language (C/C++/Fortran). Don't set LDFLAGS.
> >     Add comments.
> >     (_gl_IGNORE_UNUSED_LIBRARIES_OPTIONS): New macro.
> >     * NEWS: Mention the change.

I've committed this patch now, including Ralf's comments about libtool, below.

Jim, for coreutils, I propose this patch:

=============================================================================
2010-03-28  Bruno Haible  <address@hidden>

        Update after change in gnulib's lib-ignore module.
        * src/Makefile.am (AM_LDFLAGS): New variable.

--- src/Makefile.am.orig        Sun Mar 28 11:31:05 2010
+++ src/Makefile.am     Sun Mar 28 11:30:27 2010
@@ -170,6 +170,9 @@
 noinst_LIBRARIES = libver.a
 nodist_libver_a_SOURCES = version.c version.h
 
+# Tell the linker to omit references to unused shared libraries.
+AM_LDFLAGS = $(IGNORE_UNUSED_LIBRARIES_CFLAGS)
+
 # Sometimes, the expansion of $(LIBINTL) includes -lc which may
 # include modules defining variables like `optind', so libcoreutils.a
 # must precede $(LIBINTL) in order to ensure we use GNU getopt.
=============================================================================



2010-03-28  Bruno Haible  <address@hidden>
            Ralf Wildenhues  <address@hidden>

        lib-ignore: Determine different options for different compilers.
        * m4/lib-ignore.m4 (gl_IGNORE_UNUSED_LIBRARIES): Set a variable which
        depends on the current language (C/C++/Fortran). Don't set LDFLAGS.
        Add comments.
        (_gl_IGNORE_UNUSED_LIBRARIES_OPTIONS): New macro.
        * NEWS: Mention the change.

*** NEWS.orig   Sun Mar 28 11:23:19 2010
--- NEWS        Sun Mar 28 11:23:01 2010
***************
*** 6,11 ****
--- 6,17 ----
  
  Date        Modules         Changes
  
+ 2010-03-28  lib-ignore      This module now provides a variable
+                             IGNORE_UNUSED_LIBRARIES_CFLAGS that you should
+                             add to LDFLAGS (when linking C programs only) or
+                             CFLAGS yourself. It is no longer added to LDFLAGS
+                             automatically.
+ 
  2010-03-18  pty             This module now only declares the pty.h header.
                              Use the new modules 'forkpty' or 'openpty' to
                              get the functions that were previously provided.
*** m4/lib-ignore.m4.orig       Sun Mar 28 11:23:19 2010
--- m4/lib-ignore.m4    Sun Mar 28 11:21:08 2010
***************
*** 7,17 ****
  
  dnl Written by Paul Eggert.
  
  AC_DEFUN([gl_IGNORE_UNUSED_LIBRARIES],
  [
!   AC_CACHE_CHECK([for flag to ignore unused libraries],
!     [gl_cv_ignore_unused_libraries],
!     [gl_cv_ignore_unused_libraries=none
       gl_saved_ldflags=$LDFLAGS
       gl_saved_libs=$LIBS
       # Link with -lm to detect binutils 2.16 bug with --as-needed; see
--- 7,55 ----
  
  dnl Written by Paul Eggert.
  
+ # gl_IGNORE_UNUSED_LIBRARIES
+ # --------------------------
+ # Determines the option to be passed to the C/C++/Fortran compiler, so that it
+ # omits unused libraries.
+ # Example (on Solaris):
+ # $ cc foo.c -lnsl; ldd ./a.out
+ #         libnsl.so.1 =>   /lib/libnsl.so.1
+ #         libc.so.1 =>     /lib/libc.so.1
+ #         libmp.so.2 =>    /lib/libmp.so.2
+ #         libmd.so.1 =>    /lib/libmd.so.1
+ #         libscf.so.1 =>   /lib/libscf.so.1
+ #         libdoor.so.1 =>  /lib/libdoor.so.1
+ #         libuutil.so.1 =>         /lib/libuutil.so.1
+ #         libgen.so.1 =>   /lib/libgen.so.1
+ #         libm.so.2 =>     /lib/libm.so.2
+ # $ cc foo.c -lnsl -Wl,-z,ignore; ldd ./a.out
+ #         libc.so.1 =>     /lib/libc.so.1
+ #         libm.so.2 =>     /lib/libm.so.2
+ #
+ # Note that the option works only for the C compiler, not for the C++
+ # compiler:
+ # - Sun C likes '-Wl,-z,ignore'.
+ #   '-Qoption ld -z,ignore' is not accepted.
+ #   '-z ignore' is accepted but has no effect.
+ # - Sun C++ and Sun Fortran like '-Qoption ld -z,ignore'.
+ #   '-Wl,-z,ignore' is not accepted.
+ #   '-z ignore' is accepted but has no effect.
+ #
+ # Sets and substitutes a variable that depends on the current language:
+ # - IGNORE_UNUSED_LIBRARIES_CFLAGS    for C
+ # - IGNORE_UNUSED_LIBRARIES_CXXFLAGS  for C++
+ # - IGNORE_UNUSED_LIBRARIES_FFLAGS    for Fortran
+ #
+ # Note that the option works only for direct invocation of the compiler, not
+ # through libtool: When libtool is used to create a shared library, it will
+ # honor and translate '-Wl,-z,ignore' to '-Qoption ld -z -Qoption ld ignore'
+ # if needed, but it will drop a '-Qoption ld -z,ignore' on the command line.
+ #
  AC_DEFUN([gl_IGNORE_UNUSED_LIBRARIES],
  [
!   AC_CACHE_CHECK([for []_AC_LANG[] compiler flag to ignore unused libraries],
!     [gl_cv_prog_[]_AC_LANG_ABBREV[]_ignore_unused_libraries],
!     [gl_cv_prog_[]_AC_LANG_ABBREV[]_ignore_unused_libraries=none
       gl_saved_ldflags=$LDFLAGS
       gl_saved_libs=$LIBS
       # Link with -lm to detect binutils 2.16 bug with --as-needed; see
***************
*** 21,43 ****
       # to forestall problems with linkers that have -z, -i, -g, -n, etc. 
flags.
       # GCC + binutils likes '-Wl,--as-needed'.
       # GCC + Solaris ld likes '-Wl,-z,ignore'.
!      # Sun C likes '-z ignore'.
       # Don't try bare '--as-needed'; nothing likes it and the HP-UX 11.11
       # native cc issues annoying warnings and then ignores it,
       # which would cause us to incorrectly conclude that it worked.
!      for gl_flags in \
!         '-Wl,--as-needed' \
!         '-Wl,-z,ignore' \
!         '-z ignore'
       do
         LDFLAGS="$gl_flags $LDFLAGS"
         AC_LINK_IFELSE([AC_LANG_PROGRAM()],
!          [gl_cv_ignore_unused_libraries=$gl_flags])
         LDFLAGS=$gl_saved_ldflags
!        test "$gl_cv_ignore_unused_libraries" != none && break
       done
!      LIBS=$gl_saved_libs])
  
!   test "$gl_cv_ignore_unused_libraries" != none &&
!     LDFLAGS="$LDFLAGS $gl_cv_ignore_unused_libraries"
  ])
--- 59,115 ----
       # to forestall problems with linkers that have -z, -i, -g, -n, etc. 
flags.
       # GCC + binutils likes '-Wl,--as-needed'.
       # GCC + Solaris ld likes '-Wl,-z,ignore'.
!      # Sun C likes '-Wl,-z,ignore'. '-z ignore' is accepted but has no effect.
       # Don't try bare '--as-needed'; nothing likes it and the HP-UX 11.11
       # native cc issues annoying warnings and then ignores it,
       # which would cause us to incorrectly conclude that it worked.
!      for gl_flags in _gl_IGNORE_UNUSED_LIBRARIES_OPTIONS
       do
         LDFLAGS="$gl_flags $LDFLAGS"
         AC_LINK_IFELSE([AC_LANG_PROGRAM()],
!          [gl_cv_prog_[]_AC_LANG_ABBREV[]_ignore_unused_libraries=$gl_flags])
         LDFLAGS=$gl_saved_ldflags
!        test "$gl_cv_prog_[]_AC_LANG_ABBREV[]_ignore_unused_libraries" != none 
&&
!          break
       done
!      LIBS=$gl_saved_libs
!     ])
!   IGNORE_UNUSED_LIBRARIES_[]_AC_LANG_PREFIX[]FLAGS=
!   if test "$gl_cv_prog_[]_AC_LANG_ABBREV[]_ignore_unused_libraries" != none; 
then
!     
IGNORE_UNUSED_LIBRARIES_[]_AC_LANG_PREFIX[]FLAGS="$gl_cv_prog_[]_AC_LANG_ABBREV[]_ignore_unused_libraries"
!   fi
!   AC_SUBST([IGNORE_UNUSED_LIBRARIES_]_AC_LANG_PREFIX[FLAGS])
! ])
! 
! # _gl_IGNORE_UNUSED_LIBRARIES_OPTIONS
! # -----------------------------------
! # Expands to the language dependent options to be tried.
! AC_DEFUN([_gl_IGNORE_UNUSED_LIBRARIES_OPTIONS],
! [_AC_LANG_DISPATCH([$0], _AC_LANG, $@)])
! 
! # _gl_IGNORE_UNUSED_LIBRARIES_OPTIONS(C)
! # --------------------------------------
! m4_define([_gl_IGNORE_UNUSED_LIBRARIES_OPTIONS(C)],
! [ '-Wl,--as-needed' \
!   '-Wl,-z,ignore' \
!   '-z ignore'
! ])
  
! # _gl_IGNORE_UNUSED_LIBRARIES_OPTIONS(C++)
! # ----------------------------------------
! m4_define([_gl_IGNORE_UNUSED_LIBRARIES_OPTIONS(C++)],
! [ '-Wl,--as-needed' \
!   '-Qoption ld -z,ignore' \
!   '-Wl,-z,ignore' \
!   '-z ignore'
  ])
+ 
+ # _gl_IGNORE_UNUSED_LIBRARIES_OPTIONS(Fortran 77)
+ # -----------------------------------------------
+ m4_copy([_gl_IGNORE_UNUSED_LIBRARIES_OPTIONS(C++)],
+         [_gl_IGNORE_UNUSED_LIBRARIES_OPTIONS(Fortran 77)])
+ 
+ # _gl_IGNORE_UNUSED_LIBRARIES_OPTIONS(Fortran)
+ # --------------------------------------------
+ m4_copy([_gl_IGNORE_UNUSED_LIBRARIES_OPTIONS(Fortran 77)],
+         [_gl_IGNORE_UNUSED_LIBRARIES_OPTIONS(Fortran)])




reply via email to

[Prev in Thread] Current Thread [Next in Thread]