repack_lua.sh (5292B)
1 #!/bin/bash 2 3 # Fast Lua-only rebuild script 4 # Recompiles Lua files (excluding manifest.lua and /scripts/*), repacks ramdisk, and creates ISO 5 # Much faster than full build.sh since it skips C compilation 6 7 set -e # Exit on error 8 9 echo "=== LuajitOS Fast Lua Repack ===" 10 11 # Check if we have the required compiled objects 12 if [ ! -f "build/kernel.o" ]; then 13 echo "ERROR: build/kernel.o not found!" 14 echo "Please run ./build.sh first to compile C code." 15 exit 1 16 fi 17 18 # Configuration for linking 19 CROSS_COMPILE=i686-elf- 20 LD="${CROSS_COMPILE}ld" 21 OBJCOPY="${CROSS_COMPILE}objcopy" 22 23 # Check if cross-compiler exists, fallback to native 24 if ! command -v ${LD} &> /dev/null; then 25 LD="ld" 26 OBJCOPY="objcopy" 27 fi 28 29 LDFLAGS="-m elf_i386 -nostdlib -static" 30 31 # Step 1: Recompile Lua files (excluding manifest.lua and scripts/*) 32 echo "Step 1: Recompiling Lua files..." 33 if command -v luajit &> /dev/null; then 34 find iso_includes -name "*.lua" | while read lua_file; do 35 # Skip manifest.lua files 36 if [[ "$lua_file" == */manifest.lua ]]; then 37 continue 38 fi 39 # Skip scripts directory 40 if [[ "$lua_file" == iso_includes/scripts/* ]]; then 41 continue 42 fi 43 44 luac_file="${lua_file}c" 45 # Only recompile if .lua is newer than .luac or .luac doesn't exist 46 if [ ! -f "$luac_file" ] || [ "$lua_file" -nt "$luac_file" ]; then 47 echo " Compiling: $lua_file" 48 luajit -bW "$lua_file" "$luac_file" 2>/dev/null || true 49 fi 50 done 51 echo " Bytecode compilation complete" 52 else 53 echo "ERROR: luajit not found!" 54 exit 1 55 fi 56 57 # Step 2: Generate ramdisk 58 echo "Step 2: Generating ramdisk..." 59 if [ -d iso_includes ]; then 60 # Remove any previously embedded kernel to prevent recursive embedding 61 rm -rf iso_includes/os/boot 62 63 # If we have a kernel for install, include it 64 if [ -f build/kernel_install.bin ]; then 65 mkdir -p iso_includes/os/boot 66 cp build/kernel_install.bin iso_includes/os/boot/kernel.bin 67 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)" 68 fi 69 70 luajit pack_ramdisk.lua iso_includes packed.bin 71 if [ $? -ne 0 ]; then 72 echo "Error: Failed to generate ramdisk" 73 exit 1 74 fi 75 else 76 echo "ERROR: iso_includes directory not found!" 77 exit 1 78 fi 79 80 # Step 3: Convert packed.bin to object file 81 echo "Step 3: Converting packed.bin to object file..." 82 ${OBJCOPY} -I binary -O elf32-i386 -B i386 \ 83 --rename-section .data=.rodata,alloc,load,readonly,data,contents \ 84 packed.bin build/packed.o 85 echo " Embedded packed.bin ($(stat -c%s packed.bin 2>/dev/null || stat -f%z packed.bin 2>/dev/null || echo '?') bytes)" 86 87 # Step 4: Re-link kernel 88 echo "Step 4: Linking kernel..." 89 90 # Find LuaJIT static library 91 LUAJIT_LIB="" 92 if [ -f "lib/libluajit-5.1-32bit.a" ]; then 93 LUAJIT_LIB="lib/libluajit-5.1-32bit.a" 94 elif [ -f "/usr/lib/i386-linux-gnu/libluajit-5.1.a" ]; then 95 LUAJIT_LIB="/usr/lib/i386-linux-gnu/libluajit-5.1.a" 96 else 97 echo "ERROR: Could not find 32-bit LuaJIT static library!" 98 exit 1 99 fi 100 101 # Find libgcc 102 CC="gcc" 103 if command -v i686-elf-gcc &> /dev/null; then 104 CC="i686-elf-gcc" 105 fi 106 LIBGCC_PATH=$(${CC} -m32 -print-libgcc-file-name 2>/dev/null) 107 LIBGCC="" 108 if [ -f "$LIBGCC_PATH" ]; then 109 LIBGCC="$LIBGCC_PATH" 110 fi 111 112 # Link all objects together 113 ${LD} ${LDFLAGS} -T linker.ld -o build/kernel.bin \ 114 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 \ 115 build/decoder.o build/decoder_BMP.o build/decoder_PNG.o build/decoder_JPEG.o build/encoder_JPEG.o build/splash.o \ 116 build/compression.o build/deflate_impl.o build/Deflate.o build/LZMA.o build/GZip.o build/zlib.o \ 117 build/ramdisk.o build/luajit_init.o build/kernel.o \ 118 build/crypto_baremetal.o build/CSPRNG.o build/Ed25519.o build/X25519.o build/Curve25519.o \ 119 build/AES-256-GCM.o build/AES-128-GCM.o build/ChaCha20-Poly1305.o build/XChaCha20-Poly1305.o \ 120 build/Serpent-256-GCM.o build/Twofish-256-GCM.o build/Salsa20-Poly1305.o \ 121 build/PBKDF2.o build/Argon2.o build/HKDF.o build/stubs.o build/RSA.o build/P256.o \ 122 build/Kyber.o build/Dilithium.o \ 123 build/hash.o build/MD5.o build/SHA1.o build/SHA256.o build/SHA3.o build/BLAKE2.o \ 124 build/CSPRNG_Lua.o build/Ed25519_Lua.o build/X25519_Lua.o build/Hash_Lua.o \ 125 build/PBKDF2_Lua.o build/RSA_Lua.o build/P256_Lua.o \ 126 build/Kyber_Lua.o build/Dilithium_Lua.o \ 127 build/crypto.o \ 128 build/packed.o ${LUAJIT_LIB} ${LIBGCC} 129 130 # Step 5: Create ISO 131 echo "Step 5: Creating ISO..." 132 cp build/kernel.bin isodir/boot/kernel.bin 133 134 if command -v grub-mkrescue &> /dev/null; then 135 grub-mkrescue -o luajitos.iso isodir 2>&1 136 elif command -v grub2-mkrescue &> /dev/null; then 137 grub2-mkrescue -o luajitos.iso isodir 2>&1 138 else 139 echo "ERROR: grub-mkrescue not found!" 140 exit 1 141 fi 142 143 echo "" 144 echo "=== Repack complete! ===" 145 echo "ISO updated: luajitos.iso" 146 echo "" 147 echo "To test with QEMU, run:" 148 echo " qemu-system-x86_64 -cdrom luajitos.iso -m 512 -serial stdio -vga std -display sdl"