git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8964 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			191 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			191 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| ## @file
 | |
| # process GUIDed section generation
 | |
| #
 | |
| #  Copyright (c) 2007, Intel Corporation
 | |
| #
 | |
| #  All rights reserved. This program and the accompanying materials
 | |
| #  are licensed and made available under the terms and conditions of the BSD License
 | |
| #  which accompanies this distribution.  The full text of the license may be found at
 | |
| #  http://opensource.org/licenses/bsd-license.php
 | |
| #
 | |
| #  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
| #  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| #
 | |
| 
 | |
| ##
 | |
| # Import Modules
 | |
| #
 | |
| import Section
 | |
| import subprocess
 | |
| from Ffs import Ffs
 | |
| import os
 | |
| from GenFdsGlobalVariable import GenFdsGlobalVariable
 | |
| from CommonDataClass.FdfClass import GuidSectionClassObject
 | |
| from Common import ToolDefClassObject
 | |
| import sys
 | |
| from Common import EdkLogger
 | |
| from Common.BuildToolError import *
 | |
| 
 | |
| ## generate GUIDed section
 | |
| #
 | |
| #
 | |
| class GuidSection(GuidSectionClassObject) :
 | |
| 
 | |
|     ## The constructor
 | |
|     #
 | |
|     #   @param  self        The object pointer
 | |
|     #
 | |
|     def __init__(self):
 | |
|         GuidSectionClassObject.__init__(self)
 | |
| 
 | |
|     ## GenSection() method
 | |
|     #
 | |
|     #   Generate GUIDed section
 | |
|     #
 | |
|     #   @param  self        The object pointer
 | |
|     #   @param  OutputPath  Where to place output file
 | |
|     #   @param  ModuleName  Which module this section belongs to
 | |
|     #   @param  SecNum      Index of section
 | |
|     #   @param  KeyStringList  Filter for inputs of section generation
 | |
|     #   @param  FfsInf      FfsInfStatement object that contains this section data
 | |
|     #   @param  Dict        dictionary contains macro and its value
 | |
|     #   @retval tuple       (Generated file name, section alignment)
 | |
|     #
 | |
|     def GenSection(self, OutputPath, ModuleName, SecNum, KeyStringList, FfsInf = None, Dict = {}):
 | |
|         #
 | |
|         # Generate all section
 | |
|         #
 | |
|         self.KeyStringList = KeyStringList
 | |
|         self.CurrentArchList = GenFdsGlobalVariable.ArchList
 | |
|         if FfsInf != None:
 | |
|             self.Alignment = FfsInf.__ExtendMacro__(self.Alignment)
 | |
|             self.NameGuid = FfsInf.__ExtendMacro__(self.NameGuid)
 | |
|             self.SectionType = FfsInf.__ExtendMacro__(self.SectionType)
 | |
|             self.CurrentArchList = [FfsInf.CurrentArch]
 | |
| 
 | |
|         SectFile = tuple()
 | |
|         Index = 0
 | |
|         for Sect in self.SectionList:
 | |
|             Index = Index + 1
 | |
|             SecIndex = '%s.%d' %(SecNum,Index)
 | |
|             ReturnSectList, align = Sect.GenSection(OutputPath, ModuleName, SecIndex, KeyStringList,FfsInf, Dict)
 | |
|             if ReturnSectList != []:
 | |
|                 for file in ReturnSectList:
 | |
|                     SectFile += (file,)
 | |
| 
 | |
| 
 | |
|         OutputFile = OutputPath + \
 | |
|                      os.sep     + \
 | |
|                      ModuleName + \
 | |
|                      'SEC'      + \
 | |
|                      SecNum     + \
 | |
|                      Ffs.SectionSuffix['GUIDED']
 | |
|         OutputFile = os.path.normpath(OutputFile)
 | |
| 
 | |
|         ExternalTool = None
 | |
|         if self.NameGuid != None:
 | |
|             ExternalTool = self.__FindExtendTool__()
 | |
|         #
 | |
|         # If not have GUID , call default
 | |
|         # GENCRC32 section
 | |
|         #
 | |
|         if self.NameGuid == None :
 | |
|             GenFdsGlobalVariable.VerboseLogger( "Use GenSection function Generate CRC32 Section")
 | |
|             GenFdsGlobalVariable.GenerateSection(OutputFile, SectFile, Section.Section.SectionType[self.SectionType])
 | |
|             OutputFileList = []
 | |
|             OutputFileList.append(OutputFile)
 | |
|             return OutputFileList, self.Alignment
 | |
|         #or GUID not in External Tool List
 | |
|         elif ExternalTool == None:
 | |
|             EdkLogger.error("GenFds", GENFDS_ERROR, "No tool found with GUID %s" % self.NameGuid)
 | |
|         else:
 | |
|             #
 | |
|             # Call GenSection with DUMMY section type.
 | |
|             #
 | |
|             GenFdsGlobalVariable.GenerateSection(OutputFile+".dummy", SectFile)
 | |
|             #
 | |
|             # Use external tool process the Output
 | |
|             #
 | |
|             InputFile = OutputFile+".dummy"
 | |
|             TempFile = OutputPath + \
 | |
|                        os.sep     + \
 | |
|                        ModuleName + \
 | |
|                        'SEC'      + \
 | |
|                        SecNum     + \
 | |
|                        '.tmp'
 | |
|             TempFile = os.path.normpath(TempFile)
 | |
| 
 | |
|             ExternalToolCmd = (
 | |
|                 ExternalTool,
 | |
|                 '-e',
 | |
|                 '-o', TempFile,
 | |
|                 InputFile,
 | |
|                 )
 | |
| 
 | |
|             #
 | |
|             # Call external tool
 | |
|             #
 | |
|             GenFdsGlobalVariable.GuidTool(TempFile, [InputFile], ExternalTool, '-e')
 | |
| 
 | |
|             #
 | |
|             # Call Gensection Add Secntion Header
 | |
|             #
 | |
|             Attribute = None
 | |
|             if self.ProcessRequired == True:
 | |
|                 Attribute = 'PROCSSING_REQUIRED'
 | |
|             if self.AuthStatusValid == True:
 | |
|                 Attribute = 'AUTH_STATUS_VALID'
 | |
|             GenFdsGlobalVariable.GenerateSection(OutputFile, [TempFile], Section.Section.SectionType['GUIDED'],
 | |
|                                                  Guid=self.NameGuid, GuidAttr=Attribute)
 | |
|             OutputFileList = []
 | |
|             OutputFileList.append(OutputFile)
 | |
|             return OutputFileList, self.Alignment
 | |
| 
 | |
|     ## __FindExtendTool()
 | |
|     #
 | |
|     #    Find location of tools to process section data
 | |
|     #
 | |
|     #   @param  self        The object pointer
 | |
|     #
 | |
|     def __FindExtendTool__(self):
 | |
|         # if user not specify filter, try to deduce it from global data.
 | |
|         if self.KeyStringList == None or self.KeyStringList == []:
 | |
|             Target = GenFdsGlobalVariable.TargetName
 | |
|             ToolChain = GenFdsGlobalVariable.ToolChainTag
 | |
|             ToolDb = ToolDefClassObject.ToolDefDict(GenFdsGlobalVariable.WorkSpaceDir).ToolsDefTxtDatabase
 | |
|             if ToolChain not in ToolDb['TOOL_CHAIN_TAG']:
 | |
|                 EdkLogger.error("GenFds", GENFDS_ERROR, "Can not find external tool because tool tag %s is not defined in tools_def.txt!" % ToolChain)
 | |
|             self.KeyStringList = [Target+'_'+ToolChain+'_'+self.CurrentArchList[0]]
 | |
|             for Arch in self.CurrentArchList:
 | |
|                 if Target+'_'+ToolChain+'_'+Arch not in self.KeyStringList:
 | |
|                     self.KeyStringList.append(Target+'_'+ToolChain+'_'+Arch)
 | |
|                     
 | |
|         ToolDefinition = ToolDefClassObject.ToolDefDict(GenFdsGlobalVariable.WorkSpaceDir).ToolsDefTxtDictionary
 | |
|         ToolPathTmp = None
 | |
|         for ToolDef in ToolDefinition.items():
 | |
|             if self.NameGuid == ToolDef[1]:
 | |
|                 KeyList = ToolDef[0].split('_')
 | |
|                 Key = KeyList[0] + \
 | |
|                       '_'        + \
 | |
|                       KeyList[1] + \
 | |
|                       '_'        + \
 | |
|                       KeyList[2]
 | |
|                 if Key in self.KeyStringList and KeyList[4] == 'GUID':
 | |
| 
 | |
|                     ToolPath = ToolDefinition.get( Key        + \
 | |
|                                                    '_'        + \
 | |
|                                                    KeyList[3] + \
 | |
|                                                    '_'        + \
 | |
|                                                    'PATH')
 | |
|                     if ToolPathTmp == None:
 | |
|                         ToolPathTmp = ToolPath
 | |
|                     else:
 | |
|                         if ToolPathTmp != ToolPath:
 | |
|                             EdkLogger.error("GenFds", GENFDS_ERROR, "Don't know which tool to use, %s or %s ?" % (ToolPathTmp, ToolPath))
 | |
|                             
 | |
|                     
 | |
|         return ToolPathTmp
 | |
| 
 | |
| 
 | |
| 
 |