| # SPDX-License-Identifier: GPL-2.0-only |
| config CC_VERSION_TEXT |
| string |
| default "$(CC_VERSION_TEXT)" |
| help |
| This is used in unclear ways: |
| |
| - Re-run Kconfig when the compiler is updated |
| The 'default' property references the environment variable, |
| CC_VERSION_TEXT so it is recorded in include/config/auto.conf.cmd. |
| When the compiler is updated, Kconfig will be invoked. |
| |
| - Ensure full rebuild when the compiler is updated |
| include/linux/compiler-version.h contains this option in the comment |
| line so fixdep adds include/config/CC_VERSION_TEXT into the |
| auto-generated dependency. When the compiler is updated, syncconfig |
| will touch it and then every file will be rebuilt. |
| |
| config CC_IS_GCC |
| def_bool $(success,test "$(cc-name)" = GCC) |
| |
| config GCC_VERSION |
| int |
| default $(cc-version) if CC_IS_GCC |
| default 0 |
| |
| config CC_IS_CLANG |
| def_bool $(success,test "$(cc-name)" = Clang) |
| |
| config CLANG_VERSION |
| int |
| default $(cc-version) if CC_IS_CLANG |
| default 0 |
| |
| config AS_IS_GNU |
| def_bool $(success,test "$(as-name)" = GNU) |
| |
| config AS_IS_LLVM |
| def_bool $(success,test "$(as-name)" = LLVM) |
| |
| config AS_VERSION |
| int |
| # Use clang version if this is the integrated assembler |
| default CLANG_VERSION if AS_IS_LLVM |
| default $(as-version) |
| |
| config LD_IS_BFD |
| def_bool $(success,test "$(ld-name)" = BFD) |
| |
| config LD_VERSION |
| int |
| default $(ld-version) if LD_IS_BFD |
| default 0 |
| |
| config LD_IS_LLD |
| def_bool $(success,test "$(ld-name)" = LLD) |
| |
| config LLD_VERSION |
| int |
| default $(ld-version) if LD_IS_LLD |
| default 0 |
| |
| config RUSTC_VERSION |
| int |
| default $(rustc-version) |
| help |
| It does not depend on `RUST` since that one may need to use the version |
| in a `depends on`. |
| |
| config RUST_IS_AVAILABLE |
| def_bool $(success,$(srctree)/scripts/rust_is_available.sh) |
| help |
| This shows whether a suitable Rust toolchain is available (found). |
| |
| Please see Documentation/rust/quick-start.rst for instructions on how |
| to satisfy the build requirements of Rust support. |
| |
| In particular, the Makefile target 'rustavailable' is useful to check |
| why the Rust toolchain is not being detected. |
| |
| config RUSTC_LLVM_VERSION |
| int |
| default $(rustc-llvm-version) |
| |
| config RUSTC_LLVM_MAJOR_VERSION |
| int |
| default $(shell,expr $(rustc-llvm-version) / 10000) |
| |
| config RUSTC_CLANG_LLVM_COMPATIBLE |
| bool |
| default y if CC_IS_CLANG && RUSTC_LLVM_MAJOR_VERSION = $(shell,expr $(cc-version) / 10000) |
| help |
| This indicates whether Rust and Clang use LLVM of the same major |
| version. |
| |
| Operations involving handling LLVM IR or bitcode (e.g. cross-language |
| LTO) require the same LLVM major version to work properly. For best |
| compatibility it is recommended that the exact same LLVM is used. |
| |
| config ARCH_HAS_CC_CAN_LINK |
| bool |
| |
| config CC_CAN_LINK |
| bool |
| default ARCH_CC_CAN_LINK if ARCH_HAS_CC_CAN_LINK |
| default $(cc_can_link_user,$(m64-flag)) if 64BIT |
| default $(cc_can_link_user,$(m32-flag)) |
| |
| # Fixed in GCC 14, 13.3, 12.4 and 11.5 |
| # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113921 |
| config GCC_ASM_GOTO_OUTPUT_BROKEN |
| bool |
| depends on CC_IS_GCC |
| default y if GCC_VERSION < 110500 |
| default y if GCC_VERSION >= 120000 && GCC_VERSION < 120400 |
| default y if GCC_VERSION >= 130000 && GCC_VERSION < 130300 |
| |
| config CC_HAS_ASM_GOTO_OUTPUT |
| def_bool y |
| depends on !GCC_ASM_GOTO_OUTPUT_BROKEN |
| depends on $(success,echo 'int foo(int x) { asm goto ("": "=r"(x) ::: bar); return x; bar: return 0; }' | $(CC) -x c - -c -o /dev/null) |
| |
| config CC_HAS_ASM_GOTO_TIED_OUTPUT |
| depends on CC_HAS_ASM_GOTO_OUTPUT |
| # Detect buggy gcc and clang, fixed in gcc-11 clang-14. |
| def_bool $(success,echo 'int foo(int *x) { asm goto (".long (%l[bar]) - .": "+m"(*x) ::: bar); return *x; bar: return 0; }' | $CC -x c - -c -o /dev/null) |
| |
| config TOOLS_SUPPORT_RELR |
| def_bool $(success,env "CC=$(CC)" "LD=$(LD)" "NM=$(NM)" "OBJCOPY=$(OBJCOPY)" $(srctree)/scripts/tools-support-relr.sh) |
| |
| config CC_HAS_ASM_INLINE |
| def_bool $(success,echo 'void foo(void) { asm inline (""); }' | $(CC) -x c - -c -o /dev/null) |
| |
| config CC_HAS_ASSUME |
| bool |
| # clang needs to be at least 19.1.0 since the meaning of the assume |
| # attribute changed: |
| # https://github.com/llvm/llvm-project/commit/c44fa3e8a9a44c2e9a575768a3c185354b9f6c17 |
| default y if CC_IS_CLANG && CLANG_VERSION >= 190100 |
| # supported since gcc 13.1.0 |
| # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106654 |
| default y if CC_IS_GCC && GCC_VERSION >= 130100 |
| |
| config CC_HAS_NO_PROFILE_FN_ATTR |
| def_bool $(success,echo '__attribute__((no_profile_instrument_function)) int x();' | $(CC) -x c - -c -o /dev/null -Werror) |
| |
| config CC_OPT_ZERO_INIT_PADDING_BITS |
| def_string "$(cc-option-str,-fzero-init-padding-bits=all)" |
| |
| config CC_OPT_NO_ADDRSIG |
| def_string "$(cc-option-str,-fno-addrsig)" |
| |
| config CC_OPT_DIAGNOSTICS_SHOW_CONTEXT |
| def_string "$(cc-option-str,-fdiagnostics-show-context=2)" |
| |
| config CC_OPT_DIAGNOSTICS_SHOW_INLINING_CHAIN |
| def_string "$(cc-option-str,-fdiagnostics-show-inlining-chain)" |
| |
| config CC_OPT_STRICT_FLEX_ARRAYS |
| def_string "$(cc-option-str,-fstrict-flex-arrays=3)" |
| |
| # gcc-10 renamed --param=allow-store-data-races=0 to -fno-allow-store-data-races |
| config CC_OPT_ALLOW_STORE_DATA_RACES_PARAM |
| def_string "$(cc-option-str,--param=allow-store-data-races=0)" if CC_IS_GCC |
| |
| config CC_OPT_NO_ALLOW_STORE_DATA_RACES |
| def_string "$(cc-option-str,-fno-allow-store-data-races)" if CC_IS_GCC |
| |
| config CC_HAS_MNOP_MCOUNT |
| def_bool $(cc-option,-mnop-mcount) |
| |
| # s390-linux-gnu-gcc did not support -mfentry until gcc-9. |
| config CC_HAS_MFENTRY |
| def_bool $(cc-option,-mfentry) |
| |
| config LD_OPT_FORCE_GROUP_ALLOCATION |
| def_string "$(ld-option-str,--force-group-allocation)" |
| |
| config LD_OPT_NO_WARN_RWX_SEGMENTS |
| def_string "$(ld-option-str,--no-warn-rwx-segments)" |
| |
| config CC_OPT_WNO_ADDRESS_OF_PACKED_MEMBER |
| def_string "-Wno-address-of-packed-member" if $(cc-option,-Waddress-of-packed-member) |
| |
| config CC_OPT_WNO_FORMAT_OVERFLOW_NON_KPRINTF |
| def_string "-Wno-format-overflow-non-kprintf" if CC_IS_CLANG && $(cc-option,-Wformat-overflow-non-kprintf) |
| |
| config CC_OPT_WNO_FORMAT_TRUNCATION_NON_KPRINTF |
| def_string "-Wno-format-truncation-non-kprintf" if CC_IS_CLANG && $(cc-option,-Wformat-truncation-non-kprintf) |
| |
| config CC_OPT_WNO_DEFAULT_CONST_INIT_UNSAFE |
| def_string "-Wno-default-const-init-unsafe" if CC_IS_CLANG && $(cc-option,-Wdefault-const-init-unsafe) |
| |
| config CC_OPT_WNO_DANGLING_POINTER |
| def_string "-Wno-dangling-pointer" if $(cc-option,-Wdangling-pointer) |
| |
| config CC_OPT_WVLA_LARGER_THAN |
| def_string "$(cc-option-str,-Wvla-larger-than=1)" |
| |
| config CC_HAS_WSTRINGOP_OVERFLOW |
| def_bool $(cc-option,-Wstringop-overflow) |
| |
| config CC_OPT_WNO_UNTERMINATED_STRING_INITIALIZATION |
| def_string "-Wno-unterminated-string-initialization" if $(cc-option,-Wunterminated-string-initialization) |
| |
| config CC_OPT_WERROR_DESIGNATED_INIT |
| def_string "$(cc-option-str,-Werror=designated-init)" |
| |
| config CC_OPT_WENUM_CONVERSION |
| def_string "$(cc-option-str,-Wenum-conversion)" |
| |
| config CC_OPT_WNO_PACKED_NOT_ALIGNED |
| def_string "-Wno-packed-not-aligned" if $(cc-option,-Wpacked-not-aligned) |
| |
| config CC_OPT_WNO_FORMAT_OVERFLOW |
| def_string "-Wno-format-overflow" if $(cc-option,-Wformat-overflow) |
| |
| config CC_OPT_WNO_STRINGOP_TRUNCATION |
| def_string "-Wno-stringop-truncation" if $(cc-option,-Wstringop-truncation) |
| |
| config CC_HAS_COUNTED_BY |
| bool |
| # clang needs to be at least 20.1.0 to avoid potential crashes |
| # when building structures that contain __counted_by |
| # https://github.com/ClangBuiltLinux/linux/issues/2114 |
| # https://github.com/llvm/llvm-project/commit/160fb1121cdf703c3ef5e61fb26c5659eb581489 |
| default y if CC_IS_CLANG && CLANG_VERSION >= 200100 |
| # supported since gcc 15.1.0 |
| # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108896 |
| default y if CC_IS_GCC && GCC_VERSION >= 150100 |
| |
| config CC_HAS_COUNTED_BY_PTR |
| bool |
| # supported since clang 22 |
| default y if CC_IS_CLANG && CLANG_VERSION >= 220100 |
| # supported since gcc 16.0.0 |
| default y if CC_IS_GCC && GCC_VERSION >= 160000 |
| |
| config CC_HAS_BROKEN_COUNTED_BY_REF |
| bool |
| # https://github.com/llvm/llvm-project/issues/182575 |
| default y if CC_IS_CLANG && CLANG_VERSION < 220100 |
| |
| config CC_HAS_ALLOC_TOKEN |
| def_bool $(cc-option,-falloc-token-max=123) |
| |
| config CC_HAS_MULTIDIMENSIONAL_NONSTRING |
| def_bool $(success,echo 'char tag[][4] __attribute__((__nonstring__)) = { };' | $(CC) $(CLANG_FLAGS) -x c - -c -o /dev/null -Werror) |
| |
| config CC_OPT_INLINE_MEMSET |
| string |
| default "-finline-stringops=memset" if $(cc-option,-finline-stringops=memset) |
| default "-mllvm -max-store-memset=4294967294" if $(cc-option,-mllvm -max-store-memset=4294967294) |
| |
| config LD_CAN_USE_KEEP_IN_OVERLAY |
| # ld.lld prior to 21.0.0 did not support KEEP within an overlay description |
| # https://github.com/llvm/llvm-project/pull/130661 |
| def_bool LD_IS_BFD || LLD_VERSION >= 210000 |
| |
| config RUSTC_HAS_SPAN_FILE |
| def_bool RUSTC_VERSION >= 108800 |
| |
| config RUSTC_HAS_UNNECESSARY_TRANSMUTES |
| def_bool RUSTC_VERSION >= 108800 |
| |
| config RUSTC_HAS_FILE_WITH_NUL |
| def_bool RUSTC_VERSION >= 108900 |
| |
| config RUSTC_HAS_FILE_AS_C_STR |
| def_bool RUSTC_VERSION >= 109100 |
| |
| config RUSTC_HAS_SUSPICIOUS_RUNTIME_SYMBOL_DEFINITIONS |
| def_bool RUSTC_VERSION >= 109800 |
| |
| config PAHOLE_VERSION |
| int |
| default "$(PAHOLE_VERSION)" |