From 19a4c9b5715e07ee6339c89711f487a78aa8e9f7 Mon Sep 17 00:00:00 2001 From: huangyan Date: Sat, 16 Aug 2025 00:52:58 +0800 Subject: [PATCH] Add qemu-user, user-static, user-binfmt package - Add qemu-user package for arm, aarch64, riscv32, riscv64 target & user-static, user-binfmt package for statically-linked QEMU user emulator Signed-off-by: huangyan --- qemu.spec | 146 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 140 insertions(+), 6 deletions(-) diff --git a/qemu.spec b/qemu.spec index 9a7eff1..ef2bd4e 100644 --- a/qemu.spec +++ b/qemu.spec @@ -3,7 +3,7 @@ Name: qemu Version: 8.2.0 -Release: 39 +Release: 40 Epoch: 11 Summary: QEMU is a generic and open source machine emulator and virtualizer License: GPLv2 and BSD and MIT and CC-BY-SA-4.0 @@ -1015,6 +1015,8 @@ BuildRequires: qatzip-devel BuildRequires: intel-qpl-devel %endif +BuildRequires: glibc-static glib2-static zlib-static + # for upgrade from qemu-kvm Provides: qemu-kvm Obsoletes: qemu-kvm < 11:8.2.0 @@ -1138,6 +1140,26 @@ Requires: spice-gtk %description system-loongarch64 This package provides the QEMU system emulator for loongarch64. +%package user +Summary: Qemu-user +Requires: qemu +%description user +This package provides the QEMU user emulator for multi-arch. + +%package user-static +Summary: Qemu-user-static +%description user-static +This package provides the statically-linked QEMU user emulator for multi-arch. +These static emulators are particularly useful for container builds. + +%package user-binfmt +Summary: QEMU user mode emulation of qemu-user-static +Requires: systemd >= 197 +Requires(post): systemd +Requires(postun): systemd +%description user-binfmt +System level emulation of foreign architectures + %prep %setup -q -n qemu-%{version}%{?rcstr} %autopatch -p1 @@ -1145,26 +1167,41 @@ This package provides the QEMU system emulator for loongarch64. %build %ifarch x86_64 buildarch="x86_64-softmmu" -targetarch="aarch64-softmmu arm-softmmu riscv32-softmmu riscv64-softmmu" +targetarch="aarch64-softmmu arm-softmmu riscv32-softmmu riscv64-softmmu \ + aarch64-linux-user arm-linux-user riscv32-linux-user riscv64-linux-user" +usermode_emulator="qemu-aarch64 qemu-arm qemu-riscv32 qemu-riscv64" +usermode_static="qemu-aarch64-static qemu-arm-static qemu-riscv32-static qemu-riscv64-static" %endif %ifarch aarch64 buildarch="aarch64-softmmu" -targetarch="x86_64-softmmu arm-softmmu riscv32-softmmu riscv64-softmmu" +targetarch="x86_64-softmmu arm-softmmu riscv32-softmmu riscv64-softmmu \ + x86_64-linux-user arm-linux-user riscv32-linux-user riscv64-linux-user" +usermode_emulator="qemu-arm qemu-riscv32 qemu-riscv64" +usermode_static="qemu-arm-static qemu-riscv32-static qemu-riscv64-static" %endif %ifarch ppc64le buildarch="ppc64-softmmu" -targetarch="x86_64-softmmu aarch64-softmmu arm-softmmu riscv32-softmmu riscv64-softmmu" +targetarch="x86_64-softmmu aarch64-softmmu arm-softmmu riscv32-softmmu riscv64-softmmu \ + x86_64-linux-user aarch64-linux-user arm-linux-user riscv32-linux-user riscv64-linux-user" +usermode_emulator="qemu-aarch64 qemu-arm qemu-riscv32 qemu-riscv64" +usermode_static="qemu-aarch64-static qemu-arm-static qemu-riscv32-static qemu-riscv64-static" %endif %ifarch loongarch64 buildarch="loongarch64-softmmu" -targetarch="x86_64-softmmu aarch64-softmmu arm-softmmu riscv32-softmmu riscv64-softmmu" +targetarch="x86_64-softmmu aarch64-softmmu arm-softmmu riscv32-softmmu riscv64-softmmu \ + x86_64-linux-user aarch64-linux-user arm-linux-user riscv32-linux-user riscv64-linux-user" +usermode_emulator="qemu-aarch64 qemu-arm qemu-riscv32 qemu-riscv64" +usermode_static="qemu-aarch64-static qemu-arm-static qemu-riscv32-static qemu-riscv64-static" %endif %ifarch riscv64 buildarch="riscv64-softmmu" -targetarch="x86_64-softmmu aarch64-softmmu arm-softmmu riscv32-softmmu" +targetarch="x86_64-softmmu aarch64-softmmu arm-softmmu riscv32-softmmu \ + x86_64-linux-user aarch64-linux-user arm-linux-user riscv32-linux-user" +usermode_emulator="qemu-aarch64 qemu-arm qemu-riscv32" +usermode_static="qemu-aarch64-static qemu-arm-static qemu-riscv32-static" %endif buildldflags="VL_LDFLAGS=-Wl,--build-id" @@ -1241,6 +1278,48 @@ make %{?_smp_mflags} $buildldflags V=1 cp ${qemubuilddir}/${buildarch}/qemu-system-* qemu-kvm +# Independent static build for user mode emulators +# Dynamically generate static_targets from usermode_static +static_targets="" +for binary in $usermode_static; do + arch=$(echo $binary | sed 's/qemu-//' | sed 's/-static//') + static_targets="$static_targets $arch-linux-user" +done +# Remove leading space +static_targets=$(echo $static_targets | sed 's/^ *//') + +# Independent static build directory +mkdir -p static_builddir +cd static_builddir + +../configure \ + --prefix=%{_prefix} \ + --enable-attr \ + --enable-linux-user \ + --enable-pie \ + --enable-tcg \ + --disable-install-blobs \ + --target-list="$static_targets" \ + --static + +make %{?_smp_mflags} V=1 +cd .. + +# Generate file lists for user packages +for i in ${usermode_emulator}; do + echo "%{_bindir}/${i}" >> %{name}.user +done + +for binary in ${usermode_static}; do + echo "%{_bindir}/${binary}" >> %{name}.user-static +done + +# Create list of static binfmt configurations for %files section +for binary in ${usermode_static}; do + arch=$(echo $binary | sed 's/qemu-//' | sed 's/-static//') + echo "%{_exec_prefix}/lib/binfmt.d/qemu-${arch}-static.conf" >> %{name}.user-static-binfmt +done + %install make %{?_smp_mflags} DESTDIR=%{buildroot} \ @@ -1250,6 +1329,39 @@ make %{?_smp_mflags} DESTDIR=%{buildroot} \ install -m 0755 qemu-kvm %{buildroot}%{_libexecdir}/ ln -s %{_libexecdir}/qemu-kvm %{buildroot}/%{_bindir}/qemu-kvm +# Install user-static binaries +%define static_buildroot %{buildroot}/static/ +mkdir -p %{static_buildroot} + +pushd static_builddir +make DESTDIR=%{static_buildroot} install + +# Duplicates what the main build installs and we don't +# need second copy with a -static suffix +rm -f %{static_buildroot}%{_bindir}/qemu-trace-stap +popd +# back to root build directory + +# Rename all QEMU user emulators to have a -static suffix +for src in %{static_buildroot}%{_bindir}/qemu-*; do + mv $src %{buildroot}%{_bindir}/$(basename $src)-static; done + +rm -rf %{static_buildroot} + +# Install binfmt configuration files +%global binfmt_dir %{buildroot}%{_exec_prefix}/lib/binfmt.d +mkdir -p %{binfmt_dir} + +# Generate binfmt configuration for dynamic emulators +./scripts/qemu-binfmt-conf.sh --systemd ALL --exportdir %{binfmt_dir} --qemu-path %{_bindir} +for i in %{binfmt_dir}/*; do mv $i $(echo $i | sed 's/.conf/-dynamic.conf/'); done + +# Generate binfmt configuration for static emulators from dynamic ones +for regularfmt in %{binfmt_dir}/*; do + staticfmt="$(echo $regularfmt | sed 's/-dynamic/-static/g')" + cat $regularfmt | tr -d '\n' | sed "s/:$/-static:F/" > $staticfmt +done + install -D -p -m 0644 contrib/systemd/qemu-pr-helper.service %{buildroot}%{_unitdir}/qemu-pr-helper.service install -D -p -m 0644 contrib/systemd/qemu-pr-helper.socket %{buildroot}%{_unitdir}/qemu-pr-helper.socket install -D -p -m 0644 qemu.sasl %{buildroot}%{_sysconfdir}/sasl2/qemu.conf @@ -1554,7 +1666,29 @@ getent passwd qemu >/dev/null || \ %{_datadir}/%{name}/bios.bin %endif +%files user -f %{name}.user + +%files user-static -f %{name}.user-static +%license COPYING COPYING.LIB LICENSE +# Include static binfmt configurations +%{_exec_prefix}/lib/binfmt.d/qemu-*-static.conf + +%files user-binfmt +%defattr(-,root,root,-) +# user-binfmt provides systemd registration for binfmt_misc +%{_exec_prefix}/lib/binfmt.d/qemu-*-dynamic.conf + +%post user-binfmt +/bin/systemctl try-restart systemd-binfmt.service &>/dev/null || : + +%postun user-binfmt +/bin/systemctl try-restart systemd-binfmt.service &>/dev/null || : + %changelog +* Mon Aug 04 2025 huangyan - 11:8.2.0-40 +- Add qemu-user package for arm, aarch64, riscv32, riscv64 targets +- Add user-static, user-binfmt package for statically-linked QEMU user emulator + * Fri Jul 25 2025 Pengrui Zhang - 11:8.2.0-39 - hw/audio/cs4231a: fix assertion error in isa_bus_get_irq - block/blkio: Make s->mem_region_alignment be 64 bits -- Gitee