NEW PORT: emulators/qemu-user-static-devel: QEMU user-mode emulation

This port represents the to-be-released version of qemu-user-static for
testing prior to unleashing it upon the community at large and the package
building infrastructure. Currently, it is based on the bsd-user-rebase-3.1
branch that moves the base qemu version of this work forward.

The main highlight of the update to 3.1 is initial riscv64 bsd-user support,
submitted by Embecosm.

This version of the port is also notably no longer based on the master port,
qemu-sbruno, but repocopied from it due to reusing a good portion of it. As
such, it's been severely reduced to eliminate all of the bits not relevant
to building bsd-user/ (including the various port options), so much of the
diff is eliminating the option-enabled checks and combining them all into a
single CONFIGURE_ARGS/MAKE_ARGS, along with some additional --disable-flags
for things that we certainly don't need.

The python2.7 version restriction has been dropped as qemu's actually
supported py3+ since at least the 2.x version we have over in qemu-sbruno, A
follow-up commit will also drop the version restrictions in the other qemu
ports that still have it to be proactive about this stuff as Python2 reaches
EOL.

Q/A:
 * portlint: looks fine
 * testport: 11.3, -CURRENT; amd64

PR:		242253
Reviewed by:	koobs (ports)
Approved by:	koobs (ports)
This commit is contained in:
Kyle Evans 2019-12-02 03:40:49 +00:00
parent 1c9ba209f9
commit 2f03a12d35
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=518822
7 changed files with 298 additions and 0 deletions

View File

@ -114,6 +114,7 @@
SUBDIR += qemu-powernv
SUBDIR += qemu-sbruno
SUBDIR += qemu-user-static
SUBDIR += qemu-user-static-devel
SUBDIR += qemu-utils
SUBDIR += qemu30
SUBDIR += qemu31

View File

@ -40,6 +40,8 @@ OPTIONS_DEFAULT=X11 GTK2 OPENGL GNUTLS SASL JPEG PNG CDROM_DMA CURL PCAP
.if !defined(QEMU_USER_STATIC)
CONFLICTS_INSTALL= qemu-[0-9]* qemu-devel-*
.else
CONFLICTS_INSTALL= qemu-user-static-devel-*
.endif
.if defined(QEMU_USER_STATIC)

View File

@ -0,0 +1,91 @@
# $FreeBSD$
PORTNAME= qemu
PORTVERSION= 3.1.0
CATEGORIES= emulators
PKGNAMESUFFIX= -user-static-devel
DIST_SUBDIR= qemu/${PORTVERSION}
MAINTAINER= emulation@FreeBSD.org
COMMENT= QEMU CPU Emulator (github bsd-user branch)
LICENSE= GPLv2
LICENSE_FILE= ${WRKSRC}/COPYING
ONLY_FOR_ARCHS= amd64 powerpc powerpc64
CONFLICTS_INSTALL= qemu-user-static-[0-9]*
USES= bison compiler:c11 gmake perl5 pkgconfig python:build
USE_GITHUB= yes
GH_TUPLE= seanbruno:qemu-bsd-user:0337421f238 \
qemu:keycodemapdb:10739aa:keycodemapdb/ui/keycodemapdb
HAS_CONFIGURE= yes
USE_PERL5= build
MAKE_ENV+= BSD_MAKE="${MAKE}" V=1
USE_RC_SUBR= qemu_user_static
SUB_LIST= NAME=qemu_user_static
# When static linking we have a build dependency on libglib-2.0.a, otherwise
# we use glib20 in the usual way (shared-lib runtime dependency).
BUILD_DEPENDS+= ${LOCALBASE}/lib/libglib-2.0.a:devel/glib20
.include <bsd.port.pre.mk>
CONFIGURE_ARGS+= --localstatedir=/var
CONFIGURE_ARGS+= --extra-ldflags=-L${LOCALBASE}/lib
CONFIGURE_ARGS+= --extra-cflags=-I${LOCALBASE}/include
CONFIGURE_ARGS+= --disable-libssh2
QEMU_TARGETS= i386-bsd-user sparc-bsd-user arm-bsd-user mips-bsd-user mipsel-bsd-user ppc-bsd-user
.if ${ARCH} == "amd64"
QEMU_TARGETS+= x86_64-bsd-user riscv64-bsd-user sparc64-bsd-user mips64-bsd-user mips64el-bsd-user ppc64-bsd-user aarch64-bsd-user
PLIST_SUB+= 64BIT=""
.else
PLIST_SUB+= 64BIT="@comment "
.endif
CONFIGURE_ARGS+= --target-list=${QEMU_TARGETS:ts,}
SSP_CFLAGS?= -fstack-protector # XXX -strong crashes qemu-user-static
WITHOUT_CPU_CFLAGS=yes #to avoid problems with register allocation
CFLAGS:= ${CFLAGS:C/-fno-tree-vrp//}
CFLAGS+= -Wno-address-of-packed-member
CFLAGS+= -D_WANT_SEMUN
CONFIGURE_ARGS+= --prefix=${PREFIX} --cc=${CC} --enable-docs \
--disable-linux-user --disable-linux-aio \
--disable-kvm --disable-xen \
--smbd=${LOCALBASE}/sbin/smbd \
--enable-debug \
--enable-debug-info \
--static \
--python=${PYTHON_CMD} \
--disable-sdl --disable-gtk --disable-vte --disable-gnutls --disable-vnc \
--disable-curl --disable-opengl --disable-usb-redir --disable-pcap \
--disable-docs --disable-tools --disable-system --disable-guest-agent \
--extra-cflags=-I${WRKSRC}\ -I${LOCALBASE}/include\ -DPREFIX=\\\"\"${PREFIX}\\\"\"
QEMU_ARCH= ${ARCH:C/amd64/x86_64/:C/powerpc/ppc/}
MAKE_ARGS+= ARCH=${QEMU_ARCH}
post-patch:
@${REINPLACE_CMD} -E \
-e "s|^(CFLAGS=).*|\1${CFLAGS} -fno-strict-aliasing|" \
-e "s|^(LDFLAGS=).*|\1${LDFLAGS}|" \
${WRKSRC}/Makefile.target
@${REINPLACE_CMD} -E \
-e "s|^(CFLAGS=).*|\1${CFLAGS} -fno-strict-aliasing -I.|" \
-e "s|^(LDFLAGS=).*|\1${LDFLAGS}|" \
${WRKSRC}/Makefile
post-install:
@${MV} ${STAGEDIR}${PREFIX}/etc/rc.d ${WRKDIR}
@${RM} -r ${STAGEDIR}${PREFIX}/etc
@${MKDIR} ${STAGEDIR}${PREFIX}/etc
@${MV} ${WRKDIR}/rc.d ${STAGEDIR}${PREFIX}/etc
@${RM} -r ${STAGEDIR}${PREFIX}/man
@${RM} -r ${STAGEDIR}${DATADIR}
@${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/qemu-*
@(cd ${STAGEDIR}${PREFIX}/bin && \
for i in qemu-*; do ${MV} -i $$i $$i-static; done)
.include <bsd.port.post.mk>

View File

@ -0,0 +1,5 @@
TIMESTAMP = 1574823953
SHA256 (qemu/3.1.0/seanbruno-qemu-bsd-user-3.1.0-0337421f238_GH0.tar.gz) = 7ae7340a2b99e24e0d85b8d632ecef41ddd3ef76382af4dbe6dab082d3c4d16a
SIZE (qemu/3.1.0/seanbruno-qemu-bsd-user-3.1.0-0337421f238_GH0.tar.gz) = 16903184
SHA256 (qemu/3.1.0/qemu-keycodemapdb-10739aa_GH0.tar.gz) = ae43fb1e2b07b78be88a7882306b6e71383eb77472a35d7d78fed21e345d134a
SIZE (qemu/3.1.0/qemu-keycodemapdb-10739aa_GH0.tar.gz) = 47895

View File

@ -0,0 +1,164 @@
#!/bin/sh
#
# $FreeBSD$
#
# PROVIDE: %%NAME%%
# REQUIRE: LOGIN
# KEYWORD: shutdown
# Add the following lines to /etc/rc.conf to enable `%%NAME%%':
#
# %%NAME%%_enable="YES"
#
. /etc/rc.subr
name=%%NAME%%
rcvar=%%NAME%%_enable
# read configuration and set defaults
load_rc_config "$name"
: ${%%NAME%%_enable:="NO"}
BINMISCCTL=/usr/sbin/binmiscctl
QEMU_DIR=%%PREFIX%%/bin
QEMU_PREFIX=qemu-
QEMU_SUFFIX=-static
start_cmd=%%NAME%%_start
stop_cmd=%%NAME%%_stop
extra_commands=list
list_cmd="${BINMISCCTL} list"
%%NAME%%_start()
{
# register arm interpreter styled 'arm'
interpreter=${QEMU_DIR}/${QEMU_PREFIX}arm${QEMU_SUFFIX}
if [ -x "${interpreter}" ]; then
${BINMISCCTL} add arm --interpreter "${interpreter}" \
--magic "\x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00" \
--mask "\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff" \
--size 20 --set-enabled
else
echo "$0: interpreter ${interpreter} not found, cannot register."
fi
# register armv6 interpreter styled 'arm'
interpreter=${QEMU_DIR}/${QEMU_PREFIX}arm${QEMU_SUFFIX}
if [ -x "${interpreter}" ]; then
${BINMISCCTL} add armv6 --interpreter "${interpreter}" \
--magic "\x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00" \
--mask "\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff" \
--size 20 --set-enabled
else
echo "$0: interpreter ${interpreter} not found, cannot register."
fi
# register armv7 interpreter styled 'arm'
interpreter=${QEMU_DIR}/${QEMU_PREFIX}arm${QEMU_SUFFIX}
if [ -x "${interpreter}" ]; then
${BINMISCCTL} add armv7 --interpreter "${interpreter}" \
--magic "\x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00" \
--mask "\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff" \
--size 20 --set-enabled
else
echo "$0: interpreter ${interpreter} not found, cannot register."
fi
# register aarch64 interpreter styled 'aarch64'
interpreter=${QEMU_DIR}/${QEMU_PREFIX}aarch64${QEMU_SUFFIX}
if [ -x "${interpreter}" ]; then
${BINMISCCTL} add aarch64 --interpreter "${interpreter}" \
--magic "\x7f\x45\x4c\x46\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00" \
--mask "\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff" \
--size 20 --set-enabled
else
echo "$0: interpreter ${interpreter} not found, cannot register."
fi
# register mips interpreter styled 'mips'
interpreter=${QEMU_DIR}/${QEMU_PREFIX}mips${QEMU_SUFFIX}
if [ -x "${interpreter}" ]; then
${BINMISCCTL} add mips --interpreter "${interpreter}" \
--magic "\x7f\x45\x4c\x46\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08" \
--mask "\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff" \
--size 20 --set-enabled
else
echo "$0: interpreter ${interpreter} not found, cannot register."
fi
# register mipsle interpreter styled 'mipsel'
interpreter=${QEMU_DIR}/${QEMU_PREFIX}mipsel${QEMU_SUFFIX}
if [ -x "${interpreter}" ]; then
${BINMISCCTL} add mipsel --interpreter "${interpreter}" \
--magic "\x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00" \
--mask "\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff" \
--size 20 --set-enabled
else
echo "$0: interpreter ${interpreter} not found, cannot register."
fi
# register mips64 interpreter styled 'mips64'
interpreter=${QEMU_DIR}/${QEMU_PREFIX}mips64${QEMU_SUFFIX}
if [ -x "${interpreter}" ]; then
${BINMISCCTL} add mips64 --interpreter "${interpreter}" \
--magic "\x7f\x45\x4c\x46\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08" \
--mask "\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff" \
--size 20 --set-enabled
else
echo "$0: interpreter ${interpreter} not found, cannot register."
fi
# register powerpc interpreter styled 'ppc'
interpreter=${QEMU_DIR}/${QEMU_PREFIX}ppc${QEMU_SUFFIX}
if [ -x "${interpreter}" ]; then
${BINMISCCTL} add powerpc --interpreter "${interpreter}" \
--magic "\x7f\x45\x4c\x46\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14" \
--mask "\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff" \
--size 20 --set-enabled
else
echo "$0: interpreter ${interpreter} not found, cannot register."
fi
# register powerpc64 interpreter styled 'ppc64'
interpreter=${QEMU_DIR}/${QEMU_PREFIX}ppc64${QEMU_SUFFIX}
if [ -x "${interpreter}" ]; then
${BINMISCCTL} add powerpc64 --interpreter "${interpreter}" \
--magic "\x7f\x45\x4c\x46\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x15" \
--mask "\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff" \
--size 20 --set-enabled
else
echo "$0: interpreter ${interpreter} not found, cannot register."
fi
# register riscv64 interpreter styled 'riscv64'
interpreter=${QEMU_DIR}/${QEMU_PREFIX}riscv64${QEMU_SUFFIX}
if [ -x "${interpreter}" ]; then
${BINMISCCTL} add riscv64 --interpreter "${interpreter}" \
--magic "\x7f\x45\x4c\x46\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xf3\x00" \
--mask "\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff" \
--size 20 --set-enabled
else
echo "$0: interpreter ${interpreter} not found, cannot register."
fi
# register sparc64 interpreter styled 'sparc64'
interpreter=${QEMU_DIR}/${QEMU_PREFIX}sparc64${QEMU_SUFFIX}
if [ -x "${interpreter}" ]; then
${BINMISCCTL} add sparc64 --interpreter "${interpreter}" \
--magic "\x7f\x45\x4c\x46\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2b" \
--mask "\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff" \
--size 20 --set-enabled
else
echo "$0: interpreter ${interpreter} not found, cannot register."
fi
}
%%NAME%%_stop()
{
${BINMISCCTL} remove arm
${BINMISCCTL} remove armv6
${BINMISCCTL} remove armv7
${BINMISCCTL} remove aarch64
${BINMISCCTL} remove mips
${BINMISCCTL} remove mips64
${BINMISCCTL} remove mipsel
${BINMISCCTL} remove powerpc
${BINMISCCTL} remove powerpc64
${BINMISCCTL} remove riscv64
${BINMISCCTL} remove sparc64
}
run_rc_command "$1"

View File

@ -0,0 +1,22 @@
QEMU is a FAST! processor emulator using dynamic translation to achieve
good emulation speed.
QEMU has two operating modes:
* Full system emulation. In this mode, QEMU emulates a full system
(for example a PC), including a processor and various peripherials.
It can be used to launch different Operating Systems without rebooting
the PC or to debug system code.
* User mode emulation (Linux host only). In this mode, QEMU can launch
Linux processes compiled for one CPU on another CPU. It can be used to
launch the Wine Windows API emulator or to ease cross-compilation and
cross-debugging.
As QEMU requires no host kernel patches to run, it is very safe and easy to use.
This port builds static bsd-user targets named like qemu-mips-static. While
still being experimental, people have already built many armv6/mips/mips64 ports
using these and, e.g., poudriere. Some notes are also here:
http://wiki.freebsd.org/QemuUserModeHowTo
WWW: http://wiki.qemu.org/Main_Page

View File

@ -0,0 +1,13 @@
%%64BIT%%bin/qemu-aarch64-static
bin/qemu-arm-static
bin/qemu-i386-static
bin/qemu-mips-static
%%64BIT%%bin/qemu-mips64-static
%%64BIT%%bin/qemu-mips64el-static
bin/qemu-mipsel-static
bin/qemu-ppc-static
%%64BIT%%bin/qemu-ppc64-static
%%64BIT%%bin/qemu-riscv64-static
bin/qemu-sparc-static
%%64BIT%%bin/qemu-sparc64-static
%%64BIT%%bin/qemu-x86_64-static