2021-02-28 06:10:27 +00:00
|
|
|
# SPDX-License-Identifier: GPL-2.0-only
|
|
|
|
|
|
|
|
|
|
# cc-cross-prefix
|
|
|
|
|
# Usage: CROSS_COMPILE := $(call cc-cross-prefix, m68k-linux-gnu- m68k-linux-)
|
|
|
|
|
# Return first <prefix> where a <prefix>gcc is found in PATH.
|
|
|
|
|
# If no gcc found in PATH with listed prefixes return nothing
|
|
|
|
|
#
|
|
|
|
|
# Note: '2>/dev/null' is here to force Make to invoke a shell. Otherwise, it
|
|
|
|
|
# would try to directly execute the shell builtin 'command'. This workaround
|
|
|
|
|
# should be kept for a long time since this issue was fixed only after the
|
|
|
|
|
# GNU Make 4.2.1 release.
|
|
|
|
|
cc-cross-prefix = $(firstword $(foreach c, $(1), \
|
|
|
|
|
$(if $(shell command -v -- $(c)gcc 2>/dev/null), $(c))))
|
|
|
|
|
|
|
|
|
|
# output directory for tests below
|
2024-11-10 01:34:33 +00:00
|
|
|
TMPOUT = .tmp_$$$$
|
2021-02-28 06:10:27 +00:00
|
|
|
|
|
|
|
|
# try-run
|
|
|
|
|
# Usage: option = $(call try-run, $(CC)...-o "$$TMP",option-ok,otherwise)
|
|
|
|
|
# Exit code chooses option. "$$TMP" serves as a temporary file and is
|
|
|
|
|
# automatically cleaned up.
|
|
|
|
|
try-run = $(shell set -e; \
|
|
|
|
|
TMP=$(TMPOUT)/tmp; \
|
|
|
|
|
trap "rm -rf $(TMPOUT)" EXIT; \
|
2022-07-28 03:14:33 +00:00
|
|
|
mkdir -p $(TMPOUT); \
|
2021-02-28 06:10:27 +00:00
|
|
|
if ($(1)) >/dev/null 2>&1; \
|
|
|
|
|
then echo "$(2)"; \
|
|
|
|
|
else echo "$(3)"; \
|
|
|
|
|
fi)
|
|
|
|
|
|
|
|
|
|
# as-option
|
2023-01-12 03:05:01 +00:00
|
|
|
# Usage: aflags-y += $(call as-option,-Wa$(comma)-isa=foo,)
|
2021-02-28 06:10:27 +00:00
|
|
|
|
|
|
|
|
as-option = $(call try-run,\
|
2023-06-06 22:40:35 +00:00
|
|
|
$(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_AFLAGS) $(1) -c -x assembler-with-cpp /dev/null -o "$$TMP",$(1),$(2))
|
2021-02-28 06:10:27 +00:00
|
|
|
|
|
|
|
|
# as-instr
|
2023-01-12 03:05:01 +00:00
|
|
|
# Usage: aflags-y += $(call as-instr,instr,option1,option2)
|
2021-02-28 06:10:27 +00:00
|
|
|
|
|
|
|
|
as-instr = $(call try-run,\
|
2024-01-25 17:32:11 +00:00
|
|
|
printf "%b\n" "$(1)" | $(CC) -Werror $(CLANG_FLAGS) $(KBUILD_AFLAGS) -Wa$(comma)--fatal-warnings -c -x assembler-with-cpp -o "$$TMP" -,$(2),$(3))
|
2021-02-28 06:10:27 +00:00
|
|
|
|
|
|
|
|
# __cc-option
|
|
|
|
|
# Usage: MY_CFLAGS += $(call __cc-option,$(CC),$(MY_CFLAGS),-march=winchip-c6,-march=i586)
|
|
|
|
|
__cc-option = $(call try-run,\
|
2025-05-27 21:35:51 +00:00
|
|
|
$(1) -Werror $(2) $(3:-Wno-%=-W%) -c -x c /dev/null -o "$$TMP",$(3),$(4))
|
2021-02-28 06:10:27 +00:00
|
|
|
|
|
|
|
|
# cc-option
|
|
|
|
|
# Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586)
|
|
|
|
|
|
|
|
|
|
cc-option = $(call __cc-option, $(CC),\
|
|
|
|
|
$(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS),$(1),$(2))
|
|
|
|
|
|
|
|
|
|
# cc-option-yn
|
|
|
|
|
# Usage: flag := $(call cc-option-yn,-march=winchip-c6)
|
2024-10-09 10:27:37 +00:00
|
|
|
cc-option-yn = $(if $(call cc-option,$1),y,n)
|
2021-02-28 06:10:27 +00:00
|
|
|
|
|
|
|
|
# cc-disable-warning
|
|
|
|
|
# Usage: cflags-y += $(call cc-disable-warning,unused-but-set-variable)
|
2025-05-27 21:35:51 +00:00
|
|
|
cc-disable-warning = $(call cc-option,-Wno-$(strip $1))
|
2021-02-28 06:10:27 +00:00
|
|
|
|
2022-09-19 17:08:28 +00:00
|
|
|
# gcc-min-version
|
2025-03-28 17:21:44 +00:00
|
|
|
# Usage: cflags-$(call gcc-min-version, 110100) += -foo
|
kbuild: add test-{ge,gt,le,lt} macros
GNU Make 4.4 introduced $(intcmp ...), which is useful to compare two
integers without forking a new process.
Add test-{ge,gt,le,lt} macros, which work more efficiently with GNU
Make >= 4.4. For older Make versions, they fall back to the 'test'
shell command.
The first two parameters to $(intcmp ...) must not be empty. To avoid
the syntax error, I appended '0' to them. Fortunately, '00' is treated
as '0'. This is needed because CONFIG options may expand to an empty
string when the kernel configuration is not included.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Acked-by: Palmer Dabbelt <palmer@rivosinc.com> # RISC-V
Reviewed-by: Nathan Chancellor <nathan@kernel.org>
Reviewed-by: Nicolas Schier <nicolas@fjasle.eu>
2022-12-11 02:46:47 +00:00
|
|
|
gcc-min-version = $(call test-ge, $(CONFIG_GCC_VERSION), $1)
|
2022-09-19 17:08:28 +00:00
|
|
|
|
|
|
|
|
# clang-min-version
|
|
|
|
|
# Usage: cflags-$(call clang-min-version, 110000) += -foo
|
kbuild: add test-{ge,gt,le,lt} macros
GNU Make 4.4 introduced $(intcmp ...), which is useful to compare two
integers without forking a new process.
Add test-{ge,gt,le,lt} macros, which work more efficiently with GNU
Make >= 4.4. For older Make versions, they fall back to the 'test'
shell command.
The first two parameters to $(intcmp ...) must not be empty. To avoid
the syntax error, I appended '0' to them. Fortunately, '00' is treated
as '0'. This is needed because CONFIG options may expand to an empty
string when the kernel configuration is not included.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Acked-by: Palmer Dabbelt <palmer@rivosinc.com> # RISC-V
Reviewed-by: Nathan Chancellor <nathan@kernel.org>
Reviewed-by: Nicolas Schier <nicolas@fjasle.eu>
2022-12-11 02:46:47 +00:00
|
|
|
clang-min-version = $(call test-ge, $(CONFIG_CLANG_VERSION), $1)
|
2021-02-28 06:10:27 +00:00
|
|
|
|
2025-02-10 16:42:45 +00:00
|
|
|
# rustc-min-version
|
|
|
|
|
# Usage: rustc-$(call rustc-min-version, 108500) += -Cfoo
|
|
|
|
|
rustc-min-version = $(call test-ge, $(CONFIG_RUSTC_VERSION), $1)
|
|
|
|
|
|
2021-02-28 06:10:27 +00:00
|
|
|
# ld-option
|
|
|
|
|
# Usage: KBUILD_LDFLAGS += $(call ld-option, -X, -Y)
|
|
|
|
|
ld-option = $(call try-run, $(LD) $(KBUILD_LDFLAGS) $(1) -v,$(1),$(2),$(3))
|
2024-08-20 19:48:56 +00:00
|
|
|
|
|
|
|
|
# __rustc-option
|
|
|
|
|
# Usage: MY_RUSTFLAGS += $(call __rustc-option,$(RUSTC),$(MY_RUSTFLAGS),-Cinstrument-coverage,-Zinstrument-coverage)
|
2024-10-09 11:41:59 +00:00
|
|
|
# TODO: remove RUSTC_BOOTSTRAP=1 when we raise the minimum GNU Make version to 4.4
|
2024-08-20 19:48:56 +00:00
|
|
|
__rustc-option = $(call try-run,\
|
2025-04-14 17:12:41 +00:00
|
|
|
echo '$(pound)![allow(missing_docs)]$(pound)![feature(no_core)]$(pound)![no_core]' | RUSTC_BOOTSTRAP=1\
|
rust: kasan/kbuild: fix missing flags on first build
If KASAN is enabled, and one runs in a clean repository e.g.:
make LLVM=1 prepare
make LLVM=1 prepare
Then the Rust code gets rebuilt, which should not happen.
The reason is some of the LLVM KASAN `rustc` flags are added in the
second run:
-Cllvm-args=-asan-instrumentation-with-call-threshold=10000
-Cllvm-args=-asan-stack=0
-Cllvm-args=-asan-globals=1
-Cllvm-args=-asan-kernel-mem-intrinsic-prefix=1
Further runs do not rebuild Rust because the flags do not change anymore.
Rebuilding like that in the second run is bad, even if this just happens
with KASAN enabled, but missing flags in the first one is even worse.
The root issue is that we pass, for some architectures and for the moment,
a generated `target.json` file. That file is not ready by the time `rustc`
gets called for the flag test, and thus the flag test fails just because
the file is not available, e.g.:
$ ... --target=./scripts/target.json ... -Cllvm-args=...
error: target file "./scripts/target.json" does not exist
There are a few approaches we could take here to solve this. For instance,
we could ensure that every time that the config is rebuilt, we regenerate
the file and recompute the flags. Or we could use the LLVM version to
check for these flags, instead of testing the flag (which may have other
advantages, such as allowing us to detect renames on the LLVM side).
However, it may be easier than that: `rustc` is aware of the `-Cllvm-args`
regardless of the `--target` (e.g. I checked that the list printed
is the same, plus that I can check for these flags even if I pass
a completely unrelated target), and thus we can just eliminate the
dependency completely.
Thus filter out the target.
This does mean that `rustc-option` cannot be used to test a flag that
requires the right target, but we don't have other users yet, it is a
minimal change and we want to get rid of custom targets in the future.
We could only filter in the case `target.json` is used, to make it work
in more cases, but then it would be harder to notice that it may not
work in a couple architectures.
Cc: Matthew Maurer <mmaurer@google.com>
Cc: Sami Tolvanen <samitolvanen@google.com>
Cc: stable@vger.kernel.org
Fixes: e3117404b411 ("kbuild: rust: Enable KASAN support")
Tested-by: Alice Ryhl <aliceryhl@google.com>
Link: https://lore.kernel.org/r/20250408220311.1033475-1-ojeda@kernel.org
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
2025-04-08 22:03:11 +00:00
|
|
|
$(1) --sysroot=/dev/null $(filter-out --sysroot=/dev/null --target=%,$(2)) $(3)\
|
2024-10-09 11:41:59 +00:00
|
|
|
--crate-type=rlib --out-dir=$(TMPOUT) --emit=obj=- - >/dev/null,$(3),$(4))
|
2024-08-20 19:48:56 +00:00
|
|
|
|
|
|
|
|
# rustc-option
|
|
|
|
|
# Usage: rustflags-y += $(call rustc-option,-Cinstrument-coverage,-Zinstrument-coverage)
|
|
|
|
|
rustc-option = $(call __rustc-option, $(RUSTC),\
|
|
|
|
|
$(KBUILD_RUSTFLAGS),$(1),$(2))
|
|
|
|
|
|
|
|
|
|
# rustc-option-yn
|
|
|
|
|
# Usage: flag := $(call rustc-option-yn,-Cinstrument-coverage)
|
2024-10-09 10:27:37 +00:00
|
|
|
rustc-option-yn = $(if $(call rustc-option,$1),y,n)
|