From: Stefan Weil <s...@weilnetz.de> The GitHub action is restricted to https://github.com/qemu/qemu.
Signed-off-by: Stefan Weil <s...@weilnetz.de> Message-Id: <20200803202042.1869013-1...@weilnetz.de> Signed-off-by: Philippe Mathieu-Daudé <f4...@amsat.org> --- .github/workflows/build.sh | 112 ++++++++++++++++++++++ .github/workflows/pkg-config-crosswrapper | 37 +++++++ .github/workflows/win.yml | 34 +++++++ 3 files changed, 183 insertions(+) create mode 100755 .github/workflows/build.sh create mode 100755 .github/workflows/pkg-config-crosswrapper create mode 100644 .github/workflows/win.yml diff --git a/.github/workflows/build.sh b/.github/workflows/build.sh new file mode 100755 index 0000000000..c430a367be --- /dev/null +++ b/.github/workflows/build.sh @@ -0,0 +1,112 @@ +#!/bin/bash + +# GitHub actions - Create QEMU installer for Windows + +# Author: Stefan Weil (2020) + +#~ set -e +set -x + +ARCH=$1 +DLLS="libgcc_s_sjlj-1.dll libgomp-1.dll libstdc++-6.dll" + +if test "$ARCH" != "i686"; then + ARCH=x86_64 + DLLS="libgcc_s_seh-1.dll libgomp-1.dll libstdc++-6.dll" +fi + +ROOTDIR=$PWD +DISTDIR=$ROOTDIR/dist +HOST=$ARCH-w64-mingw32 +BUILDDIR=bin/ndebug/$HOST +PKG_ARCH=mingw64-${ARCH/_/-} + +# Install cygwin key and add cygwin sources. +curl -s https://qemu.weilnetz.de/debian/gpg.key | sudo apt-key add - +echo deb https://qemu.weilnetz.de/debian/ testing contrib | \ + sudo tee /etc/apt/sources.list.d/cygwin.list + +# Install packages. +sudo apt-get update +sudo apt-get install --no-install-recommends \ + mingw-w64-tools nsis \ + gcc libc6-dev \ + g++-mingw-w64-${ARCH/_/-} gcc-mingw-w64-${ARCH/_/-} \ + bison flex gettext python3-sphinx texinfo \ + $PKG_ARCH-adwaita-icon-theme $PKG_ARCH-cogl $PKG_ARCH-curl \ + $PKG_ARCH-gmp $PKG_ARCH-gnutls $PKG_ARCH-gtk3 $PKG_ARCH-icu \ + $PKG_ARCH-libxml2 $PKG_ARCH-ncurses $PKG_ARCH-sdl2 $PKG_ARCH-usbredir + +# Workaround for buggy cross pkg-config. +sudo ln -sf $PWD/.github/workflows/pkg-config-crosswrapper \ + /usr/bin/$HOST-pkg-config + +# Get header files for WHPX API from Mingw-w64 git master. +( +sudo mkdir -p /usr/$HOST/sys-include +cd /usr/$HOST/sys-include +SF_URLBASE=https://sourceforge.net +URL=$SF_URLBASE/p/mingw-w64/mingw-w64/ci/master/tree/mingw-w64-headers/include +sudo curl -s -o winhvemulation.h $URL/winhvemulation.h?format=raw +sudo curl -s -o winhvplatform.h $URL/winhvplatform.h?format=raw +sudo curl -s -o winhvplatformdefs.h $URL/winhvplatformdefs.h?format=raw +sudo ln -s winhvemulation.h WinHvEmulation.h +sudo ln -s winhvplatform.h WinHvPlatform.h +sudo ln -s winhvplatformdefs.h WinHvPlatformDefs.h +) + +DLL_PATH=$PWD/dll/$HOST + +mkdir -p $DISTDIR +mkdir -p $DLL_PATH + +for dll in $DLLS; do + ln -sf /usr/lib/gcc/$HOST/*-win32/$dll $DLL_PATH +done + +DLLS="iconv.dll libatk-1.0-0.dll libbz2-1.dll" +DLLS="$DLLS libcairo-2.dll libcairo-gobject-2.dll libcurl-4.dll" +DLLS="$DLLS libeay32.dll libepoxy-0.dll libexpat-1.dll" +DLLS="$DLLS libffi-6.dll libfontconfig-1.dll libfreetype-6.dll" +DLLS="$DLLS libgdk-3-0.dll libgdk_pixbuf-2.0-0.dll" +DLLS="$DLLS libgio-2.0-0.dll libglib-2.0-0.dll libgmodule-2.0-0.dll" +DLLS="$DLLS libgmp-10.dll libgnutls-30.dll libgobject-2.0-0.dll libgtk-3-0.dll" +DLLS="$DLLS libharfbuzz-0.dll libhogweed-4.dll libidn2-0.dll libintl-8.dll" +DLLS="$DLLS libjpeg-8.dll liblzo2-2.dll" +DLLS="$DLLS libncursesw6.dll libnettle-6.dll libnghttp2-14.dll" +DLLS="$DLLS libp11-kit-0.dll libpango-1.0-0.dll libpangocairo-1.0-0.dll" +DLLS="$DLLS libpangoft2-1.0-0.dll libpangowin32-1.0-0.dll libpcre-1.dll" +DLLS="$DLLS libpixman-1-0.dll libpng16-16.dll libssh2-1.dll libtasn1-6.dll" +DLLS="$DLLS libunistring-2.dll libusb-1.0.dll libusbredirparser-1.dll" +DLLS="$DLLS SDL2.dll ssleay32.dll zlib1.dll" + +for dll in $DLLS; do + ln -sf /usr/$HOST/sys-root/mingw/bin/$dll $DLL_PATH +done + +ln -sf /usr/$HOST/lib/libwinpthread-1.dll $DLL_PATH + +# Build QEMU installer. + +echo Building $HOST... +mingw=/usr/$HOST/sys-root/mingw +mkdir -p $BUILDDIR && cd $BUILDDIR + +# Run configure. +../../../configure --cross-prefix=$HOST- --disable-guest-agent-msi \ + --disable-werror --enable-whpx \ + --extra-cflags="-I $mingw/include" \ + --extra-ldflags="-L $mingw/lib" + +# Add config.log to build artifacts. +cp config.log $DISTDIR/ + +make + +echo Building installers... +date=$(date +%Y%m%d) +INSTALLER=$DISTDIR/qemu-$ARCH-setup-$date.exe +make installer DLL_PATH=$DLL_PATH SIGNCODE=true INSTALLER=$INSTALLER + +echo Calculate SHA-512 checksum... +(cd $DISTDIR; exe=$(basename $INSTALLER); sha512sum $exe >${exe/exe/sha512}) diff --git a/.github/workflows/pkg-config-crosswrapper b/.github/workflows/pkg-config-crosswrapper new file mode 100755 index 0000000000..768e554194 --- /dev/null +++ b/.github/workflows/pkg-config-crosswrapper @@ -0,0 +1,37 @@ +#! /bin/sh +# pkg-config wrapper for cross-building +# Sets pkg-config search path to search multiarch and historical cross-compiling paths. + +# If the user has already set PKG_CONFIG_LIBDIR, believe it (even if empty): +# it's documented to be an override +if [ x"${PKG_CONFIG_LIBDIR+set}" = x ]; then + # GNU triplet for the compiler, e.g. i486-linux-gnu for Debian i386, + # i686-linux-gnu for Ubuntu i386 + basename="${0##*/}" + triplet="${basename%-pkg-config}" + # Normalized multiarch path if any, e.g. i386-linux-gnu for i386 + multiarch="`dpkg-architecture -t"${triplet}" -qDEB_HOST_MULTIARCH 2>/dev/null`" + + PKG_CONFIG_LIBDIR="/usr/local/${triplet}/lib/pkgconfig" + # For a native build we would also want to append /usr/local/lib/pkgconfig + # at this point; but this is a cross-building script, so don't + PKG_CONFIG_LIBDIR="$PKG_CONFIG_LIBDIR:/usr/local/share/pkgconfig" + + if [ -n "$multiarch" ]; then + PKG_CONFIG_LIBDIR="/usr/local/lib/${multiarch}/pkgconfig:$PKG_CONFIG_LIBDIR" + PKG_CONFIG_LIBDIR="$PKG_CONFIG_LIBDIR:/usr/lib/${multiarch}/pkgconfig" + fi + + PKG_CONFIG_LIBDIR="$PKG_CONFIG_LIBDIR:/usr/${triplet}/lib/pkgconfig" + # For a native build we would also want to append /usr/lib/pkgconfig + # at this point; but this is a cross-building script, so don't + # If you want to allow use of un-multiarched -dev packages for crossing + # (at the risk of finding build-arch stuff you didn't want, if not in a clean chroot) + # Uncomment the next line: + # PKG_CONFIG_LIBDIR="$PKG_CONFIG_LIBDIR:/usr/lib/pkgconfig" + PKG_CONFIG_LIBDIR="$PKG_CONFIG_LIBDIR:/usr/share/pkgconfig" + + export PKG_CONFIG_LIBDIR +fi + +exec pkg-config "$@" diff --git a/.github/workflows/win.yml b/.github/workflows/win.yml new file mode 100644 index 0000000000..81cf48530f --- /dev/null +++ b/.github/workflows/win.yml @@ -0,0 +1,34 @@ +# GitHub actions - Create QEMU installers for Windows + +# The action is restricted to https://github.com/qemu/qemu. +# That avoids an unnecessary waste of resources when each fork +# runs the action, too. + +name: Cross build for Windows + +on: [push] + +jobs: + build32: + if: github.repository == 'qemu/qemu' + runs-on: [ubuntu-20.04] + steps: + - uses: actions/checkout@v2 + - name: Build QEMU installer (32 bit) + run: .github/workflows/build.sh i686 + - uses: actions/upload-artifact@v1 + with: + name: QEMU Installer Windows 32 bit + path: dist + + build64: + if: github.repository == 'qemu/qemu' + runs-on: [ubuntu-20.04] + steps: + - uses: actions/checkout@v2 + - name: Build QEMU installer (64 bit) + run: .github/workflows/build.sh x86_64 + - uses: actions/upload-artifact@v1 + with: + name: QEMU Installer Windows 64 bit + path: dist -- 2.21.3