License header updated to match correct format.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Yingke Liu <yingke.d.liu@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15971 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@ -373,7 +373,7 @@ TAB_INF_GUIDTYPE_TSG = 'TokenSpaceGuid'
|
||||
TAB_INF_GUIDTYPE_VAR = 'Variable'
|
||||
TAB_INF_GUIDTYPE_PROTOCOL = 'PROTOCOL'
|
||||
TAB_INF_GUIDTYPE_PPI = 'PPI'
|
||||
TAB_INF_GUIDTYPE_UNDEFINED = 'UNDEFINED'
|
||||
TAB_INF_USAGE_UNDEFINED = 'UNDEFINED'
|
||||
|
||||
#
|
||||
# Dec Definitions
|
||||
|
@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# This file is used to define common static strings used by INF/DEC/DSC files
|
||||
#
|
||||
# Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>
|
||||
# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||
# 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
|
||||
@ -69,3 +69,11 @@ gIgnoreSource = False
|
||||
# FDF parser
|
||||
#
|
||||
gFdfParser = None
|
||||
|
||||
#
|
||||
# If a module is built more than once with different PCDs or library classes
|
||||
# a temporary INF file with same content is created, the temporary file is removed
|
||||
# when build exits.
|
||||
#
|
||||
gTempInfs = []
|
||||
|
||||
|
@ -23,6 +23,7 @@ import time
|
||||
import re
|
||||
import cPickle
|
||||
import array
|
||||
import shutil
|
||||
from UserDict import IterableUserDict
|
||||
from UserList import UserList
|
||||
|
||||
@ -43,6 +44,90 @@ gFileTimeStampCache = {} # {file path : file time stamp}
|
||||
## Dictionary used to store dependencies of files
|
||||
gDependencyDatabase = {} # arch : {file path : [dependent files list]}
|
||||
|
||||
## Routine to process duplicated INF
|
||||
#
|
||||
# This function is called by following two cases:
|
||||
# Case 1 in DSC:
|
||||
# [components.arch]
|
||||
# Pkg/module/module.inf
|
||||
# Pkg/module/module.inf {
|
||||
# <Defines>
|
||||
# FILE_GUID = 0D1B936F-68F3-4589-AFCC-FB8B7AEBC836
|
||||
# }
|
||||
# Case 2 in FDF:
|
||||
# INF Pkg/module/module.inf
|
||||
# INF FILE_GUID = 0D1B936F-68F3-4589-AFCC-FB8B7AEBC836 Pkg/module/module.inf
|
||||
#
|
||||
# This function copies Pkg/module/module.inf to
|
||||
# Conf/.cache/0D1B936F-68F3-4589-AFCC-FB8B7AEBC836module.inf
|
||||
#
|
||||
# @param Path Original PathClass object
|
||||
# @param BaseName New file base name
|
||||
#
|
||||
# @retval return the new PathClass object
|
||||
#
|
||||
def ProcessDuplicatedInf(Path, BaseName, Workspace):
|
||||
Filename = os.path.split(Path.File)[1]
|
||||
if '.' in Filename:
|
||||
Filename = BaseName + Path.BaseName + Filename[Filename.rfind('.'):]
|
||||
else:
|
||||
Filename = BaseName + Path.BaseName
|
||||
|
||||
#
|
||||
# If -N is specified on command line, cache is disabled
|
||||
# The directory has to be created
|
||||
#
|
||||
DbDir = os.path.split(GlobalData.gDatabasePath)[0]
|
||||
if not os.path.exists(DbDir):
|
||||
os.makedirs(DbDir)
|
||||
#
|
||||
# A temporary INF is copied to database path which must have write permission
|
||||
# The temporary will be removed at the end of build
|
||||
# In case of name conflict, the file name is
|
||||
# FILE_GUIDBaseName (0D1B936F-68F3-4589-AFCC-FB8B7AEBC836module.inf)
|
||||
#
|
||||
TempFullPath = os.path.join(DbDir,
|
||||
Filename)
|
||||
RtPath = PathClass(Path.File, Workspace)
|
||||
#
|
||||
# Modify the full path to temporary path, keep other unchanged
|
||||
#
|
||||
# To build same module more than once, the module path with FILE_GUID overridden has
|
||||
# the file name FILE_GUIDmodule.inf, but the relative path (self.MetaFile.File) is the real path
|
||||
# in DSC which is used as relative path by C files and other files in INF.
|
||||
# A trick was used: all module paths are PathClass instances, after the initialization
|
||||
# of PathClass, the PathClass.Path is overridden by the temporary INF path.
|
||||
#
|
||||
# The reason for creating a temporary INF is:
|
||||
# Platform.Modules which is the base to create ModuleAutoGen objects is a dictionary,
|
||||
# the key is the full path of INF, the value is an object to save overridden library instances, PCDs.
|
||||
# A different key for the same module is needed to create different output directory,
|
||||
# retrieve overridden PCDs, library instances.
|
||||
#
|
||||
# The BaseName is the FILE_GUID which is also the output directory name.
|
||||
#
|
||||
#
|
||||
RtPath.Path = TempFullPath
|
||||
RtPath.BaseName = BaseName
|
||||
#
|
||||
# If file exists, compare contents
|
||||
#
|
||||
if os.path.exists(TempFullPath):
|
||||
with open(str(Path), 'rb') as f1: Src = f1.read()
|
||||
with open(TempFullPath, 'rb') as f2: Dst = f2.read()
|
||||
if Src == Dst:
|
||||
return RtPath
|
||||
GlobalData.gTempInfs.append(TempFullPath)
|
||||
shutil.copy2(str(Path), TempFullPath)
|
||||
return RtPath
|
||||
|
||||
## Remove temporary created INFs whose paths were saved in gTempInfs
|
||||
#
|
||||
def ClearDuplicatedInf():
|
||||
for File in GlobalData.gTempInfs:
|
||||
if os.path.exists(File):
|
||||
os.remove(File)
|
||||
|
||||
## callback routine for processing variable option
|
||||
#
|
||||
# This function can be used to process variable number of option values. The
|
||||
@ -1456,6 +1541,45 @@ def CommonPath(PathList):
|
||||
return os.path.sep.join(P1[:Index])
|
||||
return os.path.sep.join(P1)
|
||||
|
||||
#
|
||||
# Convert string to C format array
|
||||
#
|
||||
def ConvertStringToByteArray(Value):
|
||||
Value = Value.strip()
|
||||
if not Value:
|
||||
return None
|
||||
if Value[0] == '{':
|
||||
if not Value.endswith('}'):
|
||||
return None
|
||||
Value = Value.replace(' ', '').replace('{', '').replace('}', '')
|
||||
ValFields = Value.split(',')
|
||||
try:
|
||||
for Index in range(len(ValFields)):
|
||||
ValFields[Index] = str(int(ValFields[Index], 0))
|
||||
except ValueError:
|
||||
return None
|
||||
Value = '{' + ','.join(ValFields) + '}'
|
||||
return Value
|
||||
|
||||
Unicode = False
|
||||
if Value.startswith('L"'):
|
||||
if not Value.endswith('"'):
|
||||
return None
|
||||
Value = Value[1:]
|
||||
Unicode = True
|
||||
elif not Value.startswith('"') or not Value.endswith('"'):
|
||||
return None
|
||||
|
||||
Value = eval(Value) # translate escape character
|
||||
NewValue = '{'
|
||||
for Index in range(0,len(Value)):
|
||||
if Unicode:
|
||||
NewValue = NewValue + str(ord(Value[Index]) % 0x10000) + ','
|
||||
else:
|
||||
NewValue = NewValue + str(ord(Value[Index]) % 0x100) + ','
|
||||
Value = NewValue + '0}'
|
||||
return Value
|
||||
|
||||
class PathClass(object):
|
||||
def __init__(self, File='', Root='', AlterRoot='', Type='', IsBinary=False,
|
||||
Arch='COMMON', ToolChainFamily='', Target='', TagName='', ToolCode=''):
|
||||
|
@ -21,7 +21,7 @@ from BuildToolError import *
|
||||
import GlobalData
|
||||
from Common.LongFilePathSupport import OpenLongFilePath as open
|
||||
|
||||
gDefaultTargetTxtFile = "Conf/target.txt"
|
||||
gDefaultTargetTxtFile = "target.txt"
|
||||
|
||||
## TargetTxtClassObject
|
||||
#
|
||||
@ -44,6 +44,7 @@ class TargetTxtClassObject(object):
|
||||
DataType.TAB_TAT_DEFINES_TARGET_ARCH : [],
|
||||
DataType.TAB_TAT_DEFINES_BUILD_RULE_CONF : '',
|
||||
}
|
||||
self.ConfDirectoryPath = ""
|
||||
if Filename != None:
|
||||
self.LoadTargetTxtFile(Filename)
|
||||
|
||||
@ -78,7 +79,8 @@ class TargetTxtClassObject(object):
|
||||
def ConvertTextFileToDict(self, FileName, CommentCharacter, KeySplitCharacter):
|
||||
F = None
|
||||
try:
|
||||
F = open(FileName,'r')
|
||||
F = open(FileName, 'r')
|
||||
self.ConfDirectoryPath = os.path.dirname(FileName)
|
||||
except:
|
||||
EdkLogger.error("build", FILE_OPEN_FAILURE, ExtraData=FileName)
|
||||
if F != None:
|
||||
@ -99,6 +101,26 @@ class TargetTxtClassObject(object):
|
||||
if Key in [DataType.TAB_TAT_DEFINES_ACTIVE_PLATFORM, DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF, \
|
||||
DataType.TAB_TAT_DEFINES_ACTIVE_MODULE, DataType.TAB_TAT_DEFINES_BUILD_RULE_CONF]:
|
||||
self.TargetTxtDictionary[Key] = Value.replace('\\', '/')
|
||||
if Key == DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF and self.TargetTxtDictionary[Key]:
|
||||
if self.TargetTxtDictionary[Key].startswith("Conf/"):
|
||||
Tools_Def = os.path.join(self.ConfDirectoryPath, self.TargetTxtDictionary[Key].strip())
|
||||
if not os.path.exists(Tools_Def) or not os.path.isfile(Tools_Def):
|
||||
# If Conf/Conf does not exist, try just the Conf/ directory
|
||||
Tools_Def = os.path.join(self.ConfDirectoryPath, self.TargetTxtDictionary[Key].replace("Conf/", "", 1).strip())
|
||||
else:
|
||||
# The File pointed to by TOOL_CHAIN_CONF is not in a Conf/ directory
|
||||
Tools_Def = os.path.join(self.ConfDirectoryPath, self.TargetTxtDictionary[Key].strip())
|
||||
self.TargetTxtDictionary[Key] = Tools_Def
|
||||
if Key == DataType.TAB_TAT_DEFINES_BUILD_RULE_CONF and self.TargetTxtDictionary[Key]:
|
||||
if self.TargetTxtDictionary[Key].startswith("Conf/"):
|
||||
Build_Rule = os.path.join(self.ConfDirectoryPath, self.TargetTxtDictionary[Key].strip())
|
||||
if not os.path.exists(Build_Rule) or not os.path.isfile(Build_Rule):
|
||||
# If Conf/Conf does not exist, try just the Conf/ directory
|
||||
Build_Rule = os.path.join(self.ConfDirectoryPath, self.TargetTxtDictionary[Key].replace("Conf/", "", 1).strip())
|
||||
else:
|
||||
# The File pointed to by BUILD_RULE_CONF is not in a Conf/ directory
|
||||
Build_Rule = os.path.join(self.ConfDirectoryPath, self.TargetTxtDictionary[Key].strip())
|
||||
self.TargetTxtDictionary[Key] = Build_Rule
|
||||
elif Key in [DataType.TAB_TAT_DEFINES_TARGET, DataType.TAB_TAT_DEFINES_TARGET_ARCH, \
|
||||
DataType.TAB_TAT_DEFINES_TOOL_CHAIN_TAG]:
|
||||
self.TargetTxtDictionary[Key] = Value.split()
|
||||
@ -144,15 +166,15 @@ class TargetTxtClassObject(object):
|
||||
print Item
|
||||
## TargetTxtDict
|
||||
#
|
||||
# Load target.txt in input workspace dir
|
||||
# Load target.txt in input Conf dir
|
||||
#
|
||||
# @param WorkSpace: Workspace dir
|
||||
# @param ConfDir: Conf dir
|
||||
#
|
||||
# @retval Target An instance of TargetTxtClassObject() with loaded target.txt
|
||||
#
|
||||
def TargetTxtDict(WorkSpace):
|
||||
def TargetTxtDict(ConfDir):
|
||||
Target = TargetTxtClassObject()
|
||||
Target.LoadTargetTxtFile(os.path.normpath(os.path.join(WorkSpace, gDefaultTargetTxtFile)))
|
||||
Target.LoadTargetTxtFile(os.path.normpath(os.path.join(ConfDir, gDefaultTargetTxtFile)))
|
||||
return Target
|
||||
|
||||
##
|
||||
|
@ -29,7 +29,7 @@ from Common.LongFilePathSupport import OpenLongFilePath as open
|
||||
gMacroRefPattern = re.compile('(DEF\([^\(\)]+\))')
|
||||
gEnvRefPattern = re.compile('(ENV\([^\(\)]+\))')
|
||||
gMacroDefPattern = re.compile("DEFINE\s+([^\s]+)")
|
||||
gDefaultToolsDefFile = "Conf/tools_def.txt"
|
||||
gDefaultToolsDefFile = "tools_def.txt"
|
||||
|
||||
## ToolDefClassObject
|
||||
#
|
||||
@ -196,18 +196,23 @@ class ToolDefClassObject(object):
|
||||
|
||||
## ToolDefDict
|
||||
#
|
||||
# Load tools_def.txt in input workspace dir
|
||||
# Load tools_def.txt in input Conf dir
|
||||
#
|
||||
# @param WorkSpace: Workspace dir
|
||||
# @param ConfDir: Conf dir
|
||||
#
|
||||
# @retval ToolDef An instance of ToolDefClassObject() with loaded tools_def.txt
|
||||
#
|
||||
def ToolDefDict(WorkSpace):
|
||||
Target = TargetTxtDict(WorkSpace)
|
||||
def ToolDefDict(ConfDir):
|
||||
Target = TargetTxtDict(ConfDir)
|
||||
ToolDef = ToolDefClassObject()
|
||||
if DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF in Target.TargetTxtDictionary:
|
||||
gDefaultToolsDefFile = Target.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF]
|
||||
ToolDef.LoadToolDefFile(os.path.normpath(os.path.join(WorkSpace, gDefaultToolsDefFile)))
|
||||
ToolsDefFile = Target.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF]
|
||||
if ToolsDefFile:
|
||||
ToolDef.LoadToolDefFile(os.path.normpath(ToolsDefFile))
|
||||
else:
|
||||
ToolDef.LoadToolDefFile(os.path.normpath(os.path.join(ConfDir, gDefaultToolsDefFile)))
|
||||
else:
|
||||
ToolDef.LoadToolDefFile(os.path.normpath(os.path.join(ConfDir, gDefaultToolsDefFile)))
|
||||
return ToolDef
|
||||
|
||||
##
|
||||
|
Reference in New Issue
Block a user