# Trim files preprocessed by compiler\r
#\r
# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
-# This program and the accompanying materials\r
-# are licensed and made available under the terms and conditions of the BSD License\r
-# which accompanies this distribution. The full text of the license may be found at\r
-# http://opensource.org/licenses/bsd-license.php\r
-#\r
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+# SPDX-License-Identifier: BSD-2-Clause-Patent\r
#\r
\r
##\r
import sys\r
import re\r
from io import BytesIO\r
-\r
+import codecs\r
from optparse import OptionParser\r
from optparse import make_option\r
from Common.BuildToolError import *\r
## Regular expression for matching C style #include "XXX.asl" in asl file\r
gAslCIncludePattern = re.compile(r'^(\s*)#include\s*[<"]\s*([-\\/\w.]+)\s*([>"])', re.MULTILINE)\r
## Patterns used to convert EDK conventions to EDK2 ECP conventions\r
-gImportCodePatterns = [\r
- [\r
- re.compile('^(\s*)\(\*\*PeiServices\)\.PciCfg\s*=\s*([^;\s]+);', re.MULTILINE),\r
- '''\\1{\r
-\\1 STATIC EFI_PEI_PPI_DESCRIPTOR gEcpPeiPciCfgPpiList = {\r
-\\1 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
-\\1 &gEcpPeiPciCfgPpiGuid,\r
-\\1 \\2\r
-\\1 };\r
-\\1 (**PeiServices).InstallPpi (PeiServices, &gEcpPeiPciCfgPpiList);\r
-\\1}'''\r
- ],\r
-\r
- [\r
- re.compile('^(\s*)\(\*PeiServices\)->PciCfg\s*=\s*([^;\s]+);', re.MULTILINE),\r
- '''\\1{\r
-\\1 STATIC EFI_PEI_PPI_DESCRIPTOR gEcpPeiPciCfgPpiList = {\r
-\\1 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
-\\1 &gEcpPeiPciCfgPpiGuid,\r
-\\1 \\2\r
-\\1 };\r
-\\1 (**PeiServices).InstallPpi (PeiServices, &gEcpPeiPciCfgPpiList);\r
-\\1}'''\r
- ],\r
-\r
- [\r
- re.compile("(\s*).+->Modify[\s\n]*\(", re.MULTILINE),\r
- '\\1PeiLibPciCfgModify ('\r
- ],\r
-\r
- [\r
- re.compile("(\W*)gRT->ReportStatusCode[\s\n]*\(", re.MULTILINE),\r
- '\\1EfiLibReportStatusCode ('\r
- ],\r
-\r
- [\r
- re.compile('#include\s+EFI_GUID_DEFINITION\s*\(FirmwareFileSystem\)', re.MULTILINE),\r
- '#include EFI_GUID_DEFINITION (FirmwareFileSystem)\n#include EFI_GUID_DEFINITION (FirmwareFileSystem2)'\r
- ],\r
-\r
- [\r
- re.compile('gEfiFirmwareFileSystemGuid', re.MULTILINE),\r
- 'gEfiFirmwareFileSystem2Guid'\r
- ],\r
-\r
- [\r
- re.compile('EFI_FVH_REVISION', re.MULTILINE),\r
- 'EFI_FVH_PI_REVISION'\r
- ],\r
-\r
- [\r
- re.compile("(\s*)\S*CreateEvent\s*\([\s\n]*EFI_EVENT_SIGNAL_READY_TO_BOOT[^,]*,((?:[^;]+\n)+)(\s*\));", re.MULTILINE),\r
- '\\1EfiCreateEventReadyToBoot (\\2\\3;'\r
- ],\r
-\r
- [\r
- re.compile("(\s*)\S*CreateEvent\s*\([\s\n]*EFI_EVENT_SIGNAL_LEGACY_BOOT[^,]*,((?:[^;]+\n)+)(\s*\));", re.MULTILINE),\r
- '\\1EfiCreateEventLegacyBoot (\\2\\3;'\r
- ],\r
-# [\r
-# re.compile("(\W)(PEI_PCI_CFG_PPI)(\W)", re.MULTILINE),\r
-# '\\1ECP_\\2\\3'\r
-# ]\r
-]\r
\r
## file cache to avoid circular include in ASL file\r
gIncludedAslFile = []\r
def TrimPreprocessedFile(Source, Target, ConvertHex, TrimLong):\r
CreateDirectory(os.path.dirname(Target))\r
try:\r
- f = open (Source, 'r')\r
+ with open(Source, "r") as File:\r
+ Lines = File.readlines()\r
except:\r
EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=Source)\r
\r
- # read whole file\r
- Lines = f.readlines()\r
- f.close()\r
-\r
PreprocessedFile = ""\r
InjectedFile = ""\r
LineIndexOfOriginalFile = None\r
InjectedFile = MatchList[1]\r
InjectedFile = os.path.normpath(InjectedFile)\r
InjectedFile = os.path.normcase(InjectedFile)\r
- # The first injetcted file must be the preprocessed file itself\r
+ # The first injected file must be the preprocessed file itself\r
if PreprocessedFile == "":\r
PreprocessedFile = InjectedFile\r
LineControlDirectiveFound = True\r
\r
# save to file\r
try:\r
- f = open (Target, 'w')\r
+ with open(Target, 'w') as File:\r
+ File.writelines(NewLines)\r
except:\r
EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=Target)\r
- f.writelines(NewLines)\r
- f.close()\r
\r
## Trim preprocessed VFR file\r
#\r
CreateDirectory(os.path.dirname(Target))\r
\r
try:\r
- f = open (Source, 'r')\r
+ with open(Source, "r") as File:\r
+ Lines = File.readlines()\r
except:\r
EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=Source)\r
# read whole file\r
- Lines = f.readlines()\r
- f.close()\r
\r
FoundTypedef = False\r
Brace = 0\r
\r
# save all lines trimmed\r
try:\r
- f = open (Target, 'w')\r
+ with open(Target, 'w') as File:\r
+ File.writelines(Lines)\r
except:\r
EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=Target)\r
- f.writelines(Lines)\r
- f.close()\r
\r
## Read the content ASL file, including ASL included, recursively\r
#\r
for IncludePath in SearchPathList:\r
IncludeFile = os.path.join(IncludePath, Source)\r
if os.path.isfile(IncludeFile):\r
- F = open(IncludeFile, "r")\r
+ try:\r
+ with open(IncludeFile, "r") as File:\r
+ F = File.readlines()\r
+ except:\r
+ with codecs.open(IncludeFile, "r", encoding='utf-8') as File:\r
+ F = File.readlines()\r
break\r
else:\r
EdkLogger.error("Trim", "Failed to find include file %s" % Source)\r
NewFileContent.append("\n")\r
\r
gIncludedAslFile.pop()\r
- F.close()\r
\r
return NewFileContent\r
\r
if IncludePathFile:\r
try:\r
LineNum = 0\r
- for Line in open(IncludePathFile, 'r'):\r
+ with open(IncludePathFile, 'r') as File:\r
+ FileLines = File.readlines()\r
+ for Line in FileLines:\r
LineNum += 1\r
if Line.startswith("/I") or Line.startswith ("-I"):\r
IncludePathList.append(Line[2:].strip())\r
\r
# save all lines trimmed\r
try:\r
- f = open (Target, 'w')\r
+ with open(Target, 'w') as File:\r
+ File.writelines(Lines)\r
except:\r
EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=Target)\r
\r
- f.writelines(Lines)\r
- f.close()\r
-\r
def GenerateVfrBinSec(ModuleName, DebugDir, OutputFile):\r
VfrNameList = []\r
if os.path.isdir(DebugDir):\r
return\r
\r
try:\r
- fInputfile = open(OutputFile, "wb+", 0)\r
+ fInputfile = open(OutputFile, "wb+")\r
except:\r
EdkLogger.error("Trim", FILE_OPEN_FAILURE, "File open failed for %s" %OutputFile, None)\r
\r
fStringIO.close ()\r
fInputfile.close ()\r
\r
-## Trim EDK source code file(s)\r
-#\r
-#\r
-# @param Source File or directory to be trimmed\r
-# @param Target File or directory to store the trimmed content\r
-#\r
-def TrimEdkSources(Source, Target):\r
- if os.path.isdir(Source):\r
- for CurrentDir, Dirs, Files in os.walk(Source):\r
- if '.svn' in Dirs:\r
- Dirs.remove('.svn')\r
- elif "CVS" in Dirs:\r
- Dirs.remove("CVS")\r
-\r
- for FileName in Files:\r
- Dummy, Ext = os.path.splitext(FileName)\r
- if Ext.upper() not in ['.C', '.H']: continue\r
- if Target is None or Target == '':\r
- TrimEdkSourceCode(\r
- os.path.join(CurrentDir, FileName),\r
- os.path.join(CurrentDir, FileName)\r
- )\r
- else:\r
- TrimEdkSourceCode(\r
- os.path.join(CurrentDir, FileName),\r
- os.path.join(Target, CurrentDir[len(Source)+1:], FileName)\r
- )\r
- else:\r
- TrimEdkSourceCode(Source, Target)\r
-\r
-## Trim one EDK source code file\r
-#\r
-# Do following replacement:\r
-#\r
-# (**PeiServices\).PciCfg = <*>;\r
-# => {\r
-# STATIC EFI_PEI_PPI_DESCRIPTOR gEcpPeiPciCfgPpiList = {\r
-# (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
-# &gEcpPeiPciCfgPpiGuid,\r
-# <*>\r
-# };\r
-# (**PeiServices).InstallPpi (PeiServices, &gEcpPeiPciCfgPpiList);\r
-#\r
-# <*>Modify(<*>)\r
-# => PeiLibPciCfgModify (<*>)\r
-#\r
-# gRT->ReportStatusCode (<*>)\r
-# => EfiLibReportStatusCode (<*>)\r
-#\r
-# #include <LoadFile\.h>\r
-# => #include <FvLoadFile.h>\r
-#\r
-# CreateEvent (EFI_EVENT_SIGNAL_READY_TO_BOOT, <*>)\r
-# => EfiCreateEventReadyToBoot (<*>)\r
-#\r
-# CreateEvent (EFI_EVENT_SIGNAL_LEGACY_BOOT, <*>)\r
-# => EfiCreateEventLegacyBoot (<*>)\r
-#\r
-# @param Source File to be trimmed\r
-# @param Target File to store the trimmed content\r
-#\r
-def TrimEdkSourceCode(Source, Target):\r
- EdkLogger.verbose("\t%s -> %s" % (Source, Target))\r
- CreateDirectory(os.path.dirname(Target))\r
-\r
- try:\r
- f = open (Source, 'r')\r
- except:\r
- EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=Source)\r
- # read whole file\r
- Lines = f.read()\r
- f.close()\r
-\r
- NewLines = None\r
- for Re, Repl in gImportCodePatterns:\r
- if NewLines is None:\r
- NewLines = Re.sub(Repl, Lines)\r
- else:\r
- NewLines = Re.sub(Repl, NewLines)\r
-\r
- # save all lines if trimmed\r
- if Source == Target and NewLines == Lines:\r
- return\r
-\r
- try:\r
- f = open (Target, 'w')\r
- except:\r
- EdkLogger.error("Trim", FILE_OPEN_FAILURE, ExtraData=Target)\r
- f.write(NewLines)\r
- f.close()\r
-\r
\r
## Parse command line options\r
#\r
help="The input file is EFI image"),\r
make_option("-a", "--asl-file", dest="FileType", const="Asl", action="store_const",\r
help="The input file is ASL file"),\r
- make_option("-8", "--Edk-source-code", dest="FileType", const="EdkSourceCode", action="store_const",\r
- help="The input file is source code for Edk to be trimmed for ECP"),\r
-\r
make_option("-c", "--convert-hex", dest="ConvertHex", action="store_true",\r
help="Convert standard hex format (0xabcd) to MASM format (abcdh)"),\r
\r
if CommandOptions.OutputFile is None:\r
CommandOptions.OutputFile = os.path.splitext(InputFile)[0] + '.iii'\r
TrimAslFile(InputFile, CommandOptions.OutputFile, CommandOptions.IncludePathFile)\r
- elif CommandOptions.FileType == "EdkSourceCode":\r
- TrimEdkSources(InputFile, CommandOptions.OutputFile)\r
elif CommandOptions.FileType == "VfrOffsetBin":\r
GenerateVfrBinSec(CommandOptions.ModuleName, CommandOptions.DebugDir, CommandOptions.OutputFile)\r
else :\r
"\nTrim",\r
CODE_ERROR,\r
"Unknown fatal error when trimming [%s]" % InputFile,\r
- ExtraData="\n(Please send email to edk2-devel@lists.01.org for help, attaching following call stack trace!)\n",\r
+ ExtraData="\n(Please send email to %s for help, attaching following call stack trace!)\n" % MSG_EDKII_MAIL_ADDR,\r
RaiseError=False\r
)\r
EdkLogger.quiet("(Python %s on %s) " % (platform.python_version(), sys.platform) + traceback.format_exc())\r