@echo off
REM $Id: envwin.cmd 3647 2024-11-03 02:33:51Z bird $
REM REM @file
REM Environment setup script.
REM

REM
REM Copyright (c) 2005-2024 knut st. osmundsen <bird-kBuild-spamx@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 saved 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 #
:do_help
echo kBuild environment setup script for Windows NT.
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   --nt32
echo       Force x86 32-bit NT target platform.
echo   --nt64
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

:done_arguments

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%
:legacy_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: KBUILD_TARGET=%KBUILD_TARGET% is no longer valid.
echo        Only 'win' and 'nt' are permitted for targeting microsoft windows.
goto failed

: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

:target_and_platform_ok

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=
goto failed

:found_kbuild
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_ARCHITECTURE, PROCESSOR_ARCHITEW6432, and
REM PROCESSOR_IDENTIFIER (latter for arm running non-native shells (tcc.exe)).
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 /i "%PROCESSOR_IDENTIFIER:~0,5%" == "ARMv8" set _KBUILD_HOST_ARCH=arm64
if /i "%PROCESSOR_IDENTIFIER:~0,5%" == "ARMv9" set _KBUILD_HOST_ARCH=arm64
if not ".%_KBUILD_HOST_ARCH%" == "."    goto have_host_arch
echo error: Cannot figure KBUILD_HOST_ARCH!
goto failed
: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
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
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
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

: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
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

