audk/BaseTools/Source/Python/PackagingTool/DependencyRules.py

185 lines
6.3 KiB
Python

## @file
# This file is for installed package information database operations
#
# Copyright (c) 2007 - 2008, Intel Corporation. All rights reserved.<BR>
# This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
##
# Import Modules
#
import sqlite3
import os
import Common.EdkLogger as EdkLogger
import IpiDb
(DEPEX_CHECK_SUCCESS, DEPEX_CHECK_MODULE_NOT_FOUND, \
DEPEX_CHECK_PACKAGE_NOT_FOUND, DEPEX_CHECK_DP_NOT_FOUND) = (0, 1, 2, 3)
## IpiDb
#
# This class represents the installed package information databse
# Add/Remove/Get installed distribution package information here.
#
#
# @param object: Inherited from object class
# @param DbPath: A string for the path of the database
#
# @var Conn: Connection of the database
# @var Cur: Cursor of the connection
#
class DependencyRules(object):
def __init__(self, Db):
self.IpiDb = Db
## Check whether a module exists in current workspace.
#
# @param Guid:
# @param Version:
#
def CheckModuleExists(self, Guid, Version, ReturnCode = DEPEX_CHECK_SUCCESS):
EdkLogger.verbose("\nCheck module exists in workspace started ...")
ModuleList = []
ModuleList = self.IpiDb.GetModInPackage(Guid, Version)
ModuleList.extend(self.IpiDb.GetStandaloneModule(Guid, Version))
EdkLogger.verbose("Check module exists in workspace ... DONE!")
if len(ModuleList) > 0:
return True
else:
ReturnCode = DEPEX_CHECK_MODULE_NOT_FOUND
return False
## Check whether a module depex satified by current workspace.
#
# @param ModuleObj:
# @param DpObj:
#
def CheckModuleDepexSatisfied(self, ModuleObj, DpObj = None, ReturnCode = DEPEX_CHECK_SUCCESS):
EdkLogger.verbose("\nCheck module depex met by workspace started ...")
for Dep in ModuleObj.PackageDependencies:
Exist = self.CheckPackageExists(Dep.PackageGuid, Dep.PackageVersion, ReturnCode)
if not Exist:
if DpObj == None:
ReturnCode = DEPEX_CHECK_PACKAGE_NOT_FOUND
return False
for GuidVerPair in DpObj.PackageSurfaceArea.keys():
if Dep.PackageGuid == GuidVerPair[0]:
if Dep.PackageVersion == None or len(Dep.PackageVersion) == 0:
break
if Dep.PackageVersion == GuidVerPair[1]:
break
else:
ReturnCode = DEPEX_CHECK_PACKAGE_NOT_FOUND
return False
else:
ReturnCode = DEPEX_CHECK_PACKAGE_NOT_FOUND
return False
return True
EdkLogger.verbose("Check module depex met by workspace ... DONE!")
## Check whether a package exists in current workspace.
#
# @param Guid:
# @param Version:
#
def CheckPackageExists(self, Guid, Version, ReturnCode = DEPEX_CHECK_SUCCESS):
EdkLogger.verbose("\nCheck package exists in workspace started ...")
PkgList = []
PkgList = self.IpiDb.GetPackage(Guid, Version)
if len(PkgList) > 0:
return True
else:
ReturnCode = DEPEX_CHECK_PACKAGE_NOT_FOUND
return False
EdkLogger.verbose("Check package exists in workspace ... DONE!")
## Check whether a package depex satified by current workspace.
#
# @param ModuleObj:
# @param DpObj:
#
def CheckPackageDepexSatisfied(self, PkgObj, DpObj = None, ReturnCode = DEPEX_CHECK_SUCCESS):
for ModKey in PkgObj.Modules.keys():
ModObj = PkgObj.Modules[ModKey]
if self.CheckModuleDepexSatisfied(ModObj, DpObj, ReturnCode):
continue
else:
return False
return True
## Check whether a DP exists in current workspace.
#
# @param Guid:
# @param Version:
#
def CheckDpExists(self, Guid, Version, ReturnCode = DEPEX_CHECK_SUCCESS):
EdkLogger.verbose("\nCheck DP exists in workspace started ...")
DpList = []
DpList = self.IpiDb.GetDp(Guid, Version)
if len(DpList) > 0:
return True
else:
ReturnCode = DEPEX_CHECK_DP_NOT_FOUND
return False
EdkLogger.verbose("Check DP exists in workspace ... DONE!")
## Check whether a DP depex satified by current workspace.
#
# @param ModuleObj:
# @param DpObj:
#
def CheckDpDepexSatisfied(self, DpObj, ReturnCode = DEPEX_CHECK_SUCCESS):
for PkgKey in DpObj.PackageSurfaceArea.keys():
PkgObj = DpObj.PackageSurfaceArea[PkgKey]
if self.CheckPackageDepexSatisfied(PkgObj, DpObj, ReturnCode):
continue
else:
return False
for ModKey in DpObj.ModuleSurfaceArea.keys():
ModObj = PkgObj.ModuleSurfaceArea[ModKey]
if self.CheckModuleDepexSatisfied(ModObj, DpObj, ReturnCode):
continue
else:
return False
return True
## Check whether a DP depex satified by current workspace.
#
# @param ModuleObj:
# @param DpObj:
#
def CheckDpDepexForRemove(self, DpGuid, DpVersion, ReturnCode = DEPEX_CHECK_SUCCESS):
# Get mod list that is dependent on pkg installed from this DP.
ModList = self.IpiDb.GetDpDependentModuleList(DpGuid, DpVersion)
if len(ModList) > 0:
return False
return True
##
#
# This acts like the main() function for the script, unless it is 'import'ed into another
# script.
#
if __name__ == '__main__':
EdkLogger.Initialize()
EdkLogger.SetLevel(EdkLogger.DEBUG_0)