1
mirror of https://invent.kde.org/network/falkon.git synced 2024-12-24 12:46:35 +01:00
falkonOfficial/linux/appimage/build-appimage.sh
Pino Toscano 9bebc144ac Stop installing app icon in pixmaps location
The /usr/share/pixmaps location is considered a legacy location for
application icons; since the application icons are already installed in
the global XDG hicolor theme, then simply stop installing the 128px one
in the legacy pixmaps location.

Copy the 128px icon from the hicolor directory instead, as it is the
same.
2021-05-16 21:14:08 +02:00

380 lines
10 KiB
Bash
Executable File

#!/bin/sh
###############################################################################
# Compile Falkon source and pack it as Appimage.
###############################################################################
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"
LIBDIRPATH=lib ; export LIBDIRPATH
SOURCE_DIR=${SOURCE_DIR:-${SCRIPT_PATH}/..} ; export SOURCE_DIR
QMAKE=${QMAKE:-$SYSTEM_QMAKE} ; export QMAKE
DEBUG_BUILD="-DCMAKE_BUILD_TYPE=Debug" ; export DEBUG_BUILD
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
--sourcedir=[path]
--outdir=[path]
--qmake=[path to executable]
--disable-debug | -D
--runtime=[path]
--disable-x11
--disable-dbus
--update-source | -U
--help | -h | help |-H\n\n"
}
helpPrint(){
printf "\n\t\t\t${ITL1}PARAMETERS${ITL0}:
${BLD1}--disable-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}--disable-dbus${BLD0}
Build without QtDBus module. Native desktop notifications
will be disabled.
${BLD1}--sourcedir=${BLD0}
Assuming this script is located in ${ITL1}falkon/linux${ITL0},
otherwise you must specify the path to
Falkon source directory.
${UDR1}example:--sourcedir="/home/build/falkon"${UDR0}
${BLD1}--outdir=${BLD0}
Where to copy final AppImage.
${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}
${BLD1}Mandatory option${BLD0}
${BLD1}--disable-debug | -D${BLD0}
You may want to disable debug build.
(enabled by default)
${BLD1}--update-source | -U${BLD0}
Fetches the information from Falkon online git repository
and merges it with your local copy
${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
Library path=${LIBDIRPATH}
Source dir=${SOURCE_DIR}
Debug build=${DEBUG_BUILD}
Disable X11=${YNOX11}
Disable DBUS=${DISABLE_DBUS}
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
--sourcedir=*)
SOURCE_DIR=$(getVal "${CFG_OPT}")
export SOURCE_DIR
;;
--outdir=*)
OUT_DIR=$(getVal "${CFG_OPT}")
export OUT_DIR
;;
--disable-debug|-D)
unset DEBUG_BUILD
;;
--runtime=*)
RUNTIME_BINARY=$(getVal "${CFG_OPT}")
export RUNTIME_BINARY
;;
--disable-x11)
YNOX11="-DNO_X11:BOOL=TRUE"
export YNOX11
;;
--disable-bus)
DISABLE_DBUS="-DDISABLE_DBUS:BOOL=TRUE"
export DISABLE_DBUS
;;
--qmake=*)
QMAKE=$(getVal "${CFG_OPT}")
export QMAKE
;;
--update-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
}
nowBldImg(){
cd "${SOURCE_DIR}"
if [[ "${UPDATE_SOURCE}" == "true" ]]; then
git pull || :
fi
rm -fr build || :
mkdir build && cd build
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://')
NODEFOPT="${DEBUG_BUILD} ${YNOX11} ${DISABLE_DBUS}"
cmake ${NODEFOPT} \
-DBUILD_SHARED_LIBS:BOOL=TRUE \
-DCMAKE_SKIP_RPATH:BOOL=OFF \
-DCMAKE_SKIP_INSTALL_RPATH:BOOL=NO \
-DQMAKE_EXECUTABLE:FILEPATH=${QMAKE} \
-DCMAKE_PREFIX_PATH=${QTFILESARETHERE} \
-DFALKON_PLUGIN_PATH="" \
-DKDE_INSTALL_LIBDIR:PATH="${LIBDIRPATH}" ..
printf "Compiling Falkon with the following settings:\n"
printConf
make -j$NCPUS
if [[ $? == 0 ]] ; then
make DESTDIR="${PWD}" install
fi
mv usr/local bundle_build_dir
pushd bundle_build_dir/lib/plugins/falkon
chrpath --replace '$ORIGIN/../..' *.so
popd
NEEDEDLIBSLIST="libicudata.so.56
libicui18n.so.56
libicuuc.so.56
libQt5Core.so.5
libQt5DBus.so.5
libQt5Gui.so.5
libQt5Multimedia.so.5
libQt5MultimediaWidgets.so.5
libQt5Network.so.5
libQt5OpenGL.so.5
libQt5Positioning.so.5
libQt5PrintSupport.so.5
libQt5Qml.so.5
libQt5Quick.so.5
libQt5QuickWidgets.so.5
libQt5Sql.so.5
libQt5Svg.so.5
libQt5WebChannel.so.5
libQt5WebEngineCore.so.5
libQt5WebEngine.so.5
libQt5WebEngineWidgets.so.5
libQt5Widgets.so.5
libQt5X11Extras.so.5
libQt5XcbQpa.so.5
libQt5Concurrent.so.5
libQt5Xml.so.5"
NEEDEDPLUGINSLIST="bearer
generic
iconengines
imageformats
platforminputcontexts
platformthemes
printsupport
xcbglintegrations"
mkdir -p 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
if [[ -d "${PLUGINSARETHERE}/kf5/org.kde.kwindowsystem.platforms" ]]; then
mkdir bundle_build_dir/plugins/kf5
cp -r ${PLUGINSARETHERE}/kf5/org.kde.kwindowsystem.platforms bundle_build_dir/plugins/kf5
fi
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/falkon'| grep libcrypto | sed 's/.*=>//;s/(.*//')"
LIBSSLNEEDED="$(echo "${CRYPTONEEDED}" | sed 's/crypto/ssl/')"
install ${CRYPTONEEDED} ${LIBSSLNEEDED} bundle_build_dir/lib
CRYPTOLINKED="$(basename "${CRYPTONEEDED}")"
LIBSSLLINKED="$(basename "${LIBSSLNEEDED}")"
#Try to include all ssl v1.0 variants.
for LINK in {libcrypto.so,libcrypto.so.10,libcrypto.so.1.0.0} ; do
if [[ ! -e bundle_build_dir/lib/${LINK} ]] ; then
ln -s ${CRYPTOLINKED} bundle_build_dir/lib/${LINK}
fi
done
for LNKS in {libssl.so,libssl.so.10,libssl.so.1.0.0} ; do
if [[ ! -e bundle_build_dir/lib/${LNKS} ]] ; then
ln -s ${CRYPTOLINKED} bundle_build_dir/lib/${LNKS}
fi
done
cp ../linux/applications/org.kde.falkon.desktop bundle_build_dir
cp ../linux/hicolor/128-apps-falkon.png bundle_build_dir/falkon.png
ln -s falkon.png bundle_build_dir/.DirIcon
pushd bundle_build_dir
mv bin/falkon ./ && rm -fr bin
chrpath --replace '$ORIGIN' lib/libFalkonPrivate.so.3.*
chrpath --replace '$ORIGIN/lib' falkon
chrpath --replace '$ORIGIN/lib' QtWebEngineProcess
cat <<EOQTCFG >qt.conf
[Paths]
Plugins=plugins
Imports=qml
Qml2Imports=qml
LibraryExecutables=.
EOQTCFG
cat <<EOF >AppRun
#!/bin/sh
set -e
FALKON_DIR="\$(dirname "\$(readlink -f "\$0")")"
XDG_DATA_DIRS="\${FALKON_DIR}/share:\${XDG_DATA_DIRS}"
FALKON_PLUGIN_PATH="\${FALKON_DIR}/lib/plugins/falkon"
export XDG_DATA_DIRS FALKON_PLUGIN_PATH
cd "\${FALKON_DIR}/"
exec ./falkon "\$@"
EOF
chmod +x AppRun
popd
printf "Generating app image\n"
mksquashfs bundle_build_dir falkon.squashfs -root-owned -noappend
cat "${RUNTIME_BINARY}" >bin/Falkon.AppImage
cat falkon.squashfs >>bin/Falkon.AppImage
chmod a+x bin/Falkon.AppImage
}
varAssign $*
if [[ ! -x ${QMAKE} ]] ;then
printf "${RDFG}ERROR${DFFG}: ${BLD1}qmake${BLD0} was not found! Please use ${BLD1}--qmake=${BLD0} option to specify the path where it is located!\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 Falkon source directory)${ITL0},
or specify the source path with ${BLD1}--sourcedir=${BLD0}full/path!\n"
exit 1
fi
if [[ ${TEST} != "yes" ]] ; then
printf "${RDFG}You must have the following tools installed:${DFFG}
${ITL1}mksquashfs, chrpath${ITL0}!\n"
exit 1
fi
if [[ "${QMAKE}" == "${SYSTEM_QMAKE}" ]] ; then
printf "${RDFG}You should use precompiled Qt package${DFFG}
downloaded from ${UDR1}${ITL1}http://download.qt.io/official_releases/qt/${ALL0}\n"
exit 1
elif
[[ -z ${RUNTIME_BINARY} ]] ; then
printf "\n${RDFG}Required precompiled „${BLD1}runtime${BLD0}“ binary!${DFFG}
It's a part of ${ITL1}AppImageKit${ITL0}
${UDR1}https://github.com/probonopd/AppImageKit${UDR0}\n"
exit 1
fi
nowBldImg
if [[ $? == 0 ]] && [[ -x bin/Falkon.AppImage ]]; then
printf "\\033c"
printf "Done!\nThe compiled files are in "${PWD}"/bin\n"
if [ ! -z "$OUT_DIR" ]; then
cp bin/Falkon.AppImage "$OUT_DIR"
fi
fi
exit 0