@@ -280,97 +280,56 @@ func (pme *Explorer) ResolveFQBN(fqbn *cores.FQBN) (
280280 return targetPackage , nil , nil , nil , nil ,
281281 fmt .Errorf (tr ("unknown platform %s:%s" ), targetPackage , fqbn .PlatformArch )
282282 }
283- platformRelease := pme .GetInstalledPlatformRelease (platform )
284- if platformRelease == nil {
283+ boardPlatformRelease := pme .GetInstalledPlatformRelease (platform )
284+ if boardPlatformRelease == nil {
285285 return targetPackage , nil , nil , nil , nil ,
286286 fmt .Errorf (tr ("platform %s is not installed" ), platform )
287287 }
288288
289289 // Find board
290- board := platformRelease .Boards [fqbn .BoardID ]
290+ board := boardPlatformRelease .Boards [fqbn .BoardID ]
291291 if board == nil {
292- return targetPackage , platformRelease , nil , nil , nil ,
292+ return targetPackage , boardPlatformRelease , nil , nil , nil ,
293293 fmt .Errorf (tr ("board %s not found" ), fqbn .StringWithoutConfig ())
294294 }
295295
296296 boardBuildProperties , err := board .GetBuildProperties (fqbn .Configs )
297297 if err != nil {
298- return targetPackage , platformRelease , board , nil , nil ,
298+ return targetPackage , boardPlatformRelease , board , nil , nil ,
299299 fmt .Errorf (tr ("getting build properties for board %[1]s: %[2]s" ), board , err )
300300 }
301301
302- // Determine the platform used for the build (in case the board refers
302+ // Determine the platform used for the build and the variant (in case the board refers
303303 // to a core contained in another platform)
304- core := boardBuildProperties .Get ("build.core" )
305- referredCore := ""
306- if split := strings .Split (core , ":" ); len (split ) > 1 {
307- core , referredCore = split [1 ], split [0 ]
308- }
309- variant := boardBuildProperties .Get ("build.variant" )
310- referredVariant := ""
311- if split := strings .Split (variant , ":" ); len (split ) > 1 {
312- variant , referredVariant = split [1 ], split [0 ]
313- }
314- if referredCore != "" && referredVariant != "" && referredCore != referredVariant {
315- return targetPackage , platformRelease , board , nil , nil ,
316- fmt .Errorf (tr ("'build.core' and 'build.variant' refer to different platforms: %[1]s and %[2]s" ), core + ":" + referredCore , variant + ":" + referredVariant )
317- }
318-
319- var referredPlatformRelease * cores.PlatformRelease
320- referredPackageName := referredCore
321- if referredPackageName == "" {
322- referredPackageName = referredVariant
323- }
324- if referredPackageName != "" {
325- referredPackage := pme .packages [referredPackageName ]
326- if referredPackage == nil {
327- return targetPackage , platformRelease , board , nil , nil ,
328- fmt .Errorf (tr ("missing package %[1]s referenced by board %[2]s" ), referredPackageName , fqbn )
329- }
330- referredPlatform := referredPackage .Platforms [fqbn .PlatformArch ]
331- if referredPlatform == nil {
332- return targetPackage , platformRelease , board , nil , nil ,
333- fmt .Errorf (tr ("missing platform %[1]s:%[2]s referenced by board %[3]s" ), referredPackageName , fqbn .PlatformArch , fqbn )
334- }
335- referredPlatformRelease = pme .GetInstalledPlatformRelease (referredPlatform )
336- if referredPlatformRelease == nil {
337- return targetPackage , platformRelease , board , nil , nil ,
338- fmt .Errorf (tr ("missing platform release %[1]s:%[2]s referenced by board %[3]s" ), referredPackageName , fqbn .PlatformArch , fqbn )
339- }
304+ core , corePlatformRelease , variant , variantPlatformRelease , err := pme .determineReferencedPlatformRelease (boardBuildProperties , boardPlatformRelease , fqbn )
305+ if err != nil {
306+ return targetPackage , boardPlatformRelease , board , nil , nil , err
340307 }
341308
342309 // Create the build properties map by overlaying the properties of the
343310 // referenced platform propeties, the board platform properties and the
344311 // board specific properties.
345312 buildProperties := properties .NewMap ()
346- buildPlatformRelease := platformRelease
347- if referredCore != "" {
348- buildPlatformRelease = referredPlatformRelease
349- }
350- buildProperties .Merge (buildPlatformRelease .Properties )
351- buildProperties .Merge (platformRelease .Properties )
313+ buildProperties .Merge (variantPlatformRelease .Properties )
314+ buildProperties .Merge (corePlatformRelease .Properties )
315+ buildProperties .Merge (boardPlatformRelease .Properties )
352316 buildProperties .Merge (boardBuildProperties )
353317
354318 // Add runtime build properties
355- buildProperties .Merge (platformRelease .RuntimeProperties ())
356- buildProperties .SetPath ("build.core.path" , buildPlatformRelease .InstallDir .Join ("cores" , core ))
357- buildProperties .SetPath ("build.system.path" , buildPlatformRelease .InstallDir .Join ("system" ))
358- for _ , tool := range pme .GetAllInstalledToolsReleases () {
359- buildProperties .Merge (tool .RuntimeProperties ())
360- }
361-
319+ buildProperties .Merge (boardPlatformRelease .RuntimeProperties ())
320+ buildProperties .SetPath ("build.core.path" , corePlatformRelease .InstallDir .Join ("cores" , core ))
321+ buildProperties .SetPath ("build.system.path" , corePlatformRelease .InstallDir .Join ("system" ))
362322 buildProperties .Set ("build.variant.path" , "" )
363323 if variant != "" {
364- variantPlatformRelease := platformRelease
365- if referredVariant != "" {
366- variantPlatformRelease = referredPlatformRelease
367- }
368324 buildProperties .SetPath ("build.variant.path" , variantPlatformRelease .InstallDir .Join ("variants" , variant ))
369325 }
370326
371- requiredTools , err := pme .FindToolsRequiredForBuild (platformRelease , buildPlatformRelease )
327+ for _ , tool := range pme .GetAllInstalledToolsReleases () {
328+ buildProperties .Merge (tool .RuntimeProperties ())
329+ }
330+ requiredTools , err := pme .FindToolsRequiredForBuild (boardPlatformRelease , corePlatformRelease )
372331 if err != nil {
373- return targetPackage , platformRelease , board , buildProperties , buildPlatformRelease , err
332+ return targetPackage , boardPlatformRelease , board , buildProperties , corePlatformRelease , err
374333 }
375334 for _ , tool := range requiredTools {
376335 buildProperties .Merge (tool .RuntimeProperties ())
@@ -399,7 +358,63 @@ func (pme *Explorer) ResolveFQBN(fqbn *cores.FQBN) (
399358
400359 buildProperties .Merge (pme .GetCustomGlobalProperties ())
401360
402- return targetPackage , platformRelease , board , buildProperties , buildPlatformRelease , nil
361+ return targetPackage , boardPlatformRelease , board , buildProperties , corePlatformRelease , nil
362+ }
363+
364+ func (pme * Explorer ) determineReferencedPlatformRelease (boardBuildProperties * properties.Map , boardPlatformRelease * cores.PlatformRelease , fqbn * cores.FQBN ) (string , * cores.PlatformRelease , string , * cores.PlatformRelease , error ) {
365+ core := boardBuildProperties .Get ("build.core" )
366+ referredCore := ""
367+ if split := strings .Split (core , ":" ); len (split ) > 1 {
368+ referredCore , core = split [0 ], split [1 ]
369+ }
370+
371+ variant := boardBuildProperties .Get ("build.variant" )
372+ referredVariant := ""
373+ if split := strings .Split (variant , ":" ); len (split ) > 1 {
374+ referredVariant , variant = split [0 ], split [1 ]
375+ }
376+
377+ // core and variant cannot refer to two different platforms
378+ if referredCore != "" && referredVariant != "" && referredCore != referredVariant {
379+ return "" , nil , "" , nil ,
380+ fmt .Errorf (tr ("'build.core' and 'build.variant' refer to different platforms: %[1]s and %[2]s" ), referredCore + ":" + core , referredVariant + ":" + variant )
381+ }
382+
383+ // extract the referred platform
384+ var referredPlatformRelease * cores.PlatformRelease
385+ referredPackageName := referredCore
386+ if referredPackageName == "" {
387+ referredPackageName = referredVariant
388+ }
389+ if referredPackageName != "" {
390+ referredPackage := pme .packages [referredPackageName ]
391+ if referredPackage == nil {
392+ return "" , nil , "" , nil ,
393+ fmt .Errorf (tr ("missing package %[1]s referenced by board %[2]s" ), referredPackageName , fqbn )
394+ }
395+ referredPlatform := referredPackage .Platforms [fqbn .PlatformArch ]
396+ if referredPlatform == nil {
397+ return "" , nil , "" , nil ,
398+ fmt .Errorf (tr ("missing platform %[1]s:%[2]s referenced by board %[3]s" ), referredPackageName , fqbn .PlatformArch , fqbn )
399+ }
400+ referredPlatformRelease = pme .GetInstalledPlatformRelease (referredPlatform )
401+ if referredPlatformRelease == nil {
402+ return "" , nil , "" , nil ,
403+ fmt .Errorf (tr ("missing platform release %[1]s:%[2]s referenced by board %[3]s" ), referredPackageName , fqbn .PlatformArch , fqbn )
404+ }
405+ }
406+
407+ corePlatformRelease := boardPlatformRelease
408+ if referredCore != "" {
409+ corePlatformRelease = referredPlatformRelease
410+ }
411+
412+ variantPlatformRelease := boardPlatformRelease
413+ if referredVariant != "" {
414+ variantPlatformRelease = referredPlatformRelease
415+ }
416+
417+ return core , corePlatformRelease , variant , variantPlatformRelease , nil
403418}
404419
405420// LoadPackageIndex loads a package index by looking up the local cached file from the specified URL
0 commit comments