config/libatomic: require -latomic iff atomic.c doesn't link w/o it

In absence of LTO, and dynamic libatomic, la.so ends up in the needs
section of every toolchain executable; some consider this an issue.

Reviewed-by: Ryan Moeller <ryan@iXsystems.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz>
Closes #12345
Closes #12359
This commit is contained in:
наб 2021-07-13 22:50:48 +02:00 committed by Tony Hutter
parent 960a5a557b
commit 968dc13572
1 changed files with 15 additions and 21 deletions

View File

@ -1,34 +1,28 @@
dnl # dnl #
dnl # If -latomic exists, it's needed for __atomic intrinsics. dnl # If -latomic exists and atomic.c doesn't link without it,
dnl # dnl # it's needed for __atomic intrinsics.
dnl # Some systems (like FreeBSD 13) don't have a libatomic at all because
dnl # their toolchain doesn't ship it they obviously don't need it.
dnl #
dnl # Others (like sufficiently ancient CentOS) have one,
dnl # but terminally broken or unlinkable (e.g. it's a dangling symlink,
dnl # or a linker script that points to a nonexistent file)
dnl # most arches affected by this don't actually need -latomic (and if they do,
dnl # then they should have libatomic that actually exists and links,
dnl # so don't fall into this category).
dnl #
dnl # Technically, we could check if the platform *actually* needs -latomic,
dnl # or if it has native support for all the intrinsics we use,
dnl # but it /really/ doesn't matter, and C11 recommends to always link it.
dnl # dnl #
AC_DEFUN([ZFS_AC_CONFIG_USER_LIBATOMIC], [ AC_DEFUN([ZFS_AC_CONFIG_USER_LIBATOMIC], [
AC_MSG_CHECKING([whether -latomic is present]) AC_MSG_CHECKING([whether -latomic is required])
saved_libs="$LIBS" saved_libs="$LIBS"
LIBS="$LIBS -latomic" LIBS="$LIBS -latomic"
LIBATOMIC_LIBS=""
AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])], [ AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])], [
LIBATOMIC_LIBS="-latomic" LIBS="$saved_libs"
AC_MSG_RESULT([yes]) saved_cflags="$CFLAGS"
], [ CFLAGS="$CFLAGS -isystem lib/libspl/include"
LIBATOMIC_LIBS="" AC_LINK_IFELSE([AC_LANG_PROGRAM([#include "lib/libspl/atomic.c"], [])], [], [LIBATOMIC_LIBS="-latomic"])
AC_MSG_RESULT([no]) CFLAGS="$saved_cflags"
]) ])
if test -n "$LIBATOMIC_LIBS"; then
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
fi
LIBS="$saved_libs" LIBS="$saved_libs"
AC_SUBST([LIBATOMIC_LIBS]) AC_SUBST([LIBATOMIC_LIBS])
]) ])