rumpk/build_full.sh

126 lines
3.2 KiB
Bash
Executable File

#!/usr/bin/env zsh
set -e
ARCH=${1:-riscv64}
# Architecture-specific settings
if [ "$ARCH" = "aarch64" ]; then
NIM_CPU="arm64"
ZIG_TARGET="aarch64-freestanding-none"
ZIG_CPU="baseline"
LINKER_SCRIPT="apps/linker_user_aarch64.ld"
BUILD_FLAG="-Darch=aarch64"
echo "=== Building NipBox Userland (aarch64) ==="
else
NIM_CPU="riscv64"
ZIG_TARGET="riscv64-freestanding-none"
ZIG_CPU="sifive_u54"
LINKER_SCRIPT="apps/linker_user.ld"
BUILD_FLAG=""
echo "=== Building NipBox Userland (riscv64) ==="
fi
# Compile Nim sources to C
nim c --cpu:${NIM_CPU} --os:any --compileOnly --mm:arc --opt:size \
--stackTrace:off --lineDir:off --nomain --nimcache:build/init_nimcache \
-d:noSignalHandler -d:RUMPK_USER -d:nimAllocPagesViaMalloc -d:NIPBOX_LITE \
npl/nipbox/nipbox.nim
# Compile Nim-generated C (check if files exist first)
# Skip net_glue (needs LwIP headers not available in userland build)
EXTRA_CC_FLAGS=""
if [ "$ARCH" = "riscv64" ]; then
EXTRA_CC_FLAGS="-mcmodel=medany"
fi
if ls build/init_nimcache/*.c 1> /dev/null 2>&1; then
for f in build/init_nimcache/*.c; do
case "$f" in
*net_glue*) echo " [skip] $f (LwIP dependency)"; continue ;;
esac
zig cc -target ${ZIG_TARGET} -mcpu=${ZIG_CPU} ${EXTRA_CC_FLAGS} \
-fno-sanitize=all -fno-vectorize \
-I/usr/lib/nim/lib -Icore -Ilibs/membrane -Ilibs/membrane/include \
-include string.h \
-Os -c "$f" -o "${f%.c}.o"
done
fi
# Compile clib
zig cc -target ${ZIG_TARGET} -mcpu=${ZIG_CPU} ${EXTRA_CC_FLAGS} \
-fno-sanitize=all \
-DNO_SYS=1 -DOMIT_EXIT -DRUMPK_USER -Ilibs/membrane/include -c libs/membrane/clib.c -o build/clib_user.o
# Create startup assembly
if [ "$ARCH" = "aarch64" ]; then
cat > build/head_user.S << 'EOF'
.section .text._start
.global _start
_start:
bl NimMain
1: wfi
b 1b
EOF
else
cat > build/head_user.S << 'EOF'
.section .text._start
.global _start
_start:
.option push
.option norelax
1:auipc gp, %pcrel_hi(__global_pointer$)
addi gp, gp, %pcrel_lo(1b)
.option pop
call NimMain
1: wfi
j 1b
EOF
fi
zig cc -target ${ZIG_TARGET} -mcpu=${ZIG_CPU} ${EXTRA_CC_FLAGS} \
-fno-sanitize=all \
-c build/head_user.S -o build/head_user.o
# Link init
zig cc -target ${ZIG_TARGET} -mcpu=${ZIG_CPU} ${EXTRA_CC_FLAGS} -nostdlib \
-fno-sanitize=all \
-T ${LINKER_SCRIPT} -Wl,--gc-sections \
build/head_user.o build/init_nimcache/*.o build/clib_user.o \
-o build/init
echo "✓ NipBox binary built (${ARCH})"
file build/init
# Create initrd
mkdir -p build/sysro/bin
cp build/init build/sysro/init
if [ "$ARCH" = "riscv64" ] && [ -f vendor/mksh/mksh.elf ]; then
cp vendor/mksh/mksh.elf build/sysro/bin/mksh
fi
cd build/sysro
tar --format=ustar -cf ../initrd.tar *
cd ../..
# Embed initrd
cat > build/embed_initrd.S << EOF
.section .rodata
.global _initrd_start
.global _initrd_end
.align 4
_initrd_start:
.incbin "$(pwd)/build/initrd.tar"
_initrd_end:
EOF
zig cc -target ${ZIG_TARGET} -mcpu=${ZIG_CPU} ${EXTRA_CC_FLAGS} \
-c build/embed_initrd.S -o build/initrd.o
cp build/initrd.tar hal/initrd.tar
# Build kernel
rm -f zig-out/lib/librumpk_hal.a
zig build ${BUILD_FLAG}
echo "=== BUILD COMPLETE (${ARCH}) ==="
ls -lh build/init zig-out/bin/rumpk.elf