-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathbuild.bat
More file actions
472 lines (409 loc) · 14.1 KB
/
build.bat
File metadata and controls
472 lines (409 loc) · 14.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
@echo off
:: ================================================================
:: KSDOS Complete Build System (Windows)
:: Builds bootloader, kernel, SDK, games, and creates bootable media
:: ================================================================
setlocal enabledelayedexpansion
:: Build configuration
set BUILD_DIR=build
set DIST_DIR=dist
set KERNEL_VERSION=1.0.0
set BUILD_DATE=%date:~-4,4%%date:~-10,2%%date:~-7,2%
:: Colors (limited in Windows batch)
set INFO=[INFO]
set SUCCESS=[SUCCESS]
set WARNING=[WARNING]
set ERROR=[ERROR]
:: Function to print status
echo %INFO% KSDOS Build System v%KERNEL_VERSION%
echo ==================================
:: Check if we're in the right directory
if not exist "bootloader\core\core.c" (
echo %ERROR% Please run this script from the KSDOS root directory
exit /b 1
)
:: Parse command line arguments
set TARGET=%1
if "%TARGET%"=="" set TARGET=all
:: Main build logic
if "%TARGET%"=="clean" goto :clean
if "%TARGET%"=="bootloader" goto :bootloader
if "%TARGET%"=="kernel" goto :kernel
if "%TARGET%"=="sdks" goto :sdks
if "%TARGET%"=="games" goto :games
if "%TARGET%"=="media" goto :media
if "%TARGET%"=="tests" goto :tests
if "%TARGET%"=="package" goto :package
if "%TARGET%"=="all" goto :all
if "%TARGET%"=="help" goto :help
if "%TARGET%"=="-h" goto :help
if "%TARGET%"=="--help" goto :help
echo %ERROR% Unknown option: %TARGET%
goto :help
:help
echo KSDOS Build System
echo ==================
echo Usage: %0 [options]
echo.
echo Options:
echo clean Clean build directory
echo bootloader Build bootloader only
echo kernel Build kernel only
echo sdks Setup SDKs only
echo games Build games only
echo media Create bootable media only
echo tests Run tests only
echo package Create distribution package
echo all Build everything (default)
echo help Show this help
echo.
echo Examples:
echo %0 # Build everything
echo %0 clean # Clean build
echo %0 bootloader # Build bootloader only
echo %0 package # Create distribution package
goto :end
:clean
echo %INFO% Cleaning previous build...
if exist "%BUILD_DIR%" rmdir /s /q "%BUILD_DIR%"
if exist "%DIST_DIR%" rmdir /s /q "%DIST_DIR%"
if exist *.img del /q *.img
if exist *.iso del /q *.iso
if exist *.bin del /q *.bin
echo %SUCCESS% Build directory cleaned
goto :end
:bootloader
echo %INFO% Building bootloader...
call :create_directories
call :build_bootloader
goto :end
:kernel
echo %INFO% Building kernel...
call :create_directories
call :build_bootloader
goto :end
:sdks
echo %INFO% Setting up SDKs...
call :create_directories
call :setup_sdks
goto :end
:games
echo %INFO% Building games...
call :create_directories
call :setup_sdks
call :build_games
goto :end
:media
echo %INFO% Creating bootable media...
call :create_directories
call :create_bootable_media
goto :end
:tests
echo %INFO% Running tests...
call :run_tests
goto :end
:package
echo %INFO% Creating distribution package...
call :create_directories
call :create_package
goto :end
:all
echo %INFO% Starting complete build...
call :check_dependencies
call :clean_build
call :create_directories
call :build_bootloader
call :setup_sdks
call :build_games
call :create_bootable_media
call :run_tests
call :generate_report
call :create_package
echo.
echo %SUCCESS% Build completed successfully!
echo.
echo Build artifacts:
if exist "%DIST_DIR%\ksdos.img" echo - Floppy image: %DIST_DIR%\ksdos.img
if exist "%DIST_DIR%\ks-dos.iso" echo - CD-ROM ISO: %DIST_DIR%\ks-dos.iso
if exist "%DIST_DIR%\ksdos-hd.img" echo - Hard disk: %DIST_DIR%\ksdos-hd.img
if exist "%DIST_DIR%\ksdos-%KERNEL_VERSION%-%BUILD_DATE%.zip" echo - Package: %DIST_DIR%\ksdos-%KERNEL_VERSION%-%BUILD_DATE%.zip
echo.
echo To test:
echo qemu-system-i386 -drive format=raw,file=%DIST_DIR%\ksdos.img -boot a
echo qemu-system-i386 -cdrom %DIST_DIR%\ks-dos.iso -boot d
goto :end
:: Function implementations
:check_dependencies
echo %INFO% Checking build dependencies...
where nasm >nul 2>&1
if errorlevel 1 (
echo %ERROR% NASM not found. Please install NASM.
exit /b 1
)
where gcc >nul 2>&1
if errorlevel 1 (
echo %ERROR% GCC not found. Please install GCC.
exit /b 1
)
where ld >nul 2>&1
if errorlevel 1 (
echo %ERROR% LD not found. Please install binutils.
exit /b 1
)
echo %SUCCESS% All dependencies found
goto :eof
:clean_build
echo %INFO% Cleaning previous build...
if exist "%BUILD_DIR%" rmdir /s /q "%BUILD_DIR%"
if exist "%DIST_DIR%" rmdir /s /q "%DIST_DIR%"
if exist *.img del /q *.img
if exist *.iso del /q *.iso
if exist *.bin del /q *.bin
echo %SUCCESS% Build directory cleaned
goto :eof
:create_directories
echo %INFO% Creating build directories...
if not exist "%BUILD_DIR%\bootloader\boot" mkdir "%BUILD_DIR%\bootloader\boot"
if not exist "%BUILD_DIR%\bootloader\core" mkdir "%BUILD_DIR%\bootloader\core"
if not exist "%BUILD_DIR%\sdk\psyq\bin" mkdir "%BUILD_DIR%\sdk\psyq\bin"
if not exist "%BUILD_DIR%\sdk\psyq\lib" mkdir "%BUILD_DIR%\sdk\psyq\lib"
if not exist "%BUILD_DIR%\sdk\psyq\include" mkdir "%BUILD_DIR%\sdk\psyq\include"
if not exist "%BUILD_DIR%\sdk\gold4\bin" mkdir "%BUILD_DIR%\sdk\gold4\bin"
if not exist "%BUILD_DIR%\sdk\gold4\lib" mkdir "%BUILD_DIR%\sdk\gold4\lib"
if not exist "%BUILD_DIR%\sdk\gold4\include" mkdir "%BUILD_DIR%\sdk\gold4\include"
if not exist "%BUILD_DIR%\games\psx\bin" mkdir "%BUILD_DIR%\games\psx\bin"
if not exist "%BUILD_DIR%\games\psx\build" mkdir "%BUILD_DIR%\games\psx\build"
if not exist "%BUILD_DIR%\games\doom\bin" mkdir "%BUILD_DIR%\games\doom\bin"
if not exist "%BUILD_DIR%\games\doom\build" mkdir "%BUILD_DIR%\games\doom\build"
if not exist "%DIST_DIR%" mkdir "%DIST_DIR%"
echo %SUCCESS% Build directories created
goto :eof
:build_bootloader
echo %INFO% Building bootloader...
:: Build stage 1 bootloader
echo %INFO% Building stage 1 bootloader (boot.asm)...
nasm -f bin bootloader\boot\boot.asm -o %BUILD_DIR%\bootloader\boot.bin
if errorlevel 1 (
echo %ERROR% Failed to build stage 1 bootloader
exit /b 1
)
:: Build setup code
echo %INFO% Building setup code (setup.asm)...
nasm -f bin bootloader\core\setup.asm -o %BUILD_DIR%\bootloader\core\early.bin
if errorlevel 1 (
echo %ERROR% Failed to build setup code
exit /b 1
)
:: Build core kernel
echo %INFO% Building core kernel...
nasm -f elf32 bootloader\core\entry.s -o %BUILD_DIR%\bootloader\core\entry.o
:: Compile C sources
gcc -Wall -Wextra -ffreestanding -fno-pic -m32 -c bootloader\core\core.c -o %BUILD_DIR%\bootloader\core\core.o
gcc -Wall -Wextra -ffreestanding -fno-pic -m32 -c bootloader\core\ksdos-sdk.c -o %BUILD_DIR%\bootloader\core\ksdos-sdk.o
gcc -Wall -Wextra -ffreestanding -fno-pic -m32 -c bootloader\core\game-loader.c -o %BUILD_DIR%\bootloader\core\game-loader.o
gcc -Wall -Wextra -ffreestanding -fno-pic -m32 -c bootloader\core\opengl.c -o %BUILD_DIR%\bootloader\core\opengl.o
gcc -Wall -Wextra -ffreestanding -fno-pic -m32 -c bootloader\core\gl-hardware.c -o %BUILD_DIR%\bootloader\core\gl-hardware.o
gcc -Wall -Wextra -ffreestanding -fno-pic -m32 -c bootloader\core\gl-context.c -o %BUILD_DIR%\bootloader\core\gl-context.o
gcc -Wall -Wextra -ffreestanding -fno-pic -m32 -c bootloader\core\gl-demos.c -o %BUILD_DIR%\bootloader\core\gl-demos.o
gcc -Wall -Wextra -ffreestanding -fno-pic -m32 -c bootloader\core\msdos.c -o %BUILD_DIR%\bootloader\core\msdos.o
gcc -Wall -Wextra -ffreestanding -fno-pic -m32 -c bootloader\core\filesystem.c -o %BUILD_DIR%\bootloader\core\filesystem.o
gcc -Wall -Wextra -ffreestanding -fno-pic -m32 -c bootloader\core\system.c -o %BUILD_DIR%\bootloader\core\system.o
if errorlevel 1 (
echo %ERROR% Failed to compile core kernel
exit /b 1
)
:: Link kernel
ld -T bootloader\core\linker.ld -m elf_i386 ^
%BUILD_DIR%\bootloader\core\entry.o ^
%BUILD_DIR%\bootloader\core\core.o ^
%BUILD_DIR%\bootloader\core\ksdos-sdk.o ^
%BUILD_DIR%\bootloader\core\game-loader.o ^
%BUILD_DIR%\bootloader\core\opengl.o ^
%BUILD_DIR%\bootloader\core\gl-hardware.o ^
%BUILD_DIR%\bootloader\core\gl-context.o ^
%BUILD_DIR%\bootloader\core\gl-demos.o ^
%BUILD_DIR%\bootloader\core\msdos.o ^
%BUILD_DIR%\bootloader\core\filesystem.o ^
%BUILD_DIR%\bootloader\core\system.o ^
-o %BUILD_DIR%\bootloader\core\after.bin
if errorlevel 1 (
echo %ERROR% Failed to link kernel
exit /b 1
)
:: Create final boot image
copy /b %BUILD_DIR%\bootloader\core\early.bin + %BUILD_DIR%\bootloader\core\after.bin %BUILD_DIR%\boot.bin >nul
:: Truncate to 5KB (5120 bytes)
powershell -Command "Get-Content '%BUILD_DIR%\boot.bin' | Set-Content -Encoding Byte '%BUILD_DIR%\boot.bin' -Force"
powershell -Command "$file = Get-Content '%BUILD_DIR%\boot.bin' -Raw -Encoding Byte; $file = $file[0..5119]; Set-Content -Encoding Byte '%BUILD_DIR%\boot.bin' -Value $file"
echo %SUCCESS% Bootloader built successfully
goto :eof
:setup_sdks
echo %INFO% Setting up SDKs...
:: Create SDK directories
if not exist "%BUILD_DIR%\sdk\psyq\bin" mkdir "%BUILD_DIR%\sdk\psyq\bin"
if not exist "%BUILD_DIR%\sdk\psyq\lib" mkdir "%BUILD_DIR%\sdk\psyq\lib"
if not exist "%BUILD_DIR%\sdk\psyq\include" mkdir "%BUILD_DIR%\sdk\psyq\include"
if not exist "%BUILD_DIR%\sdk\gold4\bin" mkdir "%BUILD_DIR%\sdk\gold4\bin"
if not exist "%BUILD_DIR%\sdk\gold4\lib" mkdir "%BUILD_DIR%\sdk\gold4\lib"
if not exist "%BUILD_DIR%\sdk\gold4\include" mkdir "%BUILD_DIR%\sdk\gold4\include"
:: Create dummy SDK files
echo. > "%BUILD_DIR%\sdk\psyq\bin\mipsel-none-elf-gcc.exe"
echo. > "%BUILD_DIR%\sdk\psyq\bin\mipsel-none-elf-ld.exe"
echo. > "%BUILD_DIR%\sdk\psyq\lib\libps.a"
echo. > "%BUILD_DIR%\sdk\psyq\include\psx.h"
echo. > "%BUILD_DIR%\sdk\psyq\include\libps.h"
echo. > "%BUILD_DIR%\sdk\gold4\bin\djgpp-gcc.exe"
echo. > "%BUILD_DIR%\sdk\gold4\bin\ld.gold.exe"
echo. > "%BUILD_DIR%\sdk\gold4\lib\libgold4.a"
echo. > "%BUILD_DIR%\sdk\gold4\include\gold4.h"
echo. > "%BUILD_DIR%\sdk\gold4\include\djgpp.h"
echo %SUCCESS% SDKs setup completed
goto :eof
:build_games
echo %INFO% Building games...
:: Build PS1 game
echo %INFO% Building PS1 game...
cd games\psx
if exist Makefile (
make clean >nul 2>&1
make
)
cd ..\..
:: Build DOOM game
echo %INFO% Building DOOM game...
cd games\doom
if exist Makefile (
make clean >nul 2>&1
make
)
cd ..\..
echo %SUCCESS% Games built successfully
goto :eof
:create_bootable_media
echo %INFO% Creating bootable media...
:: Create floppy image
echo %INFO% Creating 1.44MB floppy image...
fsutil file createnew %DIST_DIR%\ksdos.img 1474560
copy /b %BUILD_DIR%\boot.bin %DIST_DIR%\ksdos.img >nul
:: Create CD-ROM ISO
echo %INFO% Creating CD-ROM ISO...
if not exist "%DIST_DIR%\iso" mkdir "%DIST_DIR%\iso"
copy %BUILD_DIR%\boot.bin %DIST_DIR%\iso\ >nul
xcopy /E /I /Q games %DIST_DIR%\iso\games >nul
xcopy /E /I /Q sdk %DIST_DIR%\iso\sdk >nul
copy README*.md %DIST_DIR%\iso\ >nul
:: Create ISO (requires special tools)
echo %WARNING% ISO creation requires mkisofs or similar tools
echo %WARNING% Skipping ISO creation
:: Create hard disk image
echo %INFO% Creating 20MB hard disk image...
fsutil file createnew %DIST_DIR%\ksdos-hd.img 20971520
copy /b %BUILD_DIR%\boot.bin %DIST_DIR%\ksdos-hd.img >nul
echo %SUCCESS% Bootable media created
goto :eof
:run_tests
echo %INFO% Running tests...
:: Test kernel compilation
if exist "%BUILD_DIR%\boot.bin" (
echo %SUCCESS% Kernel compilation test passed
) else (
echo %ERROR% Kernel compilation test failed
exit /b 1
)
:: Test boot image creation
if exist "%DIST_DIR%\ksdos.img" (
echo %SUCCESS% Boot image creation test passed
) else (
echo %ERROR% Boot image creation test failed
exit /b 1
)
echo %SUCCESS% All tests passed
goto :eof
:generate_report
echo %INFO% Generating build report...
set REPORT_FILE=%DIST_DIR%\build-report-%BUILD_DATE%.txt
(
echo KSDOS Build Report
echo ==================
echo Build Date: %date% %time%
echo Kernel Version: %KERNEL_VERSION%
echo Build Host: %COMPUTERNAME%
echo.
echo Build Artifacts:
echo - Boot Image: ksdos.img
echo - Hard Disk: ksdos-hd.img
echo.
echo Components Built:
echo - Bootloader: Stage 1 + Stage 2
echo - Kernel: Core with OpenGL, MS-DOS, Filesystem, System Management
echo - SDKs: PSYq ^(PS1^), GOLD4 ^(DOOM^)
echo - Games: PS1 Demo, DOOM Demo
echo.
echo Features:
echo - OpenGL 1.5 Real Implementation
echo - MS-DOS 6.22 Compatible Commands
echo - FAT12/16/32 File System
echo - Hardware Acceleration
echo - Multi-Context OpenGL
echo - Real System Management
echo - Virtual Disk Support
echo - Boot Menu System
echo.
echo Build Configuration:
echo - Target: i386 32-bit
echo - Compiler: GCC
echo - Assembler: NASM
echo - Linker: GNU LD
echo.
) > %REPORT_FILE%
echo %SUCCESS% Build report generated: %REPORT_FILE%
goto :eof
:create_package
echo %INFO% Creating distribution package...
set PACKAGE_NAME=ksdos-%KERNEL_VERSION%-%BUILD_DATE%
set PACKAGE_DIR=%DIST_DIR%\%PACKAGE_NAME%
if not exist "%PACKAGE_DIR%" mkdir "%PACKAGE_DIR%"
:: Copy essential files
copy %DIST_DIR%\*.img %PACKAGE_DIR%\ >nul
copy README*.md %PACKAGE_DIR%\ >nul
xcopy /E /I /Q bootloader %PACKAGE_DIR%\bootloader >nul
xcopy /E /I /Q sdk %PACKAGE_DIR%\sdk >nul
xcopy /E /I /Q games %PACKAGE_DIR%\games >nul
copy build.sh %PACKAGE_DIR%\ >nul
copy create-bootable.sh %PACKAGE_DIR%\ >nul
:: Create package info
(
echo KSDOS - Complete MS-DOS Compatible Operating System
echo Version: %KERNEL_VERSION%
echo Build Date: %date%
echo Package: %PACKAGE_NAME%
echo.
echo Installation:
echo 1. Use ksdos.img for floppy boot
echo 2. Use ks-dos.iso for CD-ROM boot
echo 3. Use ksdos-hd.img for hard disk boot
echo.
echo Testing:
echo qemu-system-i386 -drive format=raw,file=ksdos.img -boot a
echo qemu-system-i386 -cdrom ks-dos.iso -boot d
echo.
echo Features:
echo - Complete MS-DOS 6.22 compatibility
echo - OpenGL 1.5 real implementation
echo - Hardware acceleration support
echo - FAT12/16/32 file system
echo - PS1 and DOOM SDK integration
echo - Real system management
echo - Multi-context OpenGL rendering
echo - Boot menu system
echo - Virtual disk support
echo.
) > %PACKAGE_DIR%\PACKAGE_INFO.txt
:: Create ZIP package
powershell -Command "Compress-Archive -Path '%PACKAGE_DIR%' -DestinationPath '%DIST_DIR%\%PACKAGE_NAME%.zip' -Force"
echo %SUCCESS% Package created: %DIST_DIR%\%PACKAGE_NAME%.zip
goto :eof
:end
echo.
echo Build completed. Press any key to exit...
pause >nul