mirror of
https://github.com/acidanthera/audk.git
synced 2025-04-08 17:05:09 +02:00
This reverts commit 6693f359b3c213513c5096a06c6f67244a44dc52.. 678f85131238622e576705117e299d81cff755c9. Python3 migration is the fundamental change. It requires every developer to install Python3. Before this migration, the well communication and wide verification must be done. But now, most people is not aware of this change, and not try it. So, Python3 migration is reverted and be moved to edk2-staging Python3 branch for the edk2 user evaluation. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Liming Gao <liming.gao@intel.com>
281 lines
10 KiB
Python
281 lines
10 KiB
Python
## @file
|
|
# Install distribution package.
|
|
#
|
|
# Copyright (c) 2011 - 2018, 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.
|
|
#
|
|
|
|
'''
|
|
MkPkg
|
|
'''
|
|
|
|
##
|
|
# Import Modules
|
|
#
|
|
from os import remove
|
|
from os import getcwd
|
|
from os import chdir
|
|
import os.path
|
|
from sys import stdin
|
|
from sys import platform
|
|
from traceback import format_exc
|
|
from platform import python_version
|
|
from hashlib import md5
|
|
from time import strftime
|
|
from time import localtime
|
|
from uuid import uuid4
|
|
|
|
from Logger import StringTable as ST
|
|
from Logger.ToolError import OPTION_UNKNOWN_ERROR
|
|
from Logger.ToolError import OPTION_VALUE_INVALID
|
|
from Logger.ToolError import ABORT_ERROR
|
|
from Logger.ToolError import UPT_REPKG_ERROR
|
|
from Logger.ToolError import CODE_ERROR
|
|
from Logger.ToolError import FatalError
|
|
from Logger.ToolError import FILE_NOT_FOUND
|
|
import Logger.Log as Logger
|
|
|
|
from Xml.XmlParser import DistributionPackageXml
|
|
from Xml.IniToXml import IniToXml
|
|
|
|
from Library import GlobalData
|
|
from Library.ParserValidate import IsValidPath
|
|
|
|
from Core.DistributionPackageClass import DistributionPackageClass
|
|
from Core.PackageFile import PackageFile
|
|
from Common.MultipleWorkspace import MultipleWorkspace as mws
|
|
|
|
## CheckForExistingDp
|
|
#
|
|
# Check if there is a same name DP file existing
|
|
# @param Path: The path to be checked
|
|
#
|
|
def CheckForExistingDp(Path):
|
|
if os.path.exists(Path):
|
|
Logger.Info(ST.MSG_DISTRIBUTION_PACKAGE_FILE_EXISTS % Path)
|
|
Input = stdin.readline()
|
|
Input = Input.replace('\r', '').replace('\n', '')
|
|
if Input.upper() != "Y":
|
|
Logger.Error("\nMkPkg", ABORT_ERROR, ST.ERR_USER_ABORT, RaiseError=True)
|
|
|
|
## Tool entrance method
|
|
#
|
|
# This method mainly dispatch specific methods per the command line options.
|
|
# If no error found, return zero value so the caller of this tool can know
|
|
# if it's executed successfully or not.
|
|
#
|
|
#
|
|
def Main(Options = None):
|
|
if Options is None:
|
|
Logger.Error("\nMkPkg", OPTION_UNKNOWN_ERROR, ST.ERR_OPTION_NOT_FOUND)
|
|
try:
|
|
DataBase = GlobalData.gDB
|
|
ContentFileClosed = True
|
|
WorkspaceDir = GlobalData.gWORKSPACE
|
|
|
|
#
|
|
# Init PackFileToCreate
|
|
#
|
|
if not Options.PackFileToCreate:
|
|
Logger.Error("\nMkPkg", OPTION_UNKNOWN_ERROR, ST.ERR_OPTION_NOT_FOUND)
|
|
|
|
#
|
|
# Handle if the distribution package file already exists
|
|
#
|
|
CheckForExistingDp(Options.PackFileToCreate)
|
|
|
|
#
|
|
# Check package file existing and valid
|
|
#
|
|
CheckFileList('.DEC', Options.PackageFileList, ST.ERR_INVALID_PACKAGE_NAME, ST.ERR_INVALID_PACKAGE_PATH)
|
|
#
|
|
# Check module file existing and valid
|
|
#
|
|
CheckFileList('.INF', Options.ModuleFileList, ST.ERR_INVALID_MODULE_NAME, ST.ERR_INVALID_MODULE_PATH)
|
|
|
|
#
|
|
# Get list of files that installed with RePackage attribute available
|
|
#
|
|
RePkgDict = DataBase.GetRePkgDict()
|
|
|
|
ContentFile = PackageFile(GlobalData.gCONTENT_FILE, "w")
|
|
ContentFileClosed = False
|
|
|
|
#
|
|
# Add temp distribution header
|
|
#
|
|
if Options.PackageInformationDataFile:
|
|
XmlFile = IniToXml(Options.PackageInformationDataFile)
|
|
DistPkg = DistributionPackageXml().FromXml(XmlFile)
|
|
remove(XmlFile)
|
|
|
|
#
|
|
# add distribution level tool/misc files
|
|
# before pack, current dir should be workspace dir, else the full
|
|
# path will be in the pack file
|
|
#
|
|
Cwd = getcwd()
|
|
chdir(WorkspaceDir)
|
|
ToolObject = DistPkg.Tools
|
|
MiscObject = DistPkg.MiscellaneousFiles
|
|
FileList = []
|
|
if ToolObject:
|
|
FileList += ToolObject.GetFileList()
|
|
if MiscObject:
|
|
FileList += MiscObject.GetFileList()
|
|
for FileObject in FileList:
|
|
#
|
|
# If you have unicode file names, please convert them to byte
|
|
# strings in your desired encoding before passing them to
|
|
# write().
|
|
#
|
|
FromFile = os.path.normpath(FileObject.GetURI()).encode('utf_8')
|
|
FileFullPath = mws.join(WorkspaceDir, FromFile)
|
|
if FileFullPath in RePkgDict:
|
|
(DpGuid, DpVersion, DpName, Repackage) = RePkgDict[FileFullPath]
|
|
if not Repackage:
|
|
Logger.Error("\nMkPkg",
|
|
UPT_REPKG_ERROR,
|
|
ST.ERR_UPT_REPKG_ERROR,
|
|
ExtraData=ST.MSG_REPKG_CONFLICT %\
|
|
(FileFullPath, DpGuid, DpVersion, DpName)
|
|
)
|
|
else:
|
|
DistPkg.Header.RePackage = True
|
|
ContentFile.PackFile(FromFile)
|
|
chdir(Cwd)
|
|
|
|
#
|
|
# Add init dp information
|
|
#
|
|
else:
|
|
DistPkg = DistributionPackageClass()
|
|
DistPkg.Header.Name = 'Distribution Package'
|
|
DistPkg.Header.Guid = str(uuid4())
|
|
DistPkg.Header.Version = '1.0'
|
|
|
|
DistPkg.GetDistributionPackage(WorkspaceDir, Options.PackageFileList, \
|
|
Options.ModuleFileList)
|
|
FileList, MetaDataFileList = DistPkg.GetDistributionFileList()
|
|
for File in FileList + MetaDataFileList:
|
|
FileFullPath = os.path.normpath(os.path.join(WorkspaceDir, File))
|
|
#
|
|
# check whether file was included in a distribution that can not
|
|
# be repackaged
|
|
#
|
|
if FileFullPath in RePkgDict:
|
|
(DpGuid, DpVersion, DpName, Repackage) = RePkgDict[FileFullPath]
|
|
if not Repackage:
|
|
Logger.Error("\nMkPkg",
|
|
UPT_REPKG_ERROR,
|
|
ST.ERR_UPT_REPKG_ERROR,
|
|
ExtraData = \
|
|
ST.MSG_REPKG_CONFLICT %(FileFullPath, DpName, \
|
|
DpGuid, DpVersion)
|
|
)
|
|
else:
|
|
DistPkg.Header.RePackage = True
|
|
|
|
Cwd = getcwd()
|
|
chdir(WorkspaceDir)
|
|
ContentFile.PackFiles(FileList)
|
|
chdir(Cwd)
|
|
|
|
Logger.Verbose(ST.MSG_COMPRESS_DISTRIBUTION_PKG)
|
|
|
|
ContentFile.Close()
|
|
ContentFileClosed = True
|
|
|
|
#
|
|
# Add Md5Sigature
|
|
#
|
|
DistPkg.Header.Signature = md5(open(str(ContentFile), 'rb').read()).hexdigest()
|
|
#
|
|
# Add current Date
|
|
#
|
|
DistPkg.Header.Date = str(strftime("%Y-%m-%dT%H:%M:%S", localtime()))
|
|
|
|
#
|
|
# Finish final dp file
|
|
#
|
|
DistPkgFile = PackageFile(Options.PackFileToCreate, "w")
|
|
DistPkgFile.PackFile(str(ContentFile))
|
|
DistPkgXml = DistributionPackageXml()
|
|
DistPkgFile.PackData(DistPkgXml.ToXml(DistPkg), GlobalData.gDESC_FILE)
|
|
DistPkgFile.Close()
|
|
Logger.Quiet(ST.MSG_FINISH)
|
|
ReturnCode = 0
|
|
|
|
except FatalError as XExcept:
|
|
ReturnCode = XExcept.args[0]
|
|
if Logger.GetLevel() <= Logger.DEBUG_9:
|
|
Logger.Quiet(ST.MSG_PYTHON_ON % \
|
|
(python_version(), platform) + format_exc())
|
|
except KeyboardInterrupt:
|
|
ReturnCode = ABORT_ERROR
|
|
if Logger.GetLevel() <= Logger.DEBUG_9:
|
|
Logger.Quiet(ST.MSG_PYTHON_ON % \
|
|
(python_version(), platform) + format_exc())
|
|
except OSError:
|
|
pass
|
|
except:
|
|
Logger.Error(
|
|
"\nMkPkg",
|
|
CODE_ERROR,
|
|
ST.ERR_UNKNOWN_FATAL_CREATING_ERR % \
|
|
Options.PackFileToCreate,
|
|
ExtraData=ST.MSG_SEARCH_FOR_HELP,
|
|
RaiseError=False
|
|
)
|
|
Logger.Quiet(ST.MSG_PYTHON_ON % \
|
|
(python_version(), platform) + format_exc())
|
|
ReturnCode = CODE_ERROR
|
|
finally:
|
|
if os.path.exists(GlobalData.gCONTENT_FILE):
|
|
if not ContentFileClosed:
|
|
ContentFile.Close()
|
|
os.remove(GlobalData.gCONTENT_FILE)
|
|
|
|
return ReturnCode
|
|
|
|
|
|
## CheckFileList
|
|
#
|
|
# @param QualifiedExt: QualifiedExt
|
|
# @param FileList: FileList
|
|
# @param ErrorStringExt: ErrorStringExt
|
|
# @param ErrorStringFullPath: ErrorStringFullPath
|
|
#
|
|
def CheckFileList(QualifiedExt, FileList, ErrorStringExt, ErrorStringFullPath):
|
|
if not FileList:
|
|
return
|
|
WorkspaceDir = GlobalData.gWORKSPACE
|
|
WorkspaceDir = os.path.normpath(WorkspaceDir)
|
|
for Item in FileList:
|
|
Ext = os.path.splitext(Item)[1]
|
|
if Ext.upper() != QualifiedExt.upper():
|
|
Logger.Error("\nMkPkg", OPTION_VALUE_INVALID, \
|
|
ErrorStringExt % Item)
|
|
|
|
Item = os.path.normpath(Item)
|
|
Path = mws.join(WorkspaceDir, Item)
|
|
if not os.path.exists(Path):
|
|
Logger.Error("\nMkPkg", FILE_NOT_FOUND, ST.ERR_NOT_FOUND % Item)
|
|
elif Item == Path:
|
|
Logger.Error("\nMkPkg", OPTION_VALUE_INVALID,
|
|
ErrorStringFullPath % Item)
|
|
elif not IsValidPath(Item, WorkspaceDir):
|
|
Logger.Error("\nMkPkg", OPTION_VALUE_INVALID, \
|
|
ErrorStringExt % Item)
|
|
|
|
if not os.path.split(Item)[0]:
|
|
Logger.Error("\nMkPkg", OPTION_VALUE_INVALID, \
|
|
ST.ERR_INVALID_METAFILE_PATH % Item)
|