1 # SPDX-License-Identifier: GPL-2.0 2 3 # Where to place rustdoc generated documentati 4 rustdoc_output := $(objtree)/Documentation/out 5 6 obj-$(CONFIG_RUST) += core.o compiler_builtins 7 always-$(CONFIG_RUST) += exports_core_generate 8 9 # Missing prototypes are expected in the helpe 10 # for Rust only, thus there is no header nor p 11 obj-$(CONFIG_RUST) += helpers/helpers.o 12 CFLAGS_REMOVE_helpers/helpers.o = -Wmissing-pr 13 14 always-$(CONFIG_RUST) += libmacros.so 15 no-clean-files += libmacros.so 16 17 always-$(CONFIG_RUST) += bindings/bindings_gen 18 obj-$(CONFIG_RUST) += alloc.o bindings.o kerne 19 always-$(CONFIG_RUST) += exports_alloc_generat 20 exports_bindings_generated.h exports_kerne 21 22 always-$(CONFIG_RUST) += uapi/uapi_generated.r 23 obj-$(CONFIG_RUST) += uapi.o 24 25 ifdef CONFIG_RUST_BUILD_ASSERT_ALLOW 26 obj-$(CONFIG_RUST) += build_error.o 27 else 28 always-$(CONFIG_RUST) += build_error.o 29 endif 30 31 obj-$(CONFIG_RUST) += exports.o 32 33 always-$(CONFIG_RUST_KERNEL_DOCTESTS) += docte 34 always-$(CONFIG_RUST_KERNEL_DOCTESTS) += docte 35 36 obj-$(CONFIG_RUST_KERNEL_DOCTESTS) += doctests 37 obj-$(CONFIG_RUST_KERNEL_DOCTESTS) += doctests 38 39 # Avoids running `$(RUSTC)` for the sysroot wh 40 ifdef CONFIG_RUST 41 42 # `$(rust_flags)` is passed in case the user a 43 rustc_sysroot := $(shell MAKEFLAGS= $(RUSTC) $ 44 rustc_host_target := $(shell $(RUSTC) --versio 45 RUST_LIB_SRC ?= $(rustc_sysroot)/lib/rustlib/s 46 47 ifneq ($(quiet),) 48 rust_test_quiet=-q 49 rustdoc_test_quiet=--test-args -q 50 rustdoc_test_kernel_quiet=>/dev/null 51 endif 52 53 core-cfgs = \ 54 --cfg no_fp_fmt_parse 55 56 alloc-cfgs = \ 57 --cfg no_global_oom_handling \ 58 --cfg no_rc \ 59 --cfg no_sync 60 61 quiet_cmd_rustdoc = RUSTDOC $(if $(rustdoc_hos 62 cmd_rustdoc = \ 63 OBJTREE=$(abspath $(objtree)) \ 64 $(RUSTDOC) $(if $(rustdoc_host),$(rust 65 $(rustc_target_flags) -L$(objt 66 -Zunstable-options --generate- 67 --output $(rustdoc_output) \ 68 --crate-name $(subst rustdoc-, 69 $(if $(rustdoc_host),,--sysroo 70 @$(objtree)/include/generated/ 71 72 # The `html_logo_url` and `html_favicon_url` f 73 # can be used to specify a custom logo. Howeve 74 # - The given value is used as-is, thus it c 75 # (unlike the non-custom case) since the g 76 # - It requires adding it to every crate. 77 # - It requires changing `core` which comes 78 # 79 # Using `-Zcrate-attr` would solve the last tw 80 # The https://github.com/rust-lang/rfcs/pull/3 81 # command-like flags to solve the issue. Meanw 82 # and then retouch the generated files. 83 rustdoc: rustdoc-core rustdoc-macros rustdoc-c 84 rustdoc-alloc rustdoc-kernel 85 $(Q)cp $(srctree)/Documentation/images 86 $(Q)cp $(srctree)/Documentation/images 87 $(Q)find $(rustdoc_output) -name '*.ht 88 -e 's:rust-logo-[0-9a-f]+\.svg 89 -e 's:favicon-[0-9a-f]+\.svg:l 90 -e 's:<link rel="alternate ico 91 -e 's:<a href="srctree/([^"]+) 92 $(Q)for f in $(rustdoc_output)/static. 93 echo ".logo-container > img { 94 95 rustdoc-macros: private rustdoc_host = yes 96 rustdoc-macros: private rustc_target_flags = - 97 --extern proc_macro 98 rustdoc-macros: $(src)/macros/lib.rs FORCE 99 +$(call if_changed,rustdoc) 100 101 rustdoc-core: private rustc_target_flags = $(c 102 rustdoc-core: $(RUST_LIB_SRC)/core/src/lib.rs 103 +$(call if_changed,rustdoc) 104 105 rustdoc-compiler_builtins: $(src)/compiler_bui 106 +$(call if_changed,rustdoc) 107 108 # We need to allow `rustdoc::broken_intra_doc_ 109 # `no_global_oom_handling` functions refer to 110 # functions. Ideally `rustdoc` would have a wa 111 # due to things that are "configured out" vs. 112 rustdoc-alloc: private rustc_target_flags = $( 113 -Arustdoc::broken_intra_doc_links 114 rustdoc-alloc: $(RUST_LIB_SRC)/alloc/src/lib.r 115 +$(call if_changed,rustdoc) 116 117 rustdoc-kernel: private rustc_target_flags = - 118 --extern build_error --extern macros=$(obj 119 --extern bindings --extern uapi 120 rustdoc-kernel: $(src)/kernel/lib.rs rustdoc-c 121 rustdoc-compiler_builtins rustdoc-alloc $( 122 $(obj)/bindings.o FORCE 123 +$(call if_changed,rustdoc) 124 125 quiet_cmd_rustc_test_library = RUSTC TL $< 126 cmd_rustc_test_library = \ 127 OBJTREE=$(abspath $(objtree)) \ 128 $(RUSTC) $(rust_common_flags) \ 129 @$(objtree)/include/generated/ 130 --crate-type $(if $(rustc_test 131 --out-dir $(objtree)/$(obj)/te 132 -L$(objtree)/$(obj)/test \ 133 --crate-name $(subst rusttest- 134 135 rusttestlib-build_error: $(src)/build_error.rs 136 +$(call if_changed,rustc_test_library) 137 138 rusttestlib-macros: private rustc_target_flags 139 rusttestlib-macros: private rustc_test_library 140 rusttestlib-macros: $(src)/macros/lib.rs FORCE 141 +$(call if_changed,rustc_test_library) 142 143 rusttestlib-bindings: $(src)/bindings/lib.rs F 144 +$(call if_changed,rustc_test_library) 145 146 rusttestlib-uapi: $(src)/uapi/lib.rs FORCE 147 +$(call if_changed,rustc_test_library) 148 149 quiet_cmd_rustdoc_test = RUSTDOC T $< 150 cmd_rustdoc_test = \ 151 OBJTREE=$(abspath $(objtree)) \ 152 $(RUSTDOC) --test $(rust_common_flags) 153 @$(objtree)/include/generated/ 154 $(rustc_target_flags) $(rustdo 155 $(rustdoc_test_quiet) \ 156 -L$(objtree)/$(obj)/test --out 157 --crate-name $(subst rusttest- 158 159 quiet_cmd_rustdoc_test_kernel = RUSTDOC TK $< 160 cmd_rustdoc_test_kernel = \ 161 rm -rf $(objtree)/$(obj)/test/doctests 162 mkdir -p $(objtree)/$(obj)/test/doctes 163 OBJTREE=$(abspath $(objtree)) \ 164 $(RUSTDOC) --test $(rust_flags) \ 165 -L$(objtree)/$(obj) --extern a 166 --extern build_error --extern 167 --extern bindings --extern uap 168 --no-run --crate-name kernel - 169 --sysroot=/dev/null \ 170 --test-builder $(objtree)/scri 171 $< $(rustdoc_test_kernel_quiet 172 $(objtree)/scripts/rustdoc_test_gen 173 174 %/doctests_kernel_generated.rs %/doctests_kern 175 $(src)/kernel/lib.rs $(obj)/kernel.o \ 176 $(objtree)/scripts/rustdoc_test_builder \ 177 $(objtree)/scripts/rustdoc_test_gen FORCE 178 +$(call if_changed,rustdoc_test_kernel 179 180 # We cannot use `-Zpanic-abort-tests` because 181 # so for the moment we skip `-Cpanic=abort`. 182 quiet_cmd_rustc_test = RUSTC T $< 183 cmd_rustc_test = \ 184 OBJTREE=$(abspath $(objtree)) \ 185 $(RUSTC) --test $(rust_common_flags) \ 186 @$(objtree)/include/generated/ 187 $(rustc_target_flags) --out-di 188 -L$(objtree)/$(obj)/test \ 189 --crate-name $(subst rusttest- 190 $(objtree)/$(obj)/test/$(subst rusttes 191 $(rustc_test_run_flags) 192 193 rusttest: rusttest-macros rusttest-kernel 194 195 rusttest-macros: private rustc_target_flags = 196 rusttest-macros: private rustdoc_test_target_f 197 rusttest-macros: $(src)/macros/lib.rs FORCE 198 +$(call if_changed,rustc_test) 199 +$(call if_changed,rustdoc_test) 200 201 rusttest-kernel: private rustc_target_flags = 202 --extern build_error --extern macros --ext 203 rusttest-kernel: $(src)/kernel/lib.rs \ 204 rusttestlib-build_error rusttestlib-macros 205 rusttestlib-uapi FORCE 206 +$(call if_changed,rustc_test) 207 +$(call if_changed,rustc_test_library) 208 209 ifdef CONFIG_CC_IS_CLANG 210 bindgen_c_flags = $(c_flags) 211 else 212 # bindgen relies on libclang to parse C. Ideal 213 # plugin backend and/or the Clang driver would 214 # 215 # For the moment, here we are tweaking the fla 216 # and some kernel configurations may not work 217 # if we end up using one of those structs). 218 bindgen_skip_c_flags := -mno-fp-ret-in-387 -mp 219 -mskip-rax-setup -mgeneral-regs-only - 220 -mindirect-branch=thunk-extern -mindir 221 -mfunction-return=thunk-extern -mrecor 222 -mindirect-branch-cs-prefix -mstack-pr 223 -mno-pointers-to-nested-functions -mno 224 -mno-strict-align -mstrict-align \ 225 -fconserve-stack -falign-jumps=% -fali 226 -femit-struct-debug-baseonly -fno-ipa- 227 -fno-partial-inlining -fplugin-arg-arm 228 -fno-reorder-blocks -fno-allow-store-d 229 -fzero-call-used-regs=% -fno-stack-cla 230 -fno-inline-functions-called-once -fsa 231 -fstrict-flex-arrays=% -fmin-function- 232 --param=% --param asan-% 233 234 # Derived from `scripts/Makefile.clang`. 235 BINDGEN_TARGET_x86 := x86_64-linux-gnu 236 BINDGEN_TARGET_arm64 := aarch64-linux-gnu 237 BINDGEN_TARGET := $(BINDGEN_TARGET_$( 238 239 # All warnings are inhibited since GCC builds 240 # many GCC warnings are not supported by Clang 241 # some configurations, with new GCC versions, 242 bindgen_extra_c_flags = -w --target=$(BINDGEN_ 243 244 # Auto variable zero-initialization requires a 245 # clang that is going to be removed sometime i 246 # clang-18), so make sure to pass this option 247 # (libclang major version < 16). 248 # 249 # https://github.com/llvm/llvm-project/issues/ 250 # https://github.com/llvm/llvm-project/blob/ll 251 ifdef CONFIG_INIT_STACK_ALL_ZERO 252 libclang_maj_ver=$(shell $(BINDGEN) $(srctree) 253 ifeq ($(shell expr $(libclang_maj_ver) \< 16), 254 bindgen_extra_c_flags += -enable-trivial-auto- 255 endif 256 endif 257 258 bindgen_c_flags = $(filter-out $(bindgen_skip_ 259 $(bindgen_extra_c_flags) 260 endif 261 262 ifdef CONFIG_LTO 263 bindgen_c_flags_lto = $(filter-out $(CC_FLAGS_ 264 else 265 bindgen_c_flags_lto = $(bindgen_c_flags) 266 endif 267 268 bindgen_c_flags_final = $(bindgen_c_flags_lto) 269 270 quiet_cmd_bindgen = BINDGEN $@ 271 cmd_bindgen = \ 272 $(BINDGEN) $< $(bindgen_target_flags) 273 --use-core --with-derive-defau 274 --no-debug '.*' --enable-funct 275 -o $@ -- $(bindgen_c_flags_fin 276 $(bindgen_target_cflags) $(bin 277 278 $(obj)/bindings/bindings_generated.rs: private 279 $(shell grep -Ev '^#|^$$' $(src)/bindgen_p 280 $(obj)/bindings/bindings_generated.rs: private 281 sed -Ei 's/pub const RUST_CONST_HELPER_([a 282 $(obj)/bindings/bindings_generated.rs: $(src)/ 283 $(src)/bindgen_parameters FORCE 284 $(call if_changed_dep,bindgen) 285 286 $(obj)/uapi/uapi_generated.rs: private bindgen 287 $(shell grep -Ev '^#|^$$' $(src)/bindgen_p 288 $(obj)/uapi/uapi_generated.rs: $(src)/uapi/uap 289 $(src)/bindgen_parameters FORCE 290 $(call if_changed_dep,bindgen) 291 292 # See `CFLAGS_REMOVE_helpers.o` above. In addi 293 # with `-Wmissing-declarations` (unlike GCC), 294 # given it is `libclang`; but for consistency, 295 # a potential future GCC backend for `bindgen` 296 $(obj)/bindings/bindings_helpers_generated.rs: 297 --blocklist-type '.*' --allowlist-var '' \ 298 --allowlist-function 'rust_helper_.*' 299 $(obj)/bindings/bindings_helpers_generated.rs: 300 -I$(objtree)/$(obj) -Wno-missing-prototype 301 $(obj)/bindings/bindings_helpers_generated.rs: 302 sed -Ei 's/pub fn rust_helper_([a-zA-Z0-9_ 303 $(obj)/bindings/bindings_helpers_generated.rs: 304 $(call if_changed_dep,bindgen) 305 306 quiet_cmd_exports = EXPORTS $@ 307 cmd_exports = \ 308 $(NM) -p --defined-only $< \ 309 | awk '$$2~/(T|R|D|B)/ && $$3! 310 311 $(obj)/exports_core_generated.h: $(obj)/core.o 312 $(call if_changed,exports) 313 314 $(obj)/exports_alloc_generated.h: $(obj)/alloc 315 $(call if_changed,exports) 316 317 # Even though Rust kernel modules should never 318 # symbols from the `bindings` crate and the C 319 # because Rust generics and inlined functions 320 # in the crate where they are defined. Other h 321 # functions, may not be exported, in principle 322 # compiler does not guarantee codegen will be 323 # function either. Therefore, we export all sy 324 # In the future, this may be revisited to redu 325 # the compiler is informed about the places co 326 $(obj)/exports_helpers_generated.h: $(obj)/hel 327 $(call if_changed,exports) 328 329 $(obj)/exports_bindings_generated.h: $(obj)/bi 330 $(call if_changed,exports) 331 332 $(obj)/exports_kernel_generated.h: $(obj)/kern 333 $(call if_changed,exports) 334 335 quiet_cmd_rustc_procmacro = $(RUSTC_OR_CLIPPY_ 336 cmd_rustc_procmacro = \ 337 $(RUSTC_OR_CLIPPY) $(rust_common_flags 338 -Clinker-flavor=gcc -Clinker=$ 339 -Clink-args='$(call escsq,$(KB 340 --emit=dep-info=$(depfile) --e 341 --crate-type proc-macro \ 342 --crate-name $(patsubst lib%.s 343 344 # Procedural macros can only be used with the 345 $(obj)/libmacros.so: $(src)/macros/lib.rs FORC 346 +$(call if_changed_dep,rustc_procmacro 347 348 quiet_cmd_rustc_library = $(if $(skip_clippy), 349 cmd_rustc_library = \ 350 OBJTREE=$(abspath $(objtree)) \ 351 $(if $(skip_clippy),$(RUSTC),$(RUSTC_O 352 $(filter-out $(skip_flags),$(r 353 --emit=dep-info=$(depfile) --e 354 --emit=metadata=$(dir $@)$(pat 355 --crate-type rlib -L$(objtree) 356 --crate-name $(patsubst %.o,%, 357 --sysroot=/dev/null \ 358 $(if $(rustc_objcopy),;$(OBJCOPY) $(ru 359 $(cmd_objtool) 360 361 rust-analyzer: 362 $(Q)$(srctree)/scripts/generate_rust_a 363 --cfgs='core=$(core-cfgs)' --c 364 $(realpath $(srctree)) $(realp 365 $(rustc_sysroot) $(RUST_LIB_SR 366 $(if $(KBUILD_EXTMOD),$(extmod 367 368 redirect-intrinsics = \ 369 __addsf3 __eqsf2 __extendsfdf2 __gesf2 370 __adddf3 __eqdf2 __ledf2 __ltdf2 __mul 371 __muloti4 __multi3 \ 372 __udivmodti4 __udivti3 __umodti3 373 374 ifneq ($(or $(CONFIG_ARM64),$(and $(CONFIG_RIS 375 # These intrinsics are defined for ARM 376 redirect-intrinsics += \ 377 __ashrti3 \ 378 __ashlti3 __lshrti3 379 endif 380 381 define rule_rustc_library 382 $(call cmd_and_fixdep,rustc_library) 383 $(call cmd,gen_objtooldep) 384 endef 385 386 $(obj)/core.o: private skip_clippy = 1 387 $(obj)/core.o: private skip_flags = -Wunreacha 388 $(obj)/core.o: private rustc_objcopy = $(forea 389 $(obj)/core.o: private rustc_target_flags = $( 390 $(obj)/core.o: $(RUST_LIB_SRC)/core/src/lib.rs 391 $(wildcard $(objtree)/include/config/RUSTC 392 +$(call if_changed_rule,rustc_library) 393 ifneq ($(or $(CONFIG_X86_64),$(CONFIG_X86_32)) 394 $(obj)/core.o: scripts/target.json 395 endif 396 397 $(obj)/compiler_builtins.o: private rustc_objc 398 $(obj)/compiler_builtins.o: $(src)/compiler_bu 399 +$(call if_changed_rule,rustc_library) 400 401 $(obj)/alloc.o: private skip_clippy = 1 402 $(obj)/alloc.o: private skip_flags = -Wunreach 403 $(obj)/alloc.o: private rustc_target_flags = $ 404 $(obj)/alloc.o: $(RUST_LIB_SRC)/alloc/src/lib. 405 +$(call if_changed_rule,rustc_library) 406 407 $(obj)/build_error.o: $(src)/build_error.rs $( 408 +$(call if_changed_rule,rustc_library) 409 410 $(obj)/bindings.o: $(src)/bindings/lib.rs \ 411 $(obj)/compiler_builtins.o \ 412 $(obj)/bindings/bindings_generated.rs \ 413 $(obj)/bindings/bindings_helpers_generated 414 +$(call if_changed_rule,rustc_library) 415 416 $(obj)/uapi.o: $(src)/uapi/lib.rs \ 417 $(obj)/compiler_builtins.o \ 418 $(obj)/uapi/uapi_generated.rs FORCE 419 +$(call if_changed_rule,rustc_library) 420 421 $(obj)/kernel.o: private rustc_target_flags = 422 --extern build_error --extern macros --ext 423 $(obj)/kernel.o: $(src)/kernel/lib.rs $(obj)/a 424 $(obj)/libmacros.so $(obj)/bindings.o $(ob 425 +$(call if_changed_rule,rustc_library) 426 427 endif # CONFIG_RUST
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.