]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Common/ToolDefClassObject.py
BaseTools: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / BaseTools / Source / Python / Common / ToolDefClassObject.py
index 5dd505c9b9fa992423bef78664b5028663554f6e..5d692ea13cfcc014a293afd02bab92711df4f9cf 100644 (file)
@@ -1,32 +1,31 @@
 ## @file\r
 # This file is used to define each component of tools_def.txt file\r
 #\r
-# Copyright (c) 2007 - 2014, 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 - 2019, Intel Corporation. All rights reserved.<BR>\r
+# SPDX-License-Identifier: BSD-2-Clause-Patent\r
 #\r
 \r
 ##\r
 # Import Modules\r
 #\r
+from __future__ import absolute_import\r
 import Common.LongFilePathOs as os\r
 import re\r
-import EdkLogger\r
+from . import EdkLogger\r
 \r
-from Dictionary import *\r
-from BuildToolError import *\r
-from TargetTxtClassObject import *\r
+from .BuildToolError import *\r
+from Common.TargetTxtClassObject import TargetTxtDict\r
 from Common.LongFilePathSupport import OpenLongFilePath as open\r
 from Common.Misc import PathClass\r
-from Common.String import NormPath\r
+from Common.StringUtils import NormPath\r
 import Common.GlobalData as GlobalData\r
 from Common import GlobalData\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_STAR, TAB_TAT_DEFINES_TOOL_CHAIN_CONF\r
+\r
 \r
 ##\r
 # Static variables used for pattern\r
@@ -53,7 +52,7 @@ class ToolDefClassObject(object):
         for Env in os.environ:\r
             self.MacroDictionary["ENV(%s)" % Env] = os.environ[Env]\r
 \r
-        if FileName != None:\r
+        if FileName is not None:\r
             self.LoadToolDefFile(FileName)\r
 \r
     ## LoadToolDefFile\r
@@ -89,15 +88,16 @@ class ToolDefClassObject(object):
 \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
-            for Key in dict(self.ToolsDefTxtDictionary):\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
+                if List[Index] == TAB_STAR:\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
-                        continue\r
                     del self.ToolsDefTxtDictionary[Key]\r
                 elif List[Index] not in self.ToolsDefTxtDatabase[KeyList[Index]]:\r
                     del self.ToolsDefTxtDictionary[Key]\r
@@ -154,7 +154,7 @@ class ToolDefClassObject(object):
                             if ErrorCode != 0:\r
                                 EdkLogger.error("tools_def.txt parser", FILE_NOT_FOUND, ExtraData=IncFile)\r
 \r
-                    if type(IncFileTmp) is PathClass:\r
+                    if isinstance(IncFileTmp, PathClass):\r
                         IncFile = IncFileTmp.Path\r
                     else:\r
                         IncFile = IncFileTmp\r
@@ -197,20 +197,20 @@ class ToolDefClassObject(object):
             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
@@ -221,7 +221,7 @@ class ToolDefClassObject(object):
                         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
@@ -236,14 +236,16 @@ class ToolDefClassObject(object):
     # @retval Value:  The string which has been replaced with real value\r
     #\r
     def ExpandMacros(self, Value):\r
+        # os.environ contains all environment variables uppercase on Windows which cause the key in the self.MacroDictionary is uppercase, but Ref may not\r
         EnvReference = gEnvRefPattern.findall(Value)\r
         for Ref in EnvReference:\r
-            if Ref not in self.MacroDictionary:\r
+            if Ref not in self.MacroDictionary and Ref.upper() not in self.MacroDictionary:\r
                 Value = Value.replace(Ref, "")\r
             else:\r
-                Value = Value.replace(Ref, self.MacroDictionary[Ref])\r
\r
-\r
+                if Ref in self.MacroDictionary:\r
+                    Value = Value.replace(Ref, self.MacroDictionary[Ref])\r
+                else:\r
+                    Value = Value.replace(Ref, self.MacroDictionary[Ref.upper()])\r
         MacroReference = gMacroRefPattern.findall(Value)\r
         for Ref in MacroReference:\r
             if Ref not in self.MacroDictionary:\r
@@ -263,8 +265,8 @@ class ToolDefClassObject(object):
 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 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