diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2022-10-03 16:39:37 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2022-10-03 16:39:37 -0700 | 
| commit | 8aebac82933ff1a7c8eede18cab11e1115e2062b (patch) | |
| tree | 8305fe6437fe1db1a5dedf218d53a6bd21120793 /Makefile | |
| parent | a5088ee7251e5106a4efa9588a73866eb4b4154e (diff) | |
| parent | 615131b8e9bcd88e2d3ef78a4954ff4abfbb1fb7 (diff) | |
| download | linux-8aebac82933ff1a7c8eede18cab11e1115e2062b.tar.bz2 | |
Merge tag 'rust-v6.1-rc1' of https://github.com/Rust-for-Linux/linux
Pull Rust introductory support from Kees Cook:
 "The tree has a recent base, but has fundamentally been in linux-next
  for a year and a half[1]. It's been updated based on feedback from the
  Kernel Maintainer's Summit, and to gain recent Reviewed-by: tags.
  Miguel is the primary maintainer, with me helping where needed/wanted.
  Our plan is for the tree to switch to the standard non-rebasing
  practice once this initial infrastructure series lands.
  The contents are the absolute minimum to get Rust code building in the
  kernel, with many more interfaces[2] (and drivers - NVMe[3], 9p[4], M1
  GPU[5]) on the way.
  The initial support of Rust-for-Linux comes in roughly 4 areas:
   - Kernel internals (kallsyms expansion for Rust symbols, %pA format)
   - Kbuild infrastructure (Rust build rules and support scripts)
   - Rust crates and bindings for initial minimum viable build
   - Rust kernel documentation and samples
  Rust support has been in linux-next for a year and a half now, and the
  short log doesn't do justice to the number of people who have
  contributed both to the Linux kernel side but also to the upstream
  Rust side to support the kernel's needs. Thanks to these 173 people,
  and many more, who have been involved in all kinds of ways:
  Miguel Ojeda, Wedson Almeida Filho, Alex Gaynor, Boqun Feng, Gary Guo,
  Björn Roy Baron, Andreas Hindborg, Adam Bratschi-Kaye, Benno Lossin,
  Maciej Falkowski, Finn Behrens, Sven Van Asbroeck, Asahi Lina, FUJITA
  Tomonori, John Baublitz, Wei Liu, Geoffrey Thomas, Philip Herron,
  Arthur Cohen, David Faust, Antoni Boucher, Philip Li, Yujie Liu,
  Jonathan Corbet, Greg Kroah-Hartman, Paul E. McKenney, Josh Triplett,
  Kent Overstreet, David Gow, Alice Ryhl, Robin Randhawa, Kees Cook,
  Nick Desaulniers, Matthew Wilcox, Linus Walleij, Joe Perches, Michael
  Ellerman, Petr Mladek, Masahiro Yamada, Arnaldo Carvalho de Melo,
  Andrii Nakryiko, Konstantin Shelekhin, Rasmus Villemoes, Konstantin
  Ryabitsev, Stephen Rothwell, Andy Shevchenko, Sergey Senozhatsky, John
  Paul Adrian Glaubitz, David Laight, Nathan Chancellor, Jonathan
  Cameron, Daniel Latypov, Shuah Khan, Brendan Higgins, Julia Lawall,
  Laurent Pinchart, Geert Uytterhoeven, Akira Yokosawa, Pavel Machek,
  David S. Miller, John Hawley, James Bottomley, Arnd Bergmann,
  Christian Brauner, Dan Robertson, Nicholas Piggin, Zhouyi Zhou, Elena
  Zannoni, Jose E. Marchesi, Leon Romanovsky, Will Deacon, Richard
  Weinberger, Randy Dunlap, Paolo Bonzini, Roland Dreier, Mark Brown,
  Sasha Levin, Ted Ts'o, Steven Rostedt, Jarkko Sakkinen, Michal
  Kubecek, Marco Elver, Al Viro, Keith Busch, Johannes Berg, Jan Kara,
  David Sterba, Connor Kuehl, Andy Lutomirski, Andrew Lunn, Alexandre
  Belloni, Peter Zijlstra, Russell King, Eric W. Biederman, Willy
  Tarreau, Christoph Hellwig, Emilio Cobos Álvarez, Christian Poveda,
  Mark Rousskov, John Ericson, TennyZhuang, Xuanwo, Daniel Paoliello,
  Manish Goregaokar, comex, Josh Stone, Stephan Sokolow, Philipp Krones,
  Guillaume Gomez, Joshua Nelson, Mats Larsen, Marc Poulhiès, Samantha
  Miller, Esteban Blanc, Martin Schmidt, Martin Rodriguez Reboredo,
  Daniel Xu, Viresh Kumar, Bartosz Golaszewski, Vegard Nossum, Milan
  Landaverde, Dariusz Sosnowski, Yuki Okushi, Matthew Bakhtiari, Wu
  XiangCheng, Tiago Lam, Boris-Chengbiao Zhou, Sumera Priyadarsini,
  Viktor Garske, Niklas Mohrin, Nándor István Krácser, Morgan Bartlett,
  Miguel Cano, Léo Lanteri Thauvin, Julian Merkle, Andreas Reindl,
  Jiapeng Chong, Fox Chen, Douglas Su, Antonio Terceiro, SeongJae Park,
  Sergio González Collado, Ngo Iok Ui (Wu Yu Wei), Joshua Abraham,
  Milan, Daniel Kolsoi, ahomescu, Manas, Luis Gerhorst, Li Hongyu,
  Philipp Gesang, Russell Currey, Jalil David Salamé Messina, Jon Olson,
  Raghvender, Angelos, Kaviraj Kanagaraj, Paul Römer, Sladyn Nunes,
  Mauro Baladés, Hsiang-Cheng Yang, Abhik Jain, Hongyu Li, Sean Nash,
  Yuheng Su, Peng Hao, Anhad Singh, Roel Kluin, Sara Saa, Geert
  Stappers, Garrett LeSage, IFo Hancroft, and Linus Torvalds"
Link: https://lwn.net/Articles/849849/ [1]
Link: https://github.com/Rust-for-Linux/linux/commits/rust [2]
Link: https://github.com/metaspace/rust-linux/commit/d88c3744d6cbdf11767e08bad56cbfb67c4c96d0 [3]
Link: https://github.com/wedsonaf/linux/commit/9367032607f7670de0ba1537cf09ab0f4365a338 [4]
Link: https://github.com/AsahiLinux/linux/commits/gpu/rust-wip [5]
* tag 'rust-v6.1-rc1' of https://github.com/Rust-for-Linux/linux: (27 commits)
  MAINTAINERS: Rust
  samples: add first Rust examples
  x86: enable initial Rust support
  docs: add Rust documentation
  Kbuild: add Rust support
  rust: add `.rustfmt.toml`
  scripts: add `is_rust_module.sh`
  scripts: add `rust_is_available.sh`
  scripts: add `generate_rust_target.rs`
  scripts: add `generate_rust_analyzer.py`
  scripts: decode_stacktrace: demangle Rust symbols
  scripts: checkpatch: enable language-independent checks for Rust
  scripts: checkpatch: diagnose uses of `%pA` in the C side as errors
  vsprintf: add new `%pA` format specifier
  rust: export generated symbols
  rust: add `kernel` crate
  rust: add `bindings` crate
  rust: add `macros` crate
  rust: add `compiler_builtins` crate
  rust: adapt `alloc` crate to the kernel
  ...
Diffstat (limited to 'Makefile')
| -rw-r--r-- | Makefile | 172 | 
1 files changed, 163 insertions, 9 deletions
| @@ -120,6 +120,15 @@ endif  export KBUILD_CHECKSRC +# Enable "clippy" (a linter) as part of the Rust compilation. +# +# Use 'make CLIPPY=1' to enable it. +ifeq ("$(origin CLIPPY)", "command line") +  KBUILD_CLIPPY := $(CLIPPY) +endif + +export KBUILD_CLIPPY +  # Use make M=dir or set the environment variable KBUILD_EXTMOD to specify the  # directory of external module to build. Setting M= takes precedence.  ifeq ("$(origin M)", "command line") @@ -270,14 +279,14 @@ no-dot-config-targets := $(clean-targets) \  			 cscope gtags TAGS tags help% %docs check% coccicheck \  			 $(version_h) headers headers_% archheaders archscripts \  			 %asm-generic kernelversion %src-pkg dt_binding_check \ -			 outputmakefile +			 outputmakefile rustavailable rustfmt rustfmtcheck  # Installation targets should not require compiler. Unfortunately, vdso_install  # is an exception where build artifacts may be updated. This must be fixed.  no-compiler-targets := $(no-dot-config-targets) install dtbs_install \  			headers_install modules_install kernelrelease image_name  no-sync-config-targets := $(no-dot-config-targets) %install kernelrelease \  			  image_name -single-targets := %.a %.i %.ko %.lds %.ll %.lst %.mod %.o %.s %.symtypes %/ +single-targets := %.a %.i %.rsi %.ko %.lds %.ll %.lst %.mod %.o %.s %.symtypes %/  config-build	:=  mixed-build	:= @@ -439,6 +448,7 @@ else  HOSTCC	= gcc  HOSTCXX	= g++  endif +HOSTRUSTC = rustc  HOSTPKG_CONFIG	= pkg-config  KBUILD_USERHOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes \ @@ -447,8 +457,26 @@ KBUILD_USERHOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes \  KBUILD_USERCFLAGS  := $(KBUILD_USERHOSTCFLAGS) $(USERCFLAGS)  KBUILD_USERLDFLAGS := $(USERLDFLAGS) +# These flags apply to all Rust code in the tree, including the kernel and +# host programs. +export rust_common_flags := --edition=2021 \ +			    -Zbinary_dep_depinfo=y \ +			    -Dunsafe_op_in_unsafe_fn -Drust_2018_idioms \ +			    -Dunreachable_pub -Dnon_ascii_idents \ +			    -Wmissing_docs \ +			    -Drustdoc::missing_crate_level_docs \ +			    -Dclippy::correctness -Dclippy::style \ +			    -Dclippy::suspicious -Dclippy::complexity \ +			    -Dclippy::perf \ +			    -Dclippy::let_unit_value -Dclippy::mut_mut \ +			    -Dclippy::needless_bitwise_bool \ +			    -Dclippy::needless_continue \ +			    -Wclippy::dbg_macro +  KBUILD_HOSTCFLAGS   := $(KBUILD_USERHOSTCFLAGS) $(HOST_LFS_CFLAGS) $(HOSTCFLAGS)  KBUILD_HOSTCXXFLAGS := -Wall -O2 $(HOST_LFS_CFLAGS) $(HOSTCXXFLAGS) +KBUILD_HOSTRUSTFLAGS := $(rust_common_flags) -O -Cstrip=debuginfo \ +			-Zallow-features= $(HOSTRUSTFLAGS)  KBUILD_HOSTLDFLAGS  := $(HOST_LFS_LDFLAGS) $(HOSTLDFLAGS)  KBUILD_HOSTLDLIBS   := $(HOST_LFS_LIBS) $(HOSTLDLIBS) @@ -473,6 +501,12 @@ OBJDUMP		= $(CROSS_COMPILE)objdump  READELF		= $(CROSS_COMPILE)readelf  STRIP		= $(CROSS_COMPILE)strip  endif +RUSTC		= rustc +RUSTDOC		= rustdoc +RUSTFMT		= rustfmt +CLIPPY_DRIVER	= clippy-driver +BINDGEN		= bindgen +CARGO		= cargo  PAHOLE		= pahole  RESOLVE_BTFIDS	= $(objtree)/tools/bpf/resolve_btfids/resolve_btfids  LEX		= flex @@ -498,9 +532,11 @@ CHECKFLAGS     := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \  		  -Wbitwise -Wno-return-void -Wno-unknown-attribute $(CF)  NOSTDINC_FLAGS :=  CFLAGS_MODULE   = +RUSTFLAGS_MODULE =  AFLAGS_MODULE   =  LDFLAGS_MODULE  =  CFLAGS_KERNEL	= +RUSTFLAGS_KERNEL =  AFLAGS_KERNEL	=  LDFLAGS_vmlinux = @@ -529,15 +565,43 @@ KBUILD_CFLAGS   := -Wall -Wundef -Werror=strict-prototypes -Wno-trigraphs \  		   -Werror=return-type -Wno-format-security \  		   -std=gnu11  KBUILD_CPPFLAGS := -D__KERNEL__ +KBUILD_RUSTFLAGS := $(rust_common_flags) \ +		    --target=$(objtree)/rust/target.json \ +		    -Cpanic=abort -Cembed-bitcode=n -Clto=n \ +		    -Cforce-unwind-tables=n -Ccodegen-units=1 \ +		    -Csymbol-mangling-version=v0 \ +		    -Crelocation-model=static \ +		    -Zfunction-sections=n \ +		    -Dclippy::float_arithmetic +  KBUILD_AFLAGS_KERNEL :=  KBUILD_CFLAGS_KERNEL := +KBUILD_RUSTFLAGS_KERNEL :=  KBUILD_AFLAGS_MODULE  := -DMODULE  KBUILD_CFLAGS_MODULE  := -DMODULE +KBUILD_RUSTFLAGS_MODULE := --cfg MODULE  KBUILD_LDFLAGS_MODULE :=  KBUILD_LDFLAGS :=  CLANG_FLAGS := +ifeq ($(KBUILD_CLIPPY),1) +	RUSTC_OR_CLIPPY_QUIET := CLIPPY +	RUSTC_OR_CLIPPY = $(CLIPPY_DRIVER) +else +	RUSTC_OR_CLIPPY_QUIET := RUSTC +	RUSTC_OR_CLIPPY = $(RUSTC) +endif + +ifdef RUST_LIB_SRC +	export RUST_LIB_SRC +endif + +# Allows the usage of unstable features in stable compilers. +export RUSTC_BOOTSTRAP := 1 +  export ARCH SRCARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC HOSTPKG_CONFIG +export RUSTC RUSTDOC RUSTFMT RUSTC_OR_CLIPPY_QUIET RUSTC_OR_CLIPPY BINDGEN CARGO +export HOSTRUSTC KBUILD_HOSTRUSTFLAGS  export CPP AR NM STRIP OBJCOPY OBJDUMP READELF PAHOLE RESOLVE_BTFIDS LEX YACC AWK INSTALLKERNEL  export PERL PYTHON3 CHECK CHECKFLAGS MAKE UTS_MACHINE HOSTCXX  export KGZIP KBZIP2 KLZOP LZMA LZ4 XZ ZSTD @@ -546,9 +610,10 @@ export KBUILD_USERCFLAGS KBUILD_USERLDFLAGS  export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS KBUILD_LDFLAGS  export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE +export KBUILD_RUSTFLAGS RUSTFLAGS_KERNEL RUSTFLAGS_MODULE  export KBUILD_AFLAGS AFLAGS_KERNEL AFLAGS_MODULE -export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE KBUILD_LDFLAGS_MODULE -export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL +export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE KBUILD_RUSTFLAGS_MODULE KBUILD_LDFLAGS_MODULE +export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL KBUILD_RUSTFLAGS_KERNEL  export PAHOLE_FLAGS  # Files to ignore in find ... statements @@ -729,7 +794,7 @@ $(KCONFIG_CONFIG):  #  # Do not use $(call cmd,...) here. That would suppress prompts from syncconfig,  # so you cannot notice that Kconfig is waiting for the user input. -%/config/auto.conf %/config/auto.conf.cmd %/generated/autoconf.h: $(KCONFIG_CONFIG) +%/config/auto.conf %/config/auto.conf.cmd %/generated/autoconf.h %/generated/rustc_cfg: $(KCONFIG_CONFIG)  	$(Q)$(kecho) "  SYNC    $@"  	$(Q)$(MAKE) -f $(srctree)/Makefile syncconfig  else # !may-sync-config @@ -758,10 +823,17 @@ KBUILD_CFLAGS	+= $(call cc-disable-warning, address-of-packed-member)  ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE  KBUILD_CFLAGS += -O2 +KBUILD_RUSTFLAGS += -Copt-level=2  else ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE  KBUILD_CFLAGS += -Os +KBUILD_RUSTFLAGS += -Copt-level=s  endif +# Always set `debug-assertions` and `overflow-checks` because their default +# depends on `opt-level` and `debug-assertions`, respectively. +KBUILD_RUSTFLAGS += -Cdebug-assertions=$(if $(CONFIG_RUST_DEBUG_ASSERTIONS),y,n) +KBUILD_RUSTFLAGS += -Coverflow-checks=$(if $(CONFIG_RUST_OVERFLOW_CHECKS),y,n) +  # Tell gcc to never replace conditional load with a non-conditional one  ifdef CONFIG_CC_IS_GCC  # gcc-10 renamed --param=allow-store-data-races=0 to @@ -792,6 +864,9 @@ KBUILD_CFLAGS-$(CONFIG_WERROR) += -Werror  KBUILD_CFLAGS-$(CONFIG_CC_NO_ARRAY_BOUNDS) += -Wno-array-bounds  KBUILD_CFLAGS += $(KBUILD_CFLAGS-y) $(CONFIG_CC_IMPLICIT_FALLTHROUGH) +KBUILD_RUSTFLAGS-$(CONFIG_WERROR) += -Dwarnings +KBUILD_RUSTFLAGS += $(KBUILD_RUSTFLAGS-y) +  ifdef CONFIG_CC_IS_CLANG  KBUILD_CPPFLAGS += -Qunused-arguments  # The kernel builds with '-std=gnu11' so use of GNU extensions is acceptable. @@ -812,12 +887,15 @@ KBUILD_CFLAGS += $(call cc-disable-warning, dangling-pointer)  ifdef CONFIG_FRAME_POINTER  KBUILD_CFLAGS	+= -fno-omit-frame-pointer -fno-optimize-sibling-calls +KBUILD_RUSTFLAGS += -Cforce-frame-pointers=y  else  # Some targets (ARM with Thumb2, for example), can't be built with frame  # pointers.  For those, we don't have FUNCTION_TRACER automatically  # select FRAME_POINTER.  However, FUNCTION_TRACER adds -pg, and this is  # incompatible with -fomit-frame-pointer with current GCC, so we don't use  # -fomit-frame-pointer with FUNCTION_TRACER. +# In the Rust target specification, "frame-pointer" is set explicitly +# to "may-omit".  ifndef CONFIG_FUNCTION_TRACER  KBUILD_CFLAGS	+= -fomit-frame-pointer  endif @@ -882,8 +960,10 @@ ifdef CONFIG_DEBUG_SECTION_MISMATCH  KBUILD_CFLAGS += -fno-inline-functions-called-once  endif +# `rustc`'s `-Zfunction-sections` applies to data too (as of 1.59.0).  ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION  KBUILD_CFLAGS_KERNEL += -ffunction-sections -fdata-sections +KBUILD_RUSTFLAGS_KERNEL += -Zfunction-sections=y  LDFLAGS_vmlinux += --gc-sections  endif @@ -1026,10 +1106,11 @@ include $(addprefix $(srctree)/, $(include-y))  # Do not add $(call cc-option,...) below this line. When you build the kernel  # from the clean source tree, the GCC plugins do not exist at this point. -# Add user supplied CPPFLAGS, AFLAGS and CFLAGS as the last assignments +# Add user supplied CPPFLAGS, AFLAGS, CFLAGS and RUSTFLAGS as the last assignments  KBUILD_CPPFLAGS += $(KCPPFLAGS)  KBUILD_AFLAGS   += $(KAFLAGS)  KBUILD_CFLAGS   += $(KCFLAGS) +KBUILD_RUSTFLAGS += $(KRUSTFLAGS)  KBUILD_LDFLAGS_MODULE += --build-id=sha1  LDFLAGS_vmlinux += --build-id=sha1 @@ -1104,6 +1185,7 @@ ifeq ($(KBUILD_EXTMOD),)  core-y			+= kernel/ certs/ mm/ fs/ ipc/ security/ crypto/  core-$(CONFIG_BLOCK)	+= block/  core-$(CONFIG_IO_URING)	+= io_uring/ +core-$(CONFIG_RUST)	+= rust/  vmlinux-dirs	:= $(patsubst %/,%,$(filter %/, \  		     $(core-y) $(core-m) $(drivers-y) $(drivers-m) \ @@ -1206,6 +1288,10 @@ prepare0: archprepare  # All the preparing..  prepare: prepare0 +ifdef CONFIG_RUST +	$(Q)$(CONFIG_SHELL) $(srctree)/scripts/rust_is_available.sh -v +	$(Q)$(MAKE) $(build)=rust +endif  PHONY += remove-stale-files  remove-stale-files: @@ -1499,7 +1585,7 @@ endif # CONFIG_MODULES  # Directories & files removed with 'make clean'  CLEAN_FILES += include/ksym vmlinux.symvers modules-only.symvers \  	       modules.builtin modules.builtin.modinfo modules.nsdeps \ -	       compile_commands.json .thinlto-cache +	       compile_commands.json .thinlto-cache rust/test rust/doc  # Directories & files removed with 'make mrproper'  MRPROPER_FILES += include/config include/generated          \ @@ -1510,7 +1596,8 @@ MRPROPER_FILES += include/config include/generated          \  		  certs/signing_key.pem \  		  certs/x509.genkey \  		  vmlinux-gdb.py \ -		  *.spec +		  *.spec \ +		  rust/target.json rust/libmacros.so  # clean - Delete most, but leave enough to build external modules  # @@ -1535,6 +1622,9 @@ $(mrproper-dirs):  mrproper: clean $(mrproper-dirs)  	$(call cmd,rmfiles) +	@find . $(RCS_FIND_IGNORE) \ +		\( -name '*.rmeta' \) \ +		-type f -print | xargs rm -f  # distclean  # @@ -1622,6 +1712,24 @@ help:  	@echo  '  kselftest-merge   - Merge all the config dependencies of'  	@echo  '		      kselftest to existing .config.'  	@echo  '' +	@echo  'Rust targets:' +	@echo  '  rustavailable   - Checks whether the Rust toolchain is' +	@echo  '		    available and, if not, explains why.' +	@echo  '  rustfmt	  - Reformat all the Rust code in the kernel' +	@echo  '  rustfmtcheck	  - Checks if all the Rust code in the kernel' +	@echo  '		    is formatted, printing a diff otherwise.' +	@echo  '  rustdoc	  - Generate Rust documentation' +	@echo  '		    (requires kernel .config)' +	@echo  '  rusttest        - Runs the Rust tests' +	@echo  '                    (requires kernel .config; downloads external repos)' +	@echo  '  rust-analyzer	  - Generate rust-project.json rust-analyzer support file' +	@echo  '		    (requires kernel .config)' +	@echo  '  dir/file.[os]   - Build specified target only' +	@echo  '  dir/file.rsi    - Build macro expanded source, similar to C preprocessing.' +	@echo  '                    Run with RUSTFMT=n to skip reformatting if needed.' +	@echo  '                    The output is not intended to be compilable.' +	@echo  '  dir/file.ll     - Build the LLVM assembly file' +	@echo  ''  	@$(if $(dtstree), \  		echo 'Devicetree:'; \  		echo '* dtbs             - Build device tree blobs for enabled boards'; \ @@ -1694,6 +1802,52 @@ PHONY += $(DOC_TARGETS)  $(DOC_TARGETS):  	$(Q)$(MAKE) $(build)=Documentation $@ + +# Rust targets +# --------------------------------------------------------------------------- + +# "Is Rust available?" target +PHONY += rustavailable +rustavailable: +	$(Q)$(CONFIG_SHELL) $(srctree)/scripts/rust_is_available.sh -v && echo "Rust is available!" + +# Documentation target +# +# Using the singular to avoid running afoul of `no-dot-config-targets`. +PHONY += rustdoc +rustdoc: prepare +	$(Q)$(MAKE) $(build)=rust $@ + +# Testing target +PHONY += rusttest +rusttest: prepare +	$(Q)$(MAKE) $(build)=rust $@ + +# Formatting targets +PHONY += rustfmt rustfmtcheck + +# We skip `rust/alloc` since we want to minimize the diff w.r.t. upstream. +# +# We match using absolute paths since `find` does not resolve them +# when matching, which is a problem when e.g. `srctree` is `..`. +# We `grep` afterwards in order to remove the directory entry itself. +rustfmt: +	$(Q)find $(abs_srctree) -type f -name '*.rs' \ +		-o -path $(abs_srctree)/rust/alloc -prune \ +		-o -path $(abs_objtree)/rust/test -prune \ +		| grep -Fv $(abs_srctree)/rust/alloc \ +		| grep -Fv $(abs_objtree)/rust/test \ +		| grep -Fv generated \ +		| xargs $(RUSTFMT) $(rustfmt_flags) + +rustfmtcheck: rustfmt_flags = --check +rustfmtcheck: rustfmt + +# IDE support targets +PHONY += rust-analyzer +rust-analyzer: +	$(Q)$(MAKE) $(build)=rust $@ +  # Misc  # --------------------------------------------------------------------------- @@ -1861,7 +2015,7 @@ $(clean-dirs):  clean: $(clean-dirs)  	$(call cmd,rmfiles)  	@find $(or $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \ -		\( -name '*.[aios]' -o -name '*.ko' -o -name '.*.cmd' \ +		\( -name '*.[aios]' -o -name '*.rsi' -o -name '*.ko' -o -name '.*.cmd' \  		-o -name '*.ko.*' \  		-o -name '*.dtb' -o -name '*.dtbo' -o -name '*.dtb.S' -o -name '*.dt.yaml' \  		-o -name '*.dwo' -o -name '*.lst' \ |