2222http://www.st.com/en/embedded-software/stm32cube-embedded-software.html?querycriteria=productId=LN1897
2323"""
2424
25- import glob
2625import os
2726import shutil
2827import string
2928import sys
29+ import re
3030
31- from SCons .Script import DefaultEnvironment
31+ from SCons .Script import ARGUMENTS , DefaultEnvironment
3232
3333from platformio .builder .tools .piolib import PlatformIOLibBuilder
3434
@@ -72,25 +72,50 @@ def generate_ldscript(default_ldscript_path):
7272 fp .write (content )
7373
7474
75- def get_linker_script (board_mcu ):
76- ldscript_match = glob .glob (
77- os .path .join (
78- LDSCRIPTS_DIR , board_mcu [0 :7 ], board_mcu [0 :11 ].upper () + "*_FLASH.ld"
79- )
80- )
75+ def get_linker_script (board_mcu , board_cpu ):
76+ def _glob_re (pattern , ldscripts ):
77+ re_c = re .compile (pattern )
78+ return list (filter (re_c .match , ldscripts ))
8179
82- if ldscript_match and os . path . isfile ( ldscript_match [ 0 ]) :
83- return ldscript_match [ 0 ]
80+ if len ( board_mcu ) > 12 :
81+ board_mcu = board_mcu [: 12 ] + "X" + board_mcu [ 13 : ]
8482
85- default_ldscript = os .path .join (
86- LDSCRIPTS_DIR , board_mcu [0 :7 ], board_mcu [0 :11 ].upper () + "_DEFAULT.ld"
83+ family_ldscripts_dir = os .path .join (LDSCRIPTS_DIR , board_mcu [0 :7 ])
84+
85+ ldscript_matches = _glob_re (
86+ "^%s.*_FLASH\\ .ld$" % board_mcu .upper (),
87+ os .listdir (family_ldscripts_dir ),
8788 )
8889
90+ if ldscript_matches :
91+ ldscript_file = ldscript_matches [0 ]
92+ if len (ldscript_matches ) > 1 :
93+ # Precise match with the CPU in filename has the highest priority
94+ board_cpu = board_cpu .replace ("cortex-" , "" ).upper ()
95+ for match in ldscript_matches :
96+ if board_cpu in match :
97+ ldscript_file = match
98+ break
99+
100+ if int (ARGUMENTS .get ("PIOVERBOSE" , 0 )):
101+ print (
102+ "Found suitable linker scripts: ["
103+ + ", " .join (ldscript_matches )
104+ + "], %s will be used!" % ldscript_file
105+ )
106+
107+ return os .path .join (family_ldscripts_dir , ldscript_file )
108+
109+ # Fall back to an auto-generated linker script
89110 print (
90111 "Warning! Cannot find a linker script for the required board! "
91112 "An auto-generated script will be used to link firmware!"
92113 )
93114
115+ default_ldscript = os .path .join (
116+ LDSCRIPTS_DIR , board_mcu [0 :7 ], board_mcu [0 :11 ].upper () + "_DEFAULT.ld"
117+ )
118+
94119 if not os .path .isfile (default_ldscript ):
95120 generate_ldscript (default_ldscript )
96121
@@ -252,7 +277,7 @@ def process_dsp_lib():
252277 ],
253278
254279 LIBPATH = [
255- os .path .join (FRAMEWORK_DIR , "platformio" , "ldscripts" ),
280+ os .path .join (LDSCRIPTS_DIR , MCU_FAMILY ),
256281 ],
257282
258283 LIBS = ["c" , "gcc" , "m" , "stdc++" , "nosys" ],
@@ -262,7 +287,8 @@ def process_dsp_lib():
262287env .Append (ASFLAGS = env .get ("CCFLAGS" , [])[:])
263288
264289if not board .get ("build.ldscript" , "" ):
265- env .Replace (LDSCRIPT_PATH = get_linker_script (board .get ("build.mcu" , "" )))
290+ env .Replace (LDSCRIPT_PATH = get_linker_script (
291+ board .get ("build.mcu" , "" ), board .get ("build.cpu" , "" )))
266292
267293#
268294# Process BSP components
0 commit comments