回复: [edk2-devel] [PATCH v4 1/1] BaseTools: Use pip module if available, CI uses it by default

gaoliming gaoliming at byosoft.com.cn
Thu Feb 4 08:04:24 UTC 2021


Matthew:
  I compare BaseTools\BinWrappers and BaseTools\BinPipWrappers. There are
two different files. 

1. New added BaseTools\BinWrappers\WindowsLike\Split.bat should be added
into BaseTools\BinPipWrappers
2. BaseTools\BinPipWrappers\WindowsLike\BrotliCompress.bat has been removed.
It is also removed from BaseTools\BinPipWrappers

Thanks
Liming
> -----邮件原件-----
> 发件人: bounce+27952+70867+4905953+8761045 at groups.io
> <bounce+27952+70867+4905953+8761045 at groups.io> 代表 Matthew
> Carlson
> 发送时间: 2021年1月29日 5:17
> 收件人: devel at edk2.groups.io
> 抄送: Bob Feng <bob.c.feng at intel.com>; Liming Gao
> <gaoliming at byosoft.com.cn>; Yuwei Chen <yuwei.chen at intel.com>;
> Matthew Carlson <matthewfcarlson at gmail.com>
> 主题: [edk2-devel] [PATCH v4 1/1] BaseTools: Use pip module if available,
CI
> uses it by default
> 
> From: Matthew Carlson <matthewfcarlson at gmail.com>
> 
> Use the new edk2-basetools pip module.
> Includes a helpful message in setup to let users know which has been
> selected.
> 
> Cc: Bob Feng <bob.c.feng at intel.com>
> Cc: Liming Gao <gaoliming at byosoft.com.cn>
> Cc: Yuwei Chen <yuwei.chen at intel.com>
> 
> Reviewed-by: Bob Feng <bob.c.feng at intel.com>
> 
> Signed-off-by: Matthew Carlson <matthewfcarlson at gmail.com>
> ---
>  .pytool/CISettings.py
> | 51 +++++++++++++-----
>  BaseTools/BinPipWrappers/PosixLike/AmlToC
> | 14 +++++
>  BaseTools/BinPipWrappers/PosixLike/BPDG
> | 12 +++++
>  BaseTools/BinPipWrappers/PosixLike/BrotliCompress
> | 34 ++++++++++++
>  BaseTools/BinPipWrappers/PosixLike/DevicePath
> | 29 +++++++++++
>  BaseTools/BinPipWrappers/PosixLike/Ecc
> | 13 +++++
>  BaseTools/BinPipWrappers/PosixLike/EfiRom
> | 29 +++++++++++
>  BaseTools/BinPipWrappers/PosixLike/GenCrc32
> | 29 +++++++++++
>  BaseTools/BinPipWrappers/PosixLike/GenDepex
> | 12 +++++
>  BaseTools/BinPipWrappers/PosixLike/GenFds
> | 12 +++++
>  BaseTools/BinPipWrappers/PosixLike/GenFfs
> | 29 +++++++++++
>  BaseTools/BinPipWrappers/PosixLike/GenFv
> | 29 +++++++++++
>  BaseTools/BinPipWrappers/PosixLike/GenFw
> | 29 +++++++++++
>  BaseTools/BinPipWrappers/PosixLike/GenPatchPcdTable
> | 12 +++++
>  BaseTools/BinPipWrappers/PosixLike/GenSec
> | 29 +++++++++++
>  BaseTools/BinPipWrappers/PosixLike/GenerateCapsule
> | 12 +++++
>  BaseTools/BinPipWrappers/PosixLike/LzmaCompress
> | 29 +++++++++++
>  BaseTools/BinPipWrappers/PosixLike/LzmaF86Compress
> | 19 +++++++
>  BaseTools/BinPipWrappers/PosixLike/PatchPcdValue
> | 12 +++++
>  BaseTools/BinPipWrappers/PosixLike/Pkcs7Sign
> | 12 +++++
>  BaseTools/BinPipWrappers/PosixLike/Rsa2048Sha256GenerateKeys
> | 12 +++++
>  BaseTools/BinPipWrappers/PosixLike/Rsa2048Sha256Sign
> | 12 +++++
>  BaseTools/BinPipWrappers/PosixLike/Split
> | 29 +++++++++++
>  BaseTools/BinPipWrappers/PosixLike/TargetTool
> | 12 +++++
>  BaseTools/BinPipWrappers/PosixLike/TianoCompress
> | 29 +++++++++++
>  BaseTools/BinPipWrappers/PosixLike/Trim
> | 13 +++++
>  BaseTools/BinPipWrappers/PosixLike/UPT
> | 12 +++++
>  BaseTools/BinPipWrappers/PosixLike/VfrCompile
> | 29 +++++++++++
>  BaseTools/BinPipWrappers/PosixLike/VolInfo
> | 29 +++++++++++
>  BaseTools/BinPipWrappers/PosixLike/build
> | 12 +++++
>  BaseTools/{BinWrappers =>
> BinPipWrappers}/PosixLike/posix_path_env.yaml             | 21
> ++++----
>  BaseTools/BinPipWrappers/WindowsLike/AmlToC.bat
> |  3 ++
>  BaseTools/BinPipWrappers/WindowsLike/BPDG.bat
> |  3 ++
>  BaseTools/BinPipWrappers/WindowsLike/BrotliCompress.bat
> | 55 ++++++++++++++++++++
>  BaseTools/BinPipWrappers/WindowsLike/Ecc.bat
> |  3 ++
>  BaseTools/BinPipWrappers/WindowsLike/GenDepex.bat
> |  3 ++
>  BaseTools/BinPipWrappers/WindowsLike/GenFds.bat
> |  3 ++
>  BaseTools/BinPipWrappers/WindowsLike/GenPatchPcdTable.bat
> |  3 ++
>  BaseTools/BinPipWrappers/WindowsLike/GenerateCapsule.bat
> |  1 +
>  BaseTools/BinPipWrappers/WindowsLike/PatchPcdValue.bat
> |  3 ++
>  BaseTools/BinPipWrappers/WindowsLike/Pkcs7Sign.bat
> |  3 ++
>  BaseTools/BinPipWrappers/WindowsLike/Rsa2048Sha256GenerateKeys.bat
> |  1 +
>  BaseTools/BinPipWrappers/WindowsLike/Rsa2048Sha256Sign.bat
> |  3 ++
>  BaseTools/BinPipWrappers/WindowsLike/TargetTool.bat
> |  3 ++
>  BaseTools/BinPipWrappers/WindowsLike/Trim.bat
> |  3 ++
>  BaseTools/BinPipWrappers/WindowsLike/UPT.bat
> |  3 ++
>  BaseTools/BinPipWrappers/WindowsLike/build.bat
> |  3 ++
>  BaseTools/{BinWrappers =>
> BinPipWrappers}/WindowsLike/win_build_tools_path_env.yaml |  3 +-
>  BaseTools/BinWrappers/PosixLike/posix_path_env.yaml
> |  1 +
>  BaseTools/BinWrappers/WindowsLike/win_build_tools_path_env.yaml
> |  1 +
>  BaseTools/BuildEnv
> | 14 ++++-
>  BaseTools/Scripts/PatchCheck.py
> |  1 +
>  BaseTools/Source/Python/README.md
> | 29 +++++++++++
>  BaseTools/toolsetup.bat
> | 19 +++++++
>  pip-requirements.txt
> |  1 +
>  55 files changed, 797 insertions(+), 25 deletions(-)
> 
> diff --git a/.pytool/CISettings.py b/.pytool/CISettings.py
> index e6c5ac700ab2..5f71eca1992e 100644
> --- a/.pytool/CISettings.py
> +++ b/.pytool/CISettings.py
> @@ -22,16 +22,24 @@ class Settings(CiBuildSettingsManager,
> UpdateSettingsManager, SetupSettingsManag
>          self.ActualTargets = []
> 
>          self.ActualArchitectures = []
> 
>          self.ActualToolChainTag = ""
> 
> +        self.UseBuiltInBaseTools = None
> 
> +        self.ActualScopes = None
> 
> 
> 
>      #
> ##############################################################
> ######################### #
> 
>      #                             Extra CmdLine configuration
> #
> 
>      #
> ##############################################################
> ######################### #
> 
> 
> 
>      def AddCommandLineOptions(self, parserObj):
> 
> -        pass
> 
> +        group = parserObj.add_mutually_exclusive_group()
> 
> +        group.add_argument("-force_piptools", "--fpt",
> dest="force_piptools", action="store_true", default=False, help="Force the
> system to use pip tools")
> 
> +        group.add_argument("-no_piptools", "--npt", dest="no_piptools",
> action="store_true", default=False, help="Force the system to not use pip
> tools")
> 
> 
> 
>      def RetrieveCommandLineOptions(self, args):
> 
> -        pass
> 
> +        super().RetrieveCommandLineOptions(args)
> 
> +        if args.force_piptools:
> 
> +            self.UseBuiltInBaseTools = True
> 
> +        if args.no_piptools:
> 
> +            self.UseBuiltInBaseTools = False
> 
> 
> 
>      #
> ##############################################################
> ######################### #
> 
>      #                        Default Support for this Ci Build
> #
> 
> @@ -128,19 +136,38 @@ class Settings(CiBuildSettingsManager,
> UpdateSettingsManager, SetupSettingsManag
> 
> 
>      def GetActiveScopes(self):
> 
>          ''' return tuple containing scopes that should be active for this
> process '''
> 
> -        scopes = ("cibuild", "edk2-build", "host-based-test")
> 
> +        if self.ActualScopes is None:
> 
> +            scopes = ("cibuild", "edk2-build", "host-based-test")
> 
> 
> 
> -        self.ActualToolChainTag =
> shell_environment.GetBuildVars().GetValue("TOOL_CHAIN_TAG", "")
> 
> +            self.ActualToolChainTag =
> shell_environment.GetBuildVars().GetValue("TOOL_CHAIN_TAG", "")
> 
> 
> 
> -        if GetHostInfo().os.upper() == "LINUX" and
> self.ActualToolChainTag.upper().startswith("GCC"):
> 
> -            if "AARCH64" in self.ActualArchitectures:
> 
> -                scopes += ("gcc_aarch64_linux",)
> 
> -            if "ARM" in self.ActualArchitectures:
> 
> -                scopes += ("gcc_arm_linux",)
> 
> -            if "RISCV64" in self.ActualArchitectures:
> 
> -                scopes += ("gcc_riscv64_unknown",)
> 
> +            is_linux = GetHostInfo().os.upper() == "LINUX"
> 
> 
> 
> -        return scopes
> 
> +            if self.UseBuiltInBaseTools is None:
> 
> +                is_linux = GetHostInfo().os.upper() == "LINUX"
> 
> +                # try and import the pip module for basetools
> 
> +                try:
> 
> +                    import edk2basetools
> 
> +                    self.UseBuiltInBaseTools = True
> 
> +                except ImportError:
> 
> +                    self.UseBuiltInBaseTools = False
> 
> +                    pass
> 
> +
> 
> +            if self.UseBuiltInBaseTools == True:
> 
> +                scopes += ('pipbuild-unix',) if is_linux else
('pipbuild-win',)
> 
> +                logging.warning("Using Pip Tools based BaseTools")
> 
> +            else:
> 
> +                logging.warning("Falling back to using in-tree
> BaseTools")
> 
> +
> 
> +            if is_linux and
> self.ActualToolChainTag.upper().startswith("GCC"):
> 
> +                if "AARCH64" in self.ActualArchitectures:
> 
> +                    scopes += ("gcc_aarch64_linux",)
> 
> +                if "ARM" in self.ActualArchitectures:
> 
> +                    scopes += ("gcc_arm_linux",)
> 
> +                if "RISCV64" in self.ActualArchitectures:
> 
> +                    scopes += ("gcc_riscv64_unknown",)
> 
> +            self.ActualScopes = scopes
> 
> +        return self.ActualScopes
> 
> 
> 
>      def GetRequiredSubmodules(self):
> 
>          ''' return iterable containing RequiredSubmodule objects.
> 
> diff --git a/BaseTools/BinPipWrappers/PosixLike/AmlToC
> b/BaseTools/BinPipWrappers/PosixLike/AmlToC
> new file mode 100755
> index 000000000000..1dd28e966288
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/AmlToC
> @@ -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/BinPipWrappers/PosixLike/BPDG
> b/BaseTools/BinPipWrappers/PosixLike/BPDG
> new file mode 100755
> index 000000000000..a08cbd8de5c5
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/BPDG
> @@ -0,0 +1,12 @@
> +#!/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
> +cmd=${full_cmd##*/}
> +
> +exec "${python_exe:-python}" -m edk2basetools.$cmd.EccMain "$@"
> diff --git a/BaseTools/BinPipWrappers/PosixLike/BrotliCompress
> b/BaseTools/BinPipWrappers/PosixLike/BrotliCompress
> new file mode 100755
> index 000000000000..663860bb3e57
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/BrotliCompress
> @@ -0,0 +1,34 @@
> +#!/usr/bin/env bash
> +#
> +# This script will exec Brotli tool with -e/-d options.
> +#
> +# Copyright (c) 2017 - 2018, Intel Corporation. All rights reserved.<BR>
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +QLT="-q 9 -w 22"
> +ARGS=
> +
> +while test $# -gt 0
> +do
> +  case $1 in
> +    -e)
> +      ;;
> +    -d)
> +      ARGS+="$1 "
> +      ;;
> +    -o|-g)
> +      ARGS+="$1 $2 "
> +      shift
> +      ;;
> +    -q)
> +      QLT="$1 $2 "
> +      shift
> +      ;;
> +    *)
> +      ARGS+="$1 "
> +      ;;
> +  esac
> +  shift
> +done
> +
> +exec Brotli $QLT $ARGS
> diff --git a/BaseTools/BinPipWrappers/PosixLike/DevicePath
> b/BaseTools/BinPipWrappers/PosixLike/DevicePath
> new file mode 100755
> index 000000000000..0945d86d9209
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/DevicePath
> @@ -0,0 +1,29 @@
> +#!/usr/bin/env bash
> +
> +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")
> +cmd=${full_cmd##*/}
> +
> +if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/Conf/BaseToolsCBinaries" ]
> +then
> +  exec "$WORKSPACE/Conf/BaseToolsCBinaries/$cmd"
> +elif [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/Source/C" ]
> +then
> +  if [ ! -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ]
> +  then
> +    echo "BaseTools C Tool binary was not found ($cmd)"
> +    echo "You may need to run:"
> +    echo "  make -C $EDK_TOOLS_PATH/Source/C"
> +  else
> +    exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" "$@"
> +  fi
> +elif [ -e "$dir/../../Source/C/bin/$cmd" ]
> +then
> +  exec "$dir/../../Source/C/bin/$cmd" "$@"
> +else
> +  echo "Unable to find the real '$cmd' to run"
> +  echo "This message was printed by"
> +  echo "  $0"
> +  exit 127
> +fi
> +
> diff --git a/BaseTools/BinPipWrappers/PosixLike/Ecc
> b/BaseTools/BinPipWrappers/PosixLike/Ecc
> new file mode 100755
> index 000000000000..598728915095
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/Ecc
> @@ -0,0 +1,13 @@
> +#!/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
> +cmd=${full_cmd##*/}
> +
> +export
> PYTHONPATH="$dir/../../Source/Python${PYTHONPATH:+:"$PYTHONPATH"}"
> +exec "${python_exe:-python}" -m $cmd.EccMain "$@"
> diff --git a/BaseTools/BinPipWrappers/PosixLike/EfiRom
> b/BaseTools/BinPipWrappers/PosixLike/EfiRom
> new file mode 100755
> index 000000000000..0945d86d9209
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/EfiRom
> @@ -0,0 +1,29 @@
> +#!/usr/bin/env bash
> +
> +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")
> +cmd=${full_cmd##*/}
> +
> +if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/Conf/BaseToolsCBinaries" ]
> +then
> +  exec "$WORKSPACE/Conf/BaseToolsCBinaries/$cmd"
> +elif [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/Source/C" ]
> +then
> +  if [ ! -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ]
> +  then
> +    echo "BaseTools C Tool binary was not found ($cmd)"
> +    echo "You may need to run:"
> +    echo "  make -C $EDK_TOOLS_PATH/Source/C"
> +  else
> +    exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" "$@"
> +  fi
> +elif [ -e "$dir/../../Source/C/bin/$cmd" ]
> +then
> +  exec "$dir/../../Source/C/bin/$cmd" "$@"
> +else
> +  echo "Unable to find the real '$cmd' to run"
> +  echo "This message was printed by"
> +  echo "  $0"
> +  exit 127
> +fi
> +
> diff --git a/BaseTools/BinPipWrappers/PosixLike/GenCrc32
> b/BaseTools/BinPipWrappers/PosixLike/GenCrc32
> new file mode 100755
> index 000000000000..0945d86d9209
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/GenCrc32
> @@ -0,0 +1,29 @@
> +#!/usr/bin/env bash
> +
> +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")
> +cmd=${full_cmd##*/}
> +
> +if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/Conf/BaseToolsCBinaries" ]
> +then
> +  exec "$WORKSPACE/Conf/BaseToolsCBinaries/$cmd"
> +elif [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/Source/C" ]
> +then
> +  if [ ! -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ]
> +  then
> +    echo "BaseTools C Tool binary was not found ($cmd)"
> +    echo "You may need to run:"
> +    echo "  make -C $EDK_TOOLS_PATH/Source/C"
> +  else
> +    exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" "$@"
> +  fi
> +elif [ -e "$dir/../../Source/C/bin/$cmd" ]
> +then
> +  exec "$dir/../../Source/C/bin/$cmd" "$@"
> +else
> +  echo "Unable to find the real '$cmd' to run"
> +  echo "This message was printed by"
> +  echo "  $0"
> +  exit 127
> +fi
> +
> diff --git a/BaseTools/BinPipWrappers/PosixLike/GenDepex
> b/BaseTools/BinPipWrappers/PosixLike/GenDepex
> new file mode 100755
> index 000000000000..df75e43f9ec1
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/GenDepex
> @@ -0,0 +1,12 @@
> +#!/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
> +cmd=${full_cmd##*/}
> +
> +exec "${python_exe:-python}" -m edk2basetools.AutoGen.$cmd "$@"
> diff --git a/BaseTools/BinPipWrappers/PosixLike/GenFds
> b/BaseTools/BinPipWrappers/PosixLike/GenFds
> new file mode 100755
> index 000000000000..b27e84eaa210
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/GenFds
> @@ -0,0 +1,12 @@
> +#!/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
> +cmd=${full_cmd##*/}
> +
> +exec "${python_exe:-python}" -m edk2basetools.$cmd "$@"
> diff --git a/BaseTools/BinPipWrappers/PosixLike/GenFfs
> b/BaseTools/BinPipWrappers/PosixLike/GenFfs
> new file mode 100755
> index 000000000000..0945d86d9209
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/GenFfs
> @@ -0,0 +1,29 @@
> +#!/usr/bin/env bash
> +
> +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")
> +cmd=${full_cmd##*/}
> +
> +if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/Conf/BaseToolsCBinaries" ]
> +then
> +  exec "$WORKSPACE/Conf/BaseToolsCBinaries/$cmd"
> +elif [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/Source/C" ]
> +then
> +  if [ ! -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ]
> +  then
> +    echo "BaseTools C Tool binary was not found ($cmd)"
> +    echo "You may need to run:"
> +    echo "  make -C $EDK_TOOLS_PATH/Source/C"
> +  else
> +    exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" "$@"
> +  fi
> +elif [ -e "$dir/../../Source/C/bin/$cmd" ]
> +then
> +  exec "$dir/../../Source/C/bin/$cmd" "$@"
> +else
> +  echo "Unable to find the real '$cmd' to run"
> +  echo "This message was printed by"
> +  echo "  $0"
> +  exit 127
> +fi
> +
> diff --git a/BaseTools/BinPipWrappers/PosixLike/GenFv
> b/BaseTools/BinPipWrappers/PosixLike/GenFv
> new file mode 100755
> index 000000000000..0945d86d9209
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/GenFv
> @@ -0,0 +1,29 @@
> +#!/usr/bin/env bash
> +
> +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")
> +cmd=${full_cmd##*/}
> +
> +if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/Conf/BaseToolsCBinaries" ]
> +then
> +  exec "$WORKSPACE/Conf/BaseToolsCBinaries/$cmd"
> +elif [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/Source/C" ]
> +then
> +  if [ ! -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ]
> +  then
> +    echo "BaseTools C Tool binary was not found ($cmd)"
> +    echo "You may need to run:"
> +    echo "  make -C $EDK_TOOLS_PATH/Source/C"
> +  else
> +    exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" "$@"
> +  fi
> +elif [ -e "$dir/../../Source/C/bin/$cmd" ]
> +then
> +  exec "$dir/../../Source/C/bin/$cmd" "$@"
> +else
> +  echo "Unable to find the real '$cmd' to run"
> +  echo "This message was printed by"
> +  echo "  $0"
> +  exit 127
> +fi
> +
> diff --git a/BaseTools/BinPipWrappers/PosixLike/GenFw
> b/BaseTools/BinPipWrappers/PosixLike/GenFw
> new file mode 100755
> index 000000000000..0945d86d9209
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/GenFw
> @@ -0,0 +1,29 @@
> +#!/usr/bin/env bash
> +
> +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")
> +cmd=${full_cmd##*/}
> +
> +if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/Conf/BaseToolsCBinaries" ]
> +then
> +  exec "$WORKSPACE/Conf/BaseToolsCBinaries/$cmd"
> +elif [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/Source/C" ]
> +then
> +  if [ ! -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ]
> +  then
> +    echo "BaseTools C Tool binary was not found ($cmd)"
> +    echo "You may need to run:"
> +    echo "  make -C $EDK_TOOLS_PATH/Source/C"
> +  else
> +    exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" "$@"
> +  fi
> +elif [ -e "$dir/../../Source/C/bin/$cmd" ]
> +then
> +  exec "$dir/../../Source/C/bin/$cmd" "$@"
> +else
> +  echo "Unable to find the real '$cmd' to run"
> +  echo "This message was printed by"
> +  echo "  $0"
> +  exit 127
> +fi
> +
> diff --git a/BaseTools/BinPipWrappers/PosixLike/GenPatchPcdTable
> b/BaseTools/BinPipWrappers/PosixLike/GenPatchPcdTable
> new file mode 100755
> index 000000000000..9d143c7fc6c2
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/GenPatchPcdTable
> @@ -0,0 +1,12 @@
> +#!/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
> +cmd=${full_cmd##*/}
> +
> +exec "${python_exe:-python}" -m edk2basetools.$cmd.$cmd "$@"
> diff --git a/BaseTools/BinPipWrappers/PosixLike/GenSec
> b/BaseTools/BinPipWrappers/PosixLike/GenSec
> new file mode 100755
> index 000000000000..0945d86d9209
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/GenSec
> @@ -0,0 +1,29 @@
> +#!/usr/bin/env bash
> +
> +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")
> +cmd=${full_cmd##*/}
> +
> +if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/Conf/BaseToolsCBinaries" ]
> +then
> +  exec "$WORKSPACE/Conf/BaseToolsCBinaries/$cmd"
> +elif [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/Source/C" ]
> +then
> +  if [ ! -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ]
> +  then
> +    echo "BaseTools C Tool binary was not found ($cmd)"
> +    echo "You may need to run:"
> +    echo "  make -C $EDK_TOOLS_PATH/Source/C"
> +  else
> +    exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" "$@"
> +  fi
> +elif [ -e "$dir/../../Source/C/bin/$cmd" ]
> +then
> +  exec "$dir/../../Source/C/bin/$cmd" "$@"
> +else
> +  echo "Unable to find the real '$cmd' to run"
> +  echo "This message was printed by"
> +  echo "  $0"
> +  exit 127
> +fi
> +
> diff --git a/BaseTools/BinPipWrappers/PosixLike/GenerateCapsule
> b/BaseTools/BinPipWrappers/PosixLike/GenerateCapsule
> new file mode 100755
> index 000000000000..366a268802c4
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/GenerateCapsule
> @@ -0,0 +1,12 @@
> +#!/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
> +cmd=${full_cmd##*/}
> +
> +exec "${python_exe:-python}" -m edk2basetools.Capsule.$cmd "$@"
> diff --git a/BaseTools/BinPipWrappers/PosixLike/LzmaCompress
> b/BaseTools/BinPipWrappers/PosixLike/LzmaCompress
> new file mode 100755
> index 000000000000..0945d86d9209
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/LzmaCompress
> @@ -0,0 +1,29 @@
> +#!/usr/bin/env bash
> +
> +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")
> +cmd=${full_cmd##*/}
> +
> +if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/Conf/BaseToolsCBinaries" ]
> +then
> +  exec "$WORKSPACE/Conf/BaseToolsCBinaries/$cmd"
> +elif [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/Source/C" ]
> +then
> +  if [ ! -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ]
> +  then
> +    echo "BaseTools C Tool binary was not found ($cmd)"
> +    echo "You may need to run:"
> +    echo "  make -C $EDK_TOOLS_PATH/Source/C"
> +  else
> +    exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" "$@"
> +  fi
> +elif [ -e "$dir/../../Source/C/bin/$cmd" ]
> +then
> +  exec "$dir/../../Source/C/bin/$cmd" "$@"
> +else
> +  echo "Unable to find the real '$cmd' to run"
> +  echo "This message was printed by"
> +  echo "  $0"
> +  exit 127
> +fi
> +
> diff --git a/BaseTools/BinPipWrappers/PosixLike/LzmaF86Compress
> b/BaseTools/BinPipWrappers/PosixLike/LzmaF86Compress
> new file mode 100755
> index 000000000000..b55352ae4c79
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/LzmaF86Compress
> @@ -0,0 +1,19 @@
> +#!/usr/bin/env bash
> +#
> +# This script will exec LzmaCompress tool with --f86 option that enables
> converter for x86 code.
> +#
> +# (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
> +# Copyright (c) 2012, Intel Corporation. All rights reserved.<BR>
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +
> +for arg; do
> +  case $arg in
> +    -e|-d)
> +      set -- "$@" --f86
> +      break
> +    ;;
> +  esac
> +done
> +
> +exec LzmaCompress "$@"
> diff --git a/BaseTools/BinPipWrappers/PosixLike/PatchPcdValue
> b/BaseTools/BinPipWrappers/PosixLike/PatchPcdValue
> new file mode 100755
> index 000000000000..9d143c7fc6c2
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/PatchPcdValue
> @@ -0,0 +1,12 @@
> +#!/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
> +cmd=${full_cmd##*/}
> +
> +exec "${python_exe:-python}" -m edk2basetools.$cmd.$cmd "$@"
> diff --git a/BaseTools/BinPipWrappers/PosixLike/Pkcs7Sign
> b/BaseTools/BinPipWrappers/PosixLike/Pkcs7Sign
> new file mode 100755
> index 000000000000..9d143c7fc6c2
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/Pkcs7Sign
> @@ -0,0 +1,12 @@
> +#!/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
> +cmd=${full_cmd##*/}
> +
> +exec "${python_exe:-python}" -m edk2basetools.$cmd.$cmd "$@"
> diff --git
> a/BaseTools/BinPipWrappers/PosixLike/Rsa2048Sha256GenerateKeys
> b/BaseTools/BinPipWrappers/PosixLike/Rsa2048Sha256GenerateKeys
> new file mode 100755
> index 000000000000..aca2f3a6fe2a
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/Rsa2048Sha256GenerateKeys
> @@ -0,0 +1,12 @@
> +#!/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
> +cmd=${full_cmd##*/}
> +
> +exec "${python_exe:-python}" -m edk2basetools.Rsa2048Sha256Sign.$cmd
> "$@"
> diff --git a/BaseTools/BinPipWrappers/PosixLike/Rsa2048Sha256Sign
> b/BaseTools/BinPipWrappers/PosixLike/Rsa2048Sha256Sign
> new file mode 100755
> index 000000000000..068364070518
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/Rsa2048Sha256Sign
> @@ -0,0 +1,12 @@
> +#!/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
> +cmd=${full_cmd##*/}
> +
> +exec "${python_exe:-python}" -m edk2basetools.$cmd.$cmd "$@"
> \ No newline at end of file
> diff --git a/BaseTools/BinPipWrappers/PosixLike/Split
> b/BaseTools/BinPipWrappers/PosixLike/Split
> new file mode 100755
> index 000000000000..0945d86d9209
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/Split
> @@ -0,0 +1,29 @@
> +#!/usr/bin/env bash
> +
> +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")
> +cmd=${full_cmd##*/}
> +
> +if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/Conf/BaseToolsCBinaries" ]
> +then
> +  exec "$WORKSPACE/Conf/BaseToolsCBinaries/$cmd"
> +elif [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/Source/C" ]
> +then
> +  if [ ! -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ]
> +  then
> +    echo "BaseTools C Tool binary was not found ($cmd)"
> +    echo "You may need to run:"
> +    echo "  make -C $EDK_TOOLS_PATH/Source/C"
> +  else
> +    exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" "$@"
> +  fi
> +elif [ -e "$dir/../../Source/C/bin/$cmd" ]
> +then
> +  exec "$dir/../../Source/C/bin/$cmd" "$@"
> +else
> +  echo "Unable to find the real '$cmd' to run"
> +  echo "This message was printed by"
> +  echo "  $0"
> +  exit 127
> +fi
> +
> diff --git a/BaseTools/BinPipWrappers/PosixLike/TargetTool
> b/BaseTools/BinPipWrappers/PosixLike/TargetTool
> new file mode 100755
> index 000000000000..9d143c7fc6c2
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/TargetTool
> @@ -0,0 +1,12 @@
> +#!/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
> +cmd=${full_cmd##*/}
> +
> +exec "${python_exe:-python}" -m edk2basetools.$cmd.$cmd "$@"
> diff --git a/BaseTools/BinPipWrappers/PosixLike/TianoCompress
> b/BaseTools/BinPipWrappers/PosixLike/TianoCompress
> new file mode 100755
> index 000000000000..0945d86d9209
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/TianoCompress
> @@ -0,0 +1,29 @@
> +#!/usr/bin/env bash
> +
> +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")
> +cmd=${full_cmd##*/}
> +
> +if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/Conf/BaseToolsCBinaries" ]
> +then
> +  exec "$WORKSPACE/Conf/BaseToolsCBinaries/$cmd"
> +elif [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/Source/C" ]
> +then
> +  if [ ! -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ]
> +  then
> +    echo "BaseTools C Tool binary was not found ($cmd)"
> +    echo "You may need to run:"
> +    echo "  make -C $EDK_TOOLS_PATH/Source/C"
> +  else
> +    exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" "$@"
> +  fi
> +elif [ -e "$dir/../../Source/C/bin/$cmd" ]
> +then
> +  exec "$dir/../../Source/C/bin/$cmd" "$@"
> +else
> +  echo "Unable to find the real '$cmd' to run"
> +  echo "This message was printed by"
> +  echo "  $0"
> +  exit 127
> +fi
> +
> diff --git a/BaseTools/BinPipWrappers/PosixLike/Trim
> b/BaseTools/BinPipWrappers/PosixLike/Trim
> new file mode 100755
> index 000000000000..0bd14ee03872
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/Trim
> @@ -0,0 +1,13 @@
> +#!/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
> +cmd=$(basename "$full_cmd")
> +
> +exec "${python_exe:-python}" -m edk2basetools.$cmd.$cmd "$@"
> +
> diff --git a/BaseTools/BinPipWrappers/PosixLike/UPT
> b/BaseTools/BinPipWrappers/PosixLike/UPT
> new file mode 100755
> index 000000000000..068364070518
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/UPT
> @@ -0,0 +1,12 @@
> +#!/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
> +cmd=${full_cmd##*/}
> +
> +exec "${python_exe:-python}" -m edk2basetools.$cmd.$cmd "$@"
> \ No newline at end of file
> diff --git a/BaseTools/BinPipWrappers/PosixLike/VfrCompile
> b/BaseTools/BinPipWrappers/PosixLike/VfrCompile
> new file mode 100755
> index 000000000000..0945d86d9209
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/VfrCompile
> @@ -0,0 +1,29 @@
> +#!/usr/bin/env bash
> +
> +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")
> +cmd=${full_cmd##*/}
> +
> +if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/Conf/BaseToolsCBinaries" ]
> +then
> +  exec "$WORKSPACE/Conf/BaseToolsCBinaries/$cmd"
> +elif [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/Source/C" ]
> +then
> +  if [ ! -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ]
> +  then
> +    echo "BaseTools C Tool binary was not found ($cmd)"
> +    echo "You may need to run:"
> +    echo "  make -C $EDK_TOOLS_PATH/Source/C"
> +  else
> +    exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" "$@"
> +  fi
> +elif [ -e "$dir/../../Source/C/bin/$cmd" ]
> +then
> +  exec "$dir/../../Source/C/bin/$cmd" "$@"
> +else
> +  echo "Unable to find the real '$cmd' to run"
> +  echo "This message was printed by"
> +  echo "  $0"
> +  exit 127
> +fi
> +
> diff --git a/BaseTools/BinPipWrappers/PosixLike/VolInfo
> b/BaseTools/BinPipWrappers/PosixLike/VolInfo
> new file mode 100755
> index 000000000000..0945d86d9209
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/VolInfo
> @@ -0,0 +1,29 @@
> +#!/usr/bin/env bash
> +
> +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")
> +cmd=${full_cmd##*/}
> +
> +if [ -n "$WORKSPACE" ] && [ -e "$WORKSPACE/Conf/BaseToolsCBinaries" ]
> +then
> +  exec "$WORKSPACE/Conf/BaseToolsCBinaries/$cmd"
> +elif [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/Source/C" ]
> +then
> +  if [ ! -e "$EDK_TOOLS_PATH/Source/C/bin/$cmd" ]
> +  then
> +    echo "BaseTools C Tool binary was not found ($cmd)"
> +    echo "You may need to run:"
> +    echo "  make -C $EDK_TOOLS_PATH/Source/C"
> +  else
> +    exec "$EDK_TOOLS_PATH/Source/C/bin/$cmd" "$@"
> +  fi
> +elif [ -e "$dir/../../Source/C/bin/$cmd" ]
> +then
> +  exec "$dir/../../Source/C/bin/$cmd" "$@"
> +else
> +  echo "Unable to find the real '$cmd' to run"
> +  echo "This message was printed by"
> +  echo "  $0"
> +  exit 127
> +fi
> +
> diff --git a/BaseTools/BinPipWrappers/PosixLike/build
> b/BaseTools/BinPipWrappers/PosixLike/build
> new file mode 100755
> index 000000000000..9d143c7fc6c2
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/PosixLike/build
> @@ -0,0 +1,12 @@
> +#!/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
> +cmd=${full_cmd##*/}
> +
> +exec "${python_exe:-python}" -m edk2basetools.$cmd.$cmd "$@"
> diff --git a/BaseTools/BinWrappers/PosixLike/posix_path_env.yaml
> b/BaseTools/BinPipWrappers/PosixLike/posix_path_env.yaml
> similarity index 74%
> copy from BaseTools/BinWrappers/PosixLike/posix_path_env.yaml
> copy to BaseTools/BinPipWrappers/PosixLike/posix_path_env.yaml
> index 8b32e010bb1d..830670305c0c 100644
> --- a/BaseTools/BinWrappers/PosixLike/posix_path_env.yaml
> +++ b/BaseTools/BinPipWrappers/PosixLike/posix_path_env.yaml
> @@ -1,10 +1,11 @@
> -## @file
> 
> -# Set this folder on the path for all linux builds
> 
> -#
> 
> -# Copyright (c) Microsoft Corporation.
> 
> -# SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> -##
> 
> -{
> 
> -  "scope": "global-nix",
> 
> -  "flags": ["set_path"]
> 
> -}
> 
> +## @file
> +# Set this folder on the path for all linux builds
> +#
> +# Copyright (c) Microsoft Corporation.
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
> +##
> +{
> +  "scope": "pipbuild-unix",
> +  "override_id": "binwrappers",
> +  "flags": ["set_path"]
> +}
> diff --git a/BaseTools/BinPipWrappers/WindowsLike/AmlToC.bat
> b/BaseTools/BinPipWrappers/WindowsLike/AmlToC.bat
> new file mode 100644
> index 000000000000..d347d6484467
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/WindowsLike/AmlToC.bat
> @@ -0,0 +1,3 @@
> + at setlocal
> 
> + at set ToolName=%~n0%
> 
> +@%PYTHON_COMMAND% -m
> edk2basetools.%ToolName%.%ToolName% %*
> 
> diff --git a/BaseTools/BinPipWrappers/WindowsLike/BPDG.bat
> b/BaseTools/BinPipWrappers/WindowsLike/BPDG.bat
> new file mode 100644
> index 000000000000..d347d6484467
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/WindowsLike/BPDG.bat
> @@ -0,0 +1,3 @@
> + at setlocal
> 
> + at set ToolName=%~n0%
> 
> +@%PYTHON_COMMAND% -m
> edk2basetools.%ToolName%.%ToolName% %*
> 
> diff --git a/BaseTools/BinPipWrappers/WindowsLike/BrotliCompress.bat
> b/BaseTools/BinPipWrappers/WindowsLike/BrotliCompress.bat
> new file mode 100644
> index 000000000000..788c99a1307d
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/WindowsLike/BrotliCompress.bat
> @@ -0,0 +1,55 @@
> + at REM @file
> 
> + at REM This script will exec Brotli tool with -e/-d options.
> 
> + at REM
> 
> + at REM Copyright (c) 2017 - 2018, Intel Corporation. All rights
reserved.<BR>
> 
> + at REM SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> + at REM
> 
> +
> 
> + at echo off
> 
> + at setlocal
> 
> +
> 
> +set QLT=-q 9 -w 22
> 
> +set ARGS=
> 
> +
> 
> +:Begin
> 
> +if "%1"=="" goto End
> 
> +
> 
> +if "%1"=="-d" (
> 
> +  set ARGS=%ARGS% %1
> 
> +  shift
> 
> +  goto Begin
> 
> +)
> 
> +
> 
> +if "%1"=="-e" (
> 
> +  shift
> 
> +  goto Begin
> 
> +)
> 
> +
> 
> +if "%1"=="-g" (
> 
> +  set ARGS=%ARGS% %1 %2
> 
> +  shift
> 
> +  shift
> 
> +  goto Begin
> 
> +)
> 
> +
> 
> +if "%1"=="-o" (
> 
> +  set ARGS=%ARGS% %1 %2
> 
> +  shift
> 
> +  shift
> 
> +  goto Begin
> 
> +)
> 
> +
> 
> +if "%1"=="-q" (
> 
> +  set QLT=%1 %2
> 
> +  shift
> 
> +  shift
> 
> +  goto Begin
> 
> +)
> 
> +
> 
> +set ARGS=%ARGS% %1
> 
> +shift
> 
> +goto Begin
> 
> +
> 
> +:End
> 
> +Brotli %QLT% %ARGS%
> 
> + at echo on
> 
> diff --git a/BaseTools/BinPipWrappers/WindowsLike/Ecc.bat
> b/BaseTools/BinPipWrappers/WindowsLike/Ecc.bat
> new file mode 100644
> index 000000000000..16a0a799a43b
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/WindowsLike/Ecc.bat
> @@ -0,0 +1,3 @@
> + at setlocal
> 
> + at set ToolName=%~n0%
> 
> +@%PYTHON_COMMAND% -m edk2basetools.%ToolName%.EccMain %*
> 
> diff --git a/BaseTools/BinPipWrappers/WindowsLike/GenDepex.bat
> b/BaseTools/BinPipWrappers/WindowsLike/GenDepex.bat
> new file mode 100644
> index 000000000000..481b5ac47d24
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/WindowsLike/GenDepex.bat
> @@ -0,0 +1,3 @@
> + at setlocal
> 
> + at set ToolName=%~n0%
> 
> +@%PYTHON_COMMAND% -m edk2basetools.AutoGen.%ToolName% %*
> 
> diff --git a/BaseTools/BinPipWrappers/WindowsLike/GenFds.bat
> b/BaseTools/BinPipWrappers/WindowsLike/GenFds.bat
> new file mode 100644
> index 000000000000..d347d6484467
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/WindowsLike/GenFds.bat
> @@ -0,0 +1,3 @@
> + at setlocal
> 
> + at set ToolName=%~n0%
> 
> +@%PYTHON_COMMAND% -m
> edk2basetools.%ToolName%.%ToolName% %*
> 
> diff --git a/BaseTools/BinPipWrappers/WindowsLike/GenPatchPcdTable.bat
> b/BaseTools/BinPipWrappers/WindowsLike/GenPatchPcdTable.bat
> new file mode 100644
> index 000000000000..d347d6484467
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/WindowsLike/GenPatchPcdTable.bat
> @@ -0,0 +1,3 @@
> + at setlocal
> 
> + at set ToolName=%~n0%
> 
> +@%PYTHON_COMMAND% -m
> edk2basetools.%ToolName%.%ToolName% %*
> 
> diff --git a/BaseTools/BinPipWrappers/WindowsLike/GenerateCapsule.bat
> b/BaseTools/BinPipWrappers/WindowsLike/GenerateCapsule.bat
> new file mode 100644
> index 000000000000..34c43ac7fc99
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/WindowsLike/GenerateCapsule.bat
> @@ -0,0 +1 @@
> +@%PYTHON_COMMAND% -m edk2basetools.Capsule.GenerateCapsule %*
> 
> diff --git a/BaseTools/BinPipWrappers/WindowsLike/PatchPcdValue.bat
> b/BaseTools/BinPipWrappers/WindowsLike/PatchPcdValue.bat
> new file mode 100644
> index 000000000000..d347d6484467
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/WindowsLike/PatchPcdValue.bat
> @@ -0,0 +1,3 @@
> + at setlocal
> 
> + at set ToolName=%~n0%
> 
> +@%PYTHON_COMMAND% -m
> edk2basetools.%ToolName%.%ToolName% %*
> 
> diff --git a/BaseTools/BinPipWrappers/WindowsLike/Pkcs7Sign.bat
> b/BaseTools/BinPipWrappers/WindowsLike/Pkcs7Sign.bat
> new file mode 100644
> index 000000000000..d347d6484467
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/WindowsLike/Pkcs7Sign.bat
> @@ -0,0 +1,3 @@
> + at setlocal
> 
> + at set ToolName=%~n0%
> 
> +@%PYTHON_COMMAND% -m
> edk2basetools.%ToolName%.%ToolName% %*
> 
> diff --git
> a/BaseTools/BinPipWrappers/WindowsLike/Rsa2048Sha256GenerateKeys.ba
> t
> b/BaseTools/BinPipWrappers/WindowsLike/Rsa2048Sha256GenerateKeys.ba
> t
> new file mode 100644
> index 000000000000..cdc2e3ea373d
> --- /dev/null
> +++
> b/BaseTools/BinPipWrappers/WindowsLike/Rsa2048Sha256GenerateKeys.ba
> t
> @@ -0,0 +1 @@
> +@%PYTHON_COMMAND% -m
> edk2basetools.Rsa2048Sha256Sign.Rsa2048Sha256GenerateKeys %*
> 
> diff --git a/BaseTools/BinPipWrappers/WindowsLike/Rsa2048Sha256Sign.bat
> b/BaseTools/BinPipWrappers/WindowsLike/Rsa2048Sha256Sign.bat
> new file mode 100644
> index 000000000000..d347d6484467
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/WindowsLike/Rsa2048Sha256Sign.bat
> @@ -0,0 +1,3 @@
> + at setlocal
> 
> + at set ToolName=%~n0%
> 
> +@%PYTHON_COMMAND% -m
> edk2basetools.%ToolName%.%ToolName% %*
> 
> diff --git a/BaseTools/BinPipWrappers/WindowsLike/TargetTool.bat
> b/BaseTools/BinPipWrappers/WindowsLike/TargetTool.bat
> new file mode 100644
> index 000000000000..d347d6484467
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/WindowsLike/TargetTool.bat
> @@ -0,0 +1,3 @@
> + at setlocal
> 
> + at set ToolName=%~n0%
> 
> +@%PYTHON_COMMAND% -m
> edk2basetools.%ToolName%.%ToolName% %*
> 
> diff --git a/BaseTools/BinPipWrappers/WindowsLike/Trim.bat
> b/BaseTools/BinPipWrappers/WindowsLike/Trim.bat
> new file mode 100644
> index 000000000000..d347d6484467
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/WindowsLike/Trim.bat
> @@ -0,0 +1,3 @@
> + at setlocal
> 
> + at set ToolName=%~n0%
> 
> +@%PYTHON_COMMAND% -m
> edk2basetools.%ToolName%.%ToolName% %*
> 
> diff --git a/BaseTools/BinPipWrappers/WindowsLike/UPT.bat
> b/BaseTools/BinPipWrappers/WindowsLike/UPT.bat
> new file mode 100644
> index 000000000000..d347d6484467
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/WindowsLike/UPT.bat
> @@ -0,0 +1,3 @@
> + at setlocal
> 
> + at set ToolName=%~n0%
> 
> +@%PYTHON_COMMAND% -m
> edk2basetools.%ToolName%.%ToolName% %*
> 
> diff --git a/BaseTools/BinPipWrappers/WindowsLike/build.bat
> b/BaseTools/BinPipWrappers/WindowsLike/build.bat
> new file mode 100644
> index 000000000000..d347d6484467
> --- /dev/null
> +++ b/BaseTools/BinPipWrappers/WindowsLike/build.bat
> @@ -0,0 +1,3 @@
> + at setlocal
> 
> + at set ToolName=%~n0%
> 
> +@%PYTHON_COMMAND% -m
> edk2basetools.%ToolName%.%ToolName% %*
> 
> diff --git
> a/BaseTools/BinWrappers/WindowsLike/win_build_tools_path_env.yaml
> b/BaseTools/BinPipWrappers/WindowsLike/win_build_tools_path_env.yaml
> similarity index 70%
> copy from
> BaseTools/BinWrappers/WindowsLike/win_build_tools_path_env.yaml
> copy to
> BaseTools/BinPipWrappers/WindowsLike/win_build_tools_path_env.yaml
> index 83f5856e75c6..9fdbe1bcb06b 100644
> --- a/BaseTools/BinWrappers/WindowsLike/win_build_tools_path_env.yaml
> +++
> b/BaseTools/BinPipWrappers/WindowsLike/win_build_tools_path_env.yaml
> @@ -5,6 +5,7 @@
>  # SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  ##
> 
>  {
> 
> -  "scope": "global-win",
> 
> +  "scope": "pipbuild-win",
> 
> +  "override_id": "binwrappers",
> 
>    "flags": ["set_path"]
> 
>  }
> 
> diff --git a/BaseTools/BinWrappers/PosixLike/posix_path_env.yaml
> b/BaseTools/BinWrappers/PosixLike/posix_path_env.yaml
> index 8b32e010bb1d..99529235ec9a 100644
> --- a/BaseTools/BinWrappers/PosixLike/posix_path_env.yaml
> +++ b/BaseTools/BinWrappers/PosixLike/posix_path_env.yaml
> @@ -5,6 +5,7 @@
>  # SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  ##
> 
>  {
> 
> +  "id": "binwrappers",
> 
>    "scope": "global-nix",
> 
>    "flags": ["set_path"]
> 
>  }
> 
> diff --git
> a/BaseTools/BinWrappers/WindowsLike/win_build_tools_path_env.yaml
> b/BaseTools/BinWrappers/WindowsLike/win_build_tools_path_env.yaml
> index 83f5856e75c6..43da76f354e5 100644
> --- a/BaseTools/BinWrappers/WindowsLike/win_build_tools_path_env.yaml
> +++ b/BaseTools/BinWrappers/WindowsLike/win_build_tools_path_env.yaml
> @@ -5,6 +5,7 @@
>  # SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  ##
> 
>  {
> 
> +  "id": "binwrappers",
> 
>    "scope": "global-win",
> 
>    "flags": ["set_path"]
> 
>  }
> 
> diff --git a/BaseTools/BuildEnv b/BaseTools/BuildEnv
> index 5943bb9ef908..275f4c5901aa 100755
> --- a/BaseTools/BuildEnv
> +++ b/BaseTools/BuildEnv
> @@ -46,7 +46,7 @@ RestorePreviousConfiguration() {
>        done
>      fi
>    fi
> -
> +
>    PREVIOUS_CONF_FILE=$CONF_PATH/BuildEnv.sh
>    if [ -e $PREVIOUS_CONF_FILE ]
>    then
> @@ -198,7 +198,17 @@ AddEdkToolsToPath() {
> 
>    EDK_TOOLS_PATH_BIN=`GetEdkToolsPathBinDirectory`
> 
> -  AddDirToStartOfPath $EDK_TOOLS_PATH/BinWrappers/PosixLike
> +  # check if the edk2basetools pip package is available
> +  if $PYTHON_COMMAND -c "import edk2basetools" &> /dev/null; then
> +    # if it is, use the pip version of the wrappers
> +    echo "Using Pip Basetools"
> +    AddDirToStartOfPath $EDK_TOOLS_PATH/BinPipWrappers/PosixLike
> +  else
> +    echo "Using EDK2 in-source Basetools"
> +    AddDirToStartOfPath $EDK_TOOLS_PATH/BinWrappers/PosixLike
> +  fi
> +
> +
>    AddDirToStartOfPath $EDK_TOOLS_PATH_BIN
> 
>  }
> diff --git a/BaseTools/Scripts/PatchCheck.py
> b/BaseTools/Scripts/PatchCheck.py
> index 68c984ed0e4d..80754e763c5a 100755
> --- a/BaseTools/Scripts/PatchCheck.py
> +++ b/BaseTools/Scripts/PatchCheck.py
> @@ -359,6 +359,7 @@ class GitDiffCheck:
>                  self.force_notabs = True
> 
>                  if self.filename.endswith('.sh') or \
> 
> 
> self.filename.startswith('BaseTools/BinWrappers/PosixLike/') or \
> 
> +
> self.filename.startswith('BaseTools/BinPipWrappers/PosixLike/') or \
> 
> 
> self.filename.startswith('BaseTools/Bin/CYGWIN_NT-5.1-i686/') or \
> 
>                      self.filename == 'BaseTools/BuildEnv':
> 
>                      #
> 
> diff --git a/BaseTools/Source/Python/README.md
> b/BaseTools/Source/Python/README.md
> new file mode 100644
> index 000000000000..56f5b0ff027b
> --- /dev/null
> +++ b/BaseTools/Source/Python/README.md
> @@ -0,0 +1,29 @@
> +# Edk2 Basetools
> 
> +
> 
> +This folder has traditionally held the source of Python based tools used
by
> EDK2.
> 
> +The official repo this source has moved to
> https://github.com/tianocore/edk2-basetools.
> 
> +This folder will remain in the tree until the next stable release
(expected
> 202102).
> 
> +There is a new folder under Basetools `BinPipWrappers` that uses the pip
> module rather than this tree for Basetools.
> 
> +By adding the scope `pipbuild-win` or `pipbuild-unix` (depending on your
host
> system), the SDE will use the
> 
> +`BinPipWrappers` instead of the regular `BinWrappers`.
> 
> +
> 
> +## Why Move It?
> 
> +
> 
> +The discussion is on the mailing list. The RFC is here:
> https://edk2.groups.io/g/rfc/topic/74009714#270
> 
> +The benefits allow for the Basetools project to be used separately from
EDK2
> itself as well as offering it in a
> 
> +globally accessible manner.
> 
> +This makes it much easier to build a module using Basetools.
> 
> +Separating the Basetools into their own repo allows for easier CI and
> contribution process.
> 
> +Additional pros, cons, and process can be found on the mailing list.
> 
> +
> 
> +## How Do I Install It?
> 
> +
> 
> +By default, EDK2 is tied to and tested with a specific version of the
Basetools
> through `pip-requirements.txt`.
> 
> +You can simply run:
> 
> +
> 
> +```bash
> 
> +pip install -r pip-requirements.txt
> 
> +```
> 
> +
> 
> +This will install the required module, thought we strongly suggest
setting up
> a virtual environment.
> 
> +Additionally, you can also install a local clone of the Basetools as well
as a
> specific git commit.
> 
> diff --git a/BaseTools/toolsetup.bat b/BaseTools/toolsetup.bat
> index 61ebf4ae09bc..4b5256ab6e93 100755
> --- a/BaseTools/toolsetup.bat
> +++ b/BaseTools/toolsetup.bat
> @@ -393,12 +393,31 @@ goto end
>      goto check_freezer_path
> 
>    )
> 
> 
> 
> +
> 
> +
> 
>  :check_freezer_path
> 
>    endlocal
> 
> +
> 
> +  %PYTHON_COMMAND% -c "import edk2basetools" >NUL 2>NUL
> 
> +  if %ERRORLEVEL% EQU 0 (
> 
> +    goto use_pip_basetools
> 
> +  ) else (
> 
> +    goto use_builtin_basetools
> 
> +  )
> 
> +
> 
> +:use_builtin_basetools
> 
> +  @echo Using EDK2 in-source Basetools
> 
>    if defined BASETOOLS_PYTHON_SOURCE goto print_python_info
> 
>    set "PATH=%BASE_TOOLS_PATH%\BinWrappers\WindowsLike;%PATH%"
> 
>    set
> BASETOOLS_PYTHON_SOURCE=%BASE_TOOLS_PATH%\Source\Python
> 
>    set PYTHONPATH=%BASETOOLS_PYTHON_SOURCE%;%PYTHONPATH%
> 
> +  goto print_python_info
> 
> +
> 
> +:use_pip_basetools
> 
> +  @echo Using Pip Basetools
> 
> +  set
> "PATH=%BASE_TOOLS_PATH%\BinPipWrappers\WindowsLike;%PATH%"
> 
> +  set BASETOOLS_PYTHON_SOURCE=edk2basetools
> 
> +  goto print_python_info
> 
> 
> 
>  :print_python_info
> 
>    echo                PATH = %PATH%
> 
> diff --git a/pip-requirements.txt b/pip-requirements.txt
> index 0fecd37f2a83..aea2e6ece431 100644
> --- a/pip-requirements.txt
> +++ b/pip-requirements.txt
> @@ -14,4 +14,5 @@
> 
> 
>  edk2-pytool-library==0.10.*
> 
>  edk2-pytool-extensions~=0.13.3
> 
> +edk2-basetools==0.1.2
> 
>  antlr4-python3-runtime==4.7.1
> 
> --
> 2.29.0.vfs.0.0
> 
> 
> 
> -=-=-=-=-=-=
> Groups.io Links: You receive all messages sent to this group.
> View/Reply Online (#70867): https://edk2.groups.io/g/devel/message/70867
> Mute This Topic: https://groups.io/mt/80194948/4905953
> Group Owner: devel+owner at edk2.groups.io
> Unsubscribe: https://edk2.groups.io/g/devel/unsub
> [gaoliming at byosoft.com.cn]
> -=-=-=-=-=-=
> 





-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#71188): https://edk2.groups.io/g/devel/message/71188
Mute This Topic: https://groups.io/mt/80375248/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