build.sh (18348B)
1 #!/bin/bash 2 3 set -e # Exit on error 4 5 # Check if we need two-pass build (to embed kernel for installer) 6 TWO_PASS_BUILD=0 7 if [ ! -f build/kernel_install.bin ]; then 8 TWO_PASS_BUILD=1 9 fi 10 11 do_build() { 12 local PASS=$1 13 if [ "$TWO_PASS_BUILD" = "1" ]; then 14 echo "=== LuaJIT OS Build Script (Pass $PASS of 2) ===" 15 else 16 echo "=== LuaJIT OS Build Script ===" 17 fi 18 19 # Configuration 20 CROSS_COMPILE=i686-elf- 21 CC="${CROSS_COMPILE}gcc" 22 AS="${CROSS_COMPILE}as" 23 LD="${CROSS_COMPILE}ld" 24 OBJCOPY="${CROSS_COMPILE}objcopy" 25 26 # Check if cross-compiler exists, fallback to native compiler 27 if ! command -v ${CC} &> /dev/null; then 28 echo "Warning: Cross-compiler not found, using native compiler" 29 CC="gcc" 30 AS="as" 31 LD="ld" 32 OBJCOPY="objcopy" 33 CROSS_COMPILE="" 34 fi 35 36 # Compiler flags 37 # Use our custom headers first, then system headers 38 CFLAGS="-std=gnu99 -ffreestanding -O2 -Wall -Wextra -Wno-unused-function -Wno-unused-const-variable -Wno-unused-variable -m32 -fno-pie -fno-stack-protector -I./include" 39 LDFLAGS="-m elf_i386 -nostdlib -static" 40 41 # Create build directory 42 mkdir -p build 43 mkdir -p isodir/boot/grub 44 45 echo "Step 1: Compiling boot.s..." 46 ${AS} --32 boot.s -o build/boot.o 47 48 echo "Step 1b: Compiling syscall.s..." 49 ${AS} --32 syscall.s -o build/syscall.o 50 51 echo "Step 1c: Compiling exceptions.s..." 52 ${AS} --32 exceptions.s -o build/exceptions.o 53 54 echo "Step 1c: Compiling Lua files to 32-bit bytecode..." 55 # Compile all .lua files to .luac bytecode using -bW for 32-bit compatibility 56 if command -v luajit &> /dev/null; then 57 find iso_includes -name "*.lua" | while read lua_file; do 58 luac_file="${lua_file}c" 59 # Only recompile if .lua is newer than .luac or .luac doesn't exist 60 if [ ! -f "$luac_file" ] || [ "$lua_file" -nt "$luac_file" ]; then 61 echo " Compiling: $lua_file" 62 luajit -bW "$lua_file" "$luac_file" 2>/dev/null || true 63 fi 64 done 65 echo " Bytecode compilation complete" 66 else 67 echo "Warning: luajit not found, skipping bytecode compilation" 68 fi 69 70 echo "Step 1d: Generating ramdisk from iso_includes..." 71 if [ -d iso_includes ]; then 72 # Remove any previously embedded kernel to prevent recursive embedding 73 rm -rf iso_includes/os/boot 74 75 # If we have a FIRST-PASS kernel (built without embedded kernel), include it 76 # This is the kernel that gets copied to the boot partition during installation 77 if [ -f build/kernel_install.bin ]; then 78 mkdir -p iso_includes/os/boot 79 cp build/kernel_install.bin iso_includes/os/boot/kernel.bin 80 echo " Including install kernel ($(stat -c%s build/kernel_install.bin 2>/dev/null || stat -f%z build/kernel_install.bin 2>/dev/null || echo '?') bytes)" 81 fi 82 83 luajit pack_ramdisk.lua iso_includes packed.bin 84 if [ $? -ne 0 ]; then 85 echo "Error: Failed to generate ramdisk" 86 exit 1 87 fi 88 else 89 echo "Warning: iso_includes directory not found, skipping ramdisk generation" 90 fi 91 92 echo "Step 2: Converting packed.bin to object file..." 93 if [ -f packed.bin ]; then 94 ${OBJCOPY} -I binary -O elf32-i386 -B i386 \ 95 --rename-section .data=.rodata,alloc,load,readonly,data,contents \ 96 packed.bin build/packed.o 97 echo "Embedded packed.bin ($(stat -c%s packed.bin 2>/dev/null || stat -f%z packed.bin 2>/dev/null || echo '?') bytes)" 98 else 99 echo "Warning: packed.bin not found, creating empty ramdisk" 100 touch build/empty_ramdisk.bin 101 ${OBJCOPY} -I binary -O elf32-i386 -B i386 \ 102 --rename-section .data=.rodata,alloc,load,readonly,data,contents \ 103 build/empty_ramdisk.bin build/packed.o 104 fi 105 106 echo "Step 3: Compiling libc.c..." 107 ${CC} ${CFLAGS} -c libc.c -o build/libc.o 108 109 echo "Step 3b: Compiling paging.c..." 110 ${CC} ${CFLAGS} -c paging.c -o build/paging.o 111 112 echo "Step 4: Finding LuaJIT headers..." 113 # Try to find LuaJIT include path 114 LUAJIT_INCLUDE="" 115 if [ -d "/usr/include/luajit-2.1" ]; then 116 LUAJIT_INCLUDE="-I/usr/include/luajit-2.1" 117 elif [ -d "/usr/local/include/luajit-2.1" ]; then 118 LUAJIT_INCLUDE="-I/usr/local/include/luajit-2.1" 119 elif [ -d "/usr/include/luajit-2.0" ]; then 120 LUAJIT_INCLUDE="-I/usr/include/luajit-2.0" 121 else 122 echo "Warning: LuaJIT headers not found, trying pkg-config..." 123 if command -v pkg-config &> /dev/null; then 124 LUAJIT_INCLUDE=$(pkg-config --cflags luajit 2>/dev/null || echo "") 125 fi 126 fi 127 128 if [ -z "$LUAJIT_INCLUDE" ]; then 129 echo "ERROR: Could not find LuaJIT headers!" 130 echo "Please install LuaJIT development files:" 131 echo " Ubuntu/Debian: sudo apt-get install libluajit-5.1-dev" 132 echo " Arch: sudo pacman -S luajit" 133 echo " Fedora: sudo dnf install luajit-devel" 134 exit 1 135 fi 136 137 echo "Step 4b: Compiling graphics.c..." 138 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c graphics.c -o build/graphics.o 139 140 echo "Step 4c: Compiling vesa.c..." 141 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c vesa.c -o build/vesa.o 142 143 echo "Step 4c2: Compiling mouse.c..." 144 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c mouse.c -o build/mouse.o 145 146 echo "Step 4c2b: Compiling usb_uhci.c..." 147 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c usb_uhci.c -o build/usb_uhci.o 148 149 echo "Step 4c3: Compiling keyboard.c..." 150 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c keyboard.c -o build/keyboard.o 151 152 echo "Step 4c4: Compiling ata.c..." 153 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c ata.c -o build/ata.o 154 155 echo "Step 4c5: Compiling fde.c..." 156 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -I./crypto -I./crypto/hashing ${CRYPTO_SSE_FLAGS} -c fde.c -o build/fde.o 157 158 echo "Step 4c6: Compiling diskfs.c..." 159 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c diskfs.c -o build/diskfs.o 160 161 echo "Step 4c7: Compiling partition.c..." 162 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c partition.c -o build/partition.o 163 164 echo "Step 4c8: Compiling fat16.c..." 165 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c fat16.c -o build/fat16.o 166 167 echo "Step 4c9: Compiling grub.c..." 168 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c grub.c -o build/grub.o 169 170 echo "Step 4d: Compiling decoder.c..." 171 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c decoder.c -o build/decoder.o 172 173 echo "Step 4e: Compiling decoder_BMP.c..." 174 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c decoder_BMP.c -o build/decoder_BMP.o 175 176 echo "Step 4f: Compiling decoder_PNG.c..." 177 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c decoder_PNG.c -o build/decoder_PNG.o 178 179 echo "Step 4f1: Compiling decoder_JPEG.c..." 180 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c decoder_JPEG.c -o build/decoder_JPEG.o 181 182 echo "Step 4f1b: Compiling encoder_JPEG.c..." 183 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c encoder_JPEG.c -o build/encoder_JPEG.o 184 185 echo "Step 4f2: Compiling splash.c..." 186 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c splash.c -o build/splash.o 187 188 echo "Step 4g: Compiling compression/compression.c..." 189 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c compression/compression.c -o build/compression.o 190 191 echo "Step 4h: Compiling compression/deflate_impl.c..." 192 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c compression/deflate_impl.c -o build/deflate_impl.o 193 194 echo "Step 4i: Compiling compression/Deflate.c..." 195 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c compression/Deflate.c -o build/Deflate.o 196 197 echo "Step 4j: Compiling compression/LZMA.c..." 198 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c compression/LZMA.c -o build/LZMA.o 199 200 echo "Step 4k: Compiling compression/GZip.c..." 201 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c compression/GZip.c -o build/GZip.o 202 203 echo "Step 4k2: Compiling compression/zlib.c..." 204 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c compression/zlib.c -o build/zlib.o 205 206 echo "Step 4l: Compiling ramdisk.c..." 207 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c ramdisk.c -o build/ramdisk.o 208 209 echo "Step 4m: Compiling luajit_init.c..." 210 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c luajit_init.c -o build/luajit_init.o 211 212 echo "Step 4n: Compiling kernel.c..." 213 ${CC} ${CFLAGS} ${LUAJIT_INCLUDE} -c kernel.c -o build/kernel.o 214 215 echo "Step 4o: Compiling crypto_baremetal.c..." 216 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto -c crypto_baremetal.c -o build/crypto_baremetal.o 217 218 echo "Step 4p: Compiling crypto library..." 219 # Core crypto implementations 220 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto ${LUAJIT_INCLUDE} -c crypto/base64.c -o build/base64.o 221 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto ${LUAJIT_INCLUDE} -c crypto/CSPRNG.c -o build/CSPRNG.o 222 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto ${LUAJIT_INCLUDE} -c crypto/Ed25519.c -o build/Ed25519.o 223 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto ${LUAJIT_INCLUDE} -c crypto/X25519.c -o build/X25519.o 224 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto ${LUAJIT_INCLUDE} -c crypto/Curve25519.c -o build/Curve25519.o 225 226 # Symmetric encryption implementations 227 # These need SSE flags for SIMD intrinsics used in GCM mode 228 CRYPTO_SSE_FLAGS="-maes -msse2 -mssse3 -msse4.1 -mpclmul" 229 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto ${LUAJIT_INCLUDE} ${CRYPTO_SSE_FLAGS} -c crypto/AES-256-GCM.c -o build/AES-256-GCM.o 230 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto ${LUAJIT_INCLUDE} ${CRYPTO_SSE_FLAGS} -c crypto/AES-128-GCM.c -o build/AES-128-GCM.o 231 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto ${LUAJIT_INCLUDE} -c crypto/ChaCha20-Poly1305.c -o build/ChaCha20-Poly1305.o 232 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto ${LUAJIT_INCLUDE} -c crypto/XChaCha20-Poly1305.c -o build/XChaCha20-Poly1305.o 233 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto ${LUAJIT_INCLUDE} ${CRYPTO_SSE_FLAGS} -c crypto/Serpent-256-GCM.c -o build/Serpent-256-GCM.o 234 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto ${LUAJIT_INCLUDE} ${CRYPTO_SSE_FLAGS} -c crypto/Twofish-256-GCM.c -o build/Twofish-256-GCM.o 235 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto ${LUAJIT_INCLUDE} -c crypto/Salsa20-Poly1305.c -o build/Salsa20-Poly1305.o 236 237 # Key derivation 238 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto ${LUAJIT_INCLUDE} -c crypto/PBKDF2.c -o build/PBKDF2.o 239 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto ${LUAJIT_INCLUDE} -c crypto/Argon2.c -o build/Argon2.o 240 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto ${LUAJIT_INCLUDE} -c crypto/HKDF.c -o build/HKDF.o 241 242 # Stubs for unimplemented functions 243 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto ${LUAJIT_INCLUDE} -c crypto/stubs.c -o build/stubs.o 244 245 # RSA and P256 246 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto ${LUAJIT_INCLUDE} -c crypto/RSA.c -o build/RSA.o 247 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto ${LUAJIT_INCLUDE} -c crypto/P256.c -o build/P256.o 248 249 # Post-quantum cryptography (CRYSTALS) 250 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto ${LUAJIT_INCLUDE} -c crypto/Kyber.c -o build/Kyber.o 251 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto ${LUAJIT_INCLUDE} -c crypto/Dilithium.c -o build/Dilithium.o 252 253 # Hash implementations 254 ${CC} ${CFLAGS} -DBARE_METAL -DLIB_MODE -I./crypto ${LUAJIT_INCLUDE} -c crypto/hashing/hash.c -o build/hash.o 255 ${CC} ${CFLAGS} -DBARE_METAL -DLIB_MODE -I./crypto ${LUAJIT_INCLUDE} -c crypto/hashing/MD5.c -o build/MD5.o 256 ${CC} ${CFLAGS} -DBARE_METAL -DLIB_MODE -I./crypto ${LUAJIT_INCLUDE} -c crypto/hashing/SHA1.c -o build/SHA1.o 257 ${CC} ${CFLAGS} -DBARE_METAL -DLIB_MODE -I./crypto ${LUAJIT_INCLUDE} -c crypto/hashing/SHA256.c -o build/SHA256.o 258 ${CC} ${CFLAGS} -DBARE_METAL -DLIB_MODE -I./crypto ${LUAJIT_INCLUDE} -c crypto/hashing/SHA3.c -o build/SHA3.o 259 ${CC} ${CFLAGS} -DBARE_METAL -DLIB_MODE -I./crypto ${LUAJIT_INCLUDE} -c crypto/hashing/BLAKE2.c -o build/BLAKE2.o 260 261 echo "Step 4q: Compiling crypto Lua bindings..." 262 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto -I./crypto/hashing ${LUAJIT_INCLUDE} -c crypto/CSPRNG_Lua.c -o build/CSPRNG_Lua.o 263 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto -I./crypto/hashing ${LUAJIT_INCLUDE} -c crypto/Ed25519_Lua.c -o build/Ed25519_Lua.o 264 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto -I./crypto/hashing ${LUAJIT_INCLUDE} -c crypto/X25519_Lua.c -o build/X25519_Lua.o 265 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto -I./crypto/hashing ${LUAJIT_INCLUDE} -c crypto/Hash_Lua.c -o build/Hash_Lua.o 266 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto -I./crypto/hashing ${LUAJIT_INCLUDE} -c crypto/PBKDF2_Lua.c -o build/PBKDF2_Lua.o 267 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto -I./crypto/hashing ${LUAJIT_INCLUDE} -c crypto/RSA_Lua.c -o build/RSA_Lua.o 268 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto -I./crypto/hashing ${LUAJIT_INCLUDE} -c crypto/P256_Lua.c -o build/P256_Lua.o 269 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto -I./crypto/hashing ${LUAJIT_INCLUDE} -c crypto/Kyber_Lua.c -o build/Kyber_Lua.o 270 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto -I./crypto/hashing ${LUAJIT_INCLUDE} -c crypto/Dilithium_Lua.c -o build/Dilithium_Lua.o 271 272 echo "Step 4r: Compiling crypto/crypto.c (full crypto Lua bindings)..." 273 ${CC} ${CFLAGS} -DBARE_METAL -I./crypto -I./crypto/hashing ${LUAJIT_INCLUDE} -c crypto/crypto.c -o build/crypto.o 274 275 echo "Step 5: Finding LuaJIT static library..." 276 # Find LuaJIT static library (32-bit) 277 LUAJIT_LIB="" 278 if [ -f "lib/libluajit-5.1-32bit.a" ]; then 279 LUAJIT_LIB="lib/libluajit-5.1-32bit.a" 280 elif [ -f "/usr/lib/i386-linux-gnu/libluajit-5.1.a" ]; then 281 LUAJIT_LIB="/usr/lib/i386-linux-gnu/libluajit-5.1.a" 282 else 283 echo "ERROR: Could not find 32-bit LuaJIT static library!" 284 echo "Please run: ./build-luajit-32bit.sh" 285 exit 1 286 fi 287 288 echo "Using LuaJIT library: $LUAJIT_LIB" 289 290 echo "Step 6: Linking kernel..." 291 # Try to find 32-bit libgcc 292 LIBGCC="" 293 LIBGCC_PATH=$(${CC} -m32 -print-libgcc-file-name 2>/dev/null) 294 if [ -f "$LIBGCC_PATH" ]; then 295 LIBGCC="$LIBGCC_PATH" 296 echo "Using libgcc: $LIBGCC" 297 ${LD} ${LDFLAGS} -T linker.ld -o build/kernel.bin \ 298 build/boot.o build/syscall.o build/exceptions.o build/libc.o build/paging.o build/graphics.o build/vesa.o build/mouse.o build/usb_uhci.o build/keyboard.o build/ata.o build/fde.o build/diskfs.o build/partition.o build/fat16.o build/grub.o \ 299 build/decoder.o build/decoder_BMP.o build/decoder_PNG.o build/decoder_JPEG.o build/encoder_JPEG.o build/splash.o \ 300 build/compression.o build/deflate_impl.o build/Deflate.o build/LZMA.o build/GZip.o build/zlib.o \ 301 build/ramdisk.o build/luajit_init.o build/kernel.o \ 302 build/crypto_baremetal.o build/CSPRNG.o build/Ed25519.o build/X25519.o build/Curve25519.o \ 303 build/AES-256-GCM.o build/AES-128-GCM.o build/ChaCha20-Poly1305.o build/XChaCha20-Poly1305.o \ 304 build/Serpent-256-GCM.o build/Twofish-256-GCM.o build/Salsa20-Poly1305.o \ 305 build/PBKDF2.o build/Argon2.o build/HKDF.o build/stubs.o build/RSA.o build/P256.o \ 306 build/Kyber.o build/Dilithium.o \ 307 build/hash.o build/MD5.o build/SHA1.o build/SHA256.o build/SHA3.o build/BLAKE2.o \ 308 build/CSPRNG_Lua.o build/Ed25519_Lua.o build/X25519_Lua.o build/Hash_Lua.o \ 309 build/PBKDF2_Lua.o build/RSA_Lua.o build/P256_Lua.o \ 310 build/Kyber_Lua.o build/Dilithium_Lua.o \ 311 build/crypto.o \ 312 build/packed.o ${LUAJIT_LIB} "$LIBGCC" 313 else 314 echo "Warning: 32-bit libgcc not found, linking without it" 315 ${LD} ${LDFLAGS} -T linker.ld -o build/kernel.bin \ 316 build/boot.o build/syscall.o build/exceptions.o build/libc.o build/paging.o build/graphics.o build/vesa.o build/mouse.o build/usb_uhci.o build/keyboard.o build/ata.o build/fde.o build/diskfs.o build/partition.o build/fat16.o build/grub.o \ 317 build/decoder.o build/decoder_BMP.o build/decoder_PNG.o build/decoder_JPEG.o build/encoder_JPEG.o build/splash.o \ 318 build/compression.o build/deflate_impl.o build/Deflate.o build/LZMA.o build/GZip.o build/zlib.o \ 319 build/ramdisk.o build/luajit_init.o build/kernel.o \ 320 build/crypto_baremetal.o build/CSPRNG.o build/Ed25519.o build/X25519.o build/Curve25519.o \ 321 build/AES-256-GCM.o build/AES-128-GCM.o build/ChaCha20-Poly1305.o build/XChaCha20-Poly1305.o \ 322 build/Serpent-256-GCM.o build/Twofish-256-GCM.o build/Salsa20-Poly1305.o \ 323 build/PBKDF2.o build/Argon2.o build/HKDF.o build/stubs.o build/RSA.o build/P256.o \ 324 build/Kyber.o build/Dilithium.o \ 325 build/hash.o build/MD5.o build/SHA1.o build/SHA256.o build/SHA3.o build/BLAKE2.o \ 326 build/CSPRNG_Lua.o build/Ed25519_Lua.o build/X25519_Lua.o build/Hash_Lua.o \ 327 build/PBKDF2_Lua.o build/RSA_Lua.o build/P256_Lua.o \ 328 build/Kyber_Lua.o build/Dilithium_Lua.o \ 329 build/crypto.o \ 330 build/packed.o ${LUAJIT_LIB} 331 fi 332 333 echo "Step 7: Creating ISO structure..." 334 cp build/kernel.bin isodir/boot/kernel.bin 335 cp grub/grub.cfg isodir/boot/grub/grub.cfg 336 337 echo "Step 8: Creating bootable ISO..." 338 339 # Check for required tools 340 if ! command -v xorriso &> /dev/null; then 341 echo "ERROR: xorriso not found!" 342 echo "Please install: sudo apt-get install xorriso" 343 exit 1 344 fi 345 346 if ! command -v mformat &> /dev/null; then 347 echo "WARNING: mformat not found (from mtools package)" 348 echo "Installing it may help: sudo apt-get install mtools" 349 echo "Trying to create ISO anyway..." 350 fi 351 352 if command -v grub-mkrescue &> /dev/null; then 353 grub-mkrescue -o luajitos.iso isodir 2>&1 || { 354 echo "" 355 echo "ISO creation failed. You may need to install mtools:" 356 echo " sudo apt-get install mtools" 357 echo "" 358 echo "However, the kernel was built successfully at: build/kernel.bin" 359 echo "You can still test it with QEMU directly:" 360 echo " qemu-system-x86_64 -kernel build/kernel.bin -vga std -m 512M" 361 exit 1 362 } 363 elif command -v grub2-mkrescue &> /dev/null; then 364 grub2-mkrescue -o luajitos.iso isodir 2>&1 || { 365 echo "" 366 echo "ISO creation failed. However, the kernel was built successfully." 367 echo "You can test it with QEMU directly:" 368 echo " qemu-system-x86_64 -kernel build/kernel.bin" 369 exit 1 370 } 371 else 372 echo "ERROR: grub-mkrescue not found!" 373 echo "Please install GRUB utilities:" 374 echo " Ubuntu/Debian: sudo apt-get install grub-pc-bin xorriso mtools" 375 echo " Arch: sudo pacman -S grub xorriso mtools" 376 echo " Fedora: sudo dnf install grub2-tools-extra xorriso mtools" 377 exit 1 378 fi 379 380 } # End of do_build function 381 382 # Main execution 383 if [ "$TWO_PASS_BUILD" = "1" ]; then 384 # First pass: build kernel without embedded install kernel 385 do_build 1 386 387 # Save the kernel for embedding 388 echo "" 389 echo "=== First pass complete, saving kernel for installer ===" 390 cp build/kernel.bin build/kernel_install.bin 391 echo "Kernel saved ($(stat -c%s build/kernel_install.bin 2>/dev/null || echo '?') bytes)" 392 echo "" 393 394 # Second pass: rebuild with kernel embedded in ramdisk 395 do_build 2 396 fi 397 398 # If kernel_install.bin already existed, just do one build 399 if [ "$TWO_PASS_BUILD" = "0" ]; then 400 do_build 1 401 fi 402 403 echo "" 404 echo "=== Build successful! ===" 405 echo "Bootable ISO created: luajitos.iso" 406 echo "" 407 echo "To test with QEMU, run:" 408 echo " qemu-system-x86_64 -cdrom luajitos.iso -m 512 -serial stdio -vga std -display sdl" 409 410 echo "Note: The OS uses 1024x768 resolution. QEMU window will auto-size."