lib-ignore: Determine different options for different compilers.
authorBruno Haible <bruno@clisp.org>
Sun, 28 Mar 2010 09:23:57 +0000 (11:23 +0200)
committerBruno Haible <bruno@clisp.org>
Sun, 28 Mar 2010 09:23:57 +0000 (11:23 +0200)
ChangeLog
NEWS
m4/lib-ignore.m4

index 97ad7c3..dca5a12 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2010-03-28  Bruno Haible  <bruno@clisp.org>
+            Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
+
+       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.
+
 2010-03-27  Bruno Haible  <bruno@clisp.org>
 
        Remove unused GNULIB_XYZ macro definitions.
diff --git a/NEWS b/NEWS
index 0074492..778e3b9 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,12 @@ User visible incompatible changes
 
 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.
index 0236cb5..a67b002 100644 (file)
@@ -7,11 +7,49 @@ dnl with or without modifications, as long as this notice is preserved.
 
 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 flag to ignore unused libraries],
-    [gl_cv_ignore_unused_libraries],
-    [gl_cv_ignore_unused_libraries=none
+  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,23 +59,57 @@ AC_DEFUN([gl_IGNORE_UNUSED_LIBRARIES],
      # 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'.
+     # 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 \
-        '-Wl,--as-needed' \
-        '-Wl,-z,ignore' \
-        '-z ignore'
+     for gl_flags in _gl_IGNORE_UNUSED_LIBRARIES_OPTIONS
      do
        LDFLAGS="$gl_flags $LDFLAGS"
        AC_LINK_IFELSE([AC_LANG_PROGRAM()],
-         [gl_cv_ignore_unused_libraries=$gl_flags])
+         [gl_cv_prog_[]_AC_LANG_ABBREV[]_ignore_unused_libraries=$gl_flags])
        LDFLAGS=$gl_saved_ldflags
-       test "$gl_cv_ignore_unused_libraries" != none && break
+       test "$gl_cv_prog_[]_AC_LANG_ABBREV[]_ignore_unused_libraries" != none &&
+         break
      done
-     LIBS=$gl_saved_libs])
+     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'
+])
 
-  test "$gl_cv_ignore_unused_libraries" != none &&
-    LDFLAGS="$LDFLAGS $gl_cv_ignore_unused_libraries"
+# _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)])