-
Notifications
You must be signed in to change notification settings - Fork 631
Expand file tree
/
Copy pathbuild.rs
More file actions
97 lines (82 loc) · 3.34 KB
/
build.rs
File metadata and controls
97 lines (82 loc) · 3.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
// SPDX-License-Identifier: Apache-2.0
use std::env;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// --- Git-derived version ---
// Compute a version from `git describe` for local builds. In Docker/CI
// builds where .git is absent, this silently does nothing and the binary
// falls back to CARGO_PKG_VERSION (which is already sed-patched by the
// build pipeline).
println!("cargo:rerun-if-changed=../../.git/HEAD");
println!("cargo:rerun-if-changed=../../.git/refs/tags");
if let Some(version) = git_version() {
println!("cargo:rustc-env=OPENSHELL_GIT_VERSION={version}");
}
// --- Protobuf compilation ---
// Use bundled protoc from protobuf-src. The system protoc (from apt-get)
// does not bundle the well-known type includes (google/protobuf/struct.proto
// etc.), so we must use protobuf-src which ships both the binary and the
// include tree.
// SAFETY: This is run at build time in a single-threaded build script context.
// No other threads are reading environment variables concurrently.
#[allow(unsafe_code)]
unsafe {
env::set_var("PROTOC", protobuf_src::protoc());
}
let proto_files = [
"../../proto/openshell.proto",
"../../proto/datamodel.proto",
"../../proto/sandbox.proto",
"../../proto/compute_driver.proto",
"../../proto/inference.proto",
"../../proto/test.proto",
];
// Configure tonic-build
tonic_build::configure()
.build_server(true)
.build_client(true)
.compile_protos(&proto_files, &["../../proto"])?;
// Tell cargo to rerun if the proto file changes
for proto_file in proto_files {
println!("cargo:rerun-if-changed={proto_file}");
}
Ok(())
}
/// Derive a version string from `git describe --tags`.
///
/// Implements the "guess-next-dev" convention used by the release pipeline
/// (`setuptools-scm`): when there are commits past the last tag, the patch
/// version is bumped and `-dev.<N>+g<sha>` is appended.
///
/// Examples:
/// on tag v0.0.3 → "0.0.3"
/// 3 commits past v0.0.3 → "0.0.4-dev.3+g2bf9969"
///
/// Returns `None` when git is unavailable or the repo has no matching tags.
fn git_version() -> Option<String> {
let output = std::process::Command::new("git")
.args(["describe", "--tags", "--long", "--match", "v*"])
.output()
.ok()?;
if !output.status.success() {
return None;
}
let desc = String::from_utf8(output.stdout).ok()?;
let desc = desc.trim();
let desc = desc.strip_prefix('v').unwrap_or(desc);
// `git describe --long` format: <tag>-<N>-g<sha>
// Split from the right to handle tags that contain hyphens.
let (rest, sha) = desc.rsplit_once('-')?;
let (tag, commits_str) = rest.rsplit_once('-')?;
let commits: u32 = commits_str.parse().ok()?;
if commits == 0 {
// Exactly on a tag — use the tag version as-is.
return Some(tag.to_string());
}
// Bump patch version (guess-next-dev scheme).
let mut parts = tag.splitn(3, '.');
let major = parts.next()?;
let minor = parts.next()?;
let patch: u32 = parts.next()?.parse().ok()?;
Some(format!("{major}.{minor}.{}-dev.{commits}+{sha}", patch + 1))
}