@echo off REM Copyright (C) 1994-2017 Altair Engineering, Inc. REM For more information, contact Altair at www.altair.com. REM REM This file is part of the PBS Professional ("PBS Pro") software. REM REM Open Source License Information: REM REM PBS Pro is free software. You can redistribute it and/or modify it under the REM terms of the GNU Affero General Public License as published by the Free REM Software Foundation, either version 3 of the License, or (at your option) any REM later version. REM REM PBS Pro is distributed in the hope that it will be useful, but WITHOUT ANY REM WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A REM PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. REM REM You should have received a copy of the GNU Affero General Public License along REM with this program. If not, see . REM REM Commercial License Information: REM REM The PBS Pro software is licensed under the terms of the GNU Affero General REM Public License agreement ("AGPL"), except where a separate commercial license REM agreement for PBS Pro version 14 or later has been executed in writing with Altair. REM REM Altairs dual-license business model allows companies, individuals, and REM organizations to create proprietary derivative works of PBS Pro and distribute REM them - whether embedded or bundled with other software - under a commercial REM license agreement. REM REM Use of Altairs trademarks, including but not limited to "PBS", REM "PBS Professional", and "PBS Pro" and Altairs logos is subject to Altair's REM trademark licensing policies. REM this script is just helper script to build PBS deps in parallel to reduce REM time of building all PBS deps. REM REM 1. it will list all build_*.bat file in .appveyor directory REM 2. one by one it will execute each batch file in background while REM capturing output and error or batchfile in .bat.out REM file in current directory REM 3. while executing batch file it will limit number of started background REM process to number of processors available in system. REM 4. once it started background process reached limit it goes to wait loop REM where it will wait for atleast one background process to complete by REM looking at exclusive lock on .bat.out created by start REM of process and that lock will be released as soon as process ends REM 5. as soon as one processor ends it checks for .bat.passed REM file if it exists that means background process completed successfully REM else some error occurred. Now in case of error this script will show REM contents of .bat.out to console and exit with error REM (which will stop all other background scrips also) else it will just put REM one line saying \.bat finished. REM 6. Now since one process if finished we have one room to start new process REM so it will go back to main loop to start new background process for building REM next PBS deps and main loop again goes to wait loop and this goes on till REM end of all batch file in .appveyor directory setlocal enableDelayedExpansion cd "%~dp0\.." set /a "started=0, ended=0" set hasmore=1 set BUILD_TYPE=Release if "%~1"=="debug" ( set BUILD_TYPE=Debug ) if "%~1"=="Debug" ( set BUILD_TYPE=Debug ) for /f "usebackq" %%A in (`dir /b C:\__withoutspace_*dir_* 2^>nul`) do rd /Q C:\%%A call "%~dp0set_paths.bat" 1>nul 2>nul del /Q /F %BINARIESDIR%\*.bat.out %BINARIESDIR%\*.passed for /f "usebackq" %%A in (`dir /on /b .appveyor ^| findstr /B /R "^build_.*\.bat$"`) do ( if !started! lss %NUMBER_OF_PROCESSORS% ( set /a "started+=1, next=started" ) else ( call :Wait ) set out!next!=%%A.out echo !time! - %%A - %BUILD_TYPE% version: started start /b "" "cmd /c 1>%BINARIESDIR%\%%A.out 2>&1 .appveyor\%%A %BUILD_TYPE% && echo > %BINARIESDIR%\%%A.passed" REM Introduce 2 sec delay to get different RANDOM value 1>nul 2>nul ping /n 2 ::1 ) set hasmore= :Wait for /l %%N in (1 1 %started%) do 2>nul ( if not defined ended%%N if exist "%BINARIESDIR%\!out%%N!" 9>>"%BINARIESDIR%\!out%%N!" ( if not exist "%BINARIESDIR%\!out%%N:out=passed!" ( type "%BINARIESDIR%\!out%%N!" exit 1 ) else ( echo !time! - !out%%N:.out=! - %BUILD_TYPE% version: finished ) if defined hasmore ( set /a "next=%%N" exit /b ) set /a "ended+=1, ended%%N=1" ) ) if %ended% lss %started% ( 1>nul 2>nul ping /n 5 ::1 goto :Wait ) 1>nul 2>nul del /Q /F %BINARIESDIR%\*.bat.out %BINARIESDIR%\*.passed