diff --git a/make.bat b/make.bat index 6dcf8f9115..25835cbc15 100644 --- a/make.bat +++ b/make.bat @@ -1,59 +1,75 @@ @echo off -setlocal EnableDelayedExpansion +setlocal EnableDelayedExpansion EnableExtensions -REM option flags +REM Option flags set /a valid_cc=0 set /a use_local=0 set /a verbose_log=0 +set /a shift_counter=0 -REM option variables +REM Option variables set log_file="%TEMP%\v_make.log" -set compiler_opt="" +set compiler="" +set target="" REM tcc variables -set tcc_url="https://github.com/vlang/tccbin_win.git" -set tcc_dir="%~dp0thirdparty\tcc" +set "tcc_url=https://github.com/vlang/tccbin_win.git" +set "tcc_dir=%~dp0thirdparty\tcc" +set "vc_url=https://github.com/vlang/vc.git" +set "vc_dir=%~dp0vc" -REM let a particular environment specify their own tcc -if /I not "%TCC_GIT%" == "" ( - set tcc_url="%TCC_GIT%" -) +REM Let a particular environment specify their own tcc repo +if /I not ["%TCC_GIT%"] == [""] set "tcc_url=%TCC_GIT%" pushd %~dp0 :verifyopt -REM end at EOL +REM Read stdin EOF if ["%~1"] == [""] goto :init -REM help option -if "%~1" == "-h" call :usage& exit /b %ERRORLEVEL% -if "%~1" == "--help" call :usage& exit /b %ERRORLEVEL% +REM Target options +if !shift_counter! LSS 1 ( + if "%~1" == "build" set target="build"& shift& set /a shift_counter+=1& goto :verifyopt + if "%~1" == "clean" set target="clean"& shift& set /a shift_counter+=1& goto :verifyopt + if "%~1" == "clean-all" set target="clean-all"& shift& set /a shift_counter+=1& goto :verifyopt + if "%~1" == "help" ( + if "%~2" == "build" call :help_build& exit /b %ERRORLEVEL% + if "%~2" == "clean" call :help_clean& exit /b %ERRORLEVEL% + if "%~2" == "clean-all" call :help_cleanall& exit /b %ERRORLEVEL% + if "%~2" == "help" call :help_help& exit /b %ERRORLEVEL% + if ["%~2"] == [""] call :usage& exit /b %ERRORLEVEL% + shift + ) +) -REM compiler option -if "%~1" == "-gcc" set compiler_opt="gcc"& shift& goto :verifyopt -if "%~1" == "-msvc" set compiler_opt="msvc"& shift& goto :verifyopt -if "%~1" == "-tcc" set compiler_opt="tcc"& shift& goto :verifyopt -if "%~1" == "-fresh-tcc" set compiler_opt="fresh-tcc"& shift& goto :verifyopt -if "%~1" == "-clang" set compiler_opt="clang"& shift& goto :verifyopt +REM Compiler option +if "%~1" == "-gcc" set compiler="gcc"& set /a shift_counter+=1& shift& goto :verifyopt +if "%~1" == "-msvc" set compiler="msvc"& set /a shift_counter+=1& shift& goto :verifyopt +if "%~1" == "-tcc" set compiler="tcc"& set /a shift_counter+=1& shift& goto :verifyopt +if "%~1" == "-fresh-tcc" set compiler="fresh-tcc"& set /a shift_counter+=1& shift& goto :verifyopt +if "%~1" == "-clang" set compiler="clang"& set /a shift_counter+=1& shift& goto :verifyopt -REM standard options -if "%~1" == "-local" ( - if !use_local! EQU 0 ( set /a use_local=1 ) +REM Standard options +if "%~1" == "--local" ( + if !use_local! EQU 0 set /a use_local=1 + set /a shift_counter+=1 shift goto :verifyopt ) if "%~1" == "-v" ( - if !verbose_log! EQU 0 ( set /a verbose_log=1 ) + if !verbose_log! EQU 0 set /a verbose_log=1 + set /a shift_counter+=1 shift goto :verifyopt ) if "%~1" == "--verbose" ( - if !verbose_log! EQU 0 ( set /a verbose_log=1 ) + if !verbose_log! EQU 0 set /a verbose_log=1 + set /a shift_counter+=1 shift goto :verifyopt ) -if "%~1" == "-logfile" ( - if /I "%~2" == "" ( +if "%~1" == "--logfile" ( + if ["%~2"] == [""] ( echo Log file is not specified for -logfile parameter. 1>&2 exit /b 2 ) @@ -63,55 +79,62 @@ if "%~1" == "-logfile" ( ) popd set log_file="%~sf2" + set /a shift_counter+=2 shift shift goto :verifyopt ) -echo Ignoring unidentified option: %~1 & shift -goto :verifyopt +echo Undefined option: %~1 +exit /b 2 :init -echo. +if !target! == "build" goto :build +if !target! == "clean" echo Cleanup build artifacts& goto :clean +if !target! == "clean-all" echo Cleanup all& goto :cleanall +if [!target!] == [""] goto :build + +:build del !log_file!>NUL 2>&1 if !use_local! NEQ 1 ( - if exist "vc" ( + pushd "%vc_dir%" 2>NUL&& ( echo Updating vc... - echo ^> Sync with remote https://github.com/vlang/vc.git - call :buildcmd "cd vc" " " + echo ^> Sync with remote !vc_url! + call :buildcmd "cd "%vc_dir%"" " " call :buildcmd "git pull --quiet" " " call :buildcmd "cd .." " " - ) else ( + ) || ( echo Cloning vc... - echo ^> Cloning from remote https://github.com/vlang/vc.git - call :buildcmd "git clone --depth 1 --quiet https://github.com/vlang/vc.git" " " + echo ^> Cloning from remote !vc_url! + call :buildcmd "git clone --depth 1 --quiet "%vc_url%"" " " ) + popd ) echo. echo Building V... -if !compiler_opt! == "clang" goto :clang_strap -if !compiler_opt! == "gcc" goto :gcc_strap -if !compiler_opt! == "msvc" goto :msvc_strap -if !compiler_opt! == "tcc" goto :tcc_strap -if !compiler_opt! == "fresh-tcc" goto :tcc_strap -if !compiler_opt! == "" goto :gcc_strap +if !compiler! == "clang" goto :clang_strap +if !compiler! == "gcc" goto :gcc_strap +if !compiler! == "msvc" goto :msvc_strap +if !compiler! == "tcc" goto :tcc_strap +if !compiler! == "fresh-tcc" goto :tcc_strap +if [!compiler!] == [""] goto :clang_strap :clang_strap where /q clang if %ERRORLEVEL% NEQ 0 ( echo ^> Clang not found - if not !compiler_opt! == "" goto :error + if not [!compiler!] == [""] goto :error goto :gcc_strap ) set /a valid_cc=1 echo ^> Attempting to build v.c with Clang -call :buildcmd "clang -std=c99 -municode -pedantic -w -o v.exe .\vc\v_win.c" " " +call :buildcmd "clang -std=c99 -municode -w -o v.exe .\vc\v_win.c" " " if %ERRORLEVEL% NEQ 0 ( REM In most cases, compile errors happen because the version of Clang installed is too old - clang --version>>!log_file! 2>>&1 + call :buildcmd "clang --version" " " goto :compile_error ) @@ -124,7 +147,7 @@ goto :success where /q gcc if %ERRORLEVEL% NEQ 0 ( echo ^> GCC not found - if not !compiler_opt! == "" goto :error + if not [!compiler!] == [""] goto :error goto :msvc_strap ) @@ -133,8 +156,8 @@ set /a valid_cc=1 echo ^> Attempting to build v.c with GCC call :buildcmd "gcc -std=c99 -municode -w -o v.exe .\vc\v_win.c" " " if %ERRORLEVEL% NEQ 0 ( - rem In most cases, compile errors happen because the version of GCC installed is too old - gcc --version>>!log_file! 2>>&1 + REM In most cases, compile errors happen because the version of GCC installed is too old + call :buildcmd "gcc --version" " " goto :compile_error ) @@ -154,7 +177,7 @@ if "%PROCESSOR_ARCHITECTURE%" == "x86" ( if not exist "%VsWhereDir%\Microsoft Visual Studio\Installer\vswhere.exe" ( echo ^> MSVC not found - if not !compiler_opt! == "" goto :error + if not [!compiler!] == [""] goto :error goto :tcc_strap ) @@ -185,29 +208,29 @@ goto :success :tcc_strap where /q tcc if %ERRORLEVEL% NEQ 0 ( - if !compiler_opt! == "fresh-tcc" ( + if !compiler! == "fresh-tcc" ( echo ^> Clean TCC directory - call :buildcmd "rd /s /q "%tcc_dir%">NUL 2>&1" " " + call :buildcmd "rmdir /s /q "%tcc_dir%"" " " set /a valid_cc=1 - ) else if !compiler_opt! == "tcc" ( set /a valid_cc=1 ) - if not exist "%tcc_dir%" ( + ) else if !compiler! == "tcc" set /a valid_cc=1 + if not exist %tcc_dir% ( echo ^> TCC not found echo ^> Downloading TCC from %tcc_url% - call :buildcmd "git clone --depth 1 --quiet "%tcc_url%" "%tcc_dir%"" " " + call :buildcmd "git clone --depth 1 --quiet "!tcc_url!" "%tcc_dir%"" " " ) pushd %tcc_dir% || ( echo ^> TCC not found, even after cloning goto :error ) popd - set tcc_exe="%tcc_dir%\tcc.exe" + set "tcc_exe=%tcc_dir%\tcc.exe" ) else ( for /f "delims=" %%i in ('where tcc') do set "tcc_exe=%%i" set /a valid_cc=1 ) echo ^> Updating prebuilt TCC... -pushd "%tcc_dir%"\ +pushd "%tcc_dir%\" call :buildcmd "git pull -q" " " popd @@ -220,6 +243,21 @@ call :buildcmd "v.exe -cc "!tcc_exe!" self" " " if %ERRORLEVEL% NEQ 0 goto :compile_error goto :success +:cleanall +call :clean +echo ^> Purge TCC binaries +call :buildcmd "rmdir /s /q "%tcc_dir%"" " " +echo ^> Purge vc repository +call :buildcmd "rmdir /s /q "%vc_dir%"" " " +exit /b 0 + +:clean +echo ^> Purge debug symbols +call :buildcmd "del *.pdb *.lib *.bak *.out *.ilk *.exp *.obj *.o *.a *.so" " " +echo ^> Delete old V executable +call :buildcmd "del v_old.exe v*.exe" " " +exit /b 0 + :compile_error echo. type !log_file!>NUL 2>&1 @@ -228,7 +266,6 @@ goto :error :error echo. echo Exiting from error -popd exit /b 1 :success @@ -243,15 +280,14 @@ if !valid_cc! EQU 0 ( echo. ) -del v_old.exe>>!log_file! 2>>&1 -del !log_file! +del v_old.exe>>!log_file! 2>NUL +del !log_file! 2>NUL :version echo. echo | set /p="V version: " .\v.exe version -popd -exit /b 0 +goto :eof :buildcmd if !verbose_log! EQU 1 ( @@ -264,24 +300,70 @@ exit /b %ERRORLEVEL% :usage echo. echo Usage: -echo make.bat [compiler] [options] +echo make.bat [target] [compiler] [options] echo. -echo Compiler : +echo Compiler: echo -msvc ^| -gcc ^| -[fresh-]tcc ^| -clang Set C compiler echo. -echo Options: -echo -local Use the local vc repository without -echo syncing with remote -echo -logfile PATH Use the specified PATH as the log -echo file -echo -v ^| --verbose Output compilation commands to stdout -echo -h ^| --help Display this help message and exit +echo Target: +echo build[default] Compiles V using the given C compiler +echo clean Clean build artifacts and debugging symbols +echo clean-all Cleanup entire ALL build artifacts and vc repository +echo help Display usage help for the given target echo. echo Examples: echo make.bat -msvc echo make.bat -gcc --local --logpath output.log -echo make.bat -fresh-tcc --local -echo make.bat --help +echo make.bat build -fresh-tcc --local +echo make.bat help clean echo. -echo Note: Any undefined options will be ignored +echo Use "make help " for more information about a target, for instance: "make help clean" +echo. +echo Note: Any undefined options will cause an error exit /b 0 + +:help_help +echo Usage: +echo make.bat help [target] +echo. +echo Target: +echo build ^| clean ^| clean-all ^| help Query given target +exit /b 0 + +:help_clean +echo Usage: +echo make.bat clean +echo. +echo Options: +echo --logfile PATH Use the specified PATH as the log +echo -v ^| --verbose Output compilation commands to stdout +exit /b 0 + +:help_cleanall +echo Usage: +echo make.bat clean-all +echo. +echo Options: +echo --logfile PATH Use the specified PATH as the log +echo -v ^| --verbose Output compilation commands to stdout +exit /b 0 + +:help_build +echo Usage: +echo make.bat build [compiler] [options] +echo. +echo Compiler: +echo -msvc ^| -gcc ^| -[fresh-]tcc ^| -clang Set C compiler +echo. +echo Options: +echo --local Use the local vc repository without +echo syncing with remote +echo --logfile PATH Use the specified PATH as the log +echo file +echo -v ^| --verbose Output compilation commands to stdout +exit /b 0 + +:eof +popd +endlocal +exit /b 0 \ No newline at end of file