| # 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)" | |
| config CC_OPT_NO_ALLOW_STORE_DATA_RACES | |
| def_string "$(cc-option-str,-fno-allow-store-data-races)" | |
| 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 "$(cc-option-str,-Wno-address-of-packed-member)" | |
| config CC_OPT_WNO_FORMAT_OVERFLOW_NON_KPRINTF | |
| def_string "$(cc-option-str,-Wno-format-overflow-non-kprintf)" | |
| config CC_OPT_WNO_FORMAT_TRUNCATION_NON_KPRINTF | |
| def_string "$(cc-option-str,-Wno-format-truncation-non-kprintf)" | |
| config CC_OPT_WNO_DEFAULT_CONST_INIT_UNSAFE | |
| def_string "$(cc-option-str,-Wno-default-const-init-unsafe)" | |
| config CC_OPT_WNO_DANGLING_POINTER | |
| def_string "$(cc-option-str,-Wno-dangling-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 "$(cc-option-str,-Wno-unterminated-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 "$(cc-option-str,-Wno-packed-not-aligned)" | |
| config CC_OPT_WNO_FORMAT_OVERFLOW | |
| def_string "$(cc-option-str,-Wno-format-overflow)" | |
| config CC_OPT_WNO_STRINGOP_TRUNCATION | |
| def_string "$(cc-option-str,-Wno-stringop-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_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)" |