Adds support for building the C language BaseTools for Windows using toolchains based on mingw-w64. Mingw-w64 is a collection of header files, libraries, and tools that when combined with a compiler enable development of Windows software. Mingw-w64 is a fork of the original MinGW (Minimalist GNU for Windows). Most active development on MinGW has ceased and mingw-w64 is now the actively maintained successor. Mingw-w64 provides a libc implementation built on top of Microsoft's UCRT (Universal C Runtime) with all nessesary compiler bindings needed to support the C++11 feature set. Modern mingw-w64 development appears to have coalesced around MSYS2, which produces a distributions of both GCC and LLVM/Clang that use mingw-w64 to target the Windows OS. This MSYS2 Clang distribution has a UNIX-like directory layout and includes Windows binaries of GNU Make. Combined with the open source licensing, MSYS2's Clang distribution is a highly attractive choice as an alternative Windows SDK for open source projects such as TianoCore. If one wishes to use EDK II to build UEFI firmware on the Windows platform, then the C BaseTools need to be compiled as Windows applications. This includes the PcdValueInit.exe program, which needs to be recompiled every time a firmware build is run in order to regenerate the initial values for structured PCDs. Currently, BaseTools only supports the Visual C++ toolchain on the Windows platform. The following new features have been added to enable usage of the toolchains derived from mingw-w64: - Fixes to the BaseTools C source code to support the use of a GCC-style compiler on the Windows OS. - The GNU Make-style Makefiles for the C BaseTools have been modified to support Windows. Both GCC + mingw-w64 and Clang + mingw-w64 have been tested and confirmed to build a working BaseTools. - BaseTools now supports generating GNU Make-style Makefiles on the Windows platform for the purpose of building firmware. - edksetup.bat has been modified to optionally build BaseTools via mingw-w64. There is no impact to the existing support for Visual C++ and Visual C++ remains the default toolchain. Usage Instructions: For the vast majority of users, the only system setup change nessesary to use a mingw-w64 toolchain is to set the BASETOOLS_MINGW_PATH to the directory containing the desired mingw-w64 based toolchain. A new command line argument has been added to edksetup.bat: Mingw-w64 If this command line argument is set, then the script will set the BASETOOLS_MINGW_BUILD environment variable. The user can also opt to set this environment variable manually before running edksetup.bat If BASETOOLS_MINGW_BUILD is defined, then the BASETOOLS_MINGW_PATH environment variable must point to the directory containing the mingw-w64 toolchain. If CLANG_BIN is not defined and %BASETOOLS_MINGW_PATH%\bin\clang.exe exists, then edksetup.bat will set CLANG_BIN=%BASETOOLS_MINGW_PATH%\bin\ This removes the requirement to configure the CLANG_BIN environment variable manually in order to run a CLANGPDB or CLANGDWARF build if one has the MSYS2 Clang distribution installed. If one wishes to use a different copy of Clang (for example official LLVM binaries) to build firmware and only use the MSYS2 Clang to build BaseTools, then one can continue to set the CLANG_BIN environment variable, same as before. I have tested the MSYS2 Clang distribution against the official LLVM distribution and can confirm that if the compiler version is the same the emitted machine code is identical between the two. Interestingly, the MSYS2 Clang distribution emits the path to the PDB file using "/" as the path seperator instead of "\". That appears to be the only difference in output. Therefore, using the MSYS2 Clang distribution to compile firmware seems a reasonable choice. If CLANG_HOST_BIN is not defined and BASETOOLS_MINGW_BUILD is defined and %BASETOOLS_MINGW_PATH%\bin\mingw32-make.exe exists, then edksetup.bat will add %BASETOOLS_MINGW_PATH%\bin\ to the PATH and set CLANG_HOST_BIN=mingw32- This enable usage of the GNU Make included in the mingw-w64 toolchain to build firmware in addition to BaseTools. if BASETOOLS_MINGW_BUILD is not defined, edksetup.bat will continue to set CLANG_HOST_BIN=n, which uses nmake to build firmware. This behavior can be overridden by manually setting the value of CLANG_HOST_BIN before executing edksetup.bat if one wishes to use a specific Make utility for the CLANGPDB/CLANGDWARF toolchains. References: - https://www.mingw-w64.org/ - https://www.msys2.org/ Co-authored-by: Sandesh Jain <sandesh.jain@intel.com> Signed-off-by: Nate DeSimone <nathaniel.l.desimone@intel.com>
602 lines
17 KiB
Batchfile
Executable File
602 lines
17 KiB
Batchfile
Executable File
@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"=="VS2022" (
|
|
shift
|
|
set VS2022=TRUE
|
|
set VSTool=VS2022
|
|
goto loop
|
|
)
|
|
if /I "%1"=="VS2019" (
|
|
shift
|
|
set VS2019=TRUE
|
|
set VSTool=VS2019
|
|
goto loop
|
|
)
|
|
if /I "%1"=="VS2017" (
|
|
shift
|
|
set VS2017=TRUE
|
|
set VSTool=VS2017
|
|
goto loop
|
|
)
|
|
if /I "%1"=="VS2015" (
|
|
shift
|
|
set VS2015=TRUE
|
|
set VSTool=VS2015
|
|
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 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 defined VS2017 (
|
|
call %EDK_TOOLS_PATH%\set_vsprefix_envs.bat VS2017
|
|
) else if defined VS2015 (
|
|
call %EDK_TOOLS_PATH%\set_vsprefix_envs.bat VS2015
|
|
call %EDK_TOOLS_PATH%\get_vsvars.bat VS2015
|
|
) else if not defined BASETOOLS_MINGW_BUILD (
|
|
call %EDK_TOOLS_PATH%\set_vsprefix_envs.bat
|
|
call %EDK_TOOLS_PATH%\get_vsvars.bat
|
|
)
|
|
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]] [VS2022] [VS2019] [VS2017] [VS2015]"
|
|
@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 VS2015 Set the env for VS2015 build.
|
|
@echo VS2017 Set the env for VS2017 build.
|
|
@echo VS2019 Set the env for VS2019 build.
|
|
@echo VS2022 Set the env for VS2022 build.
|
|
@echo.
|
|
|
|
:end
|
|
set REBUILD=
|
|
set FORCE_REBUILD=
|
|
set RECONFIG=
|
|
set VS2022=
|
|
set VS2019=
|
|
set VS2017=
|
|
set VS2015=
|
|
set VSTool=
|
|
set PYTHON_VER_MAJOR=
|
|
set PYTHON_VER_MINOR=
|
|
popd
|