@@ -121,11 +121,13 @@ struct PioFileMacroArgs {
121
121
max_program_size : Expr ,
122
122
program : String ,
123
123
program_name : Option < ( String , LitStr ) > ,
124
+ file_path : PathBuf ,
124
125
}
125
126
126
127
impl syn:: parse:: Parse for PioFileMacroArgs {
127
128
fn parse ( stream : syn:: parse:: ParseStream ) -> syn:: parse:: Result < Self > {
128
129
let mut program = String :: new ( ) ;
130
+ let mut file_path = PathBuf :: new ( ) ;
129
131
130
132
// Parse the list of instructions
131
133
if let Ok ( s) = stream. parse :: < LitStr > ( ) {
@@ -152,6 +154,8 @@ impl syn::parse::Parse for PioFileMacroArgs {
152
154
abort ! ( s, "the file '{}' does not exist" , pathbuf. display( ) ) ;
153
155
}
154
156
157
+ file_path = pathbuf. to_owned ( ) ;
158
+
155
159
match fs:: read ( pathbuf) {
156
160
Ok ( content) => match std:: str:: from_utf8 ( & content) {
157
161
Ok ( prog) => program = prog. to_string ( ) ,
@@ -203,6 +207,7 @@ impl syn::parse::Parse for PioFileMacroArgs {
203
207
program_name : select_program. map ( |v| ( v. name , v. ident ) ) ,
204
208
max_program_size,
205
209
program,
210
+ file_path,
206
211
} )
207
212
}
208
213
}
@@ -279,7 +284,17 @@ pub fn pio_file(item: TokenStream) -> TokenStream {
279
284
Err ( e) => return parse_error ( e, & args. program ) . into ( ) ,
280
285
} ;
281
286
282
- to_codegen ( program, args. max_program_size ) . into ( )
287
+ to_codegen (
288
+ program,
289
+ args. max_program_size ,
290
+ Some (
291
+ args. file_path
292
+ . into_os_string ( )
293
+ . into_string ( )
294
+ . expect ( "file path must be valid UTF-8" ) ,
295
+ ) ,
296
+ )
297
+ . into ( )
283
298
}
284
299
285
300
/// A macro which invokes the PIO assembler at compile time.
@@ -295,12 +310,13 @@ pub fn pio_asm(item: TokenStream) -> TokenStream {
295
310
Err ( e) => return parse_error ( e, & args. program ) . into ( ) ,
296
311
} ;
297
312
298
- to_codegen ( program, args. max_program_size ) . into ( )
313
+ to_codegen ( program, args. max_program_size , None ) . into ( )
299
314
}
300
315
301
316
fn to_codegen (
302
317
program : & pio:: ProgramWithDefines < HashMap < String , i32 > , { MAX_PROGRAM_SIZE } > ,
303
318
max_program_size : Expr ,
319
+ file : Option < String > ,
304
320
) -> proc_macro2:: TokenStream {
305
321
let pio:: ProgramWithDefines {
306
322
program,
@@ -381,18 +397,30 @@ fn to_codegen(
381
397
. parse ( )
382
398
. unwrap ( ) ;
383
399
let program_size = max_program_size;
400
+
401
+ // This makes sure the file is added to the list
402
+ // of tracked files, so a change of that file triggers
403
+ // a recompile. Should be replaced by
404
+ // `proc_macro::tracked_path::path` when it is stable.
405
+ let dummy_include = match file {
406
+ Some ( file_path) => quote ! { let _ = include_bytes!( #file_path ) ; } ,
407
+ None => quote ! ( ) ,
408
+ } ;
384
409
quote ! {
385
410
{
386
411
#defines_struct
387
- :: pio:: ProgramWithDefines {
388
- program: :: pio:: Program :: <{ #program_size } > {
389
- code: #code,
390
- origin: #origin,
391
- wrap: #wrap,
392
- side_set: #side_set,
393
- version: #version,
394
- } ,
395
- public_defines: #defines_init,
412
+ {
413
+ #dummy_include;
414
+ :: pio:: ProgramWithDefines {
415
+ program: :: pio:: Program :: <{ #program_size } > {
416
+ code: #code,
417
+ origin: #origin,
418
+ wrap: #wrap,
419
+ side_set: #side_set,
420
+ version: #version,
421
+ } ,
422
+ public_defines: #defines_init,
423
+ }
396
424
}
397
425
}
398
426
}
0 commit comments