211 lines
5.6 KiB
Batchfile
211 lines
5.6 KiB
Batchfile
|
@echo off
|
||
|
|
||
|
@rem --------------------------------------------------------------------------
|
||
|
@rem A script to run through the standard build steps of the
|
||
|
@rem automated build system. The script runs in the developers
|
||
|
@rem singularity directory and usually copies the source tree to a
|
||
|
@rem temporary directory and runs through the builds there.
|
||
|
@rem
|
||
|
@rem This will detect build failures across the tested
|
||
|
@rem configurations, but will not detect revision control failures,
|
||
|
@rem such as failing to add files to the repository.
|
||
|
@rem --------------------------------------------------------------------------
|
||
|
|
||
|
setlocal
|
||
|
setlocal EnableExtensions
|
||
|
if ERRORLEVEL 1 (
|
||
|
echo Failed to enable externsions.
|
||
|
exit /b 1
|
||
|
)
|
||
|
|
||
|
set FAILONCE=
|
||
|
set INPLACE=
|
||
|
set NOCLEAN=
|
||
|
set NOPURGE=
|
||
|
|
||
|
:parse
|
||
|
if /I .%1==./failonce (
|
||
|
set FAILONCE=1
|
||
|
shift /1
|
||
|
goto :parse
|
||
|
)
|
||
|
|
||
|
if /I .%1==./inplace (
|
||
|
set INPLACE=1
|
||
|
set NOPURGE=1
|
||
|
shift /1
|
||
|
goto :parse
|
||
|
)
|
||
|
|
||
|
if /I .%1==./noclean (
|
||
|
set NOCLEAN=1
|
||
|
shift /1
|
||
|
goto :parse
|
||
|
)
|
||
|
|
||
|
if /I .%1==./nopurge (
|
||
|
set NOPURGE=1
|
||
|
shift /1
|
||
|
goto :parse
|
||
|
)
|
||
|
|
||
|
if /I NOT ".%1" == "." (
|
||
|
echo "oops: %1"
|
||
|
goto :usage
|
||
|
)
|
||
|
|
||
|
if not defined SINGULARITY_ROOT (
|
||
|
if exist .\build\sgc.exe (
|
||
|
set SINGULARITY_ROOT=%CD%
|
||
|
) else (
|
||
|
echo "SINGULARITY_ROOT not defined."
|
||
|
exit /b 2
|
||
|
)
|
||
|
)
|
||
|
|
||
|
if "%time:~0,1%" == " " (
|
||
|
set TIMESTAMP=0%Time:~1,1%%Time:~3,2%%Time:~6,2%
|
||
|
) else (
|
||
|
set TIMESTAMP=%Time:~0,2%%Time:~3,2%%Time:~6,2%
|
||
|
)
|
||
|
set DATESTAMP=%Date:~12,2%%Date:~4,2%%Date:~7,2%-%TIMESTAMP%
|
||
|
|
||
|
if defined INPLACE (
|
||
|
set WORKDIR=%SINGULARITY_ROOT%
|
||
|
) else (
|
||
|
call :cleanup_state %Temp%
|
||
|
set WORKDIR=%Temp%\Sing%DATESTAMP%
|
||
|
@rem cmd.exe is unable to expand %WORKDIR% in
|
||
|
@rem the next command. Delayed expansion does not help either.
|
||
|
call :populate_workdir %Temp%\Sing%DATESTAMP%
|
||
|
if ERRORLEVEL 1 goto :cleanup
|
||
|
)
|
||
|
|
||
|
pushd %WORKDIR%
|
||
|
if ERRORLEVEL 1 (
|
||
|
@rem If we fail, halt to avoid deleting the
|
||
|
@rem original sources. This is mainly useful if debugging with a
|
||
|
@rem partial build.
|
||
|
echo.Failed to change to work directory.
|
||
|
exit /b 1
|
||
|
)
|
||
|
|
||
|
@rem for %%i in ("/legacy /kcc /pms /prototype" ) do (
|
||
|
for %%i in ( "/legacy /kms /pms /release" "/legacy /kcc /pms /debug" "/legacy /kms /pms /debug" "/legacy /kss /pms /debug" "/apic /kms /pms /release" "/legacy /kms /pms /debug /paging" ) do (
|
||
|
call :do_build %%i
|
||
|
if ERRORLEVEL 1 (
|
||
|
if defined FAILONCE goto :done
|
||
|
)
|
||
|
)
|
||
|
|
||
|
goto :done
|
||
|
|
||
|
@rem cleanup_state <directory>
|
||
|
@rem
|
||
|
@rem Remove all directories under <directory> that have name like Sing*
|
||
|
@rem in the belief that earlier passes of this script have generated them.
|
||
|
@rem
|
||
|
:cleanup_state
|
||
|
echo.Cleaning up former working directories under:
|
||
|
echo. %1
|
||
|
for /d %%d in (%1\Sing*) do (
|
||
|
rmdir /q/s %%d 2>nul
|
||
|
)
|
||
|
exit /b 0
|
||
|
|
||
|
@rem populate_workdir <directory>
|
||
|
@rem
|
||
|
@rem Creates specified directory and copies Singularity source
|
||
|
@rem tree beneath it.
|
||
|
@rem
|
||
|
:populate_workdir
|
||
|
mkdir %1
|
||
|
if ERRORLEVEL 1 (
|
||
|
echo Halted. Could not make work directory %1.
|
||
|
exit /b 2
|
||
|
)
|
||
|
echo.Copying files to work directory:
|
||
|
echo. %1
|
||
|
set COPYLOG=.\copy.log
|
||
|
xcopy /s /e %SINGULARITY_ROOT% %1 1>%COPYLOG% 2>&1
|
||
|
if ERRORLEVEL 1 (
|
||
|
echo "Failed: consult error log %COPYLOG%"
|
||
|
exit /b 1
|
||
|
)
|
||
|
del %COPYLOG% >nul
|
||
|
exit /b 0
|
||
|
|
||
|
@rem do_build <quoted_setenv_args>
|
||
|
@rem
|
||
|
@rem Unquotes arguments for setenv and then runs nmake.
|
||
|
@rem NB By default realclean makefile target is exercised before the all
|
||
|
@rem target. If NOCLEAN is defined, it stops realclean from being
|
||
|
@rem exercised.
|
||
|
@rem
|
||
|
:do_build
|
||
|
@echo off
|
||
|
setlocal
|
||
|
set SE_ARGS=%1
|
||
|
set SE_ARGS=%SE_ARGS:~1,-1%
|
||
|
set LOGFILE=%TEMP%\%DATESTAMP%_%SE_ARGS: =_%
|
||
|
set LOGFILE=%LOGFILE:/=%.txt
|
||
|
|
||
|
echo Running build with %SE_ARGS%
|
||
|
if defined NOCLEAN (
|
||
|
set TARGETS=all
|
||
|
) else (
|
||
|
set TARGETS=realclean all
|
||
|
)
|
||
|
|
||
|
for %%t in (%TARGETS%) do (
|
||
|
@rem it would be nice to tee the output here, but the errorlevel
|
||
|
@rem output appears to become that of the tee program rather than
|
||
|
@rem the status of the pipe (this is an absymal scripting
|
||
|
@rem environment). We need wrapper process that manages the pipe
|
||
|
@rem and traps the error and reports it back.
|
||
|
start "nmake %%t" /WAIT cmd.exe /c ".\setenv.cmd /notitle %SE_ARGS% nmake %%t 1>%LOGFILE% 2>&1"
|
||
|
if ERRORLEVEL 1 (
|
||
|
echo. Failed trying to run nmake %%t - Consult %LOGFILE%.
|
||
|
exit /b 2
|
||
|
)
|
||
|
)
|
||
|
echo. Passed.
|
||
|
exit /b 0
|
||
|
|
||
|
:usage
|
||
|
echo.Usage:
|
||
|
echo. allbuilds.cmd [options]
|
||
|
echo.
|
||
|
echo.Summary:
|
||
|
echo. Run standard builds using source in current tree.
|
||
|
echo.
|
||
|
echo. By default a work directory is created and the current source tree
|
||
|
echo.is copied underneath it. Clean builds of all the standard configurations
|
||
|
echo.are then performed in the work directory.
|
||
|
echo.
|
||
|
echo.Options:
|
||
|
echo. /failonce Stop builds after first failure.
|
||
|
echo. /inplace Perform builds in place (implicit /nopurge to keep source tree).
|
||
|
echo. /noclean Do not run 'nmake realclean' between builds.
|
||
|
echo. /nopurge Keep work directory in event of failure.
|
||
|
echo.
|
||
|
|
||
|
exit /b 1
|
||
|
|
||
|
:done
|
||
|
popd
|
||
|
|
||
|
:cleanup
|
||
|
|
||
|
@rem VC8 starts up a pdb server that will stick around for a couple of
|
||
|
@rem minutes keeping files open in the work directory.
|
||
|
taskkill /F /IM mspdbsrv.exe 1>nul 2>&1
|
||
|
|
||
|
@rem Be really careful before erasing work directory.
|
||
|
if not defined INPLACE (
|
||
|
if not defined NOPURGE (
|
||
|
rmdir /s/q %WORKDIR%
|
||
|
)
|
||
|
)
|
||
|
|