From 1eb7bb384aecafa4562a8924d5e16d0b54249f79 Mon Sep 17 00:00:00 2001 From: huangyan Date: Thu, 10 Jul 2025 14:12:03 +0800 Subject: [PATCH] Add qemu-user package for x86, arm, aarch64, riscv32, riscv64 target & user-static, user-binfmt package for statically-linked QEMU user emulator Signed-off-by: huangyan --- qemu.spec | 159 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 149 insertions(+), 10 deletions(-) diff --git a/qemu.spec b/qemu.spec index 5acda16..298f35d 100644 --- a/qemu.spec +++ b/qemu.spec @@ -3,7 +3,7 @@ Name: qemu Version: 8.2.0 -Release: 35 +Release: 36 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 @@ -994,6 +994,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 @@ -1117,6 +1119,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 @@ -1124,37 +1146,57 @@ 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-x86_64 qemu-arm qemu-riscv32 qemu-riscv64" +usermode_static="qemu-x86_64-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-x86_64 qemu-aarch64 qemu-arm qemu-riscv32 qemu-riscv64" +usermode_static="qemu-x86_64-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-x86_64 qemu-aarch64 qemu-arm qemu-riscv32 qemu-riscv64" +usermode_static="qemu-x86_64-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-x86_64 qemu-aarch64 qemu-arm qemu-riscv32" +usermode_static="qemu-x86_64-static qemu-aarch64-static qemu-arm-static qemu-riscv32-static" %endif buildldflags="VL_LDFLAGS=-Wl,--build-id" -qemubuilddir="build" +# Create build directories +mkdir -p qemubuilddir +mkdir -p static_builddir tar xf %{SOURCE4} cd BinDir/ \cp -r -a * ../ cd ../ -./configure \ +# First build - dynamic build +cd qemubuilddir +../configure \ --prefix=%{_prefix} \ --target-list="${buildarch} ${targetarch}" \ --extra-cflags="%{optflags} -fPIE -DPIE -fPIC -ftls-model=initial-exec" \ @@ -1217,18 +1259,93 @@ cd ../ make %{?_smp_mflags} $buildldflags V=1 +cp ${buildarch}/qemu-system-* ../qemu-kvm -cp ${qemubuilddir}/${buildarch}/qemu-system-* qemu-kvm +# Second build - static build for user mode emulators +cd ../static_builddir -%install +# 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/^ *//') + +../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 .. + +for i in ${usermode_emulator} +do + echo "%{_bindir}/${i}" >> %{name}.user +done + +# Create list of static binaries for %files section +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 +# Install dynamic build +pushd qemubuilddir make %{?_smp_mflags} DESTDIR=%{buildroot} \ install +popd + +# Install qemu-user-static tree +%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 # static + +# 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} %find_lang %{name} install -m 0755 qemu-kvm %{buildroot}%{_libexecdir}/ ln -s %{_libexecdir}/qemu-kvm %{buildroot}/%{_bindir}/qemu-kvm +# 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 @@ -1533,7 +1650,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 +* Thu Jul 10 2025 huangyan - 11:8.2.0-36 +- Add qemu-user package for arm, aarch64, riscv32, riscv64 targets +- Add user-static, user-binfmt package for statically-linked QEMU user emulator + * Wed Jun 04 2025 Jason Zeng - 11:8.2.0-35 - Enable Intel qatzip and qpl acceleration for multifd live migration. -- Gitee