diff options
author | ph10 <ph10@2f5784b3-3f2a-0410-8824-cb99058d5e15> | 2012-11-01 17:41:36 +0000 |
---|---|---|
committer | ph10 <ph10@2f5784b3-3f2a-0410-8824-cb99058d5e15> | 2012-11-01 17:41:36 +0000 |
commit | 616b6d7fb061e403e6086f00164ecf515c20631a (patch) | |
tree | b6c27a2437bef1fd7310bc71426da613275ce31b | |
parent | 5ea1a1ad9979d44cac2cb471ba10b2c71f33295d (diff) | |
download | pcre-616b6d7fb061e403e6086f00164ecf515c20631a.tar.gz |
GCC visibility patch.
git-svn-id: svn://vcs.exim.org/pcre/code/trunk@1196 2f5784b3-3f2a-0410-8824-cb99058d5e15
-rw-r--r-- | ChangeLog | 2 | ||||
-rw-r--r-- | Makefile.am | 11 | ||||
-rw-r--r-- | configure.ac | 10 | ||||
-rw-r--r-- | m4/pcre_visibility.m4 | 89 |
4 files changed, 107 insertions, 5 deletions
@@ -146,6 +146,8 @@ Version 8.32 greater than 0x7fffffff (which cannot be represented in UTF-8, even under the "old" RFC 2279). Instead, it ended up passing a negative length to pcre_exec(). + +31. Add support for GCC's visibility feature to hide internal functions. Version 8.31 06-July-2012 diff --git a/Makefile.am b/Makefile.am index 3dfed2f..42e5503 100644 --- a/Makefile.am +++ b/Makefile.am @@ -101,7 +101,7 @@ EXTRA_DIST = # These files contain additional m4 macros that are used by autoconf. EXTRA_DIST += \ - m4/ax_pthread.m4 + m4/ax_pthread.m4 m4/pcre_visibility.m4 # These files contain maintenance information EXTRA_DIST += \ @@ -207,6 +207,7 @@ BUILT_SOURCES = pcre_chartables.c # Build the 8 bit library if it is enabled. if WITH_PCRE8 lib_LTLIBRARIES += libpcre.la + libpcre_la_SOURCES = \ pcre_byte_order.c \ pcre_compile.c \ @@ -232,6 +233,7 @@ libpcre_la_SOURCES = \ ucp.h libpcre_la_CFLAGS = \ + $(VISIBILITY_CFLAGS) \ $(AM_CFLAGS) libpcre_la_LIBADD = @@ -270,6 +272,7 @@ libpcre16_la_SOURCES = \ pcre16_xclass.c libpcre16_la_CFLAGS = \ + $(VISIBILITY_CFLAGS) \ $(AM_CFLAGS) libpcre16_la_LIBADD = @@ -308,7 +311,9 @@ libpcre32_la_SOURCES = \ pcre32_xclass.c libpcre32_la_CFLAGS = \ + $(VISIBILITY_CFLAGS) \ $(AM_CFLAGS) + libpcre32_la_LIBADD = ## This file is generated as part of the building process, so don't distribute. @@ -407,7 +412,7 @@ if WITH_PCRE8 lib_LTLIBRARIES += libpcreposix.la libpcreposix_la_SOURCES = \ pcreposix.c -libpcreposix_la_CFLAGS = $(AM_CFLAGS) +libpcreposix_la_CFLAGS = $(VISIBILITY_CFLAGS) $(AM_CFLAGS) libpcreposix_la_LDFLAGS = $(EXTRA_LIBPCREPOSIX_LDFLAGS) libpcreposix_la_LIBADD = libpcre.la @@ -426,7 +431,7 @@ libpcrecpp_la_SOURCES = \ pcrecpp.cc \ pcre_scanner.cc \ pcre_stringpiece.cc -libpcrecpp_la_CXXFLAGS = $(AM_CXXFLAGS) +libpcrecpp_la_CXXFLAGS = $(VISIBILITY_CXXFLAGS) $(AM_CXXFLAGS) libpcrecpp_la_LDFLAGS = $(EXTRA_LIBPCRECPP_LDFLAGS) libpcrecpp_la_LIBADD = libpcre.la diff --git a/configure.ac b/configure.ac index 8902207..2aa7587 100644 --- a/configure.ac +++ b/configure.ac @@ -86,6 +86,12 @@ AC_LIBTOOL_WIN32_DLL LT_INIT AC_PROG_LN_S +# Check for GCC visibility feature + +PCRE_VISIBILITY + +# Versioning + PCRE_MAJOR="pcre_major" PCRE_MINOR="pcre_minor" PCRE_PRERELEASE="pcre_prerelease" @@ -1033,8 +1039,8 @@ $PACKAGE-$VERSION configuration summary: C++ compiler .................... : ${CXX} Linker .......................... : ${LD} C preprocessor flags ............ : ${CPPFLAGS} - C compiler flags ................ : ${CFLAGS} - C++ compiler flags .............. : ${CXXFLAGS} + C compiler flags ................ : ${CFLAGS} ${VISIBILITY_CFLAGS} + C++ compiler flags .............. : ${CXXFLAGS} ${VISIBILITY_CXXFLAGS} Linker flags .................... : ${LDFLAGS} Extra libraries ................. : ${LIBS} diff --git a/m4/pcre_visibility.m4 b/m4/pcre_visibility.m4 new file mode 100644 index 0000000..31f5deb --- /dev/null +++ b/m4/pcre_visibility.m4 @@ -0,0 +1,89 @@ +# visibility.m4 serial 4 (gettext-0.18.2) +dnl Copyright (C) 2005, 2008, 2010-2011 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Bruno Haible. + +dnl Tests whether the compiler supports the command-line option +dnl -fvisibility=hidden and the function and variable attributes +dnl __attribute__((__visibility__("hidden"))) and +dnl __attribute__((__visibility__("default"))). +dnl Does *not* test for __visibility__("protected") - which has tricky +dnl semantics (see the 'vismain' test in glibc) and does not exist e.g. on +dnl MacOS X. +dnl Does *not* test for __visibility__("internal") - which has processor +dnl dependent semantics. +dnl Does *not* test for #pragma GCC visibility push(hidden) - which is +dnl "really only recommended for legacy code". +dnl Set the variable CFLAG_VISIBILITY. +dnl Defines and sets the variable HAVE_VISIBILITY. + +dnl Modified to fit with PCRE build environment by Cristian RodrÃguez. + +AC_DEFUN([PCRE_VISIBILITY], +[ + AC_REQUIRE([AC_PROG_CC]) + VISIBILITY_CFLAGS= + VISIBILITY_CXXFLAGS= + 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([pcre_cv_cc_vis_werror], [ + pcre_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Werror" + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[]], [[]])], + [pcre_cv_cc_vis_werror=yes], + [pcre_cv_cc_vis_werror=no]) + CFLAGS="$pcre_save_CFLAGS"]) + AC_MSG_RESULT([$pcre_cv_cc_vis_werror]) + dnl Now check whether visibility declarations are supported. + AC_MSG_CHECKING([for simple visibility declarations]) + AC_CACHE_VAL([pcre_cv_cc_visibility], [ + pcre_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 $pcre_cv_cc_vis_werror = yes; then + CFLAGS="$CFLAGS -Werror" + fi + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[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) {} + ]], + [[]])], + [pcre_cv_cc_visibility=yes], + [pcre_cv_cc_visibility=no]) + CFLAGS="$pcre_save_CFLAGS"]) + AC_MSG_RESULT([$pcre_cv_cc_visibility]) + if test $pcre_cv_cc_visibility = yes; then + VISIBILITY_CFLAGS="-fvisibility=hidden" + VISIBILITY_CXXFLAGS="-fvisibility=hidden -fvisibility-inlines-hidden" + HAVE_VISIBILITY=1 + AC_DEFINE(PCRE_EXP_DECL, [extern __attribute__ ((visibility ("default")))], [to make a symbol visible]) + AC_DEFINE(PCRE_EXP_DEFN, [__attribute__ ((visibility ("default")))], [to make a symbol visible]) + AC_DEFINE(PCRE_EXP_DATA_DEFN, [__attribute__ ((visibility ("default")))], [to make a symbol visible]) + AC_DEFINE(PCREPOSIX_EXP_DECL, [extern __attribute__ ((visibility ("default")))], [to make a symbol visible]) + AC_DEFINE(PCREPOSIX_EXP_DEFN, [extern __attribute__ ((visibility ("default")))], [to make a symbol visible]) + AC_DEFINE(PCRECPP_EXP_DECL, [extern __attribute__ ((visibility ("default")))], [to make a symbol visible]) + AC_DEFINE(PCRECPP_EXP_DEFN, [__attribute__ ((visibility ("default")))], [to make a symbol visible]) + fi + fi + AC_SUBST([VISIBILITY_CFLAGS]) + AC_SUBST([VISIBILITY_CXXFLAGS]) + AC_SUBST([HAVE_VISIBILITY]) + AC_DEFINE_UNQUOTED([HAVE_VISIBILITY], [$HAVE_VISIBILITY], + [Define to 1 or 0, depending whether the compiler supports simple visibility declarations.]) +]) |