77# SPDX-License-Identifier: Apache-2.0
88import collections
99import copy
10+ import glob
1011import itertools
1112import json
1213import logging
@@ -436,6 +437,12 @@ def info(what):
436437 sys .stdout .write (what + "\n " )
437438 sys .stdout .flush ()
438439
440+ def find_twister_data (self , board_data_list , board_aliases ):
441+ """Find the twister data for a board in the list of board data based on the aliases"""
442+ for board_data in board_data_list :
443+ if board_data .get ('identifier' ) in board_aliases :
444+ return board_data
445+
439446 def add_configurations (self ):
440447 # Create a list of board roots as defined by the build system in general
441448 # Note, internally in twister a board root includes the `boards` folder
@@ -445,42 +452,52 @@ def add_configurations(self):
445452 board_roots = board_roots , board = None , board_dir = None )
446453
447454 known_boards = list_boards .find_v2_boards (lb_args )
455+ bdirs = {}
448456 platform_config = self .test_config .get ('platforms' , {})
449457
450- alias2target = {}
451- target2board = {}
452- target2data = {}
453- dir2data = {}
454- legacy_files = []
455-
456458 # helper function to initialize and add platforms
457- def init_and_add_platforms (data , board , target , aliases , src_dir ):
459+ def init_and_add_platforms (data , board , target , qualifier , aliases ):
458460 platform = Platform ()
461+ if not new_config_found :
462+ data = self .find_twister_data (bdirs [board .dir ], aliases )
463+ if not data :
464+ return
459465 platform .load (board , target , aliases , data )
466+ platform .qualifier = qualifier
460467 if platform .name in [p .name for p in self .platforms ]:
461- logger .error (f"Duplicate platform { platform .name } in { src_dir } " )
468+ logger .error (f"Duplicate platform { platform .name } in { board . dir } " )
462469 raise Exception (f"Duplicate platform identifier { platform .name } found" )
463470 if not platform .twister :
464471 return
465472 self .platforms .append (platform )
466473
467474 for board in known_boards .values ():
468- for board_dir in board .directories :
469- if board_dir in dir2data :
470- # don't load the same board data twice
471- continue
472- legacy_files .extend (
473- file for file in board_dir .glob ("*.yaml" ) if file .name != "twister.yaml"
474- )
475- data = None
476- file = board_dir / "twister.yaml"
477- if file .is_file ():
475+ new_config_found = False
476+ # don't load the same board data twice
477+ if not bdirs .get (board .dir ):
478+ datas = []
479+ for file in glob .glob (os .path .join (board .dir , "*.yaml" )):
480+ if os .path .basename (file ) == "twister.yaml" :
481+ continue
478482 try :
479- data = scl .yaml_load_verify (file , Platform .platform_schema )
483+ scp = TwisterConfigParser (file , Platform .platform_schema )
484+ sdata = scp .load ()
485+ datas .append (sdata )
480486 except Exception as e :
481487 logger .error (f"Error loading { file } : { e !r} " )
482488 self .load_errors += 1
483- dir2data [board_dir ] = data
489+ continue
490+ bdirs [board .dir ] = datas
491+ data = {}
492+ if os .path .exists (board .dir / 'twister.yaml' ):
493+ try :
494+ scp = TwisterConfigParser (board .dir / 'twister.yaml' , Platform .platform_schema )
495+ data = scp .load ()
496+ except Exception as e :
497+ logger .error (f"Error loading { board .dir / 'twister.yaml' } : { e !r} " )
498+ self .load_errors += 1
499+ continue
500+ new_config_found = True
484501
485502
486503
@@ -490,74 +507,27 @@ def init_and_add_platforms(data, board, target, aliases, src_dir):
490507 for rev in board .revisions :
491508 if rev .name :
492509 target = f"{ board .name } @{ rev .name } /{ qual } "
493- alias2target [ target ] = target
510+ aliases = [ target ]
494511 if rev .name == board .revision_default :
495- alias2target [ f"{ board .name } /{ qual } " ] = target
512+ aliases . append ( f"{ board .name } /{ qual } " )
496513 if '/' not in qual and len (board .socs ) == 1 :
497514 if rev .name == board .revision_default :
498- alias2target [ f"{ board .name } " ] = target
499- alias2target [ f"{ board .name } @{ rev .name } " ] = target
515+ aliases . append ( f"{ board .name } " )
516+ aliases . append ( f"{ board .name } @{ rev .name } " )
500517 else :
501518 target = f"{ board .name } /{ qual } "
502- alias2target [ target ] = target
519+ aliases = [ target ]
503520 if '/' not in qual and len (board .socs ) == 1 \
504521 and rev .name == board .revision_default :
505- alias2target [ f"{ board .name } " ] = target
522+ aliases . append ( f"{ board .name } " )
506523
507- target2board [ target ] = board
524+ init_and_add_platforms ( data , board , target , qual , aliases )
508525 else :
509526 target = f"{ board .name } /{ qual } "
510- alias2target [ target ] = target
527+ aliases = [ target ]
511528 if '/' not in qual and len (board .socs ) == 1 :
512- alias2target [board .name ] = target
513- target2board [target ] = board
514-
515- for board_dir , data in dir2data .items ():
516- if data is None :
517- continue
518- # Separate the default and variant information in the loaded board data.
519- # The default (top-level) data can be shared by multiple board targets;
520- # it will be overlaid by the variant data (if present) for each target.
521- variant_data = data .pop ("variants" , {})
522- for variant in variant_data :
523- target = alias2target .get (variant )
524- if target is None :
525- continue
526- if target in target2data :
527- logger .error (f"Duplicate platform { target } in { board_dir } " )
528- raise Exception (f"Duplicate platform identifier { target } found" )
529- target2data [target ] = variant_data [variant ]
530-
531- # note: this inverse mapping will only be used for loading legacy files
532- target2aliases = {}
533-
534- for target , aliases in itertools .groupby (alias2target , alias2target .get ):
535- aliases = list (aliases )
536- board = target2board [target ]
537-
538- # Default board data always comes from the primary 'board.dir'.
539- # Other 'board.directories' can only supply variant data.
540- data = dir2data [board .dir ]
541- if data is not None :
542- if target in target2data :
543- data = copy .deepcopy (data )
544- data .update (target2data [target ])
545- init_and_add_platforms (data , board , target , aliases , board .dir )
546-
547- target2aliases [target ] = aliases
548-
549- for file in legacy_files :
550- try :
551- data = scl .yaml_load_verify (file , Platform .platform_schema )
552- except Exception as e :
553- logger .error (f"Error loading { file } : { e !r} " )
554- self .load_errors += 1
555- continue
556- target = alias2target .get (data .get ("identifier" ))
557- if target is not None :
558- init_and_add_platforms (
559- data , target2board [target ], target , target2aliases [target ], file .parent
560- )
529+ aliases .append (board .name )
530+ init_and_add_platforms (data , board , target , qual , aliases )
561531
562532 for platform in self .platforms :
563533 if not platform_config .get ('override_default_platforms' , False ):
0 commit comments