From df36ec0b7e4b44a9f94d019a1cec43dd1f813e3c Mon Sep 17 00:00:00 2001 From: Joshua Nelson Date: Thu, 7 May 2020 16:51:03 -0400 Subject: [PATCH] x.py: allow configuring the build directory This allows configuring the directory for build artifacts, instead of having it always be ./build. This means you can set it to a constant location, letting you reuse the same cache while working in several different directories. The configuration lives in config.toml under build.build-dir. By default, it keeps the existing default of ./build, but it can be configured to any relative or absolute path. Additionally, it allows making outputs relative to the root of the git repository using $ROOT. --- config.toml.example | 4 ++++ src/bootstrap/bootstrap.py | 11 +++++++++-- src/bootstrap/config.rs | 2 ++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/config.toml.example b/config.toml.example index 9121d1e1799..e32beb1c611 100644 --- a/config.toml.example +++ b/config.toml.example @@ -131,6 +131,10 @@ # for each target triple. #target = ["x86_64-unknown-linux-gnu"] # defaults to just the build triple +# Use this directory to store build artifacts. +# You can use "$ROOT" to indicate the root of the git repository. +#build-dir = "build" + # Instead of downloading the src/stage0.txt version of Cargo specified, use # this Cargo binary instead to build all Rust code #cargo = "/path/to/bin/cargo" diff --git a/src/bootstrap/bootstrap.py b/src/bootstrap/bootstrap.py index 9e56dd3770d..9a91f37c5de 100644 --- a/src/bootstrap/bootstrap.py +++ b/src/bootstrap/bootstrap.py @@ -332,7 +332,7 @@ class RustBuild(object): self.rustc_channel = '' self.rustfmt_channel = '' self.build = '' - self.build_dir = os.path.join(os.getcwd(), "build") + self.build_dir = '' self.clean = False self.config_toml = '' self.rust_root = '' @@ -891,7 +891,11 @@ def bootstrap(help_triggered): build.clean = args.clean try: - with open(args.config or 'config.toml') as config: + toml_path = args.config or 'config.toml' + if not os.path.exists(toml_path): + toml_path = os.path.join(build.rust_root, toml_path) + + with open(toml_path) as config: build.config_toml = config.read() except (OSError, IOError): pass @@ -906,6 +910,9 @@ def bootstrap(help_triggered): build.check_vendored_status() + build_dir = build.get_toml('build-dir', 'build') or 'build' + build.build_dir = os.path.abspath(build_dir.replace("$ROOT", build.rust_root)) + data = stage0_data(build.rust_root) build.date = data['date'] build.rustc_channel = data['rustc'] diff --git a/src/bootstrap/config.rs b/src/bootstrap/config.rs index 133709421a5..390630ee51b 100644 --- a/src/bootstrap/config.rs +++ b/src/bootstrap/config.rs @@ -212,6 +212,8 @@ struct Build { host: Vec, #[serde(default)] target: Vec, + // This is ignored, the rust code always gets the build directory from the `BUILD_DIR` env variable + build_dir: Option, cargo: Option, rustc: Option, rustfmt: Option, /* allow bootstrap.py to use rustfmt key */