diff --git a/xtask/src/install.rs b/xtask/src/install.rs index f0cc445dfa23..b794f53e761e 100644 --- a/xtask/src/install.rs +++ b/xtask/src/install.rs @@ -145,12 +145,12 @@ fn install_server(sh: &Shell, opts: ServerOpt) -> anyhow::Result<()> { ); if let Some(train_crate) = opts.pgo { + let target = detect_target(sh); let build_cmd = cmd!( sh, - "cargo build --manifest-path ./crates/rust-analyzer/Cargo.toml --bin rust-analyzer --profile={profile} --locked --features force-always-assert {features...}" + "cargo build --manifest-path ./crates/rust-analyzer/Cargo.toml --bin rust-analyzer --target {target} --profile={profile} --locked --features force-always-assert {features...}" ); - let target = detect_target(sh); let profile = crate::pgo::gather_pgo_profile(sh, build_cmd, &target, train_crate)?; install_cmd = crate::pgo::apply_pgo_to_cmd(install_cmd, &profile); } diff --git a/xtask/src/pgo.rs b/xtask/src/pgo.rs index 7f7b3311d962..0c6f499811a2 100644 --- a/xtask/src/pgo.rs +++ b/xtask/src/pgo.rs @@ -53,14 +53,23 @@ pub(crate) fn gather_pgo_profile<'a>( // Merge profiles into a single file let merged_profile = pgo_dir.join("merged.profdata"); - let profile_files = std::fs::read_dir(pgo_dir)?.filter_map(|entry| { - let entry = entry.ok()?; - if entry.path().extension() == Some(OsStr::new("profraw")) { - Some(entry.path().to_str().unwrap().to_owned()) - } else { - None - } - }); + let profile_files = std::fs::read_dir(pgo_dir)? + .filter_map(|entry| { + let entry = entry.ok()?; + if entry.path().extension() == Some(OsStr::new("profraw")) { + Some(entry.path().to_str().unwrap().to_owned()) + } else { + None + } + }) + .collect::>(); + + if profile_files.is_empty() { + anyhow::bail!( + "rust-analyzer analysis-stats produced no pgo files. This is a bug in rust-analyzer; please file an issue." + ); + } + cmd!(sh, "{llvm_profdata} merge {profile_files...} -o {merged_profile}").run().context( "cannot merge PGO profiles. Do you have the rustup `llvm-tools` component installed?", )?;