From d61ccd0252c532596c72bb1161d67b5b47ffb1a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 19 Oct 2022 16:23:41 +0200 Subject: [PATCH] meson: always use libatomic if found Semi-quoting https://github.com/systemd/systemd/issues/25057: clang-16 has made the choice to turn on -Werror=implicit-function-declaration,implicit-int. (See Gentoo's tracker bug https://bugs.gentoo.org/870412). Added in commit 132c73b57ad1d363e97e1f4720f0e920826f34e1, systemd now does a check to see if libatomic is needed with some compile/link tests with e.g. __atomic_exchange_1, but the tests don't provide a prototype for __atomic_exchange_1 so with clang-16 the test fails, breaking the build. Let's simplify things by linking to libatomic unconditionally if it is found and seems to work. If actually unneeded, it might be dropped via --as-needed. This seems to work with gcc and clang. declare_dependency() is used instead of cc.find_library(), because the latter picks up a symlink in gcc private directory (e.g. /usr/lib/gcc/x86_64-redhat-linux/12/libatomic.so), and we don't want that. Fixes #25057. (cherry picked from commit 96f8c63601a33a7e9e47397be2de811e00477ad8) --- meson.build | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/meson.build b/meson.build index a8cae4ee08..43a2b0cf20 100644 --- a/meson.build +++ b/meson.build @@ -989,22 +989,23 @@ endif ##################################################################### -libatomic = [] -if not cc.links('''#include - int main() { - char i; - __atomic_exchange_1(&i, 1, 0); - return 1; - }''', - name : 'Atomic builtin requires -latomic') - libatomic = cc.find_library('atomic') -endif threads = dependency('threads') librt = cc.find_library('rt') libm = cc.find_library('m') libdl = cc.find_library('dl') libcrypt = cc.find_library('crypt') +# On some architectures, libatomic is required. But on some installations, +# it is found, but actual linking fails. So let's try to use it opportunistically. +# If it is installed, but not needed, it will be dropped because of --as-needed. +if cc.links('''int main(int argc, char **argv) { return 0; }''', + args : '-latomic', + name : 'libatomic') + libatomic = declare_dependency(link_args : '-latomic') +else + libatomic = [] +endif + crypt_header = conf.get('HAVE_CRYPT_H') == 1 ? '''#include ''' : '''#include ''' foreach ident : [ ['crypt_ra', crypt_header],