feat: add write_stamp function and update development environment with libmpc

This commit is contained in:
maksyuki committed 2026-09-23 09:02:41 +08:00
1 parent 448d639d0e
commit 9871ebb9fe
4 files changed
+17 -3

No files matched your search

+4 -2
View File
@@ -11,8 +11,8 @@ remote-bitbang debug acceptance flow. Docker, Nix, and manual Ubuntu installs
provide Java 17 for SBT. Docker and Nix use Python 3.10 to match the provide Java 17 for SBT. Docker and Nix use Python 3.10 to match the
hash-pinned Ubuntu 22.04 requirement sets. The environment also installs the hash-pinned Ubuntu 22.04 requirement sets. The environment also installs the
locked Python build and quality dependencies, clang-format-14, GNU Make, locked Python build and quality dependencies, clang-format-14, GNU Make,
C/C++ build tools, Perl for Verilator, and runtime libraries required by those C/C++ build tools, Perl for Verilator, GNU MPC for the RISC-V compiler, and
binaries. runtime libraries required by those binaries.
The environment intentionally does not include PDK repositories, managed RTL, The environment intentionally does not include PDK repositories, managed RTL,
application archives, build output, or compiler caches. These inputs are application archives, build output, or compiler caches. These inputs are
@@ -37,6 +37,8 @@ dependency lock, selected tool set, or Python requirement hashes change.
Installed public tool archives are made readable and their directories Installed public tool archives are made readable and their directories
traversable by all users. This is required when Docker builds the image as root traversable by all users. This is required when Docker builds the image as root
and runs regressions with the caller's user ID. and runs regressions with the caller's user ID.
The environment stamp and activation script are also world-readable so those
runtime users can verify and activate the root-built environment.
~~~sh ~~~sh
python3 scripts/development_environment.py bootstrap python3 scripts/development_environment.py bootstrap
+1
View File
@@ -61,6 +61,7 @@
gperftools gperftools
launcher launcher
libunwind libunwind
libmpc
mold mold
ncurses5 ncurses5
numactl numactl
+6 -1
View File
@@ -166,6 +166,11 @@ def write_activation(path: Path, content: str) -> None:
path.chmod(0o644) path.chmod(0o644)
def write_stamp(path: Path, content: dict[str, Any]) -> None:
atomic_write(path, json.dumps(content, indent=2, sort_keys=True) + "\n")
path.chmod(0o644)
def run(command: list[str]) -> None: def run(command: list[str]) -> None:
print("+ " + " ".join(shlex.quote(argument) for argument in command), flush=True) print("+ " + " ".join(shlex.quote(argument) for argument in command), flush=True)
subprocess.run(command, check=True) subprocess.run(command, check=True)
@@ -205,7 +210,7 @@ def bootstrap(args: argparse.Namespace) -> int:
for name in tools: for name in tools:
install(name, available[name], cache, update=args.update) install(name, available[name], cache, update=args.update)
create_virtualenv(root, cache) create_virtualenv(root, cache)
atomic_write(cache / STAMP_NAME, json.dumps(expected_stamp, indent=2, sort_keys=True) + "\n") write_stamp(cache / STAMP_NAME, expected_stamp)
activation = args.output.resolve() if args.output else cache / ACTIVATE_NAME activation = args.output.resolve() if args.output else cache / ACTIVATE_NAME
write_activation( write_activation(
activation, activation,
+6
View File
@@ -38,6 +38,7 @@ from scripts.development_environment import ( # noqa: E402
render_activation, render_activation,
stamp_data, stamp_data,
write_activation, write_activation,
write_stamp,
) )
from scripts.generate_mpw import render_active_manifest, validate_extension_bindings # noqa: E402 from scripts.generate_mpw import render_active_manifest, validate_extension_bindings # noqa: E402
from scripts.install_toolchain import make_tree_world_readable, safe_extract # noqa: E402 from scripts.install_toolchain import make_tree_world_readable, safe_extract # noqa: E402
@@ -1183,6 +1184,10 @@ def test_development_environment_contract_is_lock_pinned(tmp_path: Path) -> None
activation_path = tmp_path / "activate.sh" activation_path = tmp_path / "activate.sh"
write_activation(activation_path, activation) write_activation(activation_path, activation)
assert activation_path.stat().st_mode & 0o777 == 0o644 assert activation_path.stat().st_mode & 0o777 == 0o644
stamp_path = tmp_path / "development-environment.json"
write_stamp(stamp_path, stamp)
assert json.loads(stamp_path.read_text(encoding="utf-8")) == stamp
assert stamp_path.stat().st_mode & 0o777 == 0o644
def test_container_and_nix_environment_files_use_locked_inputs() -> None: def test_container_and_nix_environment_files_use_locked_inputs() -> None:
@@ -1198,6 +1203,7 @@ def test_container_and_nix_environment_files_use_locked_inputs() -> None:
assert "scripts/development_environment.py" in flake assert "scripts/development_environment.py" in flake
assert "buildFHSEnv" in flake assert "buildFHSEnv" in flake
assert "jdk17_headless" in flake assert "jdk17_headless" in flake
assert " libmpc\n" in flake
assert " perl\n" in flake assert " perl\n" in flake
assert "python310Full" in flake assert "python310Full" in flake
assert "python3Full" not in flake assert "python3Full" not in flake