55
55
% (
56
56
"riscv32-esp"
57
57
if mcu == "esp32c3"
58
- else ("xtensa-esp32s2" if mcu == "esp32s2" else "xtensa-esp32" )
58
+ else ("xtensa-%s" % mcu )
59
59
)
60
60
)
61
61
62
- # Legacy toolchains for mixed IDF/Arduino projects
63
- if "arduino" in env .subst ("$PIOFRAMEWORK" ):
64
- TOOLCHAIN_DIR = platform .get_package_dir ("toolchain-xtensa32" )
65
-
66
62
assert os .path .isdir (FRAMEWORK_DIR )
67
63
assert os .path .isdir (TOOLCHAIN_DIR )
68
64
69
- # Arduino framework as a component is not compatible with ESP-IDF >=4.1
70
65
if "arduino" in env .subst ("$PIOFRAMEWORK" ):
71
66
ARDUINO_FRAMEWORK_DIR = platform .get_package_dir ("framework-arduinoespressif32" )
72
67
# Possible package names in 'package@version' format is not compatible with CMake
@@ -233,7 +228,13 @@ def populate_idf_env_vars(idf_env):
233
228
234
229
if mcu != "esp32c3" :
235
230
additional_packages .append (
236
- os .path .join (platform .get_package_dir ("toolchain-%sulp" % mcu ), "bin" ),
231
+ os .path .join (
232
+ platform .get_package_dir (
233
+ "toolchain-%sulp"
234
+ % ("esp32s2" if (mcu == "esp32s3" or mcu == "esp32s2" ) else mcu )
235
+ ),
236
+ "bin"
237
+ ),
237
238
)
238
239
239
240
if "windows" in get_systype ():
@@ -341,7 +342,7 @@ def _add_archive(archive_path, link_args):
341
342
if fragment .startswith ("-l" ):
342
343
link_args ["LIBS" ].extend (args )
343
344
elif fragment .startswith ("-L" ):
344
- lib_path = fragment .replace ("-L" , "" ).strip ()
345
+ lib_path = fragment .replace ("-L" , "" ).strip (). strip ( '"' )
345
346
_add_to_libpath (lib_path , link_args )
346
347
elif fragment .startswith ("-" ) and not fragment .startswith ("-l" ):
347
348
# CMake mistakenly marks LINKFLAGS as libraries
@@ -452,20 +453,11 @@ def find_framework_service_files(search_path, sdk_config):
452
453
453
454
result ["lf_files" ].extend (
454
455
[
455
- os .path .join (
456
- FRAMEWORK_DIR ,
457
- "components" ,
458
- idf_variant ,
459
- "ld" ,
460
- "%s_fragments.lf" % idf_variant ,
461
- ),
462
- os .path .join (
463
- FRAMEWORK_DIR ,
464
- "components" ,
465
- idf_variant ,
466
- "linker.lf" ,
467
- ),
456
+ os .path .join (FRAMEWORK_DIR , "components" , "esp_common" , "common.lf" ),
457
+ os .path .join (FRAMEWORK_DIR , "components" , "esp_common" , "soc.lf" ),
458
+ os .path .join (FRAMEWORK_DIR , "components" , "esp_system" , "app.lf" ),
468
459
os .path .join (FRAMEWORK_DIR , "components" , "newlib" , "newlib.lf" ),
460
+ os .path .join (FRAMEWORK_DIR , "components" , "newlib" , "system_libs.lf" ),
469
461
]
470
462
)
471
463
@@ -515,6 +507,46 @@ def generate_project_ld_script(sdk_config, ignore_targets=None):
515
507
libraries_list = create_custom_libraries_list (
516
508
os .path .join (BUILD_DIR , "ldgen_libraries" ), ignore_targets
517
509
)
510
+ # Rework the memory template linker script, following components/esp_system/ld.cmake
511
+ args = {
512
+ "preprocess" : os .path .join (
513
+ TOOLCHAIN_DIR ,
514
+ "bin" ,
515
+ env .subst ("$CC" )),
516
+ "ld_output" : os .path .join ("$BUILD_DIR" , "memory.ld" ),
517
+ "ld_dir" : os .path .join (
518
+ FRAMEWORK_DIR ,
519
+ "components" ,
520
+ "esp_system" ,
521
+ "ld" ),
522
+ "ld_input" : os .path .join (
523
+ FRAMEWORK_DIR ,
524
+ "components" ,
525
+ "esp_system" ,
526
+ "ld" ,
527
+ idf_variant ,
528
+ "memory.ld.in" ,
529
+ ),
530
+ "config" : os .path .join ("$BUILD_DIR" , "config" ),
531
+ "flags" : '-C -P -x c -E -o '
532
+ }
533
+
534
+ cmd = (
535
+ '"{preprocess}" {flags} "{ld_output}" -I "{config}" -I "{ld_dir}" "{ld_input}"'
536
+ ).format (** args )
537
+
538
+ env .Command (
539
+ os .path .join ("$BUILD_DIR" , "memory.ld" ),
540
+ os .path .join (
541
+ FRAMEWORK_DIR ,
542
+ "components" ,
543
+ "esp_system" ,
544
+ "ld" ,
545
+ idf_variant ,
546
+ "memory.ld.in" ,
547
+ ),
548
+ env .VerboseAction (cmd , "Generating memory linker script $TARGET" ),
549
+ )
518
550
519
551
args = {
520
552
"script" : os .path .join (FRAMEWORK_DIR , "tools" , "ldgen" , "ldgen.py" ),
@@ -539,13 +571,14 @@ def generate_project_ld_script(sdk_config, ignore_targets=None):
539
571
).format (** args )
540
572
541
573
return env .Command (
542
- os .path .join ("$BUILD_DIR" , "%s.project. ld" % idf_variant ),
574
+ os .path .join ("$BUILD_DIR" , "sections. ld" ),
543
575
os .path .join (
544
576
FRAMEWORK_DIR ,
545
577
"components" ,
546
- idf_variant ,
578
+ "esp_system" ,
547
579
"ld" ,
548
- "%s.project.ld.in" % idf_variant ,
580
+ idf_variant ,
581
+ "sections.ld.in" ,
549
582
),
550
583
env .VerboseAction (cmd , "Generating project linker script $TARGET" ),
551
584
)
@@ -703,6 +736,20 @@ def find_lib_deps(components_map, elf_config, link_args, ignore_components=None)
703
736
704
737
return result
705
738
739
+ def fix_ld_paths (extra_flags ):
740
+ peripheral_framework_path = os .path .join (FRAMEWORK_DIR , "components" , "soc" , idf_variant , "ld" )
741
+ rom_framework_path = os .path .join (FRAMEWORK_DIR , "components" , "esp_rom" , idf_variant , "ld" )
742
+ bl_framework_path = os .path .join (FRAMEWORK_DIR , "components" , "bootloader" , "subproject" , "main" , "ld" , idf_variant )
743
+
744
+ # ESP linker scripts changed path in ESP-IDF 4.4+, so add missing paths to linker's search path
745
+ try :
746
+ ld_index = extra_flags .index ("%s.peripherals.ld" % idf_variant )
747
+ extra_flags [ld_index - 1 :ld_index - 1 ] = [ "-L" , peripheral_framework_path , "-L" , rom_framework_path , "-L" , bl_framework_path ]
748
+ except :
749
+ print ("Error while parsing the flags" )
750
+
751
+ return extra_flags
752
+
706
753
707
754
def build_bootloader ():
708
755
bootloader_src_dir = os .path .join (
@@ -747,6 +794,7 @@ def build_bootloader():
747
794
build_components (bootloader_env , components_map , bootloader_src_dir , "bootloader" )
748
795
link_args = extract_link_args (elf_config )
749
796
extra_flags = filter_args (link_args ["LINKFLAGS" ], ["-T" , "-u" ])
797
+ extra_flags = fix_ld_paths (extra_flags )
750
798
link_args ["LINKFLAGS" ] = sorted (
751
799
list (set (link_args ["LINKFLAGS" ]) - set (extra_flags ))
752
800
)
@@ -1061,21 +1109,23 @@ def _get_installed_pip_packages():
1061
1109
1062
1110
if not board .get ("build.ldscript" , "" ):
1063
1111
linker_script = env .Command (
1064
- os .path .join ("$BUILD_DIR" , "%s_out .ld" % idf_variant ),
1112
+ os .path .join ("$BUILD_DIR" , "memory .ld" ),
1065
1113
board .get (
1066
1114
"build.esp-idf.ldscript" ,
1067
1115
os .path .join (
1068
- FRAMEWORK_DIR , "components" , idf_variant , "ld" , "%s .ld" % idf_variant
1116
+ FRAMEWORK_DIR , "components" , "esp_system" , "ld" , idf_variant , "memory .ld.in"
1069
1117
),
1070
1118
),
1071
1119
env .VerboseAction (
1072
- '$CC -I"$BUILD_DIR/config" -C -P -x c -E $SOURCE -o $TARGET' ,
1120
+ '$CC -I"$BUILD_DIR/config" -I"' +
1121
+ os .path .join (FRAMEWORK_DIR , "components" , "esp_system" , "ld" ) +
1122
+ '" -C -P -x c -E $SOURCE -o $TARGET' ,
1073
1123
"Generating LD script $TARGET" ,
1074
1124
),
1075
1125
)
1076
1126
1077
1127
env .Depends ("$BUILD_DIR/$PROGNAME$PROGSUFFIX" , linker_script )
1078
- env .Replace (LDSCRIPT_PATH = "%s_out .ld" % idf_variant )
1128
+ env .Replace (LDSCRIPT_PATH = "memory .ld" )
1079
1129
1080
1130
#
1081
1131
# Generate partition table
@@ -1257,13 +1307,15 @@ def _get_installed_pip_packages():
1257
1307
# Extra flags which need to be explicitly specified in LINKFLAGS section because SCons
1258
1308
# cannot merge them correctly
1259
1309
extra_flags = filter_args (link_args ["LINKFLAGS" ], ["-T" , "-u" ])
1310
+ extra_flags = fix_ld_paths (extra_flags )
1260
1311
link_args ["LINKFLAGS" ] = sorted (list (set (link_args ["LINKFLAGS" ]) - set (extra_flags )))
1261
1312
1262
- # remove the main linker script flags '-T esp32_out .ld'
1313
+ # remove the main linker script flags '-T memory .ld' since it already appears later on
1263
1314
try :
1264
- ld_index = extra_flags .index ("%s_out .ld" % idf_variant )
1315
+ ld_index = extra_flags .index ("memory .ld" )
1265
1316
extra_flags .pop (ld_index )
1266
1317
extra_flags .pop (ld_index - 1 )
1318
+ pass
1267
1319
except :
1268
1320
print ("Warning! Couldn't find the main linker script in the CMake code model." )
1269
1321
@@ -1319,7 +1371,7 @@ def _skip_prj_source_files(node):
1319
1371
FLASH_EXTRA_IMAGES = [
1320
1372
(
1321
1373
board .get (
1322
- "upload.bootloader_offset" , "0x0" if mcu == "esp32c3" else "0x1000"
1374
+ "upload.bootloader_offset" , "0x0" if ( mcu == "esp32c3" or mcu == "esp32s3" ) else "0x1000"
1323
1375
),
1324
1376
os .path .join ("$BUILD_DIR" , "bootloader.bin" ),
1325
1377
),
0 commit comments