velxio/build_qemu_dll.sh

85 lines
2.5 KiB
Bash

#!/usr/bin/env bash
# Build libqemu-xtensa.dll from lcgamboa QEMU (MSYS2 MINGW64)
set -euo pipefail
export PATH=/mingw64/bin:/usr/bin:$PATH
export MINGW_PREFIX=/mingw64
REPO="/e/Hardware/wokwi_clon/wokwi-libs/qemu-lcgamboa"
OUT="/e/Hardware/wokwi_clon/backend/app/services"
cd "$REPO"
echo "=== Working dir: $(pwd) ==="
echo "=== Step 1: Patch meson.build for libiconv ==="
if grep -q "qemu_ldflags = \[\]" meson.build; then
sed -z -i "s/qemu_ldflags = \[\]/qemu_ldflags = \['-liconv','-Wl,--allow-multiple-definition'\]/g" -- meson.build
echo " Patched OK"
else
echo " Already patched or pattern not found"
fi
echo ""
echo "=== Step 2: Configure ==="
./configure \
--target-list=xtensa-softmmu \
--disable-werror \
--disable-alsa \
--enable-tcg \
--enable-system \
--enable-gcrypt \
--enable-slirp \
--enable-iconv \
--enable-debug \
--enable-debug-info \
--without-default-features \
2>&1 || { echo "CONFIGURE FAILED"; cat meson-logs/meson-log.txt 2>/dev/null | tail -50; exit 1; }
echo ""
echo "=== Step 3: Build ($(nproc) cores) ==="
make -j$(nproc) 2>&1
echo ""
echo "=== Step 4: Relink as DLL ==="
cd build
echo " Removing old qemu-system-xtensa to force ninja to output link command..."
rm -f qemu-system-xtensa.exe qemu-system-xtensa.rsp qemu-system-xtensa_.rsp
echo " Capturing ninja link command..."
ninja -v -d keeprsp 2>&1 > qemu-system-xtensa_.rsp
echo " Extracting last line (link command)..."
sed -i -n '$p' qemu-system-xtensa_.rsp
CMD=$(sed 's/-o .*//' qemu-system-xtensa_.rsp | sed 's/\[.\/.\] //g' | sed 's/@qemu-system-xtensa.rsp//g')
if [ ! -f qemu-system-xtensa.rsp ]; then
cp qemu-system-xtensa_.rsp qemu-system-xtensa.rsp
fi
sed -i 's/.*-o /-o /' qemu-system-xtensa.rsp
# Remove main(), change output to DLL
sed -i 's|qemu-system-xtensa.p/softmmu_main.c.o||g' qemu-system-xtensa.rsp
sed -i 's|-o qemu-system-xtensa|-shared -Wl,--export-all-symbols -o libqemu-xtensa.dll|g' qemu-system-xtensa.rsp
echo " Linking DLL..."
eval "$CMD -ggdb @qemu-system-xtensa.rsp" 2>&1
if [ -f libqemu-xtensa.dll ]; then
echo ""
echo "=== SUCCESS: libqemu-xtensa.dll created ==="
ls -lh libqemu-xtensa.dll
echo ""
echo "=== Checking exports ==="
objdump -p libqemu-xtensa.dll 2>/dev/null | grep -E "qemu_picsimlab|qemu_init|qemu_main" | head -20 || echo "objdump not available"
echo ""
echo "=== Copying to backend ==="
cp libqemu-xtensa.dll "$OUT/"
echo " Copied to $OUT/libqemu-xtensa.dll"
else
echo "FAILED: libqemu-xtensa.dll not produced"
exit 1
fi