Skip to content

Commit

Permalink
Merge PR #2907: Implement support for building Mumble and Murmur usin…
Browse files Browse the repository at this point in the history
…g the MinGW toolchain.

This pull request implements support for building Mumble and Murmur with the MinGW toolchain.

Both x86 and x86_64 targets are supported, and most features work.

For now, we use, and test against MXE (http://www.mxe.cc).

The PR also implements a Linux-based cross-build of Mumble and Murmur on Travis CI. This environment uses Wine as a test runner.
  • Loading branch information
mkrautz committed Mar 17, 2017
2 parents 8758cf5 + cb1c1b4 commit 10079ed
Show file tree
Hide file tree
Showing 35 changed files with 361 additions and 107 deletions.
9 changes: 7 additions & 2 deletions .travis.yml
Expand Up @@ -5,8 +5,13 @@ compiler: gcc

env:
matrix:
- MUMBLE_QT=qt4
- MUMBLE_QT=qt5
- MUMBLE_QT=qt4 MUMBLE_HOST=x86_64-linux-gnu
- MUMBLE_QT=qt5 MUMBLE_HOST=x86_64-linux-gnu
- MUMBLE_QT=qt5 MUMBLE_HOST=i686-w64-mingw32
- MUMBLE_QT=qt5 MUMBLE_HOST=x86_64-w64-mingw32
allow_failures:
- env: MUMBLE_QT=qt5 MUMBLE_HOST=i686-w64-mingw32
- env: MUMBLE_QT=qt5 MUMBLE_HOST=x86_64-w64-mingw32

before_install:
- ./scripts/travis-ci/before_install.bash
Expand Down
20 changes: 14 additions & 6 deletions 3rdparty/celt-0.11.0-build/celt-0.11.0-build.pro
Expand Up @@ -36,13 +36,21 @@ QMAKE_CFLAGS -= -fPIE -pie

win32 {
DEFINES += WIN32 _WIN32
INCLUDEPATH += ../$$BUILDDIR/win32

CONFIG(sse2) {
TARGET_VERSION_EXT = .$${VERSION}.sse2
} else {
QMAKE_CFLAGS_RELEASE -= -arch:SSE
QMAKE_CFLAGS_DEBUG -= -arch:SSE
win32-g++ {
# MinGW uses the config.h for Unix-like systems.
INCLUDEPATH += ../$$BUILDDIR
}

win32-msvc* {
INCLUDEPATH += ../$$BUILDDIR/win32

CONFIG(sse2) {
TARGET_VERSION_EXT = .$${VERSION}.sse2
} else {
QMAKE_CFLAGS_RELEASE -= -arch:SSE
QMAKE_CFLAGS_DEBUG -= -arch:SSE
}
}
}

Expand Down
20 changes: 14 additions & 6 deletions 3rdparty/celt-0.7.0-build/celt-0.7.0-build.pro
Expand Up @@ -43,13 +43,21 @@ QMAKE_CFLAGS -= -fPIE -pie

win32 {
DEFINES += WIN32 _WIN32
INCLUDEPATH += ../$$BUILDDIR/win32

CONFIG(sse2) {
TARGET_VERSION_EXT = .$${VERSION}.sse2
} else {
QMAKE_CFLAGS_RELEASE -= -arch:SSE
QMAKE_CFLAGS_DEBUG -= -arch:SSE
win32-g++ {
# MinGW uses the config.h for Unix-like systems.
INCLUDEPATH += ../$$BUILDDIR
}

win32-msvc* {
INCLUDEPATH += ../$$BUILDDIR/win32

CONFIG(sse2) {
TARGET_VERSION_EXT = .$${VERSION}.sse2
} else {
QMAKE_CFLAGS_RELEASE -= -arch:SSE
QMAKE_CFLAGS_DEBUG -= -arch:SSE
}
}
}

Expand Down
10 changes: 6 additions & 4 deletions 3rdparty/minhook-build/minhook-build.pro
Expand Up @@ -34,11 +34,13 @@ DEFINES += WIN32 _WINDOWS _USRDLL MINHOOK_EXPORTS
CONFIG += warn_off
}

QMAKE_CFLAGS_RELEASE -= -MD
QMAKE_CFLAGS_DEBUG -= -MDd
win32-msvc* {
QMAKE_CFLAGS_RELEASE -= -MD
QMAKE_CFLAGS_DEBUG -= -MDd

QMAKE_CXXFLAGS_RELEASE *= -MT
QMAKE_CXXFLAGS_DEBUG *= -MTd
QMAKE_CXXFLAGS_RELEASE *= -MT
QMAKE_CXXFLAGS_DEBUG *= -MTd
}

SOURCES *= \
src/hde/hde64.c \
Expand Down
2 changes: 1 addition & 1 deletion 3rdparty/opus-build/opus-build.pro
Expand Up @@ -76,7 +76,7 @@ INCLUDEPATH *= \
../$$SOURCEDIR/silk/x86 \
../$$SOURCEDIR/silk/float

win32 {
win32-msvc* {
CONFIG *= opus-sse-sources
CONFIG *= opus-sse2-sources
CONFIG *= opus-sse41-sources
Expand Down
File renamed without changes.
File renamed without changes.
26 changes: 18 additions & 8 deletions 3rdparty/speex-build/speex-build.pro
Expand Up @@ -43,19 +43,29 @@ INCLUDEPATH = ../speex-src/include ../speex-src/libspeex ../speexdsp-src/include
win32 {
INCLUDEPATH += ../speex-build/win32
DEFINES+=WIN32 _WINDOWS _USE_SSE _USE_MATH_DEFINES

win32-g++ {
# MinGW uses the config.h for Unix-like systems.
INCLUDEPATH += ../speex-build
}

win32-msvc* {
INCLUDEPATH += ../speex-build/win32

CONFIG(sse2) {
TARGET = speex.sse2
DEFINES += _USE_SSE2
} else {
QMAKE_CFLAGS_RELEASE -= -arch:SSE
QMAKE_CFLAGS_DEBUG -= -arch:SSE
}
}

SOURCES *= mumble_speex_init.c

CONFIG -= static
CONFIG += shared

CONFIG(sse2) {
TARGET = speex.sse2
DEFINES += _USE_SSE2
} else {
QMAKE_CFLAGS_RELEASE -= -arch:SSE
QMAKE_CFLAGS_DEBUG -= -arch:SSE
}

DEFINES+=USE_SMALLFT

} else {
Expand Down
10 changes: 8 additions & 2 deletions g15helper/g15helper.pro
Expand Up @@ -40,7 +40,10 @@ CONFIG(g15-emulator) {

win32 {
RC_FILE = g15helper.rc
QMAKE_POST_LINK = $$QMAKE_POST_LINK$$escape_expand(\\n\\t)$$quote(mt.exe -nologo -updateresource:$(DESTDIR_TARGET);1 -manifest ../src/mumble/mumble.appcompat.manifest)

win32-msvc* {
QMAKE_POST_LINK = $$QMAKE_POST_LINK$$escape_expand(\\n\\t)$$quote(mt.exe -nologo -updateresource:$(DESTDIR_TARGET);1 -manifest ../src/mumble/mumble.appcompat.manifest)
}
}
} else {
CONFIG -= qt
Expand All @@ -52,7 +55,10 @@ CONFIG(g15-emulator) {
QMAKE_LIBDIR *= "$$G15SDK_PATH/Lib/x86"
INCLUDEPATH *= "$$G15SDK_PATH/Src"
DEFINES *= WIN32
QMAKE_POST_LINK = $$QMAKE_POST_LINK$$escape_expand(\\n\\t)$$quote(mt.exe -nologo -updateresource:$(DESTDIR_TARGET);1 -manifest ../src/mumble/mumble.appcompat.manifest)

win32-msvc* {
QMAKE_POST_LINK = $$QMAKE_POST_LINK$$escape_expand(\\n\\t)$$quote(mt.exe -nologo -updateresource:$(DESTDIR_TARGET);1 -manifest ../src/mumble/mumble.appcompat.manifest)
}

CONFIG(release, debug|release) {
QMAKE_CFLAGS_RELEASE -= -MD
Expand Down
23 changes: 21 additions & 2 deletions qmake/compiler.pri
Expand Up @@ -24,8 +24,27 @@ QMAKE_RESOURCE_FLAGS += -compress 9
# QMAKE_TARGET.arch doesn't suffice any longer, and
# we define MUMBLE_ARCH to be used in its place.
MUMBLE_ARCH = $$QMAKE_TARGET.arch
# When using Qt 5, use QT_ARCH instead of QMAKE_TARGET.
# It also works for cross-builds.
isEqual(QT_MAJOR_VERSION, 5) {
MUMBLE_ARCH = $$QT_ARCH
}

win32-g++ {
DEFINES *= MINGW_HAS_SECURE_API

# Enable SSE
QMAKE_CFLAGS *= -msse -msse2
QMAKE_CXXFLAGS *= -msse -msse2

CONFIG(symbols) {
# Configure build to be able to properly debug release builds
QMAKE_CFLAGS *= -g
QMAKE_CXXFLAGS *= -g
}
}

win32 {
win32-msvc* {
# Define the CONFIG options 'force-x86-toolchain' and
# 'force-x86_64-toolchain'. These can be used to force
# the target of a .pro file to be built for a specific
Expand Down Expand Up @@ -189,7 +208,7 @@ win32 {
}
}

unix {
unix|win32-g++ {
DEFINES *= RESTRICT=__restrict__
QMAKE_CFLAGS *= -fvisibility=hidden
QMAKE_CXXFLAGS *= -fvisibility=hidden
Expand Down
6 changes: 5 additions & 1 deletion qmake/openssl.pri
Expand Up @@ -13,12 +13,16 @@ include(pkgconfig.pri)
# This file can't include compiler.pri: it can
# only be included once per .pro file.

win32 {
win32-msvc* {
INCLUDEPATH *= "$$OPENSSL_PATH/include"
QMAKE_LIBDIR *= "$$OPENSSL_PATH/lib"
LIBS *= -lgdi32 -llibeay32
}

win32-g++ {
LIBS *= -lssl -lcrypto -lgdi32
}

unix {
contains(UNAME, FreeBSD) {
LIBS *= -lcrypto -lssl
Expand Down
44 changes: 42 additions & 2 deletions scripts/travis-ci/before_install.bash
Expand Up @@ -5,14 +5,54 @@
# that can be found in the LICENSE file at the root of the
# Mumble source tree or at <https://www.mumble.info/LICENSE>.

MUMBLE_HOST_DEB=${MUMBLE_HOST/_/-}

if [ "${TRAVIS_OS_NAME}" == "linux" ]; then
if [ "${MUMBLE_QT}" == "qt4" ]; then
if [ "${MUMBLE_QT}" == "qt4" ] && [ "${MUMBLE_HOST}" == "x86_64-linux-gnu" ]; then
sudo apt-get -qq update
sudo apt-get build-dep -qq mumble
elif [ "${MUMBLE_QT}" == "qt5" ]; then
elif [ "${MUMBLE_QT}" == "qt5" ] && [ "${MUMBLE_HOST}" == "x86_64-linux-gnu" ]; then
sudo apt-get -qq update
sudo apt-get build-dep -qq mumble
sudo apt-get install qt5-default qttools5-dev qttools5-dev-tools qtbase5-dev qtbase5-dev-tools qttranslations5-l10n libqt5svg5-dev
elif [ "${MUMBLE_QT}" == "qt5" ] && [ "${MUMBLE_HOST}" == "i686-w64-mingw32" ]; then
sudo dpkg --add-architecture i386
sudo apt-get -qq update
echo "deb http://pkg.mxe.cc/repos/apt/debian jessie main" | sudo tee /etc/apt/sources.list.d/mxeapt.list
sudo apt-key adv --keyserver x-hkp://keys.gnupg.net --recv-keys D43A795B73B16ABE9643FE1AFD8FFF16DB45C6AB
sudo apt-get -qq update
sudo apt-get install \
wine \
mxe-${MUMBLE_HOST_DEB}.static-qtbase \
mxe-${MUMBLE_HOST_DEB}.static-qtsvg \
mxe-${MUMBLE_HOST_DEB}.static-qttools \
mxe-${MUMBLE_HOST_DEB}.static-qttranslations \
mxe-${MUMBLE_HOST_DEB}.static-boost \
mxe-${MUMBLE_HOST_DEB}.static-protobuf \
mxe-${MUMBLE_HOST_DEB}.static-sqlite \
mxe-${MUMBLE_HOST_DEB}.static-flac \
mxe-${MUMBLE_HOST_DEB}.static-ogg \
mxe-${MUMBLE_HOST_DEB}.static-vorbis \
mxe-${MUMBLE_HOST_DEB}.static-libsndfile
elif [ "${MUMBLE_QT}" == "qt5" ] && [ "${MUMBLE_HOST}" == "x86_64-w64-mingw32" ]; then
sudo dpkg --add-architecture i386
sudo apt-get -qq update
echo "deb http://pkg.mxe.cc/repos/apt/debian jessie main" | sudo tee /etc/apt/sources.list.d/mxeapt.list
sudo apt-key adv --keyserver x-hkp://keys.gnupg.net --recv-keys D43A795B73B16ABE9643FE1AFD8FFF16DB45C6AB
sudo apt-get -qq update
sudo apt-get install \
wine \
mxe-${MUMBLE_HOST_DEB}.static-qtbase \
mxe-${MUMBLE_HOST_DEB}.static-qtsvg \
mxe-${MUMBLE_HOST_DEB}.static-qttools \
mxe-${MUMBLE_HOST_DEB}.static-qttranslations \
mxe-${MUMBLE_HOST_DEB}.static-boost \
mxe-${MUMBLE_HOST_DEB}.static-protobuf \
mxe-${MUMBLE_HOST_DEB}.static-sqlite \
mxe-${MUMBLE_HOST_DEB}.static-flac \
mxe-${MUMBLE_HOST_DEB}.static-ogg \
mxe-${MUMBLE_HOST_DEB}.static-vorbis \
mxe-${MUMBLE_HOST_DEB}.static-libsndfile
else
exit 1
fi
Expand Down
22 changes: 20 additions & 2 deletions scripts/travis-ci/script.bash
Expand Up @@ -6,10 +6,28 @@
# Mumble source tree or at <https://www.mumble.info/LICENSE>.

if [ "${TRAVIS_OS_NAME}" == "linux" ]; then
if [ "${MUMBLE_QT}" == "qt4" ]; then
if [ "${MUMBLE_QT}" == "qt4" ] && [ "${MUMBLE_HOST}" == "x86_64-linux-gnu" ]; then
qmake-qt4 CONFIG+="release tests g15-emulator qt4-legacy-compat" -recursive && make -j2 && make check
elif [ "${MUMBLE_QT}" == "qt5" ]; then
elif [ "${MUMBLE_QT}" == "qt5" ] && [ "${MUMBLE_HOST}" == "x86_64-linux-gnu" ]; then
qmake CONFIG+="release tests g15-emulator" -recursive && make -j2 && make check
elif [ "${MUMBLE_QT}" == "qt5" ] && [ "${MUMBLE_HOST}" == "i686-w64-mingw32" ]; then
wget http://www.steinberg.net/sdk_downloads/asiosdk2.3.zip -P ../
unzip ../asiosdk2.3.zip -d ../
mv ../ASIOSDK2.3 3rdparty/asio
PATH=$PATH:/usr/lib/mxe/usr/bin
export MUMBLE_PROTOC=/usr/lib/mxe/usr/x86_64-unknown-linux-gnu/bin/protoc
${MUMBLE_HOST}.static-qmake-qt5 -recursive -Wall CONFIG+="release tests warnings-as-errors winpaths_custom g15-emulator no-overlay no-bonjour no-elevation no-ice"
make -j2
make check TESTRUNNER="wine"
elif [ "${MUMBLE_QT}" == "qt5" ] && [ "${MUMBLE_HOST}" == "x86_64-w64-mingw32" ]; then
wget http://www.steinberg.net/sdk_downloads/asiosdk2.3.zip -P ../
unzip ../asiosdk2.3.zip -d ../
mv ../ASIOSDK2.3 3rdparty/asio
PATH=$PATH:/usr/lib/mxe/usr/bin
export MUMBLE_PROTOC=/usr/lib/mxe/usr/x86_64-unknown-linux-gnu/bin/protoc
${MUMBLE_HOST}.static-qmake-qt5 -recursive -Wall CONFIG+="release tests warnings-as-errors winpaths_custom g15-emulator no-overlay no-bonjour no-elevation no-ice"
make -j2
make check TESTRUNNER="wine"
else
exit 1
fi
Expand Down
2 changes: 1 addition & 1 deletion src/Connection.cpp
Expand Up @@ -62,7 +62,7 @@ void Connection::setToS() {
return;

dwFlow = 0;
if (! QOSAddSocketToFlow(hQoS, qtsSocket->socketDescriptor(), NULL, QOSTrafficTypeAudioVideo, QOS_NON_ADAPTIVE_FLOW, &dwFlow))
if (! QOSAddSocketToFlow(hQoS, qtsSocket->socketDescriptor(), NULL, QOSTrafficTypeAudioVideo, QOS_NON_ADAPTIVE_FLOW, reinterpret_cast<PQOS_FLOWID>(&dwFlow)))
qWarning("Connection: Failed to add flow to QOS");
#elif defined(Q_OS_UNIX)
int val = 0xa0;
Expand Down
2 changes: 1 addition & 1 deletion src/Timer.cpp
Expand Up @@ -18,7 +18,7 @@
// https://github.com/boostorg/system/blob/boost-1.56.0/include/boost/system/error_code.hpp#L514-L516
// vs.
// https://github.com/boostorg/system/blob/boost-1.55.0/include/boost/system/error_code.hpp#L515-L517
#if BOOST_VERSION >= 105600
#if BOOST_VERSION >= 105600 && !defined(__MINGW32__)
# define USE_BOOST_CHRONO
#endif

Expand Down
7 changes: 6 additions & 1 deletion src/mumble.pri
Expand Up @@ -36,7 +36,7 @@ CONFIG(packaged) {
# Add OpenSSL dependency
include(../qmake/openssl.pri)

win32 {
win32-msvc* {
INCLUDEPATH *= "$$PROTOBUF_PATH/vsprojects/include" "$$PROTOBUF_PATH/src" protobuf
CONFIG(debug, debug|release) {
QMAKE_LIBDIR *= "$$PROTOBUF_PATH/vsprojects/Debug"
Expand All @@ -48,6 +48,11 @@ win32 {
LIBS *= -ldelayimp -lQwave -delayload:Qwave.DLL
}

win32-g++ {
LIBS *= -lprotobuf -lcrypt32 -lws2_32
LIBS *= -ldelayimp -lqwave -delayload:qwave.dll
}

unix {
CONFIG(static) {
PKG_CONFIG = pkg-config --static
Expand Down
10 changes: 5 additions & 5 deletions src/mumble/CrashReporter.cpp
Expand Up @@ -10,6 +10,7 @@
#include "Global.h"
#include "NetworkConfig.h"
#include "OSInfo.h"
#include "EnvUtils.h"

CrashReporter::CrashReporter(QWidget *p) : QDialog(p) {
setWindowTitle(tr("Mumble Crash Report"));
Expand Down Expand Up @@ -146,11 +147,10 @@ void CrashReporter::run() {
qsl << qtf.fileName();

QString app = QLatin1String("dxdiag.exe");
wchar_t *sr = NULL;
size_t srsize = 0;
if (_wdupenv_s(&sr, &srsize, L"SystemRoot") == 0) {
app = QDir::fromNativeSeparators(QString::fromWCharArray(sr)) + QLatin1String("/System32/dxdiag.exe");
free(sr);
QString systemRoot = EnvUtils::getenv(QLatin1String("SystemRoot"));

if (systemRoot.count() > 0) {
app = QDir::fromNativeSeparators(systemRoot + QLatin1String("/System32/dxdiag.exe"));
}

qp.start(app, qsl);
Expand Down
4 changes: 2 additions & 2 deletions src/mumble/DirectSound.cpp
Expand Up @@ -201,7 +201,7 @@ void DXAudioOutput::run() {
LPDIRECTSOUND8 pDS = NULL;
LPDIRECTSOUNDBUFFER pDSBPrimary = NULL;
LPDIRECTSOUNDBUFFER pDSBOutput = NULL;
LPDIRECTSOUNDNOTIFY8 pDSNotify = NULL;
LPDIRECTSOUNDNOTIFY pDSNotify = NULL;

int iLastwriteblock;
LPVOID aptr1, aptr2;
Expand Down Expand Up @@ -457,7 +457,7 @@ DXAudioInput::~DXAudioInput() {
void DXAudioInput::run() {
LPDIRECTSOUNDCAPTURE8 pDSCapture;
LPDIRECTSOUNDCAPTUREBUFFER pDSCaptureBuffer;
LPDIRECTSOUNDNOTIFY8 pDSNotify;
LPDIRECTSOUNDNOTIFY pDSNotify;

DWORD dwBufferSize;
bool bOk;
Expand Down
1 change: 1 addition & 0 deletions src/mumble/DirectSound.h
Expand Up @@ -10,6 +10,7 @@
#include "AudioOutput.h"
#define DIRECTSOUND_VERSION 0x1000

#include <mmsystem.h>
#include <dsound.h>
#include <ks.h>
#include <ksmedia.h>
Expand Down

0 comments on commit 10079ed

Please sign in to comment.