[edk2-devel] [PATCH V2] BaseTools/GenBiosId: Add a new tool GenBiosId

Michael D Kinney michael.d.kinney at intel.com
Mon Jun 17 17:18:29 UTC 2019


We would like to move to Python based tools for 
everything with no requirements to use batch files
or shell scripts.

Do we really need the -ob --batch flag?  I looks 
like the feature it provides is a text string of the
BIOSID.  Can't we send that to stdout or just put 
that text string in an output file without using
any batch file or shell script specific syntax?

Thanks,

Mike



> -----Original Message-----
> From: Fan, ZhijuX
> Sent: Monday, June 17, 2019 3:54 AM
> To: devel at edk2.groups.io
> Cc: Gao, Liming <liming.gao at intel.com>; Feng, Bob C
> <bob.c.feng at intel.com>; Zhang, Shenglei
> <shenglei.zhang at intel.com>; Kinney, Michael D
> <michael.d.kinney at intel.com>
> Subject: [PATCH V2] BaseTools/GenBiosId: Add a new tool
> GenBiosId
> 
> GenBiosId is a tool to generate the BIOS ID binary file
> which uses the data from the configuration file.
> https://bugzilla.tianocore.org/show_bug.cgi?id=1846
> 
> v2:v1 is a tool of C type and v2 is python type.
> 
> Cc: Bob Feng <bob.c.feng at intel.com>
> Cc: Liming Gao <liming.gao at intel.com>
> Signed-off-by: Shenglei Zhang <shenglei.zhang at intel.com>
> ---
>  BaseTools/BinWrappers/PosixLike/GenBiosId       |  14
> +++
>  BaseTools/BinWrappers/WindowsLike/GenBiosId.bat |   3 +
>  BaseTools/Source/Python/GenBiosId/BiosId.env    |  27
> ++++++
>  BaseTools/Source/Python/GenBiosId/GenBiosId.py  | 118
> ++++++++++++++++++++++++
>  4 files changed, 162 insertions(+)
>  create mode 100644
> BaseTools/BinWrappers/PosixLike/GenBiosId
>  create mode 100644
> BaseTools/BinWrappers/WindowsLike/GenBiosId.bat
>  create mode 100644
> BaseTools/Source/Python/GenBiosId/BiosId.env
>  create mode 100644
> BaseTools/Source/Python/GenBiosId/GenBiosId.py
> 
> diff --git a/BaseTools/BinWrappers/PosixLike/GenBiosId
> b/BaseTools/BinWrappers/PosixLike/GenBiosId
> new file mode 100644
> index 0000000000..1dd28e9662
> --- /dev/null
> +++ b/BaseTools/BinWrappers/PosixLike/GenBiosId
> @@ -0,0 +1,14 @@
> +#!/usr/bin/env bash
> +#python `dirname $0`/RunToolFromSource.py `basename $0`
> $*
> +
> +# If a ${PYTHON_COMMAND} command is available, use it in
> preference to
> +python if command -v ${PYTHON_COMMAND} >/dev/null 2>&1;
> then
> +    python_exe=${PYTHON_COMMAND}
> +fi
> +
> +full_cmd=${BASH_SOURCE:-$0} # see
> +http://mywiki.wooledge.org/BashFAQ/028 for a discussion
> of why $0 is
> +not a good choice here dir=$(dirname "$full_cmd")
> exe=$(basename
> +"$full_cmd")
> +
> +export
> PYTHONPATH="$dir/../../Source/Python${PYTHONPATH:+:"$PYTH
> ONPATH"}"
> +exec "${python_exe:-python}"
> "$dir/../../Source/Python/$exe/$exe.py" "$@"
> diff --git
> a/BaseTools/BinWrappers/WindowsLike/GenBiosId.bat
> b/BaseTools/BinWrappers/WindowsLike/GenBiosId.bat
> new file mode 100644
> index 0000000000..e1f61382c8
> --- /dev/null
> +++ b/BaseTools/BinWrappers/WindowsLike/GenBiosId.bat
> @@ -0,0 +1,3 @@
> + at setlocal
> + at set ToolName=%~n0%
> +@%PYTHON_COMMAND%
> +%BASE_TOOLS_PATH%\Source\Python\%ToolName%\%ToolName%.py
> %*
> diff --git a/BaseTools/Source/Python/GenBiosId/BiosId.env
> b/BaseTools/Source/Python/GenBiosId/BiosId.env
> new file mode 100644
> index 0000000000..e1e913da76
> --- /dev/null
> +++ b/BaseTools/Source/Python/GenBiosId/BiosId.env
> @@ -0,0 +1,27 @@
> +## @file
> +#  This file is used to define the BIOS ID parameters of
> the build.
> +#  This file is processed by GenBiosId.
> +#  Here, it is just a template and can be customized by
> user.
> +#
> +#  BIOS ID string format:
> +#
> $(BOARD_ID)$(BOARD_REV).$(BOARD_EXT).$(VERSION_MAJOR).$(B
> UILD_TYPE)$(VERSION_MINOR).YYMMDDHHMM
> +#  All fields must have a fixed length. YYMMDDHHMM is
> UTC time.
> +#    Example: "EMLATOR1.000.0001.D01.1906141517"
> +#
> +#  If DATE is specified for YYMMDD and TIME is specified
> for HHMM like
> +below, #  GenBiosId will use the value of DATE and TIME
> to fill
> +YYMMDDHHMM, #  otherwise GenBiosId will fill YYMMDDHHMM
> with current UTC time of the build machine.
> +#    DATE          = 190614
> +#    TIME          = 1517
> +#
> +#  Copyright (c) 2019, Intel Corporation. All rights
> reserved.<BR> #
> +SPDX-License-Identifier: BSD-2-Clause-Patent # ##
> [config]
> +BOARD_ID      = EMLATOR
> +BOARD_REV     = 1
> +BOARD_EXT     = 000
> +BUILD_TYPE    = D
> +VERSION_MAJOR = 0001
> +VERSION_MINOR = 01
> diff --git
> a/BaseTools/Source/Python/GenBiosId/GenBiosId.py
> b/BaseTools/Source/Python/GenBiosId/GenBiosId.py
> new file mode 100644
> index 0000000000..8259b17afd
> --- /dev/null
> +++ b/BaseTools/Source/Python/GenBiosId/GenBiosId.py
> @@ -0,0 +1,118 @@
> +## @file
> +# Trim files preprocessed by compiler
> +#
> +# Copyright (c) 2019, Intel Corporation. All rights
> reserved.<BR> #
> +SPDX-License-Identifier: BSD-2-Clause-Patent #
> +
> +##
> +# Import Modules
> +#
> +import Common.LongFilePathOs as os
> +import sys
> +import struct
> +import time
> +import datetime
> +import argparse
> +try:
> +    from configparser import ConfigParser
> +except:
> +    from ConfigParser import ConfigParser from
> Common.BuildToolError
> +import * from Common.Misc import * from Common.DataType
> import * from
> +Common.BuildVersion import gBUILD_VERSION import
> Common.EdkLogger as
> +EdkLogger from Common.LongFilePathSupport import
> OpenLongFilePath as
> +open
> +
> +_BIOS_Signature = "$IBIOSI$"
> +_SectionKeyName = '__name__'
> +_SectionName = 'config'
> +
> +__prog__ = 'GenBiosld'
> +__description__ = 'Trim files preprocessed by compiler'
> +__copyright__ = 'Copyright (c) 2019, Intel Corporation.
> All rights reserved.<BR> '
> +__version__ = '%s Version %s' % (__prog__, '0.1 ')
> +
> +_ConfigItem = {
> +    "BOARD_ID"   : {'Value' : '', 'Length' : 7},
> +    "BOARD_REV"  : {'Value' : '', 'Length' : 1},
> +    "BOARD_EXT"  : { 'Value' : '', 'Length' : 3},
> +    "BUILD_TYPE" : {'Value' : '', 'Length' :1},
> +    "VERSION_MAJOR" : {'Value' : '0000', 'Length' : 4},
> +    "VERSION_MINOR" : {'Value' : '00', 'Length' : 2},
> +
> +}
> +
> +
> +_Usage = "Usage: GenBiosId -i Configfile -o OutputFile
> [-ob OutputBatchFile]"
> +_ConfigSectionNotDefine = "Not support the config file
> format, need config section"
> +_ConfigLenInvalid = "Config item %s length is invalid"
> +_ConfigItemInvalid = "Item %s is invalid"
> +
> +def Main():
> +    parser = argparse.ArgumentParser(prog=__prog__,
> +
> description=__description__ + __copyright__ + _Usage,
> +
> conflict_handler='resolve')
> +    parser.add_argument('-v', '--version',
> action='version', version=__version__,
> +                        help="show program's version
> number and exit")
> +    parser.add_argument('-i', '--int',
> metavar='FILENAME', dest='InputFile', help="Input Config
> file")
> +    parser.add_argument('-o', '--out',
> metavar='FILENAME', dest='OutputFile', help="Output
> file")
> +    parser.add_argument('-ob', '--batch',
> metavar='FILENAME', dest='OutputBatchFile',
> help="OutputBatch file")
> +    Options = parser.parse_args()
> +    try:
> +        EdkLogger.Initialize()
> +        if len(sys.argv) !=5 and not (len(sys.argv) == 7
> and Options.OutputBatchFile):
> +            EdkLogger.error("GenBiosId", OPTION_MISSING,
> ExtraData=_Usage)
> +        elif not Options.InputFile or not
> Options.OutputFile:
> +            EdkLogger.error("GenBiosId", OPTION_MISSING,
> ExtraData=_Usage)
> +    except FatalError as X:
> +        return 1
> +    InputFile = Options.InputFile
> +    OutputFile = Options.OutputFile
> +    OutputBatchFile = Options.OutputBatchFile
> +    if not os.path.exists(InputFile):
> +        EdkLogger.error("GenBiosId", FILE_NOT_FOUND,
> ExtraData="Input file not found")
> +    cf = ConfigParser()
> +    cf.optionxform = str
> +    cf.read(InputFile)
> +    if _SectionName not in cf._sections:
> +        EdkLogger.error("GenBiosId",
> FORMAT_NOT_SUPPORTED, ExtraData=_ConfigSectionNotDefine)
> +    for Item in cf._sections[_SectionName]:
> +        if Item == _SectionKeyName:
> +            continue
> +        if Item not in _ConfigItem:
> +            EdkLogger.error("GenBiosId", FORMAT_INVALID,
> ExtraData=_ConfigItemInvalid % Item)
> +        _ConfigItem[Item]['Value'] =
> cf._sections[_SectionName][Item]
> +        if len(_ConfigItem[Item]['Value']) !=
> _ConfigItem[Item]['Length']:
> +            EdkLogger.error("GenBiosId", FORMAT_INVALID,
> ExtraData=_ConfigLenInvalid % Item)
> +    for Item in _ConfigItem:
> +        if not _ConfigItem[Item]['Value']:
> +            EdkLogger.error("GenBiosId",
> FORMAT_UNKNOWN_ERROR, ExtraData="Item %s is missing" %
> Item)
> +    utcnow = datetime.datetime.utcnow()
> +    TimeStamp = time.strftime("%y%m%d%H%M",
> utcnow.timetuple())
> +
> +    Id_Str = _ConfigItem['BOARD_ID']['Value'] +
> _ConfigItem['BOARD_REV']['Value'] + '.' +
> _ConfigItem['BOARD_EXT']['Value'] + '.' +
> _ConfigItem['VERSION_MAJOR']['Value'] + \
> +             '.' + _ConfigItem["BUILD_TYPE"]['Value'] +
> _ConfigItem['VERSION_MINOR']['Value'] + '.' + TimeStamp
> +    with open(OutputFile, 'wb') as FdOut:
> +        for i in _BIOS_Signature:
> +            FdOut.write(struct.pack('B', ord(i)))
> +
> +        for i in Id_Str:
> +            FdOut.write(struct.pack('H', ord(i)))
> +
> +        FdOut.write(struct.pack('H', 0x00))
> +    if OutputBatchFile:
> +        with open(OutputBatchFile, 'w') as FdOut:
> +            if sys.platform.startswith('win'):
> +                Id_Str = 'SET BIOS_ID=' + Id_Str
> +            else:
> +                Id_Str = 'export BIOS_ID=' + Id_Str
> +            FdOut.write(Id_Str)
> +    return 0
> +
> +if __name__ == '__main__':
> +    r = Main()
> +    ## 0-127 is a safe return range, and 1 is a standard
> default error
> +    if r < 0 or r > 127: r = 1
> +    sys.exit(r)
> --
> 2.14.1.windows.1


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#42512): https://edk2.groups.io/g/devel/message/42512
Mute This Topic: https://groups.io/mt/32093449/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-





More information about the edk2-devel-archive mailing list