blob: 19e32c4731dae86d1df936cd2eafa1e7b78736a9 [file] [log] [blame] [edit]
@echo off
if "%1"=="/?" goto :showhelp
if "%1"=="-?" goto :showhelp
if "%1"=="-h" goto :showhelp
if "%1"=="-help" goto :showhelp
if "%1"=="--help" goto :showhelp
setlocal
if "%HLSL_SRC_DIR%"=="" (
echo Missing source directory.
if exist %~dp0..\..\LLVMBuild.txt (
set HLSL_SRC_DIR=%~dp0..\..
echo Source directory deduced to be %~dp0..\..
) else (
exit /b 1
)
)
if "%BUILD_ARCH%"=="" (
set BUILD_ARCH=Win32
)
set BUILD_GENERATOR=Visual Studio 17 2022
set BUILD_VS_VER=2022
set BUILD_CONFIG=Debug
set DO_SETUP=1
set DO_BUILD=1
set CMAKE_OPTS=
set CMAKE_PATH=
set SPEAK=0
set PARALLEL_OPT=/m
set ALL_DEFS=OFF
set ANALYZE=OFF
set OFFICIAL=OFF
set FIXED_VER=OFF
set FIXED_LOC=
set VENDOR=
set SPIRV=OFF
set SPV_TEST=OFF
set DXILCONV=ON
set DXC_CMAKE_SYSTEM_VERSION=
set SHOW_CMAKE_LOG=0
set WINSDK_MIN_VERSION=10.0.17763.0
set INSTALL_DIR=
set DEFAULT_EXEC_ADAPTER=-DTAEF_EXEC_ADAPTER=
set LIT_ARGS=
:parse_args
if "%1"=="" (
goto :done_parsing_args
)
if "%1"=="-buildoutdir" (
echo Build output directory set to %~2
set "HLSL_BLD_DIR=%~2"
shift /1
shift /1 & goto :parse_args
)
if "%1"=="-s" (
set DO_BUILD=0
shift /1 & goto :parse_args
)
if "%1"=="-b" (
set DO_SETUP=0
shift /1 & goto :parse_args
)
if "%1"=="-alldef" (
set ALL_DEFS=ON
shift /1 & goto :parse_args
)
if "%1"=="-analyze" (
set ANALYZE=ON
shift /1 & goto :parse_args
)
if "%1"=="-official" (
echo Will generate official version for build
set OFFICIAL=ON
shift /1 & goto :parse_args
)
if "%1"=="-fv" (
echo Fixed version flag set for build.
set FIXED_VER=ON
shift /1 & goto :parse_args
)
if "%1"=="-fvloc" (
echo Fixed version flag set for build, version file location: %~2
set FIXED_VER=ON
set "FIXED_LOC=%~2"
shift /1
shift /1 & goto :parse_args
)
if "%1"=="-cv" (
echo Set the CLANG_VENDOR value.
set "VENDOR=%~2"
shift /1
shift /1 & goto :parse_args
)
if "%1"=="-rel" (
set BUILD_CONFIG=Release
shift /1 & goto :parse_args
)
if "%1"=="-x86" (
set BUILD_ARCH=Win32
shift /1 & goto :parse_args
)
if "%1"=="-x64" (
set BUILD_ARCH=x64
shift /1 & goto :parse_args
)
if /i "%1"=="-arm" (
set BUILD_ARCH=ARM
shift /1 & goto :parse_args
)
if /i "%1"=="-arm64" (
set BUILD_ARCH=ARM64
shift /1 & goto :parse_args
)
if /i "%1"=="-arm64ec" (
set BUILD_ARCH=ARM64EC
shift /1 & goto :parse_args
)
if /i "%1"=="-Debug" (
set BUILD_CONFIG=Debug
shift /1 & goto :parse_args
)
if /i "%1"=="-Release" (
set BUILD_CONFIG=Release
shift /1 & goto :parse_args
)
if "%1"=="-vs2019" (
set BUILD_GENERATOR=Visual Studio 16 2019
set BUILD_VS_VER=2019
shift /1 & goto :parse_args
)
if "%1"=="-vs2022" (
shift /1 & goto :parse_args
)
if "%1"=="-tblgen" (
if "%~2" == "" (
echo Missing path argument after -tblgen.
exit /b
)
set "BUILD_TBLGEN_PATH=%~2"
shift /1
shift /1 & goto :parse_args
)
if "%1"=="-dont-speak" (
shift /1 & goto :parse_args
)
if "%1"=="-speak-up" (
set SPEAK=1
shift /1 & goto :parse_args
)
if "%1"=="-no-parallel" (
set PARALLEL_OPT=
shift /1 & goto :parse_args
)
if "%1"=="-no-dxilconv" (
set DXILCONV=OFF
shift /1 & goto :parse_args
)
if "%1"=="-dxc-cmake-extra-args" (
set CMAKE_OPTS=%CMAKE_OPTS% %~2
shift /1
shift /1 & goto :parse_args
)
if "%1"=="-dxc-cmake-begins-include" (
set "CMAKE_OPTS=%CMAKE_OPTS% -DDXC_CMAKE_BEGINS_INCLUDE=%~2"
shift /1
shift /1 & goto :parse_args
)
if "%1"=="-dxc-cmake-ends-include" (
set "CMAKE_OPTS=%CMAKE_OPTS% -DDXC_CMAKE_ENDS_INCLUDE=%~2"
shift /1
shift /1 & goto :parse_args
)
if "%1"=="-dxc-cmake" (
set "CMAKE_PATH=%~2"
shift /1
shift /1 & goto :parse_args
)
if "%1"=="-dxc-cmake-system-version" (
set DXC_CMAKE_SYSTEM_VERSION=%~2
shift /1
shift /1 & goto :parse_args
)
if "%1"=="-show-cmake-log" (
set SHOW_CMAKE_LOG=1
shift /1 & goto :parse_args
)
if "%1"=="-lit-xml-output-path" (
set "LIT_ARGS=%LIT_ARGS% --xunit-xml-output=%~2"
shift /1
shift /1 & goto :parse_args
)
if "%1"=="-lit-verbose" (
set "LIT_ARGS=%LIT_ARGS% -v --no-progress-bar"
shift /1 & goto :parse_args
)
if "%1"=="-default-adapter" (
set DEFAULT_EXEC_ADAPTER=-DTAEF_EXEC_ADAPTER=%~2
shift /1
shift /1 & goto :parse_args
)
if "%1"=="-sanitizer" (
set CMAKE_OPTS=%CMAKE_OPTS% -DLLVM_USE_SANITIZER:STRING=Address
shift /1 & goto :parse_args
)
rem Begin SPIRV change
if "%1"=="-spirv" (
echo SPIR-V codegen is enabled.
set SPIRV=ON
shift /1 & goto :parse_args
)
if "%1"=="-spirvtest" (
echo Building SPIR-V tests is enabled.
set SPV_TEST=ON
shift /1 & goto :parse_args
)
rem End SPIRV change
if "%1"=="-ninja" (
set BUILD_GENERATOR=Ninja
set PARALLEL_OPT=
shift /1 & goto :parse_args
)
if "%1"=="-clang" (
set CMAKE_OPTS=%CMAKE_OPTS% -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl
shift /1 & goto :parse_args
)
if "%1"=="-clang-cl" (
set CMAKE_OPTS=%CMAKE_OPTS% -T ClangCL
shift /1 & goto :parse_args
)
if "%1"=="-update-generated-sources" (
set CMAKE_OPTS=%CMAKE_OPTS% -DHLSL_COPY_GENERATED_SOURCES=1
shift /1 & goto :parse_args
)
if "%1"=="-lto" (
set CMAKE_OPTS=%CMAKE_OPTS% -DLLVM_ENABLE_LTO=On
shift /1 & goto :parse_args
)
if "%1"=="-installdir" (
echo Build install directory set to %~2
set "INSTALL_DIR=%~2"
shift /1
shift /1 & goto :parse_args
)
if "%1" NEQ "" (
echo Unrecognized argument: %1
exit /b 1
)
:done_parsing_args
if "%HLSL_BLD_DIR%"=="" (
echo Missing build directory.
exit /b 1
)
if "%INSTALL_DIR%"=="" (
set "INSTALL_DIR=%HLSL_BLD_DIR%\install"
)
if "%CMAKE_PATH%"=="" (
where cmake.exe 1>nul 2>nul
if errorlevel 1 (
echo Unable to find cmake.exe on the path.
echo cmake 3.4 is available from https://cmake.org/files/v3.4/cmake-3.4.0-win32-x86.exe
exit /b 1
)
set CMAKE_PATH=cmake
)
rem Get SDK version from VSDevCmd, strip the backslash at the end
set ENV_SDK_VERSION=%WindowsSDKVersion%
if "%ENV_SDK_VERSION:~-1%"=="\" (
set "ENV_SDK_VERSION=%ENV_SDK_VERSION:~0,-1%"
)
set BUILD_ARM_CROSSCOMPILING=0
if /i "%BUILD_ARCH%"=="Win32" (
set VS_ARCH=-AWin32
)
if /i "%BUILD_ARCH%"=="x64" (
set VS_ARCH=-Ax64
)
if /i "%BUILD_ARCH%"=="arm" (
set BUILD_GENERATOR_PLATFORM=ARM
set BUILD_ARM_CROSSCOMPILING=1
set VS_ARCH=-AARM
)
if /i "%BUILD_ARCH%"=="arm64" (
set BUILD_GENERATOR_PLATFORM=ARM64
set BUILD_ARM_CROSSCOMPILING=1
set VS_ARCH=-AARM64
)
if /i "%BUILD_ARCH%"=="arm64ec" (
set BUILD_GENERATOR_PLATFORM=ARM64EC
set BUILD_ARM_CROSSCOMPILING=1
set VS_ARCH=-AARM64EC
set WINSDK_MIN_VERSION=10.0.21330.0
set CMAKE_OPTS=%CMAKE_OPTS% -DMSVC_BUILD_AS_X=1
)
if "%DXC_CMAKE_SYSTEM_VERSION%"=="" (
if "%ENV_SDK_VERSION%"=="" (
set DXC_CMAKE_SYSTEM_VERSION=%WINSDK_MIN_VERSION%
) else (
set DXC_CMAKE_SYSTEM_VERSION=%ENV_SDK_VERSION%
)
)
set CMAKE_OPTS=%CMAKE_OPTS% -DHLSL_OPTIONAL_PROJS_IN_DEFAULT:BOOL=%ALL_DEFS%
set CMAKE_OPTS=%CMAKE_OPTS% -DHLSL_ENABLE_ANALYZE:BOOL=%ANALYZE%
set CMAKE_OPTS=%CMAKE_OPTS% -DHLSL_OFFICIAL_BUILD:BOOL=%OFFICIAL%
set CMAKE_OPTS=%CMAKE_OPTS% -DHLSL_ENABLE_FIXED_VER:BOOL=%FIXED_VER%
set CMAKE_OPTS=%CMAKE_OPTS% -DHLSL_ENABLE_FIXED_VER:BOOL=%FIXED_VER% -DHLSL_FIXED_VERSION_LOCATION:STRING=%FIXED_LOC%
set CMAKE_OPTS=%CMAKE_OPTS% -DHLSL_BUILD_DXILCONV:BOOL=%DXILCONV%
set CMAKE_OPTS=%CMAKE_OPTS% -DCLANG_VENDOR:STRING=%VENDOR%
set CMAKE_OPTS=%CMAKE_OPTS% -DENABLE_SPIRV_CODEGEN:BOOL=%SPIRV%
set CMAKE_OPTS=%CMAKE_OPTS% -DSPIRV_BUILD_TESTS:BOOL=%SPV_TEST%
set CMAKE_OPTS=%CMAKE_OPTS% -DCLANG_ENABLE_ARCMT:BOOL=OFF
set CMAKE_OPTS=%CMAKE_OPTS% -DCLANG_ENABLE_STATIC_ANALYZER:BOOL=OFF
set CMAKE_OPTS=%CMAKE_OPTS% -DHLSL_INCLUDE_TESTS:BOOL=ON
set CMAKE_OPTS=%CMAKE_OPTS% -DLLVM_TARGETS_TO_BUILD:STRING=None
set CMAKE_OPTS=%CMAKE_OPTS% -DLLVM_INCLUDE_DOCS:BOOL=OFF -DLLVM_INCLUDE_EXAMPLES:BOOL=OFF
set CMAKE_OPTS=%CMAKE_OPTS% -DLIBCLANG_BUILD_STATIC:BOOL=ON
rem set CMAKE_OPTS=%CMAKE_OPTS% -DLLVM_OPTIMIZED_TABLEGEN:BOOL=ON
set CMAKE_OPTS=%CMAKE_OPTS% -DLLVM_OPTIMIZED_TABLEGEN:BOOL=OFF
set CMAKE_OPTS=%CMAKE_OPTS% -DLLVM_APPEND_VC_REV:BOOL=ON
rem Enable exception handling (which requires RTTI).
set CMAKE_OPTS=%CMAKE_OPTS% -DLLVM_ENABLE_RTTI:BOOL=ON
set CMAKE_OPTS=%CMAKE_OPTS% -DLLVM_ENABLE_EH:BOOL=ON
rem Setup a specific, stable triple for HLSL.
set CMAKE_OPTS=%CMAKE_OPTS% -DLLVM_DEFAULT_TARGET_TRIPLE:STRING=dxil-ms-dx
set CMAKE_OPTS=%CMAKE_OPTS% -DCLANG_BUILD_EXAMPLES:BOOL=OFF
set CMAKE_OPTS=%CMAKE_OPTS% -DCLANG_CL:BOOL=OFF
set CMAKE_OPTS=%CMAKE_OPTS% -DCMAKE_SYSTEM_VERSION=%DXC_CMAKE_SYSTEM_VERSION%
set CMAKE_OPTS=%CMAKE_OPTS% -DCMAKE_INSTALL_PREFIX=%INSTALL_DIR%
if "%LIT_ARGS%" NEQ "" (
set CMAKE_OPTS=%CMAKE_OPTS% -DLLVM_LIT_ARGS="%LIT_ARGS%"
)
rem Setup taef exec adapter.
set CMAKE_OPTS=%CMAKE_OPTS% %DEFAULT_EXEC_ADAPTER%
rem ARM cross-compile setup
if %BUILD_ARM_CROSSCOMPILING% == 0 goto :after-cross-compile
rem The ARM build needs to have access to x86 or x64 build of clang-tblgen and llvm-tblgen tools.
call :verify-tblgen %BUILD_TBLGEN_PATH%
if errorlevel 1 (
echo Cannot find x86/x64 version clang-tblgen and llvm-tblgen tools.
echo Please set BUILD_TBLGEN_PATH or use hctbuild -tblgen option to specify location of x86/x64 build of DXC.
call :handlefail
exit /b 1
)
echo TableGen path: %BUILD_TBLGEN_PATH%
set CMAKE_OPTS=%CMAKE_OPTS% -DCMAKE_CROSSCOMPILING=True
set CMAKE_OPTS=%CMAKE_OPTS% -DCMAKE_GENERATOR_PLATFORM=%BUILD_GENERATOR_PLATFORM%
set CMAKE_OPTS=%CMAKE_OPTS% -DLLVM_TABLEGEN=%BUILD_TBLGEN_PATH%\llvm-tblgen.exe
set CMAKE_OPTS=%CMAKE_OPTS% -DCLANG_TABLEGEN=%BUILD_TBLGEN_PATH%\clang-tblgen.exe
echo Cross-compiling enabled.
:after-cross-compile
rem This parameter is used with vcvarsall to force use of 64-bit build tools
rem instead of 32-bit tools that run out of memory.
if /i "%BUILD_ARCH%"=="Win32" (
set BUILD_TOOLS=amd64_x86
) else if /i "%BUILD_ARCH%"=="x64" (
set BUILD_TOOLS=amd64
) else if /i "%BUILD_ARCH%"=="ARM" (
set BUILD_TOOLS=amd64_arm
) else if /i "%BUILD_ARCH%"=="ARM64" (
set BUILD_TOOLS=amd64_arm64
)
call :configandbuild %BUILD_CONFIG% %BUILD_ARCH% %HLSL_BLD_DIR% "%BUILD_GENERATOR%" "%VS_ARCH%"
if errorlevel 1 exit /b 1
if "%BUILD_GENERATOR%"=="Ninja" (
echo Success - files are available at %HLSL_BLD_DIR%\bin
) else (
echo Success - files are available at %HLSL_BLD_DIR%\%BUILD_CONFIG%\bin
)
call :handlesuccess
exit /b 0
:showhelp
echo Builds HLSL solutions and the product and test binaries for the current
echo flavor and architecture.
echo.
echo hctbuild [-s or -b] [-alldef] [-analyze] [-official] [-fv] [-fvloc ^<path^>] [-rel] [-arm or -arm64 or -x86 or -x64] [-Release] [-Debug] [-vs2019] [-ninja] [-tblgen path] [-speak-up] [-no-parallel] [-no-dxilconv] [-update-generated-sources]
echo.
echo -s creates the projects only, without building
echo -b builds the existing project
echo.
echo -alldef adds optional projects to the default build
echo -analyze adds /analyze option
echo -official will generate official version for build
echo -fv fixes the resource version for release (utils\version\version.inc)
echo -fvloc ^<path^> directory with the version.inc file
echo -rel builds release rather than debug
echo -spirv enable SPIR-V codegen
echo -spirvtest enable building SPIR-V tests
echo -speak-up enables audible build confirmation
echo -no-parallel disables parallel build
echo -no-dxilconv disables build of DXBC to DXIL converter and tools
echo -vs2019 uses Visual Studio 2019 to build
echo -vs2022 uses Visual Studio 2022 to build
echo.
echo -update-generated-sources Updates generated sources in the source tree
echo.
echo current BUILD_ARCH=%BUILD_ARCH%. Override with:
echo -x86 targets an x86 build (aka. Win32)
echo -x64 targets an x64 build (aka. Win64)
echo -arm targets an ARM build
echo -arm64 targets an ARM64 build
echo.
echo Generator:
echo -ninja use Ninja as the generator
echo.
echo AppVeyor Support
echo -Release builds release
echo -Debug builds debug
echo.
echo ARM build support
echo -tblgen sets path to x86 or x64 versions of clang-tblgen and llvm-tblgen tools
echo.
if not "%HLSL_BLD_DIR%"=="" (
echo The solution file is at %HLSL_BLD_DIR%\LLVM.sln
echo.
)
goto :eof
:configandbuild
rem Configure and build a specific configuration, typically Debug or Release.
rem %1 - the conf name
rem %2 - the platform name
rem %3 - the build directory
rem %4 - the generator name
rem %5 - the vs2019 architecture name
if not exist %3 (
mkdir %3
if errorlevel 1 (
echo Unable to create %3
call :handlefail
exit /b 1
)
)
cd /d %3
if "%DO_SETUP%"=="1" (
echo Creating solution files for %2, logging to %3\cmake-log.txt
if "%BUILD_GENERATOR%"=="Ninja" (
echo Running "%CMAKE_PATH%" -DCMAKE_BUILD_TYPE:STRING=%1 %CMAKE_OPTS% -G %4 %HLSL_SRC_DIR% > %3\cmake-log.txt
"%CMAKE_PATH%" -DCMAKE_BUILD_TYPE:STRING=%1 %CMAKE_OPTS% -G %4 %HLSL_SRC_DIR% >> %3\cmake-log.txt 2>&1
) else (
rem BUILD_TYPE is mostly ignored in this path as VS generates multiple targets
rem it is still needed to satisfy cmake file expectations
echo Running "%CMAKE_PATH%" -DCMAKE_BUILD_TYPE:STRING=%1 %CMAKE_OPTS% -G %4 %5 %HLSL_SRC_DIR% > %3\cmake-log.txt
"%CMAKE_PATH%" -DCMAKE_BUILD_TYPE:STRING=%1 %CMAKE_OPTS% -G %4 %5 %HLSL_SRC_DIR% >> %3\cmake-log.txt 2>&1
)
if %SHOW_CMAKE_LOG%==1 (
echo ------- Start of %3\cmake-log.txt -------
type %3\cmake-log.txt
echo -------- End of %3\cmake-log.txt --------
)
if errorlevel 1 (
echo Failed to configure cmake projects.
echo ===== begin cmake-log.txt =====
type %3\cmake-log.txt
echo ===== end cmake-log.txt =====
echo Run 'cmake %HLSL_SRC_DIR%' in %3 will continue project generation after fixing the issue.
cmake --version | findstr 3.4
if errorlevel 1 (
echo CMake 3.4 is the currently supported version - your installed cmake may be out of date.
echo See README.md at the root for an explanation of dependencies.
)
findstr -c:"Could NOT find D3D12" %3\cmake-log.txt >NUL
if errorlevel 1 (
rem D3D12 has been found, nothing to diagnose here.
) else (
echo D3D12 has not been found. Confirm that you have installed the Windows 10 SDK.
echo See README.md at the root for an explanation of dependencies.
echo Run hctclean after installing the SDK to completely rebuild the projects.
)
call :handlefail
exit /b 1
)
)
if "%DO_BUILD%" neq "1" (
exit /b 0
)
rem Just defer to cmake for now.
cmake --build . --config %1 -- %PARALLEL_OPT%
goto :donebuild
:donebuild
if errorlevel 1 (
echo Failed to build projects.
echo After fixing, run 'cmake --build --config %1 .' in %2
call :handlefail
exit /b 1
)
endlocal
exit /b 0
:verify-tblgen
if exist %1\clang-tblgen.exe (
if exist %1\llvm-tblgen.exe exit /b 0
)
exit /b 1
:handlefail
if %SPEAK%==1 (
cscript.exe //Nologo %HLSL_SRC_DIR%\utils\hct\hctspeak.js /say:"build failed"
)
exit /b 0
:handlesuccess
if %SPEAK%==1 (
cscript.exe //Nologo %HLSL_SRC_DIR%\utils\hct\hctspeak.js /say:"build succeeded"
)
exit /b 0