@echo off
REM This batch file does an out-of-source CMake build in ../build_windows
REM This is for users who like to configure & build Blender with a single command.
setlocal EnableDelayedExpansion
setlocal ENABLEEXTENSIONS
set BLENDER_DIR=%~dp0
set BLENDER_DIR_NOSPACES=%BLENDER_DIR: =%
if not "%BLENDER_DIR%"=="%BLENDER_DIR_NOSPACES%" (
	echo There are spaces detected in the build path "%BLENDER_DIR%", this is currently not supported, exiting....
	goto EOF
)
set BUILD_DIR=%BLENDER_DIR%..\build_windows
set BUILD_TYPE=Release
rem reset all variables so they do not get accidentally get carried over from previous builds
set BUILD_DIR_OVERRRIDE=
set BUILD_CMAKE_ARGS=
set BUILD_ARCH=
set BUILD_VS_VER=
set BUILD_VS_YEAR=
set BUILD_NGE=
set KEY_NAME=
set MSBUILD_PLATFORM=
set MUST_CLEAN=
set NOBUILD=
set TARGET=
set WINDOWS_ARCH=
set TESTS_CMAKE_ARGS=
:argv_loop
if NOT "%1" == "" (

	REM Help Message
	if "%1" == "help" (
		goto HELP
	)

	REM Build Types
	if "%1" == "debug" (
		set BUILD_TYPE=Debug
	REM Build Configurations
	) else if "%1" == "noge" (
		set BUILD_CMAKE_ARGS=%BUILD_CMAKE_ARGS% -DWITH_GAMEENGINE=OFF -DWITH_PLAYER=OFF
		set BUILD_NGE=_noge
	) else if "%1" == "builddir" (
		set BUILD_DIR_OVERRRIDE="%BLENDER_DIR%..\%2"
		shift /1
	) else if "%1" == "with_tests" (
		set TESTS_CMAKE_ARGS=-DWITH_GTESTS=On
	) else if "%1" == "full" (
		set TARGET=Full
		set BUILD_CMAKE_ARGS=%BUILD_CMAKE_ARGS% ^
		    -C"%BLENDER_DIR%\build_files\cmake\config\blender_full.cmake"
	) else if "%1" == "lite" (
		set TARGET=Lite
		set BUILD_CMAKE_ARGS=%BUILD_CMAKE_ARGS% ^
		    -C"%BLENDER_DIR%\build_files\cmake\config\blender_lite.cmake"
	) else if "%1" == "cycles" (
		set TARGET=Cycles
		set BUILD_CMAKE_ARGS=%BUILD_CMAKE_ARGS% ^
		    -C"%BLENDER_DIR%\build_files\cmake\config\cycles_standalone.cmake"
	) else if "%1" == "headless" (
		set TARGET=Headless
		set BUILD_CMAKE_ARGS=%BUILD_CMAKE_ARGS% ^
		    -C"%BLENDER_DIR%\build_files\cmake\config\blender_headless.cmake"
	) else if "%1" == "bpy" (
		set TARGET=Bpy
		set BUILD_CMAKE_ARGS=%BUILD_CMAKE_ARGS% ^
		    -C"%BLENDER_DIR%\build_files\cmake\config\bpy_module.cmake"
	) else if "%1" == "release" (
		set TARGET=Release
	)	else if "%1" == "x86" (
		set BUILD_ARCH=x86
	)	else if "%1" == "x64" (
		set BUILD_ARCH=x64
	)	else if "%1" == "2017" (
	set BUILD_VS_VER=15
	set BUILD_VS_YEAR=2017
	)	else if "%1" == "2015" (
	set BUILD_VS_VER=14
	set BUILD_VS_YEAR=2015
	)	else if "%1" == "2013" (
	set BUILD_VS_VER=12
	set BUILD_VS_YEAR=2013
	)	else if "%1" == "packagename" (
	set BUILD_CMAKE_ARGS=%BUILD_CMAKE_ARGS% -DCPACK_OVERRIDE_PACKAGENAME="%2"
	shift /1
	)	else if "%1" == "nobuild" (
	set NOBUILD=1
	)	else if "%1" == "showhash" (
		for /f "delims=" %%i in ('git rev-parse HEAD') do echo Branch_hash=%%i
		cd release/datafiles/locale
		for /f "delims=" %%i in ('git rev-parse HEAD') do echo Locale_hash=%%i
		cd %~dp0
		cd release/scripts/addons
		for /f "delims=" %%i in ('git rev-parse HEAD') do echo Addons_Hash=%%i
		cd %~dp0
		goto EOF
	REM Non-Build Commands
	) else if "%1" == "update" (
		svn up ../lib/*
		git pull --rebase
		git submodule foreach git pull --rebase origin master
		goto EOF
	) else if "%1" == "clean" (
		set MUST_CLEAN=1
	) else (
		echo Command "%1" unknown, aborting!
		goto EOF
	)

	shift /1
	goto argv_loop
)
if "%BUILD_ARCH%"=="" (
	if "%PROCESSOR_ARCHITECTURE%" == "AMD64" (
		set WINDOWS_ARCH= Win64
		set BUILD_ARCH=x64
	) else if "%PROCESSOR_ARCHITEW6432%" == "AMD64" (
		set WINDOWS_ARCH= Win64
		set BUILD_ARCH=x64
	) else (
		set WINDOWS_ARCH=
		set BUILD_ARCH=x86
	)
) else if "%BUILD_ARCH%"=="x64" (
		set WINDOWS_ARCH= Win64
	) else if "%BUILD_ARCH%"=="x86" (
		set WINDOWS_ARCH=
	)

if "%BUILD_VS_VER%"=="" (
	set BUILD_VS_VER=12
	set BUILD_VS_YEAR=2013
)

if "%BUILD_ARCH%"=="x64" (
	set MSBUILD_PLATFORM=x64
	) else if "%BUILD_ARCH%"=="x86" (
		set MSBUILD_PLATFORM=win32
)


if "%target%"=="Release" (
		rem for vc12 check for both cuda 7.5 and 8
		if "%CUDA_PATH%"=="" (
			echo Cuda Not found, aborting!
			goto EOF
		)
		set BUILD_CMAKE_ARGS=%BUILD_CMAKE_ARGS% ^
		-C"%BLENDER_DIR%\build_files\cmake\config\blender_release.cmake"
)

:DetectMSVC
REM Detect MSVC Installation for 2013-2015
if DEFINED VisualStudioVersion goto msvc_detect_finally
set VALUE_NAME=ProductDir
REM Check 64 bits
set KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\%BUILD_VS_VER%.0\Setup\VC"
for /F "usebackq skip=2 tokens=1-2*" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO set MSVC_VC_DIR=%%C
if DEFINED MSVC_VC_DIR goto msvc_detect_finally
REM Check 32 bits
set KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\%BUILD_VS_VER%.0\Setup\VC"
for /F "usebackq skip=2 tokens=1-2*" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO set MSVC_VC_DIR=%%C
if DEFINED MSVC_VC_DIR goto msvc_detect_finally
:msvc_detect_finally
if DEFINED MSVC_VC_DIR call "%MSVC_VC_DIR%\vcvarsall.bat"
if DEFINED MSVC_VC_DIR goto sanity_checks

rem MSVC Build environment 2017 and up.
for /F "usebackq skip=2 tokens=1-2*" %%A IN (`REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SXS\VS7" /v %BUILD_VS_VER%.0 2^>nul`) DO set MSVC_VS_DIR=%%C
if DEFINED MSVC_VS_DIR goto msvc_detect_finally_2017
REM Check 32 bits
for /F "usebackq skip=2 tokens=1-2*" %%A IN (`REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\sxs\vs7" /v %BUILD_VS_VER%.0 2^>nul`) DO set MSVC_VS_DIR=%%C
if DEFINED MSVC_VS_DIR goto msvc_detect_finally_2017
:msvc_detect_finally_2017
if DEFINED MSVC_VS_DIR call "%MSVC_VS_DIR%\Common7\Tools\VsDevCmd.bat"

:sanity_checks
REM Sanity Checks
where /Q msbuild
if %ERRORLEVEL% NEQ 0 (
	if "%BUILD_VS_VER%"=="12" (
		rem vs12 not found, try vs14
		echo Visual Studio 2013 not found, trying Visual Studio 2015.
		set BUILD_VS_VER=14
		set BUILD_VS_YEAR=2015
		goto DetectMSVC
	)	else	(
		echo Error: "MSBuild" command not in the PATH.
		echo You must have MSVC installed and run this from the "Developer Command Prompt"
		echo ^(available from Visual Studio's Start menu entry^), aborting!
		goto EOF
	)
)


set BUILD_DIR=%BUILD_DIR%_%TARGET%%BUILD_NGE%_%BUILD_ARCH%_vc%BUILD_VS_VER%_%BUILD_TYPE%
if NOT "%BUILD_DIR_OVERRRIDE%"=="" (
	set BUILD_DIR=%BUILD_DIR_OVERRRIDE%
)

where /Q cmake
if %ERRORLEVEL% NEQ 0 (
	echo Error: "CMake" command not in the PATH.
	echo You must have CMake installed and added to your PATH, aborting!
	goto EOF
)
if NOT EXIST %BLENDER_DIR%..\lib\nul (
	echo Error: Path to libraries not found "%BLENDER_DIR%..\lib\"
	echo This is needed for building, aborting!
	goto EOF
)
if "%TARGET%"=="" (
	echo Error: Convenience target not set
	echo This is required for building, aborting!
	echo .
	goto HELP
)

set BUILD_CMAKE_ARGS=%BUILD_CMAKE_ARGS% -G "Visual Studio %BUILD_VS_VER% %BUILD_VS_YEAR%%WINDOWS_ARCH%" %TESTS_CMAKE_ARGS%
if NOT EXIST %BUILD_DIR%\nul (
	mkdir %BUILD_DIR%
)
if "%MUST_CLEAN%"=="1" (
		echo Cleaning %BUILD_DIR%
		msbuild ^
			%BUILD_DIR%\Blender.sln ^
			/target:clean ^
			/property:Configuration=%BUILD_TYPE% ^
			/verbosity:minimal ^
			/p:platform=%MSBUILD_PLATFORM%

		if %ERRORLEVEL% NEQ 0 (
			echo Cleaned "%BUILD_DIR%"
		)
		goto EOF
)
REM Only configure on first run or when called with nobuild
if NOT EXIST %BUILD_DIR%\Blender.sln set MUST_CONFIGURE=1
if "%NOBUILD%"=="1" set MUST_CONFIGURE=1

if "%MUST_CONFIGURE%"=="1" (
	cmake ^
		%BUILD_CMAKE_ARGS% ^
		-H%BLENDER_DIR% ^
		-B%BUILD_DIR% ^
		%BUILD_CMAKE_ARGS%

	if %ERRORLEVEL% NEQ 0 (
		echo "Configuration Failed"
		goto EOF
	)
)
if DEFINED MSVC_VC_DIR echo call "%MSVC_VC_DIR%\vcvarsall.bat" > %BUILD_DIR%\rebuild.cmd 
if DEFINED MSVC_VS_DIR echo call "%MSVC_VS_DIR%\Common7\Tools\VsDevCmd.bat" > %BUILD_DIR%\rebuild.cmd 
echo cmake . >> %BUILD_DIR%\rebuild.cmd
echo msbuild ^
	%BUILD_DIR%\Blender.sln ^
	/target:build ^
	/property:Configuration=%BUILD_TYPE% ^
	/maxcpucount:2 ^
	/verbosity:minimal ^
	/p:platform=%MSBUILD_PLATFORM% ^
	/flp:Summary;Verbosity=minimal;LogFile=%BUILD_DIR%\Build.log >> %BUILD_DIR%\rebuild.cmd
echo msbuild ^
	%BUILD_DIR%\INSTALL.vcxproj ^
	/property:Configuration=%BUILD_TYPE% ^
	/verbosity:minimal ^
	/p:platform=%MSBUILD_PLATFORM% >> %BUILD_DIR%\rebuild.cmd

if "%NOBUILD%"=="1" goto EOF

msbuild ^
	%BUILD_DIR%\Blender.sln ^
	/target:build ^
	/property:Configuration=%BUILD_TYPE% ^
	/maxcpucount:2 ^
	/verbosity:minimal ^
	/p:platform=%MSBUILD_PLATFORM% ^
	/flp:Summary;Verbosity=minimal;LogFile=%BUILD_DIR%\Build.log

if %ERRORLEVEL% NEQ 0 (
	echo "Build Failed"
	goto EOF
)

msbuild ^
	%BUILD_DIR%\INSTALL.vcxproj ^
	/property:Configuration=%BUILD_TYPE% ^
	/verbosity:minimal ^
	/p:platform=%MSBUILD_PLATFORM%

echo.
echo At any point you can optionally modify your build configuration by editing:
echo "%BUILD_DIR%\CMakeCache.txt", then run "rebuild.cmd" in the build folder to build with the changes applied.
echo.
echo Blender successfully built, run from: "%BUILD_DIR%\bin\%BUILD_TYPE%\blender.exe"
echo.
goto EOF
:HELP
		echo.
		echo Convenience targets
		echo - release ^(identical to the official blender.org builds^)
		echo - full ^(same as release minus the cuda kernels^)
		echo - lite
		echo - headless
		echo - cycles
		echo - bpy
		echo.
		echo Utilities ^(not associated with building^)
		echo - clean ^(Target must be set^)
		echo - update
		echo - nobuild ^(only generate project files^)
		echo - showhash ^(Show git hashes of source tree^)
		echo.
		echo Configuration options
		echo - with_tests ^(enable building unit tests^)
		echo - noge ^(disable building game enginge and player^)
		echo - debug ^(Build an unoptimized debuggable build^)
		echo - packagename [newname] ^(override default cpack package name^)
		echo - buildir [newdir] ^(override default build folder^)
		echo - x86 ^(override host auto-detect and build 32 bit code^)
		echo - x64 ^(override host auto-detect and build 64 bit code^)
		echo - 2013 ^(build with visual studio 2013^)
		echo - 2015 ^(build with visual studio 2015^) [EXPERIMENTAL]
		echo.

:EOF
