1. Add !include statement support in .dsc file
authorhche10x <hche10x@7335b38e-4728-0410-8992-fb3ffe349368>
Wed, 22 Aug 2007 09:01:07 +0000 (09:01 +0000)
committerhche10x <hche10x@7335b38e-4728-0410-8992-fb3ffe349368>
Wed, 22 Aug 2007 09:01:07 +0000 (09:01 +0000)
2. Add file existing check support in .dec/.dsc/.inf files
3. Add file type check support in .dec/.dsc/.inf files
4. Add line no information for error message

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

Source/Python/Common/DecClassObject.py
Source/Python/Common/DscClassObject.py
Source/Python/Common/EdkIIWorkspaceBuild.py
Source/Python/Common/InfClassObject.py
Source/Python/Common/String.py

index 1a1eb62..ff0a4a1 100644 (file)
@@ -47,11 +47,12 @@ class DecContents(DecObject):
         self.PcdsDynamicEx = []\r
 \r
 class Dec(DecObject):\r
-    def __init__(self, filename = None, isMergeAllArches = False, isToPackage = False):\r
+    def __init__(self, filename = None, isMergeAllArches = False, isToPackage = False, WorkspaceDir = None):\r
         self.Identification = Identification()\r
         self.Defines = DecDefines()\r
         self.UserExtensions = ''\r
         self.Package = PackageClass()\r
+        self.WorkspaceDir = WorkspaceDir\r
         \r
         self.Contents = {}\r
         for key in DataType.ARCH_LIST_FULL:\r
@@ -199,9 +200,7 @@ class Dec(DecObject):
                     ErrorMsg = "Wrong statement '%s' found in section LibraryClasses in file '%s', correct format is '<CName>=<GuidValue>'" % (Item, self.Package.Header.FullPath) \r
                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
                 else:\r
-#                    if List[1] != '' and CheckFileType(List[1], '.Inf') == False:\r
-#                        ErrorMsg = "Wrong library instance '%s' found for LibraryClasses '%s' in file '%s', it is NOT a valid INF file" % (List[1], List[0], self.Package.Header.FullPath) \r
-#                        raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                    CheckFileExist(self.WorkspaceDir, os.path.join(self.Identification.FileRelativePath, List[1]), self.Package.Header.FullPath, 'LibraryClasses', Item[0])\r
                     if Item[1] == ['']:\r
                             Item[1] = DataType.SUP_MODULE_LIST\r
                     MergeArches(LibraryClasses, (List[0], List[1]) + tuple(Item[1]), Arch)\r
@@ -322,5 +321,5 @@ class Dec(DecObject):
 if __name__ == '__main__':\r
     w = os.getenv('WORKSPACE')\r
     f = os.path.join(w, 'Nt32Pkg/Nt32Pkg.dec')\r
-    p = Dec(os.path.normpath(f), True, True)\r
+    p = Dec(os.path.normpath(f), True, True, w)\r
     p.ShowPackage()\r
index 2814c52..1f5a5b8 100644 (file)
@@ -63,12 +63,13 @@ class DscContents(DscObject):
         self.BuildOptions = []\r
 \r
 class Dsc(DscObject):\r
-    def __init__(self, Filename = None, IsMergeAllArches = False, IsToPlatform = False):\r
+    def __init__(self, Filename = None, IsMergeAllArches = False, IsToPlatform = False, WorkspaceDir = None):\r
         self.Identification = Identification()\r
         self.Defines = DscDefines()\r
         self.Contents = {}\r
         self.UserExtensions = ''\r
         self.Platform = PlatformClass()\r
+        self.WorkspaceDir = WorkspaceDir\r
 \r
         for Arch in DataType.ARCH_LIST_FULL:\r
             self.Contents[Arch] = DscContents()\r
@@ -166,8 +167,13 @@ class Dsc(DscObject):
         for Arch in DataType.ARCH_LIST:\r
             for Item in self.Contents[Arch].BuildOptions:\r
                 if GenInclude(Item, IncludeFiles, Arch):\r
+                    IncludeFile = CleanString(Item[Item.upper().find(DataType.TAB_INCLUDE.upper() + ' ') + len(DataType.TAB_INCLUDE + ' ') : ])\r
+                    CheckFileExist(self.WorkspaceDir, IncludeFile, self.Platform.Header.FullPath, 'BuildOptions', Item)\r
+                    for NewItem in open(WorkspaceFile(self.WorkspaceDir, IncludeFile), 'r').readlines():\r
+                        MergeArches(BuildOptions, GetBuildOption(NewItem), Arch)\r
                     continue\r
                 MergeArches(BuildOptions, GetBuildOption(Item), Arch)\r
+        \r
         self.Platform.BuildOptions.IncludeFiles = IncludeFiles\r
         for Key in BuildOptions.keys():\r
             BuildOption = BuildOptionClass(Key[0], Key[1], Key[2])\r
@@ -180,6 +186,15 @@ class Dsc(DscObject):
         for Arch in DataType.ARCH_LIST:\r
             for Item in self.Contents[Arch].SkuIds:\r
                 if GenInclude(Item, IncludeFiles, Arch):\r
+                    IncludeFile = CleanString(Item[Item.upper().find(DataType.TAB_INCLUDE.upper() + ' ') + len(DataType.TAB_INCLUDE + ' ') : ])\r
+                    CheckFileExist(self.WorkspaceDir, IncludeFile, self.Platform.Header.FullPath, 'SkuIds', Item)\r
+                    for NewItem in open(WorkspaceFile(self.WorkspaceDir, IncludeFile), 'r').readlines():\r
+                        List = GetSplitValueList(NewItem)\r
+                        if len(List) != 2:\r
+                            ErrorMsg = "Wrong statement '%s' found in section SkuIds in file '%s', correct format is '<Integer>|<UiName>'" % (Item, self.Platform.Header.FullPath)\r
+                            raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                        else:\r
+                            self.Platform.SkuInfos.SkuInfoList[List[1]] = List[0]\r
                     continue\r
                 List = GetSplitValueList(Item)\r
                 if len(List) != 2:\r
@@ -196,6 +211,10 @@ class Dsc(DscObject):
         for Arch in DataType.ARCH_LIST:\r
             for Item in self.Contents[Arch].Libraries:\r
                 if GenInclude(Item, IncludeFiles, Arch):\r
+                    IncludeFile = CleanString(Item[Item.upper().find(DataType.TAB_INCLUDE.upper() + ' ') + len(DataType.TAB_INCLUDE + ' ') : ])\r
+                    CheckFileExist(self.WorkspaceDir, IncludeFile, self.Platform.Header.FullPath, 'Libraries', Item)\r
+                    for NewItem in open(WorkspaceFile(self.WorkspaceDir, IncludeFile), 'r').readlines():\r
+                        MergeArches(Libraries, Item, Arch)\r
                     continue\r
                 Status = GenDefines(Item, Arch, Defines)\r
                 if Status == 0:       # Find DEFINE statement\r
@@ -220,6 +239,11 @@ class Dsc(DscObject):
         for Arch in DataType.ARCH_LIST:\r
             for Item in self.Contents[Arch].LibraryClasses:\r
                 if GenInclude(Item[0], IncludeFiles, Arch):\r
+                    IncludeFile = CleanString(Item[0][Item[0].upper().find(DataType.TAB_INCLUDE.upper() + ' ') + len(DataType.TAB_INCLUDE + ' ') : ])\r
+                    IncludeFilePath = WorkspaceFile(self.WorkspaceDir, IncludeFile)\r
+                    CheckFileExist(self.WorkspaceDir, IncludeFile, self.Platform.Header.FullPath, 'LibraryClasses', Item[0])\r
+                    for NewItem in open(IncludeFilePath, 'r').readlines():\r
+                        MergeArches(LibraryClasses, self.GenLibraryClass([NewItem, Item[1]], IncludeFilePath), Arch)\r
                     continue\r
                 Status = GenDefines(Item[0], Arch, Defines)\r
                 if Status == 0:       # Find DEFINE statement\r
@@ -228,17 +252,7 @@ class Dsc(DscObject):
                     ErrorMsg = "Wrong DEFINE statement '%s' found in section LibraryClasses in file '%s', correct format is 'DEFINE <VarName> = <PATH>'" % (Item, self.Platform.Header.FullPath) \r
                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
                 elif Status == 1:     # Not find DEFINE statement\r
-                    List = GetSplitValueList(Item[0])\r
-                    if len(List) != 2:\r
-                        ErrorMsg = "Wrong statement '%s' found in section LibraryClasses in file '%s', correct format is '<LibraryClassKeyWord>|<LibraryInstance>'" % (Item, self.Platform.Header.FullPath) \r
-                        raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                    else:\r
-                        if List[1] != '' and CheckFileType(List[1], '.Inf') == False:\r
-                            ErrorMsg = "Wrong library instance '%s' found for LibraryClasses '%s' in file '%s', it is NOT a valid INF file" % (List[1], List[0], self.Platform.Header.FullPath) \r
-                            raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                        if Item[1] == ['']:\r
-                            Item[1] = DataType.SUP_MODULE_LIST\r
-                        MergeArches(LibraryClasses, (List[0], List[1]) + tuple(Item[1]), Arch)\r
+                    MergeArches(LibraryClasses, self.GenLibraryClass(Item, self.Platform.Header.FullPath), Arch)\r
         self.Platform.LibraryClasses.IncludeFiles = IncludeFiles\r
         for Key in LibraryClasses.keys():\r
             Library = PlatformLibraryClass()\r
@@ -266,78 +280,14 @@ class Dsc(DscObject):
         Defines = {}\r
         for Arch in DataType.ARCH_LIST:\r
             for Item in self.Contents[Arch].Components:\r
-                (InfFilename, ExecFilename) = GetExec(Item[0])\r
-                if InfFilename != '' and CheckFileType(InfFilename, '.Inf') == False:\r
-                    ErrorMsg = "Wrong component name '%s' found in file '%s', it is NOT a valid INF file" % (InfFilename, self.Platform.Header.FullPath)\r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                LibraryClasses = Item[1]\r
-                BuildOptions = Item[2]\r
-                Pcds = Item[3]\r
-                Component = PlatformModuleClass()\r
-                Component.FilePath = InfFilename\r
-                Component.ExecFilePath = ExecFilename\r
-                for Lib in LibraryClasses:\r
-                    List = GetSplitValueList(Lib)\r
-                    if len(List) != 2:\r
-                        ErrorMsg = "Wrong LibraryClass statement '%s' found in section Components in file '%s', correct format is '<ClassName>|<InfFilename>'" % (Lib, self.Platform.Header.FullPath) \r
-                        raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                    if List[1] != '' and CheckFileType(List[1], '.Inf') == False:\r
-                        ErrorMsg = "Wrong library instance '%s' found for LibraryClasses '%s' in section components of file '%s', it is NOT a valid INF file" % (List[1], List[0], self.Platform.Header.FullPath) \r
-                        raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                    Component.LibraryClasses.LibraryList.append(PlatformLibraryClass(List[0], List[1]))\r
-                for BuildOption in BuildOptions:\r
-                    Key = GetBuildOption(BuildOption)\r
-                    Component.ModuleSaBuildOption.BuildOptionList.append(BuildOptionClass(Key[0], Key[1], Key[2]))\r
-                for Pcd in Pcds:\r
-                    Type = Pcd[0]\r
-                    List = GetSplitValueList(Pcd[1])\r
-                    \r
-                    #\r
-                    # For FeatureFlag\r
-                    #\r
-                    if Type == DataType.TAB_PCDS_FEATURE_FLAG:\r
-                        if len(List) != 2:\r
-                            ErrorMsg = "Wrong Pcds%s statement '%s' found in section Components in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<PcdTokenName>|TRUE/FALSE'" % (Type, Pcd[1], self.Platform.Header.FullPath) \r
-                            raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                        \r
-                        TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
-                        if len(TokenInfo) != 2:\r
-                            ErrorMsg = "Wrong Pcds%s statement '%s' found in section Components in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<PcdTokenName>|TRUE/FALSE'" % (Type, Pcd[1], self.Platform.Header.FullPath) \r
-                            raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                        else:\r
-                            Component.PcdBuildDefinitions.append(PcdClass(TokenInfo[1], '', TokenInfo[0], '', '', List[1], Type, [], {}, []))\r
-                    #\r
-                    # For FixedAtBuild or PatchableInModule\r
-                    #\r
-                    if Type == DataType.TAB_PCDS_FIXED_AT_BUILD or Type == DataType.TAB_PCDS_PATCHABLE_IN_MODULE:\r
-                        List.append('')\r
-                        if len(List) < 3:\r
-                            ErrorMsg = "Wrong Pcds%s statement '%s' found in section Components in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<PcdTokenName>|<Value>[|<MaxDatumSize>]'" % (Type, Pcd[1], self.Platform.Header.FullPath) \r
-                            raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                        \r
-                        TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
-                        if len(TokenInfo) != 2:\r
-                            ErrorMsg = "Wrong Pcds%s statement '%s' found in section Components in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<PcdTokenName>|<Value>[|<MaxDatumSize>]'" % (Type, Pcd[1], self.Platform.Header.FullPath) \r
-                            raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                        else:\r
-                            Component.PcdBuildDefinitions.append(PcdClass(TokenInfo[1], '', TokenInfo[0], '', List[2], List[1], Type, [], {}, []))\r
-                    \r
-                    #\r
-                    # For Dynamic or DynamicEx\r
-                    #\r
-                    if Type == DataType.TAB_PCDS_DYNAMIC or Type == DataType.TAB_PCDS_DYNAMIC_EX:\r
-                        if len(List) != 1:\r
-                            ErrorMsg = "Wrong Pcds%s statement '%s' found in section Components in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<PcdTokenName>'" % (Type, Pcd[1], self.Platform.Header.FullPath) \r
-                            raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                        \r
-                        TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
-                        if len(TokenInfo) != 2:\r
-                            ErrorMsg = "Wrong Pcds%s statement '%s' found in section Components in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<PcdTokenName>'" % (Type, Pcd[1], self.Platform.Header.FullPath) \r
-                            raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                        else:\r
-                            Component.PcdBuildDefinitions.append(PcdClass(TokenInfo[1], '', TokenInfo[0], '', '', '', Type, [], {}, []))                        \r
-                    \r
                 if GenInclude(Item[0], IncludeFiles, Arch):\r
+                    IncludeFile = CleanString(Item[0][Item[0].upper().find(DataType.TAB_INCLUDE.upper() + ' ') + len(DataType.TAB_INCLUDE + ' ') : ])\r
+                    IncludeFilePath = WorkspaceFile(self.WorkspaceDir, IncludeFile)\r
+                    CheckFileExist(self.WorkspaceDir, IncludeFile, self.Platform.Header.FullPath, 'Components', Item[0])\r
+                    NewItems = []\r
+                    GetComponents(open(IncludeFilePath, 'r').read(), TAB_COMPONENTS, NewItems, TAB_COMMENT_SPLIT)\r
+                    for NewItem in NewItems:\r
+                        MergeArches(Components, self.GenComponent(NewItem, IncludeFilePath), Arch)\r
                     continue\r
                 Status = GenDefines(Item[0], Arch, Defines)\r
                 if Status == 0:       # Find DEFINE statement\r
@@ -346,7 +296,7 @@ class Dsc(DscObject):
                     ErrorMsg = "Wrong DEFINE statement '%s' found in section LibraryClasses in file '%s', correct format is 'DEFINE <VarName> = <PATH>'" % (Item, self.Platform.Header.FullPath) \r
                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
                 elif Status == 1:     # Not find DEFINE statement\r
-                    MergeArches(Components, Component, Arch)\r
+                    MergeArches(Components, self.GenComponent(Item, self.Platform.Header.FullPath), Arch)\r
         self.Platform.Modules.IncludeFiles = IncludeFiles\r
         for Key in Components.keys():\r
             Key.Define = Defines\r
@@ -355,6 +305,97 @@ class Dsc(DscObject):
         \r
     #End of DscToPlatform\r
     \r
+    #\r
+    # Gen Library Class\r
+    #\r
+    def GenLibraryClass(self, Item, ContainerFile):\r
+        List = GetSplitValueList(Item[0])\r
+        if len(List) != 2:\r
+            ErrorMsg = "Wrong statement '%s' found in section LibraryClasses in file '%s', correct format is '<LibraryClassKeyWord>|<LibraryInstance>'" % (Item, ContainerFile) \r
+            raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+        else:\r
+            CheckFileType(List[1], '.Inf', ContainerFile, 'library class instance', Item[0])\r
+            CheckFileExist(self.WorkspaceDir, List[1], ContainerFile, 'LibraryClasses', Item[0])\r
+            if Item[1] == ['']:\r
+                Item[1] = DataType.SUP_MODULE_LIST\r
+        return (List[0], List[1]) + tuple(Item[1])\r
+    \r
+    #\r
+    # Gen Component\r
+    #\r
+    def GenComponent(self, Item, ContainerFile):\r
+        (InfFilename, ExecFilename) = GetExec(Item[0])\r
+        CheckFileType(InfFilename, '.Inf', ContainerFile, 'component name', Item[0])\r
+        CheckFileExist(self.WorkspaceDir, InfFilename, ContainerFile, 'component', Item[0])\r
+        LibraryClasses = Item[1]\r
+        BuildOptions = Item[2]\r
+        Pcds = Item[3]\r
+        Component = PlatformModuleClass()\r
+        Component.FilePath = InfFilename\r
+        Component.ExecFilePath = ExecFilename\r
+        for Lib in LibraryClasses:\r
+            List = GetSplitValueList(Lib)\r
+            if len(List) != 2:\r
+                ErrorMsg = "Wrong LibraryClass statement '%s' found in section Components in file '%s', correct format is '<ClassName>|<InfFilename>'" % (Lib, ContainerFile) \r
+                raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+            CheckFileType(List[1], '.Inf', ContainerFile, 'library instance of component ', Lib)\r
+            CheckFileExist(self.WorkspaceDir, List[1], ContainerFile, 'library instance of component', Lib)\r
+            Component.LibraryClasses.LibraryList.append(PlatformLibraryClass(List[0], List[1]))\r
+        for BuildOption in BuildOptions:\r
+            Key = GetBuildOption(BuildOption)\r
+            Component.ModuleSaBuildOption.BuildOptionList.append(BuildOptionClass(Key[0], Key[1], Key[2]))\r
+        for Pcd in Pcds:\r
+            Type = Pcd[0]\r
+            List = GetSplitValueList(Pcd[1])\r
+            \r
+            #\r
+            # For FeatureFlag\r
+            #\r
+            if Type == DataType.TAB_PCDS_FEATURE_FLAG:\r
+                if len(List) != 2:\r
+                    ErrorMsg = "Wrong Pcds%s statement '%s' found in section Components in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<PcdTokenName>|TRUE/FALSE'" % (Type, Pcd[1], ContainerFile) \r
+                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                \r
+                TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
+                if len(TokenInfo) != 2:\r
+                    ErrorMsg = "Wrong Pcds%s statement '%s' found in section Components in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<PcdTokenName>|TRUE/FALSE'" % (Type, Pcd[1], ContainerFile) \r
+                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                else:\r
+                    Component.PcdBuildDefinitions.append(PcdClass(TokenInfo[1], '', TokenInfo[0], '', '', List[1], Type, [], {}, []))\r
+            #\r
+            # For FixedAtBuild or PatchableInModule\r
+            #\r
+            if Type == DataType.TAB_PCDS_FIXED_AT_BUILD or Type == DataType.TAB_PCDS_PATCHABLE_IN_MODULE:\r
+                List.append('')\r
+                if len(List) < 3:\r
+                    ErrorMsg = "Wrong Pcds%s statement '%s' found in section Components in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<PcdTokenName>|<Value>[|<MaxDatumSize>]'" % (Type, Pcd[1], ContainerFile) \r
+                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                \r
+                TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
+                if len(TokenInfo) != 2:\r
+                    ErrorMsg = "Wrong Pcds%s statement '%s' found in section Components in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<PcdTokenName>|<Value>[|<MaxDatumSize>]'" % (Type, Pcd[1], ContainerFile) \r
+                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                else:\r
+                    Component.PcdBuildDefinitions.append(PcdClass(TokenInfo[1], '', TokenInfo[0], '', List[2], List[1], Type, [], {}, []))\r
+            \r
+            #\r
+            # For Dynamic or DynamicEx\r
+            #\r
+            if Type == DataType.TAB_PCDS_DYNAMIC or Type == DataType.TAB_PCDS_DYNAMIC_EX:\r
+                if len(List) != 1:\r
+                    ErrorMsg = "Wrong Pcds%s statement '%s' found in section Components in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<PcdTokenName>'" % (Type, Pcd[1], ContainerFile) \r
+                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                \r
+                TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
+                if len(TokenInfo) != 2:\r
+                    ErrorMsg = "Wrong Pcds%s statement '%s' found in section Components in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<PcdTokenName>'" % (Type, Pcd[1], ContainerFile) \r
+                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                else:\r
+                    Component.PcdBuildDefinitions.append(PcdClass(TokenInfo[1], '', TokenInfo[0], '', '', '', Type, [], {}, []))                        \r
+        \r
+        return Component\r
+    #End of GenComponent\r
+    \r
     def GenFeatureFlagPcds(self, Type = ''):\r
         Pcds = {}\r
         Items = []\r
@@ -574,5 +615,5 @@ class Dsc(DscObject):
 if __name__ == '__main__':\r
     w = os.getenv('WORKSPACE')\r
     f = os.path.join(w, 'Nt32Pkg/Nt32Pkg.dsc')\r
-    p = Dsc(os.path.normpath(f), True, True)\r
+    p = Dsc(os.path.normpath(f), True, True, w)\r
     p.ShowPlatform()\r
index 1c3161f..5280142 100644 (file)
@@ -198,7 +198,7 @@ class WorkspaceBuild(object):
         DscFileName = NormPath(ActivePlatform)\r
         File = self.WorkspaceFile(DscFileName)\r
         if os.path.exists(File) and os.path.isfile(File):\r
-            self.DscDatabase[DscFileName] = Dsc(File, True, True)\r
+            self.DscDatabase[DscFileName] = Dsc(File, True, True, self.WorkspaceDir)\r
         else:\r
             raise ParserError(FILE_NOT_FOUND, name = File)\r
         \r
@@ -704,7 +704,7 @@ class WorkspaceBuild(object):
     # Return a full path with workspace dir\r
     #\r
     def WorkspaceFile(self, Filename):\r
-        return os.path.join(self.WorkspaceDir, Filename)\r
+        return WorkspaceFile(self.WorkspaceDir, Filename)\r
     \r
     #\r
     # If a module of a platform has its own override libraryclass but the libraryclass not defined in the module\r
@@ -737,7 +737,7 @@ class WorkspaceBuild(object):
         File = self.WorkspaceFile(InfFileName)\r
         if os.path.exists(File) and os.path.isfile(File):\r
             if InfFileName not in self.InfDatabase:\r
-                self.InfDatabase[InfFileName] = Inf(File, True, True)\r
+                self.InfDatabase[InfFileName] = Inf(File, True, True, self.WorkspaceDir)\r
         else:\r
             raise ParserError(FILE_NOT_FOUND, name = File)\r
     \r
@@ -749,7 +749,7 @@ class WorkspaceBuild(object):
         File = self.WorkspaceFile(DecFileName)\r
         if os.path.exists(File) and os.path.isfile(File):\r
             if DecFileName not in self.DecDatabase:\r
-                self.DecDatabase[DecFileName] = Dec(File, True, True)\r
+                self.DecDatabase[DecFileName] = Dec(File, True, True, self.WorkspaceDir)\r
         else:\r
             raise ParserError(FILE_NOT_FOUND, name = File)\r
                 \r
index dd87e2f..e4a27bf 100644 (file)
@@ -80,12 +80,13 @@ class InfContents(InfObject):
         self.Nmake = []\r
         \r
 class Inf(InfObject):\r
-    def __init__(self, Filename = None, IsMergeAllArches = False, IsToModule = False):\r
+    def __init__(self, Filename = None, IsMergeAllArches = False, IsToModule = False, WorkspaceDir = None):\r
         self.Identification = Identification()\r
         self.Defines = InfDefines()\r
         self.Contents = {}\r
         self.UserExtensions = ''\r
         self.Module = ModuleClass()\r
+        self.WorkspaceDir = WorkspaceDir\r
         \r
         for Arch in DataType.ARCH_LIST_FULL:\r
             self.Contents[Arch] = InfContents()\r
@@ -255,9 +256,8 @@ class Inf(InfObject):
                 elif Status == 1:     # Not find DEFINE statement\r
                     #{ (LibraryClass, Instance, PcdFeatureFlag, ModuleType1|ModuleType2|ModuleType3) : [Arch1, Arch2, ...] }\r
                     ItemList = GetSplitValueList((Item[0] + DataType.TAB_VALUE_SPLIT * 2))\r
-                    if ItemList[1] != '' and CheckFileType(ItemList[1], '.Inf') == False:\r
-                        ErrorMsg = "Wrong library instance '%s' found for LibraryClasses '%s' in file '%s', it is NOT a valid INF file" % (ItemList[1], ItemList[0], self.Module.Header.FullPath) \r
-                        raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                    CheckFileType(ItemList[1], '.Inf', self.Module.Header.FullPath, 'LibraryClasses', Item[0])\r
+                    CheckFileExist(self.WorkspaceDir, ItemList[1], self.Module.Header.FullPath, 'LibraryClasses', Item[0])\r
                     MergeArches(LibraryClasses, (ItemList[0], ItemList[1], ItemList[2], DataType.TAB_VALUE_SPLIT.join(Item[1])), Arch)\r
         for Key in LibraryClasses.keys():\r
             KeyList = Key[0].split(DataType.TAB_VALUE_SPLIT)\r
@@ -285,9 +285,8 @@ class Inf(InfObject):
                     ErrorMsg = "Wrong DEFINE statement '%s' found in section Packages in file '%s', correct format is 'DEFINE <VarName> = <PATH>'" % (Item, self.Module.Header.FullPath) \r
                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
                 elif Status == 1:     # Not find DEFINE statement\r
-                    if Item != '' and CheckFileType(Item, '.Dec') == False:\r
-                        ErrorMsg = "Wrong package definition '%s' found in file '%s', it is NOT a valid DEC file" % (Item, self.Module.Header.FullPath) \r
-                        raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                    CheckFileType(Item, '.Dec', self.Module.Header.FullPath, 'package', Item)\r
+                    CheckFileExist(self.WorkspaceDir, Item, self.Module.Header.FullPath, 'Packages', Item)\r
                     MergeArches(Packages, Item, Arch)\r
         for Key in Packages.keys():\r
             Package = ModulePackageDependencyClass()\r
@@ -603,5 +602,5 @@ class Inf(InfObject):
 if __name__ == '__main__':\r
     w = os.getenv('WORKSPACE')\r
     f = os.path.join(w, 'MdeModulePkg/Application/HelloWorld/HelloWorld.inf')\r
-    p = Inf(os.path.normpath(f), True, True)\r
+    p = Inf(os.path.normpath(f), True, True, w)\r
     p.ShowModule()\r
index 19c1dac..fcaf756 100644 (file)
@@ -100,7 +100,8 @@ def GetBuildOption(String):
 #\r
 def GetComponents(Lines, Key, KeyValues, CommentCharacter):\r
     #KeyValues [ ['component name', [lib1, lib2, lib3], [bo1, bo2, bo3], [pcd1, pcd2, pcd3]], ...]\r
-    Lines = Lines.split(DataType.TAB_SECTION_END, 1)[1]\r
+    if Lines.find(DataType.TAB_SECTION_END) > -1:\r
+        Lines = Lines.split(DataType.TAB_SECTION_END, 1)[1]\r
     (findBlock, findLibraryClass, findBuildOption, findPcdsFeatureFlag, findPcdsPatchableInModule, findPcdsFixedAtBuild, findPcdsDynamic, findPcdsDynamicEx) = (False, False, False, False, False, False, False, False)\r
     ListItem = None\r
     LibraryClassItem = []\r
@@ -367,15 +368,37 @@ def PreCheck(FileName, FileContent, SupSectionTag):
 \r
 #\r
 # Check if the Filename is including ExtName\r
-# Return True if is\r
-# Retrun False if not\r
+# Pass if it exists\r
+# Raise a error message if it not exists\r
+#\r
+def CheckFileType(CheckFilename, ExtName, ContainerFilename, SectionName, Line):\r
+    if CheckFilename != '' and CheckFilename != None:\r
+        (Root, Ext) = os.path.splitext(CheckFilename)\r
+        if Ext.upper() != ExtName.upper():\r
+            ContainerFile = open(ContainerFilename, 'r').read()\r
+            LineNo = GetLineNo(ContainerFile, Line)\r
+            ErrorMsg = "Invalid %s '%s' defined at line %s in file '%s', it is NOT a valid '%s' file" % (SectionName, CheckFilename, LineNo, ContainerFilename, ExtName) \r
+            raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+    \r
+    return True\r
+\r
 #\r
-def CheckFileType(Filename, ExtName):\r
-    (Root, Ext) = os.path.splitext(Filename)\r
-    if Ext.upper() == ExtName.upper():\r
-        return True\r
+# Check if the file exists\r
+# Pass if it exists\r
+# Raise a error message if it not exists\r
+#\r
+def CheckFileExist(WorkspaceDir, CheckFilename, ContainerFilename, SectionName, Line):\r
+    if CheckFilename != '' and CheckFilename != None:\r
+        CheckFile = WorkspaceFile(WorkspaceDir, NormPath(CheckFilename))\r
+        if os.path.exists(CheckFile) and os.path.isfile(CheckFile):\r
+            pass\r
+        else:\r
+            ContainerFile = open(ContainerFilename, 'r').read()\r
+            LineNo = GetLineNo(ContainerFile, Line)\r
+            ErrorMsg = "Can't find file '%s' defined in section %s at line %s in file '%s'" % (CheckFile, SectionName, LineNo, ContainerFilename) \r
+            raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
     \r
-    return False\r
+    return True\r
 \r
 #\r
 # Find the index of a line in a file\r
@@ -387,6 +410,12 @@ def GetLineNo(FileContent, Line):
         if LineList[Index].find(Line) > -1:\r
             return Index + 1\r
 \r
+#\r
+# Return a full path with workspace dir\r
+#\r
+def WorkspaceFile(WorkspaceDir, Filename):\r
+    return os.path.join(NormPath(WorkspaceDir), NormPath(Filename))\r
+\r
 if __name__ == '__main__':\r
     print SplitModuleType('LibraryClasses.common.DXE_RUNTIME_DRIVER')\r
     print SplitModuleType('Library.common')\r