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 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_NIGHTLY: &str = "0.4";
@ -22,6 +26,7 @@ impl flags::Dist {
let project_root = project_root();
let target = Target::get(&project_root);
let allocator = self.allocator();
let dist = project_root.join("dist");
sh.remove_path(&dist)?;
sh.create_dir(&dist)?;
@ -33,11 +38,11 @@ impl flags::Dist {
// A hack to make VS Code prefer nightly over stable.
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() };
dist_client(sh, &version, &release_tag, &target)?;
} else {
dist_server(sh, "0.0.0-standalone", &target)?;
dist_server(sh, "0.0.0-standalone", &target, allocator)?;
}
Ok(())
}
@ -73,7 +78,12 @@ fn dist_client(
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("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;
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);
gzip(&target.server_path, &dst.with_extension("gz"))?;

View file

@ -2,7 +2,7 @@
use std::str::FromStr;
use crate::install::{ClientOpt, Malloc, ServerOpt};
use crate::install::{ClientOpt, ServerOpt};
xflags::xflags! {
src "./src/flags.rs"
@ -36,6 +36,10 @@ xflags::xflags! {
optional --dry-run
}
cmd dist {
/// Use mimalloc allocator for server
optional --mimalloc
/// Use jemalloc allocator for server
optional --jemalloc
optional --client-patch-version version: String
}
/// Read a changelog AsciiDoc file and update the GitHub Releases entry in Markdown.
@ -106,6 +110,8 @@ pub struct Promote {
#[derive(Debug)]
pub struct Dist {
pub mimalloc: bool,
pub jemalloc: bool,
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 {
pub(crate) fn server(&self) -> Option<ServerOpt> {
if self.client && !self.server {
@ -236,3 +259,15 @@ impl Install {
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 xshell::{cmd, Shell};
use crate::flags;
use crate::flags::{self, Malloc};
impl flags::Install {
pub(crate) fn run(self, sh: &Shell) -> anyhow::Result<()> {
@ -34,12 +34,6 @@ pub(crate) struct ServerOpt {
pub(crate) dev_rel: bool,
}
pub(crate) enum Malloc {
System,
Mimalloc,
Jemalloc,
}
fn fix_path_for_mac(sh: &Shell) -> anyhow::Result<()> {
let mut vscode_path: Vec<PathBuf> = {
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") {
bail!(
"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."
);
}
@ -131,11 +125,7 @@ fn install_client(sh: &Shell, client_opt: ClientOpt) -> anyhow::Result<()> {
}
fn install_server(sh: &Shell, opts: ServerOpt) -> anyhow::Result<()> {
let features = match opts.malloc {
Malloc::System => &[][..],
Malloc::Mimalloc => &["--features", "mimalloc"],
Malloc::Jemalloc => &["--features", "jemalloc"],
};
let features = opts.malloc.to_features();
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...}");