From 203d6b315aec5bbc7c17bd5821a998bd0970f24b Mon Sep 17 00:00:00 2001 From: Alexis Martin Date: Thu, 1 Oct 2015 16:12:25 -0400 Subject: [PATCH] Port: Add support for linkers with no support for 'no-as-needed' MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Michael Jeanson Signed-off-by: Jérémie Galarneau --- compat/Makefile.am | 2 +- configure.ac | 4 ++ converter/Makefile.am | 2 +- formats/bt-dummy/Makefile.am | 2 +- formats/ctf-metadata/Makefile.am | 2 +- formats/ctf-text/Makefile.am | 2 +- formats/ctf/Makefile.am | 2 +- formats/lttng-live/Makefile.am | 2 +- m4/ax_append_flag.m4 | 71 ++++++++++++++++++++++++++++++ m4/ax_append_link_flags.m4 | 63 +++++++++++++++++++++++++++ m4/ax_check_link_flag.m4 | 74 ++++++++++++++++++++++++++++++++ m4/ax_require_defined.m4 | 37 ++++++++++++++++ tests/lib/Makefile.am | 2 +- 13 files changed, 257 insertions(+), 8 deletions(-) create mode 100644 m4/ax_append_flag.m4 create mode 100644 m4/ax_append_link_flags.m4 create mode 100644 m4/ax_check_link_flag.m4 create mode 100644 m4/ax_require_defined.m4 diff --git a/compat/Makefile.am b/compat/Makefile.am index b09ebab1..38af1885 100644 --- a/compat/Makefile.am +++ b/compat/Makefile.am @@ -5,7 +5,7 @@ noinst_LTLIBRARIES = libcompat.la libcompat_la_SOURCES = dummy.c libcompat_la_LDFLAGS = \ - -Wl,--no-as-needed + $(LD_NO_AS_NEEDED) if BABELTRACE_BUILD_WITH_MINGW libcompat_la_SOURCES += compat_uuid.c diff --git a/configure.ac b/configure.ac index 507efe6c..eb19de3b 100644 --- a/configure.ac +++ b/configure.ac @@ -29,6 +29,10 @@ LT_INIT AC_PROG_YACC AC_PROG_LEX +# Check linker option +AX_APPEND_LINK_FLAGS([-Wl,--no-as-needed], [LD_NO_AS_NEEDED]) +AC_SUBST([LD_NO_AS_NEEDED]) + if test ! -f "$srcdir/formats/ctf/metadata/ctf-parser.h"; then if test x"$YACC" != "xbison -y"; then AC_MSG_ERROR([[bison not found and is required when building from git. diff --git a/converter/Makefile.am b/converter/Makefile.am index 374d1d47..af95627d 100644 --- a/converter/Makefile.am +++ b/converter/Makefile.am @@ -9,7 +9,7 @@ babeltrace_SOURCES = \ # -Wl,--no-as-needed is needed for recent gold linker who seems to think # it knows better and considers libraries with constructors having # side-effects as dead code. -babeltrace_LDFLAGS = -Wl,--no-as-needed +babeltrace_LDFLAGS = $(LD_NO_AS_NEEDED) babeltrace_LDADD = \ $(top_builddir)/lib/libbabeltrace.la \ $(top_builddir)/formats/ctf/libbabeltrace-ctf.la \ diff --git a/formats/bt-dummy/Makefile.am b/formats/bt-dummy/Makefile.am index 1d21de94..e8ae4de9 100644 --- a/formats/bt-dummy/Makefile.am +++ b/formats/bt-dummy/Makefile.am @@ -7,7 +7,7 @@ libbabeltrace_dummy_la_SOURCES = \ # Request that the linker keeps all static libraries objects. libbabeltrace_dummy_la_LDFLAGS = \ - -Wl,--no-as-needed -version-info $(BABELTRACE_LIBRARY_VERSION) + $(LD_NO_AS_NEEDED) -version-info $(BABELTRACE_LIBRARY_VERSION) libbabeltrace_dummy_la_LIBADD = \ $(top_builddir)/lib/libbabeltrace.la diff --git a/formats/ctf-metadata/Makefile.am b/formats/ctf-metadata/Makefile.am index f5061761..252d9afa 100644 --- a/formats/ctf-metadata/Makefile.am +++ b/formats/ctf-metadata/Makefile.am @@ -7,7 +7,7 @@ libbabeltrace_ctf_metadata_la_SOURCES = \ # Request that the linker keeps all static libraries objects. libbabeltrace_ctf_metadata_la_LDFLAGS = \ - -Wl,--no-as-needed -version-info $(BABELTRACE_LIBRARY_VERSION) + $(LD_NO_AS_NEEDED) -version-info $(BABELTRACE_LIBRARY_VERSION) libbabeltrace_ctf_metadata_la_LIBADD = \ $(top_builddir)/lib/libbabeltrace.la diff --git a/formats/ctf-text/Makefile.am b/formats/ctf-text/Makefile.am index 1619df3e..39f8f389 100644 --- a/formats/ctf-text/Makefile.am +++ b/formats/ctf-text/Makefile.am @@ -8,7 +8,7 @@ libbabeltrace_ctf_text_la_SOURCES = \ ctf-text.c libbabeltrace_ctf_text_la_LDFLAGS = \ - -Wl,--no-as-needed -version-info $(BABELTRACE_LIBRARY_VERSION) \ + $(LD_NO_AS_NEEDED) -version-info $(BABELTRACE_LIBRARY_VERSION) \ types/libctf-text-types.la libbabeltrace_ctf_text_la_LIBADD = \ diff --git a/formats/ctf/Makefile.am b/formats/ctf/Makefile.am index 5d8a2970..094cb36d 100644 --- a/formats/ctf/Makefile.am +++ b/formats/ctf/Makefile.am @@ -13,7 +13,7 @@ libbabeltrace_ctf_la_SOURCES = \ # Request that the linker keeps all static libraries objects. libbabeltrace_ctf_la_LDFLAGS = \ - -Wl,--no-as-needed -version-info $(BABELTRACE_LIBRARY_VERSION) + $(LD_NO_AS_NEEDED) -version-info $(BABELTRACE_LIBRARY_VERSION) libbabeltrace_ctf_la_LIBADD = \ $(top_builddir)/lib/libbabeltrace.la \ diff --git a/formats/lttng-live/Makefile.am b/formats/lttng-live/Makefile.am index 2c6b0bd1..d9769796 100644 --- a/formats/lttng-live/Makefile.am +++ b/formats/lttng-live/Makefile.am @@ -11,7 +11,7 @@ libbabeltrace_lttng_live_la_SOURCES = \ # Request that the linker keeps all static libraries objects. libbabeltrace_lttng_live_la_LDFLAGS = \ - -Wl,--no-as-needed -version-info $(BABELTRACE_LIBRARY_VERSION) + $(LD_NO_AS_NEEDED) -version-info $(BABELTRACE_LIBRARY_VERSION) libbabeltrace_lttng_live_la_LIBADD = \ $(top_builddir)/lib/libbabeltrace.la diff --git a/m4/ax_append_flag.m4 b/m4/ax_append_flag.m4 new file mode 100644 index 00000000..08f2e07e --- /dev/null +++ b/m4/ax_append_flag.m4 @@ -0,0 +1,71 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_append_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE]) +# +# DESCRIPTION +# +# FLAG is appended to the FLAGS-VARIABLE shell variable, with a space +# added in between. +# +# If FLAGS-VARIABLE is not specified, the current language's flags (e.g. +# CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains +# FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly +# FLAG. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 6 + +AC_DEFUN([AX_APPEND_FLAG], +[dnl +AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF +AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])]) +AS_VAR_SET_IF(FLAGS,[ + AS_CASE([" AS_VAR_GET(FLAGS) "], + [*" $1 "*], [AC_RUN_LOG([: FLAGS already contains $1])], + [ + AS_VAR_APPEND(FLAGS,[" $1"]) + AC_RUN_LOG([: FLAGS="$FLAGS"]) + ]) + ], + [ + AS_VAR_SET(FLAGS,[$1]) + AC_RUN_LOG([: FLAGS="$FLAGS"]) + ]) +AS_VAR_POPDEF([FLAGS])dnl +])dnl AX_APPEND_FLAG diff --git a/m4/ax_append_link_flags.m4 b/m4/ax_append_link_flags.m4 new file mode 100644 index 00000000..c73ddafc --- /dev/null +++ b/m4/ax_append_link_flags.m4 @@ -0,0 +1,63 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_append_link_flags.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_APPEND_LINK_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS]) +# +# DESCRIPTION +# +# For every FLAG1, FLAG2 it is checked whether the linker works with the +# flag. If it does, the flag is added FLAGS-VARIABLE +# +# If FLAGS-VARIABLE is not specified, the linker's flags (LDFLAGS) is +# used. During the check the flag is always added to the linker's flags. +# +# If EXTRA-FLAGS is defined, it is added to the linker's default flags +# when the check is done. The check is thus made with the flags: "LDFLAGS +# EXTRA-FLAGS FLAG". This can for example be used to force the linker to +# issue an error when a bad flag is given. +# +# NOTE: This macro depends on the AX_APPEND_FLAG and AX_CHECK_LINK_FLAG. +# Please keep this macro in sync with AX_APPEND_COMPILE_FLAGS. +# +# LICENSE +# +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 4 + +AC_DEFUN([AX_APPEND_LINK_FLAGS], +[AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG]) +AX_REQUIRE_DEFINED([AX_APPEND_FLAG]) +for flag in $1; do + AX_CHECK_LINK_FLAG([$flag], [AX_APPEND_FLAG([$flag], [m4_default([$2], [LDFLAGS])])], [], [$3]) +done +])dnl AX_APPEND_LINK_FLAGS diff --git a/m4/ax_check_link_flag.m4 b/m4/ax_check_link_flag.m4 new file mode 100644 index 00000000..eb01a6ce --- /dev/null +++ b/m4/ax_check_link_flag.m4 @@ -0,0 +1,74 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_check_link_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) +# +# DESCRIPTION +# +# Check whether the given FLAG works with the linker or gives an error. +# (Warnings, however, are ignored) +# +# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +# success/failure. +# +# If EXTRA-FLAGS is defined, it is added to the linker's default flags +# when the check is done. The check is thus made with the flags: "LDFLAGS +# EXTRA-FLAGS FLAG". This can for example be used to force the linker to +# issue an error when a bad flag is given. +# +# INPUT gives an alternative input source to AC_LINK_IFELSE. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this +# macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 4 + +AC_DEFUN([AX_CHECK_LINK_FLAG], +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF +AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl +AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [ + ax_check_save_flags=$LDFLAGS + LDFLAGS="$LDFLAGS $4 $1" + AC_LINK_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])]) + LDFLAGS=$ax_check_save_flags]) +AS_VAR_IF(CACHEVAR,yes, + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_LINK_FLAGS diff --git a/m4/ax_require_defined.m4 b/m4/ax_require_defined.m4 new file mode 100644 index 00000000..cae11112 --- /dev/null +++ b/m4/ax_require_defined.m4 @@ -0,0 +1,37 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_require_defined.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_REQUIRE_DEFINED(MACRO) +# +# DESCRIPTION +# +# AX_REQUIRE_DEFINED is a simple helper for making sure other macros have +# been defined and thus are available for use. This avoids random issues +# where a macro isn't expanded. Instead the configure script emits a +# non-fatal: +# +# ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found +# +# It's like AC_REQUIRE except it doesn't expand the required macro. +# +# Here's an example: +# +# AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG]) +# +# LICENSE +# +# Copyright (c) 2014 Mike Frysinger +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 1 + +AC_DEFUN([AX_REQUIRE_DEFINED], [dnl + m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])]) +])dnl AX_REQUIRE_DEFINED diff --git a/tests/lib/Makefile.am b/tests/lib/Makefile.am index 7c96e4ab..8c46acb5 100644 --- a/tests/lib/Makefile.am +++ b/tests/lib/Makefile.am @@ -9,7 +9,7 @@ libtestcommon_a_SOURCES = common.c common.h # -Wl,--no-as-needed is needed for recent gold linker who seems to think # it knows better and considers libraries with constructors having # side-effects as dead code. -test_seek_LDFLAGS = -Wl,--no-as-needed +test_seek_LDFLAGS = $(LD_NO_AS_NEEDED) test_seek_LDADD = $(LIBTAP) libtestcommon.a \ $(top_builddir)/lib/libbabeltrace.la \ $(top_builddir)/formats/ctf/libbabeltrace-ctf.la -- 2.34.1