BaseTools/Ecc: Add a checkpoint for invalid UNI file.

Add a checkpoint to check that the UNI file which is associated by INF or DEC file need define the prompt and help information.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Hess Chen <hesheng.chen@intel.com>
Reviewed-by: YangX Li <yangx.li@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17706 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Hess Chen 2015-06-25 07:50:55 +00:00 committed by hchen30
parent 8c3f9b4e3c
commit 1b2467c58f
7 changed files with 127 additions and 9 deletions

View File

@ -1,7 +1,7 @@
## @file ## @file
# Override built in function file.open to provide support for long file path # Override built in function file.open to provide support for long file path
# #
# Copyright (c) 2014, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>
# This program and the accompanying materials # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # 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 # which accompanies this distribution. The full text of the license may be found at
@ -14,6 +14,7 @@
import os import os
import platform import platform
import shutil import shutil
import codecs
## ##
# OpenLongPath # OpenLongPath
@ -37,6 +38,9 @@ def LongFilePath(FileName):
def OpenLongFilePath(FileName, Mode='r', Buffer= -1): def OpenLongFilePath(FileName, Mode='r', Buffer= -1):
return open(LongFilePath(FileName), Mode, Buffer) return open(LongFilePath(FileName), Mode, Buffer)
def CodecOpenLongFilePath(Filename, Mode='rb', Encoding=None, Errors='strict', Buffering=1):
return codecs.open(LongFilePath(Filename), Mode, Encoding, Errors, Buffering)
## ##
# CopyLongFilePath # CopyLongFilePath
# wrap copyfile to support copy a long file path # wrap copyfile to support copy a long file path

View File

@ -246,6 +246,13 @@ class Configuration(object):
self.MetaDataFileCheckModuleFilePpiFormat = 1 self.MetaDataFileCheckModuleFilePpiFormat = 1
# Check Pcd Format in INF files # Check Pcd Format in INF files
self.MetaDataFileCheckModuleFilePcdFormat = 1 self.MetaDataFileCheckModuleFilePcdFormat = 1
# Check UNI file
self.UniCheckAll = 0
# Check INF or DEC file whether defined the localized information in the associated UNI file.
self.UniCheckHelpInfo = 1
# Check PCD whether defined the prompt, help in the DEC file and localized information in the associated UNI file.
self.UniCheckPCDInfo = 1
# #
# The check points in this section are reserved # The check points in this section are reserved

View File

@ -251,7 +251,8 @@ class Ecc(object):
Filename = os.path.normpath(os.path.join(Root, File)) Filename = os.path.normpath(os.path.join(Root, File))
EdkLogger.quiet("Parsing %s" % Filename) EdkLogger.quiet("Parsing %s" % Filename)
Op.write("%s\r" % Filename) Op.write("%s\r" % Filename)
EccGlobalData.gDb.TblFile.InsertFile(Filename, MODEL_FILE_UNI) FileID = EccGlobalData.gDb.TblFile.InsertFile(Filename, MODEL_FILE_UNI)
EccGlobalData.gDb.TblReport.UpdateBelongsToItemByFile(FileID, File)
continue continue
Op.close() Op.close()

View File

@ -1,7 +1,7 @@
## @file ## @file
# Standardized Error Hanlding infrastructures. # Standardized Error Hanlding infrastructures.
# #
# Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2008 - 2015, Intel Corporation. All rights reserved.<BR>
# This program and the accompanying materials # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # 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 # which accompanies this distribution. The full text of the license may be found at
@ -21,6 +21,7 @@ ERROR_GENERAL_CHECK_CARRIAGE_RETURN = 1006
ERROR_GENERAL_CHECK_FILE_EXISTENCE = 1007 ERROR_GENERAL_CHECK_FILE_EXISTENCE = 1007
ERROR_GENERAL_CHECK_NON_ACSII = 1008 ERROR_GENERAL_CHECK_NON_ACSII = 1008
ERROR_GENERAL_CHECK_UNI = 1009 ERROR_GENERAL_CHECK_UNI = 1009
ERROR_GENERAL_CHECK_UNI_HELP_INFO = 1010
ERROR_SPACE_CHECK_ALL = 2000 ERROR_SPACE_CHECK_ALL = 2000
@ -114,6 +115,7 @@ gEccErrorMessage = {
ERROR_GENERAL_CHECK_FILE_EXISTENCE : "File not found", ERROR_GENERAL_CHECK_FILE_EXISTENCE : "File not found",
ERROR_GENERAL_CHECK_NON_ACSII : "File has invalid Non-ACSII char", ERROR_GENERAL_CHECK_NON_ACSII : "File has invalid Non-ACSII char",
ERROR_GENERAL_CHECK_UNI : "File is not a valid UTF-16 UNI file", ERROR_GENERAL_CHECK_UNI : "File is not a valid UTF-16 UNI file",
ERROR_GENERAL_CHECK_UNI_HELP_INFO : "UNI file that is associated by INF or DEC file need define the prompt and help information.",
ERROR_SPACE_CHECK_ALL : "", ERROR_SPACE_CHECK_ALL : "",

View File

@ -1,7 +1,7 @@
## @file ## @file
# This file is used to parse meta files # This file is used to parse meta files
# #
# Copyright (c) 2008 - 2014, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2008 - 2015, Intel Corporation. All rights reserved.<BR>
# This program and the accompanying materials # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # 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 # which accompanies this distribution. The full text of the license may be found at
@ -33,6 +33,7 @@ from CommonDataClass.Exceptions import *
from MetaFileTable import MetaFileStorage from MetaFileTable import MetaFileStorage
from GenFds.FdfParser import FdfParser from GenFds.FdfParser import FdfParser
from Common.LongFilePathSupport import OpenLongFilePath as open from Common.LongFilePathSupport import OpenLongFilePath as open
from Common.LongFilePathSupport import CodecOpenLongFilePath
## A decorator used to parse macro definition ## A decorator used to parse macro definition
def ParseMacro(Parser): def ParseMacro(Parser):
@ -174,6 +175,9 @@ class MetaFileParser(object):
self._PostProcessed = False self._PostProcessed = False
# Different version of meta-file has different way to parse. # Different version of meta-file has different way to parse.
self._Version = 0 self._Version = 0
# UNI object and extra UNI object
self._UniObj = None
self._UniExtraObj = None
## Store the parsed data in table ## Store the parsed data in table
def _Store(self, *Args): def _Store(self, *Args):
@ -258,8 +262,16 @@ class MetaFileParser(object):
## Skip unsupported data ## Skip unsupported data
def _Skip(self): def _Skip(self):
EdkLogger.warn("Parser", "Unrecognized content", File=self.MetaFile, if self._SectionName == TAB_USER_EXTENSIONS.upper() and self._CurrentLine.upper().endswith('.UNI'):
Line=self._LineIndex+1, ExtraData=self._CurrentLine); if EccGlobalData.gConfig.UniCheckHelpInfo == '1' or EccGlobalData.gConfig.UniCheckAll == '1' or EccGlobalData.gConfig.CheckAll == '1':
ExtraUni = self._CurrentLine.strip()
ExtraUniFile = os.path.join(os.path.dirname(self.MetaFile), ExtraUni)
IsModuleUni = self.MetaFile.upper().endswith('.INF')
self._UniExtraObj = UniParser(ExtraUniFile, IsExtraUni=True, IsModuleUni=IsModuleUni)
self._UniExtraObj.Start()
else:
EdkLogger.warn("Parser", "Unrecognized content", File=self.MetaFile,
Line=self._LineIndex + 1, ExtraData=self._CurrentLine);
self._ValueList[0:1] = [self._CurrentLine] self._ValueList[0:1] = [self._CurrentLine]
## Section header parser ## Section header parser
@ -328,7 +340,20 @@ class MetaFileParser(object):
except: except:
EdkLogger.error('Parser', FORMAT_INVALID, "Invalid version number", EdkLogger.error('Parser', FORMAT_INVALID, "Invalid version number",
ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1) ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1)
elif Name == 'MODULE_UNI_FILE':
UniFile = os.path.join(os.path.dirname(self.MetaFile), Value)
if os.path.exists(UniFile):
self._UniObj = UniParser(UniFile, IsExtraUni=False, IsModuleUni=True)
self._UniObj.Start()
else:
EdkLogger.error('Parser', FILE_NOT_FOUND, "Module UNI file %s is missing." % Value,
ExtraData=self._CurrentLine, File=self.MetaFile, Line=self._LineIndex+1,
RaiseError=False)
elif Name == 'PACKAGE_UNI_FILE':
UniFile = os.path.join(os.path.dirname(self.MetaFile), Value)
if os.path.exists(UniFile):
self._UniObj = UniParser(UniFile, IsExtraUni=False, IsModuleUni=False)
if type(self) == InfParser and self._Version < 0x00010005: if type(self) == InfParser and self._Version < 0x00010005:
# EDK module allows using defines as macros # EDK module allows using defines as macros
self._FileLocalMacros[Name] = Value self._FileLocalMacros[Name] = Value
@ -1873,6 +1898,69 @@ class Fdf(FdfObject):
BelongsToFile = self.InsertFile(FileName) BelongsToFile = self.InsertFile(FileName)
self.TblFdf.Insert(Model, Value1, Value2, Value3, Scope1, Scope2, BelongsToItem, BelongsToFile, StartLine, StartColumn, EndLine, EndColumn, Enabled) self.TblFdf.Insert(Model, Value1, Value2, Value3, Scope1, Scope2, BelongsToItem, BelongsToFile, StartLine, StartColumn, EndLine, EndColumn, Enabled)
class UniParser(object):
# IsExtraUni defined the UNI file is Module UNI or extra Module UNI
# IsModuleUni defined the UNI file is Module UNI or Package UNI
def __init__(self, FilePath, IsExtraUni=False, IsModuleUni=True):
self.FilePath = FilePath
self.FileName = os.path.basename(FilePath)
self.IsExtraUni = IsExtraUni
self.IsModuleUni = IsModuleUni
self.FileIn = None
self.Missing = []
self.__read()
def __read(self):
try:
self.FileIn = CodecOpenLongFilePath(self.FilePath, Mode = 'rb', Encoding = 'utf_16').read()
except UnicodeError:
self.FileIn = CodecOpenLongFilePath(self.FilePath, Mode = 'rb', Encoding = 'utf_16_le').read()
except IOError:
self.FileIn = ""
def Start(self):
if self.IsModuleUni:
if self.IsExtraUni:
ModuleName = self.CheckKeyValid('STR_PROPERTIES_MODULE_NAME')
self.PrintLog('STR_PROPERTIES_MODULE_NAME', ModuleName)
else:
ModuleAbstract = self.CheckKeyValid('STR_MODULE_ABSTRACT')
self.PrintLog('STR_MODULE_ABSTRACT', ModuleAbstract)
ModuleDescription = self.CheckKeyValid('STR_MODULE_DESCRIPTION')
self.PrintLog('STR_MODULE_DESCRIPTION', ModuleDescription)
else:
if self.IsExtraUni:
PackageName = self.CheckKeyValid('STR_PROPERTIES_PACKAGE_NAME')
self.PrintLog('STR_PROPERTIES_PACKAGE_NAME', PackageName)
else:
PackageAbstract = self.CheckKeyValid('STR_PACKAGE_ABSTRACT')
self.PrintLog('STR_PACKAGE_ABSTRACT', PackageAbstract)
PackageDescription = self.CheckKeyValid('STR_PACKAGE_DESCRIPTION')
self.PrintLog('STR_PACKAGE_DESCRIPTION', PackageDescription)
def CheckKeyValid(self, Key, Contents=None):
if not Contents:
Contents = self.FileIn
KeyPattern = re.compile('#string\s+%s\s+.*?#language.*?".*?"' % Key, re.S)
if KeyPattern.search(Contents):
return True
return False
def CheckPcdInfo(self, PcdCName):
PromptKey = 'STR_%s_PROMPT' % PcdCName.replace('.', '_')
PcdPrompt = self.CheckKeyValid(PromptKey)
self.PrintLog(PromptKey, PcdPrompt)
HelpKey = 'STR_%s_HELP' % PcdCName.replace('.', '_')
PcdHelp = self.CheckKeyValid(HelpKey)
self.PrintLog(HelpKey, PcdHelp)
def PrintLog(self, Key, Value):
if not Value and Key not in self.Missing:
Msg = '%s is missing in the %s file.' % (Key, self.FileName)
EdkLogger.warn('Parser', Msg)
EccGlobalData.gDb.TblReport.Insert(EccToolError.ERROR_GENERAL_CHECK_UNI_HELP_INFO, OtherMsg=Msg, BelongsToTable='File', BelongsToItem=-2)
self.Missing.append(Key)
## ##
# #
# This acts like the main() function for the script, unless it is 'import'ed into another # This acts like the main() function for the script, unless it is 'import'ed into another

View File

@ -2,7 +2,7 @@
# This file is used to set configuration of ECC tool # This file is used to set configuration of ECC tool
# For the items listed below, 1 means valid, 0 means invalid # For the items listed below, 1 means valid, 0 means invalid
# #
# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
# This program and the accompanying materials # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # 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 # which accompanies this distribution. The full text of the license may be found at
@ -248,6 +248,15 @@ MetaDataFileCheckPcdType = 1
# Check whether there are FILE_GUID duplication among different INF files # Check whether there are FILE_GUID duplication among different INF files
MetaDataFileCheckModuleFileGuidDuplication = 1 MetaDataFileCheckModuleFileGuidDuplication = 1
#
# Uni File Processing Checking
#
UniCheckAll = 0
# Check INF or DEC file whether defined the localized information in the associated UNI file.
UniCheckHelpInfo = 1
# Check PCD whether defined the prompt, help in the DEC file and localized information in the associated UNI file.
UniCheckPCDInfo = 1
# #
# The check points in this section are reserved # The check points in this section are reserved
# #

View File

@ -1,7 +1,7 @@
## @file ## @file
# This file is used to create/update/query/erase table for ECC reports # This file is used to create/update/query/erase table for ECC reports
# #
# Copyright (c) 2008 - 2014, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2008 - 2015, Intel Corporation. All rights reserved.<BR>
# This program and the accompanying materials # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # 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 # which accompanies this distribution. The full text of the license may be found at
@ -85,6 +85,13 @@ class TableReport(Table):
where Enabled > -1 order by ErrorID, BelongsToItem""" % (self.Table) where Enabled > -1 order by ErrorID, BelongsToItem""" % (self.Table)
return self.Exec(SqlCommand) return self.Exec(SqlCommand)
## Update table
#
def UpdateBelongsToItemByFile(self, ItemID=-1, File=""):
SqlCommand = """update Report set BelongsToItem=%s where BelongsToTable='File' and BelongsToItem=-2
and OtherMsg like '%%%s%%'""" % (ItemID, File)
return self.Exec(SqlCommand)
## Convert to CSV ## Convert to CSV
# #
# Get all enabled records from table report and save them to a .csv file # Get all enabled records from table report and save them to a .csv file