# Building_Qt5_From_Source_on_MacOSX

# *** IMPORTANT ***
# Qt Pre-Built Binary Versions do NOT support proprietary codecs such as 
# mpeg4 or gif multipmedia in its QWebEngine by default!

# To support these epub basic formats you will need to build your own Qt
# directly from source.

# We do highly recommend you use the same Qt versions as official Sigil builds on Mac OS X.
# which is now Qt 5.12.9 or later

# These instructions will lead you through building from source
# FIRST:  make sure you have XCode 10 or later installed and the Command Line Tools

# set the deployment target (this is minimum needed for Qt 5.12.X)

export MACOSX_DEPLOYMENT_TARGET=10.12

# cd to a location to store your src tree then do
export MYQTSRC=`pwd`


# Build Prerequisites
# -------------------
# First build and install the following prerequisites for the build: 
#      cmake, libpng, libjpeg-turbo 
# and install into /usr/local so that they can be found during qtwebkit's build
# Note: older versions of these prerequisites may work but have not been tested


# Download cmake 3.12.0 or later from https://cmake.org/download
tar -zxvf cmake-3.12.0.tar.gz
cd cmake-3.12.0
./bootstrap --prefix=/usr/local -- -DCMAKE_BUILD_TYPE:STRING=Release
make
sudo make install


# Download libpng 1.6.36 or later from png's sourceforge site: http://www.libpng.org/pub/png/libpng.html
# If you are building on MacOS 10.12, you will need to patch libpng
# to support macos 10.12
export LDFLAGS="-Wl,-macosx_version_min,10.12"
export CFLAGS="-mmacosx-version-min=10.12 -Werror=partial-availability"
tar -zxvf libpng-1.6.36.tar.gz
cd libpng-1.6.36
patch -p0 < libpng_support_macos_10.11.patch
./configure --enable-static=yes --enable-shared=no --prefix=/usr/local
make
sudo make install
unset CFLAGS
unset LDFLAGS


# libjpeg-turbo 2.0.0 or later from libjpeg-turbo.org
# https://sourceforge.net/projects/libjpeg-turbo/files/2.0.2/
tar -xvf libjpeg-turbo-2.0.2.tar.gz
mkdir buildjt
cd buildjt
cmake -G"Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/usr/local -DENABLE_SHARED=0 -DCMAKE_OSX_DEPLOYMENT_TARGET=10.12 \
  -DCMAKE_C_FLAGS_RELEASE="-O3 -mmacosx-version-min=10.12 -Werror=partial-availability" ../libjpeg-turbo-2.0.2/
make
sudo make install


# Building Qt5.12.9 from source
# -----------------------------

# download qt-everywhere-src-5.12.9.tar.xz directly from Qt
# from:  http://download.qt.io/archive/qt/5.12/5.12.9/single/

# and then unpack it
# Note to get unxz - you may need to download and build xz-5.2.5.tar.gz
# see the docs on building a relocatable python for instruction on building xz

unxz qt-everywhere-src-5.12.9.tar.xz
tar -xvf qt-everywhere-src-5.12.9.tar

cd qt-everywhere-src-5.12.8

# now copy 6 required patches from Sigil/docs/ into this directory (they are the same patches needed for Qt 5.12.8 as well)

cp YOUR_PATH_TO_SIGIL_SRC_TREE/Sigil/docs/qt512.8_avoid_qtabbar_segfault.patch ./
cp YOUR_PATH_TO_SIGIL_SRC_TREE/Sigil/docs/qt512.8_fix_h6_insertParagraph.patch ./
cp YOUR_PATH_TO_SIGIL_SRC_TREE/Sigil/docs/qt512.8_fix_missing_macos_menubar.patch ./
cp YOUR_PATH_TO_SIGIL_SRC_TREE/Sigil/docs/qt512.8_remove_bad_workaround.patch ./
cp YOUR_PATH_TO_SIGIL_SRC_TREE/Sigil/docs/qt512.8_qmenu_hide_bug_fix_f579be9.patch ./
cp YOUR_PATH_TO_SIGIL_SRC_TREE/Sigil/docs/qt512.8_qtwebengine_bad_chrome_merge_repair.patch ./

# apply mouse press and flick on qtabbar tab fix to prevent segfault
# See https://bugreports.qt.io/browse/QTBUG-74478
patch -p0 < ./qt512.8_avoid_qtabbar_segfault.patch

# then apply an obvious fix for insertParagraph execcommand and h6 (see w3c spec)
# See https://bugreports.qt.io/browse/QTBUG-79778
patch -p0 < ./qt512.8_fix_h6_insertParagraph.patch

# then apply an patch to repair breakage instroduced by a bad chrome merge
# See https://bugreports.qt.io/browse/QTBUG-85160
patch -p0 < ./qt512.8_qtwebengine_bad_chrome_merge_repair.patch

# the remaining patches are ONLY important for Qt on macOS

# apply workaround to prevent missing macos application menu items
# See https://bugreports.qt.io/browse/QTBUG-80795
patch -p0 < ./qt512.8_fix_missing_macos_menubar.patch

# apply patch to remove broken crash prevention workaround in Qt 5.12.5 and later
# The real fix for this is now part of Qt 5.12.7 official source
# See https://bugreports.qt.io/browse/QTBUG-75326
patch -p0 < ./qt512.8_remove_bad_workaround.patch

# apply backported fix for qmenu closing causing crash when during hide
# The real fix for this is now part of Qt 5.15 official source
# See https://bugreports.qt.io/browse/QTBUG-82349
# See https://codereview.qt-project.org/c/qt/qtbase/+/299512
patch -p0 < ./qt512.8_qmenu_hide_bug_fix_f579be9.patch

# this is the new minimum supported by Qt 5.12.X
export MACOSX_DEPLOYMENT_TARGET=10.12


# Create a destination directory to house your complete Qt binary in your home directory
# to be similar to how stock Qt does it
cd ~/
mkdir Qt5129

# Now return and create a shadow build inside a new directory to keep your Qt 5.12.X sources clean
cd ${MYQTSRC}
mkdir buildqt5129
cd buildqt5129


# Remember to include the -webengine-proprietary-codecs configure switch

../qt-everywhere-src-5.12.9/configure --prefix=/Users/${USER}/Qt5129 -webengine-proprietary-codecs -opensource -nomake examples -nomake tests

# note the build itself can take a couple of hours depending on memory available, disk and cpus used
make -j4
make install

# After the install phase completes your newly built Qt should exist in ~/Qt5129 ready to be used
# to build Sigil and PageEdit
