@REM @file
@REM   This stand-alone program is typically called by the edksetup.bat file,
@REM   however it may be executed directly from the BaseTools project folder
@REM   if the file is not executed within a WORKSPACE\BaseTools folder.
@REM
@REM Copyright (c) 2006 - 2025, Intel Corporation. All rights reserved.<BR>
@REM (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
@REM
@REM SPDX-License-Identifier: BSD-2-Clause-Patent
@REM

@echo off
pushd .
set SCRIPT_ERROR=0
set PYTHON_VER_MAJOR=3
set PYTHON_VER_MINOR=6

@REM ##############################################################
@REM # You should not have to modify anything below this line
@REM #

if /I "%1"=="-h" goto Usage
if /I "%1"=="-help" goto Usage
if /I "%1"=="--help" goto Usage
if /I "%1"=="/h" goto Usage
if /I "%1"=="/help" goto Usage
if /I "%1"=="/?" goto Usage


:loop
  if "%1"=="" goto setup_workspace
  if /I "%1"=="Reconfig" (
    shift
    set RECONFIG=TRUE
    goto loop
  )
  if /I "%1"=="Rebuild" (
    shift
    set REBUILD=TRUE
    goto loop
  )
  if /I "%1"=="ForceRebuild" (
    shift
    set FORCE_REBUILD=TRUE
    goto loop
  )
  if /I "%1"=="Mingw-w64" (
    shift
    set BASETOOLS_MINGW_BUILD=TRUE
    goto loop
  )
  if /I "%1"=="VS2026" (
    shift
    set VS2026=TRUE
    set VSTool=VS2026
    goto loop
  )
  if /I "%1"=="VS2022" (
    shift
    set VS2022=TRUE
    set VSTool=VS2022
    goto loop
  )
  if /I "%1"=="VS2019" (
    shift
    set VS2019=TRUE
    set VSTool=VS2019
    goto loop
  )
  if "%1"=="" goto setup_workspace
  if exist %1 (
    if not defined BASE_TOOLS_PATH (
      if exist %1\Source set BASE_TOOLS_PATH=%1
      shift
      goto loop
    )
    if not defined EDK_TOOLS_PATH (
      if exist %1\Bin\Win32 set EDK_TOOLS_PATH=%1
      shift
      goto loop
    )
    echo.
    echo !!! ERROR !!! Unknown argument, %1 !!!
    echo.
    goto end
  ) else (
    echo.
    echo !!! ERROR !!! Unknown argument, %1 !!!
    echo.
    goto end
  )
  goto loop


@REM
@REM Check the required system environment variables
@REM

:setup_workspace
  REM
  REM check the BASETOOLS_MINGW_PATH
  REM
  if defined BASETOOLS_MINGW_BUILD (
    if not defined BASETOOLS_MINGW_PATH (
      echo.
      echo !!! ERROR !!! BASETOOLS_MINGW_PATH must be set to use mingw-w64. !!!
      echo.
      goto end
    )
  )

  REM
  REM check the EDK_TOOLS_PATH
  REM
  if not defined EDK_TOOLS_PATH goto no_EDK_TOOLS_PATH
  if exist %EDK_TOOLS_PATH% goto set_PATH

:no_EDK_TOOLS_PATH
  if not defined WORKSPACE (
    if defined BASE_TOOLS_PATH (
      set EDK_TOOLS_PATH=%BASE_TOOLS_PATH%
      goto set_PATH
    ) else (
      echo.
      echo !!! ERROR !!! Neither BASE_TOOLS_PATH nor EDK_TOOLS_PATH are set. !!!
      echo.
      goto end
    )
  ) else (
    if exist %WORKSPACE%\BaseTools\Bin (
      set EDK_TOOLS_PATH=%WORKSPACE%\BaseTools
      goto set_PATH
    ) else (
      echo.
      echo !!! ERROR !!! No tools path available. Please set EDK_TOOLS_PATH !!!
      echo.
      goto end
    )
  )

:set_PATH
  if not defined BASE_TOOLS_PATH (
     if not exist "Source\C\Makefile" (
       if not exist "%EDK_TOOLS_PATH%\Source\C\Makefile" goto no_source_files
       set BASE_TOOLS_PATH=%EDK_TOOLS_PATH%
     ) else (
       set BASE_TOOLS_PATH=%CD%
     )
  )

  REM
  REM Check Python environment
  REM
  set PYTHONHASHSEED=1
  if not defined PYTHON_COMMAND (
    set PYTHON_COMMAND=py -3
    py -3 %BASE_TOOLS_PATH%\Tests\PythonTest.py %PYTHON_VER_MAJOR% %PYTHON_VER_MINOR% >NUL 2>NUL
    if %ERRORLEVEL% EQU 1 (
      echo.
      echo !!! ERROR !!! Python %PYTHON_VER_MAJOR%.%PYTHON_VER_MINOR% or newer is required.
      echo.
      goto end
    )
    if %ERRORLEVEL% NEQ 0 (
      if not defined PYTHON_HOME if not defined PYTHONHOME (
        set PYTHON_COMMAND=
        echo.
        echo !!! ERROR !!! Binary python tools are missing.
        echo PYTHON_COMMAND or PYTHON_HOME
        echo Environment variable is not set correctly.
        echo They are required to build or execute the python tools.
        echo.
        goto end
      )
    )
  )

  if not defined PYTHON_COMMAND (
    if defined PYTHON_HOME (
      if EXIST "%PYTHON_HOME%" (
        set PYTHON_COMMAND=%PYTHON_HOME%\python.exe
      ) else (
        echo .
        echo !!! ERROR !!!  PYTHON_HOME="%PYTHON_HOME%" does not exist.
        echo .
        goto end
      )
    )
  )
  if defined WORKSPACE_TOOLS_PATH goto check_PATH
  REM If MinGW build, add mingw-w64 tools to the PATH
  if defined BASETOOLS_MINGW_BUILD (
    if %BASETOOLS_MINGW_PATH:~-1% EQU \ (
      if not exist "%BASETOOLS_MINGW_PATH%bin\mingw32-make.exe" (
        echo .
        echo !!! ERROR !!! mingw32-make is missing.
        echo mingw32-make is needed for a mingw32-w64 build.
        echo Check that the BASETOOLS_MINGW_BUILD
        echo Environment variable is set correctly.
        echo .
        goto end
      )
      set "PATH=%BASETOOLS_MINGW_PATH%bin;%PATH%"
    ) else (
      if not exist "%BASETOOLS_MINGW_PATH%\bin\mingw32-make.exe" (
        echo .
        echo !!! ERROR !!! mingw32-make is missing.
        echo mingw32-make is needed for a mingw32-w64 build.
        echo Check that the BASETOOLS_MINGW_BUILD
        echo Environment variable is set correctly.
        echo .
        goto end
      )
      set "PATH=%BASETOOLS_MINGW_PATH%\bin;%PATH%"
    )
  )
  if not defined EDK_TOOLS_BIN (
    if defined BASETOOLS_MINGW_BUILD (
      pushd .
      cd "%BASE_TOOLS_PATH%\Source\C"
      for /f %%i in ('mingw32-make -q --eval="$(info $(shell %PYTHON_COMMAND% Makefiles\GnuMakeUtils.py get_host_arch))"') do set MINGW_ARCH=%%i
      popd
    )
  )
  if not defined EDK_TOOLS_BIN (
    if defined BASETOOLS_MINGW_BUILD (
      if /I "%MINGW_ARCH%"=="X64" (
        set EDK_TOOLS_BIN=%EDK_TOOLS_PATH%\Bin\Win64
      ) else (
        if /I "%MINGW_ARCH%"=="AARCH64" (
          set EDK_TOOLS_BIN=%EDK_TOOLS_PATH%\Bin\Win64
        ) else (
          set EDK_TOOLS_BIN=%EDK_TOOLS_PATH%\Bin\Win32
        )
      )
      set MINGW_ARCH=
    ) else (
      set EDK_TOOLS_BIN=%EDK_TOOLS_PATH%\Bin\Win32
    )
    if not defined FORCE_REBUILD (
      if not defined REBUILD (
        if not exist "%EDK_TOOLS_BIN%" (
          echo.
          echo !!! ERROR !!! Cannot find BaseTools Bin Win32!!!
          echo Please check the directory %EDK_TOOLS_BIN%
          echo Or configure EDK_TOOLS_BIN env to point to Bin directory.
          echo.
        )
      )
    )
  )
  set PATH=%EDK_TOOLS_BIN%;%PATH%
  set WORKSPACE_TOOLS_PATH=%EDK_TOOLS_PATH%
  goto PATH_ok

:check_PATH
  if "%EDK_TOOLS_PATH%"=="%WORKSPACE_TOOLS_PATH%" goto PATH_ok
  if not defined EDK_TOOLS_BIN (
    if defined BASETOOLS_MINGW_BUILD (
      pushd .
      cd "%BASE_TOOLS_PATH%\Source\C"
      for /f %%i in ('mingw32-make -q --eval="$(info $(shell %PYTHON_COMMAND% Makefiles\GnuMakeUtils.py get_host_arch))"') do set MINGW_ARCH=%%i
      popd
    )
  )
  if not defined EDK_TOOLS_BIN (
    if defined BASETOOLS_MINGW_BUILD (
      echo MINGW_ARCH=%MINGW_ARCH%
      if /I "%MINGW_ARCH%"=="X64" (
        set EDK_TOOLS_BIN=%EDK_TOOLS_PATH%\Bin\Win64
      ) else (
        if /I "%MINGW_ARCH%"=="AARCH64" (
          set EDK_TOOLS_BIN=%EDK_TOOLS_PATH%\Bin\Win64
        ) else (
          set EDK_TOOLS_BIN=%EDK_TOOLS_PATH%\Bin\Win32
        )
      )
      set MINGW_ARCH=
    ) else (
      set EDK_TOOLS_BIN=%EDK_TOOLS_PATH%\Bin\Win32
    )
    if not defined FORCE_REBUILD (
      if not defined REBUILD (
        if not exist "%EDK_TOOLS_BIN%" (
          echo.
          echo !!! ERROR !!! Cannot find BaseTools Bin Win32!!!
          echo Please check the directory %EDK_TOOLS_BIN%
          echo Or configure EDK_TOOLS_BIN env to point to Bin directory.
          echo.
        )
      )
    )
  )
  set PATH=%EDK_TOOLS_BIN%;%PATH%
  set WORKSPACE_TOOLS_PATH=%EDK_TOOLS_PATH%
  echo Resetting the PATH variable to include the EDK_TOOLS_PATH for this session.

:PATH_ok
REM
REM copy *.template to %CONF_PATH%
REM
if not defined WORKSPACE (
   if defined RECONFIG (
     echo.
     echo !!! WARNING !!! WORKSPACE environment variable was not set, cannot Reconfig !!!
     echo.
   )
   goto skip_reconfig
)

IF NOT exist "%EDK_TOOLS_PATH%\set_vsprefix_envs.bat" (
  @echo.
  @echo !!! ERROR !!! The set_vsprefix_envs.bat was not found !!!
  @echo.
  goto end
)
if defined VS2026 (
  call %EDK_TOOLS_PATH%\set_vsprefix_envs.bat VS2026
) else if defined VS2022 (
  call %EDK_TOOLS_PATH%\set_vsprefix_envs.bat VS2022
) else if defined VS2019 (
  call %EDK_TOOLS_PATH%\set_vsprefix_envs.bat VS2019
) else if not defined BASETOOLS_MINGW_BUILD (
  call %EDK_TOOLS_PATH%\set_vsprefix_envs.bat
  call %EDK_TOOLS_PATH%\get_vsvars.bat
)
if defined BASETOOLS_MINGW_BUILD (
  if not defined IASL_PREFIX (
    REM For VS builds this environment variable is set via set_vsprefix_envs.bat
    if exist "C:\ASL\" (
      set IASL_PREFIX=C:\ASL\
    ) else (
        @echo.
        @echo !!! WARNING !!! IASL_PREFIX environment variable is not set
    )
  )
)
if %SCRIPT_ERROR% NEQ 0 (
  @echo.
  @echo !!! ERROR !!! %VSTool% is not installed !!!
  @echo.
  goto end
)

if not defined CONF_PATH (
  set CONF_PATH=%WORKSPACE%\Conf
)

if NOT exist %CONF_PATH% (
  if defined PACKAGES_PATH (
    for %%i IN (%PACKAGES_PATH%) DO (
      if exist %%~fi\Conf (
        set CONF_PATH=%%i\Conf
        goto CopyConf
      )
    )
  )
)

:CopyConf
if NOT exist %CONF_PATH% (
  mkdir %CONF_PATH%
) else (
  if defined RECONFIG (
    echo.
    echo  Overwriting the files in the CONF_PATH directory
    echo  using the default template files
    echo.
  )
)

if NOT exist %CONF_PATH%\target.txt (
  echo copying ... target.template to %CONF_PATH%\target.txt
  if NOT exist %EDK_TOOLS_PATH%\Conf\target.template (
    echo Error: target.template is missing at folder %EDK_TOOLS_PATH%\Conf\
  )
  copy %EDK_TOOLS_PATH%\Conf\target.template %CONF_PATH%\target.txt > nul
) else (
  if defined RECONFIG echo overwrite ... target.template to %CONF_PATH%\target.txt
  if defined RECONFIG copy /Y %EDK_TOOLS_PATH%\Conf\target.template %CONF_PATH%\target.txt > nul
)

if NOT exist %CONF_PATH%\tools_def.txt (
  echo copying ... tools_def.template to %CONF_PATH%\tools_def.txt
  if NOT exist %EDK_TOOLS_PATH%\Conf\tools_def.template (
    echo Error: tools_def.template is missing at folder %EDK_TOOLS_PATH%\Conf\
  )
  copy %EDK_TOOLS_PATH%\Conf\tools_def.template %CONF_PATH%\tools_def.txt > nul
) else (
  if defined RECONFIG echo overwrite ... tools_def.template to %CONF_PATH%\tools_def.txt
  if defined RECONFIG copy /Y %EDK_TOOLS_PATH%\Conf\tools_def.template %CONF_PATH%\tools_def.txt > nul
)

if NOT exist %CONF_PATH%\build_rule.txt (
  echo copying ... build_rule.template to %CONF_PATH%\build_rule.txt
  if NOT exist %EDK_TOOLS_PATH%\Conf\build_rule.template (
    echo Error: build_rule.template is missing at folder %EDK_TOOLS_PATH%\Conf\
  )
  copy %EDK_TOOLS_PATH%\Conf\build_rule.template %CONF_PATH%\build_rule.txt > nul
) else (
  if defined RECONFIG echo over-write ... build_rule.template to %CONF_PATH%\build_rule.txt
  if defined RECONFIG copy /Y %EDK_TOOLS_PATH%\Conf\build_rule.template %CONF_PATH%\build_rule.txt > nul
)

:skip_reconfig

@REM
@REM Test if we are going to have to do a build
@REM
if defined FORCE_REBUILD goto check_build_environment
if defined REBUILD goto check_build_environment
if not exist "%EDK_TOOLS_PATH%" goto check_build_environment
if not exist "%EDK_TOOLS_BIN%"  goto check_build_environment

IF NOT EXIST "%EDK_TOOLS_BIN%\EfiRom.exe" goto check_c_tools
IF NOT EXIST "%EDK_TOOLS_BIN%\GenFfs.exe" goto check_c_tools
IF NOT EXIST "%EDK_TOOLS_BIN%\GenFv.exe" goto check_c_tools
IF NOT EXIST "%EDK_TOOLS_BIN%\GenFw.exe" goto check_c_tools
IF NOT EXIST "%EDK_TOOLS_BIN%\GenSec.exe" goto check_c_tools
IF NOT EXIST "%EDK_TOOLS_BIN%\TianoCompress.exe" goto check_c_tools
IF NOT EXIST "%EDK_TOOLS_BIN%\VfrCompile.exe" goto check_c_tools
IF NOT EXIST "%EDK_TOOLS_BIN%\VolInfo.exe" goto check_c_tools

goto check_build_environment

:check_c_tools
  echo.
  echo !!! ERROR !!! Binary C tools are missing. They are required to be built from BaseTools Source.
  echo.

:check_build_environment

%PYTHON_COMMAND% %BASE_TOOLS_PATH%\Tests\PythonTest.py %PYTHON_VER_MAJOR% %PYTHON_VER_MINOR% >NUL 2>NUL
if %ERRORLEVEL% EQU 1 (
  echo.
  echo !!! ERROR !!! Python %PYTHON_VER_MAJOR%.%PYTHON_VER_MINOR% or newer is required.
  echo.
  goto end
)
if %ERRORLEVEL% NEQ 0 (
  echo.
  echo !!! ERROR !!!  PYTHON_COMMAND="%PYTHON_COMMAND%" does not exist or is not a Python interpreter.
  echo.
  goto end
)

endlocal

  @echo Using EDK2 in-source Basetools
  if defined BASETOOLS_PYTHON_SOURCE goto print_python_info
  set "PATH=%BASE_TOOLS_PATH%\BinWrappers\WindowsLike;%PATH%"
  set PYTHONPATH=%BASE_TOOLS_PATH%\Source\Python;%PYTHONPATH%
  goto print_python_info

:print_python_info
  echo           PATH      = %PATH%
  echo.
  if defined WORKSPACE (
    echo      WORKSPACE      = %WORKSPACE%
  )
  if defined PACKAGES_PATH (
    echo  PACKAGES_PATH      = %PACKAGES_PATH%
  )
  echo EDK_TOOLS_PATH      = %EDK_TOOLS_PATH%
  if defined BASE_TOOLS_PATH (
    echo BASE_TOOLS_PATH     = %BASE_TOOLS_PATH%
  )
  if defined EDK_TOOLS_BIN (
    echo  EDK_TOOLS_BIN      = %EDK_TOOLS_BIN%
  )
  echo      CONF_PATH      = %CONF_PATH%
  echo      PYTHON_COMMAND = %PYTHON_COMMAND%
  echo          PYTHONPATH = %PYTHONPATH%
  echo.

:CompilerAvailable
  if not defined BASETOOLS_MINGW_BUILD (
    if not defined CLANG_HOST_BIN (
      set CLANG_HOST_BIN=n
    )
    if not defined CLANG_BIN (
        @echo.
        @echo !!! WARNING !!! CLANG_BIN environment variable is not set
        @if exist "C:\Program Files\LLVM\bin\clang.exe" (
            @set "CLANG_BIN=C:\Program Files\LLVM\bin\"
            @echo   Found LLVM, setting CLANG_BIN environment variable to C:\Program Files\LLVM\bin\
        )
    )
  ) else (
    if %BASETOOLS_MINGW_PATH:~-1% EQU \ (
      if exist "%BASETOOLS_MINGW_PATH%bin\clang.exe" (
        if not defined CLANG_BIN (
          set "CLANG_BIN=%BASETOOLS_MINGW_PATH%bin\"
        )
      )
    ) else (
      if exist "%BASETOOLS_MINGW_PATH%\bin\clang.exe" (
        if not defined CLANG_BIN (
          set "CLANG_BIN=%BASETOOLS_MINGW_PATH%\bin\"
        )
      )
    )
    if not defined CLANG_HOST_BIN (
      set CLANG_HOST_BIN=mingw32-
    )
  )
  if not defined FORCE_REBUILD (
    if not defined REBUILD (
      goto end
    )
  )

  if not defined BASETOOLS_MINGW_BUILD (
    if not defined VCINSTALLDIR (
      @echo.
      @echo !!! ERROR !!!! Cannot find Visual Studio, required to build C tools !!!
      @echo.
      goto end
    )
  ) else (
    REM If the Mingw-w64 environment is Clang based,
    REM set CC & CXX to use Clang instead of GCC
    if %BASETOOLS_MINGW_PATH:~-1% EQU \ (
      if exist "%BASETOOLS_MINGW_PATH%bin\clang.exe" (
        set CC=clang
        set CXX=clang++
      )
    ) else (
      if exist "%BASETOOLS_MINGW_PATH%\bin\clang.exe" (
        set CC=clang
        set CXX=clang++
      )
    )
  )
  if not defined FORCE_REBUILD goto IncrementalBuild

:CleanAndBuild
  if defined BASETOOLS_MINGW_BUILD (
    pushd .
    cd %BASE_TOOLS_PATH%\Source\C
    call mingw32-make clean
    popd
  ) else (
    pushd .
    cd %BASE_TOOLS_PATH%
    call nmake cleanall
    del /f /q %BASE_TOOLS_PATH%\Bin\Win32\*.*
    popd
  )
  @REM Let CleanAndBuild fall through to IncrementalBuild


:IncrementalBuild
  if defined BASETOOLS_MINGW_BUILD (
    pushd .
    cd %BASE_TOOLS_PATH%\Source\C
    call mingw32-make
    popd
  ) else (
    pushd .
    cd %BASE_TOOLS_PATH%
    call nmake c
    popd
  )
  goto end


:no_source_files
  echo.
  echo !!! ERROR !!! Cannot build BaseTools applications - no source directory located !!!
  echo.
  goto end

:Usage
  @echo.
  @echo  Usage: "%0 [-h | -help | --help | /h | /help | /?] [ Rebuild | ForceRebuild ] [Reconfig] [Mingw-w64] [base_tools_path [edk_tools_path]] [VS2026] [VS2022] [VS2019]"
  @echo.
  @echo         base_tools_path   BaseTools project path, BASE_TOOLS_PATH will be set to this path.
  @echo         edk_tools_path    EDK_TOOLS_PATH will be set to this path.
  @echo         Rebuild           If sources are available perform an Incremental build, only
  @echo                           build those updated tools.
  @echo         ForceRebuild      If sources are available, rebuild all tools regardless of
  @echo                           whether they have been updated or not.
  @echo         Reconfig          Reinstall target.txt, tools_def.txt and build_rule.txt.
  @echo         Mingw-w64         Build BaseTools binaries using mingw-w64.
  @echo         VS2019            Set the env for VS2019 build.
  @echo         VS2022            Set the env for VS2022 build.
  @echo         VS2026            Set the env for VS2026 build.
  @echo.

:end
set REBUILD=
set FORCE_REBUILD=
set RECONFIG=
set VS2026=
set VS2022=
set VS2019=
set VSTool=
set PYTHON_VER_MAJOR=
set PYTHON_VER_MINOR=
popd
