luajitos

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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."