From: Mike Yuan Date: Wed, 25 Mar 2026 17:13:11 +0000 (+0100) Subject: meson: detect availability of attributes using cc.has_function_attribute() X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=aa71035a20ef8fa575e05b1bf5b905c2ae367c94;p=thirdparty%2Fsystemd.git 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 --- diff --git a/meson.build b/meson.build index c52f8e17c2b..925b1b13ed0 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 058d9276bd1..dfac98f034a 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 1941e88d376..d99a00c9bf9 100644 --- a/src/fundamental/macro-fundamental.h +++ b/src/fundamental/macro-fundamental.h @@ -98,22 +98,22 @@ #define _weak_ __attribute__((__weak__)) #define _weakref_(x) __attribute__((__weakref__(#x))) -#if HAVE_ATTRIBUTE_RETAIN -# define _retain_ __attribute__((__retain__)) +#if HAVE_ATTRIBUTE_ALLOC_SIZE +# define _alloc_(...) __attribute__((__alloc_size__(__VA_ARGS__))) #else -# define _retain_ +# define _alloc_(...) #endif -#ifdef __clang__ -# define _alloc_(...) +#if HAVE_ATTRIBUTE_FALLTHROUGH +# define _fallthrough_ __attribute__((__fallthrough__)) #else -# define _alloc_(...) __attribute__((__alloc_size__(__VA_ARGS__))) +# define _fallthrough_ #endif -#if defined(__clang__) && __clang_major__ < 10 -# define _fallthrough_ +#if HAVE_ATTRIBUTE_RETAIN +# define _retain_ __attribute__((__retain__)) #else -# define _fallthrough_ __attribute__((__fallthrough__)) +# define _retain_ #endif #if __GNUC__ >= 15