summaryrefslogtreecommitdiffstats
path: root/packaging/windows
diff options
context:
space:
mode:
authorGravatar Salvador Cuñat <salvador.cunat@gmail.com>2017-06-05 23:25:22 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2017-06-11 13:50:30 -0700
commit22612831bbd302bbc3f68ff377ccb8d53580c812 (patch)
tree1de888c75ce4fe9fcd8c5daaee2dfab3b2b7166a /packaging/windows
parentb012258617b4571cccfe1bfb8d2b7487b518f4b9 (diff)
downloadsubsurface-22612831bbd302bbc3f68ff377ccb8d53580c812.tar.gz
smtk-import: Add mxe cross-building script
Add to packaging/windows an script to build an installer for the importer tool.
Diffstat (limited to 'packaging/windows')
-rwxr-xr-xpackaging/windows/smtk2ssrf-mxe-build.sh229
1 files changed, 229 insertions, 0 deletions
diff --git a/packaging/windows/smtk2ssrf-mxe-build.sh b/packaging/windows/smtk2ssrf-mxe-build.sh
new file mode 100755
index 000000000..d0a5bf53f
--- /dev/null
+++ b/packaging/windows/smtk2ssrf-mxe-build.sh
@@ -0,0 +1,229 @@
+#!/bin/bash -e
+
+# This script is based in subsurface's packaging/windows/mxe-based-build.sh and
+# works in the same fashion. Building needs to be done in a directory out of
+# the source tree and, please, refer to said script for instructions on how to
+# build.
+#
+# Subsurface *MUST* have been built before running that script, as the importer
+# links against libsubsurface_corelib.a library.
+# Although is possible to build the latest git version of the importer against
+# whichever other version of subsurface, this should be avoided, and both
+# versions, subsurface and smtk-import should be the same.
+#
+# Flags and options:
+# -i (--installer): Packs a windows installer. This should always be used.
+# -t (--tag): Defines which git version we want to build. Defaults to
+# latest. E.g. -t v4.6.4
+# -b (--build): Values: debug or release. Defines the build we want to do.
+# -d (--dir): Specify a directory where a copy of the installer will be
+# placed. This is a *must* if the script runs in a VM, and
+# refers -usually- to a local dir mounted on the VM.
+#
+# Examples: (provided Subsurface has been previously cross built)
+#
+# smtk2ssrf-mxe-build.sh -i -t master
+# This will build an release installer of smtk2ssrf placed in a directory under
+# the win-build directory where it has been launched, named smtk-import. It will
+# build git latest master regardless of subsurface's cross built version.
+#
+# smtk2ssrf-mxe-build.sh -b debug
+# This will build *just* a windows binary (no packing) of the latest master.
+#
+# smtk2ssrf-mxe-build.sh -i -t v4.6.4 -b relase -d /mnt/data
+# As I'm building in a fedora-25 docker VM, this should bring up a release
+# installer of the v4.6.4 tag, and put a copy in my local mounted dir. In
+# fact this *should* fail to build because of portability issues in v4.6.4.
+#
+
+exec 1> >(tee ./winbuild_smtk2ssrf.log) 2>&1
+# for debugging
+# trap "set +x; sleep 1; set -x" DEBUG
+
+# Set some colors for pretty output
+#
+BLUE="\033[0;34m"
+RED="\033[0;31m"
+LIGHT_GRAY="\033[0;37m"
+DEFAULT="\033[0m"
+
+SSRF_TAG=""
+RELEASE="Release"
+
+# this is important, if we are building in a VM or if we want to get a copy
+# of the installer elsewhere out of the building tree.
+# In my case this is a mount point on the docker VM.
+DATADIR=""
+
+# Adjust desired build parallelism
+JOBS="-j1"
+
+EXECDIR=$(pwd)
+BASEDIR=$(cd "$EXECDIR/.."; pwd)
+BUILDDIR=$(cd "$EXECDIR"; pwd)
+
+echo -e "$BLUE-> $BUILDDIR$DEFAULT"
+
+if [[ ! -d "$BASEDIR"/mxe ]] ; then
+ echo -e "$RED--> Please start this from the right directory"
+ echo -e "usually a winbuild directory parallel to the mxe directory $DEFAULT"
+ exit 1
+fi
+
+echo -e "$BLUE---> Building in$LIGHT_GRAY $BUILDDIR ...$DEFAULT"
+
+# check for arguments and set options
+if [ $# -eq 0 ]; then
+ echo -e "$BLUE---> No arguments given."
+ echo -e "---> Building actual git commit and Release type without installer $DEFAULT"
+else
+ while [ $# -gt 0 ]; do
+ case $1 in
+ -t|--tag) SSRF_TAG="$2"
+ shift;;
+ -i|--installer) INSTALLER="installer"
+ ;;
+ -b|--build) RELEASE="$2"
+ shift;;
+ -d|--dir) DATADIR="$2"
+ shift;;
+ esac
+ shift
+ done
+ echo -e "$BLUE---> Subsurface tagged to:$LIGHT_GRAY $SSRF_TAG"
+ echo -e "$BLUE---> Building type:$LIGHT_GRAY $RELEASE"
+ echo -e "$BLUE---> Installer set to:$LIGHT_GRAY $INSTALLER $DEFAULT"
+fi
+case "$RELEASE" in
+ debug|Debug) RELEASE=Debug
+ DLL_SUFFIX="d"
+ [[ -f Release ]] && rm -rf ./*
+ touch Debug
+ ;;
+ release|Release) RELEASE=Release
+ DLL_SUFFIX=""
+ [[ -f Debug ]] && rm -rf ./*
+ touch Release
+ ;;
+esac
+
+export PATH="$BASEDIR"/mxe/usr/bin:$PATH:"$BASEDIR"/mxe/usr/i686-w64-mingw32.shared/qt5/bin/
+export CXXFLAGS=-std=c++11
+export PKG_CONFIG_PATH_i686_w64_mingw32_static="$BASEDIR/mxe/usr/i686-w64-mingw32.static/lib/pkgconfig"
+export PKG_CONFIG_PATH_i686_w64_mingw32_shared="$BASEDIR/mxe/usr/i686-w64-mingw32.shared/lib/pkgconfig"
+export PKG_CONFIG_PATH="$PKG_CONFIG_PATH_i686_w64_mingw32_static":"$PKG_CONFIG_PATH_i686_w64_mingw32_shared"
+
+#
+# mdbtools
+#
+if [ ! -f "$BASEDIR"/mxe/usr/i686-w64-mingw32.static/lib/libmdb.a ]; then
+ echo -e "$BLUE---> Building mdbtools ... $DEFAULT "
+ mkdir -p --verbose "$BASEDIR"/mxe/usr/i686-w64-mingw32.static/include
+ mkdir -p --verbose "$BASEDIR"/mxe/usr/i686-w64-mingw32.static/lib
+ cd "$BUILDDIR"
+ [[ -d mdbtools ]] && rm -rf mdbtools
+ mkdir -p mdbtools
+ cd mdbtools
+ if [ ! -f "$BASEDIR"/mdbtools/configure ] ; then
+ ( cd "$BASEDIR"/mdbtools
+ autoreconf -v -f -i )
+ fi
+ "$BASEDIR"/mdbtools/configure --host=i686-w64-mingw32.static \
+ --srcdir="$BASEDIR"/mdbtools \
+ --prefix="$BASEDIR"/mxe/usr/i686-w64-mingw32.static \
+ --enable-shared \
+ --disable-man \
+ --disable-gmdb2
+ make $JOBS >/dev/null
+ if [ $? -ne 0 ]; then
+ echo -e "$RED---> Building mdbtools failed. Aborting ...$DEFAULT "
+ exit 1
+ fi
+ make install
+else
+ echo -e "$BLUE---> Prebuilt mxe mdbtools ... $DEFAULT"
+fi
+
+# Subsurface
+#
+cd "$BASEDIR/subsurface"
+git reset --hard master && echo -e "$BLUE---> Uncommited changes to Subsurface (if any) dropped$DEFAULT"
+git pull "$(git remote -v |grep fetch |awk '{print $1}')" master
+if [ $? -ne 0 ]; then
+ echo -e "$RED---> git pull failed, Subsurface not updated$DEFAULT"
+else
+ echo -e "$BLUE---> Subsurface updated$DEFAULT"
+fi
+
+if [ "$SSRF_TAG" != "" ]; then
+ git checkout "$SSRF_TAG"
+ if [ $? -ne 0 ]; then
+ echo -e "$RED---> Failed to checkout Subsurface's $SSRF_TAG. Abort building. $DEFAULT"
+ exit 1
+ fi
+fi
+
+# Every thing is ok. Go on.
+cd "$BUILDDIR"
+
+# Blow up smtk-import binary dir and make it again, just to be extra-clean
+rm -rf smtk-import && echo -e "$BLUE---> Deleted$LIGHT_GRAY $BUILDDIR/smtk-import folder$DEFAULT"
+mkdir -p smtk-import && echo -e "$BLUE---> Created new$LIGHT_GRAY $BUILDDIR/smtk-import folder$DEFAULT"
+
+# first copy the Qt plugins in place
+QT_PLUGIN_DIRECTORIES="$BASEDIR/mxe/usr/i686-w64-mingw32.shared/qt5/plugins/iconengines \
+$BASEDIR/mxe/usr/i686-w64-mingw32.shared/qt5/plugins/imageformats \
+$BASEDIR/mxe/usr/i686-w64-mingw32.shared/qt5/plugins/platforms"
+
+# This comes from subsurface's mxe-based-build.sh. I'm not sure it is necessary
+# but, well, it doesn't hurt.
+EXTRA_MANUAL_DEPENDENCIES="$BASEDIR/mxe/usr/i686-w64-mingw32.shared/qt5/bin/Qt5Xml$DLL_SUFFIX.dll"
+
+STAGING_DIR=$BUILDDIR/smtk-import/staging
+
+mkdir -p "$STAGING_DIR"/plugins
+
+for d in $QT_PLUGIN_DIRECTORIES
+do
+ cp -a "$d" "$STAGING_DIR"/plugins
+done
+
+for f in $EXTRA_MANUAL_DEPENDENCIES
+do
+ cp "$f" "$STAGING_DIR"
+done
+
+# this is absolutely hackish, but necessary. Libmdb (built or prebuilt) is linked against
+# shared glib-2.0, but once and again we are trying to link against static lib.
+mv -vf "$BASEDIR"/mxe/usr/i686-w64-mingw32.static/lib/libglib-2.0.a "$BASEDIR"/mxe/usr/i686-w64-mingw32.static/lib/libglib-2.0.a.bak || \
+ echo -e "$BLUE------> libglib-2.0.a had been moved in a previous run$DEFAULT"
+
+cd "$BUILDDIR"/smtk-import
+mkdir -p staging
+
+echo -e "$BLUE---> Building CMakeCache.txt$DEFAULT"
+cmake -DCMAKE_TOOLCHAIN_FILE="$BASEDIR"/mxe/usr/i686-w64-mingw32.shared/share/cmake/mxe-conf.cmake \
+ -DPKG_CONFIG_EXECUTABLE="/usr/bin/pkg-config" \
+ -DCMAKE_PREFIX_PATH="$BASEDIR"/mxe/usr/i686-w64-mingw32.shared/qt5 \
+ -DCMAKE_BUILD_TYPE=$RELEASE \
+ -DMAKENSIS=i686-w64-mingw32.shared-makensis \
+ -DSSRF_CORELIB="$BUILDDIR"/subsurface/core/libsubsurface_corelib.a \
+ "$BASEDIR"/subsurface/smtk-import
+
+echo -e "$BLUE---> Building ...$DEFAULT"
+if [ ! -z "$INSTALLER" ]; then
+ make "$JOBS" "$INSTALLER"
+else
+ make "$JOBS"
+fi
+
+# Undo previous hackery
+echo -e "$BLUE---> Restoring system to initial state$DEFAULT"
+mv -vf "$BASEDIR"/mxe/usr/i686-w64-mingw32.static/lib/libglib-2.0.a.bak "$BASEDIR"/mxe/usr/i686-w64-mingw32.static/lib/libglib-2.0.a
+
+if [ ! -z "$DATADIR" ]; then
+ echo -e "$BLUE---> Copying Smtk2ssrf installer to data folder$DEFAULT"
+ cp -vf "$BUILDDIR"/smtk-import/smtk2ssrf-*.exe "$DATADIR"
+fi
+
+echo -e "$RED---> Building smtk2ssrf done$DEFAULT"