Skip to content

Commit

Permalink
Auto merge of rust-lang#16930 - lnicola:dist-malloc, r=Veykril
Browse files Browse the repository at this point in the history
internal: Support choosing the allocator in `xtask dist`
  • Loading branch information
bors committed Mar 25, 2024
2 parents dacfa72 + f6b9cff commit 9b79fa2
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 71 deletions.
1 change: 1 addition & 0 deletions crates/rust-analyzer/src/cli/flags.rs
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,7 @@ pub struct RunTests {
#[derive(Debug)]
pub struct RustcTests {
pub rustc_repo: PathBuf,

pub filter: Option<String>,
}

Expand Down
21 changes: 16 additions & 5 deletions xtask/src/dist.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand All @@ -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)?;
Expand All @@ -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(())
}
Expand Down Expand Up @@ -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");

Expand All @@ -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"))?;
Expand Down
143 changes: 90 additions & 53 deletions xtask/src/flags.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -81,35 +85,6 @@ pub enum XtaskCmd {
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)]
pub struct Install {
pub client: bool,
Expand All @@ -135,6 +110,8 @@ pub struct Promote {

#[derive(Debug)]
pub struct Dist {
pub mimalloc: bool,
pub jemalloc: bool,
pub client_patch_version: Option<String>,
}

Expand All @@ -145,6 +122,65 @@ pub struct PublishReleaseNotes {
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)]
pub enum MeasurementType {
Build,
Expand Down Expand Up @@ -185,33 +221,22 @@ impl AsRef<str> for MeasurementType {
}
}

#[derive(Debug)]
pub struct Metrics {
pub measurement_type: Option<MeasurementType>,
}

#[derive(Debug)]
pub struct Bb {
pub suffix: String,
#[derive(Clone, Copy, Debug)]
pub(crate) enum Malloc {
System,
Mimalloc,
Jemalloc,
}

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)
impl Malloc {
pub(crate) fn to_features(self) -> &'static [&'static str] {
match self {
Malloc::System => &[][..],
Malloc::Mimalloc => &["--features", "mimalloc"],
Malloc::Jemalloc => &["--features", "jemalloc"],
}
}
}
// generated end

impl Install {
pub(crate) fn server(&self) -> Option<ServerOpt> {
Expand All @@ -234,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
}
}
}
16 changes: 3 additions & 13 deletions xtask/src/install.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<()> {
Expand Down Expand Up @@ -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 =
Expand Down Expand Up @@ -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 you’ll need to install the .vsix manually."
);
}
Expand All @@ -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...}");
Expand Down

0 comments on commit 9b79fa2

Please sign in to comment.