blob: 860793f9e3c7f8b6e53292e3780393e142c7d673 [file] [log] [blame] [raw]
rem
rem This script performs several maintenance functions prior to building
rem simh projects. Some of these funtions are optional and depend on the
rem needs of the project being built, and others are generic and are always
rem performed.
rem
rem The optional activities are invoked by passing parameters to this
rem procedure. The parameters are:
rem ROM To run the BuildROMs program prior to executing a project
rem build. This program verifies that the include files containing
rem ROM images are consistent with the ROM images from which they
rem are derived.
rem BUILD To validate that the required dependent libraries and include
rem files are available in the directory ..\..\windows-build\
rem These libraries currently include winpcap and pthreads and
rem optionally SDL and LIBPCRE.
rem LIBSDL To validate that the required dependent SDL libraries and include
rem files are available in the directory ..\..\windows-build\
rem LIBPCRE To validate that the required dependent PCRE libraries and include
rem files are available in the directory ..\..\windows-build\
rem
rem In addition to the optional activities mentioned above, other activities
rem are also performed. These include:
rem - confirming that if the current source is a clone of the simh
rem git repository, then then git hooks which manage making the
rem git commit hash available during builds are properly installed
rem in the repository hooks directory. When the githooks are installed
rem the current commit id is generated if git.exe is available in the
rem current path.
rem - performing the activities which make the git repository commit id
rem available in an include file during compiles.
rem - Converting Visual Studio Projects to a form which will produce
rem binaries which run on Windows XP if the current build environment
rem supports it and the correct components are installed.
rem This activity is triggered by the first argument being the name
rem of a the current Visual Studio project file. This argument MUST
rem only be provided on a single project which invokes this procedure
rem AND that project should be one which all other projects in a
rem solution are dependent on.
rem
rem
if "%~x1" == ".vcproj" goto _done_xp_check
if not "%~x1" == ".vcxproj" goto _done_project
if exist PlatformToolset.fix goto _project_cleanup
findstr PlatformToolset %1 >NUL
if ERRORLEVEL 1 goto _next_arg
findstr PlatformToolset %1 | findstr _xp >NUL
if not ERRORLEVEL 1 goto _done_xp_check
echo warning: The %~n1.exe binary can't run on windows XP.
set _XP_Support_Available=
for /r "%PROGRAMDATA%" %%z in (packages\XPSupport\Win_XPSupport.msi) do if exist "%%z" set _XP_Support_Available=1
if "" == "%_XP_Support_Available%" goto _done_xp_check
if exist PlatformToolset.fix exit /b 1
echo. >>PlatformToolset.fix
if ERRORLEVEL 1 exit /B 1
echo warning: Adding Windows XP suppport to all project files at %TIME%
echo Set objFSO = CreateObject("Scripting.FileSystemObject") >>%1.fix.vbs
echo Set objFile = objFSO.OpenTextFile(Wscript.Arguments(0), 1) >>%1.fix.vbs
echo. >>%1.fix.vbs
echo strText = objFile.ReadAll >>%1.fix.vbs
echo objFile.Close >>%1.fix.vbs
echo strNewText = Replace(strText, "</PlatformToolset>", "_xp</PlatformToolset>") >>%1.fix.vbs
echo. >>%1.fix.vbs
echo Set objFile = objFSO.OpenTextFile(Wscript.Arguments(0), 2) >>%1.fix.vbs
echo objFile.Write strNewText >>%1.fix.vbs
echo objFile.Close >>%1.fix.vbs
call :_Fix_PlatformToolset %1 %1
for %%f in (*.vcxproj) do call :_Fix_PlatformToolset %1 %%f
call :_GitHooks
del %1.fix.vbs
rem wait a bit here to allow a parallel build of the to complete additional projects
echo Error: Reload the changed projects and start the build again
exit /B 1
:_Fix_PlatformToolset
findstr PlatformToolset %2 >NUL
if ERRORLEVEL 1 exit /B 0
findstr PlatformToolset %2 | findstr _xp >NUL
if not ERRORLEVEL 1 exit /B 0
echo Adding XP support to project %2
cscript %1.fix.vbs %2 > NUL 2>&1
exit /B 0
:_done_xp_check
shift
goto _done_project
:_project_cleanup
shift
del PlatformToolset.fix
:_done_project
if exist PlatformToolset.fix echo error: Reload any changed projects and rebuild again,
if exist PlatformToolset.fix exit /b 1
:_next_arg
if "%1" == "" goto _done_args
set _arg=
if /I "%1" == "ROM" set _arg=ROM
if /I "%1" == "BUILD" set _arg=BUILD
if /I "%1" == "LIBSDL" set _arg=LIBSDL
if /I "%1" == "LIBPCRE" set _arg=LIBPCRE
if /I "%1" == "FINDFONT" set _arg=FINDFONT
if "%_arg%" == "" echo *** warning *** unknown parameter %1
if /I "%1" == "FINDFONT" set _X_FontName=%2
if /I "%1" == "FINDFONT" set _X_FontIncludeName=%3
if /I "%_arg%" == "FINDFONT" shift
if /I "%_arg%" == "FINDFONT" shift
if not "%_arg%" == "" set _X_%_arg%=%_arg%
shift
goto _next_arg
:_done_args
rem some arguments implicitly require BUILD to also be set to have
rem any meaning. These are LIBSDL, LIBPCRE and FINDFONT
if not "%_X_FINDFONT%" == "" set _X_BUILD=BUILD
if not "%_X_LIBSDL%" == "" set _X_BUILD=BUILD
if not "%_X_LIBPCRE%" == "" set _X_BUILD=BUILD
:_do_rom
if "%_X_ROM%" == "" goto _done_rom
pushd ..
SET _BLD=
if exist BIN\NT\Win32-Debug\BuildROMs.exe SET _BLD=BIN\NT\Win32-Debug\BuildROMs.exe
if exist BIN\NT\Win32-Release\BuildROMs.exe SET _BLD=BIN\NT\Win32-Release\BuildROMs.exe
if "%_BLD%" == "" echo ************************************************
if "%_BLD%" == "" echo ************************************************
if "%_BLD%" == "" echo ** Project dependencies not correct. **
if "%_BLD%" == "" echo ** This project should depend on BuildROMs. **
if "%_BLD%" == "" echo ************************************************
if "%_BLD%" == "" echo ************************************************
if "%_BLD%" == "" exit 1
%_BLD%
popd
:_done_rom
:_check_build
if "%_X_BUILD%" == "" goto _done_build
if not exist ../../windows-build-windows-build goto _check_files
rem This is a newly extracted windows-build.zip file with the
rem top level directory named as it existed in the zip file.
rem We rename that top level directory. If a previous one already
rem exists, that will be an older version, so we try to remove
rem that one first.
if exist ..\..\windows-build rmdir /s /q ..\..\windows-build
ren ..\..\windows-build-windows-build windows-build
if errorlevel 1 goto _notice3
if exist ../../windows-build-windows-build goto _notice3
:_check_files
if not exist ../../windows-build/winpcap/Wpdpack/Include/pcap.h goto _notice1
if not exist ../../windows-build/pthreads/pthread.h goto _notice1
findstr "/c:_MSC_VER >= 1900" ..\..\windows-build\pthreads\pthread.h >NUL
if ERRORLEVEL 1 goto _notice2
if "%_X_LIBSDL%" == "" goto _done_libsdl
if not exist ../../windows-build/libSDL/SDL2-2.0.3/include/SDL.h goto _notice2
if not exist "..\..\windows-build\libpng-1.6.18\projects\vstudio\Release Library\*" goto _notice2
if not exist "../../windows-build/libSDL/Microsoft DirectX SDK (June 2010)/Lib/x86/dxguid.lib" goto _notice2
findstr "/c:HAVE_FTOL2_SSE" ..\..\windows-build\libSDL\SDL2-2.0.3\VisualC\SDL_Static\SDL_VS2008.vcproj >NUL
if ERRORLEVEL 1 goto _notice2
:_done_libsdl
if "%_X_LIBPCRE%" == "" goto _done_libpcre
if not exist ../../windows-build/PCRE/include/pcreposix.h goto _notice2
:_done_libpcre
if "%_X_FINDFONT%" == "" goto _done_findfont
if not exist ../../windows-build/libSDL/SDL2_ttf-2.0.12/SDL_ttf.h goto _notice2
if "%_X_FontName%" == "" goto _done_findfont
echo. >%_X_FontIncludeName%.temp
set FONTFILE=%windir%\Fonts\%_X_FontName%
if not exist "%FONTFILE%" echo Can't find font %_X_FontName%
if not exist "%FONTFILE%" goto _done_findfont
set FONTFILE=%FONTFILE:\=/%
echo #define FONTFILE %FONTFILE% >>%_X_FontIncludeName%.temp
if not exist %_X_FontIncludeName% goto _found_font
fc %_X_FontIncludeName%.temp %_X_FontIncludeName% >NUL
if NOT ERRORLEVEL 1 goto _done_findfont
:_found_font
echo Found: %FONTFILE%
move /Y %_X_FontIncludeName%.temp %_X_FontIncludeName% >NUL
:_done_findfont
if exist %_X_FontIncludeName%.temp del %_X_FontIncludeName%.temp
call :FindVCVersion _VC_VER
if not exist "..\..\windows-build\libpng-1.6.18\projects\Release Library" goto _setup_library
if not exist "..\..\windows-build\libpng-1.6.18\projects\Release Library\VisualC.version" set _LIB_VC_VER=9
if exist "..\..\windows-build\libpng-1.6.18\projects\Release Library\VisualC.version" for /f "usebackq delims=." %%v in (`type "..\..\windows-build\libpng-1.6.18\projects\Release Library\VisualC.version"`) do set _LIB_VC_VER=%%v
if %_LIB_VC_VER% EQU %_VC_VER% goto _done_library
if %_VC_VER% GEQ 14 goto _check_new_library
if %_LIB_VC_VER% LSS 14 goto _done_library
goto _setup_library
:_check_new_library
if %_LIB_VC_VER% GEQ 14 godo _done_library
:_setup_library
if %_VC_VER% LSS 14 set _VCLIB_DIR_=vstudio 2008
if %_VC_VER% GEQ 14 set _VCLIB_DIR_=vstudio
if exist "..\..\windows-build\libpng-1.6.18\projects\Release Library" rmdir/s/q "..\..\windows-build\libpng-1.6.18\projects\Release Library"
if exist "..\..\windows-build\libpng-1.6.18\projects\Debug Library" rmdir/s/q "..\..\windows-build\libpng-1.6.18\projects\Debug Library"
xcopy /S /I "..\..\windows-build\libpng-1.6.18\projects\%_VCLIB_DIR_%\Release Library\*" "..\..\windows-build\libpng-1.6.18\projects\Release Library\" > NUL 2>&1
xcopy /S /I "..\..\windows-build\libpng-1.6.18\projects\%_VCLIB_DIR_%\Debug Library\*" "..\..\windows-build\libpng-1.6.18\projects\Debug Library\" > NUL 2>&1
set _VCLIB_DIR_=
set _LIB_VC_VER=
:_done_library
goto _done_build
:_notice1
echo *****************************************************
echo *****************************************************
echo ** The required build support is not available. **
echo *****************************************************
echo *****************************************************
set _exit_reason=The required build support is not available.
goto _ProjectInfo
:_notice2
echo *****************************************************
echo *****************************************************
echo ** The required build support is out of date. **
echo *****************************************************
echo *****************************************************
set _exit_reason=The required build support is out of date.
goto _ProjectInfo
:_notice3
echo *****************************************************
echo *****************************************************
echo ** Can't rename ../../windows-build-windows-build **
echo ** to ../../windows-build **
echo *****************************************************
echo *****************************************************
set _exit_reason=Can't rename ../../windows-build-windows-build to ../../windows-build
goto _ProjectInfo
:_ProjectInfo
type 0ReadMe_Projects.txt
echo error: %_exit_reason%
echo error: Review the Output Tab for more details.
exit 1
:_done_build
:_GitHooks
if not exist ..\.git goto _done_hooks
if exist ..\.git\hooks\post-commit goto _done_hooks
echo *****************************************************
echo *****************************************************
echo ** Installing git hooks in newly cloned repository **
echo *****************************************************
echo *****************************************************
copy /y git-hooks\post* ..\.git\hooks\
call :WhereInPath git.exe > NUL 2>&1
if %ERRORLEVEL% neq 0 goto _done_hooks
pushd ..
git log -1 "--pretty=%%H" >.git-commit-id
popd
:_done_hooks
:_SetId
rem
rem A race condition exists while creating the .git-commit-id.h file.
rem This race can happen at the beginning of a parallel build where
rem several projects can start execution at almost the same time.
rem
SET GIT_COMMIT_ID=
if not exist ..\.git-commit-id goto _NoId
for /F %%i in (..\.git-commit-id) do SET GIT_COMMIT_ID=%%i
:_NoId
SET OLD_GIT_COMMIT_ID=
if not exist .git-commit-id.h echo.>.git-commit-id.h
for /F "tokens=3" %%i in (.git-commit-id.h) do SET OLD_GIT_COMMIT_ID=%%i
if "%GIT_COMMIT_ID%" equ "%OLD_GIT_COMMIT_ID%" goto _IdGood
echo Generating updated .git-commit-id.h containing id %GIT_COMMIT_ID%
echo #define SIM_GIT_COMMIT_ID %GIT_COMMIT_ID% >.git-commit-id.h
if errorlevel 1 echo Retrying...
if errorlevel 1 goto _SetId
:_IdGood
:_done_id
goto :EOF
:WhereInPath
if "%~$PATH:1" NEQ "" exit /B 0
exit /B 1
:WhichInPath
if "%~$PATH:1" EQU "" exit /B 1
set %2=%~$PATH:1
exit /B 0
:FindVCVersion
call :WhichInPath cl.exe _VC_CL_
for /f "tokens=2-8 delims=\" %%a in ("%_VC_CL_%") do call :VCCheck _VC_VER_NUM_ "%%a" "%%b" "%%c" "%%d" "%%e" "%%f" "%%g"
for /f "delims=." %%a in ("%_VC_VER_NUM_%") do set %1=%%a
set _VC_CL=
exit /B 0
:VCCheck
set _VC_TMP=%1
:_VCCheck_Next
shift
set _VC_TMP_=%~1
if "%_VC_TMP_%" equ "" goto _VCCheck_Done
if "%_VC_TMP_:~0,24%" EQU "Microsoft Visual Studio " set %_VC_TMP%=%_VC_TMP_:Microsoft Visual Studio =%
goto _VCCheck_Next
:_VCCheck_Done
set _VC_TMP_=
set _VC_TMP=
exit /B 0