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

Zhang, Shenglei posted 1 patch 4 years, 9 months ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/edk2 tags/patchew/20190614073855.14788-1-shenglei.zhang@intel.com
There is a newer version of this series
BaseTools/BinWrappers/PosixLike/GenBiosId     |  14 +++
.../BinWrappers/WindowsLike/GenBiosId.bat     |   3 +
BaseTools/Source/Python/GenBiosId/BiosId.env  |  27 +++++
.../Source/Python/GenBiosId/GenBiosId.py      | 108 ++++++++++++++++++
4 files changed, 152 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
[edk2-devel] [PATCH] BaseTools/GenBiosId: Add a new tool GenBiosId
Posted by Zhang, Shenglei 4 years, 9 months ago
From: "Fan, Zhiju" <zhijux.fan@intel.com>

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@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Signed-off-by: Shenglei Zhang <shenglei.zhang@intel.com>
---
 BaseTools/BinWrappers/PosixLike/GenBiosId     |  14 +++
 .../BinWrappers/WindowsLike/GenBiosId.bat     |   3 +
 BaseTools/Source/Python/GenBiosId/BiosId.env  |  27 +++++
 .../Source/Python/GenBiosId/GenBiosId.py      | 108 ++++++++++++++++++
 4 files changed, 152 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 000000000000..9fb68299e4c6
--- /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:+:"$PYTHONPATH"}"
+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 000000000000..9616cd893bec
--- /dev/null
+++ b/BaseTools/BinWrappers/WindowsLike/GenBiosId.bat
@@ -0,0 +1,3 @@
+@setlocal
+@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 000000000000..92805e3cb78c
--- /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).$(BUILD_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 000000000000..1be99f4a5931
--- /dev/null
+++ b/BaseTools/Source/Python/GenBiosId/GenBiosId.py
@@ -0,0 +1,108 @@
+## @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
+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'
+
+_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():
+    try:
+        EdkLogger.Initialize()
+        if len(sys.argv) !=5 and len(sys.argv) != 7:
+            EdkLogger.error("GenBiosId", OPTION_MISSING, ExtraData=_Usage)
+    except FatalError as X:
+        return 1
+    InputFile = ''
+    OutputFile = ''
+    OutputBatchFile = ''
+    for Index, Item in enumerate(sys.argv):
+        if '-i' == Item:
+            InputFile = sys.argv[Index + 1]
+        if '-o' == Item:
+            OutputFile = sys.argv[Index + 1]
+        if '-ob' == Item:
+            OutputBatchFile = sys.argv[Index + 1]
+    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.18.0.windows.1


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

View/Reply Online (#42420): https://edk2.groups.io/g/devel/message/42420
Mute This Topic: https://groups.io/mt/32061587/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-

Re: [edk2-devel] [PATCH] BaseTools/GenBiosId: Add a new tool GenBiosId
Posted by Michael D Kinney 4 years, 9 months ago
Thank you for converting to Python.

Please use python argparse module to parse arguments and make
sure the tool supports the standard EDK II tool command line
arguments.  BinToPcd is a good example:

https://github.com/tianocore/edk2/blob/master/BaseTools/Scripts/BinToPcd.py

Mike

> -----Original Message-----
> From: devel@edk2.groups.io [mailto:devel@edk2.groups.io]
> On Behalf Of Zhang, Shenglei
> Sent: Friday, June 14, 2019 12:39 AM
> To: devel@edk2.groups.io
> Cc: Fan, ZhijuX <zhijux.fan@intel.com>; Feng, Bob C
> <bob.c.feng@intel.com>; Gao, Liming
> <liming.gao@intel.com>
> Subject: [edk2-devel] [PATCH] BaseTools/GenBiosId: Add a
> new tool GenBiosId
> 
> From: "Fan, Zhiju" <zhijux.fan@intel.com>
> 
> 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@intel.com>
> Cc: Liming Gao <liming.gao@intel.com>
> Signed-off-by: Shenglei Zhang <shenglei.zhang@intel.com>
> ---
>  BaseTools/BinWrappers/PosixLike/GenBiosId     |  14 +++
>  .../BinWrappers/WindowsLike/GenBiosId.bat     |   3 +
>  BaseTools/Source/Python/GenBiosId/BiosId.env  |  27
> +++++
>  .../Source/Python/GenBiosId/GenBiosId.py      | 108
> ++++++++++++++++++
>  4 files changed, 152 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 000000000000..9fb68299e4c6
> --- /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 000000000000..9616cd893bec
> --- /dev/null
> +++ b/BaseTools/BinWrappers/WindowsLike/GenBiosId.bat
> @@ -0,0 +1,3 @@
> +@setlocal
> +@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 000000000000..92805e3cb78c
> --- /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 000000000000..1be99f4a5931
> --- /dev/null
> +++ b/BaseTools/Source/Python/GenBiosId/GenBiosId.py
> @@ -0,0 +1,108 @@
> +## @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
> +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'
> +
> +_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():
> +    try:
> +        EdkLogger.Initialize()
> +        if len(sys.argv) !=5 and len(sys.argv) != 7:
> +            EdkLogger.error("GenBiosId", OPTION_MISSING,
> ExtraData=_Usage)
> +    except FatalError as X:
> +        return 1
> +    InputFile = ''
> +    OutputFile = ''
> +    OutputBatchFile = ''
> +    for Index, Item in enumerate(sys.argv):
> +        if '-i' == Item:
> +            InputFile = sys.argv[Index + 1]
> +        if '-o' == Item:
> +            OutputFile = sys.argv[Index + 1]
> +        if '-ob' == Item:
> +            OutputBatchFile = sys.argv[Index + 1]
> +    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.18.0.windows.1
> 
> 
> 


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

View/Reply Online (#42440): https://edk2.groups.io/g/devel/message/42440
Mute This Topic: https://groups.io/mt/32061587/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-