@@ -118,23 +118,8 @@ func runProgramAction(pm *packagemanager.PackageManager,
118
118
WithField ("buildPlatform" , buildPlatform ).
119
119
Tracef ("Upload data" )
120
120
121
- // Load upload tool definitions
122
- var uploadToolName string
123
- var uploadToolPlatform * cores.PlatformRelease
121
+ // Extract programmer properties (when specified)
124
122
var programmer * cores.Programmer
125
-
126
- if burnBootloader {
127
- uploadToolName = boardProperties .Get ("bootloader.tool" )
128
- uploadToolPlatform = boardPlatform
129
- if uploadToolName == "" {
130
- return fmt .Errorf ("cannot get programmer tool: undefined 'bootloader.tool' in boards.txt" )
131
- }
132
- logrus .
133
- WithField ("uploadToolName" , uploadToolName ).
134
- WithField ("uploadToolPlatform" , uploadToolPlatform ).
135
- Trace ("Upload tool from 'bootloader.tool' property" )
136
- }
137
-
138
123
if programmerID != "" {
139
124
programmer = boardPlatform .Programmers [programmerID ]
140
125
if programmer == nil {
@@ -144,36 +129,54 @@ func runProgramAction(pm *packagemanager.PackageManager,
144
129
if programmer == nil {
145
130
return fmt .Errorf ("programmer '%s' not available" , programmerID )
146
131
}
147
- uploadToolName = programmer .Properties .Get ("program.tool" )
148
- uploadToolPlatform = programmer .PlatformRelease
149
- if uploadToolName == "" {
150
- return fmt .Errorf ("cannot get programmer tool: undefined 'program.tool' property" )
132
+ }
133
+
134
+ // Determine upload tool
135
+ var uploadToolID string
136
+ {
137
+ toolProperty := "upload.tool"
138
+ if burnBootloader {
139
+ toolProperty = "bootloader.tool"
140
+ } else if programmer != nil {
141
+ toolProperty = "program.tool"
142
+ }
143
+
144
+ // create a temporary configuration only for the selection of upload tool
145
+ props := properties .NewMap ()
146
+ props .Merge (boardPlatform .Properties )
147
+ props .Merge (boardPlatform .RuntimeProperties ())
148
+ props .Merge (boardProperties )
149
+ if programmer != nil {
150
+ props .Merge (programmer .Properties )
151
+ }
152
+ if t , ok := props .GetOk (toolProperty ); ok {
153
+ uploadToolID = t
154
+ } else {
155
+ return fmt .Errorf ("cannot get programmer tool: undefined '%s' property" , toolProperty )
151
156
}
152
- logrus .
153
- WithField ("uploadToolName" , uploadToolName ).
154
- WithField ("uploadToolPlatform" , uploadToolPlatform ).
155
- Trace ("Upload tool from --programmer parameter" )
157
+ }
158
+
159
+ var uploadToolPlatform * cores.PlatformRelease
160
+ if programmer != nil {
161
+ uploadToolPlatform = programmer .PlatformRelease
156
162
} else {
157
- uploadToolName = boardProperties .Get ("upload.tool" )
158
163
uploadToolPlatform = boardPlatform
159
- if uploadToolName == "" {
160
- return fmt .Errorf ("cannot get upload tool: undefined 'upload.tool' property" )
161
- }
162
- if split := strings .Split (uploadToolName , ":" ); len (split ) > 2 {
163
- return fmt .Errorf ("invalid 'upload.tool' property: %s" , uploadToolName )
164
- } else if len (split ) == 2 {
165
- uploadToolName = split [1 ]
166
- uploadToolPlatform = pm .GetInstalledPlatformRelease (
167
- pm .FindPlatform (& packagemanager.PlatformReference {
168
- Package : split [0 ],
169
- PlatformArchitecture : boardPlatform .Platform .Architecture ,
170
- }),
171
- )
172
- }
173
- logrus .
174
- WithField ("uploadToolName" , uploadToolName ).
175
- WithField ("uploadToolPlatform" , uploadToolPlatform ).
176
- Trace ("Upload tool" )
164
+ }
165
+ logrus .
166
+ WithField ("uploadToolID" , uploadToolID ).
167
+ WithField ("uploadToolPlatform" , uploadToolPlatform ).
168
+ Trace ("Upload tool" )
169
+
170
+ if split := strings .Split (uploadToolID , ":" ); len (split ) > 2 {
171
+ return fmt .Errorf ("invalid 'upload.tool' property: %s" , uploadToolID )
172
+ } else if len (split ) == 2 {
173
+ uploadToolID = split [1 ]
174
+ uploadToolPlatform = pm .GetInstalledPlatformRelease (
175
+ pm .FindPlatform (& packagemanager.PlatformReference {
176
+ Package : split [0 ],
177
+ PlatformArchitecture : boardPlatform .Platform .Architecture ,
178
+ }),
179
+ )
177
180
}
178
181
179
182
// Build configuration for upload
@@ -184,9 +187,7 @@ func runProgramAction(pm *packagemanager.PackageManager,
184
187
uploadProperties .Merge (boardPlatform .Properties )
185
188
uploadProperties .Merge (boardPlatform .RuntimeProperties ())
186
189
uploadProperties .Merge (boardProperties )
187
-
188
- uploadToolProperties := uploadProperties .SubTree ("tools." + uploadToolName )
189
- uploadProperties .Merge (uploadToolProperties )
190
+ uploadProperties .Merge (uploadProperties .SubTree ("tools." + uploadToolID ))
190
191
if programmer != nil {
191
192
uploadProperties .Merge (programmer .Properties )
192
193
}
@@ -324,7 +325,7 @@ func runProgramAction(pm *packagemanager.PackageManager,
324
325
}
325
326
}
326
327
327
- // Build recipe for upload
328
+ // Run recipes for upload
328
329
if burnBootloader {
329
330
if err := runTool ("erase.pattern" , uploadProperties , outStream , errStream , verbose ); err != nil {
330
331
return fmt .Errorf ("chip erase error: %s" , err )
0 commit comments