Index: /trunk/kBuild/envwin.cmd
===================================================================
--- /trunk/kBuild/envwin.cmd	(revision 1531)
+++ /trunk/kBuild/envwin.cmd	(revision 1532)
@@ -1,115 +1,329 @@
 @echo off
-REM # $Id: $
-REM ## @file
-REM #
-REM # Environment setup script.
-REM #
-REM # Copyright (c) 2005-2008 knut st. osmundsen <bird-kBuild-spam@anduin.net>
-REM #
-REM #
-REM # This file is part of kBuild.
-REM #
-REM # kBuild is free software; you can redistribute it and/or modify
-REM # it under the terms of the GNU General Public License as published by
-REM # the Free Software Foundation; either version 2 of the License, or
-REM # (at your option) any later version.
-REM #
-REM # kBuild is distributed in the hope that it will be useful,
-REM # but WITHOUT ANY WARRANTY; without even the implied warranty of
-REM # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-REM # GNU General Public License for more details.
-REM #
-REM # You should have received a copy of the GNU General Public License
-REM # along with kBuild; if not, write to the Free Software
-REM # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-REM #
-
-
-REM #
-REM # Deal with the arguments.
-REM #
-if ".%1" == ".-h"       goto help
-if ".%1" == "./h"       goto help
-if ".%1" == "./H"       goto help
-if ".%1" == ".-h"       goto help
-if ".%1" == ".-help"    goto help
-if ".%1" == ".--help"   goto help
-
-if ".%1" == ".-win"     goto want_win
-if ".%1" == ".-win32"   goto want_win32_bit
-if ".%1" == ".-win64"   goto want_win64_bit
-if ".%1" == ".-nt"      goto want_nt
-if ".%1" == ".-nt32"    goto want_nt32_bit
-if ".%1" == ".-nt64"    goto want_nt64_bit
+REM $Id: $
+REM REM @file
+REM Environment setup script.
+REM
+
+REM
+REM Copyright (c) 2005-2008 knut st. osmundsen <bird-kBuild-spam@anduin.net>
+REM
+REM This file is part of kBuild.
+REM
+REM kBuild is free software; you can redistribute it and/or modify
+REM it under the terms of the GNU General Public License as published by
+REM the Free Software Foundation; either version 2 of the License, or
+REM (at your option) any later version.
+REM
+REM kBuild is distributed in the hope that it will be useful,
+REM but WITHOUT ANY WARRANTY; without even the implied warranty of
+REM MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+REM GNU General Public License for more details.
+REM
+REM You should have received a copy of the GNU General Public License
+REM along with kBuild; if not, write to the Free Software
+REM Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+REM
+
+REM
+REM Globals
+REM
+set _KBUILD_CURDIR=%CD%
+for /f "tokens=*" %%d in ('cd') do set _KBUILD_CURDIR=%%d
+
+set _KBUILD_PATH=%KBUILD_PATH%
+set _KBUILD_BIN_PATH=%KBUILD_BIN_PATH%
+set _KBUILD_TYPE=%KBUILD_TYPE%
+set _KBUILD_TARGET=%KBUILD_TARGET%
+set _KBUILD_TARGET_ARCH=%KBUILD_TARGET_ARCH%
+set _KBUILD_TARGET_CPU=%KBUILD_TARGET_CPU%
+set _KBUILD_HOST=%KBUILD_HOST%
+set _KBUILD_HOST_ARCH=%KBUILD_HOST_ARCH%
+set _KBUILD_HOST_CPU=%KBUILD_HOST_CPU%
+
+set _KBUILD_OVERRIDE_TYPE=0
+set _KBUILD_OVERRIDE_TARGET=0
+set _KBUILD_OVERRIDE_TARGET_ARCH=0
+
+REM
+REM Parse the arguments.
+REM
+REM Note: The 0 argument must be safed as it is also shifted.
+REM
+set _KBUILD_SELF=%0
+set _KBUILD_OPT_FULL=0
+set _KBUILD_OPT_LEGACY=0
+set _KBUILD_OPT_VAR=
+set _KBUILD_OPT_VALUE_ONLY=0
+set _KBUILD_SHOW_VAR_PREFIX=
+set _KBUILD_OPT_DBG=1
+set _KBUILD_OPT_OVERRIDE_ALL=0
+
+:argument_loop
+if ".%1" == ".-h"           goto do_help
+if ".%1" == "./h"           goto do_help
+if ".%1" == "./H"           goto do_help
+if ".%1" == ".-h"           goto do_help
+if ".%1" == ".-help"        goto do_help
+if ".%1" == ".--help"       goto do_help
+
+if ".%1" == ".--win"        goto want_win
+if ".%1" == ".-win"         goto want_win
+if ".%1" == ".--win32"      goto want_win32_bit
+if ".%1" == ".-win32"       goto want_win32_bit
+if ".%1" == ".-win64"       goto want_win64_bit
+if ".%1" == ".--win64"      goto want_win64_bit
+if ".%1" == ".--nt"         goto want_nt
+if ".%1" == ".-nt"          goto want_nt
+if ".%1" == ".--nt32"       goto want_nt32_bit
+if ".%1" == ".-nt32"        goto want_nt32_bit
+if ".%1" == ".--nt64"       goto want_nt64_bit
+if ".%1" == ".-nt64"        goto want_nt64_bit
+
+if ".%1" == ".--release"    goto want_release
+if ".%1" == ".--profile"    goto want_profile
+if ".%1" == ".--debug"      goto want_debug
+
+if ".%1" == ".--full"               goto opt_full
+if ".%1" == ".--normal"             goto opt_normal
+if ".%1" == ".--legacy"             goto opt_legacy
+if ".%1" == ".--no-legacy"          goto opt_no_legacy
+if ".%1" == ".--debug-script"       goto opt_debug_script
+if ".%1" == ".--no-debug-script"    goto opt_no_debug_script
+if ".%1" == ".--var"                goto opt_var
+if ".%1" == ".--value-only"         goto opt_value_only
+if ".%1" == ".--name-and-value"     goto opt_name_and_value
+if ".%1" == ".--set"                goto opt_set
+if ".%1" == ".--no-set"             goto opt_no_set
+
 goto done_arguments
+
+:want_win
+shift
+set _KBUILD_TARGET=win
+set _KBUILD_OVERRIDE_TARGET=1
+goto argument_loop
+
+:want_win32_bit
+shift
+set _KBUILD_TARGET=win
+set _KBUILD_TARGET_ARCH=x86
+set _KBUILD_OVERRIDE_TARGET=1
+set _KBUILD_OVERRIDE_TARGET_ARCH=1
+goto argument_loop
+
+:want_win64_bit
+shift
+set _KBUILD_TARGET=win
+set _KBUILD_TARGET_ARCH=amd64
+set _KBUILD_OVERRIDE_TARGET=1
+set _KBUILD_OVERRIDE_TARGET_ARCH=1
+goto argument_loop
+
+:want_nt
+shift
+set _KBUILD_TARGET=nt
+set _KBUILD_OVERRIDE_TARGET=1
+goto argument_loop
+
+:want_nt32_bit
+shift
+set _KBUILD_TARGET=nt
+set _KBUILD_TARGET_ARCH=x86
+set _KBUILD_OVERRIDE_TARGET=1
+set _KBUILD_OVERRIDE_TARGET_ARCH=1
+goto argument_loop
+
+:want_nt64_bit
+shift
+set _KBUILD_TARGET=nt
+set _KBUILD_TARGET_ARCH=amd64
+set _KBUILD_OVERRIDE_TARGET=1
+set _KBUILD_OVERRIDE_TARGET_ARCH=1
+goto argument_loop
+
+:want_release
+shift
+set _KBUILD_TYPE=release
+set _KBUILD_OVERRIDE_TYPE=1
+goto argument_loop
+
+:want_profile
+shift
+set _KBUILD_TYPE=profile
+set _KBUILD_OVERRIDE_TYPE=1
+goto argument_loop
+
+:want_debug
+shift
+set _KBUILD_TYPE=debug
+set _KBUILD_OVERRIDE_TYPE=1
+goto argument_loop
+
+:opt_full
+shift
+set _KBUILD_OPT_FULL=1
+goto argument_loop
+
+:opt_normal
+shift
+set _KBUILD_OPT_FULL=0
+goto argument_loop
+
+:opt_legacy
+shift
+set _KBUILD_OPT_LEGACY=1
+goto argument_loop
+
+:opt_no_legacy
+shift
+set _KBUILD_OPT_LEGACY=0
+goto argument_loop
+
+:opt_debug_script
+shift
+set _KBUILD_OPT_DBG=1
+goto argument_loop
+
+:opt_no_debug_script
+shift
+set _KBUILD_OPT_DBG=0
+goto argument_loop
+
+:opt_var
+shift
+if ".%1" == "." echo syntax error: --var is missing it's variable name.
+if ".%1" == "." goto failure
+set _KBUILD_OPT_VAR=%_KBUILD_OPT_VAR% %1
+shift
+goto argument_loop
+
+:opt_value_only
+shift
+set _KBUILD_OPT_VALUE_ONLY=1
+goto argument_loop
+
+:opt_name_and_value
+shift
+set _KBUILD_OPT_VALUE_ONLY=0
+goto argument_loop
+
+:opt_set
+shift
+set _KBUILD_SHOW_VAR_PREFIX=SET %_KBUILD_NON_EXISTING_VAR%
+goto argument_loop
+
+:opt_no_set
+shift
+set _KBUILD_SHOW_VAR_PREFIX=
+goto argument_loop
+
 
 REM #
 REM # Syntax
 REM #
-:help
+:do_help
 echo kBuild environment setup script for Windows NT.
-echo Syntax: envwin.cmd [-win, -win32, -win64, -nt, -nt32 or -nt64] [command to be executed]
+echo Syntax: envwin.cmd [options] [command to be executed]
+echo     or: envwin.cmd [options] --var varname
+echo .
+echo Options:
+echo   --win
+echo       Force windows target and host platform.
+echo   --win32
+echo       Force x86 32-bit windows target platform.
+echo   --win64
+echo       Force AMD64 64-bit windows target platform.
+echo   --nt
+echo       Force NT target and host platform.
+echo   --win32
+echo       Force x86 32-bit NT target platform.
+echo   --win64
+echo       Force AMD64 64-bit NT target platform.
+echo   --debug, --release, --profile
+echo       Alternative way of specifying KBUILD_TYPE.
+echo   --full, --normal
+echo       Controls the variable set. Default: --normal
+echo   --legacy, --no-legacy
+echo       Include legacy variables in result. Default: --legacy
+echo   --value-only, --name-and-value
+echo       Controls what the result of a --var query. Default: --name-and-value
+echo   --set, --no-set
+echo       Whether to prefix the variable output with 'SET' or not.
+echo       Default: --no-set
+
 goto end
 
-
-:want_win
-shift
-set BUILD_TARGET=win
-set BUILD_PLATFORM=win
-goto done_arguments
-
-:want_win32_bit
-shift
-set BUILD_PLATFORM=win
-set BUILD_TARGET=win
-set BUILD_TARGET_ARCH=x86
-goto done_arguments
-
-:want_win64_bit
-shift
-set BUILD_TARGET=win
-set BUILD_TARGET_ARCH=amd64
-goto done_arguments
-
-:want_nt
-shift
-set BUILD_PLATFORM=nt
-set BUILD_TARGET=nt
-goto done_arguments
-
-:want_nt32_bit
-shift
-set BUILD_PLATFORM=nt
-set BUILD_TARGET=nt
-set BUILD_TARGET_ARCH=x86
-goto done_arguments
-
-:want_nt64_bit
-shift
-set BUILD_PLATFORM=nt
-set BUILD_TARGET=nt
-set BUILD_TARGET_ARCH=amd64
-goto done_arguments
-
 :done_arguments
 
-
-REM #
-REM # Check for illegal target/platforms.
-REM #
-if "%BUILD_TARGET" == "win32" goto illegal_target
-if "%BUILD_TARGET" == "win64" goto illegal_target
-
-if "%BUILD_PLATFORM" == "win32" goto illegal_platform
-if "%BUILD_PLATFORM" == "win64" goto illegal_platform
+REM
+REM Convert legacy variable names.
+REM
+if ".%_KBUILD_OPT_OVERRIDE_ALL%" == ".1" goto legacy_convertion_done
+
+set _KBUILD_VARS=KBUILD_HOST (%_KBUILD_HOST%) and BUILD_PLATFORM (%BUILD_PLATFORM%)
+if not ".%BUILD_PLATFORM%" == "." if not ".%_KBUILD_HOST%" == "." if ".%_KBUILD_HOST%" == ".%BUILD_PLATFORM%" goto legacy_mismatch
+if not ".%BUILD_PLATFORM%" == "." set _KBUILD_HOST=%BUILD_PLATFORM%
+
+set _KBUILD_VARS=KBUILD_HOST_ARCH (%_KBUILD_HOST_ARCH%) and BUILD_PLATFORM_ARCH (%BUILD_PLATFORM_ARCH%)
+if not ".%BUILD_PLATFORM_ARCH%" == "." if not ".%_KBUILD_HOST_ARCH%" == "." if ".%_KBUILD_HOST_ARCH%" == ".%BUILD_PLATFORM_ARCH%" goto legacy_mismatch
+if not ".%BUILD_PLATFORM_ARCH%" == "." set _KBUILD_HOST_ARCH=%BUILD_PLATFORM_ARCH%
+
+set _KBUILD_VARS=KBUILD_HOST_CPU (%_KBUILD_HOST_CPU%) and BUILD_PLATFORM_CPU (%BUILD_PLATFORM_CPU%)
+if not ".%BUILD_PLATFORM_CPU%" == "." if not ".%_KBUILD_HOST_CPU%" == "." if ".%_KBUILD_HOST_CPU%" == ".%BUILD_PLATFORM_CPU%" goto legacy_mismatch
+if not ".%BUILD_PLATFORM_CPU%" == "." set _KBUILD_HOST_CPU=%BUILD_PLATFORM_CPU%
+
+if ".%_KBUILD_OVERRIDE_TARGET%" == ".1" goto legacy_skip_target
+set _KBUILD_VARS=KBUILD_TARGET (%_KBUILD_TARGET%) and BUILD_TARGET (%BUILD_TARGET%)
+if not ".%BUILD_TARGET%" == "." if not ".%_KBUILD_TARGET%" == "." if ".%_KBUILD_TARGET%" == ".%BUILD_TARGET%" goto legacy_mismatch
+if not ".%BUILD_TARGET%" == "." set _KBUILD_TARGET=%BUILD_TARGET%
+:convert_skip_target
+
+if ".%_KBUILD_OVERRIDE_TARGET%" == ".1" goto legacy_skip_target_arch
+set _KBUILD_VARS=KBUILD_TARGET_ARCH (%_KBUILD_TARGET_ARCH%) and BUILD_TARGET_ARCH (%BUILD_TARGET_ARCH%)
+if not ".%BUILD_TARGET_ARCH%" == "." if not ".%_KBUILD_TARGET_ARCH%" == "." if ".%_KBUILD_TARGET_ARCH%" == ".%BUILD_TARGET_ARCH%" goto legacy_mismatch
+if not ".%BUILD_TARGET_ARCH%" == "." set _KBUILD_TARGET_ARCH=%BUILD_TARGET_ARCH%
+:legacy_skip_target_arch
+
+if ".%_KBUILD_OVERRIDE_TARGET%" == ".1" goto legacy_skip_target_cpu
+set _KBUILD_VARS=KBUILD_TARGET_CPU (%_KBUILD_TARGET_CPU%) and BUILD_TARGET_CPU (%BUILD_TARGET_CPU%)
+if not ".%BUILD_TARGET_CPU%" == "." if not ".%_KBUILD_TARGET_CPU%" == "." if ".%_KBUILD_TARGET_CPU%" == ".%BUILD_TARGET_CPU%" goto legacy_mismatch
+if not ".%BUILD_TARGET_CPU%" == "." set _KBUILD_TARGET_CPU=%BUILD_TARGET_CPU%
+:legacy_skip_target_cpu
+
+if ".%_KBUILD_OVERRIDE_TARGET%" == ".1" goto legacy_skip_type
+set _KBUILD_VARS=KBUILD_TYPE (%_KBUILD_TYPE%) and BUILD_TYPE (%BUILD_TYPE%)
+if not ".%BUILD_TYPE%" == "." if not ".%_KBUILD_TYPE%" == "." if ".%_KBUILD_TYPE%" == ".%BUILD_TYPE%" goto legacy_mismatch
+if not ".%BUILD_TYPE%" == "." set _KBUILD_TYPE=%BUILD_TYPE%
+:legacy_skip_type
+
+set _KBUILD_VARS=KBUILD_PATH (%_KBUILD_PATH%) and PATH_KBUILD (%PATH_KBUILD%)
+if not ".%PATH_KBUILD%" == "." if not ".%_KBUILD_PATH%" == "." if ".%_KBUILD_PATH%" == ".%PATH_KBUILD%" goto legacy_mismatch
+if not ".%PATH_KBUILD%" == "." set _KBUILD_PATH=%PATH_KBUILD%
+goto legacy_convertion_done
+
+:legacy_mismatch
+echo error: %_KBUILD_VARS% disagree.
+goto failed
+
+:legacy_convertion_done
+
+
+REM
+REM Check for illegal target/platforms.
+REM
+:target_and_platform
+if "%_KBUILD_TARGET" == "win32"  goto illegal_target
+if "%_KBUILD_TARGET" == "win64"  goto illegal_target
+if "%_KBUILD_HOST"   == "win32"  goto illegal_host
+if "%_KBUILD_HOST"   == "win64"  goto illegal_host
 goto target_and_platform_ok
 
 :illegal_target
-echo error: BUILD_TARGET=%BUILD_TARGET is no longer valid.
+echo error: KBUILD_TARGET=%KBUILD_TARGET% is no longer valid.
 echo        Only 'win' and 'nt' are permitted for targeting microsoft windows.
 goto failed
 
-:illegal_platform
-echo error: BUILD_PLATFORM=%BUILD_PLATFORM is no longer valid.
+:illegal_host
+echo error: KBUILD_HOST=%KBUILD_HOST is no longer valid.
 echo        Only 'win' and 'nt' are permitted for building on microsoft windows.
 goto failed
@@ -117,26 +331,84 @@
 :target_and_platform_ok
 
-
-REM #
-REM # figure the current directory.
-REM #
-for /f "tokens=*" %%d in ('cd') do set CURDIR=%%d
-
-REM #
-REM # find kBuild.
-REM #
-if exist %PATH_KBUILD%\footer.kmk       goto found_kbuild
-set PATH_KBUILD=%CURDIR
-if exist %PATH_KBUILD%\footer.kmk       goto found_kbuild
-set PATH_KBUILD=%CURDIR\kBuild
-if exist %PATH_KBUILD%\footer.kmk       goto found_kbuild
-set PATH_KBUILD=%CURDIR\..\kBuild
-if exist %PATH_KBUILD%\footer.kmk       goto found_kbuild
-set PATH_KBUILD=%CURDIR\..\..\kBuild
-if exist %PATH_KBUILD%\footer.kmk       goto found_kbuild
-set PATH_KBUILD=%CURDIR\..\..\..\kBuild
-if exist %PATH_KBUILD%\footer.kmk       goto found_kbuild
-set PATH_KBUILD=%CURDIR\..\..\..\..\kBuild
-if exist %PATH_KBUILD%\footer.kmk       goto found_kbuild
+REM
+REM Find kBuild.
+REM
+REM We'll try determin the location of this script first and use that
+REM as a starting point for guessing the kBuild directory.
+REM
+
+REM Check if set via KBUILD_PATH.
+if not ".%_KBUILD_PATH%" == "."  if exist %_KBUILD_PATH%\footer.kmk goto found_kbuild
+
+REM Determin a correct self - by %0
+if exist "%_KBUILD_SELF%" goto found_self
+set _KBUILD_SELF=%_KBUILD_SELF%.cmd
+if exist "%_KBUILD_SELF%" goto found_self
+
+REM Determin a correct self - by the PATH
+REM This is very verbose because nested for loops didn't work out.
+for /f "tokens=1  delims=;" %%d in ("%PATH%") do set _KBUILD_SELF=%%d\envwin.cmd
+if exist "%_KBUILD_SELF%" goto found_self
+for /f "tokens=2  delims=;" %%d in ("%PATH%") do set _KBUILD_SELF=%%d\envwin.cmd
+if exist "%_KBUILD_SELF%" goto found_self
+for /f "tokens=3  delims=;" %%d in ("%PATH%") do set _KBUILD_SELF=%%d\envwin.cmd
+if exist "%_KBUILD_SELF%" goto found_self
+for /f "tokens=4  delims=;" %%d in ("%PATH%") do set _KBUILD_SELF=%%d\envwin.cmd
+if exist "%_KBUILD_SELF%" goto found_self
+for /f "tokens=5  delims=;" %%d in ("%PATH%") do set _KBUILD_SELF=%%d\envwin.cmd
+if exist "%_KBUILD_SELF%" goto found_self
+for /f "tokens=6  delims=;" %%d in ("%PATH%") do set _KBUILD_SELF=%%d\envwin.cmd
+if exist "%_KBUILD_SELF%" goto found_self
+for /f "tokens=7  delims=;" %%d in ("%PATH%") do set _KBUILD_SELF=%%d\envwin.cmd
+if exist "%_KBUILD_SELF%" goto found_self
+for /f "tokens=8  delims=;" %%d in ("%PATH%") do set _KBUILD_SELF=%%d\envwin.cmd
+if exist "%_KBUILD_SELF%" goto found_self
+for /f "tokens=9  delims=;" %%d in ("%PATH%") do set _KBUILD_SELF=%%d\envwin.cmd
+if exist "%_KBUILD_SELF%" goto found_self
+for /f "tokens=10 delims=;" %%d in ("%PATH%") do set _KBUILD_SELF=%%d\envwin.cmd
+if exist "%_KBUILD_SELF%" goto found_self
+for /f "tokens=11 delims=;" %%d in ("%PATH%") do set _KBUILD_SELF=%%d\envwin.cmd
+if exist "%_KBUILD_SELF%" goto found_self
+for /f "tokens=12 delims=;" %%d in ("%PATH%") do set _KBUILD_SELF=%%d\envwin.cmd
+if exist "%_KBUILD_SELF%" goto found_self
+for /f "tokens=13 delims=;" %%d in ("%PATH%") do set _KBUILD_SELF=%%d\envwin.cmd
+if exist "%_KBUILD_SELF%" goto found_self
+for /f "tokens=14 delims=;" %%d in ("%PATH%") do set _KBUILD_SELF=%%d\envwin.cmd
+if exist "%_KBUILD_SELF%" goto found_self
+for /f "tokens=15 delims=;" %%d in ("%PATH%") do set _KBUILD_SELF=%%d\envwin.cmd
+if exist "%_KBUILD_SELF%" goto found_self
+for /f "tokens=16 delims=;" %%d in ("%PATH%") do set _KBUILD_SELF=%%d\envwin.cmd
+if exist "%_KBUILD_SELF%" goto found_self
+for /f "tokens=17 delims=;" %%d in ("%PATH%") do set _KBUILD_SELF=%%d\envwin.cmd
+if exist "%_KBUILD_SELF%" goto found_self
+for /f "tokens=18 delims=;" %%d in ("%PATH%") do set _KBUILD_SELF=%%d\envwin.cmd
+if exist "%_KBUILD_SELF%" goto found_self
+for /f "tokens=19 delims=;" %%d in ("%PATH%") do set _KBUILD_SELF=%%d\envwin.cmd
+if exist "%_KBUILD_SELF%" goto found_self
+for /f "tokens=20 delims=;" %%d in ("%PATH%") do set _KBUILD_SELF=%%d\envwin.cmd
+if exist "%_KBUILD_SELF%" goto found_self
+goto try_by_pwd
+
+:found_self
+cd "%_KBUILD_SELF%\.."
+for /f "tokens=*" %%d in ('cd') do set _KBUILD_PATH=%%d
+cd "%_KBUILD_CURDIR%"
+if exist "%_KBUILD_PATH%\footer.kmk"      goto found_kbuild
+
+REM Try relative to the current directory.
+:try_by_pwd
+if exist "%_KBUILD_PATH%\footer.kmk"    goto found_kbuild
+set _KBUILD_PATH=%_KBUILD_CURDIR%
+if exist "%_KBUILD_PATH%\footer.kmk"    goto found_kbuild
+set _KBUILD_PATH=%_KBUILD_CURDIR%\kBuild
+if exist "%_KBUILD_PATH%\footer.kmk"    goto found_kbuild
+set _KBUILD_PATH=%_KBUILD_CURDIR%\..\kBuild
+if exist "%_KBUILD_PATH%\footer.kmk"    goto found_kbuild
+set _KBUILD_PATH=%_KBUILD_CURDIR%\..\..\kBuild
+if exist "%_KBUILD_PATH%\footer.kmk"    goto found_kbuild
+set _KBUILD_PATH=%_KBUILD_CURDIR%\..\..\..\kBuild
+if exist "%_KBUILD_PATH%\footer.kmk"    goto found_kbuild
+set _KBUILD_PATH=%_KBUILD_CURDIR%\..\..\..\..\kBuild
+if exist "%_KBUILD_PATH%\footer.kmk"    goto found_kbuild
 echo kBuild: Can't find the kBuild directory!
 set CURDIR=
@@ -144,121 +416,314 @@
 
 :found_kbuild
-echo dbg: PATH_KBUILD=%PATH_KBUILD%
-set CURDIR=
-
-REM #
-REM # Type.
-REM #
-IF NOT ".%BUILD_TYPE%" == "."           goto have_BUILD_TYPE
-set BUILD_TYPE=release
-:have_BUILD_TYPE
-echo dbg: BUILD_TYPE=%BUILD_TYPE%
-
-
-REM #
-REM # Host platform.
-REM #
-IF NOT ".%BUILD_PLATFORM%" == "."       goto have_2_BUILD_PLATFORM
-set BUILD_PLATFORM=win
-echo dbg: BUILD_PLATFORM=%BUILD_PLATFORM%
-
-IF NOT ".%BUILD_PLATFORM_ARCH%" == "."  goto have_BUILD_PLATFORM_ARCH
-set TEST_PROCESSOR_ARCH=%PROCESSOR_ARCHITECTURE%
-IF NOT ".%PROCESSOR_ARCHITEW6432%" == "." set TEST_PROCESSOR_ARCH=%PROCESSOR_ARCHITEW6432%
-IF "%TEST_PROCESSOR_ARCH%" == "x86"     set BUILD_PLATFORM_ARCH=x86
-IF "%TEST_PROCESSOR_ARCH%" == "X86"     set BUILD_PLATFORM_ARCH=x86
-IF "%TEST_PROCESSOR_ARCH%" == "AMD64"   set BUILD_PLATFORM_ARCH=amd64
-IF "%TEST_PROCESSOR_ARCH%" == "x64"     set BUILD_PLATFORM_ARCH=amd64
-IF "%TEST_PROCESSOR_ARCH%" == "X64"     set BUILD_PLATFORM_ARCH=amd64
-IF NOT ".%BUILD_PLATFORM_ARCH%" == "."  goto have_BUILD_PLATFORM_ARCH
-set TEST_PROCESSOR_ARCH=
-echo kBuild: Cannot figure BUILD_PLATFORM_ARCH!
+cd "%_KBUILD_PATH%"
+for /f "tokens=*" %%d in ('cd') do set _KBUILD_PATH=%%d
+cd "%_KBUILD_CURDIR%"
+if ".%_KBUILD_OPT_DBG%" == ".1" echo dbg: _KBUILD_PATH=%_KBUILD_PATH%
+
+
+REM
+REM Type - release is the default.
+REM
+if not ".%_KBUILD_TYPE%" == "."         goto have_type
+set _KBUILD_TYPE=release
+:have_type
+if ".%_KBUILD_OPT_DBG%" == ".1"         echo dbg: _KBUILD_TYPE=%_KBUILD_TYPE%
+
+
+REM
+REM Host platform - windows
+REM
+if not ".%_KBUILD_HOST%" == "."         goto have_host
+set _KBUILD_HOST=win
+if ".%_KBUILD_OPT_DBG%" == ".1"         echo dbg: _KBUILD_HOST=%_KBUILD_HOST%
+:have_host
+
+if not ".%_KBUILD_HOST_ARCH%" == "."    goto have_host_arch
+REM try guess from _KBUILD_HOST_CPU
+if ".%KBUILD_HOST_CPU%" == ".i386"      set _KBUILD_HOST_ARCH=x86
+if ".%KBUILD_HOST_CPU%" == ".i486"      set _KBUILD_HOST_ARCH=x86
+if ".%KBUILD_HOST_CPU%" == ".i586"      set _KBUILD_HOST_ARCH=x86
+if ".%KBUILD_HOST_CPU%" == ".i686"      set _KBUILD_HOST_ARCH=x86
+if ".%KBUILD_HOST_CPU%" == ".i786"      set _KBUILD_HOST_ARCH=x86
+if ".%KBUILD_HOST_CPU%" == ".i886"      set _KBUILD_HOST_ARCH=x86
+if ".%KBUILD_HOST_CPU%" == ".i986"      set _KBUILD_HOST_ARCH=x86
+if ".%KBUILD_HOST_CPU%" == ".k8"        set _KBUILD_HOST_ARCH=amd64
+if ".%KBUILD_HOST_CPU%" == ".k9"        set _KBUILD_HOST_ARCH=amd64
+if ".%KBUILD_HOST_CPU%" == ".k10"       set _KBUILD_HOST_ARCH=amd64
+if not ".%_KBUILD_HOST_ARCH%" == "."    goto have_host_arch
+REM try guess from PROCESSOR_ARCHITEW6432 and PROCESSOR_ARCHITECTURE
+set _KBUILD_TMP=%PROCESSOR_ARCHITECTURE%
+if not ".%PROCESSOR_ARCHITEW6432%" == "." set _KBUILD_TMP=%PROCESSOR_ARCHITEW6432%
+if "%_KBUILD_TMP%" == "x86"             set _KBUILD_HOST_ARCH=x86
+if "%_KBUILD_TMP%" == "X86"             set _KBUILD_HOST_ARCH=x86
+if "%_KBUILD_TMP%" == "amd64"           set _KBUILD_HOST_ARCH=amd64
+if "%_KBUILD_TMP%" == "Amd64"           set _KBUILD_HOST_ARCH=amd64
+if "%_KBUILD_TMP%" == "AMD64"           set _KBUILD_HOST_ARCH=amd64
+if "%_KBUILD_TMP%" == "x64"             set _KBUILD_HOST_ARCH=amd64
+if "%_KBUILD_TMP%" == "X64"             set _KBUILD_HOST_ARCH=amd64
+if not ".%_KBUILD_HOST_ARCH%" == "."    goto have_host_arch
+echo error: Cannot figure KBUILD_HOST_ARCH!
 goto failed
-:have_BUILD_PLATFORM_ARCH
-echo dbg: BUILD_PLATFORM_ARCH=%BUILD_PLATFORM_ARCH%
-set TEST_PROCESSOR_ARCH=
-
-IF NOT ".%BUILD_PLATFORM_CPU%" == "."   goto have_BUILD_PLATFORM_CPU
-set BUILD_PLATFORM_CPU=blend
-IF NOT ".%BUILD_PLATFORM_CPU%" == "."   goto have_BUILD_PLATFORM_CPU
-echo kBuild: Cannot figure BUILD_PLATFORM_CPU!
+:have_host_arch
+if ".%_KBUILD_OPT_DBG%" == ".1"         echo dbg: _KBUILD_HOST_ARCH=%_KBUILD_HOST_ARCH%
+
+if not ".%_KBUILD_HOST_CPU%" == "."     goto have_host_cpu
+set _KBUILD_HOST_CPU=blend
+:have_host_cpu
+if ".%_KBUILD_OPT_DBG%" == ".1"         echo dbg: _KBUILD_HOST_CPU=%_KBUILD_HOST_CPU%
+
+REM
+REM The target platform.
+REM Defaults to the host when not specified.
+REM
+if not ".%_KBUILD_TARGET%" == "."       goto have_target
+set _KBUILD_TARGET=%_KBUILD_HOST%
+:have_target
+if ".%_KBUILD_OPT_DBG%" == ".1"         echo dbg: _KBUILD_TARGET=%_KBUILD_TARGET%
+
+if not ".%_KBUILD_TARGET_ARCH%" == "."  goto have_target_arch
+set _KBUILD_TARGET_ARCH=%_KBUILD_HOST_ARCH%
+:have_target_arch
+if ".%_KBUILD_OPT_DBG%" == ".1"         echo dbg: _KBUILD_TARGET_ARCH=%_KBUILD_TARGET_ARCH%
+
+if not ".%_KBUILD_TARGET_CPU%" == "."  goto have_target_cpu
+if ".%_KBUILD_TARGET_ARCH%" == ".%_KBUILD_HOST_ARCH%" set _KBUILD_TARGET_CPU=%_KBUILD_HOST_CPU%
+if not ".%_KBUILD_TARGET_CPU%" == "."  goto have_target_cpu
+set _KBUILD_TARGET_CPU=%_KBUILD_HOST_CPU%
+:have_target_cpu
+if ".%_KBUILD_OPT_DBG%" == ".1"         echo dbg: _KBUILD_TARGET_CPU=%_KBUILD_TARGET_CPU%
+
+REM
+REM Calc KBUILD_BIN_PATH and the new PATH value.
+REM
+if not ".%_KBUILD_BIN_PATH%" == "."     goto have_kbuild_bin_path
+set _KBUILD_BIN_PATH=%_KBUILD_PATH%\bin\win.%_KBUILD_HOST_ARCH%
+:have_kbuild_bin_path
+if ".%_KBUILD_OPT_DBG%" == ".1"         echo dbg: _KBUILD_BIN_PATH=%_KBUILD_BIN_PATH%
+
+set _KBUILD_NEW_PATH=%_KBUILD_BIN_PATH%;%PATH%
+if ".%_KBUILD_OPT_DBG%" == ".1"         echo dbg: _KBUILD_NEW_PATH=%_KBUILD_NEW_PATH%
+
+REM
+REM Sanity check.
+REM
+rem echo ON
+if not exist "%_KBUILD_BIN_PATH%" goto missing_bin_path
+if not exist "%_KBUILD_BIN_PATH%" goto done_chekcing_for_tools
+set _KBUILD_TMP=kmk kDepPre kDepIDB kmk_append kmk_ash kmk_cat kmk_cp kmk_echo kmk_install kmk_ln kmk_mkdir kmk_mv kmk_rm kmk_rmdir kmk_sed
+for %%i in ( %_KBUILD_TMP% ) do if not exist "%_KBUILD_BIN_PATH%\%%i.exe" echo warning: The %%i program doesn't exist for this platform. (%_KBUILD_BIN_PATH%\%%i.exe)"
+goto done_chekcing_for_tools
+
+:missing_bin_path
+echo warning: The bin directory for this platform doesn't exist. (%_KBUILD_BIN_PATH%)
+:done_chekcing_for_tools
+
+REM
+REM The environment is in place, now take the requested action.
+REM
+if ".%_KBUILD_OPT_VAR%" == "." goto exec_or_setup_env
+rem goto show_variable
+
+REM
+REM Show a set of variables.
+REM
+REM Note: 4nt doesn't grok the setlocal delayed expansion option.
+REM       So, we'll have to identify which shell we're running.
+REM
+:show_variable
+for %%i in ( %_KBUILD_OPT_VAR% ) do if "%%i" == "all" goto show_all_variables
+
+if not ".%_4VER%" == "." goto 4nt
+setlocal ENABLEDELAYEDEXPANSION
+if errorlevel 1 goto no_delay_expansion
+
+for %%i in ( %_KBUILD_OPT_VAR% ) do (
+    set _KBUILD_VAR=%%i
+    set _KBUILD_TMP=
+    if "%%i" == "KBUILD_PATH"         set _KBUILD_TMP=%_KBUILD_PATH%
+    if "%%i" == "KBUILD_BIN_PATH"     set _KBUILD_TMP=%_KBUILD_BIN_PATH%
+    if "%%i" == "KBUILD_TYPE"         set _KBUILD_TMP=%_KBUILD_TYPE%
+    if "%%i" == "KBUILD_HOST"         set _KBUILD_TMP=%_KBUILD_HOST%
+    if "%%i" == "KBUILD_HOST_ARCH"    set _KBUILD_TMP=%_KBUILD_HOST_ARCH%
+    if "%%i" == "KBUILD_HOST_CPU"     set _KBUILD_TMP=%_KBUILD_HOST_CPU%
+    if "%%i" == "KBUILD_TARGET"       set _KBUILD_TMP=%_KBUILD_TARGET%
+    if "%%i" == "KBUILD_TARGET_ARCH"  set _KBUILD_TMP=%_KBUILD_TARGET_ARCH%
+    if "%%i" == "KBUILD_TARGET_CPU"   set _KBUILD_TMP=%_KBUILD_TARGET_CPU%
+    if ".!_KBUILD_TMP!" == "."                      goto varible_not_found
+    if not ".%_KBUILD_OPT_VALUE_ONLY%" == ".1"      echo %_KBUILD_SHOW_VAR_PREFIX%%%i=!_KBUILD_TMP!
+    if ".%_KBUILD_OPT_VALUE_ONLY%" == ".1"          echo !_KBUILD_TMP!
+)
+
+endlocal
+
+echo off
+exit /b 0
+goto end
+
+:no_delay_expansion
+echo error: Unable to enable delayed expansion in the shell.
+
+:4nt
+for %%i in ( %_KBUILD_OPT_VAR% ) do (
+    set _KBUILD_VAR=%%i
+    set _KBUILD_TMP=
+    if "%%i" == "KBUILD_PATH"         set _KBUILD_TMP=%_KBUILD_PATH%
+    if "%%i" == "KBUILD_BIN_PATH"     set _KBUILD_TMP=%_KBUILD_BIN_PATH%
+    if "%%i" == "KBUILD_TYPE"         set _KBUILD_TMP=%_KBUILD_TYPE%
+    if "%%i" == "KBUILD_HOST"         set _KBUILD_TMP=%_KBUILD_HOST%
+    if "%%i" == "KBUILD_HOST_ARCH"    set _KBUILD_TMP=%_KBUILD_HOST_ARCH%
+    if "%%i" == "KBUILD_HOST_CPU"     set _KBUILD_TMP=%_KBUILD_HOST_CPU%
+    if "%%i" == "KBUILD_TARGET"       set _KBUILD_TMP=%_KBUILD_TARGET%
+    if "%%i" == "KBUILD_TARGET_ARCH"  set _KBUILD_TMP=%_KBUILD_TARGET_ARCH%
+    if "%%i" == "KBUILD_TARGET_CPU"   set _KBUILD_TMP=%_KBUILD_TARGET_CPU%
+    if ".%_KBUILD_TMP%" == "."                      goto varible_not_found
+    if not ".%_KBUILD_OPT_VALUE_ONLY%" == ".1"      echo %_KBUILD_SHOW_VAR_PREFIX%%i=%_KBUILD_TMP%
+    if ".%_KBUILD_OPT_VALUE_ONLY%" == ".1"          echo %_KBUILD_TMP%
+)
+goto end
+
+:varible_not_found
+echo error: Unknown variable %_KBUILD_VAR% specified in --var request.
 goto failed
-:have_BUILD_PLATFORM_CPU
-echo dbg: BUILD_PLATFORM_CPU=%BUILD_PLATFORM_CPU%
-goto process_BUILD_TARGET
-
-
-:have_2_BUILD_PLATFORM
-echo dbg: BUILD_PLATFORM=%BUILD_PLATFORM%
-IF NOT ".%BUILD_PLATFORM_ARCH%" == "."  goto have_2_BUILD_PLATFORM_ARCH
-set TEST_PROCESSOR_ARCH=%PROCESSOR_ARCHITECTURE%
-IF NOT ".%PROCESSOR_ARCHITEW6432%" == "." set TEST_PROCESSOR_ARCH=%PROCESSOR_ARCHITEW6432%
-IF "%TEST_PROCESSOR_ARCH%" == "x86"     set BUILD_PLATFORM_ARCH=x86
-IF "%TEST_PROCESSOR_ARCH%" == "X86"     set BUILD_PLATFORM_ARCH=x86
-IF "%TEST_PROCESSOR_ARCH%" == "AMD64"   set BUILD_PLATFORM_ARCH=amd64
-IF "%TEST_PROCESSOR_ARCH%" == "x64"     set BUILD_PLATFORM_ARCH=amd64
-IF "%TEST_PROCESSOR_ARCH%" == "X64"     set BUILD_PLATFORM_ARCH=amd64
-IF NOT ".%BUILD_PLATFORM_ARCH%" == "."  goto have_2_BUILD_PLATFORM_ARCH
-set TEST_PROCESSOR_ARCH=
-echo kBuild: Cannot figure BUILD_PLATFORM_ARCH!
-goto failed
-:have_2_BUILD_PLATFORM_ARCH
-echo dbg: BUILD_PLATFORM_ARCH=%BUILD_PLATFORM_ARCH%
-
-IF NOT ".%BUILD_PLATFORM_CPU%" == "."   goto have_2_BUILD_PLATFORM_CPU
-IF "%BUILD_PLATFORM_ARCH%" == "amd64"   set BUILD_PLATFORM_CPU=k8
-IF "%BUILD_PLATFORM_ARCH%" == "x86"     set BUILD_PLATFORM_CPU=i386
-IF NOT ".%BUILD_PLATFORM_CPU%" == "."   goto have_2_BUILD_PLATFORM_CPU
-echo kBuild: Cannot figure BUILD_PLATFORM_CPU!
-goto failed
-:have_2_BUILD_PLATFORM_CPU
-echo dbg: BUILD_PLATFORM_CPU=%BUILD_PLATFORM_CPU%
-
-
-REM #
-REM # Target platform.
-REM #
-:process_BUILD_TARGET
-IF NOT ".%BUILD_TARGET%" == "."         goto have_BUILD_TARGET
-set BUILD_TARGET=%BUILD_PLATFORM%
-IF NOT ".%BUILD_TARGET_ARCH%" == "."    goto have_BUILD_TARGET_ARCH
-set BUILD_TARGET_ARCH=%BUILD_PLATFORM_ARCH%
-:have_BUILD_TARGET_ARCH
-IF NOT ".%BUILD_TARGET_CPU%" == "."     goto have_BUILD_TARGET_CPU
-set BUILD_TARGET_CPU=%BUILD_PLATFORM_CPU%
-:have_BUILD_TARGET_CPU
-echo dbg: BUILD_TARGET=%BUILD_TARGET%
-echo dbg: BUILD_TARGET_ARCH=%BUILD_TARGET_ARCH%
-echo dbg: BUILD_TARGET_CPU=%BUILD_TARGET_CPU%
-goto next
-
-:have_BUILD_TARGET
-echo dbg: BUILD_TARGET=%BUILD_TARGET%
-IF NOT ".%BUILD_TARGET_ARCH%" == "."    goto have_2_BUILD_TARGET_ARCH
-IF "%BUILD_TARGET%" == "os2"            set BUILD_TARGET_ARCH=x86
-IF ".%BUILD_TARGET_ARCH%" == "."        set BUILD_TARGET_ARCH=%BUILD_PLATFORM_ARCH%
-:have_2_BUILD_TARGET_ARCH
-echo dbg: BUILD_TARGET_ARCH=%BUILD_TARGET_ARCH%
-IF NOT ".%BUILD_TARGET_CPU%" == "."     goto have_2_BUILD_TARGET_CPU
-set BUILD_TARGET_CPU=blend
-IF NOT ".%BUILD_TARGET_CPU%" == "."     goto have_2_BUILD_TARGET_CPU
-echo kBuild: Cannot figure BUILD_TARGET_CPU!
-goto failed
-:have_2_BUILD_TARGET_CPU
-echo dbg: BUILD_TARGET_CPU=%BUILD_TARGET_CPU%
-
-:next
-
-REM # The PATH.
-set PATH=%PATH_KBUILD%\bin\win.x86;%PATH%
-IF "%BUILD_PLATFORM_ARCH%" == "amd64" set PATH=%PATH_KBUILD%\bin\win.amd64;%PATH%
-echo dbg: PATH=%PATH%
-
-REM # Execute command
-IF ".%1" == "." goto end
+
+:show_all_variables
+echo %_KBUILD_SHOW_VAR_PREFIX%KBUILD_PATH=%_KBUILD_PATH%
+echo %_KBUILD_SHOW_VAR_PREFIX%KBUILD_BIN_PATH=%_KBUILD_BIN_PATH%
+echo %_KBUILD_SHOW_VAR_PREFIX%KBUILD_TYPE=%_KBUILD_TYPE%
+echo %_KBUILD_SHOW_VAR_PREFIX%KBUILD_HOST=%_KBUILD_HOST%
+echo %_KBUILD_SHOW_VAR_PREFIX%KBUILD_HOST_ARCH=%_KBUILD_HOST_ARCH%
+echo %_KBUILD_SHOW_VAR_PREFIX%KBUILD_HOST_CPU=%_KBUILD_HOST_CPU%
+echo %_KBUILD_SHOW_VAR_PREFIX%KBUILD_TARGET=%_KBUILD_TARGET%
+echo %_KBUILD_SHOW_VAR_PREFIX%KBUILD_TARGET_ARCH=%_KBUILD_TARGET_ARCH%
+echo %_KBUILD_SHOW_VAR_PREFIX%KBUILD_TARGET_CPU=%_KBUILD_TARGET_CPU%
+goto end
+
+REM
+REM Setup environment for the current shell or execute a command.
+REM
+REM Note: We use setlocal if we're going to execute a command as we
+REM       don't want the environment of the invoking shell to be changed.
+REM
+:exec_or_setup_env
+if not ".%1" == "." setlocal
+
+REM The PATH is always set.
+set PATH=%_KBUILD_NEW_PATH%
+
+REM Clear up anything that should be overridden.
+if not "%_KBUILD_OPT_OVERRIDE_ALL%" == "1" goto skip_override_all
+set KBUILD_TYPE=
+set KBUILD_HOST=
+set KBUILD_HOST_ARCH=
+set KBUILD_HOST_CPU=
+set KBUILD_TARGET=
+set KBUILD_TARGET_ARCH=
+set KBUILD_TARGET_CPU=
+set KBUILD_PATH=
+set KBUILD_BIN_PATH=
+if not "%_KBUILD_OPT_LEGACY%" == "1" goto skip_override_all
+set BUILD_TYPE=
+set BUILD_PLATFORM=
+set BUILD_PLATFORM_ARCH=
+set BUILD_PLATFORM_CPU=
+set BUILD_TARGET=
+set BUILD_TARGET_ARCH=
+set BUILD_TARGET_CPU=
+set PATH_KBUILD=
+set PATH_KBUILD_BIN=
+:skip_override_all
+
+REM Specific overrides, these implicitly deletes the legacy variable.
+if "%_KBUILD_OVERRIDE_TARGET%" == "1"       set KBUILD_TARGET=%_KBUILD_TARGET%
+if "%_KBUILD_OVERRIDE_TARGET%" == "1"       set BUILD_TARGET=
+if "%_KBUILD_OVERRIDE_TARGET_ARCH%" == "1"  set KBUILD_TARGET_ARCH=%_KBUILD_TARGET_ARCH%
+if "%_KBUILD_OVERRIDE_TARGET_ARCH%" == "1"  set BUILD_TARGET_ARCH=
+if "%_KBUILD_OVERRIDE_TYPE%" == "1"         set KBUILD_TYPE=%_KBUILD_TYPE%
+if "%_KBUILD_OVERRIDE_TYPE%" == "1"         set BUILD_TYPE=
+
+if not "%_KBUILD_OPT_FULL%" == "1"          goto env_setup_done
+set KBUILD_PATH=%_KBUILD_PATH%
+set KBUILD_BIN_PATH=%_KBUILD_BIN_PATH%
+set KBUILD_TYPE=%_KBUILD_TYPE%
+set KBUILD_HOST=%_KBUILD_HOST%
+set KBUILD_HOST_ARCH=%_KBUILD_HOST_ARCH%
+set KBUILD_HOST_CPU=%_KBUILD_HOST_CPU%
+set KBUILD_TARGET=%_KBUILD_TARGET%
+set KBUILD_TARGET_ARCH=%_KBUILD_TARGET_ARCH%
+set KBUILD_TARGET_CPU=%_KBUILD_TARGET_CPU%
+
+if not "%_KBUILD_OPT_LEGACY%" == "1"        goto env_setup_done
+set PATH_KBUILD=%_KBUILD_PATH%
+set PATH_KBUILD_BIN=%_KBUILD_BIN_PATH%
+set BUILD_TYPE=%_KBUILD_TYPE%
+set BUILD_PLATFORM=%_KBUILD_HOST%
+set BUILD_PLATFORM_ARCH=%_KBUILD_HOST_ARCH%
+set BUILD_PLATFORM_CPU=%_KBUILD_HOST_CPU%
+set BUILD_TARGET=%_KBUILD_TARGET%
+set BUILD_TARGET_ARCH=%_KBUILD_TARGET_ARCH%
+set BUILD_TARGET_CPU=%_KBUILD_TARGET_CPU%
+
+:env_setup_done
+if ".%1" == "." goto end
+
+REM Execute the specified command
+if ".%_KBUILD_OPT_DBG%" == ".1" echo dbg: Executing: %1 %2 %3 %4 %5 %6 %7 %8 %9
+set _KBUILD_CLEAN_GOTO=exec_command & goto cleanup
+:exec_command
+SET _KBUILD_CLEAN_GOTO=
 %1 %2 %3 %4 %5 %6 %7 %8 %9
-goto end
+endlocal
+goto end_no_exit
+
+
+
+REM
+REM All exit paths leads to 'end' or 'failed' depending on
+REM which exit code is desire. This is required as we're manually
+REM performing environment cleanup (setlocal/endlocal is crap).
+REM
+:cleanup
+set _KBUILD_CURDIR=
+set _KBUILD_PATH=
+set _KBUILD_BIN_PATH=
+set _KBUILD_NEW_PATH=
+set _KBUILD_TYPE=
+set _KBUILD_TARGET=
+set _KBUILD_TARGET_ARCH=
+set _KBUILD_TARGET_CPU=
+set _KBUILD_HOST=
+set _KBUILD_HOST_ARCH=
+set _KBUILD_HOST_CPU=
+set _KBUILD_OPT_OVERRIDE_ALL=
+set _KBUILD_OVERRIDE_TYPE=
+set _KBUILD_OVERRIDE_TARGET=
+set _KBUILD_OVERRIDE_TARGET_ARCH=
+
+set _KBUILD_SELF=
+set _KBUILD_OPT_FULL=
+set _KBUILD_OPT_LEGACY=
+set _KBUILD_OPT_VAR=
+set _KBUILD_OPT_VALUE_ONLY=
+set _KBUILD_SHOW_VAR_PREFIX=
+set _KBUILD_OPT_DBG=
+set _KBUILD_OPT_OVERRIDE_ALL=
+
+set _KBUILD_TMP=
+set _KBUILD_VAR=
+set _KBUILD_VARS=
+goto %_KBUILD_CLEAN_GOTO%
 
 :failed
+set _KBUILD_CLEAN_GOTO=failed_done & goto cleanup
+:failed_done
+set _KBUILD_CLEAN_GOTO=
+exit /b 1
+
 :end
-
+set _KBUILD_CLEAN_GOTO=end_done & goto cleanup
+:end_done
+set _KBUILD_CLEAN_GOTO=
+exit /b 0
+
+:end_no_exit
+
