public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Matthew Carlson" <matthewfcarlson@gmail.com>
To: devel@edk2.groups.io
Cc: Bob Feng <bob.c.feng@intel.com>,
	Liming Gao <gaoliming@byosoft.com.cn>,
	Yuwei Chen <yuwei.chen@intel.com>,
	Sean Brogan <sean.brogan@microsoft.com>,
	Michael Kinney <michael.d.kinney@intel.com>,
	Matthew Carlson <matthewfcarlson@gmail.com>
Subject: [PATCH v3 1/1] BaseTools: Use pip module if available, CI uses it by default
Date: Thu, 14 Jan 2021 18:15:19 -0800	[thread overview]
Message-ID: <20210115021519.1080-2-matthewfcarlson@gmail.com> (raw)
In-Reply-To: <20210115021519.1080-1-matthewfcarlson@gmail.com>

From: Matthew Carlson <matthewfcarlson@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@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Yuwei Chen <yuwei.chen@intel.com>
Cc: Sean Brogan <sean.brogan@microsoft.com>
Cc: Michael Kinney <michael.d.kinney@intel.com>

Reviewed-by: Bob Feng <bob.c.feng@intel.com>

Signed-off-by: Matthew Carlson <matthewfcarlson@gmail.com>
---
 .pytool/CISettings.py                                                               |  51 +-
 BaseTools/BinPipWrappers/PosixLike/AmlToC                                           |  14 +
 BaseTools/BinPipWrappers/PosixLike/BPDG                                             |  12 +
 BaseTools/BinPipWrappers/PosixLike/Brotli                                           |  29 ++
 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 |  21 +-
 BaseTools/BinWrappers/PosixLike/posix_path_env.yaml                                 |   1 +
 BaseTools/BinWrappers/WindowsLike/win_build_tools_path_env.yaml                     |   1 +
 BaseTools/BuildEnv                                                                  | 548 ++++++++++----------
 BaseTools/Scripts/PatchCheck.py                                                     |   1 +
 BaseTools/Source/Python/README.md                                                   |  29 ++
 BaseTools/toolsetup.bat                                                             |  19 +
 pip-requirements.txt                                                                |   1 +
 56 files changed, 1102 insertions(+), 301 deletions(-)

diff --git a/.pytool/CISettings.py b/.pytool/CISettings.py
index b337d046ae08..85e70b15dcda 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                                #
@@ -127,19 +135,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 100644
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 100644
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/Brotli b/BaseTools/BinPipWrappers/PosixLike/Brotli
new file mode 100644
index 000000000000..0945d86d9209
--- /dev/null
+++ b/BaseTools/BinPipWrappers/PosixLike/Brotli
@@ -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/BrotliCompress b/BaseTools/BinPipWrappers/PosixLike/BrotliCompress
new file mode 100644
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 100644
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 100644
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 100644
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 100644
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 100644
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 100644
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 100644
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 100644
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 100644
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 100644
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 100644
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 100644
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 100644
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 100644
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 100644
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 100644
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 100644
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 100644
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 100644
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 100644
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 100644
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 100644
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 100644
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 100644
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 100644
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 100644
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..895d72d2594d
--- /dev/null
+++ b/BaseTools/BinPipWrappers/WindowsLike/AmlToC.bat
@@ -0,0 +1,3 @@
+@setlocal
+@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..895d72d2594d
--- /dev/null
+++ b/BaseTools/BinPipWrappers/WindowsLike/BPDG.bat
@@ -0,0 +1,3 @@
+@setlocal
+@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..02ed682f13eb
--- /dev/null
+++ b/BaseTools/BinPipWrappers/WindowsLike/BrotliCompress.bat
@@ -0,0 +1,55 @@
+@REM @file
+@REM This script will exec Brotli tool with -e/-d options.
+@REM
+@REM Copyright (c) 2017 - 2018, Intel Corporation. All rights reserved.<BR>
+@REM SPDX-License-Identifier: BSD-2-Clause-Patent
+@REM
+
+@echo off
+@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%
+@echo on
diff --git a/BaseTools/BinPipWrappers/WindowsLike/Ecc.bat b/BaseTools/BinPipWrappers/WindowsLike/Ecc.bat
new file mode 100644
index 000000000000..c8d1ed844d36
--- /dev/null
+++ b/BaseTools/BinPipWrappers/WindowsLike/Ecc.bat
@@ -0,0 +1,3 @@
+@setlocal
+@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..aff3cce340fb
--- /dev/null
+++ b/BaseTools/BinPipWrappers/WindowsLike/GenDepex.bat
@@ -0,0 +1,3 @@
+@setlocal
+@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..895d72d2594d
--- /dev/null
+++ b/BaseTools/BinPipWrappers/WindowsLike/GenFds.bat
@@ -0,0 +1,3 @@
+@setlocal
+@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..895d72d2594d
--- /dev/null
+++ b/BaseTools/BinPipWrappers/WindowsLike/GenPatchPcdTable.bat
@@ -0,0 +1,3 @@
+@setlocal
+@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..70907c079943
--- /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..895d72d2594d
--- /dev/null
+++ b/BaseTools/BinPipWrappers/WindowsLike/PatchPcdValue.bat
@@ -0,0 +1,3 @@
+@setlocal
+@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..895d72d2594d
--- /dev/null
+++ b/BaseTools/BinPipWrappers/WindowsLike/Pkcs7Sign.bat
@@ -0,0 +1,3 @@
+@setlocal
+@set ToolName=%~n0%
+@%PYTHON_COMMAND% -m edk2basetools.%ToolName%.%ToolName% %*
diff --git a/BaseTools/BinPipWrappers/WindowsLike/Rsa2048Sha256GenerateKeys.bat b/BaseTools/BinPipWrappers/WindowsLike/Rsa2048Sha256GenerateKeys.bat
new file mode 100644
index 000000000000..55b5d3b5a8d5
--- /dev/null
+++ b/BaseTools/BinPipWrappers/WindowsLike/Rsa2048Sha256GenerateKeys.bat
@@ -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..895d72d2594d
--- /dev/null
+++ b/BaseTools/BinPipWrappers/WindowsLike/Rsa2048Sha256Sign.bat
@@ -0,0 +1,3 @@
+@setlocal
+@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..895d72d2594d
--- /dev/null
+++ b/BaseTools/BinPipWrappers/WindowsLike/TargetTool.bat
@@ -0,0 +1,3 @@
+@setlocal
+@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..895d72d2594d
--- /dev/null
+++ b/BaseTools/BinPipWrappers/WindowsLike/Trim.bat
@@ -0,0 +1,3 @@
+@setlocal
+@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..895d72d2594d
--- /dev/null
+++ b/BaseTools/BinPipWrappers/WindowsLike/UPT.bat
@@ -0,0 +1,3 @@
+@setlocal
+@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..895d72d2594d
--- /dev/null
+++ b/BaseTools/BinPipWrappers/WindowsLike/build.bat
@@ -0,0 +1,3 @@
+@setlocal
+@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 74%
copy from BaseTools/BinWrappers/WindowsLike/win_build_tools_path_env.yaml
copy to BaseTools/BinPipWrappers/WindowsLike/win_build_tools_path_env.yaml
index 83f5856e75c6..fbeede54b428 100644
--- a/BaseTools/BinWrappers/WindowsLike/win_build_tools_path_env.yaml
+++ b/BaseTools/BinPipWrappers/WindowsLike/win_build_tools_path_env.yaml
@@ -1,10 +1,11 @@
-## @file
-# Add this folder to the path on Windows
-#
-# Copyright (c) Microsoft Corporation.
-# SPDX-License-Identifier: BSD-2-Clause-Patent
-##
-{
-  "scope": "global-win",
-  "flags": ["set_path"]
-}
+## @file
+# Add this folder to the path on Windows
+#
+# Copyright (c) Microsoft Corporation.
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+##
+{
+  "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..cc8e92db6558 100755
--- a/BaseTools/BuildEnv
+++ b/BaseTools/BuildEnv
@@ -1,269 +1,279 @@
-## @file
-# Setup the environment for unix-like systems running a bash-like shell.
-# This file must be "sourced" not merely executed. For example: ". edksetup.sh"
-#
-# Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
-# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
-# SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-
-SetWorkspace() {
-
-  #
-  # If WORKSPACE is already set, then we can return right now
-  #
-  if [ -n "$WORKSPACE" ]
-  then
-    return 0
-  fi
-
-  #
-  # Set $WORKSPACE
-  #
-  export WORKSPACE=`pwd`
-
-  return 0
-
-}
-
-RestorePreviousConfiguration() {
-  #
-  # Restore previous configuration
-  #
-  if [ -z "$CONF_PATH" ]
-  then
-    export CONF_PATH=$WORKSPACE/Conf
-    if [ ! -d $WORKSPACE/Conf ] && [ -n "$PACKAGES_PATH" ]
-    then
-      PATH_LIST=${PACKAGES_PATH//:/ }
-      for DIR in $PATH_LIST
-      do
-        if [ -d $DIR/Conf ]
-        then
-          export CONF_PATH=$DIR/Conf
-          break
-        fi
-      done
-    fi
-  fi
-  
-  PREVIOUS_CONF_FILE=$CONF_PATH/BuildEnv.sh
-  if [ -e $PREVIOUS_CONF_FILE ]
-  then
-    echo Loading previous configuration from $PREVIOUS_CONF_FILE
-    . $PREVIOUS_CONF_FILE
-  fi
-}
-
-GenerateShellCodeToSetVariable() {
-  VARIABLE=$1
-  OUTPUT_FILE=$2
-  VAR_VALUE="echo \${${VARIABLE}}"
-  VAR_VALUE=`eval $VAR_VALUE`
-  echo "if [ -z \"\$${VARIABLE}\" ]"             >> $OUTPUT_FILE
-  echo "then"                                    >> $OUTPUT_FILE
-  echo "  export ${VARIABLE}=${VAR_VALUE}"       >> $OUTPUT_FILE
-  echo "fi"                                      >> $OUTPUT_FILE
-}
-
-GenerateShellCodeToUpdatePath() {
-  OUTPUT_FILE=$1
-  echo "if [ -e $EDK_TOOLS_PATH_BIN ]"                        >> $OUTPUT_FILE
-  echo "then"                                                 >> $OUTPUT_FILE
-  echo "  if [ "\${PATH/$EDK_TOOLS_PATH_BIN/}" == "\$PATH" ]" >> $OUTPUT_FILE
-  echo "  then"                                               >> $OUTPUT_FILE
-  echo "    export PATH=$EDK_TOOLS_PATH_BIN:\$PATH"           >> $OUTPUT_FILE
-  echo "  fi"                                                 >> $OUTPUT_FILE
-  echo "fi"                                                   >> $OUTPUT_FILE
-}
-
-StoreCurrentConfiguration() {
-  #
-  # Write configuration to a shell script to allow for configuration to be
-  # easily reloaded.
-  #
-  OUTPUT_FILE=$CONF_PATH/BuildEnv.sh
-  #echo Storing current configuration into $OUTPUT_FILE
-  echo "# Auto-generated by ${BASH_SOURCE[0]}" >| $OUTPUT_FILE
-  GenerateShellCodeToSetVariable WORKSPACE $OUTPUT_FILE
-  GenerateShellCodeToSetVariable EDK_TOOLS_PATH $OUTPUT_FILE
-  GenerateShellCodeToUpdatePath $OUTPUT_FILE
-}
-
-SetEdkToolsPath() {
-
-  #
-  # If EDK_TOOLS_PATH is already set, then we can return right now
-  #
-  if [ -n "$EDK_TOOLS_PATH" ]
-  then
-    return 0
-  fi
-
-  #
-  # Try $CONF_PATH/EdkTools
-  #
-  if [ -e $CONF_PATH/EdkTools ]
-  then
-    export EDK_TOOLS_PATH=$CONF_PATH/EdkTools
-    return 0
-  fi
-
-  #
-  # Try $CONF_PATH/BaseToolsSource
-  #
-  if [ -e $CONF_PATH/BaseToolsSource ]
-  then
-    export EDK_TOOLS_PATH=$CONF_PATH/BaseToolsSource
-    return 0
-  fi
-
-  #
-  # Try $WORKSPACE/BaseTools
-  #
-  if [ -e $WORKSPACE/BaseTools ]
-  then
-    export EDK_TOOLS_PATH=$WORKSPACE/BaseTools
-    return 0
-  fi
-
-  #
-  # Try $PACKAGES_PATH
-  #
-  if [ -n "$PACKAGES_PATH"]
-  then
-    PATH_LIST=${PACKAGES_PATH//:/ }
-    for DIR in $PATH_LIST
-    do
-      if [ -d $DIR/BaseTools ]
-      then
-        export EDK_TOOLS_PATH=$DIR/BaseTools
-        return 0
-      fi
-    done
-  fi
-
-  echo "Unable to determine EDK_TOOLS_PATH"
-  echo
-  echo "You may need to download the 'BaseTools' from buildtools.tianocore.org."
-  echo "After downloading, either create a symbolic link to the source at"
-  echo "\$WORKSPACE/Conf/BaseToolsSource, or set the EDK_TOOLS_PATH environment"
-  echo "variable."
-
-}
-
-GetBaseToolsBinSubDir() {
-  #
-  # Figure out a uniq directory name from the uname command
-  #
-  UNAME_DIRNAME=`uname -sm`
-  UNAME_DIRNAME=${UNAME_DIRNAME// /-}
-  UNAME_DIRNAME=${UNAME_DIRNAME//\//-}
-  echo $UNAME_DIRNAME
-}
-
-GetEdkToolsPathBinDirectory() {
-  #
-  # Figure out a uniq directory name from the uname command
-  #
-  BIN_SUB_DIR=`GetBaseToolsBinSubDir`
-
-  if [ -e $EDK_TOOLS_PATH/BinWrappers/$BIN_SUB_DIR ]
-  then
-    EDK_TOOLS_PATH_BIN=$EDK_TOOLS_PATH/BinWrappers/$BIN_SUB_DIR
-  else
-    EDK_TOOLS_PATH_BIN=$EDK_TOOLS_PATH/Bin/$BIN_SUB_DIR
-  fi
-
-  echo $EDK_TOOLS_PATH_BIN
-}
-
-AddDirToStartOfPath() {
-  DIRNAME=$1
-  PATH=$DIRNAME:$DIRNAME:$DIRNAME:$PATH
-  PATH=${PATH//$DIRNAME:/}
-  PATH=$DIRNAME:$PATH
-  export PATH
-}
-
-AddEdkToolsToPath() {
-
-  #
-  # If EDK_TOOLS_PATH is not set, then we cannot update PATH
-  #
-  if [ -z "$EDK_TOOLS_PATH" ]
-  then
-    return 1
-  fi
-
-  EDK_TOOLS_PATH_BIN=`GetEdkToolsPathBinDirectory`
-
-  AddDirToStartOfPath $EDK_TOOLS_PATH/BinWrappers/PosixLike
-  AddDirToStartOfPath $EDK_TOOLS_PATH_BIN
-
-}
-
-CopySingleTemplateFile() {
-
-  SRC_FILENAME=Conf/$1.template
-  DST_FILENAME=$CONF_PATH/$1.txt
-
-  if [ -e $DST_FILENAME ]
-  then
-    [ $RECONFIG != TRUE ] && return
-  fi
-
-  echo "Copying \$EDK_TOOLS_PATH/$SRC_FILENAME"
-  echo "     to $DST_FILENAME"
-  SRC_FILENAME=$EDK_TOOLS_PATH/$SRC_FILENAME
-  cp $SRC_FILENAME $DST_FILENAME
-
-}
-
-CopyTemplateFiles() {
-
-  CopySingleTemplateFile build_rule
-  CopySingleTemplateFile tools_def
-  CopySingleTemplateFile target
-
-}
-
-ScriptMain() {
-
-  SetWorkspace
-  if [ -z $WORKSPACE ]
-  then
-    echo "Failure setting WORKSPACE"
-    return 1
-  fi
-
-  RestorePreviousConfiguration
-
-  SetEdkToolsPath
-  if [ -z $EDK_TOOLS_PATH ]
-  then
-    return 1
-  fi
-
-  AddEdkToolsToPath
-  if [ $? -ne 0 ]
-  then
-    echo "Failure adding EDK Tools into PATH!"
-    return 1
-  fi
-
-  StoreCurrentConfiguration
-
-  echo WORKSPACE: $WORKSPACE
-  echo EDK_TOOLS_PATH: $EDK_TOOLS_PATH
-  echo CONF_PATH: $CONF_PATH
-
-  CopyTemplateFiles
-
-}
-
-#
-# Run the main function
-#
-ScriptMain
-
+## @file
+# Setup the environment for unix-like systems running a bash-like shell.
+# This file must be "sourced" not merely executed. For example: ". edksetup.sh"
+#
+# Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+
+SetWorkspace() {
+
+  #
+  # If WORKSPACE is already set, then we can return right now
+  #
+  if [ -n "$WORKSPACE" ]
+  then
+    return 0
+  fi
+
+  #
+  # Set $WORKSPACE
+  #
+  export WORKSPACE=`pwd`
+
+  return 0
+
+}
+
+RestorePreviousConfiguration() {
+  #
+  # Restore previous configuration
+  #
+  if [ -z "$CONF_PATH" ]
+  then
+    export CONF_PATH=$WORKSPACE/Conf
+    if [ ! -d $WORKSPACE/Conf ] && [ -n "$PACKAGES_PATH" ]
+    then
+      PATH_LIST=${PACKAGES_PATH//:/ }
+      for DIR in $PATH_LIST
+      do
+        if [ -d $DIR/Conf ]
+        then
+          export CONF_PATH=$DIR/Conf
+          break
+        fi
+      done
+    fi
+  fi
+
+  PREVIOUS_CONF_FILE=$CONF_PATH/BuildEnv.sh
+  if [ -e $PREVIOUS_CONF_FILE ]
+  then
+    echo Loading previous configuration from $PREVIOUS_CONF_FILE
+    . $PREVIOUS_CONF_FILE
+  fi
+}
+
+GenerateShellCodeToSetVariable() {
+  VARIABLE=$1
+  OUTPUT_FILE=$2
+  VAR_VALUE="echo \${${VARIABLE}}"
+  VAR_VALUE=`eval $VAR_VALUE`
+  echo "if [ -z \"\$${VARIABLE}\" ]"             >> $OUTPUT_FILE
+  echo "then"                                    >> $OUTPUT_FILE
+  echo "  export ${VARIABLE}=${VAR_VALUE}"       >> $OUTPUT_FILE
+  echo "fi"                                      >> $OUTPUT_FILE
+}
+
+GenerateShellCodeToUpdatePath() {
+  OUTPUT_FILE=$1
+  echo "if [ -e $EDK_TOOLS_PATH_BIN ]"                        >> $OUTPUT_FILE
+  echo "then"                                                 >> $OUTPUT_FILE
+  echo "  if [ "\${PATH/$EDK_TOOLS_PATH_BIN/}" == "\$PATH" ]" >> $OUTPUT_FILE
+  echo "  then"                                               >> $OUTPUT_FILE
+  echo "    export PATH=$EDK_TOOLS_PATH_BIN:\$PATH"           >> $OUTPUT_FILE
+  echo "  fi"                                                 >> $OUTPUT_FILE
+  echo "fi"                                                   >> $OUTPUT_FILE
+}
+
+StoreCurrentConfiguration() {
+  #
+  # Write configuration to a shell script to allow for configuration to be
+  # easily reloaded.
+  #
+  OUTPUT_FILE=$CONF_PATH/BuildEnv.sh
+  #echo Storing current configuration into $OUTPUT_FILE
+  echo "# Auto-generated by ${BASH_SOURCE[0]}" >| $OUTPUT_FILE
+  GenerateShellCodeToSetVariable WORKSPACE $OUTPUT_FILE
+  GenerateShellCodeToSetVariable EDK_TOOLS_PATH $OUTPUT_FILE
+  GenerateShellCodeToUpdatePath $OUTPUT_FILE
+}
+
+SetEdkToolsPath() {
+
+  #
+  # If EDK_TOOLS_PATH is already set, then we can return right now
+  #
+  if [ -n "$EDK_TOOLS_PATH" ]
+  then
+    return 0
+  fi
+
+  #
+  # Try $CONF_PATH/EdkTools
+  #
+  if [ -e $CONF_PATH/EdkTools ]
+  then
+    export EDK_TOOLS_PATH=$CONF_PATH/EdkTools
+    return 0
+  fi
+
+  #
+  # Try $CONF_PATH/BaseToolsSource
+  #
+  if [ -e $CONF_PATH/BaseToolsSource ]
+  then
+    export EDK_TOOLS_PATH=$CONF_PATH/BaseToolsSource
+    return 0
+  fi
+
+  #
+  # Try $WORKSPACE/BaseTools
+  #
+  if [ -e $WORKSPACE/BaseTools ]
+  then
+    export EDK_TOOLS_PATH=$WORKSPACE/BaseTools
+    return 0
+  fi
+
+  #
+  # Try $PACKAGES_PATH
+  #
+  if [ -n "$PACKAGES_PATH"]
+  then
+    PATH_LIST=${PACKAGES_PATH//:/ }
+    for DIR in $PATH_LIST
+    do
+      if [ -d $DIR/BaseTools ]
+      then
+        export EDK_TOOLS_PATH=$DIR/BaseTools
+        return 0
+      fi
+    done
+  fi
+
+  echo "Unable to determine EDK_TOOLS_PATH"
+  echo
+  echo "You may need to download the 'BaseTools' from buildtools.tianocore.org."
+  echo "After downloading, either create a symbolic link to the source at"
+  echo "\$WORKSPACE/Conf/BaseToolsSource, or set the EDK_TOOLS_PATH environment"
+  echo "variable."
+
+}
+
+GetBaseToolsBinSubDir() {
+  #
+  # Figure out a uniq directory name from the uname command
+  #
+  UNAME_DIRNAME=`uname -sm`
+  UNAME_DIRNAME=${UNAME_DIRNAME// /-}
+  UNAME_DIRNAME=${UNAME_DIRNAME//\//-}
+  echo $UNAME_DIRNAME
+}
+
+GetEdkToolsPathBinDirectory() {
+  #
+  # Figure out a uniq directory name from the uname command
+  #
+  BIN_SUB_DIR=`GetBaseToolsBinSubDir`
+
+  if [ -e $EDK_TOOLS_PATH/BinWrappers/$BIN_SUB_DIR ]
+  then
+    EDK_TOOLS_PATH_BIN=$EDK_TOOLS_PATH/BinWrappers/$BIN_SUB_DIR
+  else
+    EDK_TOOLS_PATH_BIN=$EDK_TOOLS_PATH/Bin/$BIN_SUB_DIR
+  fi
+
+  echo $EDK_TOOLS_PATH_BIN
+}
+
+AddDirToStartOfPath() {
+  DIRNAME=$1
+  PATH=$DIRNAME:$DIRNAME:$DIRNAME:$PATH
+  PATH=${PATH//$DIRNAME:/}
+  PATH=$DIRNAME:$PATH
+  export PATH
+}
+
+AddEdkToolsToPath() {
+
+  #
+  # If EDK_TOOLS_PATH is not set, then we cannot update PATH
+  #
+  if [ -z "$EDK_TOOLS_PATH" ]
+  then
+    return 1
+  fi
+
+  EDK_TOOLS_PATH_BIN=`GetEdkToolsPathBinDirectory`
+
+  # 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
+
+}
+
+CopySingleTemplateFile() {
+
+  SRC_FILENAME=Conf/$1.template
+  DST_FILENAME=$CONF_PATH/$1.txt
+
+  if [ -e $DST_FILENAME ]
+  then
+    [ $RECONFIG != TRUE ] && return
+  fi
+
+  echo "Copying \$EDK_TOOLS_PATH/$SRC_FILENAME"
+  echo "     to $DST_FILENAME"
+  SRC_FILENAME=$EDK_TOOLS_PATH/$SRC_FILENAME
+  cp $SRC_FILENAME $DST_FILENAME
+
+}
+
+CopyTemplateFiles() {
+
+  CopySingleTemplateFile build_rule
+  CopySingleTemplateFile tools_def
+  CopySingleTemplateFile target
+
+}
+
+ScriptMain() {
+
+  SetWorkspace
+  if [ -z $WORKSPACE ]
+  then
+    echo "Failure setting WORKSPACE"
+    return 1
+  fi
+
+  RestorePreviousConfiguration
+
+  SetEdkToolsPath
+  if [ -z $EDK_TOOLS_PATH ]
+  then
+    return 1
+  fi
+
+  AddEdkToolsToPath
+  if [ $? -ne 0 ]
+  then
+    echo "Failure adding EDK Tools into PATH!"
+    return 1
+  fi
+
+  StoreCurrentConfiguration
+
+  echo WORKSPACE: $WORKSPACE
+  echo EDK_TOOLS_PATH: $EDK_TOOLS_PATH
+  echo CONF_PATH: $CONF_PATH
+
+  CopyTemplateFiles
+
+}
+
+#
+# Run the main function
+#
+ScriptMain
+
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..b634106beada 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.0
 antlr4-python3-runtime==4.7.1
-- 
2.29.0.vfs.0.0


  reply	other threads:[~2021-01-15  2:15 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-15  2:15 [PATCH v3 0/1] Use Pip version of BaseTools Matthew Carlson
2021-01-15  2:15 ` Matthew Carlson [this message]
2021-01-15  8:58   ` 回复: [edk2-devel] [PATCH v3 1/1] BaseTools: Use pip module if available, CI uses it by default gaoliming
2021-01-16  3:15     ` [edk2-devel] " Matthew Carlson
2021-01-18  1:52       ` 回复: " gaoliming

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210115021519.1080-2-matthewfcarlson@gmail.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox