Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,10 @@ Per-release detail (objective, shipped capabilities, compatibility, known
limitations) lives in [docs/releases/](docs/releases/); active, incomplete work is
in the [roadmap](docs/roadmap/README.md).

Live downstream release-lane dogfood, sessions, GPU/AI, and broader DCC matrices
are still ahead.
The active **v0.20.0** milestone closes downstream package/product
reproducibility and renderer-workflow findings. DCC host integration is
explicitly deferred to **v0.21.0**; sessions, GPU/AI, and broader DCC matrices
remain ahead.
Linux x86_64 is the first-class target; other OS targets are modeled and
partially working — these examples were exercised on Windows.

Expand Down
44 changes: 30 additions & 14 deletions crates/ost-cli/src/commands/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,7 @@ fn run_resolved(args: BuildArgs, fmt: Format, domain_intent: Option<BuildIntent>
) {
Ok(status) => status,
Err(error) => {
stamp_build_renderer_reports(
let stamp = stamp_build_renderer_reports(
&root,
&build_dir,
&renderer_reports_before,
Expand All @@ -411,12 +411,17 @@ fn run_resolved(args: BuildArgs, fmt: Format, domain_intent: Option<BuildIntent>
None,
ost_manifest::SessionOutcome::Incomplete,
false,
)?;
);
// A timed-out child has already been reaped by the reporter. Clear
// the owning record too, so retry does not inherit a stale lease
// from a failure OST handled deterministically.
lease.release();
stamp?;
return Err(error);
}
};
if !configure_status.success() {
stamp_build_renderer_reports(
let stamp = stamp_build_renderer_reports(
&root,
&build_dir,
&renderer_reports_before,
Expand All @@ -426,14 +431,18 @@ fn run_resolved(args: BuildArgs, fmt: Format, domain_intent: Option<BuildIntent>
Some(crate::commands::renderer::unix_now()),
ost_manifest::SessionOutcome::Failure,
false,
)?;
);
if args.nested {
lease.release();
stamp?;
return Err(Error::external_tool(format!(
"managed CMake configure failed{}",
exit_detail(&configure_status)
))
.with_phase("configure"));
}
lease.release();
stamp?;
rep.exit_unsuccessful(configure_status);
}
rep.phase("Building targets");
Expand All @@ -446,7 +455,7 @@ fn run_resolved(args: BuildArgs, fmt: Format, domain_intent: Option<BuildIntent>
) {
Ok(status) => status,
Err(error) => {
stamp_build_renderer_reports(
let stamp = stamp_build_renderer_reports(
&root,
&build_dir,
&renderer_reports_before,
Expand All @@ -456,12 +465,14 @@ fn run_resolved(args: BuildArgs, fmt: Format, domain_intent: Option<BuildIntent>
None,
ost_manifest::SessionOutcome::Incomplete,
false,
)?;
);
lease.release();
stamp?;
return Err(error);
}
};
if !build_status.success() {
stamp_build_renderer_reports(
let stamp = stamp_build_renderer_reports(
&root,
&build_dir,
&renderer_reports_before,
Expand All @@ -471,22 +482,26 @@ fn run_resolved(args: BuildArgs, fmt: Format, domain_intent: Option<BuildIntent>
Some(crate::commands::renderer::unix_now()),
ost_manifest::SessionOutcome::Failure,
false,
)?;
);
if args.nested {
lease.release();
stamp?;
return Err(Error::external_tool(format!(
"managed CMake build failed{}",
exit_detail(&build_status)
))
.with_phase("build"));
}
lease.release();
stamp?;
rep.exit_unsuccessful(build_status);
}

// 10. Verify the build produced outputs — a successful build with an empty
// tree means the preset built nothing useful.
rep.phase("Verifying outputs");
if let Err(error) = verify_build(&build_dir) {
stamp_build_renderer_reports(
let stamp = stamp_build_renderer_reports(
&root,
&build_dir,
&renderer_reports_before,
Expand All @@ -496,7 +511,9 @@ fn run_resolved(args: BuildArgs, fmt: Format, domain_intent: Option<BuildIntent>
Some(crate::commands::renderer::unix_now()),
ost_manifest::SessionOutcome::Failure,
false,
)?;
);
lease.release();
stamp?;
return Err(error);
}
let completed_unix = crate::commands::renderer::unix_now();
Expand All @@ -513,10 +530,9 @@ fn run_resolved(args: BuildArgs, fmt: Format, domain_intent: Option<BuildIntent>
)?;
write_completion(&root, &id, &relative_build, &intent, lease.invocation())?;

// The completion is published; the target is free for the next writer. On
// any earlier `?` the lease drops instead, which releases the lock without
// clearing the record — leaving the evidence of an interrupted run for the
// next invocation to report as a takeover.
// The completion is published; the target is free for the next writer.
// Handled configure/build failures also clear their record before return;
// only an actually interrupted process leaves takeover evidence behind.
lease.release();

rep.done();
Expand Down
Loading