]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
meson: always use libatomic if found
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 19 Oct 2022 14:23:41 +0000 (16:23 +0200)
committerLuca Boccassi <luca.boccassi@gmail.com>
Fri, 21 Oct 2022 15:40:59 +0000 (17:40 +0200)
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.

meson.build

index dfe18f7e7b0c91e99fdb07b46da9540ba8cdfaeb..76ad51d3fb75e1b8edce560a455ebcf4a3ddef8d 100644 (file)
@@ -1013,22 +1013,23 @@ endif
 
 #####################################################################
 
-libatomic = []
-if not cc.links('''#include <stdint.h>
-                   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 <crypt.h>''' : '''#include <unistd.h>'''
 foreach ident : [
         ['crypt_ra',               crypt_header],