diff mbox series

rust: Enable rust oe-selftest

Message ID 20240118105723.904877-1-Yash.Shinde@windriver.com
State New
Headers show
Series rust: Enable rust oe-selftest | expand

Commit Message

Yash Shinde Jan. 18, 2024, 10:57 a.m. UTC
From: Yash Shinde <Yash.Shinde@windriver.com>

Enable rust oe-selftest for rust 1.74.1 version and
add target_cfg.patch to handle target configurations
for custom targets.

The testing is done on arm32, arm64, mips64, x86 and  x86_64 targets.

Signed-off-by: Yash Shinde <Yash.Shinde@windriver.com>
---
 meta/lib/oeqa/selftest/cases/rust.py          | 103 ++++++++-----
 .../rust/files/target_cfg.patch               | 144 ++++++++++++++++++
 meta/recipes-devtools/rust/rust-source.inc    |   1 +
 3 files changed, 214 insertions(+), 34 deletions(-)
 create mode 100644 meta/recipes-devtools/rust/files/target_cfg.patch

Comments

Randy MacLeod Jan. 18, 2024, 8:08 p.m. UTC | #1
On 2024-01-18 5:57 a.m., Yash.Shinde@windriver.com wrote:
> From: Yash Shinde<Yash.Shinde@windriver.com>
>
> Enable rust oe-selftest for rust 1.74.1 version and
> add target_cfg.patch to handle target configurations
> for custom targets.

Hi Yashe,

Yay, getting the rust test suite working again great news!

We talked about this in today's YP bug review and decided NOT to merge this
until after the M2 build is taken care of over the next few days.

That gives me a chance to review the commit and ask some questions! ;-)

First, your commit log should be expanded to explain what has changed at 
a high level
to someone who is just reading "git log".

What you have is a good start but I'd like more info on what changed in:
meta/lib/oeqa/selftest/cases/rust.py

There are lots of tests added to the exclude list and some seem to have 
just moved.

Please explain why you did this and if there is any way to avoid the 
"noise" of moved tests in future updates. Could you also report on the 
number of newly disabled tests and try to summarize in the commit log 
what these tests are doing and

Ah, I see what you have done: 1. sort the exclude list 2. add the newly 
excluded tests. Please do that in separate commits so that it's easier 
to understand. This will reduce the size of the "Enable rust 
oe-selftest" diff for meta/lib/oeqa/selftest/cases/rust.py from: | 103 
++++++++----- to: | 37 +++-

and let people easily see that most of the newly excluded tests are in 
tests/codegen .

That reminds me, do we really need to list directories in that exclude 
list or only list .rs files?

If I save the list to /tmp/jj, you can see that we could reduce the list 
by 34 lines:

❯ rg "\.rs" /tmp/jj | wc -l 203 ❯ rg -v "\.rs" /tmp/jj | wc -l 34

If we can do that, again do it as a separate commit since it should not 
affect the outcome of the test.


Also this backport link:
https://github.com/rust-lang/rust/pull/119619/commits
is actually 3 separate commits so it might be better to apply those 
individually
so that we can know when they can be dropped by running:
$ git tag --contains <commit-id> on each commit

Also in the patches, please add you Signed-Off-By line but keep the 
upstream author's S-O-B line.



For anyone interested we did talk about the number of Rust tests that we 
are excluding and of course our goal is to work with the upstream Rust 
community to reduce the number of excluded tests over the coming months 
but for now, it's just nice to see the test working again!

If you update these things convince yourself that the changes are 
functionally identical, I don't think there's any need to re-do all the 
testing that you have done.

Thanks Yash,

../Randy

>
> The testing is done on arm32, arm64, mips64, x86 and  x86_64 targets.
>
> Signed-off-by: Yash Shinde<Yash.Shinde@windriver.com>
> ---
>   meta/lib/oeqa/selftest/cases/rust.py          | 103 ++++++++-----
>   .../rust/files/target_cfg.patch               | 144 ++++++++++++++++++
>   meta/recipes-devtools/rust/rust-source.inc    |   1 +
>   3 files changed, 214 insertions(+), 34 deletions(-)
>   create mode 100644 meta/recipes-devtools/rust/files/target_cfg.patch
>
> diff --git a/meta/lib/oeqa/selftest/cases/rust.py b/meta/lib/oeqa/selftest/cases/rust.py
> index 6dbc517006..216c73e5d1 100644
> --- a/meta/lib/oeqa/selftest/cases/rust.py
> +++ b/meta/lib/oeqa/selftest/cases/rust.py
> @@ -40,7 +40,7 @@ def parse_results(filename):
>   class RustSelfTestSystemEmulated(OESelftestTestCase, OEPTestResultTestCase):
>       def test_rust(self, *args, **kwargs):
>           # Disable Rust Oe-selftest
> -        self.skipTest("The Rust Oe-selftest is disabled.")
> +        #self.skipTest("The Rust Oe-selftest is disabled.")
>   
>           # build remote-test-server before image build
>           recipe = "rust"
> @@ -73,38 +73,71 @@ class RustSelfTestSystemEmulated(OESelftestTestCase, OEPTestResultTestCase):
>                               'src/librustdoc',
>                               'src/rustdoc-json-types',
>                               'src/tools/compiletest/src/common.rs',
> +                            'src/tools/jsondoclint',
>                               'src/tools/lint-docs',
> +                            'src/tools/replace-version-placeholder',
>                               'src/tools/rust-analyzer',
>                               'src/tools/rustdoc-themes',
>                               'src/tools/tidy',
>                               'tests/assembly/asm/aarch64-outline-atomics.rs',
> +                            'tests/codegen/abi-efiapi.rs',
> +                            'tests/codegen/abi-efiapi.rs',
>                               'tests/codegen/abi-main-signature-32bit-c-int.rs',
>                               'tests/codegen/abi-repr-ext.rs',
> +                            'tests/codegen/abi-sysv64.rs',
>                               'tests/codegen/abi-x86-interrupt.rs',
> +                            'tests/codegen/align-byval.rs',
> +                            'tests/codegen/align-fn.rs',
> +                            'tests/codegen/asm-powerpc-clobbers.rs',
> +                            'tests/codegen/async-fn-debug-awaitee-field.rs',
> +                            'tests/codegen/binary-search-index-no-bound-check.rs',
>                               'tests/codegen/branch-protection.rs',
> +                            'tests/codegen/call-metadata.rs',
>                               'tests/codegen/catch-unwind.rs',
>                               'tests/codegen/cf-protection.rs',
> +                            'tests/codegen/debug-column.rs',
> +                            'tests/codegen/debug-limited.rs',
> +                            'tests/codegen/debuginfo-generic-closure-env-names.rs',
> +                            'tests/codegen/drop.rs',
> +                            'tests/codegen/dst-vtable-align-nonzero.rs',
> +                            'tests/codegen/enable-lto-unit-splitting.rs',
>                               'tests/codegen/enum-bounds-check-derived-idx.rs',
> +                            'tests/codegen/enum/enum-u128.rs',
> +                            'tests/codegen/fn-impl-trait-self.rs',
>                               'tests/codegen/force-unwind-tables.rs',
> +                            'tests/codegen/inherit_overflow.rs',
> +                            'tests/codegen/inherit_overflow.rs',
> +                            'tests/codegen/inline-function-args-debug-info.rs',
>                               'tests/codegen/intrinsic-no-unnamed-attr.rs',
> +                            'tests/codegen/intrinsics/mask.rs',
> +                            'tests/codegen/intrinsics/transmute-niched.rs',
>                               'tests/codegen/issues/issue-103840.rs',
>                               'tests/codegen/issues/issue-47278.rs',
> +                            'tests/codegen/issues/issue-73258.rs',
>                               'tests/codegen/issues/issue-73827-bounds-check-index-in-subexpr.rs',
> +                            'tests/codegen/issues/issue-75546.rs',
> +                            'tests/codegen/issues/issue-77812.rs',
> +                            'tests/codegen/issues/issue-98156-const-arg-temp-lifetime.rs',
>                               'tests/codegen/lifetime_start_end.rs',
> +                            'tests/codegen/llvm-ident.rs',
>                               'tests/codegen/local-generics-in-exe-internalized.rs',
> +                            'tests/codegen/mainsubprogram.rs',
>                               'tests/codegen/match-unoptimized.rs',
> +                            'tests/codegen/move-operands.rs',
>                               'tests/codegen/noalias-rwlockreadguard.rs',
>                               'tests/codegen/non-terminate/nonempty-infinite-loop.rs',
>                               'tests/codegen/noreturn-uninhabited.rs',
>                               'tests/codegen/repr-transparent-aggregates-3.rs',
> +                            'tests/codegen/repr/transparent-mips64.rs'
>                               'tests/codegen/sse42-implies-crc32.rs',
>                               'tests/codegen/thread-local.rs',
>                               'tests/codegen/uninit-consts.rs',
> +                            'tests/mir-opt/',
>                               'tests/pretty/raw-str-nonexpr.rs',
>                               'tests/run-make',
> +                            'tests/run-make-fulldeps',
>                               'tests/run-make/cdylib-fewer-symbols/foo.rs',
>                               'tests/run-make/doctests-keep-binaries/t.rs',
> -                            'tests/run-make-fulldeps',
>                               'tests/run-make/issue-22131/foo.rs',
>                               'tests/run-make/issue-36710/Makefile',
>                               'tests/run-make/issue-47551',
> @@ -119,6 +152,26 @@ class RustSelfTestSystemEmulated(OESelftestTestCase, OEPTestResultTestCase):
>                               'tests/run-make/sysroot-crates-are-unstable',
>                               'tests/run-make/target-specs',
>                               'tests/rustdoc',
> +                            'tests/rustdoc-js-std',
> +                            'tests/rustdoc-json',
> +                            'tests/rustdoc-ui/cfg-test.rs',
> +                            'tests/rustdoc-ui/check-cfg-test.rs',
> +                            'tests/rustdoc-ui/display-output.rs',
> +                            'tests/rustdoc-ui/doc-comment-multi-line-attr.rs',
> +                            'tests/rustdoc-ui/doc-comment-multi-line-cfg-attr.rs',
> +                            'tests/rustdoc-ui/doc-test-doctest-feature.rs',
> +                            'tests/rustdoc-ui/doc-test-rustdoc-feature.rs',
> +                            'tests/rustdoc-ui/doctest-multiline-crate-attribute.rs',
> +                            'tests/rustdoc-ui/doctest-output.rs',
> +                            'tests/rustdoc-ui/failed-doctest-compile-fail.rs',
> +                            'tests/rustdoc-ui/issue-80992.rs',
> +                            'tests/rustdoc-ui/issue-91134.rs',
> +                            'tests/rustdoc-ui/no-run-flag.rs',
> +                            'tests/rustdoc-ui/nocapture-fail.rs',
> +                            'tests/rustdoc-ui/nocapture.rs',
> +                            'tests/rustdoc-ui/run-directory.rs',
> +                            'tests/rustdoc-ui/test-no_std.rs',
> +                            'tests/rustdoc-ui/test-type.rs',
>                               'tests/rustdoc/async-move-doctest.rs',
>                               'tests/rustdoc/async-trait.rs',
>                               'tests/rustdoc/auto-traits.rs',
> @@ -133,9 +186,9 @@ class RustSelfTestSystemEmulated(OESelftestTestCase, OEPTestResultTestCase):
>                               'tests/rustdoc/edition-doctest.rs',
>                               'tests/rustdoc/edition-flag.rs',
>                               'tests/rustdoc/elided-lifetime.rs',
> -                            'tests/rustdoc/external-macro-src.rs',
>                               'tests/rustdoc/extern-html-root-url.rs',
>                               'tests/rustdoc/extern-impl-trait.rs',
> +                            'tests/rustdoc/external-macro-src.rs',
>                               'tests/rustdoc/hide-unstable-trait.rs',
>                               'tests/rustdoc/inline_cross/add-docs.rs',
>                               'tests/rustdoc/inline_cross/default-trait-method.rs',
> @@ -184,12 +237,10 @@ class RustSelfTestSystemEmulated(OESelftestTestCase, OEPTestResultTestCase):
>                               'tests/rustdoc/issue-75588.rs',
>                               'tests/rustdoc/issue-85454.rs',
>                               'tests/rustdoc/issue-86620.rs',
> -                            'tests/rustdoc-json',
> -                            'tests/rustdoc-js-std',
>                               'tests/rustdoc/macro_pub_in_module.rs',
>                               'tests/rustdoc/masked.rs',
> -                            'tests/rustdoc/normalize-assoc-item.rs',
>                               'tests/rustdoc/no-stack-overflow-25295.rs',
> +                            'tests/rustdoc/normalize-assoc-item.rs',
>                               'tests/rustdoc/primitive-reexport.rs',
>                               'tests/rustdoc/process-termination.rs',
>                               'tests/rustdoc/pub-extern-crate.rs',
> @@ -204,35 +255,8 @@ class RustSelfTestSystemEmulated(OESelftestTestCase, OEPTestResultTestCase):
>                               'tests/rustdoc/test_option_check/test.rs',
>                               'tests/rustdoc/trait-alias-mention.rs',
>                               'tests/rustdoc/trait-visibility.rs',
> -                            'tests/rustdoc-ui/cfg-test.rs',
> -                            'tests/rustdoc-ui/check-cfg-test.rs',
> -                            'tests/rustdoc-ui/display-output.rs',
> -                            'tests/rustdoc-ui/doc-comment-multi-line-attr.rs',
> -                            'tests/rustdoc-ui/doc-comment-multi-line-cfg-attr.rs',
> -                            'tests/rustdoc-ui/doc-test-doctest-feature.rs',
> -                            'tests/rustdoc-ui/doctest-multiline-crate-attribute.rs',
> -                            'tests/rustdoc-ui/doctest-output.rs',
> -                            'tests/rustdoc-ui/doc-test-rustdoc-feature.rs',
> -                            'tests/rustdoc-ui/failed-doctest-compile-fail.rs',
> -                            'tests/rustdoc-ui/issue-80992.rs',
> -                            'tests/rustdoc-ui/issue-91134.rs',
> -                            'tests/rustdoc-ui/nocapture-fail.rs',
> -                            'tests/rustdoc-ui/nocapture.rs',
> -                            'tests/rustdoc-ui/no-run-flag.rs',
> -                            'tests/rustdoc-ui/run-directory.rs',
> -                            'tests/rustdoc-ui/test-no_std.rs',
> -                            'tests/rustdoc-ui/test-type.rs',
>                               'tests/rustdoc/unit-return.rs',
> -                            'tests/ui/abi/stack-probes-lto.rs',
> -                            'tests/ui/abi/stack-probes.rs',
> -                            'tests/ui/array-slice-vec/subslice-patterns-const-eval-match.rs',
> -                            'tests/ui/asm/x86_64/sym.rs',
> -                            'tests/ui/associated-type-bounds/fn-apit.rs',
> -                            'tests/ui/associated-type-bounds/fn-dyn-apit.rs',
> -                            'tests/ui/associated-type-bounds/fn-wrap-apit.rs',
> -                            'tests/ui/debuginfo/debuginfo-emit-llvm-ir-and-split-debuginfo.rs',
> -                            'tests/ui/drop/dynamic-drop.rs',
> -                            'tests/ui/empty_global_asm.rs',
> +                            'tests/ui-fulldeps/',
>                               'tests/ui-fulldeps/deriving-encodable-decodable-box.rs',
>                               'tests/ui-fulldeps/deriving-encodable-decodable-cell-refcell.rs',
>                               'tests/ui-fulldeps/deriving-global.rs',
> @@ -255,9 +279,20 @@ class RustSelfTestSystemEmulated(OESelftestTestCase, OEPTestResultTestCase):
>                               'tests/ui-fulldeps/regions-mock-tcx.rs',
>                               'tests/ui-fulldeps/rustc_encodable_hygiene.rs',
>                               'tests/ui-fulldeps/session-diagnostic/enforce_slug_naming.rs',
> +                            'tests/ui/abi/stack-probes-lto.rs',
> +                            'tests/ui/abi/stack-probes.rs',
> +                            'tests/ui/array-slice-vec/subslice-patterns-const-eval-match.rs',
> +                            'tests/ui/asm/x86_64/sym.rs',
> +                            'tests/ui/associated-type-bounds/fn-apit.rs',
> +                            'tests/ui/associated-type-bounds/fn-dyn-apit.rs',
> +                            'tests/ui/associated-type-bounds/fn-wrap-apit.rs',
> +                            'tests/ui/debuginfo/debuginfo-emit-llvm-ir-and-split-debuginfo.rs',
> +                            'tests/ui/drop/dynamic-drop.rs',
> +                            'tests/ui/empty_global_asm.rs',
>                               'tests/ui/functions-closures/fn-help-with-err.rs',
>                               'tests/ui/linkage-attr/issue-10755.rs',
>                               'tests/ui/macros/restricted-shadowing-legacy.rs',
> +                            'tests/ui/numbers-arithmetic/u128.rs',
>                               'tests/ui/process/nofile-limit.rs',
>                               'tests/ui/process/process-panic-after-fork.rs',
>                               'tests/ui/process/process-sigpipe.rs',
> diff --git a/meta/recipes-devtools/rust/files/target_cfg.patch b/meta/recipes-devtools/rust/files/target_cfg.patch
> new file mode 100644
> index 0000000000..b6a80e004f
> --- /dev/null
> +++ b/meta/recipes-devtools/rust/files/target_cfg.patch
> @@ -0,0 +1,144 @@
> +rust: Fix various failures for Rust Oe-selftest
> +
> +* Ensure cargo executable is fetched
> +
> +* Fix the incorrect target on stage1 ui-fulldeps tests
> +
> +* Enable RUSTC_BOOTSTRAP on panic=abort mir-opt test
> +
> +* Detect user-specified custom targets in compiletest
> +
> +Upstream-Status: Backport [https://github.com/rust-lang/rust/pull/119619/commits]
> +
> +Signed-off-by: Yash Shinde<Yash.Shinde@windriver.com>
> +---
> +diff --git a/src/bootstrap/bootstrap.py b/src/bootstrap/bootstrap.py
> +--- a/src/bootstrap/bootstrap.py
> ++++ b/src/bootstrap/bootstrap.py
> +@@ -954,9 +954,11 @@
> +         if deny_warnings:
> +             env["RUSTFLAGS"] += " -Dwarnings"
> +
> +-        env["PATH"] = os.path.join(self.bin_root(), "bin") + \
> +-            os.pathsep + env["PATH"]
> +-        if not os.path.isfile(self.cargo()):
> ++        cargo_bin_path = os.path.join(self.bin_root(), "bin", "cargo")
> ++        if not os.path.isfile(cargo_bin_path):
> ++            cargo_bin_path = os.getenv("RUST_TARGET_PATH") + "rust-snapshot/bin/cargo"
> ++            env["PATH"] = os.path.dirname(cargo_bin_path) + os.pathsep + env["PATH"]
> ++        else:
> +             raise Exception("no cargo executable found at `{}`".format(
> +                 self.cargo()))
> +         args = [self.cargo(), "build", "--manifest-path",
> +diff --git a/src/bootstrap/test.rs b/src/bootstrap/test.rs
> +--- a/src/bootstrap/test.rs
> ++++ b/src/bootstrap/test.rs
> +@@ -1489,8 +1489,12 @@
> +         // NOTE: Only stage 1 is special cased because we need the rustc_private artifacts to match the
> +         // running compiler in stage 2 when plugins run.
> +         let stage_id = if suite == "ui-fulldeps" && compiler.stage == 1 {
> +-            compiler = builder.compiler(compiler.stage - 1, target);
> +-            format!("stage{}-{}", compiler.stage + 1, target)
> ++            // At stage 0 (stage - 1) we are using the beta compiler. Using `self.target` can lead finding
> ++            // an incorrect compiler path on cross-targets, as the stage 0 beta compiler is always equal
> ++            // to `build.build` in the configuration.
> ++            let build = builder.build.build;
> ++            compiler = builder.compiler(compiler.stage - 1, build);
> ++            format!("stage{}-{}", compiler.stage + 1, build)
> +         } else {
> +             format!("stage{}-{}", compiler.stage, target)
> +         };
> +diff --git a/src/bootstrap/synthetic_targets.rs b/ src/bootstrap/synthetic_targets.rs
> +index d2c65b740da..45baf56f46b 100644
> +--- a/src/bootstrap/synthetic_targets.rs
> ++++ b/src/bootstrap/synthetic_targets.rs
> +@@ -59,6 +59,7 @@ fn create_synthetic_target(
> +     let mut cmd = Command::new(builder.rustc(compiler));
> +     cmd.arg("--target").arg(base.rustc_target_arg());
> +     cmd.args(["-Zunstable-options", "--print", "target-spec-json"]);
> ++    cmd.env("RUSTC_BOOTSTRAP", "1");
> +     cmd.stdout(Stdio::piped());
> +
> +     let output = cmd.spawn().unwrap().wait_with_output().unwrap();
> +diff --git a/src/tools/compiletest/src/common.rs b/src/tools/compiletest/src/common.rs
> +index e85f6319936..c45c0b3c652 100644
> +--- a/src/tools/compiletest/src/common.rs
> ++++ b/src/tools/compiletest/src/common.rs
> +@@ -479,6 +479,7 @@ fn new(config: &Config) -> TargetCfgs {
> +         let mut targets: HashMap<String, TargetCfg> = serde_json::from_str(&rustc_output(
> +             config,
> +             &["--print=all-target-specs-json", "-Zunstable-options"],
> ++            Default::default(),
> +         ))
> +         .unwrap();
> +
> +@@ -491,16 +492,33 @@ fn new(config: &Config) -> TargetCfgs {
> +         let mut all_families = HashSet::new();
> +         let mut all_pointer_widths = HashSet::new();
> +
> +-        // Handle custom target specs, which are not included in `--print=all-target-specs-json`.
> +-        if config.target.ends_with(".json") {
> +-            targets.insert(
> +-                config.target.clone(),
> +-                serde_json::from_str(&rustc_output(
> +-                    config,
> +-                    &["--print=target-spec-json", "-Zunstable-options", "--target", &config.target],
> +-                ))
> +-                .unwrap(),
> +-            );
> ++        // If current target is not included in the `--print=all-target-specs-json` output,
> ++        // we check whether it is a custom target from the user or a synthetic target from bootstrap.
> ++        if !targets.contains_key(&config.target) {
> ++            let mut envs: HashMap<String, String> = HashMap::new();
> ++
> ++            if let Ok(t) = std::env::var("RUST_TARGET_PATH") {
> ++                envs.insert("RUST_TARGET_PATH".into(), t);
> ++            }
> ++
> ++            // This returns false only when the target is neither a synthetic target
> ++            // nor a custom target from the user, indicating it is most likely invalid.
> ++            if config.target.ends_with(".json") || !envs.is_empty() {
> ++                targets.insert(
> ++                    config.target.clone(),
> ++                    serde_json::from_str(&rustc_output(
> ++                        config,
> ++                        &[
> ++                            "--print=target-spec-json",
> ++                            "-Zunstable-options",
> ++                            "--target",
> ++                            &config.target,
> ++                        ],
> ++                        envs,
> ++                    ))
> ++                    .unwrap(),
> ++                );
> ++            }
> +         }
> +
> +         for (target, cfg) in targets.iter() {
> +@@ -545,7 +563,9 @@ fn get_current_target_config(
> +         // code below extracts them from `--print=cfg`: make sure to only override fields that can
> +         // actually be changed with `-C` flags.
> +         for config in
> +-            rustc_output(config, &["--print=cfg", "--target", &config.target]).trim().lines()
> ++            rustc_output(config, &["--print=cfg", "--target", &config.target], Default::default())
> ++                .trim()
> ++                .lines()
> +         {
> +             let (name, value) = config
> +                 .split_once("=\"")
> +@@ -624,11 +644,12 @@ pub enum Endian {
> +     Big,
> + }
> +
> +-fn rustc_output(config: &Config, args: &[&str]) -> String {
> ++fn rustc_output(config: &Config, args: &[&str], envs: HashMap<String, String>) -> String {
> +     let mut command = Command::new(&config.rustc_path);
> +     add_dylib_path(&mut command, iter::once(&config.compile_lib_path));
> +     command.args(&config.target_rustcflags).args(args);
> +     command.env("RUSTC_BOOTSTRAP", "1");
> ++    command.envs(envs);
> +
> +     let output = match command.output() {
> +         Ok(output) => output,
> +
> diff --git a/meta/recipes-devtools/rust/rust-source.inc b/meta/recipes-devtools/rust/rust-source.inc
> index 83a0dbc15f..d9a370ac2f 100644
> --- a/meta/recipes-devtools/rust/rust-source.inc
> +++ b/meta/recipes-devtools/rust/rust-source.inc
> @@ -10,6 +10,7 @@ SRC_URI +="https://static.rust-lang.org/dist/rustc-${RUST_VERSION}-src.tar.xz;n 
> file://0004-musl-Define-O_LARGEFILE-for-riscv32.patch;patchdir=${RUSTSRC} 
> \ 
> file://0005-musl-Define-SOCK_SEQPACKET-in-common-place.patch;patchdir=${RUSTSRC} 
> \ 
> file://0001-Revert-Map-source-absolute-paths-to-OUT_DIR-as-relat.patch;patchdir=${RUSTSRC} 
> \ + file://target_cfg.patch;patchdir=${RUSTSRC} \ "
>   SRC_URI[rust.sha256sum] = "b98c09d968529212fb29eec7d6d3e9bdaa869810679b7fb86a1ca69469d75f5e"
>
Yash Shinde Jan. 19, 2024, 1:16 p.m. UTC | #2
On 19-01-2024 01:38, Randy MacLeod wrote:
> On 2024-01-18 5:57 a.m., Yash.Shinde@windriver.com wrote:
>> From: Yash Shinde<Yash.Shinde@windriver.com>
>>
>> Enable rust oe-selftest for rust 1.74.1 version and
>> add target_cfg.patch to handle target configurations
>> for custom targets.
>
> Hi Yashe,
>
> Yay, getting the rust test suite working again great news!
>
> We talked about this in today's YP bug review and decided NOT to merge 
> this
> until after the M2 build is taken care of over the next few days.
>
> That gives me a chance to review the commit and ask some questions! ;-)
>
> First, your commit log should be expanded to explain what has changed 
> at a high level
> to someone who is just reading "git log".
>
> What you have is a good start but I'd like more info on what changed in:
> meta/lib/oeqa/selftest/cases/rust.py
>
> There are lots of tests added to the exclude list and some seem to 
> have just moved.
>
> Please explain why you did this and if there is any way to avoid the 
> "noise" of moved tests in future updates. Could you also report on the 
> number of newly disabled tests and try to summarize in the commit log 
> what these tests are doing and
>
> Ah, I see what you have done: 1. sort the exclude list 2. add the 
> newly excluded tests. Please do that in separate commits so that it's 
> easier to understand. This will reduce the size of the "Enable rust 
> oe-selftest" diff for meta/lib/oeqa/selftest/cases/rust.py from: | 103 
> ++++++++----- to: | 37 +++-
>
> and let people easily see that most of the newly excluded tests are in 
> tests/codegen
>
> That reminds me, do we really need to list directories in that exclude 
> list or only list .rs files?
>
> If I save the list to /tmp/jj, you can see that we could reduce the 
> list by 34 lines:
>
> ❯ rg "\.rs" /tmp/jj | wc -l 203 ❯ rg -v "\.rs" /tmp/jj | wc -l 34
>
> If we can do that, again do it as a separate commit since it should 
> not affect the outcome of the test.
>
>
> Also this backport link:
> https://github.com/rust-lang/rust/pull/119619/commits
> is actually 3 separate commits so it might be better to apply those 
> individually
> so that we can know when they can be dropped by running:
> $ git tag --contains <commit-id> on each commit
>
> Also in the patches, please add you Signed-Off-By line but keep the 
> upstream author's S-O-B line.
>
>
I will do patch changes to split into separate commits for each issue 
fix, and with oe-selftest changes.

Exclude list is sorted and updated w/ module names, and now the module 
names and test list reduced to 114 lines from 201 lines.

I will send a v2 with updating above changes.

Regards,
Yash

>
> For anyone interested we did talk about the number of Rust tests that 
> we are excluding and of course our goal is to work with the upstream 
> Rust community to reduce the number of excluded tests over the coming 
> months but for now, it's just nice to see the test working again!
>
> If you update these things convince yourself that the changes are 
> functionally identical, I don't think there's any need to re-do all 
> the testing that you have done.
>
> Thanks Yash,
>
> ../Randy
>
>
> -- 
> # Randy MacLeod
> # Wind River Linux
diff mbox series

Patch

diff --git a/meta/lib/oeqa/selftest/cases/rust.py b/meta/lib/oeqa/selftest/cases/rust.py
index 6dbc517006..216c73e5d1 100644
--- a/meta/lib/oeqa/selftest/cases/rust.py
+++ b/meta/lib/oeqa/selftest/cases/rust.py
@@ -40,7 +40,7 @@  def parse_results(filename):
 class RustSelfTestSystemEmulated(OESelftestTestCase, OEPTestResultTestCase):
     def test_rust(self, *args, **kwargs):
         # Disable Rust Oe-selftest
-        self.skipTest("The Rust Oe-selftest is disabled.")
+        #self.skipTest("The Rust Oe-selftest is disabled.")
 
         # build remote-test-server before image build
         recipe = "rust"
@@ -73,38 +73,71 @@  class RustSelfTestSystemEmulated(OESelftestTestCase, OEPTestResultTestCase):
                             'src/librustdoc',
                             'src/rustdoc-json-types',
                             'src/tools/compiletest/src/common.rs',
+                            'src/tools/jsondoclint',
                             'src/tools/lint-docs',
+                            'src/tools/replace-version-placeholder',
                             'src/tools/rust-analyzer',
                             'src/tools/rustdoc-themes',
                             'src/tools/tidy',
                             'tests/assembly/asm/aarch64-outline-atomics.rs',
+                            'tests/codegen/abi-efiapi.rs',
+                            'tests/codegen/abi-efiapi.rs',
                             'tests/codegen/abi-main-signature-32bit-c-int.rs',
                             'tests/codegen/abi-repr-ext.rs',
+                            'tests/codegen/abi-sysv64.rs',
                             'tests/codegen/abi-x86-interrupt.rs',
+                            'tests/codegen/align-byval.rs',
+                            'tests/codegen/align-fn.rs',
+                            'tests/codegen/asm-powerpc-clobbers.rs',
+                            'tests/codegen/async-fn-debug-awaitee-field.rs',
+                            'tests/codegen/binary-search-index-no-bound-check.rs',
                             'tests/codegen/branch-protection.rs',
+                            'tests/codegen/call-metadata.rs',
                             'tests/codegen/catch-unwind.rs',
                             'tests/codegen/cf-protection.rs',
+                            'tests/codegen/debug-column.rs',
+                            'tests/codegen/debug-limited.rs',
+                            'tests/codegen/debuginfo-generic-closure-env-names.rs',
+                            'tests/codegen/drop.rs',
+                            'tests/codegen/dst-vtable-align-nonzero.rs',
+                            'tests/codegen/enable-lto-unit-splitting.rs',
                             'tests/codegen/enum-bounds-check-derived-idx.rs',
+                            'tests/codegen/enum/enum-u128.rs',
+                            'tests/codegen/fn-impl-trait-self.rs',
                             'tests/codegen/force-unwind-tables.rs',
+                            'tests/codegen/inherit_overflow.rs',
+                            'tests/codegen/inherit_overflow.rs',
+                            'tests/codegen/inline-function-args-debug-info.rs',
                             'tests/codegen/intrinsic-no-unnamed-attr.rs',
+                            'tests/codegen/intrinsics/mask.rs',
+                            'tests/codegen/intrinsics/transmute-niched.rs',
                             'tests/codegen/issues/issue-103840.rs',
                             'tests/codegen/issues/issue-47278.rs',
+                            'tests/codegen/issues/issue-73258.rs',
                             'tests/codegen/issues/issue-73827-bounds-check-index-in-subexpr.rs',
+                            'tests/codegen/issues/issue-75546.rs',
+                            'tests/codegen/issues/issue-77812.rs',
+                            'tests/codegen/issues/issue-98156-const-arg-temp-lifetime.rs',
                             'tests/codegen/lifetime_start_end.rs',
+                            'tests/codegen/llvm-ident.rs',
                             'tests/codegen/local-generics-in-exe-internalized.rs',
+                            'tests/codegen/mainsubprogram.rs',
                             'tests/codegen/match-unoptimized.rs',
+                            'tests/codegen/move-operands.rs',
                             'tests/codegen/noalias-rwlockreadguard.rs',
                             'tests/codegen/non-terminate/nonempty-infinite-loop.rs',
                             'tests/codegen/noreturn-uninhabited.rs',
                             'tests/codegen/repr-transparent-aggregates-3.rs',
+                            'tests/codegen/repr/transparent-mips64.rs'
                             'tests/codegen/sse42-implies-crc32.rs',
                             'tests/codegen/thread-local.rs',
                             'tests/codegen/uninit-consts.rs',
+                            'tests/mir-opt/',
                             'tests/pretty/raw-str-nonexpr.rs',
                             'tests/run-make',
+                            'tests/run-make-fulldeps',
                             'tests/run-make/cdylib-fewer-symbols/foo.rs',
                             'tests/run-make/doctests-keep-binaries/t.rs',
-                            'tests/run-make-fulldeps',
                             'tests/run-make/issue-22131/foo.rs',
                             'tests/run-make/issue-36710/Makefile',
                             'tests/run-make/issue-47551',
@@ -119,6 +152,26 @@  class RustSelfTestSystemEmulated(OESelftestTestCase, OEPTestResultTestCase):
                             'tests/run-make/sysroot-crates-are-unstable',
                             'tests/run-make/target-specs',
                             'tests/rustdoc',
+                            'tests/rustdoc-js-std',
+                            'tests/rustdoc-json',
+                            'tests/rustdoc-ui/cfg-test.rs',
+                            'tests/rustdoc-ui/check-cfg-test.rs',
+                            'tests/rustdoc-ui/display-output.rs',
+                            'tests/rustdoc-ui/doc-comment-multi-line-attr.rs',
+                            'tests/rustdoc-ui/doc-comment-multi-line-cfg-attr.rs',
+                            'tests/rustdoc-ui/doc-test-doctest-feature.rs',
+                            'tests/rustdoc-ui/doc-test-rustdoc-feature.rs',
+                            'tests/rustdoc-ui/doctest-multiline-crate-attribute.rs',
+                            'tests/rustdoc-ui/doctest-output.rs',
+                            'tests/rustdoc-ui/failed-doctest-compile-fail.rs',
+                            'tests/rustdoc-ui/issue-80992.rs',
+                            'tests/rustdoc-ui/issue-91134.rs',
+                            'tests/rustdoc-ui/no-run-flag.rs',
+                            'tests/rustdoc-ui/nocapture-fail.rs',
+                            'tests/rustdoc-ui/nocapture.rs',
+                            'tests/rustdoc-ui/run-directory.rs',
+                            'tests/rustdoc-ui/test-no_std.rs',
+                            'tests/rustdoc-ui/test-type.rs',
                             'tests/rustdoc/async-move-doctest.rs',
                             'tests/rustdoc/async-trait.rs',
                             'tests/rustdoc/auto-traits.rs',
@@ -133,9 +186,9 @@  class RustSelfTestSystemEmulated(OESelftestTestCase, OEPTestResultTestCase):
                             'tests/rustdoc/edition-doctest.rs',
                             'tests/rustdoc/edition-flag.rs',
                             'tests/rustdoc/elided-lifetime.rs',
-                            'tests/rustdoc/external-macro-src.rs',
                             'tests/rustdoc/extern-html-root-url.rs',
                             'tests/rustdoc/extern-impl-trait.rs',
+                            'tests/rustdoc/external-macro-src.rs',
                             'tests/rustdoc/hide-unstable-trait.rs',
                             'tests/rustdoc/inline_cross/add-docs.rs',
                             'tests/rustdoc/inline_cross/default-trait-method.rs',
@@ -184,12 +237,10 @@  class RustSelfTestSystemEmulated(OESelftestTestCase, OEPTestResultTestCase):
                             'tests/rustdoc/issue-75588.rs',
                             'tests/rustdoc/issue-85454.rs',
                             'tests/rustdoc/issue-86620.rs',
-                            'tests/rustdoc-json',
-                            'tests/rustdoc-js-std',
                             'tests/rustdoc/macro_pub_in_module.rs',
                             'tests/rustdoc/masked.rs',
-                            'tests/rustdoc/normalize-assoc-item.rs',
                             'tests/rustdoc/no-stack-overflow-25295.rs',
+                            'tests/rustdoc/normalize-assoc-item.rs',
                             'tests/rustdoc/primitive-reexport.rs',
                             'tests/rustdoc/process-termination.rs',
                             'tests/rustdoc/pub-extern-crate.rs',
@@ -204,35 +255,8 @@  class RustSelfTestSystemEmulated(OESelftestTestCase, OEPTestResultTestCase):
                             'tests/rustdoc/test_option_check/test.rs',
                             'tests/rustdoc/trait-alias-mention.rs',
                             'tests/rustdoc/trait-visibility.rs',
-                            'tests/rustdoc-ui/cfg-test.rs',
-                            'tests/rustdoc-ui/check-cfg-test.rs',
-                            'tests/rustdoc-ui/display-output.rs',
-                            'tests/rustdoc-ui/doc-comment-multi-line-attr.rs',
-                            'tests/rustdoc-ui/doc-comment-multi-line-cfg-attr.rs',
-                            'tests/rustdoc-ui/doc-test-doctest-feature.rs',
-                            'tests/rustdoc-ui/doctest-multiline-crate-attribute.rs',
-                            'tests/rustdoc-ui/doctest-output.rs',
-                            'tests/rustdoc-ui/doc-test-rustdoc-feature.rs',
-                            'tests/rustdoc-ui/failed-doctest-compile-fail.rs',
-                            'tests/rustdoc-ui/issue-80992.rs',
-                            'tests/rustdoc-ui/issue-91134.rs',
-                            'tests/rustdoc-ui/nocapture-fail.rs',
-                            'tests/rustdoc-ui/nocapture.rs',
-                            'tests/rustdoc-ui/no-run-flag.rs',
-                            'tests/rustdoc-ui/run-directory.rs',
-                            'tests/rustdoc-ui/test-no_std.rs',
-                            'tests/rustdoc-ui/test-type.rs',
                             'tests/rustdoc/unit-return.rs',
-                            'tests/ui/abi/stack-probes-lto.rs',
-                            'tests/ui/abi/stack-probes.rs',
-                            'tests/ui/array-slice-vec/subslice-patterns-const-eval-match.rs',
-                            'tests/ui/asm/x86_64/sym.rs',
-                            'tests/ui/associated-type-bounds/fn-apit.rs',
-                            'tests/ui/associated-type-bounds/fn-dyn-apit.rs',
-                            'tests/ui/associated-type-bounds/fn-wrap-apit.rs',
-                            'tests/ui/debuginfo/debuginfo-emit-llvm-ir-and-split-debuginfo.rs',
-                            'tests/ui/drop/dynamic-drop.rs',
-                            'tests/ui/empty_global_asm.rs',
+                            'tests/ui-fulldeps/',
                             'tests/ui-fulldeps/deriving-encodable-decodable-box.rs',
                             'tests/ui-fulldeps/deriving-encodable-decodable-cell-refcell.rs',
                             'tests/ui-fulldeps/deriving-global.rs',
@@ -255,9 +279,20 @@  class RustSelfTestSystemEmulated(OESelftestTestCase, OEPTestResultTestCase):
                             'tests/ui-fulldeps/regions-mock-tcx.rs',
                             'tests/ui-fulldeps/rustc_encodable_hygiene.rs',
                             'tests/ui-fulldeps/session-diagnostic/enforce_slug_naming.rs',
+                            'tests/ui/abi/stack-probes-lto.rs',
+                            'tests/ui/abi/stack-probes.rs',
+                            'tests/ui/array-slice-vec/subslice-patterns-const-eval-match.rs',
+                            'tests/ui/asm/x86_64/sym.rs',
+                            'tests/ui/associated-type-bounds/fn-apit.rs',
+                            'tests/ui/associated-type-bounds/fn-dyn-apit.rs',
+                            'tests/ui/associated-type-bounds/fn-wrap-apit.rs',
+                            'tests/ui/debuginfo/debuginfo-emit-llvm-ir-and-split-debuginfo.rs',
+                            'tests/ui/drop/dynamic-drop.rs',
+                            'tests/ui/empty_global_asm.rs',
                             'tests/ui/functions-closures/fn-help-with-err.rs',
                             'tests/ui/linkage-attr/issue-10755.rs',
                             'tests/ui/macros/restricted-shadowing-legacy.rs',
+                            'tests/ui/numbers-arithmetic/u128.rs',
                             'tests/ui/process/nofile-limit.rs',
                             'tests/ui/process/process-panic-after-fork.rs',
                             'tests/ui/process/process-sigpipe.rs',
diff --git a/meta/recipes-devtools/rust/files/target_cfg.patch b/meta/recipes-devtools/rust/files/target_cfg.patch
new file mode 100644
index 0000000000..b6a80e004f
--- /dev/null
+++ b/meta/recipes-devtools/rust/files/target_cfg.patch
@@ -0,0 +1,144 @@ 
+rust: Fix various failures for Rust Oe-selftest
+
+* Ensure cargo executable is fetched
+
+* Fix the incorrect target on stage1 ui-fulldeps tests
+
+* Enable RUSTC_BOOTSTRAP on panic=abort mir-opt test
+
+* Detect user-specified custom targets in compiletest
+
+Upstream-Status: Backport [https://github.com/rust-lang/rust/pull/119619/commits]
+
+Signed-off-by: Yash Shinde <Yash.Shinde@windriver.com>
+---
+diff --git a/src/bootstrap/bootstrap.py b/src/bootstrap/bootstrap.py
+--- a/src/bootstrap/bootstrap.py
++++ b/src/bootstrap/bootstrap.py
+@@ -954,9 +954,11 @@
+         if deny_warnings:
+             env["RUSTFLAGS"] += " -Dwarnings"
+
+-        env["PATH"] = os.path.join(self.bin_root(), "bin") + \
+-            os.pathsep + env["PATH"]
+-        if not os.path.isfile(self.cargo()):
++        cargo_bin_path = os.path.join(self.bin_root(), "bin", "cargo")
++        if not os.path.isfile(cargo_bin_path):
++            cargo_bin_path = os.getenv("RUST_TARGET_PATH") + "rust-snapshot/bin/cargo"
++            env["PATH"] = os.path.dirname(cargo_bin_path) + os.pathsep + env["PATH"]
++        else:
+             raise Exception("no cargo executable found at `{}`".format(
+                 self.cargo()))
+         args = [self.cargo(), "build", "--manifest-path",
+diff --git a/src/bootstrap/test.rs b/src/bootstrap/test.rs
+--- a/src/bootstrap/test.rs
++++ b/src/bootstrap/test.rs
+@@ -1489,8 +1489,12 @@
+         // NOTE: Only stage 1 is special cased because we need the rustc_private artifacts to match the
+         // running compiler in stage 2 when plugins run.
+         let stage_id = if suite == "ui-fulldeps" && compiler.stage == 1 {
+-            compiler = builder.compiler(compiler.stage - 1, target);
+-            format!("stage{}-{}", compiler.stage + 1, target)
++            // At stage 0 (stage - 1) we are using the beta compiler. Using `self.target` can lead finding
++            // an incorrect compiler path on cross-targets, as the stage 0 beta compiler is always equal
++            // to `build.build` in the configuration.
++            let build = builder.build.build;
++            compiler = builder.compiler(compiler.stage - 1, build);
++            format!("stage{}-{}", compiler.stage + 1, build)
+         } else {
+             format!("stage{}-{}", compiler.stage, target)
+         };
+diff --git a/src/bootstrap/synthetic_targets.rs b/ src/bootstrap/synthetic_targets.rs
+index d2c65b740da..45baf56f46b 100644
+--- a/src/bootstrap/synthetic_targets.rs
++++ b/src/bootstrap/synthetic_targets.rs
+@@ -59,6 +59,7 @@ fn create_synthetic_target(
+     let mut cmd = Command::new(builder.rustc(compiler));
+     cmd.arg("--target").arg(base.rustc_target_arg());
+     cmd.args(["-Zunstable-options", "--print", "target-spec-json"]);
++    cmd.env("RUSTC_BOOTSTRAP", "1");
+     cmd.stdout(Stdio::piped());
+
+     let output = cmd.spawn().unwrap().wait_with_output().unwrap();
+diff --git a/src/tools/compiletest/src/common.rs b/src/tools/compiletest/src/common.rs
+index e85f6319936..c45c0b3c652 100644
+--- a/src/tools/compiletest/src/common.rs
++++ b/src/tools/compiletest/src/common.rs
+@@ -479,6 +479,7 @@ fn new(config: &Config) -> TargetCfgs {
+         let mut targets: HashMap<String, TargetCfg> = serde_json::from_str(&rustc_output(
+             config,
+             &["--print=all-target-specs-json", "-Zunstable-options"],
++            Default::default(),
+         ))
+         .unwrap();
+
+@@ -491,16 +492,33 @@ fn new(config: &Config) -> TargetCfgs {
+         let mut all_families = HashSet::new();
+         let mut all_pointer_widths = HashSet::new();
+
+-        // Handle custom target specs, which are not included in `--print=all-target-specs-json`.
+-        if config.target.ends_with(".json") {
+-            targets.insert(
+-                config.target.clone(),
+-                serde_json::from_str(&rustc_output(
+-                    config,
+-                    &["--print=target-spec-json", "-Zunstable-options", "--target", &config.target],
+-                ))
+-                .unwrap(),
+-            );
++        // If current target is not included in the `--print=all-target-specs-json` output,
++        // we check whether it is a custom target from the user or a synthetic target from bootstrap.
++        if !targets.contains_key(&config.target) {
++            let mut envs: HashMap<String, String> = HashMap::new();
++
++            if let Ok(t) = std::env::var("RUST_TARGET_PATH") {
++                envs.insert("RUST_TARGET_PATH".into(), t);
++            }
++
++            // This returns false only when the target is neither a synthetic target
++            // nor a custom target from the user, indicating it is most likely invalid.
++            if config.target.ends_with(".json") || !envs.is_empty() {
++                targets.insert(
++                    config.target.clone(),
++                    serde_json::from_str(&rustc_output(
++                        config,
++                        &[
++                            "--print=target-spec-json",
++                            "-Zunstable-options",
++                            "--target",
++                            &config.target,
++                        ],
++                        envs,
++                    ))
++                    .unwrap(),
++                );
++            }
+         }
+
+         for (target, cfg) in targets.iter() {
+@@ -545,7 +563,9 @@ fn get_current_target_config(
+         // code below extracts them from `--print=cfg`: make sure to only override fields that can
+         // actually be changed with `-C` flags.
+         for config in
+-            rustc_output(config, &["--print=cfg", "--target", &config.target]).trim().lines()
++            rustc_output(config, &["--print=cfg", "--target", &config.target], Default::default())
++                .trim()
++                .lines()
+         {
+             let (name, value) = config
+                 .split_once("=\"")
+@@ -624,11 +644,12 @@ pub enum Endian {
+     Big,
+ }
+
+-fn rustc_output(config: &Config, args: &[&str]) -> String {
++fn rustc_output(config: &Config, args: &[&str], envs: HashMap<String, String>) -> String {
+     let mut command = Command::new(&config.rustc_path);
+     add_dylib_path(&mut command, iter::once(&config.compile_lib_path));
+     command.args(&config.target_rustcflags).args(args);
+     command.env("RUSTC_BOOTSTRAP", "1");
++    command.envs(envs);
+
+     let output = match command.output() {
+         Ok(output) => output,
+
diff --git a/meta/recipes-devtools/rust/rust-source.inc b/meta/recipes-devtools/rust/rust-source.inc
index 83a0dbc15f..d9a370ac2f 100644
--- a/meta/recipes-devtools/rust/rust-source.inc
+++ b/meta/recipes-devtools/rust/rust-source.inc
@@ -10,6 +10,7 @@  SRC_URI += "https://static.rust-lang.org/dist/rustc-${RUST_VERSION}-src.tar.xz;n
             file://0004-musl-Define-O_LARGEFILE-for-riscv32.patch;patchdir=${RUSTSRC} \
             file://0005-musl-Define-SOCK_SEQPACKET-in-common-place.patch;patchdir=${RUSTSRC} \
             file://0001-Revert-Map-source-absolute-paths-to-OUT_DIR-as-relat.patch;patchdir=${RUSTSRC} \
+            file://target_cfg.patch;patchdir=${RUSTSRC} \
 "
 SRC_URI[rust.sha256sum] = "b98c09d968529212fb29eec7d6d3e9bdaa869810679b7fb86a1ca69469d75f5e"