Skip to content

Commit

Permalink
Merge pull request #6292 from elpaso/mxe
Browse files Browse the repository at this point in the history
Scripts for cross build QGIS for windows on Linux with mxe
  • Loading branch information
elpaso committed Feb 9, 2018
2 parents 9302613 + 4bd385f commit 2a4ab6b
Show file tree
Hide file tree
Showing 10 changed files with 414 additions and 21 deletions.
35 changes: 35 additions & 0 deletions INSTALL
Expand Up @@ -23,6 +23,7 @@ Last Change : Friday February 02, 2018
4.1. Building with Microsoft Visual Studio
4.2. Building using MinGW
4.3. Creation of MSYS environment for compilation of QGIS
4.4 Building on Linux with mxe
5. Building on MacOS X
5.1. Install Developer Tools
5.2. Install Qt4 from disk image
Expand Down Expand Up @@ -1027,6 +1028,40 @@ We're done with preparation of MSYS environment. Now you can delete all stuff in
of space and it's not necessary at all.



4.4. Building on Linux with mxe
===============================

With this approach you can build a windows binary on Linux using mxe MXE (M cross environment).
You can find the build script and a README file in the ms-windows/mxe directory.

For now, Python buildings cannot be built with mxe.

4.4.1. Initial setup
====================

Please follow the instructions on mxe website to setup your building toolchain http://mxe.cc/,
take note of the path where you have installed mxe.

4.4.2. Building the dependencies
================================

Please see the README under ms-windows/mxe for a list of the dependencies that need to be
built in mxe before attempting to build QGIS.


4.4.3. Cross-Building QGIS
==========================

Edit the build-mxe.sh script and change the path where your mxe installation is located, you
can also change the build and release directory.

4.4.4. Testing QGIS
====================

Copy and unzip the release package on a Windows machine and launch it!


5. Building on MacOS X
======================

Expand Down
6 changes: 3 additions & 3 deletions cmake/CreateQgsVersion.cmake
Expand Up @@ -2,7 +2,7 @@ MACRO(CREATE_QGSVERSION)
IF (EXISTS ${CMAKE_SOURCE_DIR}/.git/index)
FIND_PROGRAM(GITCOMMAND git PATHS c:/cygwin/bin)
IF(GITCOMMAND)
IF(WIN32)
IF(WIN32 AND NOT CMAKE_CROSS_COMPILING)
IF(USING_NINJA)
SET(ARG %a)
ELSE(USING_NINJA)
Expand All @@ -16,7 +16,7 @@ MACRO(CREATE_QGSVERSION)
MAIN_DEPENDENCY ${CMAKE_SOURCE_DIR}/.git/index
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
)
ELSE(WIN32)
ELSE(WIN32 AND NOT CMAKE_CROSS_COMPILING)
ADD_CUSTOM_COMMAND(
OUTPUT ${CMAKE_BINARY_DIR}/qgsversion.h ${CMAKE_BINARY_DIR}/qgsversion.inc
COMMAND ${GITCOMMAND} log -n1 --pretty=\#define\\ QGSVERSION\\ \\"%h\\" >${CMAKE_BINARY_DIR}/qgsversion.h.temp
Expand All @@ -26,7 +26,7 @@ MACRO(CREATE_QGSVERSION)
MAIN_DEPENDENCY ${CMAKE_SOURCE_DIR}/.git/index
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
)
ENDIF(WIN32)
ENDIF(WIN32 AND NOT CMAKE_CROSS_COMPILING)
ELSE(GITCOMMAND)
MESSAGE(STATUS "git marker, but no git found - version will be unknown")
IF(NOT SHA)
Expand Down
120 changes: 120 additions & 0 deletions ms-windows/mxe/README
@@ -0,0 +1,120 @@

Scripts to cross build a windows QGIS binary from Linux using MXE:
(M cross environment) http://mxe.cc/

For now, Python bindings cannot be built with mxe.

Follow the instructions on the website to prepare the mxe environment, you
will need to build all required dependencies for QGIS.

Note that some of the packages listed below are dependencies of other
packages, you will probably not need to build them all explicitly.


armadillo
bfd
bzip2
cairo
cmake
curl
dbus
dlfcn-win32
expat
fontconfig
freetds
freetype
freexl
gcc
gdal
gendef
geos
gettext
giflib
glib
gmp
gnutls
gsl
gta
harfbuzz
hdf4
hdf5
icu4c
isl
jasper
jpeg
json-c
lcms
libffi
libgcrypt
libgeotiff
libgnurx
libgpg_error
libiconv
libidn2
libmng
libmysqlclient
libpng
libspatialindex
libssh2
libunistring
libwebp
libxml2
libzip
lzo
mpc
mpfr
netcdf
nettle
openblas
openjpeg
openssl
pcre
pcre2
pixman
pkgconf
portablexdr
postgresql
proj
qca
qscintilla2
qt3d
qtactiveqt
qtbase
qtcanvas3d
qtcharts
qtconnectivity
qtdatavis3d
qtdeclarative
qtgamepad
qtgraphicaleffects
qtimageformats
qtkeychain
qtlocation
qtmultimedia
qtpurchasing
qtquickcontrols
qtquickcontrols2
qtscript
qtscxml
qtsensors
qtserialbus
qtserialport
qtspeech
qtsvg
qttools
qttranslations
qtvirtualkeyboard
qtwebchannel
qtwebkit
qtwebsockets
qtwebview
qtwinextras
qtxmlpatterns
qwt
spatialite
sqlite
tiff
xz
zlib

When done, you can edit the build-mxe.sh script to set the path to your mxe installation.
105 changes: 105 additions & 0 deletions ms-windows/mxe/build-mxe.sh
@@ -0,0 +1,105 @@
#!/bin/bash
###########################################################################
# build-mxe.sh
# ---------------------
# Date : February 2018
# Copyright : (C) 2018 by Alessandro Pasotti
# Email : elpaso at itopen dot it
###########################################################################
# #
# This program is free software; you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation; either version 2 of the License, or #
# (at your option) any later version. #
# #
###########################################################################


set -e

# Usage: you can pass an optional "package" command to skip the build
# and directly go to the packaging
# This script needs to be called from the main QGIS directory, the
# one which contains CMakeLists.txt

COMMAND=$1

# Location of current script
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
PYDEPLOY=${DIR}/deploy.py

# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# Configuration: change this!

# Location of mxe install dir
MXE=${HOME}/dev/mxe/

# Where the artifact will be saved

BUILD_DIR=`pwd`/build-mxe
RELEASE_DIR=`pwd`/release-mxe

# End configuration




if [[ "$COMMAND" != *"package"* ]]; then
[ -d $BUILD_DIR ] && rm -rf $BUILD_DIR
[ -d $RELEASE_DIR ] && rm -rf $RELEASE_DIR
# Make sure dirs exist

[ -d $BUILD_DIR ] || mkdir $BUILD_DIR
[ -d $RELEASE_DIR ] || mkdir $RELEASE_DIR
[ -d $RELEASE_DIR/qt5 ] || mkdir $RELEASE_DIR/qt5

fi

pushd .

cd $BUILD_DIR

# Build

if [[ "$COMMAND" != *"package"* ]]; then

$MXE/usr/bin/i686-w64-mingw32.shared-cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=$RELEASE_DIR \
-DENABLE_TESTS=OFF \
-DWITH_QSPATIALITE=ON \
-DWITH_APIDOC=OFF \
-DWITH_QWTPOLAR=ON \
-DWITH_ASTYLE=OFF \
-DWITH_SERVER=OFF \
-DWITH_BINDINGS=FALSE \
-DQT_LRELEASE_EXECUTABLE=$MXE/usr/i686-w64-mingw32.shared/qt5/bin/lrelease \
$ARGS


make -j16 install

fi

# Collect deps

$PYDEPLOY --build=$RELEASE_DIR --objdump=$MXE/usr/bin/i686-w64-mingw32.shared-objdump ${RELEASE_DIR}/qgis.exe
for dll in $(ls ${RELEASE_DIR}/*.dll); do \
$PYDEPLOY --build=$RELEASE_DIR --objdump=$MXE/usr/bin/i686-w64-mingw32.shared-objdump $dll; \
done

cp -r $MXE/usr/i686-w64-mingw32.shared/qt5/plugins $RELEASE_DIR/qt5

cat <<__TXT__ > ${RELEASE_DIR}/qt.conf
[Paths]
Plugins = qt5
__TXT__


popd

ZIP_NAME=release-`date +%Y-%m-%d-%H-%I-%S`.zip

zip -r $ZIP_NAME $RELEASE_DIR

echo "Release in $ZIP_NAME ready."

0 comments on commit 2a4ab6b

Please sign in to comment.