220 lines
8.0 KiB
Batchfile
Executable File
220 lines
8.0 KiB
Batchfile
Executable File
@echo off
|
|
REM One-time (or re-run any time) environment setup for this template.
|
|
REM Windows; on Linux and macOS it is scripts/setup.sh.
|
|
REM
|
|
REM 1. Checks for the tools this project builds with -- Git, CMake 3.25+ and a
|
|
REM C++ compiler (Visual Studio Build Tools, or MinGW-w64 through MSYS2:
|
|
REM required), plus LLVM and the other MSYS2 toolchains (optional) -- and
|
|
REM offers to install whatever is missing, ONE TOOL AT A TIME, showing the
|
|
REM exact winget command before running it. Nothing is installed without
|
|
REM your yes. The work is done by scripts\_tools.ps1 (PowerShell: prompts,
|
|
REM PATH handling and winget are far more robust there than in batch).
|
|
REM 2. Fetches the pinned ninja (cmake\FetchNinja.cmake) -- used by
|
|
REM scripts\build.bat if found (see there); a system ninja still
|
|
REM works fine too, this just avoids needing one installed at all.
|
|
REM 3. Fetches the pinned Doxygen (cmake\FetchDoxygen.cmake) -- NOT
|
|
REM required to build the project itself (see cmake\Documentation.cmake),
|
|
REM only to run scripts\docs.bat afterward.
|
|
REM 4. Activates the pre-commit hook (.githooks\pre-commit) for this
|
|
REM clone, if it's a git repository.
|
|
REM
|
|
REM A failure in step 2 or 3 (no pinned binary for this machine, no network)
|
|
REM is reported and setup carries on -- it used to stop there, before the hook
|
|
REM was activated.
|
|
REM
|
|
REM Usage (from the project root):
|
|
REM scripts\setup.bat [--yes] [--all] [--check] [--skip-tools]
|
|
REM scripts\setup.bat --help
|
|
REM
|
|
REM No delayed expansion in this file, on purpose: PATH is edited below, and
|
|
REM with delayed expansion on, a "!" in any directory name would be eaten.
|
|
setlocal
|
|
|
|
REM %~dp0 is captured first: a plain SHIFT (used to walk the arguments below)
|
|
REM shifts %0 as well.
|
|
set "_PMN_HERE=%~dp0"
|
|
|
|
set "_PMN_TOOLS_ARGS="
|
|
set "_PMN_SKIP_TOOLS=0"
|
|
set "_PMN_CHECK=0"
|
|
set "_PMN_TOOLS_RC=0"
|
|
|
|
:parse_args
|
|
if "%~1"=="" goto args_done
|
|
if /i "%~1"=="-h" goto show_help
|
|
if /i "%~1"=="--help" goto show_help
|
|
if /i "%~1"=="-y" goto opt_yes
|
|
if /i "%~1"=="--yes" goto opt_yes
|
|
if /i "%~1"=="--all" goto opt_all
|
|
if /i "%~1"=="--check" goto opt_check
|
|
if /i "%~1"=="--skip-tools" goto opt_skip_tools
|
|
echo error: unknown option "%~1" 1>&2
|
|
echo Run scripts\setup.bat --help for usage. 1>&2
|
|
exit /b 1
|
|
|
|
:opt_yes
|
|
set "_PMN_TOOLS_ARGS=%_PMN_TOOLS_ARGS% -Yes"
|
|
shift
|
|
goto parse_args
|
|
|
|
:opt_all
|
|
set "_PMN_TOOLS_ARGS=%_PMN_TOOLS_ARGS% -All"
|
|
shift
|
|
goto parse_args
|
|
|
|
:opt_check
|
|
set "_PMN_TOOLS_ARGS=%_PMN_TOOLS_ARGS% -Check"
|
|
set "_PMN_CHECK=1"
|
|
shift
|
|
goto parse_args
|
|
|
|
:opt_skip_tools
|
|
set "_PMN_SKIP_TOOLS=1"
|
|
shift
|
|
goto parse_args
|
|
|
|
:show_help
|
|
echo Usage: scripts\setup.bat [--yes] [--all] [--check] [--skip-tools]
|
|
echo.
|
|
echo One-time ^(or re-run any time^) environment setup for this template:
|
|
echo 1. Checks the tools the project builds with and offers to install what's
|
|
echo missing, one tool at a time ^(Git, CMake and a C++ compiler are
|
|
echo required; LLVM and the other MSYS2 toolchains are optional^). Each
|
|
echo install shows its exact winget command and waits for your yes.
|
|
echo 2. Fetches the pinned ninja ^(cmake\FetchNinja.cmake^).
|
|
echo 3. Fetches the pinned Doxygen ^(cmake\FetchDoxygen.cmake^).
|
|
echo 4. Activates the pre-commit hook ^(.githooks\pre-commit^) for this clone,
|
|
echo if it's a git repository.
|
|
echo.
|
|
echo Options:
|
|
echo -y, --yes Install the REQUIRED tools without asking. For scripts and
|
|
echo CI; without a terminal and without this, nothing is asked
|
|
echo and nothing is installed.
|
|
echo --all Also install the optional tools without asking ^(implies
|
|
echo --yes^).
|
|
echo --check Only report what is and isn't installed; change nothing,
|
|
echo fetch nothing. Exits 1 if a required tool is missing.
|
|
echo --skip-tools Skip step 1 and go straight to the pinned downloads.
|
|
echo.
|
|
echo At each question: y install it n not this one a install everything
|
|
echo left s skip the rest of the optional tools q stop asking.
|
|
echo.
|
|
echo See the comment at the top of this script for more on each step.
|
|
exit /b 0
|
|
|
|
:args_done
|
|
cd /d "%_PMN_HERE%.."
|
|
|
|
REM ---- 1. tools --------------------------------------------------------------
|
|
if "%_PMN_SKIP_TOOLS%"=="1" goto tools_done
|
|
where powershell >nul 2>nul
|
|
if errorlevel 1 goto no_powershell
|
|
|
|
set "_PMN_PATHFILE=%TEMP%\pmn-path-%RANDOM%%RANDOM%.txt"
|
|
powershell -NoProfile -ExecutionPolicy Bypass -File "%_PMN_HERE%_tools.ps1" %_PMN_TOOLS_ARGS% -PathOut "%_PMN_PATHFILE%"
|
|
set "_PMN_TOOLS_RC=%ERRORLEVEL%"
|
|
|
|
REM The installer adds tool folders (CMake, Git, ...) to ITS copy of PATH so
|
|
REM it can use them; a child process can't change ours, so it hands the list
|
|
REM back in a file and they're appended here, for the steps below.
|
|
if exist "%_PMN_PATHFILE%" call :take_path_additions
|
|
echo.
|
|
goto tools_done
|
|
|
|
:no_powershell
|
|
echo error: powershell.exe not found on PATH -- it runs the tool installer. 1>&2
|
|
echo Install the tools yourself and re-run with --skip-tools. 1>&2
|
|
exit /b 1
|
|
|
|
:tools_done
|
|
if not "%_PMN_CHECK%"=="1" goto after_check
|
|
if "%_PMN_TOOLS_RC%"=="0" goto check_ok
|
|
echo ==^> Required tools are missing. Run scripts\setup.bat to install them.
|
|
exit /b %_PMN_TOOLS_RC%
|
|
:check_ok
|
|
echo ==^> All required tools are present.
|
|
exit /b 0
|
|
:after_check
|
|
|
|
REM Everything below runs CMake scripts.
|
|
where cmake >nul 2>nul
|
|
if errorlevel 1 goto no_cmake
|
|
goto have_cmake
|
|
:no_cmake
|
|
echo error: cmake not found on PATH -- nothing below can run without it. 1>&2
|
|
if "%_PMN_SKIP_TOOLS%"=="1" goto no_cmake_skip
|
|
echo Install CMake ^(3.25 or newer^), open a new terminal, and re-run this script. 1>&2
|
|
exit /b 1
|
|
:no_cmake_skip
|
|
echo Re-run without --skip-tools to be offered an install. 1>&2
|
|
exit /b 1
|
|
:have_cmake
|
|
|
|
REM ---- 2. pinned ninja -------------------------------------------------------
|
|
echo ==^> Fetching pinned ninja (cmake\FetchNinja.cmake)
|
|
cmake -P cmake\FetchNinja.cmake
|
|
if errorlevel 1 goto ninja_failed
|
|
goto ninja_done
|
|
:ninja_failed
|
|
echo.
|
|
echo No pinned ninja here ^(no upstream binary for this machine, or the
|
|
echo download failed -- see above^).
|
|
where ninja >nul 2>nul
|
|
if errorlevel 1 goto ninja_missing
|
|
echo The ninja on PATH will be used instead.
|
|
goto ninja_done
|
|
:ninja_missing
|
|
echo scripts\build.bat needs a ninja: e.g. winget install Ninja-build.Ninja
|
|
:ninja_done
|
|
|
|
REM ---- 3. pinned Doxygen -----------------------------------------------------
|
|
echo.
|
|
echo ==^> Fetching pinned Doxygen (cmake\FetchDoxygen.cmake)
|
|
cmake -P cmake\FetchDoxygen.cmake
|
|
if errorlevel 1 goto doxygen_failed
|
|
goto doxygen_done
|
|
:doxygen_failed
|
|
echo.
|
|
echo Documentation ^(scripts\docs.bat^) won't be available: there's no pinned
|
|
echo Doxygen for this machine, or the download failed -- see above.
|
|
echo The project itself builds fine without it.
|
|
:doxygen_done
|
|
|
|
REM ---- 4. pre-commit hook ----------------------------------------------------
|
|
echo.
|
|
git rev-parse --is-inside-work-tree >nul 2>nul
|
|
if errorlevel 1 goto hook_skip
|
|
echo ==^> Activating pre-commit hook
|
|
git config core.hooksPath .githooks
|
|
echo core.hooksPath = .githooks
|
|
goto hook_done
|
|
:hook_skip
|
|
echo ==^> Skipping pre-commit hook activation ^(not a git repository yet^)
|
|
echo Once you've run "git init", re-run this script or:
|
|
echo git config core.hooksPath .githooks
|
|
:hook_done
|
|
|
|
echo.
|
|
if "%_PMN_TOOLS_RC%"=="0" goto setup_ok
|
|
echo ==^> Setup finished, but a required tool is still missing -- see above.
|
|
exit /b 1
|
|
:setup_ok
|
|
echo ==^> Setup complete. scripts\build.bat and scripts\docs.bat are ready to use.
|
|
exit /b 0
|
|
|
|
REM ---------------------------------------------------------------------
|
|
REM :take_path_additions
|
|
REM
|
|
REM Appends every directory listed in %_PMN_PATHFILE% to PATH, then deletes
|
|
REM the file. One "for /f ... do call" line, deliberately not a parenthesized
|
|
REM block: a directory like "C:\Program Files (x86)\..." would close it early.
|
|
REM ---------------------------------------------------------------------
|
|
:take_path_additions
|
|
for /f "usebackq delims=" %%D in ("%_PMN_PATHFILE%") do call :add_path "%%D"
|
|
del "%_PMN_PATHFILE%" >nul 2>nul
|
|
goto :eof
|
|
|
|
:add_path
|
|
set "PATH=%PATH%;%~1"
|
|
goto :eof
|