from time import time, sleep
-# Acquire a lock on the build directory to make sure that
-# we don't cause a race condition while building
-# Lock is created in `build_dir/lock.db`
-def acquire_lock(build_dir):
- try:
- import sqlite3
-
- path = os.path.join(build_dir, "lock.db")
- try:
- con = sqlite3.Connection(path, timeout=0)
- curs = con.cursor()
- curs.execute("BEGIN EXCLUSIVE")
- # The lock is released when the cursor is dropped
- return curs
- # If the database is busy then lock has already been acquired
- # so we wait for the lock.
- # We retry every quarter second so that execution is passed back to python
- # so that it can handle signals
- except sqlite3.OperationalError:
- del con
- del curs
- print("Waiting for lock on build directory")
- con = sqlite3.Connection(path, timeout=0.25)
- curs = con.cursor()
- while True:
- try:
- curs.execute("BEGIN EXCLUSIVE")
- break
- except sqlite3.OperationalError:
- pass
- sleep(0.25)
- return curs
- except ImportError:
- print("warning: sqlite3 not available in python, skipping build directory lock")
- print("please file an issue on rust-lang/rust")
- print("this is not a problem for non-concurrent x.py invocations")
- return None
-
def support_xz():
try:
with tempfile.NamedTemporaryFile(delete=False) as temp_file:
"""
return os.path.join(self.build_dir, "bootstrap", "debug", "bootstrap")
- def build_bootstrap(self):
+ def build_bootstrap(self, color):
"""Build bootstrap"""
print("Building rustbuild")
build_dir = os.path.join(self.build_dir, "bootstrap")
if self.get_toml("metrics", "build"):
args.append("--features")
args.append("build-metrics")
+ if color == "always":
+ args.append("--color=always")
+ elif color == "never":
+ args.append("--color=never")
+
run(args, env=env, verbose=self.verbose)
def build_triple(self):
parser = argparse.ArgumentParser(description='Build rust')
parser.add_argument('--config')
+ parser.add_argument('--build-dir')
parser.add_argument('--build')
+ parser.add_argument('--color', choices=['always', 'never', 'auto'])
parser.add_argument('--clean', action='store_true')
parser.add_argument('-v', '--verbose', action='count', default=0)
build.check_vendored_status()
- build_dir = build.get_toml('build-dir', 'build') or 'build'
+ build_dir = args.build_dir or build.get_toml('build-dir', 'build') or 'build'
build.build_dir = os.path.abspath(build_dir)
with open(os.path.join(build.rust_root, "src", "stage0.json")) as f:
build.build = args.build or build.build_triple()
- # Acquire the lock before doing any build actions
- # The lock is released when `lock` is dropped
if not os.path.exists(build.build_dir):
os.makedirs(build.build_dir)
- lock = acquire_lock(build.build_dir)
# Fetch/build the bootstrap
build.download_toolchain()
sys.stdout.flush()
- build.build_bootstrap()
+ build.build_bootstrap(args.color)
sys.stdout.flush()
# Run the bootstrap