Skip to content

Commit 3b73fc1

Browse files
authored
Create inner workspace for rust guests to reduce compile time (#1501)
Signed-off-by: Ludvig Liljenberg <4257730+ludfjig@users.noreply.github.com>
1 parent 5886c47 commit 3b73fc1

14 files changed

Lines changed: 103 additions & 1354 deletions

File tree

.github/dependabot.yml

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,7 @@ updates:
1616
- "kind/dependencies"
1717
open-pull-requests-limit: 20
1818
- package-ecosystem: "cargo"
19-
directory: "/src/tests/rust_guests/dummyguest"
20-
schedule:
21-
interval: "daily"
22-
time: "03:00"
23-
labels:
24-
- "kind/dependencies"
25-
- "area/guest"
26-
open-pull-requests-limit: 5
27-
- package-ecosystem: "cargo"
28-
directory: "/src/tests/rust_guests/simpleguest"
29-
schedule:
30-
interval: "daily"
31-
time: "03:00"
32-
labels:
33-
- "kind/dependencies"
34-
- "area/guest"
35-
open-pull-requests-limit: 5
36-
- package-ecosystem: "cargo"
37-
directory: "/src/tests/rust_guests/witguest"
19+
directory: "/src/tests/rust_guests"
3820
schedule:
3921
interval: "daily"
4022
time: "03:00"

.github/workflows/RustNightly.yml

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,7 @@ jobs:
6161
uses: actions/cache@v5
6262
with:
6363
path: |
64-
src/tests/rust_guests/simpleguest/target/sysroot
65-
src/tests/rust_guests/dummyguest/target/sysroot
66-
src/tests/rust_guests/witguest/target/sysroot
64+
src/tests/rust_guests/target/sysroot
6765
key: sysroot-linux-${{ matrix.config }}-${{ hashFiles('rust-toolchain.toml') }}
6866

6967
- name: Rust cache
@@ -73,9 +71,7 @@ jobs:
7371
cache-on-failure: "true"
7472
workspaces: |
7573
. -> target
76-
src/tests/rust_guests/simpleguest -> target
77-
src/tests/rust_guests/dummyguest -> target
78-
src/tests/rust_guests/witguest -> target
74+
src/tests/rust_guests -> target
7975
8076
- name: Install cargo-hyperlight
8177
run: cargo install cargo-hyperlight --version 0.1.10 --locked --force

.github/workflows/ValidatePullRequest.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ jobs:
4141
return all_file_count === docs_file_count;
4242
result-encoding: string
4343

44-
# Update guest Cargo.lock files for Dependabot PRs.
45-
# Dependabot only updates the root Cargo.lock, leaving the guest crate
46-
# Cargo.lock files stale. This job updates them before code-checks runs
44+
# Update guest Cargo.lock for Dependabot PRs.
45+
# Dependabot only updates the root Cargo.lock, leaving the guest workspace
46+
# Cargo.lock stale. This job updates it before code-checks runs
4747
# `cargo fetch --locked` so that the first CI run succeeds.
4848
update-guest-locks:
4949
if: github.event.pull_request.user.login == 'dependabot[bot]'

.github/workflows/dep_build_guests.yml

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,7 @@ jobs:
5151
uses: actions/cache@v5
5252
with:
5353
path: |
54-
src/tests/rust_guests/simpleguest/target/sysroot
55-
src/tests/rust_guests/dummyguest/target/sysroot
56-
src/tests/rust_guests/witguest/target/sysroot
54+
src/tests/rust_guests/target/sysroot
5755
key: sysroot-linux-${{ inputs.config }}-${{ hashFiles('rust-toolchain.toml') }}
5856

5957
- name: Rust cache
@@ -66,9 +64,7 @@ jobs:
6664
save-if: ${{ github.ref == 'refs/heads/main' }}
6765
workspaces: |
6866
. -> target
69-
src/tests/rust_guests/simpleguest -> target
70-
src/tests/rust_guests/dummyguest -> target
71-
src/tests/rust_guests/witguest -> target
67+
src/tests/rust_guests -> target
7268
7369
- name: Install cargo-hyperlight
7470
run: cargo install cargo-hyperlight --version 0.1.10 --locked --force

.github/workflows/dep_code_checks.yml

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,7 @@ jobs:
4747
uses: actions/cache@v5
4848
with:
4949
path: |
50-
src/tests/rust_guests/simpleguest/target/sysroot
51-
src/tests/rust_guests/dummyguest/target/sysroot
52-
src/tests/rust_guests/witguest/target/sysroot
50+
src/tests/rust_guests/target/sysroot
5351
key: sysroot-linux-${{ hashFiles('rust-toolchain.toml') }}
5452

5553
- name: Rust cache
@@ -62,16 +60,12 @@ jobs:
6260
save-if: ${{ github.ref == 'refs/heads/main' }}
6361
workspaces: |
6462
. -> target
65-
src/tests/rust_guests/simpleguest -> target
66-
src/tests/rust_guests/dummyguest -> target
67-
src/tests/rust_guests/witguest -> target
63+
src/tests/rust_guests -> target
6864
6965
- name: Ensure up-to-date Cargo.lock
7066
run: |
7167
cargo fetch --locked
72-
cargo fetch --manifest-path src/tests/rust_guests/simpleguest/Cargo.toml --locked
73-
cargo fetch --manifest-path src/tests/rust_guests/dummyguest/Cargo.toml --locked
74-
cargo fetch --manifest-path src/tests/rust_guests/witguest/Cargo.toml --locked
68+
cargo fetch --manifest-path src/tests/rust_guests/Cargo.toml --locked
7569
7670
- name: fmt
7771
run: just fmt-check
@@ -121,9 +115,7 @@ jobs:
121115
uses: actions/cache@v5
122116
with:
123117
path: |
124-
src/tests/rust_guests/simpleguest/target/sysroot
125-
src/tests/rust_guests/dummyguest/target/sysroot
126-
src/tests/rust_guests/witguest/target/sysroot
118+
src/tests/rust_guests/target/sysroot
127119
key: sysroot-windows-${{ hashFiles('rust-toolchain.toml') }}
128120

129121
- name: Rust cache
@@ -136,16 +128,12 @@ jobs:
136128
save-if: ${{ github.ref == 'refs/heads/main' }}
137129
workspaces: |
138130
. -> target
139-
src/tests/rust_guests/simpleguest -> target
140-
src/tests/rust_guests/dummyguest -> target
141-
src/tests/rust_guests/witguest -> target
131+
src/tests/rust_guests -> target
142132
143133
- name: Ensure up-to-date Cargo.lock
144134
run: |
145135
cargo fetch --locked
146-
cargo fetch --manifest-path src/tests/rust_guests/simpleguest/Cargo.toml --locked
147-
cargo fetch --manifest-path src/tests/rust_guests/dummyguest/Cargo.toml --locked
148-
cargo fetch --manifest-path src/tests/rust_guests/witguest/Cargo.toml --locked
136+
cargo fetch --manifest-path src/tests/rust_guests/Cargo.toml --locked
149137
150138
- name: fmt
151139
run: just fmt-check

.github/workflows/dep_update_guest_locks.yml

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
22

3-
# This reusable workflow updates the Cargo.lock files in guest crates when
3+
# This reusable workflow updates the guest workspace Cargo.lock when
44
# Dependabot updates dependencies. Without this, Dependabot PRs only update the
5-
# root Cargo.lock, leaving the guest crate Cargo.lock files stale.
5+
# root Cargo.lock, leaving the guest workspace Cargo.lock stale.
66
#
77
# See: https://docs.github.com/en/code-security/tutorials/secure-your-dependencies/automating-dependabot-with-github-actions
88

@@ -55,16 +55,8 @@ jobs:
5555
run: |
5656
sudo chown -R $(id -u):$(id -g) /opt/cargo || true
5757
58-
- name: Update simpleguest Cargo.lock
59-
working-directory: src/tests/rust_guests/simpleguest
60-
run: cargo fetch
61-
62-
- name: Update dummyguest Cargo.lock
63-
working-directory: src/tests/rust_guests/dummyguest
64-
run: cargo fetch
65-
66-
- name: Update witguest Cargo.lock
67-
working-directory: src/tests/rust_guests/witguest
58+
- name: Update guest Cargo.lock
59+
working-directory: src/tests/rust_guests
6860
run: cargo fetch
6961

7062
# Commits created via the Git Data API are automatically signed/verified
@@ -88,13 +80,13 @@ jobs:
8880
run: |
8981
set -euo pipefail
9082
91-
# Check if there are any changes to the guest Cargo.lock files
92-
if git diff --quiet -- src/tests/rust_guests/*/Cargo.lock; then
93-
echo "No changes to guest Cargo.lock files"
83+
# Check if there are any changes to the guest Cargo.lock file
84+
if git diff --quiet -- src/tests/rust_guests/Cargo.lock; then
85+
echo "No changes to guest Cargo.lock file"
9486
exit 0
9587
fi
9688
97-
echo "Guest Cargo.lock files have changed, committing via API..."
89+
echo "Guest Cargo.lock file has changed, committing via API..."
9890
9991
# Get app identity for DCO sign-off trailer
10092
# Use the app-slug output from create-github-app-token (the /app API
@@ -110,7 +102,7 @@ jobs:
110102
# The tree API accepts "content" directly and creates blobs for us,
111103
# avoiding the need for separate blob creation API calls.
112104
TREE_JSON="[]"
113-
for file in $(git diff --name-only -- src/tests/rust_guests/*/Cargo.lock); do
105+
for file in $(git diff --name-only -- src/tests/rust_guests/Cargo.lock); do
114106
TREE_JSON=$(jq \
115107
--arg path "$file" \
116108
--arg content "$(cat "$file")" \
@@ -128,7 +120,7 @@ jobs:
128120
# Build commit message with DCO sign-off
129121
SIGNOFF="${app_slug}[bot] <${app_user_id}+${app_slug}[bot]@users.noreply.github.com>"
130122
COMMIT_MSG=$(printf '%s\n\n%s\n%s\n\n%s' \
131-
"chore: update guest Cargo.lock files" \
123+
"chore: update guest Cargo.lock file" \
132124
"Automatically updated by dependabot-update-guest-locks workflow." \
133125
"Triggered by: ${PR_TITLE}" \
134126
"Signed-off-by: ${SIGNOFF}")

Cargo.toml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,10 @@ members = [
2020
"src/hyperlight_component_macro",
2121
"src/trace_dump",
2222
]
23-
# Guests have custom linker flags, so we need to exclude them from the workspace
23+
# Guests have custom linker flags and live in their own nested workspace,
24+
# so we exclude the whole directory from the host workspace.
2425
exclude = [
25-
"src/tests/rust_guests/dummyguest",
26-
"src/tests/rust_guests/simpleguest",
27-
"src/tests/rust_guests/witguest",
26+
"src/tests/rust_guests",
2827
]
2928

3029
[workspace.package]

Justfile

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,13 @@ export CROSS_CONTAINER_GID := if path_exists("/dev/kvm") == "true" { kvm-gid } e
2424
root := justfile_directory()
2525

2626
default-target := "debug"
27-
simpleguest_source := "src/tests/rust_guests/simpleguest/target/x86_64-hyperlight-none"
28-
dummyguest_source := "src/tests/rust_guests/dummyguest/target/x86_64-hyperlight-none"
29-
witguest_source := "src/tests/rust_guests/witguest/target/x86_64-hyperlight-none"
27+
# All three guest crates share one workspace under src/tests/rust_guests,
28+
# so they share one target dir and hyperlight-libc / hyperlight-guest-bin
29+
# get compiled once per profile instead of once per crate.
30+
rust_guests_target := "src/tests/rust_guests/target/x86_64-hyperlight-none"
31+
simpleguest_source := rust_guests_target
32+
dummyguest_source := rust_guests_target
33+
witguest_source := rust_guests_target
3034
rust_guests_bin_dir := "src/tests/rust_guests/bin"
3135

3236
################
@@ -52,9 +56,10 @@ witguest-wit:
5256
cd src/tests/rust_guests/witguest && wasm-tools component wit two_worlds.wit -w -o twoworlds.wasm
5357

5458
build-rust-guests target=default-target features="": (witguest-wit) (ensure-cargo-hyperlight)
55-
cd src/tests/rust_guests/simpleguest && cargo hyperlight build {{ if features =="" {''} else if features=="no-default-features" {"--no-default-features" } else {"--no-default-features -F " + features } }} --profile={{ if target == "debug" { "dev" } else { target } }}
56-
cd src/tests/rust_guests/dummyguest && cargo hyperlight build {{ if features =="" {''} else if features=="no-default-features" {"--no-default-features" } else {"--no-default-features -F " + features } }} --profile={{ if target == "debug" { "dev" } else { target } }}
57-
cd src/tests/rust_guests/witguest && cargo hyperlight build {{ if features =="" {''} else if features=="no-default-features" {"--no-default-features" } else {"--no-default-features -F " + features } }} --profile={{ if target == "debug" { "dev" } else { target } }}
59+
@# --workspace unifies feature resolution so shared deps build once. Needed because witguest
60+
@# pulls bindgen via hyperlight-component-macro, which would otherwise turn on extra features
61+
@# on libc's build.rs host deps and force a libc rebuild. simple/dummyguest don't hit this.
62+
cd src/tests/rust_guests && cargo hyperlight build --workspace {{ if features =="" {''} else if features=="no-default-features" {"--no-default-features" } else {"--no-default-features -F " + features } }} --profile={{ if target == "debug" { "dev" } else { target } }}
5863

5964
@move-rust-guests target=default-target:
6065
cp {{ simpleguest_source }}/{{ target }}/simpleguest* {{ rust_guests_bin_dir }}/{{ target }}/
@@ -68,9 +73,7 @@ clean: clean-rust
6873

6974
clean-rust:
7075
cargo clean
71-
cd src/tests/rust_guests/simpleguest && cargo clean
72-
cd src/tests/rust_guests/dummyguest && cargo clean
73-
{{ if os() == "windows" { "cd src/tests/rust_guests/witguest -ErrorAction SilentlyContinue; cargo clean" } else { "[ -d src/tests/rust_guests/witguest ] && cd src/tests/rust_guests/witguest && cargo clean || true" } }}
76+
cd src/tests/rust_guests && cargo clean
7477
{{ if os() == "windows" { "Remove-Item src/tests/rust_guests/witguest/interface.wasm -Force -ErrorAction SilentlyContinue" } else { "rm -f src/tests/rust_guests/witguest/interface.wasm" } }}
7578
git clean -fdx src/tests/c_guests/bin src/tests/rust_guests/bin
7679

@@ -106,9 +109,7 @@ test-like-ci config=default-target hypervisor="kvm":
106109
code-checks-like-ci config=default-target hypervisor="kvm":
107110
@# Ensure up-to-date Cargo.lock
108111
cargo fetch --locked
109-
cargo fetch --manifest-path src/tests/rust_guests/simpleguest/Cargo.toml --locked
110-
cargo fetch --manifest-path src/tests/rust_guests/dummyguest/Cargo.toml --locked
111-
cargo fetch --manifest-path src/tests/rust_guests/witguest/Cargo.toml --locked
112+
cargo fetch --manifest-path src/tests/rust_guests/Cargo.toml --locked
112113

113114
@# fmt
114115
just fmt-check
@@ -297,9 +298,7 @@ check:
297298

298299
fmt-check: (ensure-nightly-fmt)
299300
cargo +{{nightly-toolchain}} fmt --all -- --check
300-
cargo +{{nightly-toolchain}} fmt --manifest-path src/tests/rust_guests/simpleguest/Cargo.toml -- --check
301-
cargo +{{nightly-toolchain}} fmt --manifest-path src/tests/rust_guests/dummyguest/Cargo.toml -- --check
302-
cargo +{{nightly-toolchain}} fmt --manifest-path src/tests/rust_guests/witguest/Cargo.toml -- --check
301+
cargo +{{nightly-toolchain}} fmt --manifest-path src/tests/rust_guests/Cargo.toml --all -- --check
303302
cargo +{{nightly-toolchain}} fmt --manifest-path src/hyperlight_guest_capi/Cargo.toml -- --check
304303

305304
[private]
@@ -311,9 +310,7 @@ check-license-headers:
311310

312311
fmt-apply: (ensure-nightly-fmt)
313312
cargo +{{nightly-toolchain}} fmt --all
314-
cargo +{{nightly-toolchain}} fmt --manifest-path src/tests/rust_guests/simpleguest/Cargo.toml
315-
cargo +{{nightly-toolchain}} fmt --manifest-path src/tests/rust_guests/dummyguest/Cargo.toml
316-
cargo +{{nightly-toolchain}} fmt --manifest-path src/tests/rust_guests/witguest/Cargo.toml
313+
cargo +{{nightly-toolchain}} fmt --manifest-path src/tests/rust_guests/Cargo.toml --all
317314
cargo +{{nightly-toolchain}} fmt --manifest-path src/hyperlight_guest_capi/Cargo.toml
318315

319316
clippy target=default-target: (witguest-wit)
@@ -324,8 +321,7 @@ clippyw target=default-target: (witguest-wit)
324321
{{ cargo-cmd }} clippy --all-targets --all-features --target x86_64-pc-windows-gnu --profile={{ if target == "debug" { "dev" } else { target } }} -- -D warnings
325322

326323
clippy-guests target=default-target: (witguest-wit) (ensure-cargo-hyperlight)
327-
cd src/tests/rust_guests/simpleguest && cargo hyperlight clippy --profile={{ if target == "debug" { "dev" } else { target } }} -- -D warnings
328-
cd src/tests/rust_guests/witguest && cargo hyperlight clippy --profile={{ if target == "debug" { "dev" } else { target } }} -- -D warnings
324+
cd src/tests/rust_guests && cargo hyperlight clippy --workspace --profile={{ if target == "debug" { "dev" } else { target } }} -- -D warnings
329325

330326
clippy-apply-fix-unix:
331327
cargo clippy --fix --all

dev/check-license-headers.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ MISSING_FILES=""
3434
# Find all Rust files, excluding target directory
3535
while IFS= read -r -d $'\0' file; do
3636
# Skip some files which appear when the guests are build
37-
if grep -q '^src/tests/rust_guests/[^/]*/target/' <<< "$file"; then
37+
if grep -q '^src/tests/rust_guests/target/' <<< "$file"; then
3838
continue
3939
fi
4040

flake.nix

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,7 @@
114114

115115
manifests = [
116116
"Cargo.toml"
117-
"src/tests/rust_guests/dummyguest/Cargo.toml"
118-
"src/tests/rust_guests/simpleguest/Cargo.toml"
119-
"src/tests/rust_guests/witguest/Cargo.toml"
117+
"src/tests/rust_guests/Cargo.toml"
120118
];
121119
manifestDeps = builtins.map (manifest:
122120
let lockPath = builtins.replaceStrings [ "toml" ] [ "lock" ] manifest; in

0 commit comments

Comments
 (0)