Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

rust: compile libcore with edition 2024 for 1.87+

Rust 1.87 (released on 2025-05-15) compiles core library with edition
2024 instead of 2021 [1]. Ensure that the edition matches libcore's
expectation to avoid potential breakage.

[ J3m3 reported in Zulip [2] that the `rust-analyzer` target was
broken after this patch -- indeed, we need to avoid `core-cfgs`
since those are passed to the `rust-analyzer` target.

So, instead, I tweaked the patch to create a new `core-edition`
variable and explicitly mention the `--edition` flag instead of
reusing `core-cfg`s.

In addition, pass a new argument using this new variable to
`generate_rust_analyzer.py` so that we set the right edition there.

By the way, for future reference: the `filter-out` change is needed
for Rust < 1.87, since otherwise we would skip the `--edition=2021`
we just added, ending up with no edition flag, and thus the compiler
would default to the 2015 one.

[2] https://rust-for-linux.zulipchat.com/#narrow/channel/291565/topic/x/near/520206547

- Miguel ]

Cc: stable@vger.kernel.org # Needed in 6.12.y and later (Rust is pinned in older LTSs).
Link: https://github.com/rust-lang/rust/pull/138162 [1]
Reported-by: est31 <est31@protonmail.com>
Closes: https://github.com/Rust-for-Linux/linux/issues/1163
Signed-off-by: Gary Guo <gary@garyguo.net>
Link: https://lore.kernel.org/r/20250517085600.2857460-1-gary@garyguo.net
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>

authored by

Gary Guo and committed by
Miguel Ojeda
f4daa80d df523db1

+16 -11
+8 -6
rust/Makefile
··· 60 60 core-cfgs = \ 61 61 --cfg no_fp_fmt_parse 62 62 63 + core-edition := $(if $(call rustc-min-version,108700),2024,2021) 64 + 63 65 # `rustc` recognizes `--remap-path-prefix` since 1.26.0, but `rustdoc` only 64 66 # since Rust 1.81.0. Moreover, `rustdoc` ICEs on out-of-tree builds since Rust 65 67 # 1.82.0 (https://github.com/rust-lang/rust/issues/138520). Thus workaround both ··· 108 106 109 107 # Starting with Rust 1.82.0, skipping `-Wrustdoc::unescaped_backticks` should 110 108 # not be needed -- see https://github.com/rust-lang/rust/pull/128307. 111 - rustdoc-core: private skip_flags = -Wrustdoc::unescaped_backticks 112 - rustdoc-core: private rustc_target_flags = $(core-cfgs) 109 + rustdoc-core: private skip_flags = --edition=2021 -Wrustdoc::unescaped_backticks 110 + rustdoc-core: private rustc_target_flags = --edition=$(core-edition) $(core-cfgs) 113 111 rustdoc-core: $(RUST_LIB_SRC)/core/src/lib.rs FORCE 114 112 +$(call if_changed,rustdoc) 115 113 ··· 418 416 cmd_rustc_library = \ 419 417 OBJTREE=$(abspath $(objtree)) \ 420 418 $(if $(skip_clippy),$(RUSTC),$(RUSTC_OR_CLIPPY)) \ 421 - $(filter-out $(skip_flags),$(rust_flags) $(rustc_target_flags)) \ 419 + $(filter-out $(skip_flags),$(rust_flags)) $(rustc_target_flags) \ 422 420 --emit=dep-info=$(depfile) --emit=obj=$@ \ 423 421 --emit=metadata=$(dir $@)$(patsubst %.o,lib%.rmeta,$(notdir $@)) \ 424 422 --crate-type rlib -L$(objtree)/$(obj) \ ··· 429 427 430 428 rust-analyzer: 431 429 $(Q)MAKEFLAGS= $(srctree)/scripts/generate_rust_analyzer.py \ 432 - --cfgs='core=$(core-cfgs)' \ 430 + --cfgs='core=$(core-cfgs)' $(core-edition) \ 433 431 $(realpath $(srctree)) $(realpath $(objtree)) \ 434 432 $(rustc_sysroot) $(RUST_LIB_SRC) $(if $(KBUILD_EXTMOD),$(srcroot)) \ 435 433 > rust-project.json ··· 485 483 $(obj)/exports.o: private skip_gendwarfksyms = 1 486 484 487 485 $(obj)/core.o: private skip_clippy = 1 488 - $(obj)/core.o: private skip_flags = -Wunreachable_pub 486 + $(obj)/core.o: private skip_flags = --edition=2021 -Wunreachable_pub 489 487 $(obj)/core.o: private rustc_objcopy = $(foreach sym,$(redirect-intrinsics),--redefine-sym $(sym)=__rust$(sym)) 490 - $(obj)/core.o: private rustc_target_flags = $(core-cfgs) 488 + $(obj)/core.o: private rustc_target_flags = --edition=$(core-edition) $(core-cfgs) 491 489 $(obj)/core.o: $(RUST_LIB_SRC)/core/src/lib.rs \ 492 490 $(wildcard $(objtree)/include/config/RUSTC_VERSION_TEXT) FORCE 493 491 +$(call if_changed_rule,rustc_library)
+8 -5
scripts/generate_rust_analyzer.py
··· 19 19 20 20 return crates_cfgs 21 21 22 - def generate_crates(srctree, objtree, sysroot_src, external_src, cfgs): 22 + def generate_crates(srctree, objtree, sysroot_src, external_src, cfgs, core_edition): 23 23 # Generate the configuration list. 24 24 cfg = [] 25 25 with open(objtree / "include" / "generated" / "rustc_cfg") as fd: ··· 35 35 crates_indexes = {} 36 36 crates_cfgs = args_crates_cfgs(cfgs) 37 37 38 - def append_crate(display_name, root_module, deps, cfg=[], is_workspace_member=True, is_proc_macro=False): 38 + def append_crate(display_name, root_module, deps, cfg=[], is_workspace_member=True, is_proc_macro=False, edition="2021"): 39 39 crate = { 40 40 "display_name": display_name, 41 41 "root_module": str(root_module), ··· 43 43 "is_proc_macro": is_proc_macro, 44 44 "deps": [{"crate": crates_indexes[dep], "name": dep} for dep in deps], 45 45 "cfg": cfg, 46 - "edition": "2021", 46 + "edition": edition, 47 47 "env": { 48 48 "RUST_MODFILE": "This is only for rust-analyzer" 49 49 } ··· 61 61 display_name, 62 62 deps, 63 63 cfg=[], 64 + edition="2021", 64 65 ): 65 66 append_crate( 66 67 display_name, ··· 69 68 deps, 70 69 cfg, 71 70 is_workspace_member=False, 71 + edition=edition, 72 72 ) 73 73 74 74 # NB: sysroot crates reexport items from one another so setting up our transitive dependencies 75 75 # here is important for ensuring that rust-analyzer can resolve symbols. The sources of truth 76 76 # for this dependency graph are `(sysroot_src / crate / "Cargo.toml" for crate in crates)`. 77 - append_sysroot_crate("core", [], cfg=crates_cfgs.get("core", [])) 77 + append_sysroot_crate("core", [], cfg=crates_cfgs.get("core", []), edition=core_edition) 78 78 append_sysroot_crate("alloc", ["core"]) 79 79 append_sysroot_crate("std", ["alloc", "core"]) 80 80 append_sysroot_crate("proc_macro", ["core", "std"]) ··· 179 177 parser = argparse.ArgumentParser() 180 178 parser.add_argument('--verbose', '-v', action='store_true') 181 179 parser.add_argument('--cfgs', action='append', default=[]) 180 + parser.add_argument("core_edition") 182 181 parser.add_argument("srctree", type=pathlib.Path) 183 182 parser.add_argument("objtree", type=pathlib.Path) 184 183 parser.add_argument("sysroot", type=pathlib.Path) ··· 196 193 assert args.sysroot in args.sysroot_src.parents 197 194 198 195 rust_project = { 199 - "crates": generate_crates(args.srctree, args.objtree, args.sysroot_src, args.exttree, args.cfgs), 196 + "crates": generate_crates(args.srctree, args.objtree, args.sysroot_src, args.exttree, args.cfgs, args.core_edition), 200 197 "sysroot": str(args.sysroot), 201 198 } 202 199