xenia-canary/xb.bat

544 lines
12 KiB
Batchfile

@ECHO OFF
REM Copyright 2015 Ben Vanik. All Rights Reserved.
SET DIR=%~dp0
SET XENIA_SLN=build\xenia\xenia.sln
REM ============================================================================
REM Environment Validation
REM ============================================================================
REM To make life easier we just require everything before we try running.
CALL :check_git
IF %_RESULT% NEQ 0 (
ECHO ERROR:
ECHO git must be installed and on PATH.
GOTO :exit_error
)
CALL :check_python
IF %_RESULT% NEQ 0 (
ECHO ERROR:
ECHO Python 2.7 must be installed and on PATH:
ECHO https://www.python.org/ftp/python/2.7.9/python-2.7.9.msi
GOTO :exit_error
)
CALL :check_msvc
IF %_RESULT% NEQ 0 (
ECHO ERROR:
ECHO Visual Studio 2015 must be installed.
ECHO.
ECHO The Community Edition is free and can be downloaded here:
ECHO https://www.visualstudio.com/downloads/visual-studio-2015-downloads-vs
ECHO.
ECHO Once installed, launch the 'Developer Command Prompt for VS2015' and run
ECHO this script again.
GOTO :exit_error
)
REM ============================================================================
REM Command Parsing
REM ============================================================================
SET _RESULT=-2
REM Ensure a command has been passed.
IF -%1-==-- GOTO :show_help
REM Dispatch to handler (:perform_foo).
2>NUL CALL :perform_%1 %*
IF %_RESULT% EQU -2 GOTO :show_help
IF %_RESULT% EQU -1 GOTO :exit_nop
IF %_RESULT% EQU 0 GOTO :exit_success
GOTO :exit_error
:exit_success
ECHO.
ECHO OK
EXIT /b 0
:exit_error
ECHO.
ECHO Error: %_RESULT%
EXIT /b 1
:exit_nop
ECHO.
ECHO (no actions performed)
EXIT /b 0
REM ============================================================================
REM xb help
REM ============================================================================
:show_help
SETLOCAL
ECHO.
ECHO Usage: xb COMMAND [options]
ECHO.
ECHO Commands:
ECHO.
ECHO xb setup
ECHO Initializes dependencies and prepares build environment.
ECHO.
ECHO xb pull [--rebase]
ECHO Fetches latest changes from github and rebuilds dependencies.
ECHO.
ECHO xb gyp
ECHO Creates/updates xenia.sln and project files. Use after changing gypi.
ECHO.
ECHO xb edit
ECHO Opens Visual Studio with `xenia.sln`.
ECHO.
ECHO xb build [--debug OR --release] [--force]
ECHO Initializes dependencies and prepares build environment.
ECHO.
ECHO xb test [--debug OR --release] [--continue]
ECHO Runs automated tests. Tests must have been built with `xb build`.
ECHO.
ECHO xb clean
ECHO Cleans normal build artifacts to force a rebuild.
ECHO.
ECHO xb nuke
ECHO Resets branch and build environment to defaults to unhose state.
ECHO.
ECHO xb lint [--all]
ECHO Runs linter on local changes (or entire codebase).
ECHO.
ECHO xb format [--all]
ECHO Runs linter/auto-formatter on local changes (or entire codebase).
ECHO.
ENDLOCAL & SET _RESULT=0
GOTO :eof
REM ============================================================================
REM xb setup
REM ============================================================================
:perform_setup
SETLOCAL
ECHO Setting up the build environment...
ECHO.
ECHO ^> git submodule update --init
git submodule update --init
IF %ERRORLEVEL% NEQ 0 (
ECHO.
ECHO ERROR: failed to initialize git submodules
ENDLOCAL & SET _RESULT=1
GOTO :eof
)
ECHO.
ECHO ^> generating projects...
CALL :generate_projects
IF %_RESULT% NEQ 0 (
ECHO.
ECHO ERROR: failed to generate projects
ENDLOCAL & SET _RESULT=1
GOTO :eof
)
ENDLOCAL & SET _RESULT=0
GOTO :eof
REM ============================================================================
REM xb pull
REM ============================================================================
:perform_pull
SETLOCAL
SET REBASE=0
SHIFT
:perform_pull_args
IF "%~1"=="" GOTO :perform_pull_parsed
IF "%~1"=="--" GOTO :perform_pull_parsed
IF "%~1"=="--rebase" (SET REBASE=1)
SHIFT
GOTO :perform_pull_args
:perform_pull_parsed
ECHO Pulling latest changes and rebuilding dependencies...
ECHO.
ECHO ^> git checkout master
git checkout master
IF %ERRORLEVEL% NEQ 0 (
ECHO.
ECHO ERROR: failed to checkout master
ENDLOCAL & SET _RESULT=1
GOTO :eof
)
ECHO.
IF %REBASE% EQU 1 (
ECHO ^> git pull --rebase
git pull --rebase
) ELSE (
ECHO ^> git pull
git pull
)
IF %ERRORLEVEL% NEQ 0 (
ECHO.
ECHO ERROR: failed to pull latest changes from git
ENDLOCAL & SET _RESULT=1
GOTO :eof
)
ECHO.
ECHO ^> git submodule update
git submodule update
IF %ERRORLEVEL% NEQ 0 (
ECHO.
ECHO ERROR: failed to update git submodules
ENDLOCAL & SET _RESULT=1
GOTO :eof
)
ECHO.
ECHO ^> generating projects...
CALL :generate_projects
IF %_RESULT% NEQ 0 (
ECHO.
ECHO ERROR: failed to generate projects
ENDLOCAL & SET _RESULT=1
GOTO :eof
)
ENDLOCAL & SET _RESULT=0
GOTO :eof
REM ============================================================================
REM xb gyp
REM ============================================================================
:perform_gyp
SETLOCAL
ECHO Generating projects...
ECHO.
ECHO ^> generating projects...
CALL :generate_projects
IF %_RESULT% NEQ 0 (
ECHO.
ECHO ERROR: failed to generate projects
ENDLOCAL & SET _RESULT=1
GOTO :eof
)
ENDLOCAL & SET _RESULT=0
GOTO :eof
REM ============================================================================
REM xb edit
REM ============================================================================
:perform_edit
SETLOCAL
ECHO Launching Visual Studio...
ECHO.
ECHO ^> generating projects...
CALL :generate_projects
IF %_RESULT% NEQ 0 (
ECHO.
ECHO ERROR: failed to generate projects
ENDLOCAL & SET _RESULT=1
GOTO :eof
)
ECHO.
ECHO ^> devenv %XENIA_SLN%
START devenv %XENIA_SLN%
ENDLOCAL & SET _RESULT=0
GOTO :eof
REM ============================================================================
REM xb build
REM ============================================================================
:perform_build
SETLOCAL
SET CONFIG="debug"
SET FORCE=0
SHIFT
:perform_build_args
IF "%~1"=="" GOTO :perform_build_parsed
IF "%~1"=="--" GOTO :perform_build_parsed
IF "%~1"=="--debug" (SET CONFIG="debug")
IF "%~1"=="--release" (SET CONFIG="release")
IF "%~1"=="--force" (SET FORCE=1)
SHIFT
GOTO :perform_build_args
:perform_build_parsed
ECHO Building for config %CONFIG%...
ECHO.
ECHO ^> generating projects...
CALL :generate_projects
IF %_RESULT% NEQ 0 (
ECHO.
ECHO ERROR: failed to generate projects
ENDLOCAL & SET _RESULT=1
GOTO :eof
)
IF %FORCE% EQU 1 (
SET DEVENV_COMMAND=/rebuild
) ELSE (
SET DEVENV_COMMAND=/build
)
ECHO.
ECHO ^> devenv %XENIA_SLN% %DEVENV_COMMAND% %CONFIG%
devenv %XENIA_SLN% /nologo %DEVENV_COMMAND% %CONFIG%
IF %ERRORLEVEL% NEQ 0 (
ECHO.
ECHO ERROR: build failed with errors
ENDLOCAL & SET _RESULT=1
GOTO :eof
)
ENDLOCAL & SET _RESULT=0
GOTO :eof
REM ============================================================================
REM xb test
REM ============================================================================
:perform_test
SETLOCAL EnableDelayedExpansion
SET BUILD=1
SET CONFIG="debug"
SET CONTINUE=0
SHIFT
:perform_test_args
IF "%~1"=="" GOTO :perform_test_parsed
IF "%~1"=="--" GOTO :perform_test_parsed
IF "%~1"=="--debug" (SET CONFIG="debug")
IF "%~1"=="--release" (SET CONFIG="release")
IF "%~1"=="--continue" (SET CONTINUE=1)
SHIFT
GOTO :perform_test_args
:perform_test_parsed
ECHO Running automated testing for config %CONFIG%...
SET TEST_NAMES=xe-cpu-hir-test xe-cpu-ppc-test
FOR %%G IN (%TEST_NAMES%) DO (
IF NOT EXIST build\xenia\%CONFIG%\%%G.exe (
ECHO.
ECHO ERROR: unable to find `%%G.exe` - ensure it is built.
ENDLOCAL & SET _RESULT=1
GOTO :eof
)
)
SET ANY_FAILED=0
FOR %%G IN (%TEST_NAMES%) DO (
ECHO.
ECHO ^> build\xenia\%CONFIG%\%%G.exe
build\xenia\%CONFIG%\%%G.exe
IF !ERRORLEVEL! NEQ 0 (
SET ANY_FAILED=1
IF %CONTINUE% EQU 0 (
ECHO.
ECHO ERROR: test failed, aborting, use --continue to keep going
ENDLOCAL & SET _RESULT=1
GOTO :eof
) ELSE (
ECHO.
ECHO ERROR: test failed but continuing due to --continue
)
)
)
IF %ANY_FAILED% NEQ 0 (
ECHO.
ECHO ERROR: one or more tests failed
ENDLOCAL & SET _RESULT=1
GOTO :eof
)
ENDLOCAL & SET _RESULT=0
GOTO :eof
REM ============================================================================
REM xb clean
REM ============================================================================
:perform_clean
SETLOCAL
ECHO Cleaning normal build outputs...
ECHO (use nuke to kill all artifacts)
SET CONFIG_NAMES=Debug Release
FOR %%G IN (%CONFIG_NAMES%) DO (
ECHO.
ECHO ^> devenv %XENIA_SLN% /clean %%G
devenv %XENIA_SLN% /nologo /clean %%G
)
ENDLOCAL & SET _RESULT=0
GOTO :eof
REM ============================================================================
REM xb nuke
REM ============================================================================
:perform_nuke
SETLOCAL
ECHO Nuking all local changes...
ECHO.
REM rmdir build/
REM git checkout --hard /etc
ECHO TODO(benvanik): blast away build/ for now
ENDLOCAL & SET _RESULT=0
GOTO :eof
REM ============================================================================
REM xb lint
REM ============================================================================
:perform_lint
SETLOCAL
SET ALL=0
SHIFT
:perform_lint_args
IF "%~1"=="" GOTO :perform_lint_parsed
IF "%~1"=="--" GOTO :perform_lint_parsed
IF "%~1"=="--all" (SET ALL=1)
SHIFT
GOTO :perform_lint_args
:perform_lint_parsed
IF %ALL% EQU 1 (
ECHO Running code linter on all code...
) ELSE (
ECHO Running code linter on code staged in git index...
)
ECHO.
REM --all
REM run lint
ECHO TODO(benvanik): just `xb format`
ENDLOCAL & SET _RESULT=0
GOTO :eof
REM ============================================================================
REM xb format
REM ============================================================================
:perform_format
SETLOCAL EnableDelayedExpansion
SET ALL=0
SHIFT
:perform_format_args
IF "%~1"=="" GOTO :perform_format_parsed
IF "%~1"=="--" GOTO :perform_format_parsed
IF "%~1"=="--all" (SET ALL=1)
SHIFT
GOTO :perform_format_args
:perform_format_parsed
IF %ALL% EQU 1 (
ECHO Running code formatter on all code...
) ELSE (
ECHO Running code formatter on code staged in git index...
)
SET CLANG_FORMAT=""
SET LLVM_CLANG_FORMAT="C:\Program Files (x86)\LLVM\bin\clang-format.exe"
IF EXIST %LLVM_CLANG_FORMAT% (
SET CLANG_FORMAT=%LLVM_CLANG_FORMAT%
) ELSE (
1>NUL 2>NUL CMD /c where clang-format
IF %ERRORLEVEL% NEQ 0 (
SET CLANG_FORMAT="clang-format"
)
)
IF %CLANG_FORMAT%=="" (
ECHO.
ECHO ERROR: clang-format is not on PATH or the standard location.
ECHO LLVM is available from http://llvm.org/releases/download.html
ECHO See docs/style_guide.md for instructions on how to get it.
ENDLOCAL & SET _RESULT=1
GOTO :eof
)
SET ANY_ERRORS=0
IF %ALL% NEQ 1 (
ECHO.
ECHO ^> git-clang-format
CMD /c python third_party/clang-format/git-clang-format --binary=%CLANG_FORMAT% --commit=HEAD
IF %ERRORLEVEL% NEQ 0 (
SET ANY_ERRORS=1
)
) ELSE (
PUSHD src
FOR /R %%G in (*.cc *.c *.h *.inl) DO (
ECHO ^> clang-format %%G
CMD /C %CLANG_FORMAT% -i -style=file %%G
IF !ERRORLEVEL! NEQ 0 (
SET ANY_ERRORS=1
)
)
POPD
)
IF %ANY_ERRORS% NEQ 0 (
ECHO.
ECHO ERROR: 1+ clang-format calls failed - ensure all files are staged
ENDLOCAL & SET _RESULT=1
GOTO :eof
)
ENDLOCAL & SET _RESULT=0
GOTO :eof
REM ============================================================================
REM Utilities
REM ============================================================================
:check_python
SETLOCAL
1>NUL 2>NUL CMD /c where python
IF %ERRORLEVEL% NEQ 0 (
ENDLOCAL & SET _RESULT=1
GOTO :eof
)
CMD /c python -c "import sys; sys.exit(1 if not sys.version_info[:2] == (2, 7) else 0)"
IF %ERRORLEVEL% NEQ 0 (
ENDLOCAL & SET _RESULT=1
GOTO :eof
)
ENDLOCAL & SET _RESULT=0
GOTO :eof
:check_git
1>NUL 2>NUL CMD /c where git
SET _RESULT=%ERRORLEVEL%
GOTO :eof
:check_msvc
1>NUL 2>NUL CMD /c where devenv
SET _RESULT=%ERRORLEVEL%
IF %_RESULT% NEQ 0 GOTO :eof
SET _RESULT=1
IF "%VS140COMNTOOLS%" NEQ "" (
IF EXIST "%VS140COMNTOOLS%" (
REM VS2015 CTP/RC
SET _RESULT=0
)
)
IF "%VS150COMNTOOLS%" NEQ "" (
IF EXIST "%VS150COMNTOOLS%" (
REM VS2015
SET _RESULT=0
)
)
GOTO :eof
:generate_projects
CALL third_party\gyp\gyp.bat -f msvs -G output_dir=. --depth=. --toplevel-dir=. --generator-output=build/xenia/ -G msvs_version=2015 -D windows_sdk_dir="C:\Program Files (x86)\Windows Kits\8.1" xenia.gyp
SET _RESULT=%ERRORLEVEL%
GOTO :eof