Auto merge of #16930 - lnicola:dist-malloc, r=Veykril
internal: Support choosing the allocator in `xtask dist`
This commit is contained in:
commit
9b79fa2393
@ -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>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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"))?;
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -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 you’ll need to install the .vsix manually."
|
Note that installing via xtask install does not work for VS Code Remote, instead you’ll 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...}");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user