14234283c3acb8c35014acc1546621fbc2621b095lgao## @file
24234283c3acb8c35014acc1546621fbc2621b095lgao# This file is used to define class objects of INF file [Packages] section.
34234283c3acb8c35014acc1546621fbc2621b095lgao# It will consumed by InfParser.
44234283c3acb8c35014acc1546621fbc2621b095lgao#
54234283c3acb8c35014acc1546621fbc2621b095lgao# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
64234283c3acb8c35014acc1546621fbc2621b095lgao#
74234283c3acb8c35014acc1546621fbc2621b095lgao# This program and the accompanying materials are licensed and made available
84234283c3acb8c35014acc1546621fbc2621b095lgao# under the terms and conditions of the BSD License which accompanies this
94234283c3acb8c35014acc1546621fbc2621b095lgao# distribution. The full text of the license may be found at
104234283c3acb8c35014acc1546621fbc2621b095lgao# http://opensource.org/licenses/bsd-license.php
114234283c3acb8c35014acc1546621fbc2621b095lgao#
124234283c3acb8c35014acc1546621fbc2621b095lgao# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
134234283c3acb8c35014acc1546621fbc2621b095lgao# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
144234283c3acb8c35014acc1546621fbc2621b095lgao
154234283c3acb8c35014acc1546621fbc2621b095lgao'''
164234283c3acb8c35014acc1546621fbc2621b095lgaoInfPackageObject
174234283c3acb8c35014acc1546621fbc2621b095lgao'''
184234283c3acb8c35014acc1546621fbc2621b095lgao
194234283c3acb8c35014acc1546621fbc2621b095lgaofrom Logger import StringTable as ST
204234283c3acb8c35014acc1546621fbc2621b095lgaofrom Logger import ToolError
214234283c3acb8c35014acc1546621fbc2621b095lgaoimport Logger.Log as Logger
224234283c3acb8c35014acc1546621fbc2621b095lgaofrom Library import GlobalData
234234283c3acb8c35014acc1546621fbc2621b095lgao
244234283c3acb8c35014acc1546621fbc2621b095lgaofrom Library.Misc import Sdict
254234283c3acb8c35014acc1546621fbc2621b095lgaofrom Library.ParserValidate import IsValidPath
264234283c3acb8c35014acc1546621fbc2621b095lgaofrom Library.ExpressionValidate import IsValidFeatureFlagExp
274234283c3acb8c35014acc1546621fbc2621b095lgao
284234283c3acb8c35014acc1546621fbc2621b095lgaoclass InfPackageItem():
294234283c3acb8c35014acc1546621fbc2621b095lgao    def __init__(self,
304234283c3acb8c35014acc1546621fbc2621b095lgao                 PackageName = '',
314234283c3acb8c35014acc1546621fbc2621b095lgao                 FeatureFlagExp = '',
324234283c3acb8c35014acc1546621fbc2621b095lgao                 HelpString = ''):
334234283c3acb8c35014acc1546621fbc2621b095lgao        self.PackageName    = PackageName
344234283c3acb8c35014acc1546621fbc2621b095lgao        self.FeatureFlagExp = FeatureFlagExp
354234283c3acb8c35014acc1546621fbc2621b095lgao        self.HelpString     = HelpString
364234283c3acb8c35014acc1546621fbc2621b095lgao        self.SupArchList    = []
374234283c3acb8c35014acc1546621fbc2621b095lgao
384234283c3acb8c35014acc1546621fbc2621b095lgao    def SetPackageName(self, PackageName):
394234283c3acb8c35014acc1546621fbc2621b095lgao        self.PackageName = PackageName
404234283c3acb8c35014acc1546621fbc2621b095lgao    def GetPackageName(self):
414234283c3acb8c35014acc1546621fbc2621b095lgao        return self.PackageName
424234283c3acb8c35014acc1546621fbc2621b095lgao
434234283c3acb8c35014acc1546621fbc2621b095lgao    def SetFeatureFlagExp(self, FeatureFlagExp):
444234283c3acb8c35014acc1546621fbc2621b095lgao        self.FeatureFlagExp = FeatureFlagExp
454234283c3acb8c35014acc1546621fbc2621b095lgao    def GetFeatureFlagExp(self):
464234283c3acb8c35014acc1546621fbc2621b095lgao        return self.FeatureFlagExp
474234283c3acb8c35014acc1546621fbc2621b095lgao
484234283c3acb8c35014acc1546621fbc2621b095lgao    def SetHelpString(self, HelpString):
494234283c3acb8c35014acc1546621fbc2621b095lgao        self.HelpString = HelpString
504234283c3acb8c35014acc1546621fbc2621b095lgao    def GetHelpString(self):
514234283c3acb8c35014acc1546621fbc2621b095lgao        return self.HelpString
524234283c3acb8c35014acc1546621fbc2621b095lgao
534234283c3acb8c35014acc1546621fbc2621b095lgao    def SetSupArchList(self, SupArchList):
544234283c3acb8c35014acc1546621fbc2621b095lgao        self.SupArchList = SupArchList
554234283c3acb8c35014acc1546621fbc2621b095lgao    def GetSupArchList(self):
564234283c3acb8c35014acc1546621fbc2621b095lgao        return self.SupArchList
574234283c3acb8c35014acc1546621fbc2621b095lgao
584234283c3acb8c35014acc1546621fbc2621b095lgao
594234283c3acb8c35014acc1546621fbc2621b095lgao## INF package section
604234283c3acb8c35014acc1546621fbc2621b095lgao#
614234283c3acb8c35014acc1546621fbc2621b095lgao#
624234283c3acb8c35014acc1546621fbc2621b095lgao#
634234283c3acb8c35014acc1546621fbc2621b095lgaoclass InfPackageObject():
644234283c3acb8c35014acc1546621fbc2621b095lgao    def __init__(self):
654234283c3acb8c35014acc1546621fbc2621b095lgao        self.Packages = Sdict()
664234283c3acb8c35014acc1546621fbc2621b095lgao        #
674234283c3acb8c35014acc1546621fbc2621b095lgao        # Macro defined in this section should be only used in this section.
684234283c3acb8c35014acc1546621fbc2621b095lgao        #
694234283c3acb8c35014acc1546621fbc2621b095lgao        self.Macros         = {}
704234283c3acb8c35014acc1546621fbc2621b095lgao
714234283c3acb8c35014acc1546621fbc2621b095lgao    def SetPackages(self, PackageData, Arch = None):
724234283c3acb8c35014acc1546621fbc2621b095lgao        IsValidFileFlag = False
734234283c3acb8c35014acc1546621fbc2621b095lgao        SupArchList     = []
744234283c3acb8c35014acc1546621fbc2621b095lgao        for ArchItem in Arch:
754234283c3acb8c35014acc1546621fbc2621b095lgao            #
764234283c3acb8c35014acc1546621fbc2621b095lgao            # Validate Arch
774234283c3acb8c35014acc1546621fbc2621b095lgao            #
784234283c3acb8c35014acc1546621fbc2621b095lgao            if (ArchItem == '' or ArchItem == None):
794234283c3acb8c35014acc1546621fbc2621b095lgao                ArchItem = 'COMMON'
804234283c3acb8c35014acc1546621fbc2621b095lgao            SupArchList.append(ArchItem)
814234283c3acb8c35014acc1546621fbc2621b095lgao
824234283c3acb8c35014acc1546621fbc2621b095lgao        for PackageItem in PackageData:
834234283c3acb8c35014acc1546621fbc2621b095lgao            PackageItemObj = InfPackageItem()
844234283c3acb8c35014acc1546621fbc2621b095lgao            HelpStringObj = PackageItem[1]
854234283c3acb8c35014acc1546621fbc2621b095lgao            CurrentLineOfPackItem = PackageItem[2]
864234283c3acb8c35014acc1546621fbc2621b095lgao            PackageItem = PackageItem[0]
874234283c3acb8c35014acc1546621fbc2621b095lgao            if HelpStringObj != None:
884234283c3acb8c35014acc1546621fbc2621b095lgao                HelpString = HelpStringObj.HeaderComments + HelpStringObj.TailComments
894234283c3acb8c35014acc1546621fbc2621b095lgao                PackageItemObj.SetHelpString(HelpString)
904234283c3acb8c35014acc1546621fbc2621b095lgao            if len(PackageItem) >= 1:
914234283c3acb8c35014acc1546621fbc2621b095lgao                #
924234283c3acb8c35014acc1546621fbc2621b095lgao                # Validate file exist/format.
934234283c3acb8c35014acc1546621fbc2621b095lgao                #
944234283c3acb8c35014acc1546621fbc2621b095lgao                if IsValidPath(PackageItem[0], ''):
954234283c3acb8c35014acc1546621fbc2621b095lgao                    IsValidFileFlag = True
964234283c3acb8c35014acc1546621fbc2621b095lgao                elif IsValidPath(PackageItem[0], GlobalData.gINF_MODULE_DIR):
974234283c3acb8c35014acc1546621fbc2621b095lgao                    IsValidFileFlag = True
984234283c3acb8c35014acc1546621fbc2621b095lgao                elif IsValidPath(PackageItem[0], GlobalData.gWORKSPACE):
994234283c3acb8c35014acc1546621fbc2621b095lgao                    IsValidFileFlag = True
1004234283c3acb8c35014acc1546621fbc2621b095lgao                else:
1014234283c3acb8c35014acc1546621fbc2621b095lgao                    Logger.Error("InfParser",
1024234283c3acb8c35014acc1546621fbc2621b095lgao                                 ToolError.FORMAT_INVALID,
1034234283c3acb8c35014acc1546621fbc2621b095lgao                                 ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(PackageItem[0]),
1044234283c3acb8c35014acc1546621fbc2621b095lgao                                 File=CurrentLineOfPackItem[2],
1054234283c3acb8c35014acc1546621fbc2621b095lgao                                 Line=CurrentLineOfPackItem[1],
1064234283c3acb8c35014acc1546621fbc2621b095lgao                                 ExtraData=CurrentLineOfPackItem[0])
1074234283c3acb8c35014acc1546621fbc2621b095lgao                    return False
1084234283c3acb8c35014acc1546621fbc2621b095lgao                if IsValidFileFlag:
1094234283c3acb8c35014acc1546621fbc2621b095lgao                    PackageItemObj.SetPackageName(PackageItem[0])
1104234283c3acb8c35014acc1546621fbc2621b095lgao            if len(PackageItem) == 2:
1114234283c3acb8c35014acc1546621fbc2621b095lgao                #
1124234283c3acb8c35014acc1546621fbc2621b095lgao                # Validate Feature Flag Express
1134234283c3acb8c35014acc1546621fbc2621b095lgao                #
1144234283c3acb8c35014acc1546621fbc2621b095lgao                if PackageItem[1].strip() == '':
1154234283c3acb8c35014acc1546621fbc2621b095lgao                    Logger.Error("InfParser",
1164234283c3acb8c35014acc1546621fbc2621b095lgao                                 ToolError.FORMAT_INVALID,
1174234283c3acb8c35014acc1546621fbc2621b095lgao                                 ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING,
1184234283c3acb8c35014acc1546621fbc2621b095lgao                                 File=CurrentLineOfPackItem[2],
1194234283c3acb8c35014acc1546621fbc2621b095lgao                                 Line=CurrentLineOfPackItem[1],
1204234283c3acb8c35014acc1546621fbc2621b095lgao                                 ExtraData=CurrentLineOfPackItem[0])
1214234283c3acb8c35014acc1546621fbc2621b095lgao                #
1224234283c3acb8c35014acc1546621fbc2621b095lgao                # Validate FFE
1234234283c3acb8c35014acc1546621fbc2621b095lgao                #
1244234283c3acb8c35014acc1546621fbc2621b095lgao                FeatureFlagRtv = IsValidFeatureFlagExp(PackageItem[1].strip())
1254234283c3acb8c35014acc1546621fbc2621b095lgao                if not FeatureFlagRtv[0]:
1264234283c3acb8c35014acc1546621fbc2621b095lgao                    Logger.Error("InfParser",
1274234283c3acb8c35014acc1546621fbc2621b095lgao                                 ToolError.FORMAT_INVALID,
1284234283c3acb8c35014acc1546621fbc2621b095lgao                                 ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%(FeatureFlagRtv[1]),
1294234283c3acb8c35014acc1546621fbc2621b095lgao                                 File=CurrentLineOfPackItem[2],
1304234283c3acb8c35014acc1546621fbc2621b095lgao                                 Line=CurrentLineOfPackItem[1],
1314234283c3acb8c35014acc1546621fbc2621b095lgao                                 ExtraData=CurrentLineOfPackItem[0])
1324234283c3acb8c35014acc1546621fbc2621b095lgao
1334234283c3acb8c35014acc1546621fbc2621b095lgao                PackageItemObj.SetFeatureFlagExp(PackageItem[1].strip())
1344234283c3acb8c35014acc1546621fbc2621b095lgao
1354234283c3acb8c35014acc1546621fbc2621b095lgao            if len(PackageItem) > 2:
1364234283c3acb8c35014acc1546621fbc2621b095lgao                #
1374234283c3acb8c35014acc1546621fbc2621b095lgao                # Invalid format of Package statement
1384234283c3acb8c35014acc1546621fbc2621b095lgao                #
1394234283c3acb8c35014acc1546621fbc2621b095lgao                Logger.Error("InfParser",
1404234283c3acb8c35014acc1546621fbc2621b095lgao                             ToolError.FORMAT_INVALID,
1414234283c3acb8c35014acc1546621fbc2621b095lgao                             ST.ERR_INF_PARSER_PACKAGE_SECTION_CONTENT_ERROR,
1424234283c3acb8c35014acc1546621fbc2621b095lgao                             File=CurrentLineOfPackItem[2],
1434234283c3acb8c35014acc1546621fbc2621b095lgao                             Line=CurrentLineOfPackItem[1],
1444234283c3acb8c35014acc1546621fbc2621b095lgao                             ExtraData=CurrentLineOfPackItem[0])
1454234283c3acb8c35014acc1546621fbc2621b095lgao            PackageItemObj.SetSupArchList(SupArchList)
1464234283c3acb8c35014acc1546621fbc2621b095lgao
1474234283c3acb8c35014acc1546621fbc2621b095lgao            #
1484234283c3acb8c35014acc1546621fbc2621b095lgao            # Determine package file name duplicate. Follow below rule:
1494234283c3acb8c35014acc1546621fbc2621b095lgao            #
1504234283c3acb8c35014acc1546621fbc2621b095lgao            # A package filename must not be duplicated within a [Packages]
1514234283c3acb8c35014acc1546621fbc2621b095lgao            # section. Package filenames may appear in multiple architectural
1524234283c3acb8c35014acc1546621fbc2621b095lgao            # [Packages] sections. A package filename listed in an
1534234283c3acb8c35014acc1546621fbc2621b095lgao            # architectural [Packages] section must not be listed in the common
1544234283c3acb8c35014acc1546621fbc2621b095lgao            # architectural [Packages] section.
1554234283c3acb8c35014acc1546621fbc2621b095lgao            #
1564234283c3acb8c35014acc1546621fbc2621b095lgao            # NOTE: This check will not report error now.
1574234283c3acb8c35014acc1546621fbc2621b095lgao            #
1584234283c3acb8c35014acc1546621fbc2621b095lgao            for Item in self.Packages:
1594234283c3acb8c35014acc1546621fbc2621b095lgao                if Item.GetPackageName() == PackageItemObj.GetPackageName():
1604234283c3acb8c35014acc1546621fbc2621b095lgao                    ItemSupArchList = Item.GetSupArchList()
1614234283c3acb8c35014acc1546621fbc2621b095lgao                    for ItemArch in ItemSupArchList:
1624234283c3acb8c35014acc1546621fbc2621b095lgao                        for PackageItemObjArch in SupArchList:
1634234283c3acb8c35014acc1546621fbc2621b095lgao                            if ItemArch == PackageItemObjArch:
1644234283c3acb8c35014acc1546621fbc2621b095lgao                                #
1654234283c3acb8c35014acc1546621fbc2621b095lgao                                # ST.ERR_INF_PARSER_ITEM_DUPLICATE
1664234283c3acb8c35014acc1546621fbc2621b095lgao                                #
1674234283c3acb8c35014acc1546621fbc2621b095lgao                                pass
1684234283c3acb8c35014acc1546621fbc2621b095lgao                            if ItemArch.upper() == 'COMMON' or PackageItemObjArch.upper() == 'COMMON':
1694234283c3acb8c35014acc1546621fbc2621b095lgao                                #
1704234283c3acb8c35014acc1546621fbc2621b095lgao                                # ST.ERR_INF_PARSER_ITEM_DUPLICATE_COMMON
1714234283c3acb8c35014acc1546621fbc2621b095lgao                                #
1724234283c3acb8c35014acc1546621fbc2621b095lgao                                pass
1734234283c3acb8c35014acc1546621fbc2621b095lgao
1744234283c3acb8c35014acc1546621fbc2621b095lgao            if self.Packages.has_key((PackageItemObj)):
1754234283c3acb8c35014acc1546621fbc2621b095lgao                PackageList = self.Packages[PackageItemObj]
1764234283c3acb8c35014acc1546621fbc2621b095lgao                PackageList.append(PackageItemObj)
1774234283c3acb8c35014acc1546621fbc2621b095lgao                self.Packages[PackageItemObj] = PackageList
1784234283c3acb8c35014acc1546621fbc2621b095lgao            else:
1794234283c3acb8c35014acc1546621fbc2621b095lgao                PackageList = []
1804234283c3acb8c35014acc1546621fbc2621b095lgao                PackageList.append(PackageItemObj)
1814234283c3acb8c35014acc1546621fbc2621b095lgao                self.Packages[PackageItemObj] = PackageList
1824234283c3acb8c35014acc1546621fbc2621b095lgao
1834234283c3acb8c35014acc1546621fbc2621b095lgao        return True
1844234283c3acb8c35014acc1546621fbc2621b095lgao
1854234283c3acb8c35014acc1546621fbc2621b095lgao    def GetPackages(self, Arch = None):
1864234283c3acb8c35014acc1546621fbc2621b095lgao        if Arch == None:
1874234283c3acb8c35014acc1546621fbc2621b095lgao            return self.Packages