@echo off
rem A simple build script for Windows. 2018 version; switching between 32-bit and 64-bit
rem nicer output due to stdout capturing.
rem uncomment OS, en select if CPU has avx 1 or 2. rem Both host and target.
rem I have ivy bridge, skylake and Ryzen machines, roughly avx1 vs avx2.
rem so that's why I model it that way. For the few runs I still do on older machines, I manually change the script.
rem set OS=win64
set OS=win32
set AVX=1
rem CROSSOPTS64 is only added if 64-bit, to allow setting SIMD fpu option only for 64-bit.
if %AVX% equ 1 goto:ivy
rem Ryzen 5 2600 or Skylake laptop
set CPUOPTS=-O2 -Opcoreavx2 -Cpcoreavx2
set CPUOPTS64=-Cfavx2
set CORES=5
goto donecpuopts
:ivy
rem Ivy Bridge i7-3770
set CPUOPTS=-O2 -Opcoreavx -Cpcoreavx
set CPUOPTS64=-Cfavx
set CORES=5
:donecpuopts
rem ---- decode OS to cpu and compiler name.
set OS_TARGET=%OS%
if "%OS%"=="win32" goto:win32
if "%OS%"=="win64" goto:win64
echo Unknown OS: %OS%
exit /b
:contosok
rem A bit of a mess. A mix of configurable settings and variables mostly dependent on detected variables.
set BASEDRV=c:
set SRCDIR=%BASEDRV%\repo\fpcgit
set PPCNAME=ppc%COMPSUFFIX%.exe
rem set FPCSTART=c:\fpc\3.2.2\bin\i386-win32\ppc386.exe
set FPCSTART=c:\pp32rel\bin\i386-win32\ppc386.exe
rem %SRCDIR%/utils/fpcm/ for cross? x32->x64 ?
set LOGDIR=%BASEDRV%\repo
set INSTALLDIR=%BASEDRV%\pp%BITS%
set DESTCOMPILER=%SRCDIR%/compiler/%PPCNAME%
set CROSSOPTS=
rem small FPC script to replace unix "time"
set DUMPTIME=c:\usr\dumptime.exe
if "%BITS%"=="64" set CROSSOPTS= OS_TARGET=win64 CPU_TARGET=x86_64
set OPTS= -gw2 -godwarfsets -gl
set COMMONOPTS= COPYTREE=echo OPT="%OPTS% " NOWPOCYCLE=1 OVERRIDEVERSIONCHECK=1
rem use only if starting compiler does not
set NEWOPT= %CPUOPTS%
rem === invariant part ===
cd /d %SRCDIR%
for /f %%i in ('%FPCSTART% -iV') do set STARTINGVERSION=%%i
for /f %%i in ('%FPCSTART% -iTO') do set STARTINGOS=%%i
for /f %%i in ('%FPCSTART% -iTP') do set STARTINGARCH=%%i
echo Starting compiler %STARTINGVERSION% on %STARTINGARCH%-%STARTINGOS%
rem a small fpc program that dumps time, as substitute for *nix time
if exist %DUMPTIME% (
%DUMPTIME% set %temp%\stdbuild%BITS%.txt
)
echo Cleaning
make -j %CORES% RELEASE=0 %CROSSOPTS% distclean FPMAKEOPT="-T %CORES%" %COMMONOPTS% FPC=%FPCSTART% NEWOPT="%NEWOPT%" ALLOW_WARNINGS=1 1> %LOGDIR%\cleanlog%BITS%.txt 2>&1
echo building %CPU_TARGET%-%OS%
make -j %CORES% RELEASE=0 %CROSSOPTS% all FPMAKEOPT="-T %CORES%" %COMMONOPTS% FPC=%FPCSTART% NEWOPT="%NEWOPT%" ALLOW_WARNINGS=1 1> %LOGDIR%\buildlog%BITS%.txt 2>&1
IF %ERRORLEVEL% EQU 0 GOTO:buildOK
echo build failed, skipping installation
exit /b
:buildOK
for /f %%i in ('%DESTCOMPILER% -iV') do set DESTVERSION=%%i
for /f %%i in ('%DESTCOMPILER% -iTO') do set DESTOS=%%i
for /f %%i in ('%DESTCOMPILER% -iTP') do set DESTARCH=%%i
echo Generated compiler %DESTVERSION% on %DESTARCH%-%DESTOS%
set FPCMAKENEW=%SRCDIR%/utils/fpcm/bin/%STARTINGARCH%-%STARTINGOS%
REM separate install step for crossversion purposes (and under Unix sudo) FPCMAKENEW required for crossbuilding.
echo installing
make install %COMMONOPTS% %CROSSOPTS% INSTALL_PREFIX=%INSTALLDIR% FPC=%DESTCOMPILER% FPCMAKENEW=%FPCMAKENEW%/fpcmake.exe 1> %LOGDIR%\installlog%BITS%.txt 2>&1
rem otherwise %%i is parsed when if block is parsed and misses content changes inbetween
setlocal EnableDelayedExpansion
if exist %DUMPTIME% (
for /f "delims=#" %%i in ('%DUMPTIME% get %temp%\stdbuild%BITS%.txt') do set THETIME=%%i
echo Ok, building and installing took !THETIME!
)
IF %ERRORLEVEL% EQU 0 GOTO:theend
echo install failed!
exit /b
:win32
set BITS=32
set COMPSUFFIX=386
set CPU_TARGET=i386
goto:contosok
:win64
set BITS=64
set COMPSUFFIX=x64
set CPU_TARGET=x86_64
set CPUOPTS=%CPUOPTS% %CPUOPTS64%
goto:contosok
:theend