@@ -9,30 +9,30 @@ use mavlink_bindgen::XmlDefinitions;
99
1010fn 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