From eb36500ac425c2b4f038bbcb1d3e38f353f0402c Mon Sep 17 00:00:00 2001 From: Matthew Brush Date: Mon, 13 Oct 2014 23:07:11 -0700 Subject: [PATCH] Improve Autotools build system for libgeany Checks if the compiler supports -fvisibility and the linker supports -dynamic-list arguments and use them instead of hardcoding. The new geany-lib.m4 also accomodates future use of Libtool versioning. --- configure.ac | 3 +++ m4/geany-lib.m4 | 48 ++++++++++++++++++++++++++++++++++++++++++++ scintilla/Makefile.am | 5 +++-- src/Makefile.am | 21 +++++++++---------- tagmanager/ctags/Makefile.am | 3 ++- tagmanager/mio/Makefile.am | 3 ++- tagmanager/src/Makefile.am | 4 +++- 7 files changed, 71 insertions(+), 16 deletions(-) create mode 100644 m4/geany-lib.m4 diff --git a/configure.ac b/configure.ac index 8d8ee6b9f..0efd4011c 100644 --- a/configure.ac +++ b/configure.ac @@ -122,6 +122,9 @@ AC_SUBST([pkgdatadir]) GEANY_CHECK_DOCUTILS GEANY_CHECK_DOXYGEN +# libgeany +GEANY_LIB_INIT + # Output AC_CONFIG_FILES([ Makefile diff --git a/m4/geany-lib.m4 b/m4/geany-lib.m4 new file mode 100644 index 000000000..90323342d --- /dev/null +++ b/m4/geany-lib.m4 @@ -0,0 +1,48 @@ +AC_DEFUN([GEANY_LIB_INIT], +[ + +dnl In the future, if we want to use libtool/library versioning, we can +dnl set these variables accordingly. For now its the same as if not specified (0:0:0) + libgeany_current=0 + libgeany_revision=0 + libgeany_age=0 + +dnl Try and see if we can use -fvisibility compiler option and GCC`s +dnl `__attribute__((visibility(...)))` extension and use it if so. + AC_MSG_CHECKING([whether compiler supports -fvisibility]) + libgeany_backup_cflags=$CFLAGS + CFLAGS=-fvisibility=hidden + AC_TRY_COMPILE([], [ + __attribute__ ((visibility ("default"))) + int main(int argc, char **argv) { return 0; } + ], [ + LIBGEANY_CFLAGS="${CFLAGS}" + AC_MSG_RESULT([yes]) + ], [ + LIBGEANY_CFLAGS="" + AC_MSG_RESULT([no]) + ]) + CFLAGS="${libgeany_backup_cflags}" + +dnl Try and see if we can use our list of dynamically exported symbols with +dnl the linker and use it if so. + AC_MSG_CHECKING([whether linker supports --dynamic-list]) + libgeany_backup_ldflags=$LDFLAGS + LDFLAGS=-Wl,--dynamic-list="${srcdir}/src/dynamicsymbols.list" + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([], []) + ], [ + LIBGEANY_LIBS="-Wl,--dynamic-list=\"\$(top_srcdir)/src/dynamicsymbols.list\"" + AC_MSG_RESULT([yes]) + ], [ + LIBGEANY_LIBS="" + AC_MSG_RESULT([no]) + ]) + LDFLAGS="${libgeany_backup_ldflags}" + + LIBGEANY_LIBS="${LIBGEANY_LIBS} -version-info ${libgeany_current}:${libgeany_revision}:${libgeany_age}" + + AC_SUBST([LIBGEANY_CFLAGS]) + AC_SUBST([LIBGEANY_LIBS]) + +]) diff --git a/scintilla/Makefile.am b/scintilla/Makefile.am index cf2377a2e..022f38c8c 100644 --- a/scintilla/Makefile.am +++ b/scintilla/Makefile.am @@ -140,9 +140,10 @@ src/XPM.h \ $(LEXER_SRCS) libscintilla_la_SOURCES = $(SRCS) +libscintilla_la_LDFLAGS = @LIBGEANY_LIBS@ -AM_CPPFLAGS = -I$(top_srcdir) -I$(srcdir)/include -I$(srcdir)/src -I$(srcdir)/lexlib @GTK_CFLAGS@ \ - -fvisibility=hidden +AM_CPPFLAGS = -I$(top_srcdir) -I$(srcdir)/include -I$(srcdir)/src -I$(srcdir)/lexlib \ + @GTK_CFLAGS@ @LIBGEANY_CFLAGS@ marshallers: gtk/scintilla-marshal.list glib-genmarshal --prefix scintilla_marshal gtk/scintilla-marshal.list --header > gtk/scintilla-marshal.h diff --git a/src/Makefile.am b/src/Makefile.am index eb4d4789f..636e636b8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -102,11 +102,11 @@ AM_CPPFLAGS = \ -I$(top_srcdir) \ -I$(top_srcdir)/scintilla/include \ -I$(top_srcdir)/tagmanager/src \ - @GTK_CFLAGS@ @GTHREAD_CFLAGS@ $(MAC_INTEGRATION_CFLAGS) + @GTK_CFLAGS@ @GTHREAD_CFLAGS@ $(MAC_INTEGRATION_CFLAGS) @LIBGEANY_CFLAGS@ # tell automake we have a C++ file so it uses the C++ linker we need for Scintilla nodist_EXTRA_geany_SOURCES = dummy.cxx - +nodist_EXTRA_libgeany_la_SOURCES = dummy1.cxx if MINGW # build Geany for Windows on non-Windows systems (cross-compile) @@ -121,8 +121,10 @@ libgeany_la_LIBADD = \ @GTK_LIBS@ \ @GTHREAD_LIBS@ \ $(INTLLIBS) \ - -lole32 -luuid -lwsock32 -lcomdlg32 + @LIBGEANY_LIBS@ \ + -lole32 -lwsock32 -lcomdlg32 +libgeany_la_LDFLAGS = -Wl,-luuid $(AM_LDFLAGS) geany_LDADD += geany_private.res -lcomdlg32 AM_CFLAGS = -DGEANY_DATADIR=\"data\" \ @@ -132,10 +134,9 @@ AM_CFLAGS = -DGEANY_DATADIR=\"data\" \ -DGEANY_PREFIX=\"\" \ -DGEANY_PRIVATE \ -DGTK \ - -DG_LOG_DOMAIN=\""Geany"\" \ - -fvisibility=hidden + -DG_LOG_DOMAIN=\""Geany"\" -libgeany_la_LDFLAGS = -mwindows -mms-bitfields -no-undefined +libgeany_la_LDFLAGS += -mwindows -mms-bitfields -no-undefined WINDRES = $(host_alias)-windres @@ -158,9 +159,8 @@ libgeany_la_LIBADD = \ @GTK_LIBS@ \ @GTHREAD_LIBS@ \ $(MAC_INTEGRATION_LIBS) \ - $(INTLLIBS) - -libgeany_la_LDFLAGS = -Wl,--dynamic-list="$(srcdir)/dynamicsymbols.list" + $(INTLLIBS) \ + @LIBGEANY_LIBS@ AM_CFLAGS = -DGEANY_DATADIR=\""$(datadir)"\" \ -DGEANY_DOCDIR=\""$(docdir)"\" \ @@ -169,8 +169,7 @@ AM_CFLAGS = -DGEANY_DATADIR=\""$(datadir)"\" \ -DGEANY_PREFIX=\""$(prefix)"\" \ -DGEANY_PRIVATE \ -DGTK \ - -DG_LOG_DOMAIN=\""Geany"\" \ - -fvisibility=hidden + -DG_LOG_DOMAIN=\""Geany"\" clean-local: diff --git a/tagmanager/ctags/Makefile.am b/tagmanager/ctags/Makefile.am index ca3eb523c..c81ccf73b 100644 --- a/tagmanager/ctags/Makefile.am +++ b/tagmanager/ctags/Makefile.am @@ -4,7 +4,7 @@ AM_CPPFLAGS = \ -DG_LOG_DOMAIN=\"CTags\" AM_CFLAGS = \ $(GTK_CFLAGS) \ - -fvisibility=hidden + @LIBGEANY_CFLAGS@ EXTRA_DIST = \ makefile.win32 @@ -84,3 +84,4 @@ libctags_la_SOURCES = \ vstring.h \ $(parsers) +libctags_la_LDFLAGS = @LIBGEANY_LIBS@ diff --git a/tagmanager/mio/Makefile.am b/tagmanager/mio/Makefile.am index 189250b4b..c19810724 100644 --- a/tagmanager/mio/Makefile.am +++ b/tagmanager/mio/Makefile.am @@ -1,9 +1,10 @@ noinst_LTLIBRARIES = libmio.la AM_CPPFLAGS = -DG_LOG_DOMAIN=\"MIO\" #-DMIO_DEBUG -AM_CFLAGS = $(GTK_CFLAGS) -fvisibility=hidden +AM_CFLAGS = $(GTK_CFLAGS) @LIBGEANY_CFLAGS@ libmio_la_SOURCES = mio.c +libmio_la_LDFLAGS = @LIBGEANY_LIBS@ EXTRA_DIST = \ mio.h \ diff --git a/tagmanager/src/Makefile.am b/tagmanager/src/Makefile.am index 97d5cb26b..c7e640950 100644 --- a/tagmanager/src/Makefile.am +++ b/tagmanager/src/Makefile.am @@ -6,7 +6,7 @@ AM_CPPFLAGS = \ -DG_LOG_DOMAIN=\"Tagmanager\" AM_CFLAGS = \ $(GTK_CFLAGS) \ - -fvisibility=hidden + @LIBGEANY_CFLAGS@ EXTRA_DIST = \ makefile.win32 @@ -30,3 +30,5 @@ libtagmanager_la_SOURCES =\ tm_tag.c \ tm_workspace.h \ tm_workspace.c + +libtagmanager_la_LDFLAGS = @LIBGEANY_LIBS@ -- 2.11.4.GIT