bug-gnulib
[Top][All Lists]
Advanced

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

Re: visibility.m4


From: Bruno Haible
Subject: Re: visibility.m4
Date: Tue, 20 Apr 2010 11:32:42 +0200
User-agent: KMail/1.9.9

Hi Simon,

Sorry, this thread was in a dark corner of my mailbox where I didn't see your
ping requests.

> >> Bruno, how about this patch?
> >>
> >> /Simon
> >>
> >> diff --git a/m4/visibility.m4 b/m4/visibility.m4
> >> index 35a6dc0..06537d6 100644
> >> --- a/m4/visibility.m4
> >> +++ b/m4/visibility.m4
> >> @@ -29,7 +29,11 @@ AC_DEFUN([gl_VISIBILITY],
> >>      AC_MSG_CHECKING([for simple visibility declarations])
> >>      AC_CACHE_VAL([gl_cv_cc_visibility], [
> >>        gl_save_CFLAGS="$CFLAGS"
> >> -      CFLAGS="$CFLAGS -fvisibility=hidden"
> >> +      # We use -Werror here because Cygwin/MinGW gives a warning
> >> +      # 'visibility attribute not supported in this configuration'
> >> +      # instead of doing what we want.  Using -Werror makes gcc fail
> >> +      # instead, so we detect the problem.
> >> +      CFLAGS="$CFLAGS -fvisibility=hidden -Werror"
> >>        AC_TRY_COMPILE(
> >>          [extern __attribute__((__visibility__("hidden"))) int hiddenvar;
> >>           extern __attribute__((__visibility__("default"))) int 
> >> exportedvar;

Your patch is good, thanks.

It is bizarre, though, that the warning only appears at the first function
definition. Seen on Cygwin 1.7.2:

$ cat foo.c
extern __attribute__((__visibility__("hidden"))) int hiddenvar;
extern __attribute__((__visibility__("default"))) int exportedvar;
extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
extern __attribute__((__visibility__("default"))) int exportedfunc (void);

$ gcc -v
gcc version 4.3.4 20090804 (release) 1 (GCC) 
$ gcc -c -fvisibility=hidden foo.c
$ echo $?
0

$ cat foo.c
extern __attribute__((__visibility__("hidden"))) int hiddenvar;
extern __attribute__((__visibility__("default"))) int exportedvar;
extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
extern __attribute__((__visibility__("default"))) int exportedfunc (void);
void dummyfunc (void) {}

$ gcc -c -fvisibility=hidden foo.c
foo.c: In function ‘dummyfunc’:
foo.c:5: warning: visibility attribute not supported in this configuration; 
ignored

AC_TRY_COMPILE does add a function for 'main', but this deserves a comment at
least.

Also, -Werror may lead to an error always, for example, if the CFLAGS or 
CPPFLAGS
contain an option that gcc warns about always. So, this needs to be checked
against first.

I'm applying this:


2010-04-20  Simon Josefsson  <address@hidden>
            Bruno Haible  <address@hidden>

        visibility: Don't use -fvisibility if it leads to a warning.
        * m4/visibility.m4 (gl_VISIBILITY): Check whether -Werror is usable. If
        yes, don't pretend that visibility works if it leads to a warning.
        Reported by Mike Gran <address@hidden>.

--- m4/visibility.m4.orig       Tue Apr 20 11:22:42 2010
+++ m4/visibility.m4    Tue Apr 20 11:22:20 2010
@@ -1,4 +1,4 @@
-# visibility.m4 serial 2 (gettext-0.18)
+# visibility.m4 serial 3 (gettext-0.18)
 dnl Copyright (C) 2005, 2008-2010 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -26,15 +26,37 @@
   CFLAG_VISIBILITY=
   HAVE_VISIBILITY=0
   if test -n "$GCC"; then
+    dnl First, check whether -Werror can be added to the command line, or
+    dnl whether it leads to an error because of some other option that the
+    dnl user has put into $CC $CFLAGS $CPPFLAGS.
+    AC_MSG_CHECKING([whether the -Werror option is usable])
+    AC_CACHE_VAL([gl_cv_cc_vis_werror], [
+      gl_save_CFLAGS="$CFLAGS"
+      CFLAGS="$CFLAGS -Werror"
+      AC_TRY_COMPILE([], [],
+        [gl_cv_cc_vis_werror=yes],
+        [gl_cv_cc_vis_werror=no])
+      CFLAGS="$gl_save_CFLAGS"])
+    AC_MSG_RESULT([$gl_cv_cc_vis_werror])
+    dnl Now check whether visibility declarations are supported.
     AC_MSG_CHECKING([for simple visibility declarations])
     AC_CACHE_VAL([gl_cv_cc_visibility], [
       gl_save_CFLAGS="$CFLAGS"
       CFLAGS="$CFLAGS -fvisibility=hidden"
+      dnl We use the option -Werror and a function dummyfunc, because on some
+      dnl platforms (Cygwin 1.7) the use of -fvisibility triggers a warning
+      dnl "visibility attribute not supported in this configuration; ignored"
+      dnl at the first function definition in every compilation unit, and we
+      dnl don't want to use the option in this case.
+      if test $gl_cv_cc_vis_werror = yes; then
+        CFLAGS="$CFLAGS -Werror"
+      fi
       AC_TRY_COMPILE(
         [extern __attribute__((__visibility__("hidden"))) int hiddenvar;
          extern __attribute__((__visibility__("default"))) int exportedvar;
          extern __attribute__((__visibility__("hidden"))) int hiddenfunc 
(void);
-         extern __attribute__((__visibility__("default"))) int exportedfunc 
(void);],
+         extern __attribute__((__visibility__("default"))) int exportedfunc 
(void);
+         void dummyfunc (void) {}],
         [],
         [gl_cv_cc_visibility=yes],
         [gl_cv_cc_visibility=no])




reply via email to

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