## @file\r
# The engine for building files\r
#\r
-# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
# This program and the accompanying materials\r
# are licensed and made available under the terms and conditions of the BSD License\r
# which accompanies this distribution. The full text of the license may be found at\r
##\r
# Import Modules\r
#\r
+from __future__ import print_function\r
import Common.LongFilePathOs as os\r
import re\r
import copy\r
from Common.GlobalData import *\r
from Common.BuildToolError import *\r
from Common.Misc import tdict, PathClass\r
-from Common.String import NormPath\r
+from Common.StringUtils import NormPath\r
from Common.DataType import *\r
\r
import Common.EdkLogger as EdkLogger\r
return "%s_LIST" % FileListMacro(FileType)\r
\r
class TargetDescBlock(object):\r
- _Cache_ = {} # {TargetFile : TargetDescBlock object}\r
-\r
- # Factory method\r
- def __new__(Class, Inputs, Outputs, Commands, Dependencies):\r
- if Outputs[0] in Class._Cache_:\r
- Tdb = Class._Cache_[Outputs[0]]\r
- for File in Inputs:\r
- Tdb.AddInput(File)\r
- else:\r
- Tdb = super(TargetDescBlock, Class).__new__(Class)\r
- Tdb._Init(Inputs, Outputs, Commands, Dependencies)\r
- #Class._Cache_[Outputs[0]] = Tdb\r
- return Tdb\r
+ def __init__(self, Inputs, Outputs, Commands, Dependencies):\r
+ self.InitWorker(Inputs, Outputs, Commands, Dependencies)\r
\r
- def _Init(self, Inputs, Outputs, Commands, Dependencies):\r
+ def InitWorker(self, Inputs, Outputs, Commands, Dependencies):\r
self.Inputs = Inputs\r
self.Outputs = Outputs\r
self.Commands = Commands\r
def IsMultipleInput(self):\r
return len(self.Inputs) > 1\r
\r
- @staticmethod\r
- def Renew():\r
- TargetDescBlock._Cache_ = {}\r
-\r
## Class for one build rule\r
#\r
# This represents a build rule which can give out corresponding command list for\r
# Command line should be regenerated since some macros are different\r
#\r
CommandList = self._BuildCommand(BuildRulePlaceholderDict)\r
- TargetDesc._Init([SourceFile], DstFile, CommandList, self.ExtraSourceFileList)\r
+ TargetDesc.InitWorker([SourceFile], DstFile, CommandList, self.ExtraSourceFileList)\r
break\r
else:\r
TargetDesc.AddInput(SourceFile)\r
self.Parse()\r
\r
# some intrinsic rules\r
- self.RuleDatabase[TAB_DEFAULT_BINARY_FILE, "COMMON", "COMMON", "COMMON"] = self._BinaryFileRule\r
+ self.RuleDatabase[TAB_DEFAULT_BINARY_FILE, TAB_COMMON, TAB_COMMON, TAB_COMMON] = self._BinaryFileRule\r
self.FileTypeList.add(TAB_DEFAULT_BINARY_FILE)\r
\r
## Parse the build rule strings\r
def EndOfSection(self):\r
Database = self.RuleDatabase\r
# if there's specific toochain family, 'COMMON' doesn't make sense any more\r
- if len(self._TotalToolChainFamilySet) > 1 and 'COMMON' in self._TotalToolChainFamilySet:\r
- self._TotalToolChainFamilySet.remove('COMMON')\r
+ if len(self._TotalToolChainFamilySet) > 1 and TAB_COMMON in self._TotalToolChainFamilySet:\r
+ self._TotalToolChainFamilySet.remove(TAB_COMMON)\r
for Family in self._TotalToolChainFamilySet:\r
Input = self._RuleInfo[Family, self._InputFile]\r
Output = self._RuleInfo[Family, self._OutputFile]\r
FileType = ''\r
RuleNameList = self.RuleContent[LineIndex][1:-1].split(',')\r
for RuleName in RuleNameList:\r
- Arch = 'COMMON'\r
- BuildType = 'COMMON'\r
+ Arch = TAB_COMMON\r
+ BuildType = TAB_COMMON\r
TokenList = [Token.strip().upper() for Token in RuleName.split('.')]\r
# old format: Build.File-Type\r
if TokenList[0] == "BUILD":\r
self._BuildTypeList.add(BuildType)\r
self._ArchList.add(Arch)\r
\r
- if 'COMMON' in self._BuildTypeList and len(self._BuildTypeList) > 1:\r
+ if TAB_COMMON in self._BuildTypeList and len(self._BuildTypeList) > 1:\r
EdkLogger.error("build", FORMAT_INVALID,\r
"Specific build types must not be mixed with common one",\r
File=self.RuleFile, Line=LineIndex + 1,\r
ExtraData=self.RuleContent[LineIndex])\r
- if 'COMMON' in self._ArchList and len(self._ArchList) > 1:\r
+ if TAB_COMMON in self._ArchList and len(self._ArchList) > 1:\r
EdkLogger.error("build", FORMAT_INVALID,\r
"Specific ARCH must not be mixed with common one",\r
File=self.RuleFile, Line=LineIndex + 1,\r
if len(TokenList) > 1:\r
Family = TokenList[1].strip().upper()\r
else:\r
- Family = "COMMON"\r
+ Family = TAB_COMMON\r
\r
if Family not in FamilyList:\r
FamilyList.append(Family)\r
self._FamilyList = FamilyList\r
self._TotalToolChainFamilySet.update(FamilyList)\r
self._State = SectionType.upper()\r
- if 'COMMON' in FamilyList and len(FamilyList) > 1:\r
+ if TAB_COMMON in FamilyList and len(FamilyList) > 1:\r
EdkLogger.error("build", FORMAT_INVALID,\r
"Specific tool chain family should not be mixed with general one",\r
File=self.RuleFile, Line=LineIndex + 1,\r
EdkLogger.Initialize()\r
if len(sys.argv) > 1:\r
Br = BuildRule(sys.argv[1])\r
- print str(Br[".c", "DXE_DRIVER", "IA32", "MSFT"][1])\r
- print\r
- print str(Br[".c", "DXE_DRIVER", "IA32", "INTEL"][1])\r
- print\r
- print str(Br[".c", "DXE_DRIVER", "IA32", "GCC"][1])\r
- print\r
- print str(Br[".ac", "ACPI_TABLE", "IA32", "MSFT"][1])\r
- print\r
- print str(Br[".h", "ACPI_TABLE", "IA32", "INTEL"][1])\r
- print\r
- print str(Br[".ac", "ACPI_TABLE", "IA32", "MSFT"][1])\r
- print\r
- print str(Br[".s", "SEC", "IPF", "COMMON"][1])\r
- print\r
- print str(Br[".s", "SEC"][1])\r
+ print(str(Br[".c", SUP_MODULE_DXE_DRIVER, "IA32", "MSFT"][1]))\r
+ print()\r
+ print(str(Br[".c", SUP_MODULE_DXE_DRIVER, "IA32", "INTEL"][1]))\r
+ print()\r
+ print(str(Br[".c", SUP_MODULE_DXE_DRIVER, "IA32", "GCC"][1]))\r
+ print()\r
+ print(str(Br[".ac", "ACPI_TABLE", "IA32", "MSFT"][1]))\r
+ print()\r
+ print(str(Br[".h", "ACPI_TABLE", "IA32", "INTEL"][1]))\r
+ print()\r
+ print(str(Br[".ac", "ACPI_TABLE", "IA32", "MSFT"][1]))\r
+ print()\r
+ print(str(Br[".s", SUP_MODULE_SEC, "IPF", "COMMON"][1]))\r
+ print()\r
+ print(str(Br[".s", SUP_MODULE_SEC][1]))\r
\r