1
mirror of https://invent.kde.org/network/falkon.git synced 2024-09-21 09:42:10 +02:00
falkonOfficial/linux/build-appimage.sh
2018-01-24 15:30:28 +01:00

540 lines
16 KiB
Bash
Executable File

#!/bin/sh
###############################################################################
# Configure and compile QupZilla source.
###############################################################################
set -e
SCRIPT_PATH="$(dirname "$(readlink -f "$0")")"
NCPUS=$(getconf _NPROCESSORS_ONLN) || :
which mksquashfs >/dev/null 2>&1 || TEST=no
which chrpath >/dev/null 2>&1 || TEST=no
TEST=${TEST:-yes}
if [ $(which qmake 2>/dev/null) ]; then
SYSTEM_QMAKE=$(which qmake)
elif [ $(which qmake-qt5 2>/dev/null) ]; then
SYSTEM_QMAKE=$(which qmake-qt5)
fi
BLD1="\033[1m"
BLD0="\033[21m"
ITL1="\033[3m"
ITL0="\033[23m"
UDR1="\033[4m"
UDR0="\033[24m"
CRS1="\033[9m"
CRS0="\033[29m"
RDFG="\033[31m"
RDBG="\033[41m"
DFFG="\033[39m"
DFBG="\033[49m"
ALL0="\033[00m"
NO_SYSTEM_DATAPATH=${NO_SYSTEM_DATAPATH:-false} ; export NO_SYSTEM_DATAPATH
PORTABLE_BUILD=${PORTABLE_BUILD:-false} ; export PORTABLE_BUILD
NONBLOCK_JS_DIALOGS=${NONBLOCK_JS_DIALOGS:-false} ; export NONBLOCK_JS_DIALOGS
NO_X11=${NO_X11:-false} ; export NO_X11
USE_WEBGL=${USE_WEBGL:-true} ; export USE_WEBGL
KDE_INTEGRATION=${KDE_INTEGRATION:-false} ; export KDE_INTEGRATION
GNOME_INTEGRATION=${GNOME_INTEGRATION:-false} ; export GNOME_INTEGRATION
DISABLE_DBUS=${DISABLE_DBUS:-false} ; export DISABLE_DBUS
QMAKE=${QMAKE:-$SYSTEM_QMAKE} ; export QMAKE
SOURCE_DIR=${SOURCE_DIR:-${SCRIPT_PATH}/..} ; export SOURCE_DIR
CFLAGS="${CFLAGS:--O2 -g -pipe -Wall }" ; export CFLAGS ;
CXXFLAGS="${CXXFLAGS:--O2 -g -pipe -Wall }" ; export CXXFLAGS ;
LDFLAGS="${LDFLAGS:--Wl,-z,relro }"; export LDFLAGS ;
optPrint(){
printf "\n\t\t${ITL1}VALID OPTIONS ARE${ITL0}:\n
--prefix=[path]
--sourcedir=[path]
--shared=[path]
--libdir=[path]
--qmake=[path to executable]
--debug | -D
--appimage | -A
--runtime=[path]
--portable
--nojs
--no-x11
--with-kde | -K
--with-gnome | -G
--nodatapath
--nodbus
--disable-webgl
--with-system-qtsingleapp
--update-git-source | -U
--no-clean | --noclean
--help | -h | help |-H\n\n"
}
helpPrint(){
printf "\n\t\t\t${ITL1}PARAMETERS${ITL0}:
${BLD1}--portable${BLD0}
QupZilla won't write any data outside of path of execution.
It will also disable plugins by default.
(disabled by default)
${BLD1}--nojs${BLD0}
Enable non-blocking JavaScript dialogs from alert() prompt()
and confirm() functions. They are shown inside page and are not
blocking application window.
However, due to synchronous API, there is a possible crash when
closing browser windows with opened dialogs.
If you can take this risk and/or make sure you aren't closing browser
with opened dialogs, you may enable this option.
These dialogs are much more beautiful than normal QDialogs.
(disabled by default)
${BLD1}--no-x11${BLD0}
Disable all X11 calls.
Enable this when building for Wayland-only.
All X11 calls are guarded by runtime X11 platform check
even without this option.
${BLD1}--with-kde | -K ${BLD0}
Enable KDE integration.
Currently it enables building of KWallet Password plugin,
which provides support for storing passwords in KWallet.
${BLD1}--with-gnome | -G${BLD0}
Enable Gnome integration.
Currently it enables building of Gnome-Keyring Password plugin,
which provides support for storing passwords in Gnome-Keyring.
${BLD1}--libdir=${BLD0}
By default, /usr/lib/ is used for libQupZilla and /usr/lib/qupzilla
for plugins.
You can change it by setting this define.
${UDR1}example:--libdir="/usr/lib64"${UDR0}
${BLD1}--nodatapath=${BLD0}
By default, QupZilla is using /usr/share/qupzilla/ path
for storing themes and translations.
By setting this define, QupZilla will use path of execution.
(disabled by default)
${BLD1}--prefix=${BLD0}
You can define different prefix.
QupZilla binary will then be moved to PREFIX/bin/, use
PREFIX/share/qupzilla/ as datadir, PREFIX/share/applications for
desktop launcher and PREFIX/share/pixmaps for icon.
(default prefix is "/usr/local")
${UDR1}example:--prefix="/usr"${UDR0}
${BLD1}--shared=${BLD0}
You can define the path of the share folder, i.e. /usr/share
QupZilla will then use shared/qupzilla as datadir,
shared/applications for desktop launcher and
shared/pixmaps for the icon. By default it is not defined
and files will be installed as described above.
(default share folder is "/usr/local/share")
${UDR1}example:--shared="/usr/share"${UDR0}
${BLD1}--nodbus${BLD0}
Build without QtDBus module. Native desktop notifications
will be disabled.
${BLD1}--sourcedir=${BLD0}
Assuming this script is located in ${ITL1}qupzilla/scripts${ITL0},
otherwise you must specify the path to
QupZilla source directory.
${UDR1}example:--sourcedir="/home/build/qupzilla"${UDR0}
${BLD1}--runtime=[path]${BLD0}
Path to precompiled „${BLD1}runtime.c${BLD0}${ITL1}(part of AppImageKit)${ITL0}.
More info at: ${UDR1}https://github.com/probonopd/AppImageKit${UDR0}
Requires ${BLD1}--appimage${BLD0}
${BLD1}--appimage | -A${BLD0}
Also create an AppImage.
In order to build AppImage,
you must have installed the following tools:
${ITL1}mmksquashfs, patchelf${ITL0}!
Also, you should use precompiled Qt package
downloaded from ${UDR1}${ITL1}http://download.qt.io/official_releases/qt/${ALL0},
and precompiled „${BLD1}runtime${BLD0}“ binary - part of ${ITL1}AppImageKit${ITL0}
${UDR1}https://github.com/probonopd/AppImageKit${UDR0},
otherwise this option will be ignored.
Requires ${BLD1}--runtime${BLD0}
Implies ${BLD1}--nodatapath${BLD0}
${BLD1}--disable-webgl${BLD0}
Disable WebGL. You need to build QupZilla with WebKit built
with WebGL support, otherwise you won't be able to compile
without errors.
Only for QtWebKit lower than 2.3
(disabled by default)
${BLD1}--with-system-qtsingleapp${BLD0}
Use system QtSingleApplication library.
This option can only be used with system qmake!
${BLD1}--debug | -D${BLD0}
You may want to build QupZilla with debugging symbols (for generating
backtrace of crash).
${BLD1}--update-git-source | -U${BLD0}
Fetches the information from QupZilla online git repository
and merges it with your local copy
${BLD1}--no-clean | --noclean${BLD0}
Skip cleaning previously compilled files.
${BLD1}--qmake=${BLD0}
Full path to qmake executable.
This option is mandatory in case you want
to create an AppImage.
\n"
}
printConf(){
printf "\n\tBuild configuration:\n
QUPZILLA_PREFIX=${QUPZILLA_PREFIX}
SOURCE_DIR=${SOURCE_DIR}
SHARE_FOLDER=${SHARE_FOLDER}
USE_LIBPATH=${USE_LIBPATH}
DEBUG_BUILD=${DEBUG_BUILD}
BUILD_AI=${BUILD_AI}
PORTABLE_BUILD=${PORTABLE_BUILD}
NONBLOCK_JS_DIALOGS=${NONBLOCK_JS_DIALOGS}
NO_X11=${NO_X11}
KDE_INTEGRATION=${KDE_INTEGRATION}
GNOME_INTEGRATION=${GNOME_INTEGRATION}
NO_SYSTEM_DATAPATH=${NO_SYSTEM_DATAPATH}
DISABLE_DBUS=${DISABLE_DBUS}
USE_WEBGL=${USE_WEBGL}
SKIP_CLEANNING=${SKIP_CLEANNING}
USE_SYS_QTSA=${USE_SYS_QTSA}
RUNTIME_BINARY=${RUNTIME_BINARY}
QMAKE=${QMAKE}\n" | sed -r 's/=$/ » Not set/g'
}
getVal(){
echo $* | sed -r 's/([[:graph:]]*=)//'
}
varAssign(){
while [ $# != 0 ] ;do
CFG_OPT="$1"
case "${CFG_OPT}" in
--prefix=*)
QUPZILLA_PREFIX=$(getVal "${CFG_OPT}")
export QUPZILLA_PREFIX
;;
--sourcedir=*)
SOURCE_DIR=$(getVal "${CFG_OPT}")
export SOURCE_DIR
;;
--shared=*)
SHARE_FOLDER=$(getVal "${CFG_OPT}")
export SHARE_FOLDER
;;
--libdir=*)
USE_LIBPATH=$(getVal "${CFG_OPT}")
export USE_LIBPATH
;;
--debug|-D)
DEBUG_BUILD="CONFIG+=debug"
export DEBUG_BUILD
;;
--appimage|-A)
BUILD_AI="true"
export BUILD_AI
;;
--runtime=*)
RUNTIME_BINARY=$(getVal "${CFG_OPT}")
export RUNTIME_BINARY
;;
--portable)
PORTABLE_BUILD="true"
export PORTABLE_BUILD
;;
--nojs)
NONBLOCK_JS_DIALOGS="true"
export NONBLOCK_JS_DIALOGS
;;
--no-clean|--noclean)
SKIP_CLEANNING="true"
export SKIP_CLEANNING
;;
--no-x11)
NO_X11="true"
export NO_X11
;;
--with-kde|-K)
KDE_INTEGRATION="true"
export KDE_INTEGRATION
;;
--with-gnome|-G)
GNOME_INTEGRATION="true"
export GNOME_INTEGRATION
;;
--nodatapath)
NO_SYSTEM_DATAPATH="true"
export NO_SYSTEM_DATAPATH
;;
--nodbus)
DISABLE_DBUS="true"
export DISABLE_DBUS
;;
--disable-webgl)
USE_WEBGL="false"
export USE_WEBGL
;;
--with-system-qtsingleapp)
USE_SYS_QTSA="CONFIG+=QtSingleApplication"
export USE_SYS_QTSA
;;
--qmake=*)
QMAKE=$(getVal "${CFG_OPT}")
export QMAKE
;;
--update-git-source|-U)
UPDATE_SOURCE="true"
export UPDATE_SOURCE
;;
--help|help|-h|-H)
helpPrint
exit 1
;;
*)
printf "\n${RDBG}unknown parameter: ${CFG_OPT}${DFBG}\n"
optPrint
exit 1
;;
esac
shift
done
}
nowBuild()
{
QUPZILLA_PREFIX=${QUPZILLA_PREFIX:-/usr/local} ; export QUPZILLA_PREFIX
SHARE_FOLDER=${SHARE_FOLDER:-$QUPZILLA_PREFIX/share} ; export SHARE_FOLDER
USE_LIBPATH=${USE_LIBPATH:-$QUPZILLA_PREFIX/lib} ; export USE_LIBPATH
printConf
cd "${SOURCE_DIR}"
if [[ -z "${SKIP_CLEANNING}" ]]; then
make distclean >/dev/null 2>&1 || :
rm -fr bundle_build_dir qupzilla.squashfs bin/QupZilla.AppImage || :
fi
if [[ "${UPDATE_SOURCE}" == "true" ]]; then
git pull || :
fi
if [[ ! -z "${USE_SYS_QTSA}" ]]; then
HEADERSARETHERE=$(${QMAKE} -query | grep INSTALL_HEADERS | sed 's/QT_INSTALL_HEADERS://')
rm -fr src/lib/3rdparty/qtsingleapplication
ln -s ${HEADERSARETHERE}/QtSolutions src/lib/3rdparty/qtsingleapplication
sed -i 's,include.*qtsingleapplication.*,,' src/plugins.pri
sed -i 's,include.*qtsingleapplication.*,,' src/lib/lib.pro
fi
${QMAKE} ${DEBUG_BUILD} ${USE_SYS_QTSA}
printf "Compiling QupZilla\n"
make -j$NCPUS
}
nowBldImg(){
NO_SYSTEM_DATAPATH="true"; export NO_SYSTEM_DATAPATH
QTFILESARETHERE=$(${QMAKE} -query | grep INSTALL_PREFIX | sed 's/QT_INSTALL_PREFIX://')
LIBSARETHERE=$(${QMAKE} -query | grep INSTALL_LIBS | sed 's/QT_INSTALL_LIBS://')
PLUGINSARETHERE=$(${QMAKE} -query | grep INSTALL_PLUGINS | sed 's/QT_INSTALL_PLUGINS://')
QMLSARETHERE=$(${QMAKE} -query | grep INSTALL_QML | sed 's/QT_INSTALL_QML://')
TRANSLATIONSARETHERE=$(${QMAKE} -query | grep INSTALL_TRANSLATIONS | sed 's/QT_INSTALL_TRANSLATIONS://')
LIBEXECSARETHERE=$(${QMAKE} -query | grep INSTALL_LIBEXECS | sed 's/QT_INSTALL_LIBEXECS://')
NEEDEDLIBSLIST="libicudata.so
libicui18n.so
libicuuc.so
libQt5Core.so
libQt5DBus.so
libQt5Gui.so
libQt5Multimedia.so
libQt5MultimediaWidgets.so
libQt5Network.so
libQt5OpenGL.so
libQt5Positioning.so
libQt5PrintSupport.so
libQt5Qml.so
libQt5Quick.so
libQt5QuickWidgets.so
libQt5Sql.so
libQt5Svg.so
libQt5WebChannel.so
libQt5WebEngineCore.so
libQt5WebEngineCore.so
libQt5WebEngine.so
libQt5WebEngineWidgets.so
libQt5Widgets.so
libQt5X11Extras.so
libQt5XcbQpa.so"
NEEDEDPLUGINSLIST="generic
iconengines
imageformats
platforminputcontexts
platformthemes
printsupport
xcbglintegrations"
nowBuild
mkdir bundle_build_dir || :
cp -r bin/* bundle_build_dir
pushd bundle_build_dir/plugins
patchelf --set-rpath '$ORIGIN/../lib' *.so
popd
mkdir -p bundle_build_dir/lib \
bundle_build_dir/plugins/{platforms,sqldrivers} \
bundle_build_dir/qtwebengine_dictionaries \
bundle_build_dir/qml \
bundle_build_dir/translations || :
for L in ${NEEDEDLIBSLIST} ; do
cp -d ${LIBSARETHERE}/${L}* bundle_build_dir/lib ;
done
for P in ${NEEDEDPLUGINSLIST} ; do
cp -r ${PLUGINSARETHERE}/${P} bundle_build_dir/plugins ;
done
install ${PLUGINSARETHERE}/platforms/libqxcb.so bundle_build_dir/plugins/platforms
install ${PLUGINSARETHERE}/sqldrivers/libqsqlite.so bundle_build_dir/plugins/sqldrivers
cp -r ${QMLSARETHERE}/{QtQuick.2,QtWebEngine} bundle_build_dir/qml
cp -r ${QTFILESARETHERE}/resources bundle_build_dir
cp -r ${TRANSLATIONSARETHERE}/qtwebengine_locales bundle_build_dir/translations
cp ${LIBEXECSARETHERE}/QtWebEngineProcess bundle_build_dir
CRYPTONEEDED=$(ldd 'bin/qupzilla'| grep libcrypto | sed 's/.*=>//;s/(.*//')
cp ${CRYPTONEEDED} bundle_build_dir/lib
cp linux/applications/qupzilla.desktop bundle_build_dir
cp linux/pixmaps/qupzilla.png bundle_build_dir
ln -sf qupzilla.png bundle_build_dir/.DirIcon
pushd bundle_build_dir
patchelf --set-rpath '$ORIGIN:$ORIGIN/lib' libQupZilla.so
patchelf --set-rpath '$ORIGIN:$ORIGIN/lib' qupzilla
patchelf --set-rpath '$ORIGIN:$ORIGIN/lib' QtWebEngineProcess
cat <<EOQTCFG >qt.conf
[Paths]
Plugins=plugins
Imports=qml
Qml2Imports=qml
LibraryExecutables=.
EOQTCFG
cat <<EOF >AppRun
#!/bin/sh
#
set -e
QUPZILLA_MOUNT_PATH="\$(dirname "\$(readlink -f "\$0")")"
QT_DIR=\${QUPZILLA_MOUNT_PATH}
export QT_DIR
QT_QPA_PLATFORM_PLUGIN_PATH="\${QT_DIR}/plugins/platforms"
QT_PLUGIN_PATH="\${QT_DIR}/plugins"
QML2_IMPORT_PATH="\${QT_DIR}/qml"
QTWEBENGINEPROCESS_PATH="\${QT_DIR}/QtWebEngineProcess"
export QT_QPA_PLATFORM_PLUGIN_PATH QT_PLUGIN_PATH QML2_IMPORT_PATH QTWEBENGINEPROCESS_PATH
cd "\${QUPZILLA_MOUNT_PATH}/"
exec ./qupzilla "\$@"
EOF
chmod +x AppRun
popd
printf "Generating app image\n"
mksquashfs bundle_build_dir qupzilla.squashfs -root-owned -noappend
cat "${RUNTIME_BINARY}" >bin/QupZilla.AppImage
cat qupzilla.squashfs >>bin/QupZilla.AppImage
chmod a+x bin/QupZilla.AppImage
}
varAssign $*
if [[ ! -x ${QMAKE} ]] ;then
printf "${RDFG}ERROR${DFFG}: ${BLD1}qmake${BLD0} was not found! Please install it or use ${BLD1}--qmake=${BLD0} option to specify the path where it is located!\n"
exit 1
fi
if [[ ! -z "${USE_SYS_QTSA}" ]] && [[ ${QMAKE} != ${SYSTEM_QMAKE} ]] ;then
printf "${RDFG}ERROR${DFFG}: You must use system qmake in order to build Qupzilla with system QtsingleApplication libraries!\n"
exit 1
fi
if [[ ! -d "${SOURCE_DIR}/src" ]]; then
printf "Please install ${UDR1}$0${UDR0} in „${BLD1}scripts${BLD0}${ITL1}(a sub folder in QupZilla source directory)${ITL0},
or specify the source path with ${BLD1}--sourcedir=${BLD0} parameter!\n"
exit 1
fi
if [[ ${BUILD_AI} == "true" ]] && [[ ${TEST} == "yes" ]] && [[ ${QMAKE} != ${SYSTEM_QMAKE} ]] && [[ ! -z ${RUNTIME_BINARY} ]] ; then
nowBldImg
else
nowBuild
fi
if [[ $? == 0 ]] && [[ -x ${SOURCE_DIR}/bin/qupzilla ]]; then
printf "\\033c"
printf "Done!\nThe compiled files are in "${PWD}"/bin\n"
if [[ -z "${BUILD_AI}" ]]; then
printf "Now you can type „${ITL1}make install${ITL}“ to install them\n"
fi
fi
exit 0