diff options
| author | Ben Vanik <ben.vanik@gmail.com> | 2015-05-02 21:46:42 -0700 |
|---|---|---|
| committer | Ben Vanik <ben.vanik@gmail.com> | 2015-05-02 21:46:42 -0700 |
| commit | 519fefd58d80ce487cb864b2bbaa92515f81f2b4 (patch) | |
| tree | 6883932cce90f3b0d5af67a6a429f4dbac0ca067 /xb.bat | |
| parent | ce7270b839e6bf0dfb054ccb997b53263ad273f4 (diff) | |
Replacing python stuff with BAT, 1993-style.
Diffstat (limited to 'xb.bat')
| -rw-r--r-- | xb.bat | 544 |
1 files changed, 542 insertions, 2 deletions
@@ -1,6 +1,546 @@ @ECHO OFF -REM Copyright 2013 Ben Vanik. All Rights Reserved. +REM Copyright 2015 Ben Vanik. All Rights Reserved. +TITLE xenia SET DIR=%~dp0 -python xenia-build.py %* +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 +) + +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 ( + ECHO. + ECHO ERROR: clang-format failed - ensure all files are staged + ENDLOCAL & SET _RESULT=1 + GOTO :eof + ) +) ELSE ( + SET ANY_ERRORS=0 + ECHO. + ECHO ^> clang-format (all) + 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 FOOO + ) +) + +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 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 |
