xfs: respect the stable writes flag on the RT device
[platform/kernel/linux-starfive.git] / rust / Makefile
index 4124bfa..7dbf9ab 100644 (file)
@@ -1,5 +1,8 @@
 # SPDX-License-Identifier: GPL-2.0
 
+# Where to place rustdoc generated documentation
+rustdoc_output := $(objtree)/Documentation/output/rust/rustdoc
+
 obj-$(CONFIG_RUST) += core.o compiler_builtins.o
 always-$(CONFIG_RUST) += exports_core_generated.h
 
@@ -27,6 +30,12 @@ endif
 
 obj-$(CONFIG_RUST) += exports.o
 
+always-$(CONFIG_RUST_KERNEL_DOCTESTS) += doctests_kernel_generated.rs
+always-$(CONFIG_RUST_KERNEL_DOCTESTS) += doctests_kernel_generated_kunit.c
+
+obj-$(CONFIG_RUST_KERNEL_DOCTESTS) += doctests_kernel_generated.o
+obj-$(CONFIG_RUST_KERNEL_DOCTESTS) += doctests_kernel_generated_kunit.o
+
 # Avoids running `$(RUSTC)` for the sysroot when it may not be available.
 ifdef CONFIG_RUST
 
@@ -39,9 +48,11 @@ ifeq ($(quiet),silent_)
 cargo_quiet=-q
 rust_test_quiet=-q
 rustdoc_test_quiet=--test-args -q
+rustdoc_test_kernel_quiet=>/dev/null
 else ifeq ($(quiet),quiet_)
 rust_test_quiet=-q
 rustdoc_test_quiet=--test-args -q
+rustdoc_test_kernel_quiet=>/dev/null
 else
 cargo_quiet=--verbose
 endif
@@ -65,7 +76,7 @@ quiet_cmd_rustdoc = RUSTDOC $(if $(rustdoc_host),H, ) $<
        OBJTREE=$(abspath $(objtree)) \
        $(RUSTDOC) $(if $(rustdoc_host),$(rust_common_flags),$(rust_flags)) \
                $(rustc_target_flags) -L$(objtree)/$(obj) \
-               --output $(objtree)/$(obj)/doc \
+               --output $(rustdoc_output) \
                --crate-name $(subst rustdoc-,,$@) \
                @$(objtree)/include/generated/rustc_cfg $<
 
@@ -82,15 +93,14 @@ quiet_cmd_rustdoc = RUSTDOC $(if $(rustdoc_host),H, ) $<
 # and then retouch the generated files.
 rustdoc: rustdoc-core rustdoc-macros rustdoc-compiler_builtins \
     rustdoc-alloc rustdoc-kernel
-       $(Q)cp $(srctree)/Documentation/images/logo.svg $(objtree)/$(obj)/doc
-       $(Q)cp $(srctree)/Documentation/images/COPYING-logo $(objtree)/$(obj)/doc
-       $(Q)find $(objtree)/$(obj)/doc -name '*.html' -type f -print0 | xargs -0 sed -Ei \
-               -e 's:rust-logo\.svg:logo.svg:g' \
-               -e 's:rust-logo\.png:logo.svg:g' \
-               -e 's:favicon\.svg:logo.svg:g' \
-               -e 's:<link rel="alternate icon" type="image/png" href="[./]*favicon-(16x16|32x32)\.png">::g'
-       $(Q)echo '.logo-container > img { object-fit: contain; }' \
-               >> $(objtree)/$(obj)/doc/rustdoc.css
+       $(Q)cp $(srctree)/Documentation/images/logo.svg $(rustdoc_output)/static.files/
+       $(Q)cp $(srctree)/Documentation/images/COPYING-logo $(rustdoc_output)/static.files/
+       $(Q)find $(rustdoc_output) -name '*.html' -type f -print0 | xargs -0 sed -Ei \
+               -e 's:rust-logo-[0-9a-f]+\.svg:logo.svg:g' \
+               -e 's:favicon-[0-9a-f]+\.svg:logo.svg:g' \
+               -e 's:<link rel="alternate icon" type="image/png" href="[/.]+/static\.files/favicon-(16x16|32x32)-[0-9a-f]+\.png">::g'
+       $(Q)for f in $(rustdoc_output)/static.files/rustdoc-*.css; do \
+               echo ".logo-container > img { object-fit: contain; }" >> $$f; done
 
 rustdoc-macros: private rustdoc_host = yes
 rustdoc-macros: private rustc_target_flags = --crate-type proc-macro \
@@ -154,9 +164,30 @@ quiet_cmd_rustdoc_test = RUSTDOC T $<
                @$(objtree)/include/generated/rustc_cfg \
                $(rustc_target_flags) $(rustdoc_test_target_flags) \
                --sysroot $(objtree)/$(obj)/test/sysroot $(rustdoc_test_quiet) \
-               -L$(objtree)/$(obj)/test --output $(objtree)/$(obj)/doc \
+               -L$(objtree)/$(obj)/test --output $(rustdoc_output) \
                --crate-name $(subst rusttest-,,$@) $<
 
+quiet_cmd_rustdoc_test_kernel = RUSTDOC TK $<
+      cmd_rustdoc_test_kernel = \
+       rm -rf $(objtree)/$(obj)/test/doctests/kernel; \
+       mkdir -p $(objtree)/$(obj)/test/doctests/kernel; \
+       OBJTREE=$(abspath $(objtree)) \
+       $(RUSTDOC) --test $(rust_flags) \
+               @$(objtree)/include/generated/rustc_cfg \
+               -L$(objtree)/$(obj) --extern alloc --extern kernel \
+               --extern build_error --extern macros \
+               --extern bindings --extern uapi \
+               --no-run --crate-name kernel -Zunstable-options \
+               --test-builder $(objtree)/scripts/rustdoc_test_builder \
+               $< $(rustdoc_test_kernel_quiet); \
+       $(objtree)/scripts/rustdoc_test_gen
+
+%/doctests_kernel_generated.rs %/doctests_kernel_generated_kunit.c: \
+    $(src)/kernel/lib.rs $(obj)/kernel.o \
+    $(objtree)/scripts/rustdoc_test_builder \
+    $(objtree)/scripts/rustdoc_test_gen FORCE
+       $(call if_changed,rustdoc_test_kernel)
+
 # We cannot use `-Zpanic-abort-tests` because some tests are dynamic,
 # so for the moment we skip `-Cpanic=abort`.
 quiet_cmd_rustc_test = RUSTC T  $<
@@ -258,6 +289,7 @@ bindgen_skip_c_flags := -mno-fp-ret-in-387 -mpreferred-stack-boundary=% \
        -fno-reorder-blocks -fno-allow-store-data-races -fasan-shadow-offset=% \
        -fzero-call-used-regs=% -fno-stack-clash-protection \
        -fno-inline-functions-called-once -fsanitize=bounds-strict \
+       -fstrict-flex-arrays=% \
        --param=% --param asan-%
 
 # Derived from `scripts/Makefile.clang`.
@@ -300,7 +332,7 @@ quiet_cmd_bindgen = BINDGEN $@
        $(BINDGEN) $< $(bindgen_target_flags) \
                --use-core --with-derive-default --ctypes-prefix core::ffi --no-layout-tests \
                --no-debug '.*' \
-               --size_t-is-usize -o $@ -- $(bindgen_c_flags_final) -DMODULE \
+               -o $@ -- $(bindgen_c_flags_final) -DMODULE \
                $(bindgen_target_cflags) $(bindgen_target_extra)
 
 $(obj)/bindings/bindings_generated.rs: private bindgen_target_flags = \
@@ -320,8 +352,8 @@ $(obj)/uapi/uapi_generated.rs: $(src)/uapi/uapi_helper.h \
 # given it is `libclang`; but for consistency, future Clang changes and/or
 # a potential future GCC backend for `bindgen`, we disable it too.
 $(obj)/bindings/bindings_helpers_generated.rs: private bindgen_target_flags = \
-    --blacklist-type '.*' --whitelist-var '' \
-    --whitelist-function 'rust_helper_.*'
+    --blocklist-type '.*' --allowlist-var '' \
+    --allowlist-function 'rust_helper_.*'
 $(obj)/bindings/bindings_helpers_generated.rs: private bindgen_target_cflags = \
     -I$(objtree)/$(obj) -Wno-missing-prototypes -Wno-missing-declarations
 $(obj)/bindings/bindings_helpers_generated.rs: private bindgen_target_extra = ; \
@@ -373,12 +405,15 @@ quiet_cmd_rustc_library = $(if $(skip_clippy),RUSTC,$(RUSTC_OR_CLIPPY_QUIET)) L
        $(if $(rustc_objcopy),;$(OBJCOPY) $(rustc_objcopy) $@)
 
 rust-analyzer:
-       $(Q)$(srctree)/scripts/generate_rust_analyzer.py $(srctree) $(objtree) \
-               $(RUST_LIB_SRC) > $(objtree)/rust-project.json
+       $(Q)$(srctree)/scripts/generate_rust_analyzer.py \
+               --cfgs='core=$(core-cfgs)' --cfgs='alloc=$(alloc-cfgs)' \
+               $(abs_srctree) $(abs_objtree) \
+               $(RUST_LIB_SRC) $(KBUILD_EXTMOD) > \
+               $(if $(KBUILD_EXTMOD),$(extmod_prefix),$(objtree))/rust-project.json
 
 redirect-intrinsics = \
-       __eqsf2 __gesf2 __lesf2 __nesf2 __unordsf2 \
-       __unorddf2 \
+       __addsf3 __eqsf2 __gesf2 __lesf2 __ltsf2 __mulsf3 __nesf2 __unordsf2 \
+       __adddf3 __ledf2 __ltdf2 __muldf3 __unorddf2 \
        __muloti4 __multi3 \
        __udivmodti4 __udivti3 __umodti3