summaryrefslogtreecommitdiff
path: root/xb.bat
diff options
context:
space:
mode:
authorBen Vanik <ben.vanik@gmail.com>2015-05-02 21:46:42 -0700
committerBen Vanik <ben.vanik@gmail.com>2015-05-02 21:46:42 -0700
commit519fefd58d80ce487cb864b2bbaa92515f81f2b4 (patch)
tree6883932cce90f3b0d5af67a6a429f4dbac0ca067 /xb.bat
parentce7270b839e6bf0dfb054ccb997b53263ad273f4 (diff)
Replacing python stuff with BAT, 1993-style.
Diffstat (limited to 'xb.bat')
-rw-r--r--xb.bat544
1 files changed, 542 insertions, 2 deletions
diff --git a/xb.bat b/xb.bat
index 30f587349..09a3804f9 100644
--- a/xb.bat
+++ b/xb.bat
@@ -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