## @file\r
# This file is used to define each component of tools_def.txt file\r
#\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
-# http://opensource.org/licenses/bsd-license.php\r
-#\r
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+# Copyright (c) 2007 - 2021, Intel Corporation. All rights reserved.<BR>\r
+# SPDX-License-Identifier: BSD-2-Clause-Patent\r
#\r
\r
##\r
from . import EdkLogger\r
\r
from .BuildToolError import *\r
-from .TargetTxtClassObject import *\r
+from Common.TargetTxtClassObject import TargetTxtDict\r
from Common.LongFilePathSupport import OpenLongFilePath as open\r
from Common.Misc import PathClass\r
from Common.StringUtils import NormPath\r
from Common.MultipleWorkspace import MultipleWorkspace as mws\r
from .DataType import TAB_TOD_DEFINES_TARGET, TAB_TOD_DEFINES_TOOL_CHAIN_TAG,\\r
TAB_TOD_DEFINES_TARGET_ARCH, TAB_TOD_DEFINES_COMMAND_TYPE\\r
- , TAB_TOD_DEFINES_FAMILY, TAB_TOD_DEFINES_BUILDRULEFAMILY\r
+ , TAB_TOD_DEFINES_FAMILY, TAB_TOD_DEFINES_BUILDRULEFAMILY,\\r
+ TAB_STAR, TAB_TAT_DEFINES_TOOL_CHAIN_CONF\r
\r
\r
##\r
self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET_ARCH].sort()\r
self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_COMMAND_TYPE].sort()\r
\r
- KeyList = [TAB_TOD_DEFINES_TARGET, TAB_TOD_DEFINES_TOOL_CHAIN_TAG, TAB_TOD_DEFINES_TARGET_ARCH, TAB_TOD_DEFINES_COMMAND_TYPE]\r
- for Index in range(3, -1, -1):\r
- # make a copy of the keys to enumerate over to prevent issues when\r
- # adding/removing items from the original dict.\r
- for Key in list(self.ToolsDefTxtDictionary.keys()):\r
- List = Key.split('_')\r
- if List[Index] == '*':\r
- for String in self.ToolsDefTxtDatabase[KeyList[Index]]:\r
- List[Index] = String\r
- NewKey = '%s_%s_%s_%s_%s' % tuple(List)\r
- if NewKey not in self.ToolsDefTxtDictionary:\r
- self.ToolsDefTxtDictionary[NewKey] = self.ToolsDefTxtDictionary[Key]\r
- del self.ToolsDefTxtDictionary[Key]\r
- elif List[Index] not in self.ToolsDefTxtDatabase[KeyList[Index]]:\r
- del self.ToolsDefTxtDictionary[Key]\r
-\r
-\r
## IncludeToolDefFile\r
#\r
- # Load target.txt file and parse it as if it's contents were inside the main file\r
+ # Load target.txt file and parse it as if its contents were inside the main file\r
#\r
# @param Filename: Input value for full path of tools_def.txt\r
#\r
if len(List) != 5:\r
EdkLogger.verbose("Line %d: Not a valid name of definition: %s" % ((Index + 1), Name))\r
continue\r
- elif List[4] == '*':\r
+ elif List[4] == TAB_STAR:\r
EdkLogger.verbose("Line %d: '*' is not allowed in last field: %s" % ((Index + 1), Name))\r
continue\r
else:\r
self.ToolsDefTxtDictionary[Name] = Value\r
- if List[0] != '*':\r
+ if List[0] != TAB_STAR:\r
self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET] += [List[0]]\r
- if List[1] != '*':\r
+ if List[1] != TAB_STAR:\r
self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TOOL_CHAIN_TAG] += [List[1]]\r
- if List[2] != '*':\r
+ if List[2] != TAB_STAR:\r
self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_TARGET_ARCH] += [List[2]]\r
- if List[3] != '*':\r
+ if List[3] != TAB_STAR:\r
self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_COMMAND_TYPE] += [List[3]]\r
- if List[4] == TAB_TOD_DEFINES_FAMILY and List[2] == '*' and List[3] == '*':\r
+ if List[4] == TAB_TOD_DEFINES_FAMILY and List[2] == TAB_STAR and List[3] == TAB_STAR:\r
if TAB_TOD_DEFINES_FAMILY not in self.ToolsDefTxtDatabase:\r
self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_FAMILY] = {}\r
self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_FAMILY][List[1]] = Value\r
self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_BUILDRULEFAMILY][List[1]] = Value\r
elif self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_FAMILY][List[1]] != Value:\r
EdkLogger.verbose("Line %d: No override allowed for the family of a tool chain: %s" % ((Index + 1), Name))\r
- if List[4] == TAB_TOD_DEFINES_BUILDRULEFAMILY and List[2] == '*' and List[3] == '*':\r
+ if List[4] == TAB_TOD_DEFINES_BUILDRULEFAMILY and List[2] == TAB_STAR and List[3] == TAB_STAR:\r
if TAB_TOD_DEFINES_BUILDRULEFAMILY not in self.ToolsDefTxtDatabase \\r
or List[1] not in self.ToolsDefTxtDatabase[TAB_TOD_DEFINES_FAMILY]:\r
EdkLogger.verbose("Line %d: The family is not specified, but BuildRuleFamily is specified for the tool chain: %s" % ((Index + 1), Name))\r
#\r
# @retval ToolDef An instance of ToolDefClassObject() with loaded tools_def.txt\r
#\r
-def ToolDefDict(ConfDir):\r
- Target = TargetTxtDict(ConfDir)\r
- ToolDef = ToolDefClassObject()\r
- if DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF in Target.TargetTxtDictionary:\r
- ToolsDefFile = Target.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF]\r
- if ToolsDefFile:\r
- ToolDef.LoadToolDefFile(os.path.normpath(ToolsDefFile))\r
+\r
+\r
+class ToolDefDict():\r
+\r
+ def __new__(cls, ConfDir, *args, **kw):\r
+ if not hasattr(cls, '_instance'):\r
+ orig = super(ToolDefDict, cls)\r
+ cls._instance = orig.__new__(cls, *args, **kw)\r
+ return cls._instance\r
+\r
+ def __init__(self, ConfDir):\r
+ self.ConfDir = ConfDir\r
+ if not hasattr(self, 'ToolDef'):\r
+ self._ToolDef = None\r
+\r
+ @property\r
+ def ToolDef(self):\r
+ if not self._ToolDef:\r
+ self._GetToolDef()\r
+ return self._ToolDef\r
+\r
+ def _GetToolDef(self):\r
+ TargetObj = TargetTxtDict()\r
+ Target = TargetObj.Target\r
+ ToolDef = ToolDefClassObject()\r
+ if TAB_TAT_DEFINES_TOOL_CHAIN_CONF in Target.TargetTxtDictionary:\r
+ ToolsDefFile = Target.TargetTxtDictionary[TAB_TAT_DEFINES_TOOL_CHAIN_CONF]\r
+ if ToolsDefFile:\r
+ ToolDef.LoadToolDefFile(os.path.normpath(ToolsDefFile))\r
+ else:\r
+ ToolDef.LoadToolDefFile(os.path.normpath(os.path.join(self.ConfDir, gDefaultToolsDefFile)))\r
else:\r
- ToolDef.LoadToolDefFile(os.path.normpath(os.path.join(ConfDir, gDefaultToolsDefFile)))\r
- else:\r
- ToolDef.LoadToolDefFile(os.path.normpath(os.path.join(ConfDir, gDefaultToolsDefFile)))\r
- return ToolDef\r
+ ToolDef.LoadToolDefFile(os.path.normpath(os.path.join(self.ConfDir, gDefaultToolsDefFile)))\r
+ self._ToolDef = ToolDef\r
\r
##\r
#\r