mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-31 03:03:46 +01:00 
			
		
		
		
	BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1875 1. Separate the AutoGen.py into 3 small py files. One is for AutoGen base class, one is for WorkspaceAutoGen class and PlatformAutoGen class, and the one for ModuleAutoGen class. 2. Create a new class DataPipe to store the Platform scope settings. Create a new class PlatformInfo to provide the same interface as PlatformAutoGen. PlatformInfo class is initialized by DataPipe instance. Create a new class WorkspaceInfo to provide the same interface as WorkspaceAutoGen. WorkspaceInfo class is initialized by DataPipe instance. 3. Change ModuleAutoGen to depends on DataPipe, PlatformInfo and WorkspaceInfo. Remove the dependency of ModuleAutoGen to PlatformAutoGen. Cc: Liming Gao <liming.gao@intel.com> Cc: Steven Shi <steven.shi@intel.com> Signed-off-by: Bob Feng <bob.c.feng@intel.com> Acked-by: Laszlo Ersek <lersek@redhat.com> Tested-by: Laszlo Ersek <lersek@redhat.com> Acked-by: Liming Gao <liming.gao@intel.com>
		
			
				
	
	
		
			114 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| ## @file
 | |
| # Generate AutoGen.h, AutoGen.c and *.depex files
 | |
| #
 | |
| # Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.<BR>
 | |
| # Copyright (c) 2018, Hewlett Packard Enterprise Development, L.P.<BR>
 | |
| # Copyright (c) 2019, American Megatrends, Inc. All rights reserved.<BR>
 | |
| #
 | |
| # SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| #
 | |
| 
 | |
| ## Import Modules
 | |
| #
 | |
| from __future__ import print_function
 | |
| from __future__ import absolute_import
 | |
| from Common.DataType import TAB_STAR
 | |
| ## Base class for AutoGen
 | |
| #
 | |
| #   This class just implements the cache mechanism of AutoGen objects.
 | |
| #
 | |
| class AutoGen(object):
 | |
|     # database to maintain the objects in each child class
 | |
|     __ObjectCache = {}    # (BuildTarget, ToolChain, ARCH, platform file): AutoGen object
 | |
| 
 | |
|     ## Factory method
 | |
|     #
 | |
|     #   @param  Class           class object of real AutoGen class
 | |
|     #                           (WorkspaceAutoGen, ModuleAutoGen or PlatformAutoGen)
 | |
|     #   @param  Workspace       Workspace directory or WorkspaceAutoGen object
 | |
|     #   @param  MetaFile        The path of meta file
 | |
|     #   @param  Target          Build target
 | |
|     #   @param  Toolchain       Tool chain name
 | |
|     #   @param  Arch            Target arch
 | |
|     #   @param  *args           The specific class related parameters
 | |
|     #   @param  **kwargs        The specific class related dict parameters
 | |
|     #
 | |
| 
 | |
|     def __new__(cls, Workspace, MetaFile, Target, Toolchain, Arch, *args, **kwargs):
 | |
|         # check if the object has been created
 | |
|         Key = (Target, Toolchain, Arch, MetaFile)
 | |
|         if Key in cls.__ObjectCache:
 | |
|             # if it exists, just return it directly
 | |
|             return cls.__ObjectCache[Key]
 | |
|             # it didnt exist. create it, cache it, then return it
 | |
|         RetVal = cls.__ObjectCache[Key] = super(AutoGen, cls).__new__(cls)
 | |
|         return RetVal
 | |
| 
 | |
| 
 | |
|     ## hash() operator
 | |
|     #
 | |
|     #  The file path of platform file will be used to represent hash value of this object
 | |
|     #
 | |
|     #   @retval int     Hash value of the file path of platform file
 | |
|     #
 | |
|     def __hash__(self):
 | |
|         return hash(self.MetaFile)
 | |
| 
 | |
|     ## str() operator
 | |
|     #
 | |
|     #  The file path of platform file will be used to represent this object
 | |
|     #
 | |
|     #   @retval string  String of platform file path
 | |
|     #
 | |
|     def __str__(self):
 | |
|         return str(self.MetaFile)
 | |
| 
 | |
|     ## "==" operator
 | |
|     def __eq__(self, Other):
 | |
|         return Other and self.MetaFile == Other
 | |
| 
 | |
|     @classmethod
 | |
|     def Cache(cls):
 | |
|         return cls.__ObjectCache
 | |
| 
 | |
| #
 | |
| # The priority list while override build option
 | |
| #
 | |
| PrioList = {"0x11111"  : 16,     #  TARGET_TOOLCHAIN_ARCH_COMMANDTYPE_ATTRIBUTE (Highest)
 | |
|             "0x01111"  : 15,     #  ******_TOOLCHAIN_ARCH_COMMANDTYPE_ATTRIBUTE
 | |
|             "0x10111"  : 14,     #  TARGET_*********_ARCH_COMMANDTYPE_ATTRIBUTE
 | |
|             "0x00111"  : 13,     #  ******_*********_ARCH_COMMANDTYPE_ATTRIBUTE
 | |
|             "0x11011"  : 12,     #  TARGET_TOOLCHAIN_****_COMMANDTYPE_ATTRIBUTE
 | |
|             "0x01011"  : 11,     #  ******_TOOLCHAIN_****_COMMANDTYPE_ATTRIBUTE
 | |
|             "0x10011"  : 10,     #  TARGET_*********_****_COMMANDTYPE_ATTRIBUTE
 | |
|             "0x00011"  : 9,      #  ******_*********_****_COMMANDTYPE_ATTRIBUTE
 | |
|             "0x11101"  : 8,      #  TARGET_TOOLCHAIN_ARCH_***********_ATTRIBUTE
 | |
|             "0x01101"  : 7,      #  ******_TOOLCHAIN_ARCH_***********_ATTRIBUTE
 | |
|             "0x10101"  : 6,      #  TARGET_*********_ARCH_***********_ATTRIBUTE
 | |
|             "0x00101"  : 5,      #  ******_*********_ARCH_***********_ATTRIBUTE
 | |
|             "0x11001"  : 4,      #  TARGET_TOOLCHAIN_****_***********_ATTRIBUTE
 | |
|             "0x01001"  : 3,      #  ******_TOOLCHAIN_****_***********_ATTRIBUTE
 | |
|             "0x10001"  : 2,      #  TARGET_*********_****_***********_ATTRIBUTE
 | |
|             "0x00001"  : 1}      #  ******_*********_****_***********_ATTRIBUTE (Lowest)
 | |
| ## Calculate the priority value of the build option
 | |
| #
 | |
| # @param    Key    Build option definition contain: TARGET_TOOLCHAIN_ARCH_COMMANDTYPE_ATTRIBUTE
 | |
| #
 | |
| # @retval   Value  Priority value based on the priority list.
 | |
| #
 | |
| def CalculatePriorityValue(Key):
 | |
|     Target, ToolChain, Arch, CommandType, Attr = Key.split('_')
 | |
|     PriorityValue = 0x11111
 | |
|     if Target == TAB_STAR:
 | |
|         PriorityValue &= 0x01111
 | |
|     if ToolChain == TAB_STAR:
 | |
|         PriorityValue &= 0x10111
 | |
|     if Arch == TAB_STAR:
 | |
|         PriorityValue &= 0x11011
 | |
|     if CommandType == TAB_STAR:
 | |
|         PriorityValue &= 0x11101
 | |
|     if Attr == TAB_STAR:
 | |
|         PriorityValue &= 0x11110
 | |
| 
 | |
|     return PrioList["0x%0.5x" % PriorityValue]
 |