135 lines
5.7 KiB
Batchfile
135 lines
5.7 KiB
Batchfile
@echo off
|
|
setlocal EnableExtensions DisableDelayedExpansion
|
|
pushd "%~dp0" || exit /b 1
|
|
|
|
if not exist "sdktools\out\build.exe" (
|
|
call "sdktools\build.bat"
|
|
if errorlevel 1 goto :fail
|
|
)
|
|
rem BUILD scans includes separately from the NMAKE compiler flags.
|
|
set "INCLUDE=%CD%\code\public;%CD%\code\common\include;%INCLUDE%"
|
|
"sdktools\out\build.exe" %*
|
|
if errorlevel 1 goto :fail
|
|
if /I "%NTL_SKIP_VHD%"=="1" goto :done
|
|
|
|
for %%T in (mformat mdir mmd mcopy) do (
|
|
where %%T >nul 2>&1
|
|
if errorlevel 1 (
|
|
echo Missing mtools utility: %%T 1>&2
|
|
goto :fail
|
|
)
|
|
)
|
|
|
|
if exist "disk.vhd" (
|
|
call :ValidateVhd || goto :fail
|
|
) else (
|
|
call :CreateVhd || goto :fail
|
|
)
|
|
|
|
set "ESP=disk.vhd@@1M"
|
|
set "SYS=disk.vhd@@65M"
|
|
for %%D in (EFI EFI/BOOT EFI/NTLite EFI/NTLite/fs) do (
|
|
call :EnsureDir "%ESP%" "%%D" || goto :fail
|
|
)
|
|
for %%D in (apps system drivers) do (
|
|
call :EnsureDir "%SYS%" "%%D" || goto :fail
|
|
)
|
|
|
|
call :CopyFat "bin\bootx64.efi" "%ESP%" "EFI/BOOT/bootx64.efi" || goto :fail
|
|
call :CopyFat "code\boot.ini" "%ESP%" "boot.ini" || goto :fail
|
|
for %%F in ("code\boot\uefi\fs\*.efi") do (
|
|
if exist "%%~fF" (
|
|
call :CopyFat "%%~fF" "%ESP%" "EFI/NTLite/fs/%%~nxF" || goto :fail
|
|
)
|
|
)
|
|
|
|
call :CopyFat "bin\kernel.exe" "%SYS%" "system/colonel.exe" || goto :fail
|
|
for %%F in (
|
|
bin\hal.dll bin\syscall.dll bin\win32.dll bin\posix.dll
|
|
bin\init.exe bin\rssrv.exe bin\posixsrv.exe bin\dwm.exe
|
|
code\settings.ini code\services.ini
|
|
) do (
|
|
call :CopyFat "%%F" "%SYS%" "system/%%~nxF" || goto :fail
|
|
)
|
|
for %%F in (
|
|
bin\pci.sys bin\ps2.sys bin\hda.sys bin\ata.sys bin\ahci.sys
|
|
bin\fat.sys bin\ntfs.sys bin\ext4.sys bin\vmwaresvga.sys
|
|
bin\lwip.sys bin\usb.sys bin\acpi.sys bin\rtl816x.sys bin\rtl8139.sys
|
|
code\drivers.ini
|
|
) do (
|
|
call :CopyFat "%%F" "%SYS%" "drivers/%%~nxF" || goto :fail
|
|
)
|
|
call :CopyFat "bin\serial.sys" "%SYS%" "drivers/cereal.sys" || goto :fail
|
|
for %%F in (
|
|
bin\shell_win32.exe bin\shell_posix.exe bin\shell_native.exe
|
|
bin\edit.exe bin\httpget.exe bin\tcpserve.exe bin\udp.exe
|
|
bin\resolve.exe bin\ping.exe bin\doom.exe bin\video.exe bin\memtop.exe
|
|
) do (
|
|
call :CopyFat "%%F" "%SYS%" "apps/%%~nxF" || goto :fail
|
|
)
|
|
for %%F in (
|
|
code\user\apps\video\bink2w64.dll
|
|
code\user\apps\video\video.bk2
|
|
code\user\apps\doom\doom1.wad
|
|
) do (
|
|
if exist "%%F" (
|
|
call :CopyFat "%%F" "%SYS%" "apps/%%~nxF" || goto :fail
|
|
)
|
|
)
|
|
if /I "%NTL_WITH_TESTS%"=="1" (
|
|
call :EnsureDir "%SYS%" "tests" || goto :fail
|
|
for /D %%D in ("code\user\tests\*") do (
|
|
if exist "%%~fD\sources" (
|
|
call :CopyFat "bin\%%~nxD.exe" "%SYS%" "tests/%%~nxD.exe" || goto :fail
|
|
)
|
|
)
|
|
)
|
|
|
|
echo Updated disk.vhd
|
|
:done
|
|
popd
|
|
exit /b 0
|
|
|
|
:fail
|
|
echo Build or VHD packaging failed. 1>&2
|
|
popd
|
|
exit /b 1
|
|
|
|
:EnsureDir
|
|
mdir -i "%~1" "::%~2" >nul 2>&1
|
|
if not errorlevel 1 exit /b 0
|
|
mmd -i "%~1" "::%~2"
|
|
exit /b %errorlevel%
|
|
|
|
:CopyFat
|
|
if not exist "%~1" (
|
|
echo Missing build artifact: %~1 1>&2
|
|
exit /b 1
|
|
)
|
|
mcopy -o -i "%~2" "%~1" "::%~3"
|
|
exit /b %errorlevel%
|
|
|
|
:ValidateVhd
|
|
powershell -NoProfile -Command "$ErrorActionPreference='Stop'; $f=[IO.File]::OpenRead('disk.vhd'); try { $m=New-Object byte[] 512; if ($f.Length -ne 536871424 -or $f.Read($m,0,512) -ne 512) {throw 'Unexpected VHD size'}; if ([BitConverter]::ToUInt32($m,440) -ne 0x4E544C31 -or $m[510] -ne 85 -or $m[511] -ne 170) {throw 'Unexpected disk signature'}; if ([BitConverter]::ToUInt32($m,454) -ne 2048 -or [BitConverter]::ToUInt32($m,458) -ne 131072 -or [BitConverter]::ToUInt32($m,470) -ne 133120 -or [BitConverter]::ToUInt32($m,474) -ne 524288) {throw 'Unexpected partition layout'}; $f.Position=536870912; $v=New-Object byte[] 512; if ($f.Read($v,0,512) -ne 512 -or [Text.Encoding]::ASCII.GetString($v,0,8) -ne 'conectix') {throw 'Invalid VHD footer'} } finally {$f.Dispose()}"
|
|
exit /b %errorlevel%
|
|
|
|
:CreateVhd
|
|
if exist "disk.vhd.new" (
|
|
echo disk.vhd.new already exists; resolve it before initializing a disk. 1>&2
|
|
exit /b 1
|
|
)
|
|
echo Creating 512 MiB fixed VHD...
|
|
powershell -NoProfile -Command "$ErrorActionPreference='Stop'; function Be([byte[]]$a,[int]$o,[uint64]$v,[int]$n) {for($i=0;$i -lt $n;$i++) {$a[$o+$i]=[byte](($v -shr (8*($n-$i-1))) -band 255)}}; $s=[IO.File]::Open('disk.vhd.new',[IO.FileMode]::CreateNew,[IO.FileAccess]::ReadWrite); try { $s.SetLength(536871424); $m=New-Object byte[] 512; [BitConverter]::GetBytes([uint32]0x4E544C31).CopyTo($m,440); $m[510]=85; $m[511]=170; [byte[]]$p=0x80,0,2,0,12,254,255,255; [Array]::Copy($p,0,$m,446,8); [BitConverter]::GetBytes([uint32]2048).CopyTo($m,454); [BitConverter]::GetBytes([uint32]131072).CopyTo($m,458); [byte[]]$p=0,0,1,8,12,254,255,255; [Array]::Copy($p,0,$m,462,8); [BitConverter]::GetBytes([uint32]133120).CopyTo($m,470); [BitConverter]::GetBytes([uint32]524288).CopyTo($m,474); $s.Write($m,0,512); $v=New-Object byte[] 512; [Text.Encoding]::ASCII.GetBytes('conectix').CopyTo($v,0); $v[11]=2; $v[13]=1; for($i=16;$i -lt 24;$i++) {$v[$i]=255}; [Text.Encoding]::ASCII.GetBytes('qemu').CopyTo($v,28); $v[33]=2; [Text.Encoding]::ASCII.GetBytes('Wi2k').CopyTo($v,36); Be $v 40 ([uint64]536870912) 8; Be $v 48 ([uint64]536870912) 8; $v[56]=4; $v[58]=16; $v[59]=63; $v[63]=2; [byte[]]$id=0xA1,0xB2,0xC3,0xD4,0xE5,0xF6,0x78,0x90,0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0; [Array]::Copy($id,0,$v,68,16); $sum=0; foreach($b in $v) {$sum+=$b}; Be $v 64 ([uint64]([uint32]::MaxValue - [uint32]$sum)) 4; $s.Position=536870912; $s.Write($v,0,512) } finally {$s.Dispose()}"
|
|
if errorlevel 1 goto :CreateFailed
|
|
mformat -i "disk.vhd.new@@1M" -F -T 131072 -H 2048
|
|
if errorlevel 1 goto :CreateFailed
|
|
mformat -i "disk.vhd.new@@65M" -F -T 524288 -H 133120
|
|
if errorlevel 1 goto :CreateFailed
|
|
move /y "disk.vhd.new" "disk.vhd" >nul
|
|
if errorlevel 1 goto :CreateFailed
|
|
exit /b 0
|
|
|
|
:CreateFailed
|
|
if exist "disk.vhd.new" del /q "disk.vhd.new"
|
|
exit /b 1
|