Skip to content

Commit 16e47af

Browse files
committed
make git optional to support offline and packaged builds
Previously the build script unconditionally required `git` to update submodules. This breaks offline builds for vendored workspaces and environments without git installed where the files are already present but `.git` is absent. The new build flow is as follows: - Conditionally run `git submodule` only if the `mavlink` directory is a submodule. - Add an explicit existence check for the `message_definitions/v1.0` directory to provide a clear error message if submodule was omitted. Signed-off-by: Onur Özkan <work@onurozkan.dev>
1 parent 76ef372 commit 16e47af

File tree

1 file changed

+42
-33
lines changed

1 file changed

+42
-33
lines changed

mavlink/build/main.rs

Lines changed: 42 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -9,30 +9,30 @@ use mavlink_bindgen::XmlDefinitions;
99

1010
fn main() -> ExitCode {
1111
let src_dir = Path::new(env!("CARGO_MANIFEST_DIR"));
12+
let mavlink_dir = src_dir.join("mavlink");
1213

13-
// Check if git is installed
14-
if Command::new("git").arg("--version").status().is_err() {
15-
eprintln!("error: Git is not installed or could not be found.");
16-
return ExitCode::FAILURE;
17-
}
18-
19-
// Update and init submodule
20-
if let Err(error) = Command::new("git")
21-
.arg("submodule")
22-
.arg("update")
23-
.arg("--init")
24-
.current_dir(src_dir)
25-
.status()
26-
{
27-
eprintln!("Failed to update MAVLink definitions submodule: {error}");
28-
return ExitCode::FAILURE;
14+
// It is a submodule if it contains `.git` or if it's completely empty (uninitialized)
15+
let is_mavlink_empty = read_dir(&mavlink_dir)
16+
.map(|mut d| d.next().is_none())
17+
.unwrap_or(true);
18+
let is_submodule = mavlink_dir.join(".git").exists() || is_mavlink_empty;
19+
20+
if is_submodule {
21+
if let Err(error) = Command::new("git")
22+
.arg("submodule")
23+
.arg("update")
24+
.arg("--init")
25+
.current_dir(src_dir)
26+
.status()
27+
{
28+
eprintln!("Failed to update MAVLink definitions submodule: {error}");
29+
return ExitCode::FAILURE;
30+
}
2931
}
3032

3133
// find & apply patches to XML definitions to avoid crashes
3234
let patch_dir = src_dir.join("build/patches");
33-
let mavlink_dir = src_dir.join("mavlink");
34-
35-
if let Ok(dir) = read_dir(patch_dir) {
35+
if let Ok(dir) = read_dir(&patch_dir) {
3636
for entry in dir.flatten() {
3737
if let Err(error) = Command::new("git")
3838
.arg("apply")
@@ -46,9 +46,17 @@ fn main() -> ExitCode {
4646
}
4747
}
4848

49-
let out_dir = env::var("OUT_DIR").unwrap();
49+
let source_definitions_dir = mavlink_dir.join("message_definitions/v1.0");
5050

51-
let source_definitions_dir = src_dir.join("mavlink/message_definitions/v1.0");
51+
// Check if the source definitions directory exists
52+
if !source_definitions_dir.is_dir() {
53+
eprintln!(
54+
"MAVLink message definitions directory not found at: {}\n\
55+
Ensure submodules are included.",
56+
source_definitions_dir.display(),
57+
);
58+
return ExitCode::FAILURE;
59+
}
5260

5361
let enabled_dialects: Vec<String> = env::vars()
5462
.filter_map(|(key, _)| {
@@ -59,19 +67,19 @@ fn main() -> ExitCode {
5967

6068
let mut definitions_to_bind = vec![];
6169

62-
if let Ok(dir) = read_dir(&source_definitions_dir) {
63-
for entry in dir.flatten() {
64-
let filename = entry
65-
.path()
66-
.file_stem()
67-
.unwrap()
68-
.to_string_lossy()
69-
.to_lowercase();
70-
71-
if enabled_dialects.contains(&filename) {
72-
definitions_to_bind.push(entry.path());
73-
}
70+
// Check if the expected dialects requested by Cargo features are missing
71+
for dialect in &enabled_dialects {
72+
let dialect_file = source_definitions_dir.join(format!("{dialect}.xml"));
73+
74+
if !dialect_file.is_file() {
75+
eprintln!(
76+
"Expected MAVLink dialect definition not found at: {}",
77+
dialect_file.display(),
78+
);
79+
return ExitCode::FAILURE;
7480
}
81+
82+
definitions_to_bind.push(dialect_file);
7583
}
7684

7785
let xml_definitions = if definitions_to_bind.is_empty() {
@@ -80,6 +88,7 @@ fn main() -> ExitCode {
8088
XmlDefinitions::Files(definitions_to_bind)
8189
};
8290

91+
let out_dir = env::var("OUT_DIR").unwrap();
8392
let result = match mavlink_bindgen::generate(xml_definitions, out_dir) {
8493
Ok(r) => r,
8594
Err(e) => {

0 commit comments

Comments
 (0)