mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-22 13:33:56 +03:00
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 commit132c73b57a
, 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 commit96f8c63601
) (cherry picked from commitd61ccd0252
)
This commit is contained in:
parent
c7861e39a6
commit
2220f8d28a
21
meson.build
21
meson.build
@ -981,22 +981,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')
|
threads = dependency('threads')
|
||||||
librt = cc.find_library('rt')
|
librt = cc.find_library('rt')
|
||||||
libm = cc.find_library('m')
|
libm = cc.find_library('m')
|
||||||
libdl = cc.find_library('dl')
|
libdl = cc.find_library('dl')
|
||||||
libcrypt = cc.find_library('crypt')
|
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>'''
|
crypt_header = conf.get('HAVE_CRYPT_H') == 1 ? '''#include <crypt.h>''' : '''#include <unistd.h>'''
|
||||||
foreach ident : [
|
foreach ident : [
|
||||||
['crypt_ra', crypt_header],
|
['crypt_ra', crypt_header],
|
||||||
|
Loading…
Reference in New Issue
Block a user