@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=-O4  -Opcoreavx2 -Cpcoreavx2
set CPUOPTS64=-Cfavx2 
set CORES=5
goto donecpuopts

:ivy
rem Ivy Bridge i7-3770
set CPUOPTS=-O4  -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\fpc
set PPCNAME=ppc%COMPSUFFIX%.exe
set FPCSTART=d:\fpc\3.0.4\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 -dTEST_WIN32_SEH %CPUOPTS% 
set COMMONOPTS= COPYTREE=echo OPT="%OPTS% %OPTS32%"  NOWPOCYCLE=1

rem use only if starting compiler does not 
rem 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 building %CPU_TARGET%-%OS%  
make -j %CORES% RELEASE=0 %CROSSOPTS% distclean 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
