Auto merge of #16930 - lnicola:dist-malloc, r=Veykril

internal: Support choosing the allocator in `xtask dist`
This commit is contained in:
bors 2024-03-25 22:01:23 +00:00
commit 9b79fa2393
4 changed files with 110 additions and 71 deletions

View File

@ -235,6 +235,7 @@ pub struct RunTests {
#[derive(Debug)] #[derive(Debug)]
pub struct RustcTests { pub struct RustcTests {
pub rustc_repo: PathBuf, pub rustc_repo: PathBuf,
pub filter: Option<String>, pub filter: Option<String>,
} }

View File

@ -10,7 +10,11 @@ use time::OffsetDateTime;
use xshell::{cmd, Shell}; use xshell::{cmd, Shell};
use zip::{write::FileOptions, DateTime, ZipWriter}; use zip::{write::FileOptions, DateTime, ZipWriter};
use crate::{date_iso, flags, project_root}; use crate::{
date_iso,
flags::{self, Malloc},
project_root,
};
const VERSION_STABLE: &str = "0.3"; const VERSION_STABLE: &str = "0.3";
const VERSION_NIGHTLY: &str = "0.4"; const VERSION_NIGHTLY: &str = "0.4";
@ -22,6 +26,7 @@ impl flags::Dist {
let project_root = project_root(); let project_root = project_root();
let target = Target::get(&project_root); let target = Target::get(&project_root);
let allocator = self.allocator();
let dist = project_root.join("dist"); let dist = project_root.join("dist");
sh.remove_path(&dist)?; sh.remove_path(&dist)?;
sh.create_dir(&dist)?; sh.create_dir(&dist)?;
@ -33,11 +38,11 @@ impl flags::Dist {
// A hack to make VS Code prefer nightly over stable. // A hack to make VS Code prefer nightly over stable.
format!("{VERSION_NIGHTLY}.{patch_version}") format!("{VERSION_NIGHTLY}.{patch_version}")
}; };
dist_server(sh, &format!("{version}-standalone"), &target)?; dist_server(sh, &format!("{version}-standalone"), &target, allocator)?;
let release_tag = if stable { date_iso(sh)? } else { "nightly".to_owned() }; let release_tag = if stable { date_iso(sh)? } else { "nightly".to_owned() };
dist_client(sh, &version, &release_tag, &target)?; dist_client(sh, &version, &release_tag, &target)?;
} else { } else {
dist_server(sh, "0.0.0-standalone", &target)?; dist_server(sh, "0.0.0-standalone", &target, allocator)?;
} }
Ok(()) Ok(())
} }
@ -73,7 +78,12 @@ fn dist_client(
Ok(()) Ok(())
} }
fn dist_server(sh: &Shell, release: &str, target: &Target) -> anyhow::Result<()> { fn dist_server(
sh: &Shell,
release: &str,
target: &Target,
allocator: Malloc,
) -> anyhow::Result<()> {
let _e = sh.push_env("CFG_RELEASE", release); let _e = sh.push_env("CFG_RELEASE", release);
let _e = sh.push_env("CARGO_PROFILE_RELEASE_LTO", "thin"); let _e = sh.push_env("CARGO_PROFILE_RELEASE_LTO", "thin");
@ -87,7 +97,8 @@ fn dist_server(sh: &Shell, release: &str, target: &Target) -> anyhow::Result<()>
} }
let target_name = &target.name; let target_name = &target.name;
cmd!(sh, "cargo build --manifest-path ./crates/rust-analyzer/Cargo.toml --bin rust-analyzer --target {target_name} --release").run()?; let features = allocator.to_features();
cmd!(sh, "cargo build --manifest-path ./crates/rust-analyzer/Cargo.toml --bin rust-analyzer --target {target_name} {features...} --release").run()?;
let dst = Path::new("dist").join(&target.artifact_name); let dst = Path::new("dist").join(&target.artifact_name);
gzip(&target.server_path, &dst.with_extension("gz"))?; gzip(&target.server_path, &dst.with_extension("gz"))?;

View File

@ -2,7 +2,7 @@
use std::str::FromStr; use std::str::FromStr;
use crate::install::{ClientOpt, Malloc, ServerOpt}; use crate::install::{ClientOpt, ServerOpt};
xflags::xflags! { xflags::xflags! {
src "./src/flags.rs" src "./src/flags.rs"
@ -36,6 +36,10 @@ xflags::xflags! {
optional --dry-run optional --dry-run
} }
cmd dist { cmd dist {
/// Use mimalloc allocator for server
optional --mimalloc
/// Use jemalloc allocator for server
optional --jemalloc
optional --client-patch-version version: String optional --client-patch-version version: String
} }
/// Read a changelog AsciiDoc file and update the GitHub Releases entry in Markdown. /// Read a changelog AsciiDoc file and update the GitHub Releases entry in Markdown.
@ -81,35 +85,6 @@ pub enum XtaskCmd {
Codegen(Codegen), Codegen(Codegen),
} }
#[derive(Debug)]
pub struct Codegen {
pub check: bool,
pub codegen_type: Option<CodegenType>,
}
#[derive(Debug, Default)]
pub enum CodegenType {
#[default]
All,
Grammar,
AssistsDocTests,
DiagnosticsDocs,
LintDefinitions,
}
impl FromStr for CodegenType {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"all" => Ok(Self::All),
"grammar" => Ok(Self::Grammar),
"assists-doc-tests" => Ok(Self::AssistsDocTests),
"diagnostics-docs" => Ok(Self::DiagnosticsDocs),
"lints-definitions" => Ok(Self::LintDefinitions),
_ => Err("Invalid option".to_owned()),
}
}
}
#[derive(Debug)] #[derive(Debug)]
pub struct Install { pub struct Install {
pub client: bool, pub client: bool,
@ -135,6 +110,8 @@ pub struct Promote {
#[derive(Debug)] #[derive(Debug)]
pub struct Dist { pub struct Dist {
pub mimalloc: bool,
pub jemalloc: bool,
pub client_patch_version: Option<String>, pub client_patch_version: Option<String>,
} }
@ -145,6 +122,65 @@ pub struct PublishReleaseNotes {
pub dry_run: bool, pub dry_run: bool,
} }
#[derive(Debug)]
pub struct Metrics {
pub measurement_type: Option<MeasurementType>,
}
#[derive(Debug)]
pub struct Bb {
pub suffix: String,
}
#[derive(Debug)]
pub struct Codegen {
pub codegen_type: Option<CodegenType>,
pub check: bool,
}
impl Xtask {
#[allow(dead_code)]
pub fn from_env_or_exit() -> Self {
Self::from_env_or_exit_()
}
#[allow(dead_code)]
pub fn from_env() -> xflags::Result<Self> {
Self::from_env_()
}
#[allow(dead_code)]
pub fn from_vec(args: Vec<std::ffi::OsString>) -> xflags::Result<Self> {
Self::from_vec_(args)
}
}
// generated end
#[derive(Debug, Default)]
pub enum CodegenType {
#[default]
All,
Grammar,
AssistsDocTests,
DiagnosticsDocs,
LintDefinitions,
}
impl FromStr for CodegenType {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"all" => Ok(Self::All),
"grammar" => Ok(Self::Grammar),
"assists-doc-tests" => Ok(Self::AssistsDocTests),
"diagnostics-docs" => Ok(Self::DiagnosticsDocs),
"lints-definitions" => Ok(Self::LintDefinitions),
_ => Err("Invalid option".to_owned()),
}
}
}
#[derive(Debug)] #[derive(Debug)]
pub enum MeasurementType { pub enum MeasurementType {
Build, Build,
@ -185,33 +221,22 @@ impl AsRef<str> for MeasurementType {
} }
} }
#[derive(Debug)] #[derive(Clone, Copy, Debug)]
pub struct Metrics { pub(crate) enum Malloc {
pub measurement_type: Option<MeasurementType>, System,
Mimalloc,
Jemalloc,
} }
#[derive(Debug)] impl Malloc {
pub struct Bb { pub(crate) fn to_features(self) -> &'static [&'static str] {
pub suffix: String, match self {
} Malloc::System => &[][..],
Malloc::Mimalloc => &["--features", "mimalloc"],
impl Xtask { Malloc::Jemalloc => &["--features", "jemalloc"],
#[allow(dead_code)] }
pub fn from_env_or_exit() -> Self {
Self::from_env_or_exit_()
}
#[allow(dead_code)]
pub fn from_env() -> xflags::Result<Self> {
Self::from_env_()
}
#[allow(dead_code)]
pub fn from_vec(args: Vec<std::ffi::OsString>) -> xflags::Result<Self> {
Self::from_vec_(args)
} }
} }
// generated end
impl Install { impl Install {
pub(crate) fn server(&self) -> Option<ServerOpt> { pub(crate) fn server(&self) -> Option<ServerOpt> {
@ -234,3 +259,15 @@ impl Install {
Some(ClientOpt { code_bin: self.code_bin.clone() }) Some(ClientOpt { code_bin: self.code_bin.clone() })
} }
} }
impl Dist {
pub(crate) fn allocator(&self) -> Malloc {
if self.mimalloc {
Malloc::Mimalloc
} else if self.jemalloc {
Malloc::Jemalloc
} else {
Malloc::System
}
}
}

View File

@ -5,7 +5,7 @@ use std::{env, path::PathBuf, str};
use anyhow::{bail, format_err, Context}; use anyhow::{bail, format_err, Context};
use xshell::{cmd, Shell}; use xshell::{cmd, Shell};
use crate::flags; use crate::flags::{self, Malloc};
impl flags::Install { impl flags::Install {
pub(crate) fn run(self, sh: &Shell) -> anyhow::Result<()> { pub(crate) fn run(self, sh: &Shell) -> anyhow::Result<()> {
@ -34,12 +34,6 @@ pub(crate) struct ServerOpt {
pub(crate) dev_rel: bool, pub(crate) dev_rel: bool,
} }
pub(crate) enum Malloc {
System,
Mimalloc,
Jemalloc,
}
fn fix_path_for_mac(sh: &Shell) -> anyhow::Result<()> { fn fix_path_for_mac(sh: &Shell) -> anyhow::Result<()> {
let mut vscode_path: Vec<PathBuf> = { let mut vscode_path: Vec<PathBuf> = {
const COMMON_APP_PATH: &str = const COMMON_APP_PATH: &str =
@ -122,7 +116,7 @@ fn install_client(sh: &Shell, client_opt: ClientOpt) -> anyhow::Result<()> {
if !installed_extensions.contains("rust-analyzer") { if !installed_extensions.contains("rust-analyzer") {
bail!( bail!(
"Could not install the Visual Studio Code extension. \ "Could not install the Visual Studio Code extension. \
Please make sure you have at least NodeJS 12.x together with the latest version of VS Code installed and try again. \ Please make sure you have at least NodeJS 16.x together with the latest version of VS Code installed and try again. \
Note that installing via xtask install does not work for VS Code Remote, instead youll need to install the .vsix manually." Note that installing via xtask install does not work for VS Code Remote, instead youll need to install the .vsix manually."
); );
} }
@ -131,11 +125,7 @@ fn install_client(sh: &Shell, client_opt: ClientOpt) -> anyhow::Result<()> {
} }
fn install_server(sh: &Shell, opts: ServerOpt) -> anyhow::Result<()> { fn install_server(sh: &Shell, opts: ServerOpt) -> anyhow::Result<()> {
let features = match opts.malloc { let features = opts.malloc.to_features();
Malloc::System => &[][..],
Malloc::Mimalloc => &["--features", "mimalloc"],
Malloc::Jemalloc => &["--features", "jemalloc"],
};
let profile = if opts.dev_rel { "dev-rel" } else { "release" }; let profile = if opts.dev_rel { "dev-rel" } else { "release" };
let cmd = cmd!(sh, "cargo install --path crates/rust-analyzer --profile={profile} --locked --force --features force-always-assert {features...}"); let cmd = cmd!(sh, "cargo install --path crates/rust-analyzer --profile={profile} --locked --force --features force-always-assert {features...}");