From aa71035a20ef8fa575e05b1bf5b905c2ae367c94 Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Wed, 25 Mar 2026 18:13:11 +0100 Subject: [PATCH] meson: detect availability of attributes using cc.has_function_attribute() Alternative to fabc22f5998e610eb7ba70a963cab9f94dca5c0a As suggested in https://github.com/systemd/systemd/pull/41174#discussion_r2966411375 --- meson.build | 17 +++++++++++------ src/boot/meson.build | 11 +++++++---- src/fundamental/macro-fundamental.h | 24 ++++++++++++------------ 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/meson.build b/meson.build index c52f8e17c2..925b1b13ed 100644 --- a/meson.build +++ b/meson.build @@ -524,12 +524,6 @@ if cc.compiles(''' add_project_arguments('-Werror=shadow', language : 'c') endif -have = cc.compiles( - '__attribute__((__retain__)) int x;', - args : '-Werror=attributes', - name : '__attribute__((__retain__))') -conf.set10('HAVE_ATTRIBUTE_RETAIN', have) - if cxx_cmd != '' add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp') endif @@ -544,6 +538,17 @@ conf.set10('HAVE_WARNING_ZERO_LENGTH_BOUNDS', have) have = cc.has_argument('-Wzero-as-null-pointer-constant') conf.set10('HAVE_WARNING_ZERO_AS_NULL_POINTER_CONSTANT', have) +possible_c_attributes = [ + 'alloc_size', + 'fallthrough', + 'retain', +] + +foreach attr : possible_c_attributes + have = cc.has_function_attribute(attr) + conf.set10('HAVE_ATTRIBUTE_' + attr.to_upper(), have) +endforeach + ##################################################################### # compilation result tests diff --git a/src/boot/meson.build b/src/boot/meson.build index 058d9276bd..dfac98f034 100644 --- a/src/boot/meson.build +++ b/src/boot/meson.build @@ -80,10 +80,13 @@ endif efi_conf = configuration_data() # import several configs from userspace -foreach name : ['HAVE_ATTRIBUTE_RETAIN', - 'HAVE_WARNING_ZERO_AS_NULL_POINTER_CONSTANT', - 'HAVE_WARNING_ZERO_LENGTH_BOUNDS', - ] +foreach name : ['HAVE_WARNING_ZERO_LENGTH_BOUNDS', + 'HAVE_WARNING_ZERO_AS_NULL_POINTER_CONSTANT'] + efi_conf.set(name, conf.get(name)) +endforeach + +foreach attr : possible_c_attributes + name = 'HAVE_ATTRIBUTE_' + attr.to_upper() efi_conf.set(name, conf.get(name)) endforeach diff --git a/src/fundamental/macro-fundamental.h b/src/fundamental/macro-fundamental.h index 1941e88d37..d99a00c9bf 100644 --- a/src/fundamental/macro-fundamental.h +++ b/src/fundamental/macro-fundamental.h @@ -98,24 +98,24 @@ #define _weak_ __attribute__((__weak__)) #define _weakref_(x) __attribute__((__weakref__(#x))) +#if HAVE_ATTRIBUTE_ALLOC_SIZE +# define _alloc_(...) __attribute__((__alloc_size__(__VA_ARGS__))) +#else +# define _alloc_(...) +#endif + +#if HAVE_ATTRIBUTE_FALLTHROUGH +# define _fallthrough_ __attribute__((__fallthrough__)) +#else +# define _fallthrough_ +#endif + #if HAVE_ATTRIBUTE_RETAIN # define _retain_ __attribute__((__retain__)) #else # define _retain_ #endif -#ifdef __clang__ -# define _alloc_(...) -#else -# define _alloc_(...) __attribute__((__alloc_size__(__VA_ARGS__))) -#endif - -#if defined(__clang__) && __clang_major__ < 10 -# define _fallthrough_ -#else -# define _fallthrough_ __attribute__((__fallthrough__)) -#endif - #if __GNUC__ >= 15 # define _nonnull_if_nonzero_(p, n) __attribute__((nonnull_if_nonzero(p, n))) #else