git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@412 7335b...
[people/mcb30/basetools.git] / Source / Python / Common / String.py
index ab00c1e..8f033c4 100644 (file)
@@ -49,89 +49,62 @@ def GenDefines(String, Arch, Defines):
     \r
     return 1\r
 \r
-def MergeModulePcds(pcds, pcdsFixedAtBuild, pcdsPatchableInModule, pcdsFeatureFlag, pcdsDynamic):\r
-    #[ ['PcdName|PcdGuid|PcdType', 'IA32|X64|IPF|EBC'], ...]\r
-    \r
-    Item = pcdsFixedAtBuild\r
-    for index in range(len(Item)):\r
-        pcds.append([(Item[index][0].split(DataType.TAB_VALUE_SPLIT))[1] + DataType.TAB_VALUE_SPLIT + DataType.TAB_PCDS_FIXED_AT_BUILD, Item[index][1]])\r
-\r
-    Item = pcdsPatchableInModule\r
-    for index in range(len(Item)):\r
-        pcds.append([(Item[index][0].split(DataType.TAB_VALUE_SPLIT))[1] + DataType.TAB_VALUE_SPLIT + DataType.TAB_PCDS_PATCHABLE_IN_MODULE, Item[index][1]])\r
-                                 \r
-    Item = pcdsFeatureFlag\r
-    for index in range(len(Item)):\r
-        pcds.append([(Item[index][0].split(DataType.TAB_VALUE_SPLIT))[1] + DataType.TAB_VALUE_SPLIT + DataType.TAB_PCDS_FEATURE_FLAG, Item[index][1]])\r
-                                 \r
-    Item = pcdsDynamic\r
-    for index in range(len(Item)):\r
-        pcds.append([(Item[index][0].split(DataType.TAB_VALUE_SPLIT))[1] + DataType.TAB_VALUE_SPLIT + DataType.TAB_PCDS_DYNAMIC, Item[index][1]])\r
-\r
-def MergeAllArch(list1, listCommon, listIa32, listX64, listIpf, listEbc):\r
-    isFound = False\r
-    for j in range(len(list1)):\r
-        list1[j] = [list1[j], '']\r
-    \r
-    for i in listCommon:\r
-        if i not in list1:\r
-            list1.append([i, ''])\r
-    for i in listIa32:\r
-        for j in range(len(list1)):\r
-            if i == list1[j][0]:\r
-                isFound = True\r
-                list1[j] = [list1[j][0], 'IA32|']\r
-                break\r
-        if not isFound:\r
-            list1.append([i, 'IA32|'])\r
-        isFound = False\r
+#\r
+# Parse a string with format "!include <Filename>"\r
+# Return the file path\r
+# Return False if invalid format or NOT FOUND\r
+#\r
+def GenInclude(String, IncludeFiles, Arch):\r
+    if String.upper().find(DataType.TAB_INCLUDE.upper() + ' ') > -1:\r
+        IncludeFile = CleanString(String[String.upper().find(DataType.TAB_INCLUDE.upper() + ' ') + len(DataType.TAB_INCLUDE + ' ') : ])\r
+        MergeArches(IncludeFiles, IncludeFile, Arch)\r
+        return True\r
+    else:\r
+        return False\r
     \r
-    for i in listX64:\r
-        for j in range(len(list1)):\r
-            if i == list1[j][0]:\r
-                isFound = True\r
-                list1[j] = [list1[j][0], list1[j][1] + 'X64|']\r
-                break\r
-        if not isFound:\r
-            list1.append([i, 'X64|'])\r
-        isFound = False\r
+#\r
+# Parse a string with format "InfFilename [EXEC = ExecFilename]"\r
+# Return (InfFilename, ExecFilename)\r
+#\r
+def GetExec(String):\r
+    InfFilename = ''\r
+    ExecFilename = '' \r
+    if String.find('EXEC') > -1:\r
+        InfFilename = String[ : String.find('EXEC')].strip()\r
+        ExecFilename = String[String.find('EXEC') + len('EXEC') : ].strip()\r
+    else:\r
+        InfFilename = String.strip()\r
     \r
-    for i in listIpf:\r
-        for j in range(len(list1)):\r
-            if i == list1[j][0]:\r
-                isFound = True\r
-                list1[j] = [list1[j][0], list1[j][1] + 'Ipf|']\r
-                break\r
-        if not isFound:\r
-            list1.append([i, 'Ipf|'])\r
-        isFound = False\r
-        \r
-    for i in listEbc:\r
-        for j in range(len(list1)):\r
-            if i == list1[j][0]:\r
-                isFound = True\r
-                list1[j] = [list1[j][0], list1[j][1] + 'Ebc|']\r
-                break\r
-        if not isFound:\r
-            list1.append([i, 'Ebc|'])\r
-        isFound = False\r
-        \r
-    #Remove DataType.TAB_VALUE_SPLIT\r
-    for i in range(len(list1)):\r
-        if list1[i][1].endswith(DataType.TAB_VALUE_SPLIT):\r
-            list1[i][1] = list1[i][1].rsplit(DataType.TAB_VALUE_SPLIT, 1)[0]\r
+    return (InfFilename, ExecFilename)\r
 \r
-    #print list1\r
+#\r
+# Parse a string with format "[<Family>:]<ToolFlag>=Flag"\r
+# Return (Family, ToolFlag, Flag)\r
+#\r
+def GetBuildOption(String):\r
+    (Family, ToolChain, Flag) = ('', '', '')\r
+    List = GetSplitValueList(String, DataType.TAB_EQUAL_SPLIT, MaxSplit = 1)\r
+    if List[0].find(':') > -1:\r
+        Family = CleanString(List[0][ : List[0].find(':')])\r
+        ToolChain = CleanString(List[0][List[0].find(':') + 1 : ])\r
+    else:\r
+        ToolChain = CleanString(List[0])                    \r
+    Flag = CleanString(List[1])\r
+    \r
+    return (Family, ToolChain, Flag)\r
 \r
+#\r
+# Parse block of the components defined in dsc file\r
+# Return KeyValues [ ['component name', [lib1, lib2, lib3], [bo1, bo2, bo3], [pcd1, pcd2, pcd3]], ...]\r
+#\r
 def GetComponents(Lines, Key, KeyValues, CommentCharacter):\r
-    #KeyValues [ ['component name', [lib1, lib2, lib3], [bo1, bo2, bo3]], ...]\r
+    #KeyValues [ ['component name', [lib1, lib2, lib3], [bo1, bo2, bo3], [pcd1, pcd2, pcd3]], ...]\r
     Lines = Lines.split(DataType.TAB_SECTION_END, 1)[1]\r
-    findBlock = False\r
-    findLibraryClass = False\r
-    findBuildOption = False\r
+    (findBlock, findLibraryClass, findBuildOption, findPcdsFeatureFlag, findPcdsPatchableInModule, findPcdsFixedAtBuild, findPcdsDynamic, findPcdsDynamicEx) = (False, False, False, False, False, False, False, False)\r
     ListItem = None\r
     LibraryClassItem = []\r
     BuildOption = []\r
+    Pcd = []\r
     \r
     LineList = Lines.split('\n')\r
     for Line in LineList:\r
@@ -148,19 +121,40 @@ def GetComponents(Lines, Key, KeyValues, CommentCharacter):
 \r
         if findBlock:    \r
             if Line.find('<LibraryClass>') != -1:\r
-                findLibraryClass = True\r
+                (findLibraryClass, findBuildOption, findPcdsFeatureFlag, findPcdsPatchableInModule, findPcdsFixedAtBuild, findPcdsDynamic, findPcdsDynamicEx) = (True, False, False, False, False, False, False)\r
                 continue\r
             if Line.find('<BuildOptions>') != -1:\r
-                findBuildOption = True\r
+                (findLibraryClass, findBuildOption, findPcdsFeatureFlag, findPcdsPatchableInModule, findPcdsFixedAtBuild, findPcdsDynamic, findPcdsDynamicEx) = (False, True, False, False, False, False, False)\r
+                continue\r
+            if Line.find('<PcdsFeatureFlag>') != -1:\r
+                (findLibraryClass, findBuildOption, findPcdsFeatureFlag, findPcdsPatchableInModule, findPcdsFixedAtBuild, findPcdsDynamic, findPcdsDynamicEx) = (False, False, True, False, False, False, False)\r
+                continue\r
+            if Line.find('<PcdsPatchableInModule>') != -1:\r
+                (findLibraryClass, findBuildOption, findPcdsFeatureFlag, findPcdsPatchableInModule, findPcdsFixedAtBuild, findPcdsDynamic, findPcdsDynamicEx) = (False, False, False, True, False, False, False)\r
+                continue\r
+            if Line.find('<PcdsFixedAtBuild>') != -1:\r
+                (findLibraryClass, findBuildOption, findPcdsFeatureFlag, findPcdsPatchableInModule, findPcdsFixedAtBuild, findPcdsDynamic, findPcdsDynamicEx) = (False, False, False, False, True, False, False)\r
+                continue\r
+            if Line.find('<PcdsDynamic>') != -1:\r
+                (findLibraryClass, findBuildOption, findPcdsFeatureFlag, findPcdsPatchableInModule, findPcdsFixedAtBuild, findPcdsDynamic, findPcdsDynamicEx) = (False, False, False, False, False, True, False)\r
+                continue\r
+            if Line.find('<PcdsDynamicEx>') != -1:\r
+                (findLibraryClass, findBuildOption, findPcdsFeatureFlag, findPcdsPatchableInModule, findPcdsFixedAtBuild, findPcdsDynamic, findPcdsDynamicEx) = (False, False, False, False, False, False, True)\r
                 continue\r
             if Line.endswith('}'):\r
                 #find '}' at line tail\r
-                KeyValues.append([ListItem, LibraryClassItem, BuildOption])\r
+                KeyValues.append([ListItem, LibraryClassItem, BuildOption, Pcd])\r
                 findBlock = False\r
                 findLibraryClass = False\r
                 findBuildOption = False\r
+                findPcdsFeatureFlag = False\r
+                findPcdsPatchableInModule = False\r
+                findPcdsFixedAtBuild = False\r
+                findPcdsDynamic = False\r
+                findPcdsDynamicEx = False\r
                 LibraryClassItem = []\r
                 BuildOption = []\r
+                Pcd = []\r
                 continue\r
 \r
         if findBlock:\r
@@ -168,8 +162,18 @@ def GetComponents(Lines, Key, KeyValues, CommentCharacter):
                 LibraryClassItem.append(Line)\r
             elif findBuildOption:\r
                 BuildOption.append(Line)\r
+            elif findPcdsFeatureFlag:\r
+                Pcd.append((DataType.TAB_PCDS_FEATURE_FLAG, Line))\r
+            elif findPcdsPatchableInModule:\r
+                Pcd.append((DataType.TAB_PCDS_PATCHABLE_IN_MODULE, Line))\r
+            elif findPcdsFixedAtBuild:\r
+                Pcd.append((DataType.TAB_PCDS_FIXED_AT_BUILD, Line))\r
+            elif findPcdsDynamic:\r
+                Pcd.append((DataType.TAB_PCDS_DYNAMIC, Line))\r
+            elif findPcdsDynamicEx:\r
+                Pcd.append((DataType.TAB_PCDS_DYNAMIC_EX, Line))\r
         else:\r
-            KeyValues.append([ListItem, [], []])\r
+            KeyValues.append([ListItem, [], [], []])\r
         \r
     return True\r
 \r
@@ -231,11 +235,11 @@ def CleanString(Line, CommentCharacter = DataType.TAB_COMMENT_SPLIT):
     #remove comments\r
     Line = Line.split(CommentCharacter, 1)[0];\r
     #replace '\\', '\' with '/'\r
-    Line = Line.replace('\\', '/')\r
-    Line = Line.replace('//', '/')\r
+    #Line = Line.replace('\\', '/')\r
+    #Line = Line.replace('//', '/')\r
     #remove ${WORKSPACE}\r
-    Line = Line.replace(DataType.TAB_WORKSPACE1, '')\r
-    Line = Line.replace(DataType.TAB_WORKSPACE2, '')\r
+    #Line = Line.replace(DataType.TAB_WORKSPACE1, '')\r
+    #Line = Line.replace(DataType.TAB_WORKSPACE2, '')\r
     \r
     #remove whitespace again\r
     Line = Line.strip();\r