From 2f03a12d35cd39131f9771998d986929951b624c Mon Sep 17 00:00:00 2001 From: Kyle Evans Date: Mon, 2 Dec 2019 03:40:49 +0000 Subject: [PATCH] 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) --- emulators/Makefile | 1 + emulators/qemu-sbruno/Makefile | 2 + emulators/qemu-user-static-devel/Makefile | 91 ++++++++++ emulators/qemu-user-static-devel/distinfo | 5 + .../files/qemu_user_static.in | 164 ++++++++++++++++++ emulators/qemu-user-static-devel/pkg-descr | 22 +++ emulators/qemu-user-static-devel/pkg-plist | 13 ++ 7 files changed, 298 insertions(+) create mode 100644 emulators/qemu-user-static-devel/Makefile create mode 100644 emulators/qemu-user-static-devel/distinfo create mode 100644 emulators/qemu-user-static-devel/files/qemu_user_static.in create mode 100644 emulators/qemu-user-static-devel/pkg-descr create mode 100644 emulators/qemu-user-static-devel/pkg-plist diff --git a/emulators/Makefile b/emulators/Makefile index bc2757dff3bc..091550132517 100644 --- a/emulators/Makefile +++ b/emulators/Makefile @@ -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 diff --git a/emulators/qemu-sbruno/Makefile b/emulators/qemu-sbruno/Makefile index 1ba6124ca70a..6f0cb165eff7 100644 --- a/emulators/qemu-sbruno/Makefile +++ b/emulators/qemu-sbruno/Makefile @@ -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) diff --git a/emulators/qemu-user-static-devel/Makefile b/emulators/qemu-user-static-devel/Makefile new file mode 100644 index 000000000000..99491205f845 --- /dev/null +++ b/emulators/qemu-user-static-devel/Makefile @@ -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 + +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 diff --git a/emulators/qemu-user-static-devel/distinfo b/emulators/qemu-user-static-devel/distinfo new file mode 100644 index 000000000000..17550974da8a --- /dev/null +++ b/emulators/qemu-user-static-devel/distinfo @@ -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 diff --git a/emulators/qemu-user-static-devel/files/qemu_user_static.in b/emulators/qemu-user-static-devel/files/qemu_user_static.in new file mode 100644 index 000000000000..4022421f8963 --- /dev/null +++ b/emulators/qemu-user-static-devel/files/qemu_user_static.in @@ -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" diff --git a/emulators/qemu-user-static-devel/pkg-descr b/emulators/qemu-user-static-devel/pkg-descr new file mode 100644 index 000000000000..7bfc44d21531 --- /dev/null +++ b/emulators/qemu-user-static-devel/pkg-descr @@ -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 diff --git a/emulators/qemu-user-static-devel/pkg-plist b/emulators/qemu-user-static-devel/pkg-plist new file mode 100644 index 000000000000..4d2d53891d55 --- /dev/null +++ b/emulators/qemu-user-static-devel/pkg-plist @@ -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