22
22
http://www.st.com/en/embedded-software/stm32cube-embedded-software.html?querycriteria=productId=LN1897
23
23
"""
24
24
25
- import glob
26
25
import os
27
26
import shutil
28
27
import string
29
28
import sys
29
+ import re
30
30
31
- from SCons .Script import DefaultEnvironment
31
+ from SCons .Script import ARGUMENTS , DefaultEnvironment
32
32
33
33
from platformio .builder .tools .piolib import PlatformIOLibBuilder
34
34
@@ -72,25 +72,50 @@ def generate_ldscript(default_ldscript_path):
72
72
fp .write (content )
73
73
74
74
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 ))
81
79
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 : ]
84
82
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 ),
87
88
)
88
89
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
89
110
print (
90
111
"Warning! Cannot find a linker script for the required board! "
91
112
"An auto-generated script will be used to link firmware!"
92
113
)
93
114
115
+ default_ldscript = os .path .join (
116
+ LDSCRIPTS_DIR , board_mcu [0 :7 ], board_mcu [0 :11 ].upper () + "_DEFAULT.ld"
117
+ )
118
+
94
119
if not os .path .isfile (default_ldscript ):
95
120
generate_ldscript (default_ldscript )
96
121
@@ -252,7 +277,7 @@ def process_dsp_lib():
252
277
],
253
278
254
279
LIBPATH = [
255
- os .path .join (FRAMEWORK_DIR , "platformio" , "ldscripts" ),
280
+ os .path .join (LDSCRIPTS_DIR , MCU_FAMILY ),
256
281
],
257
282
258
283
LIBS = ["c" , "gcc" , "m" , "stdc++" , "nosys" ],
@@ -262,7 +287,8 @@ def process_dsp_lib():
262
287
env .Append (ASFLAGS = env .get ("CCFLAGS" , [])[:])
263
288
264
289
if 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" , "" )))
266
292
267
293
#
268
294
# Process BSP components
0 commit comments