diff mbox

[RFC,libdrm,1/6] configure: Support symbol visibility when available

Message ID 1392825893-7380-2-git-send-email-thierry.reding@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Thierry Reding Feb. 19, 2014, 4:04 p.m. UTC
From: Thierry Reding <treding@nvidia.com>

Checks whether or not the compiler supports the -fvisibility option. If
so it sets the VISIBILITY_CFLAGS variable which can be added to the per
directory AM_CFLAGS where appropriate.

Libraries can use the HAVE_VISIBILITY preprocessor definition to check
for availability and use something like this:

	#if defined(HAVE_VISIBILITY)
	#  define drm_private __attribute__((visibility("hidden")))
	#  define drm_public __attribute__((visibility("default")))
	#else
	#  define drm_private
	#  define drm_public
	#endif

By default all symbols will be hidden via the VISIBILITY_CFLAGS. Only
symbols explicitly marked drm_public will be exported.

Signed-off-by: Thierry Reding <treding@nvidia.com>
---
 configure.ac | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

Comments

Erik Faye-Lund Feb. 19, 2014, 9:05 p.m. UTC | #1
On Wed, Feb 19, 2014 at 5:04 PM, Thierry Reding
<thierry.reding@gmail.com> wrote:
> From: Thierry Reding <treding@nvidia.com>
>
> Checks whether or not the compiler supports the -fvisibility option. If
> so it sets the VISIBILITY_CFLAGS variable which can be added to the per
> directory AM_CFLAGS where appropriate.
>
> Libraries can use the HAVE_VISIBILITY preprocessor definition to check
> for availability and use something like this:
>
>         #if defined(HAVE_VISIBILITY)
>         #  define drm_private __attribute__((visibility("hidden")))
>         #  define drm_public __attribute__((visibility("default")))
>         #else
>         #  define drm_private
>         #  define drm_public
>         #endif
>
> By default all symbols will be hidden via the VISIBILITY_CFLAGS. Only
> symbols explicitly marked drm_public will be exported.

As I said in the other patch, I think it makes more sense to define
these globally. The other drivers still need to opt-in on the feature,
but it's less work, less duplication of logic and less
points-of-failure ;)
Thierry Reding Feb. 19, 2014, 9:50 p.m. UTC | #2
On Wed, Feb 19, 2014 at 10:05:19PM +0100, Erik Faye-Lund wrote:
> On Wed, Feb 19, 2014 at 5:04 PM, Thierry Reding
> <thierry.reding@gmail.com> wrote:
> > From: Thierry Reding <treding@nvidia.com>
> >
> > Checks whether or not the compiler supports the -fvisibility option. If
> > so it sets the VISIBILITY_CFLAGS variable which can be added to the per
> > directory AM_CFLAGS where appropriate.
> >
> > Libraries can use the HAVE_VISIBILITY preprocessor definition to check
> > for availability and use something like this:
> >
> >         #if defined(HAVE_VISIBILITY)
> >         #  define drm_private __attribute__((visibility("hidden")))
> >         #  define drm_public __attribute__((visibility("default")))
> >         #else
> >         #  define drm_private
> >         #  define drm_public
> >         #endif
> >
> > By default all symbols will be hidden via the VISIBILITY_CFLAGS. Only
> > symbols explicitly marked drm_public will be exported.
> 
> As I said in the other patch, I think it makes more sense to define
> these globally. The other drivers still need to opt-in on the feature,
> but it's less work, less duplication of logic and less
> points-of-failure ;)

Well, if you put it that way, having it in somewhere in the core might
be a better option after all. I'll sleep on it.

Thierry
diff mbox

Patch

diff --git a/configure.ac b/configure.ac
index d2d19d66dc17..3f4164238494 100644
--- a/configure.ac
+++ b/configure.ac
@@ -365,6 +365,26 @@  AC_ARG_WITH([kernel-source],
 	    [kernel_source="$with_kernel_source"])
 AC_SUBST(kernel_source)
 
+dnl Add flags for gcc and g++
+if test "x$GCC" = xyes; then
+    # Enable -fvisibility=hidden if using a gcc that supports it
+    save_CFLAGS="$CFLAGS"
+    AC_MSG_CHECKING([whether $CC supports -fvisibility=hidden])
+    VISIBILITY_CFLAGS="-fvisibility=hidden"
+    CFLAGS="$CFLAGS $VISIBILITY_CFLAGS"
+    AC_LINK_IFELSE([AC_LANG_PROGRAM()], AC_MSG_RESULT([yes]),
+                   [VISIBILITY_CFLAGS=""; AC_MSG_RESULT([no])]);
+
+    # Restore CFLAGS; VISIBILITY_CFLAGS are added to it where needed.
+    CFLAGS=$save_CFLAGS
+
+    if test "x$VISIBILITY_CFLAGS" != x; then
+        AC_DEFINE(HAVE_VISIBILITY, 1, [Compiler has -fvisibility support])
+    fi
+
+    AC_SUBST([VISIBILITY_CFLAGS])
+fi
+
 AC_SUBST(WARN_CFLAGS)
 AC_CONFIG_FILES([
 	Makefile