1
Fork 0

Support choosing the allocator in xtask dist

This commit is contained in:
Laurențiu Nicola 2024-03-23 11:48:21 +02:00
parent 84d38c7e94
commit f6b9cff105
3 changed files with 55 additions and 19 deletions

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.
@ -106,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>,
} }
@ -215,6 +221,23 @@ impl AsRef<str> for MeasurementType {
} }
} }
#[derive(Clone, Copy, Debug)]
pub(crate) enum Malloc {
System,
Mimalloc,
Jemalloc,
}
impl Malloc {
pub(crate) fn to_features(self) -> &'static [&'static str] {
match self {
Malloc::System => &[][..],
Malloc::Mimalloc => &["--features", "mimalloc"],
Malloc::Jemalloc => &["--features", "jemalloc"],
}
}
}
impl Install { impl Install {
pub(crate) fn server(&self) -> Option<ServerOpt> { pub(crate) fn server(&self) -> Option<ServerOpt> {
if self.client && !self.server { if self.client && !self.server {
@ -236,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...}");