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