From 1029c41df99f1466e7c3089966fa06f70f2cdcd7 Mon Sep 17 00:00:00 2001 From: apnadkarni Date: Mon, 5 Aug 2024 16:18:42 +0000 Subject: VC++ build tool. Builds/tests/installs all configs. Type vctool help. --- win/vctool.bat | 173 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 win/vctool.bat diff --git a/win/vctool.bat b/win/vctool.bat new file mode 100644 index 0000000..262ae1c --- /dev/null +++ b/win/vctool.bat @@ -0,0 +1,173 @@ +@echo off +REM Pass /? as argument for usage. + +IF DEFINED VCINSTALLDIR goto setup + +echo "Not in a Visual Studio command prompt." +exit /B 1 + + +:setup +setlocal + +REM Get the current directory +set "currentDir=%CD%" + +REM Use FOR command to get the parent directory +for %%I in ("%currentDir%") do set "parentDir=%%~dpI" + +REM Remove the trailing backslash +set "parentDir=%parentDir:~0,-1%" + +REM Use FOR command again to get the parent of the parent directory +for %%J in ("%parentDir%") do set "grandParentDir=%%~dpJ" + +REM Remove the trailing backslash +set "grandParentDir=%grandParentDir:~0,-1%" + +REM Use FOR command to extract the last component +for %%I in ("%grandParentDir%") do set "grandParentTail=%%~nxI" + +REM Extract the drive letter +for %%I in ("%currentDir%") do set "driveLetter=%%~dI" + +set ARCH=%VSCMD_ARG_TGT_ARCH% +if "%TCLINSTALLROOT%" == "" ( + set INSTROOT=%driveLetter%\Tcl\%grandParentTail%\%ARCH% +) else ( + set INSTROOT=%TCLINSTALLROOT%\%grandParentTail%\%ARCH% +) + +REM Parse options +:options +if "%1" == "" goto dobuilds +if "%1" == "/?" goto help +if "%1" == "-?" goto help +if /i "%1" == "/help" goto help +if "%1" == "all" goto all +if "%1" == "shared" goto shared +if "%1" == "static" goto static +if "%1" == "shared_noembed" goto shared_noembed +if "%1" == "static_noembed" goto static_noembed +if "%1" == "compile" goto compile +if "%1" == "test" goto targets +if "%1" == "install" goto targets +if "%1" == "runshell" goto targets +if "%1" == "pdbs" goto pdbs +goto help + +:pdbs +set pdbs=1 +shift +goto options + +:shared +set shared=1 +shift +goto options + +:static +set static=1 +shift +goto options + +:shared_noembed +set shared_noembed=1 +shift +goto options + +:static_noembed +set static_noembed=1 +shift +goto options + +:all +set shared=1 +set static=1 +set shared_noembed=1 +set static_noembed=1 +shift +goto options + +:targets +set TARGETS=%TARGETS% %1 +shift +goto options + +REM The makefile.vc compilation target is called "release" +:compile +set TARGETS=%TARGETS% release +shift +goto options + +:dobuilds +if "%shared%%static%%shared_noembed%%static_noembed%" == "" ( + echo At least one of shared, static, shared_noembed, static_noembed, all must be specified. + echo For more help, type "%0 help" + goto error +) + +if DEFINED shared ( + call :runmake shared +) +if DEFINED shared_noembed ( +call :runmake shared-noembed noembed +) +if DEFINED static ( +call :runmake static static +) +if DEFINED static_noembed ( +call :runmake static-noembed "static,noembed" +) + +:done +endlocal +exit /b 0 + +:error +endlocal +exit /b 1 + +:: call :runmake dir opts +:runmake +if "%pdbs%" == "" ( + nmake /s /f makefile.vc OUT_DIR=%currentDir%\vc-%ARCH%-%1 TMP_DIR=%currentDir%\vc-%ARCH%-%1\objs OPTS=pdbs,%2 INSTALLDIR=%INSTROOT%-%1 %TARGETS% && goto error +) else ( + nmake /s /f makefile.vc OUT_DIR=%currentDir%\vc-%ARCH%-%1-debug TMP_DIR=%currentDir%\vc-%ARCH%-%1-debug\objs OPTS=pdbs,%2 cdebug="-Zi -Od" INSTALLDIR=%INSTROOT%-%1-debug %TARGETS% && goto error +) +goto eof + +:help +echo. +echo Usage: %0 arg ... +echo. +echo where each arg may be either a build config or a target or "debug". +echo. +echo Configs: shared, static, shared_noembed, static_noembed, all +echo Targets: compile (default), test, install +echo. +echo Multiple configs and targets may be specified and intermixed. +echo At least one config must be specified. If no targets specified, +echo default is compile. If multiple targets are present, they +echo are built in specified order. +echo. +echo If "debug" is supplied as an argument, the build has optimizations +echo disabled and full debug information. +echo. +echo If environment variable TCLINSTALLROOT is defined, install target +echo will be subdirectory under it named after the grandparent of the +echo current directory. TCLINSTALLROOT defaults to the X:\Tcl where +echo X is the current drive. +echo. +echo For example, if the current directory C:\src\core-8-branch\tcl\win, +echo install directories will be echo under c:\Tcl\core-8-branch\ as +echo x64-shared, x64-static etc. or x64-shared-debug etc. if "pdbs" passed. +echo. +echo Examples: +echo %0 shared (Builds default "shared" config) +echo %0 shared test (Tests shared build) +echo %0 static compile test (Builds and tests static build) +echo %0 all debug (Build debug versions of all configs) +echo %0 all compile install debug (Builds and installs all configs) +echo %0 shared static shared_noembed (Builds three configs) +goto done -- cgit v0.12