@@ -410,7 +410,7 @@ def firmware_metrics(target, source, env):
410
410
SIZECHECKCMD = "$SIZETOOL -A -d $SOURCES" ,
411
411
SIZEPRINTCMD = "$SIZETOOL -B -d $SOURCES" ,
412
412
ERASEFLAGS = ["--chip" , mcu , "--port" , '"$UPLOAD_PORT"' ],
413
- ERASECMD = '"$PYTHONEXE" "$OBJCOPY" $ERASEFLAGS erase_flash ' ,
413
+ ERASECMD = '"$PYTHONEXE" "$OBJCOPY" $ERASEFLAGS erase-flash ' ,
414
414
# mkspiffs package contains two different binaries for IDF and Arduino
415
415
MKFSTOOL = "mk%s" % filesystem
416
416
+ (
@@ -459,11 +459,11 @@ def firmware_metrics(target, source, env):
459
459
"--chip" ,
460
460
mcu ,
461
461
"elf2image" ,
462
- "--flash_mode " ,
462
+ "--flash-mode " ,
463
463
"${__get_board_flash_mode(__env__)}" ,
464
- "--flash_freq " ,
464
+ "--flash-freq " ,
465
465
"${__get_board_f_image(__env__)}" ,
466
- "--flash_size " ,
466
+ "--flash-size " ,
467
467
board .get ("upload.flash_size" , "4MB" ),
468
468
"-o" ,
469
469
"$TARGET" ,
@@ -498,7 +498,76 @@ def firmware_metrics(target, source, env):
498
498
if not env .get ("PIOFRAMEWORK" ):
499
499
env .SConscript ("frameworks/_bare.py" , exports = "env" )
500
500
501
- # Build executable and linkable firmware or FS image
501
+ def firmware_metrics (target , source , env ):
502
+ """
503
+ Custom target to run esp-idf-size with support for command line parameters
504
+ Usage: pio run -t metrics -- [esp-idf-size arguments]
505
+ """
506
+ if terminal_cp != "utf-8" :
507
+ print ("Firmware metrics can not be shown. Set the terminal codepage to \" utf-8\" " )
508
+ return
509
+
510
+ map_file = os .path .join (env .subst ("$BUILD_DIR" ), env .subst ("$PROGNAME" ) + ".map" )
511
+ if not os .path .isfile (map_file ):
512
+ # map file can be in project dir
513
+ map_file = os .path .join (get_project_dir (), env .subst ("$PROGNAME" ) + ".map" )
514
+
515
+ if not os .path .isfile (map_file ):
516
+ print (f"Error: Map file not found: { map_file } " )
517
+ print ("Make sure the project is built first with 'pio run'" )
518
+ return
519
+
520
+ try :
521
+ import subprocess
522
+ import sys
523
+ import shlex
524
+
525
+ cmd = [env .subst ("$PYTHONEXE" ), "-m" , "esp_idf_size" , "--ng" ]
526
+
527
+ # Parameters from platformio.ini
528
+ extra_args = env .GetProjectOption ("custom_esp_idf_size_args" , "" )
529
+ if extra_args :
530
+ cmd .extend (shlex .split (extra_args ))
531
+
532
+ # Command Line Parameter, after --
533
+ cli_args = []
534
+ if "--" in sys .argv :
535
+ dash_index = sys .argv .index ("--" )
536
+ if dash_index + 1 < len (sys .argv ):
537
+ cli_args = sys .argv [dash_index + 1 :]
538
+ cmd .extend (cli_args )
539
+
540
+ # Add CLI arguments before the map file
541
+ if cli_args :
542
+ cmd .extend (cli_args )
543
+
544
+ # Map-file as last argument
545
+ cmd .append (map_file )
546
+
547
+ # Debug-Info if wanted
548
+ if env .GetProjectOption ("custom_esp_idf_size_verbose" , False ):
549
+ print (f"Running command: { ' ' .join (cmd )} " )
550
+
551
+ # Call esp-idf-size
552
+ result = subprocess .run (cmd , check = False , capture_output = False )
553
+
554
+ if result .returncode != 0 :
555
+ print (f"Warning: esp-idf-size exited with code { result .returncode } " )
556
+
557
+ except ImportError :
558
+ print ("Error: esp-idf-size module not found." )
559
+ print ("Install with: pip install esp-idf-size" )
560
+ except FileNotFoundError :
561
+ print ("Error: Python executable not found." )
562
+ print ("Check your Python installation." )
563
+ except Exception as e :
564
+ print (f"Error: Failed to run firmware metrics: { e } " )
565
+ print ("Make sure esp-idf-size is installed: pip install esp-idf-size" )
566
+
567
+ #
568
+ # Target: Build executable and linkable firmware or FS image
569
+ #
570
+
502
571
target_elf = None
503
572
if "nobuild" in COMMAND_LINE_TARGETS :
504
573
target_elf = join ("$BUILD_DIR" , "${PROGNAME}.elf" )
@@ -600,16 +669,16 @@ def firmware_metrics(target, source, env):
600
669
"--baud" ,
601
670
"$UPLOAD_SPEED" ,
602
671
"--before" ,
603
- board .get ("upload.before_reset" , "default_reset " ),
672
+ board .get ("upload.before_reset" , "default-reset " ),
604
673
"--after" ,
605
- board .get ("upload.after_reset" , "hard_reset " ),
606
- "write_flash " ,
674
+ board .get ("upload.after_reset" , "hard-reset " ),
675
+ "write-flash " ,
607
676
"-z" ,
608
- "--flash_mode " ,
677
+ "--flash-mode " ,
609
678
"${__get_board_flash_mode(__env__)}" ,
610
- "--flash_freq " ,
679
+ "--flash-freq " ,
611
680
"${__get_board_f_image(__env__)}" ,
612
- "--flash_size " ,
681
+ "--flash-size " ,
613
682
"detect" ,
614
683
],
615
684
UPLOADCMD = '"$PYTHONEXE" "$UPLOADER" $UPLOADERFLAGS '
@@ -628,16 +697,16 @@ def firmware_metrics(target, source, env):
628
697
"--baud" ,
629
698
"$UPLOAD_SPEED" ,
630
699
"--before" ,
631
- board .get ("upload.before_reset" , "default_reset " ),
700
+ board .get ("upload.before_reset" , "default-reset " ),
632
701
"--after" ,
633
- board .get ("upload.after_reset" , "hard_reset " ),
634
- "write_flash " ,
702
+ board .get ("upload.after_reset" , "hard-reset " ),
703
+ "write-flash " ,
635
704
"-z" ,
636
- "--flash_mode " ,
705
+ "--flash-mode " ,
637
706
"${__get_board_flash_mode(__env__)}" ,
638
- "--flash_freq " ,
707
+ "--flash-freq " ,
639
708
"${__get_board_f_image(__env__)}" ,
640
- "--flash_size " ,
709
+ "--flash-size " ,
641
710
"detect" ,
642
711
"$FS_START" ,
643
712
],
0 commit comments