cmake: Determine minimum deployment target for Qt
[quassel.git] / scripts / build / macosx_makePackage.sh
index 007d3f2..e9342dd 100755 (executable)
@@ -1,4 +1,7 @@
 #!/bin/bash
+# Don't consider packaging a success if any commands fail
+# See http://redsymbol.net/articles/unofficial-bash-strict-mode/
+set -euo pipefail
 
 myname=$0
 if [ -s "$myname" ] && [ -x "$myname" ]; then
@@ -13,7 +16,7 @@ else
         # care to interpret leading and trailing ":" as meaning
         # the current directory; the same is true for "::" within
         # the PATH.
-    
+
         # Replace leading : with . in PATH, store in p
         p=${PATH/#:/.:}
         # Replace trailing : with .
@@ -41,31 +44,39 @@ if [ ! -f "$mypath" ]; then
 fi
 
 SCRIPTDIR=$(dirname $mypath)
-QUASSEL_VERSION=$(git-describe)
+QUASSEL_VERSION=$(git describe)
 BUILDTYPE=$1
 
 # check the working dir
-WORKINGDIR=$2
-if [[ ! -n $2 ]]; then
-    WORKINGDIR="."
-fi
+# Default to "." using Bash default-value syntax
+WORKINGDIR="${2:-.}"
 WORKINGDIR="${WORKINGDIR}/"
 PACKAGETMPDIR="${WORKINGDIR}PACKAGE_TMP_DIR_${BUILDTYPE}"
 QUASSEL_DMG="Quassel${BUILDTYPE}_MacOSX-x86_64_${QUASSEL_VERSION}.dmg"
 
+# Default to null string
+if [[ -z ${3:-} ]]; then
+       ADDITIONAL_PLUGINS=""
+else
+       # Options provided, append to list
+       ADDITIONAL_PLUGINS=",$3"
+fi
+
+echo "ADDITIONAL_PLUGINS: ${ADDITIONAL_PLUGINS}"
+
 mkdir $PACKAGETMPDIR
 case $BUILDTYPE in
 "Client")
        cp -r ${WORKINGDIR}Quassel\ Client.app ${PACKAGETMPDIR}/
-       ${SCRIPTDIR}/macosx_DeployApp.py "${PACKAGETMPDIR}/Quassel Client.app"
+       ${SCRIPTDIR}/macosx_DeployApp.py --plugins=qcocoa,qgenericbearer,qcorewlanbearer,qmacstyle${ADDITIONAL_PLUGINS} "${PACKAGETMPDIR}/Quassel Client.app"
        ;;
 "Core")
        cp ${WORKINGDIR}quasselcore ${PACKAGETMPDIR}/
-       ${SCRIPTDIR}/macosx_DeployApp.py --nobundle ${PACKAGETMPDIR}
+       ${SCRIPTDIR}/macosx_DeployApp.py --nobundle --plugins=qsqlite,qsqlpsql${ADDITIONAL_PLUGINS} ${PACKAGETMPDIR}
        ;;
 "Mono")
        cp -r ${WORKINGDIR}Quassel.app ${PACKAGETMPDIR}/
-       ${SCRIPTDIR}/macosx_DeployApp.py "${PACKAGETMPDIR}/Quassel.app"
+       ${SCRIPTDIR}/macosx_DeployApp.py --plugins=qsqlite,qsqlpsql,qcocoa,qgenericbearer,qcorewlanbearer,qmacstyle${ADDITIONAL_PLUGINS} "${PACKAGETMPDIR}/Quassel.app"
        ;;
 *)
        echo >&2 "Valid parameters are \"Client\", \"Core\", or \"Mono\"."
@@ -73,5 +84,46 @@ case $BUILDTYPE in
        exit 1
        ;;
 esac
-hdiutil create -srcfolder ${PACKAGETMPDIR} -format UDBZ -volname "Quassel ${BUILDTYPE} - ${QUASSEL_VERSION}" "${WORKINGDIR}${QUASSEL_DMG}" >/dev/null
+
+echo "Creating macOS disk image with hdiutil: 'Quassel ${BUILDTYPE} - ${QUASSEL_VERSION}'"
+
+# Modern macOS versions support APFS, however default to HFS+ for now in order
+# to ensure old macOS versions can parse the package and display the warning
+# about being out of date.  This mirrors the approach taken by Qt's macdeployqt
+# tool.  In the future if this isn't needed, just remove "-fs HFS+" to revert
+# to default.
+#
+# See https://doc.qt.io/qt-5/macos-deployment.html
+
+# hdiutil seems to have a bit of a reputation for failing to create disk images
+# for various reasons.
+#
+# If you've come here to see why on earth your macOS build is failing despite
+# making changes entirely unrelated to macOS, you have my sympathy.
+#
+# There are two main approaches:
+#
+# 1.  Let hdiutil calculate a size automatically
+#
+# 2.  Separately calculate the size with a margin of error, then specify this
+#     to hdiutil during disk image creation.
+#
+# Both seem to have caused issues, but in recent tests, option #1 seemed more
+# reliable.
+#
+# Option 1:
+
+hdiutil create -srcfolder ${PACKAGETMPDIR} -format UDBZ -fs HFS+ -volname "Quassel ${BUILDTYPE} - ${QUASSEL_VERSION}" "${WORKINGDIR}${QUASSEL_DMG}" >/dev/null
+
+# If hdiutil changes over time and fails often, you can try the other option.
+#
+# Option 2:
+#
+#PACKAGESIZE_MARGIN="1.1"
+#PACKAGESIZE=$(echo "$(du -ms ${PACKAGETMPDIR} | cut -f1) * $PACKAGESIZE_MARGIN" | bc)
+#echo "PACKAGESIZE: $PACKAGESIZE MB"
+#hdiutil create -srcfolder ${PACKAGETMPDIR} -format UDBZ -fs HFS+ -size ${PACKAGESIZE}M -volname "Quassel ${BUILDTYPE} - ${QUASSEL_VERSION}" "${WORKINGDIR}${QUASSEL_DMG}" >/dev/null
+
+
+# Regardless of choice, clean up the packaging temporary directory
 rm -rf ${PACKAGETMPDIR}