1. Add -m and -s to support only scanning meta-data files or source code files
authorhche10x <hche10x@7335b38e-4728-0410-8992-fb3ffe349368>
Thu, 5 Jun 2008 05:51:01 +0000 (05:51 +0000)
committerhche10x <hche10x@7335b38e-4728-0410-8992-fb3ffe349368>
Thu, 5 Jun 2008 05:51:01 +0000 (05:51 +0000)
2. Add -r to support specifying report file name on command line
3. Ignore the library of BASE type for error code 10002 and 10003
4. Stop raise error for most parsing error, remain some for critical errors

git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@1249 7335b38e-4728-0410-8992-fb3ffe349368

Source/Python/Common/DecClassObject.py
Source/Python/Common/DscClassObject.py
Source/Python/Common/EdkLogger.py
Source/Python/Common/InfClassObject.py
Source/Python/Common/Parsing.py
Source/Python/Ecc/Check.py
Source/Python/Ecc/Ecc.py

index 1423113..b95ff62 100644 (file)
@@ -206,7 +206,7 @@ class Dec(DecObject):
                         CurrentSection = ItemList[0]\r
                     else:\r
                         if CurrentSection != ItemList[0]:\r
-                            EdkLogger.error("Parser", PARSER_ERROR, "Different section names '%s' and '%s' are found in one section definition, this is not allowed." % (CurrentSection, ItemList[0]), File=Filename, Line=LineNo)\r
+                            EdkLogger.error("Parser", PARSER_ERROR, "Different section names '%s' and '%s' are found in one section definition, this is not allowed." % (CurrentSection, ItemList[0]), File=Filename, Line=LineNo, RaiseError = EdkLogger.IsRaiseError)\r
                     if CurrentSection.upper() not in self.KeyList:\r
                         RaiseParserError(Line, CurrentSection, Filename, '', LineNo)\r
                     ItemList.append('')\r
@@ -215,7 +215,7 @@ class Dec(DecObject):
                         RaiseParserError(Line, CurrentSection, Filename, '', LineNo)\r
                     else:\r
                         if ItemList[1] != '' and ItemList[1].upper() not in ARCH_LIST_FULL:\r
-                            EdkLogger.error("Parser", PARSER_ERROR, "Invalid Arch definition '%s' found" % ItemList[1], File=Filename, Line=LineNo)\r
+                            EdkLogger.error("Parser", PARSER_ERROR, "Invalid Arch definition '%s' found" % ItemList[1], File=Filename, Line=LineNo, RaiseError = EdkLogger.IsRaiseError)\r
                         ArchList.append(ItemList[1].upper())\r
                         ThirdList.append(ItemList[2])\r
 \r
@@ -226,7 +226,7 @@ class Dec(DecObject):
             #\r
             if CurrentSection == TAB_UNKNOWN:\r
                 ErrorMsg = "%s is not in any defined section" % Line\r
-                EdkLogger.error("Parser", PARSER_ERROR, ErrorMsg, File=Filename, Line=LineNo)\r
+                EdkLogger.error("Parser", PARSER_ERROR, ErrorMsg, File=Filename, Line=LineNo, RaiseError = EdkLogger.IsRaiseError)\r
 \r
             #\r
             # Add a section item\r
index 3f0535d..fdf3675 100755 (executable)
@@ -606,7 +606,7 @@ class Dsc(DscObject):
             (Status, SkuInfoList) = self.GenSkuInfoList(Key[6], self.Platform.SkuInfos.SkuInfoList, '', '', '', '', '', Key[2])\r
             if Status == False:\r
                 ErrorMsg = "The SKUID '%s' used in section '%s' is not defined in section [SkuIds]" % (SkuInfoList, Type)\r
-                EdkLogger.error("DSC File Parser", PARSER_ERROR, ErrorMsg, ContainerFile)\r
+                EdkLogger.error("DSC File Parser", PARSER_ERROR, ErrorMsg, ContainerFile, RaiseError = EdkLogger.IsRaiseError)\r
             Pcd = PcdClass(Key[0], '', Key[1], Key[3], Key[4], Key[2], Key[5], [], SkuInfoList, [])\r
             Pcd.SupArchList = Pcds[Key]\r
             self.Platform.DynamicPcdBuildDefinitions.append(Pcd)\r
@@ -663,7 +663,7 @@ class Dsc(DscObject):
             (Status, SkuInfoList) = self.GenSkuInfoList(Key[8], self.Platform.SkuInfos.SkuInfoList, Key[2], Key[3], Key[4], Key[5], '', '')\r
             if Status == False:\r
                 ErrorMsg = "The SKUID '%s' used in section '%s' is not defined in section [SkuIds]" % (SkuInfoList, Type)\r
-                EdkLogger.error("DSC File Parser", PARSER_ERROR, ErrorMsg, ContainerFile)\r
+                EdkLogger.error("DSC File Parser", PARSER_ERROR, ErrorMsg, ContainerFile, RaiseError = EdkLogger.IsRaiseError)\r
             Pcd = PcdClass(Key[0], '', Key[1], '', Key[6], Key[5], Key[7], [], SkuInfoList, [])\r
             Pcd.SupArchList = Pcds[Key]\r
             self.Platform.DynamicPcdBuildDefinitions.append(Pcd)\r
@@ -720,7 +720,7 @@ class Dsc(DscObject):
             (Status, SkuInfoList) = self.GenSkuInfoList(Key[5], self.Platform.SkuInfos.SkuInfoList, '', '', '', '', Key[2], '')\r
             if Status == False:\r
                 ErrorMsg = "The SKUID '%s' used in section '%s' is not defined in section [SkuIds]" % (SkuInfoList, Type)\r
-                EdkLogger.error("DSC File Parser", PARSER_ERROR, ErrorMsg, ContainerFile)\r
+                EdkLogger.error("DSC File Parser", PARSER_ERROR, ErrorMsg, ContainerFile, RaiseError = EdkLogger.IsRaiseError)\r
             Pcd = PcdClass(Key[0], '', Key[1], '', Key[3], '', Key[4], [], SkuInfoList, [])\r
             Pcd.SupArchList = Pcds[Key]\r
             self.Platform.DynamicPcdBuildDefinitions.append(Pcd)\r
@@ -963,7 +963,7 @@ class Dsc(DscObject):
         (Value1, Value2, Value3, Model, StartColumn, EndColumn, Enabled) = ('', '', '', -1, -1, -1, 0)\r
         if IfDefList == []:\r
             ErrorMsg = 'Not suited conditional statement in file %s' % Filename\r
-            EdkLogger.error("DSC File Parser", PARSER_ERROR, ErrorMsg, Filename)\r
+            EdkLogger.error("DSC File Parser", PARSER_ERROR, ErrorMsg, Filename, RaiseError = EdkLogger.IsRaiseError)\r
         else:\r
             #\r
             # Get New Dsc item ID\r
@@ -1082,7 +1082,7 @@ class Dsc(DscObject):
                         CurrentSection = ItemList[0]\r
                     else:\r
                         if CurrentSection != ItemList[0]:\r
-                            EdkLogger.error("Parser", PARSER_ERROR, "Different section names '%s' and '%s' are found in one section definition, this is not allowed." % (CurrentSection, ItemList[0]), File=Filename, Line=LineNo)\r
+                            EdkLogger.error("Parser", PARSER_ERROR, "Different section names '%s' and '%s' are found in one section definition, this is not allowed." % (CurrentSection, ItemList[0]), File=Filename, Line=LineNo, RaiseError = EdkLogger.IsRaiseError)\r
                     if CurrentSection.upper() not in self.KeyList:\r
                         RaiseParserError(Line, CurrentSection, Filename, '', LineNo)\r
                     ItemList.append('')\r
@@ -1091,7 +1091,7 @@ class Dsc(DscObject):
                         RaiseParserError(Line, CurrentSection, Filename, '', LineNo)\r
                     else:\r
                         if ItemList[1] != '' and ItemList[1].upper() not in ARCH_LIST_FULL:\r
-                            EdkLogger.error("Parser", PARSER_ERROR, "Invalid Arch definition '%s' found" % ItemList[1], File=Filename, Line=LineNo)\r
+                            EdkLogger.error("Parser", PARSER_ERROR, "Invalid Arch definition '%s' found" % ItemList[1], File=Filename, Line=LineNo, RaiseError = EdkLogger.IsRaiseError)\r
                         ArchList.append(ItemList[1].upper())\r
                         ThirdList.append(ItemList[2])\r
 \r
@@ -1102,7 +1102,7 @@ class Dsc(DscObject):
             #\r
             if CurrentSection == TAB_UNKNOWN:\r
                 ErrorMsg = "%s is not in any defined section" % Line\r
-                EdkLogger.error("Parser", PARSER_ERROR, ErrorMsg, File=Filename, Line=LineNo)\r
+                EdkLogger.error("Parser", PARSER_ERROR, ErrorMsg, File=Filename, Line=LineNo, RaiseError = EdkLogger.IsRaiseError)\r
 \r
             #\r
             # Add a section item\r
index a4dda36..184ff7f 100644 (file)
@@ -161,7 +161,7 @@ info    = _InfoLogger.info
 #   @param  RaiseError  Raise an exception to break the tool's executuion if
 #                       it's True. This is the default behavior.
 #
-def error(ToolName, ErrorCode, Message=None, File=None, Line=None, ExtraData=None, RaiseError=True):
+def error(ToolName, ErrorCode, Message=None, File=None, Line=None, ExtraData=None, RaiseError=IsRaiseError):
     # if no tool name given, use caller's source file name as tool name
     if ToolName == None or ToolName == "":
         ToolName = os.path.basename(traceback.extract_stack()[-2][0])
index 3710935..893aeb1 100755 (executable)
@@ -398,7 +398,7 @@ class Inf(InfObject):
                         CurrentSection = ItemList[0]\r
                     else:\r
                         if CurrentSection != ItemList[0]:\r
-                            EdkLogger.error("Parser", PARSER_ERROR, "Different section names '%s' and '%s' are found in one section definition, this is not allowed." % (CurrentSection, ItemList[0]), File=Filename, Line=LineNo)\r
+                            EdkLogger.error("Parser", PARSER_ERROR, "Different section names '%s' and '%s' are found in one section definition, this is not allowed." % (CurrentSection, ItemList[0]), File=Filename, Line=LineNo, RaiseError = EdkLogger.IsRaiseError)\r
                     if CurrentSection.upper() not in self.KeyList:\r
                         RaiseParserError(Line, CurrentSection, Filename, '', LineNo)\r
                     ItemList.append('')\r
@@ -407,7 +407,7 @@ class Inf(InfObject):
                         RaiseParserError(Line, CurrentSection, Filename, '', LineNo)\r
                     else:\r
                         if ItemList[1] != '' and ItemList[1].upper() not in ARCH_LIST_FULL:\r
-                            EdkLogger.error("Parser", PARSER_ERROR, "Invalid Arch definition '%s' found" % ItemList[1], File=Filename, Line=LineNo)\r
+                            EdkLogger.error("Parser", PARSER_ERROR, "Invalid Arch definition '%s' found" % ItemList[1], File=Filename, Line=LineNo, RaiseError = EdkLogger.IsRaiseError)\r
                         ArchList.append(ItemList[1].upper())\r
                         ThirdList.append(ItemList[2])\r
 \r
@@ -418,7 +418,7 @@ class Inf(InfObject):
             #\r
             if CurrentSection == TAB_UNKNOWN:\r
                 ErrorMsg = "%s is not in any defined section" % Line\r
-                EdkLogger.error("Parser", PARSER_ERROR, ErrorMsg, File=Filename, Line=LineNo)\r
+                EdkLogger.error("Parser", PARSER_ERROR, ErrorMsg, File=Filename, Line=LineNo, RaiseError = EdkLogger.IsRaiseError)\r
 \r
             #\r
             # Add a section item\r
@@ -578,7 +578,7 @@ class Inf(InfObject):
                     if len(List) == 2:\r
                         ModuleHeader.CustomMakefile[CleanString(List[0])] = CleanString(List[1])\r
                     else:\r
-                        RaiseParserError(Item, 'CUSTOM_MAKEFILE of Defines', File, 'CUSTOM_MAKEFILE=<Family>|<Filename>', D[2])\r
+                        RaiseParserError(D[1], 'CUSTOM_MAKEFILE of Defines', File, 'CUSTOM_MAKEFILE=<Family>|<Filename>', D[2])\r
                 elif D[0] == TAB_INF_DEFINES_ENTRY_POINT:\r
                     Image = ModuleExternImageClass()\r
                     Image.ModuleEntryPoint = CleanString(D[1])\r
@@ -628,8 +628,7 @@ class Inf(InfObject):
                 if ModuleHeader.ComponentType in gComponentType2ModuleType:\r
                     ModuleHeader.ModuleType = gComponentType2ModuleType[ModuleHeader.ComponentType]\r
                 elif ModuleHeader.ComponentType != '':\r
-                    EdkLogger.error("Parser", PARSER_ERROR, "Unsupported R8 component type [%s]" % ModuleHeader.ComponentType,\r
-                                    ExtraData=File)\r
+                    EdkLogger.error("Parser", PARSER_ERROR, "Unsupported R8 component type [%s]" % ModuleHeader.ComponentType, ExtraData=File, RaiseError = EdkLogger.IsRaiseError)\r
                 \r
             self.Module.Header[Arch] = ModuleHeader\r
     \r
index 71cf6d5..0bb0e11 100644 (file)
@@ -380,13 +380,20 @@ def CheckPcdTokenInfo(TokenInfoString, Section, File, LineNo = -1):
 # @retval (TokenInfo[1], TokenInfo[0], List[1], List[2], List[3], Type)\r
 #\r
 def GetPcd(Item, Type, ContainerFile, LineNo = -1):\r
+    TokenGuid, TokenName, Value, MaximumDatumSize, Token = '', '', '', '', ''\r
     List = GetSplitValueList(Item + TAB_VALUE_SPLIT * 2)\r
+    \r
     if len(List) < 4 or len(List) > 6:\r
         RaiseParserError(Item, 'Pcds' + Type, ContainerFile, '<PcdTokenSpaceGuidCName>.<TokenCName>|<Value>[|<Type>|<MaximumDatumSize>]', LineNo)\r
-    CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile, LineNo)\r
-    TokenInfo = GetSplitValueList(List[0], TAB_SPLIT)\r
+    else:\r
+        Value = List[1]\r
+        MaximumDatumSize = List[2]\r
+        Token = List[3]\r
+        \r
+    if CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile, LineNo):\r
+        (TokenGuid, TokenName) = GetSplitValueList(List[0], TAB_SPLIT)\r
     \r
-    return (TokenInfo[1], TokenInfo[0], List[1], List[2], List[3], Type)\r
+    return (TokenName, TokenGuid, Value, MaximumDatumSize, Token, Type)\r
 \r
 ## Get FeatureFlagPcd\r
 #\r
@@ -398,14 +405,16 @@ def GetPcd(Item, Type, ContainerFile, LineNo = -1):
 # @retval (TokenInfo[1], TokenInfo[0], List[1], Type)\r
 #\r
 def GetFeatureFlagPcd(Item, Type, ContainerFile, LineNo = -1):\r
+    TokenGuid, TokenName, Value = '', '', ''\r
     List = GetSplitValueList(Item)\r
     if len(List) != 2:\r
         RaiseParserError(Item, 'Pcds' + Type, ContainerFile, '<PcdTokenSpaceGuidCName>.<TokenCName>|TRUE/FALSE', LineNo)\r
-\r
-    CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile, LineNo)\r
-    TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
+    else:\r
+        Value = List[1]\r
+    if CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile, LineNo):\r
+        (TokenGuid, TokenName) = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
     \r
-    return (TokenInfo[1], TokenInfo[0], List[1], Type)\r
+    return (TokenName, TokenGuid, Value, Type)\r
 \r
 ## Get DynamicDefaultPcd\r
 #\r
@@ -417,14 +426,18 @@ def GetFeatureFlagPcd(Item, Type, ContainerFile, LineNo = -1):
 # @retval (TokenInfo[1], TokenInfo[0], List[1], List[2], List[3], Type)\r
 #\r
 def GetDynamicDefaultPcd(Item, Type, ContainerFile, LineNo = -1):\r
+    TokenGuid, TokenName, Value, DatumTyp, MaxDatumSize = '', '', '', '', ''\r
     List = GetSplitValueList(Item + TAB_VALUE_SPLIT * 2)\r
     if len(List) < 4 or len(List) > 8:\r
         RaiseParserError(Item, 'Pcds' + Type, ContainerFile, '<PcdTokenSpaceGuidCName>.<TokenCName>|<Value>[|<DatumTyp>[|<MaxDatumSize>]]', LineNo)\r
-\r
-    CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile, LineNo)\r
-    TokenInfo = GetSplitValueList(List[0], TAB_SPLIT)\r
+    else:\r
+        Value = List[1]\r
+        DatumTyp = List[2]\r
+        MaxDatumSize = List[3]\r
+    if CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile, LineNo):\r
+        (TokenGuid, TokenName) = GetSplitValueList(List[0], TAB_SPLIT)\r
     \r
-    return (TokenInfo[1], TokenInfo[0], List[1], List[2], List[3], Type)\r
+    return (TokenName, TokenGuid, Value, DatumTyp, MaxDatumSize, Type)\r
 \r
 ## Get DynamicHiiPcd\r
 #\r
@@ -436,14 +449,16 @@ def GetDynamicDefaultPcd(Item, Type, ContainerFile, LineNo = -1):
 # @retval (TokenInfo[1], TokenInfo[0], List[1], List[2], List[3], List[4], List[5], Type)\r
 #\r
 def GetDynamicHiiPcd(Item, Type, ContainerFile, LineNo = -1):\r
+    TokenGuid, TokenName, L1, L2, L3, L4, L5 = '', '', '', '', '', '', ''\r
     List = GetSplitValueList(Item + TAB_VALUE_SPLIT * 2)\r
     if len(List) < 6 or len(List) > 8:\r
         RaiseParserError(Item, 'Pcds' + Type, ContainerFile, '<PcdTokenSpaceGuidCName>.<TokenCName>|<String>|<VariableGuidCName>|<VariableOffset>[|<DefaultValue>[|<MaximumDatumSize>]]', LineNo)\r
-\r
-    CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile, LineNo)\r
-    TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
+    else:\r
+        L1, L2, L3, L4, L5 = List[1], List[2], List[3], List[4], List[5]\r
+    if CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile, LineNo):\r
+        (TokenGuid, TokenName) = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
     \r
-    return (TokenInfo[1], TokenInfo[0], List[1], List[2], List[3], List[4], List[5], Type)\r
+    return (TokenName, TokenGuid, L1, L2, L3, L4, L5, Type)\r
 \r
 ## Get DynamicVpdPcd\r
 #\r
@@ -455,14 +470,16 @@ def GetDynamicHiiPcd(Item, Type, ContainerFile, LineNo = -1):
 # @retval (TokenInfo[1], TokenInfo[0], List[1], List[2], Type)\r
 #\r
 def GetDynamicVpdPcd(Item, Type, ContainerFile, LineNo = -1):\r
+    TokenGuid, TokenName, L1, L2 = '', '', '', ''\r
     List = GetSplitValueList(Item + TAB_VALUE_SPLIT)\r
     if len(List) < 3 or len(List) > 4:\r
         RaiseParserError(Item, 'Pcds' + Type, ContainerFile, '<PcdTokenSpaceGuidCName>.<TokenCName>|<VpdOffset>[|<MaximumDatumSize>]', LineNo)\r
-\r
-    CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile, LineNo)\r
-    TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
+    else:\r
+        L1, L2 = List[1], List[2]\r
+    if CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile, LineNo):\r
+        (TokenGuid, TokenName) = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
     \r
-    return (TokenInfo[1], TokenInfo[0], List[1], List[2], Type)\r
+    return (TokenName, TokenGuid, L1, L2, Type)\r
 \r
 ## GetComponent\r
 #\r
@@ -772,7 +789,8 @@ def GetPackage(Item, ContainerFile, FileRelativePath, LineNo = -1):
 #\r
 def GetPcdOfInf(Item, Type, File, LineNo):\r
     Format = '<TokenSpaceGuidCName>.<PcdCName>[|<Value>]'\r
-    InfType = ''\r
+    TokenGuid, TokenName, Value, InfType = '', '', '', ''\r
+    \r
     if Type == TAB_PCDS_FIXED_AT_BUILD:\r
         InfType = TAB_INF_FIXED_PCD\r
     elif Type == TAB_PCDS_PATCHABLE_IN_MODULE:\r
@@ -786,11 +804,16 @@ def GetPcdOfInf(Item, Type, File, LineNo):
     List = GetSplitValueList(Item + DataType.TAB_VALUE_SPLIT)\r
     if len(List) < 2 or len(List) > 3:\r
         RaiseParserError(Item, InfType, File, Format, LineNo)\r
+    else:\r
+        Value = List[1]\r
     TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
     if len(TokenInfo) != 2:\r
         RaiseParserError(Item, InfType, File, Format, LineNo)\r
+    else:\r
+        TokenGuid = TokenInfo[0]\r
+        TokenName = TokenInfo[1]\r
 \r
-    return (TokenInfo[0], TokenInfo[1], List[1], Type)\r
+    return (TokenGuid, TokenName, Value, Type)\r
 \r
     \r
 ## Get Pcd Values of Dec\r
@@ -800,14 +823,22 @@ def GetPcdOfInf(Item, Type, File, LineNo):
 #\r
 def GetPcdOfDec(Item, Type, File, LineNo = -1):\r
     Format = '<TokenSpaceGuidCName>.<PcdCName>|<Value>|<DatumType>|<Token>'\r
+    TokenGuid, TokenName, Value, DatumType, Token = '', '', '', '', ''\r
     List = GetSplitValueList(Item)\r
     if len(List) != 4:\r
         RaiseParserError(Item, 'Pcds' + Type, File, Format, LineNo)\r
+    else:\r
+        Value = List[1]\r
+        DatumType = List[2]\r
+        Token = List[3]\r
     TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
     if len(TokenInfo) != 2:\r
         RaiseParserError(Item, 'Pcds' + Type, File, Format, LineNo)\r
+    else:\r
+        TokenGuid = TokenInfo[0]\r
+        TokenName = TokenInfo[1]\r
     \r
-    return (TokenInfo[0], TokenInfo[1], List[1], List[2], List[3], Type)\r
+    return (TokenGuid, TokenName, Value, DatumType, Token, Type)\r
 \r
 ## Parse DEFINE statement\r
 #\r
index 0b82f0b..05af5dc 100644 (file)
@@ -457,13 +457,18 @@ class Check(object):
     def MetaDataFileCheckLibraryInstance(self):\r
         if EccGlobalData.gConfig.MetaDataFileCheckLibraryInstance == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1' or EccGlobalData.gConfig.CheckAll == '1':\r
             EdkLogger.quiet("Checking for library instance type issue ...")\r
-            SqlCommand = """select ID, Value2 from Inf where Value1 = 'LIBRARY_CLASS' and Model = %s group by BelongsToFile""" % MODEL_META_DATA_HEADER\r
+            #SqlCommand = """select ID, Value2 from Inf where Value1 = 'LIBRARY_CLASS' and Model = %s group by BelongsToFile""" % MODEL_META_DATA_HEADER\r
+            SqlCommand = """select A.ID, A.Value2, B.Value2 from Inf as A left join Inf as B\r
+                            where A.Value1 = 'LIBRARY_CLASS' and A.Model = %s \r
+                            and B.Value1 = 'MODULE_TYPE' and B.Model = %s and A.BelongsToFile = B.BelongsToFile \r
+                            group by A.BelongsToFile""" % (MODEL_META_DATA_HEADER, MODEL_META_DATA_HEADER)\r
             RecordSet = EccGlobalData.gDb.TblInf.Exec(SqlCommand)\r
             LibraryClasses = {}\r
             for Record in RecordSet:\r
                 List = Record[1].split('|', 1)\r
                 if len(List) != 2:\r
-                    EccGlobalData.gDb.TblReport.Insert(ERROR_META_DATA_FILE_CHECK_LIBRARY_INSTANCE_2, OtherMsg = "The Library Class '%s' does not specify its supported module types" % (List[0]), BelongsToTable = 'Inf', BelongsToItem = Record[0])\r
+                    if Record[2] != 'BASE':\r
+                        EccGlobalData.gDb.TblReport.Insert(ERROR_META_DATA_FILE_CHECK_LIBRARY_INSTANCE_2, OtherMsg = "The Library Class '%s' does not specify its supported module types" % (List[0]), BelongsToTable = 'Inf', BelongsToItem = Record[0])\r
                 else:\r
                     LibraryClasses[List[0]] = List[1]\r
             SqlCommand = """select A.ID, A.Value1, B.Value2 from Inf as A left join Inf as B \r
@@ -471,7 +476,7 @@ class Check(object):
                             % (MODEL_EFI_LIBRARY_CLASS, 'MODULE_TYPE', MODEL_META_DATA_HEADER)\r
             RecordSet = EccGlobalData.gDb.TblInf.Exec(SqlCommand)\r
             for Record in RecordSet:\r
-                if Record[1] in LibraryClasses and LibraryClasses[Record[1]].find(Record[2]) < 0:\r
+                if Record[1] in LibraryClasses and LibraryClasses[Record[1]].find(Record[2]) < 0 and Record[2] != 'BASE':\r
                     EccGlobalData.gDb.TblReport.Insert(ERROR_META_DATA_FILE_CHECK_LIBRARY_INSTANCE_1, OtherMsg = "The type of Library Class '%s' defined in Inf file does not match the type of the module" % (Record[1]), BelongsToTable = 'Inf', BelongsToItem = Record[0])\r
     #\r
     # Check whether a Library Instance has been defined for all dependent library classes\r
index f159f95..44c24d8 100644 (file)
@@ -45,7 +45,10 @@ class Ecc(object):
         \r
         self.ConfigFile = 'config.ini'\r
         self.OutputFile = 'output.txt'\r
+        self.ReportFile = 'Report.csv'\r
         self.IsInit = True\r
+        self.ScanSourceCode = True\r
+        self.ScanMetaData = True\r
         \r
         #\r
         # Parse the options and args\r
@@ -100,10 +103,12 @@ class Ecc(object):
         # Build database\r
         #\r
         if self.IsInit:\r
-            EdkLogger.quiet("Building database for source code ...")\r
-            c.CollectSourceCodeDataIntoDB(EccGlobalData.gTarget)\r
-            EdkLogger.quiet("Building database for source code done!")\r
-            self.BuildMetaDataFileDatabase()\r
+            if self.ScanSourceCode:\r
+                EdkLogger.quiet("Building database for source code ...")\r
+                c.CollectSourceCodeDataIntoDB(EccGlobalData.gTarget)\r
+            if self.ScanMetaData:\r
+                EdkLogger.quiet("Building database for source code done!")\r
+                self.BuildMetaDataFileDatabase()\r
         \r
         EccGlobalData.gIdentifierTableList = GetTableList((MODEL_FILE_C, MODEL_FILE_H), 'Identifier', EccGlobalData.gDb)\r
     \r
@@ -174,7 +179,7 @@ class Ecc(object):
     #\r
     def GenReport(self):\r
         EdkLogger.quiet("Generating report ...")\r
-        EccGlobalData.gDb.TblReport.ToCSV()\r
+        EccGlobalData.gDb.TblReport.ToCSV(self.ReportFile)\r
         EdkLogger.quiet("Generating report done!")\r
     \r
     ## ParseOption\r
@@ -208,6 +213,8 @@ class Ecc(object):
             self.ConfigFile = Options.ConfigFile\r
         if Options.OutputFile != None:\r
             self.OutputFile = Options.OutputFile\r
+        if Options.ReportFile != None:\r
+            self.ReportFile = Options.ReportFile\r
         if Options.Target != None:\r
             EccGlobalData.gTarget = os.path.normpath(Options.Target)\r
         else:\r
@@ -215,6 +222,12 @@ class Ecc(object):
             EccGlobalData.gTarget = os.path.normpath(os.getenv("WORKSPACE"))\r
         if Options.keepdatabase != None:\r
             self.IsInit = False\r
+        if Options.metadata != None and Options.sourcecode != None:\r
+            EdkLogger.error("ECC", BuildToolError.OPTION_CONFLICT, ExtraData="-m and -s can't be specified at one time")\r
+        if Options.metadata != None:\r
+            self.ScanSourceCode = False\r
+        if Options.sourcecode != None:\r
+            self.ScanMetaData = False\r
            \r
     ## SetLogLevel\r
     #\r
@@ -247,7 +260,10 @@ class Ecc(object):
             help="Specify a configuration file. Defaultly use config.ini under ECC tool directory.")\r
         Parser.add_option("-o", "--outfile filename", action="store", type="string", dest="OutputFile",\r
             help="Specify the name of an output file, if and only if one filename was specified.")\r
-    \r
+        Parser.add_option("-r", "--reportfile filename", action="store", type="string", dest="ReportFile",\r
+            help="Specify the name of an report file, if and only if one filename was specified.")\r
+        Parser.add_option("-m", "--metadata", action="store_true", type=None, help="Only scan meta-data files information if this option is specified.")\r
+        Parser.add_option("-s", "--sourcecode", action="store_true", type=None, help="Only scan source code files information if this option is specified.")\r
         Parser.add_option("-k", "--keepdatabase", action="store_true", type=None, help="The existing Ecc database will not be cleaned except report information if this option is specified.")\r
         Parser.add_option("-l", "--log filename", action="store", dest="LogFile", help="""If specified, the tool should emit the changes that \r
                                                                                           were made by the tool after printing the result message. \r