From 3e26f3dfcd78c91ea3f6ad269ed7996ffb42d8e7 Mon Sep 17 00:00:00 2001
From: ababi <albert.babi@savoirfairelinux.com>
Date: Fri, 4 Dec 2020 15:16:09 +0100
Subject: [PATCH] qt-client: avoid using local Qt 5.15.0 (linux) and update
 dependencies

- add dependencies for building client Qt
- avoid forcing build with local Qt when no path is specified (linux)
- verify system's Qt version before building lrc + client-qt

Change-Id: I18b51647044c1f15358595710f51a88618de41f5
---
 make-ring.py       | 93 ++++++++++++++++++++++++++++++++--------------
 scripts/install.sh | 62 +++++++++++++++++++++----------
 2 files changed, 108 insertions(+), 47 deletions(-)

diff --git a/make-ring.py b/make-ring.py
index 1ed9fd76..932ed7eb 100755
--- a/make-ring.py
+++ b/make-ring.py
@@ -22,9 +22,7 @@ OSX_DISTRIBUTION_NAME = "osx"
 ANDROID_DISTRIBUTION_NAME = "android"
 WIN32_DISTRIBUTION_NAME = "win32"
 
-# Qt 5.15 is currently only available using the maintenance tool.
 QT5_VERSION = "5.15.0"
-DEFAULT_QT_PATH = "~/Qt/{0}/gcc_64".format(QT5_VERSION)
 
 # vs vars
 win_sdk_default = '10.0.16299.0'
@@ -46,7 +44,7 @@ PACMAN_BASED_DISTROS = [
 ]
 
 ZYPPER_BASED_DISTROS = [
-    'opensuse-leap',
+    'opensuse-leap', 'opensuse-tumbleweed',
 ]
 
 FLATPAK_BASED_RUNTIMES = [
@@ -91,16 +89,24 @@ ZYPPER_DEPENDENCIES = [
     'curl', 'gzip', 'bzip2',
     # daemon
     'speexdsp-devel', 'speex-devel', 'libdbus-c++-devel', 'jsoncpp-devel', 'yaml-cpp-devel',
-    'yasm', 'libuuid-devel', 'libnettle-devel', 'libopus-devel',
+    'yasm', 'libuuid-devel', 'libnettle-devel', 'libopus-devel', 'libexpat-devel',
     'libgnutls-devel', 'msgpack-devel', 'libavcodec-devel', 'libavdevice-devel', 'pcre-devel',
     'alsa-devel', 'libpulse-devel', 'libudev-devel', 'libva-devel', 'libvdpau-devel',
-    'libopenssl-devel',
+    'libopenssl-devel', 'libavutil-devel',
     # lrc
     'libQt5Core-devel', 'libQt5DBus-devel', 'libqt5-linguist-devel',
-    # gnome client
-    'gtk3-devel', 'clutter-gtk-devel', 'qrencode-devel',
-    'gettext-tools', 'libnotify-devel', 'libappindicator3-devel', 'webkit2gtk3-devel',
-    'NetworkManager-devel', 'libcanberra-gtk3-devel'
+    # client gnome / qt
+    'qrencode-devel', 'NetworkManager-devel'
+]
+
+ZYPPER_CLIENT_GNOME_DEPENDENCIES = [
+    'gtk3-devel', 'clutter-gtk-devel', 'gettext-tools', 'libnotify-devel', 'libappindicator3-devel',
+    'webkit2gtk3-devel', 'libcanberra-gtk3-devel'
+]
+
+ZYPPER_CLIENT_QT_DEPENDENCIES = [
+    'libqt5-qtsvg-devel', 'libqt5-qtwebengine-devel', 'libqt5-qtmultimedia-devel',
+    'libqt5-qtdeclarative-devel', 'libQt5QuickControls2-devel', 'libqt5-qtquickcontrols'
 ]
 
 DNF_DEPENDENCIES = [
@@ -111,11 +117,20 @@ DNF_DEPENDENCIES = [
     'speex-devel', 'chrpath', 'check', 'astyle', 'uuid-c++-devel', 'gettext-devel',
     'gcc-c++', 'which', 'alsa-lib-devel', 'systemd-devel', 'libuuid-devel',
     'uuid-devel', 'gnutls-devel', 'nettle-devel', 'opus-devel', 'speexdsp-devel',
-    'yaml-cpp-devel', 'qt5-qtbase-devel', 'swig', 'qrencode-devel', 'jsoncpp-devel',
-    'gtk3-devel', 'clutter-devel', 'clutter-gtk-devel',
-    'libnotify-devel', 'libappindicator-gtk3-devel', 'patch', 'libva-devel', 'openssl-devel',
-    'webkitgtk4-devel', 'NetworkManager-libnm-devel', 'libvdpau-devel', 'msgpack-devel', 'libcanberra-devel',
-    'sqlite-devel', 'openssl-static', 'pandoc', 'nasm'
+    'yaml-cpp-devel', 'qt5-qtbase-devel', 'swig', 'jsoncpp-devel',
+    'patch', 'libva-devel', 'openssl-devel', 'libvdpau-devel', 'msgpack-devel',
+    'sqlite-devel', 'openssl-static', 'pandoc', 'nasm', 'qrencode-devel', 'NetworkManager-libnm-devel',
+    'bzip2'
+]
+
+DNF_CLIENT_GNOME_DEPENDENCIES = [
+    'gtk3-devel', 'clutter-devel', 'clutter-gtk-devel', 'libnotify-devel','libappindicator-gtk3-devel',
+    'webkitgtk4-devel', 'libcanberra-devel'
+]
+
+DNF_CLIENT_QT_DEPENDENCIES = [
+    'qt5-qtsvg-devel', 'qt5-qtwebengine-devel', 'qt5-qtmultimedia-devel', 'qt5-qtdeclarative-devel',
+    'qt5-qtquickcontrols2-devel', 'qt5-qtquickcontrols'
 ]
 
 APT_DEPENDENCIES = [
@@ -128,9 +143,22 @@ APT_DEPENDENCIES = [
     'libopus-dev', 'libpcre3-dev', 'libpulse-dev', 'libssl-dev',
     'libspeex-dev', 'libspeexdsp-dev', 'libswscale-dev', 'libtool',
     'libudev-dev', 'libyaml-cpp-dev', 'qtbase5-dev', 'libqt5sql5-sqlite', 'sip-tester', 'swig',
-    'uuid-dev', 'yasm', 'libqrencode-dev', 'libjsoncpp-dev', 'libappindicator3-dev',
-    'libva-dev', 'libwebkit2gtk-4.0-dev', 'libnm-dev', 'libvdpau-dev', 'libmsgpack-dev', 'libcanberra-gtk3-dev',
-    'pandoc', 'nasm'
+    'uuid-dev', 'yasm', 'libjsoncpp-dev', 'libva-dev', 'libvdpau-dev', 'libmsgpack-dev',
+    'pandoc', 'nasm', 'libqrencode-dev', 'libnm-dev', 'dpkg-dev'
+]
+
+APT_CLIENT_GNOME_DEPENDENCIES = [
+    'libwebkit2gtk-4.0-dev', 'libappindicator3-dev', 'libcanberra-gtk3-dev'
+]
+
+APT_CLIENT_QT_DEPENDENCIES = [
+    'qtmultimedia5-dev', 'libqt5svg5-dev', 'qtwebengine5-dev', 'qtdeclarative5-dev',
+    'qtquickcontrols2-5-dev', 'qml-module-qtquick2', 'qml-module-qtquick-controls',
+    'qml-module-qtquick-controls2', 'qml-module-qtquick-dialogs',
+    'qml-module-qtquick-layouts', 'qml-module-qtquick-privatewidgets',
+    'qml-module-qtquick-shapes', 'qml-module-qtquick-window2',
+    'qml-module-qtquick-templates2', 'qml-module-qt-labs-platform',
+    'qml-module-qtwebengine', 'qml-module-qtwebchannel'
 ]
 
 PACMAN_DEPENDENCIES = [
@@ -190,12 +218,12 @@ def run_powersell_cmd(cmd):
     return
 
 
-def write_qt_conf(path):
+def write_qt_conf(path, qt5version=QT5_VERSION):
     # Add a configuration that can be supplied to qmake
     # e.g. `qmake -qt=5.15 [mode] [options] [files]`
     if path == '':
         return
-    with open('/usr/share/qtchooser/' + QT5_VERSION + '.conf', 'w+') as fd:
+    with open('/usr/share/qtchooser/' + qt5version + '.conf', 'w+') as fd:
         fd.write(path.rstrip('/') + '/bin\n')
         fd.write(path.rstrip('/') + '/lib\n')
     return
@@ -203,19 +231,27 @@ def write_qt_conf(path):
 
 def run_dependencies(args):
     if args.qt is not None:
-        write_qt_conf(args.qt)
+        write_qt_conf(args.qt, args.qtver)
 
     if args.distribution == WIN32_DISTRIBUTION_NAME:
         run_powersell_cmd(
             'Set-ExecutionPolicy Unrestricted; .\\scripts\\install-deps-windows.ps1')
 
     elif args.distribution in APT_BASED_DISTROS:
+        if args.qt is None:
+            APT_DEPENDENCIES.extend(APT_CLIENT_GNOME_DEPENDENCIES)
+        else:
+            APT_DEPENDENCIES.extend(APT_CLIENT_QT_DEPENDENCIES)
         execute_script(
             APT_INSTALL_SCRIPT,
             {"packages": ' '.join(map(shlex.quote, APT_DEPENDENCIES))}
         )
 
     elif args.distribution in DNF_BASED_DISTROS:
+        if args.qt is None:
+            DNF_DEPENDENCIES.extend(DNF_CLIENT_GNOME_DEPENDENCIES)
+        else:
+            DNF_DEPENDENCIES.extend(DNF_CLIENT_QT_DEPENDENCIES)
         execute_script(
             RPM_INSTALL_SCRIPT,
             {"packages": ' '.join(map(shlex.quote, DNF_DEPENDENCIES))}
@@ -228,6 +264,10 @@ def run_dependencies(args):
         )
 
     elif args.distribution in ZYPPER_BASED_DISTROS:
+        if args.qt is None:
+            ZYPPER_DEPENDENCIES.extend(ZYPPER_CLIENT_GNOME_DEPENDENCIES)
+        else:
+            ZYPPER_DEPENDENCIES.extend(ZYPPER_CLIENT_QT_DEPENDENCIES)
         execute_script(
             ZYPPER_INSTALL_SCRIPT,
             {"packages": ' '.join(map(shlex.quote, ZYPPER_DEPENDENCIES))}
@@ -352,11 +392,8 @@ def run_install(args):
             install_args += ("-c", "client-gnome")
         else:
             install_args += ("-c", "client-qt")
-            install_args += ("-q", QT5_VERSION)
-            if args.qt == '':
-                install_args += ("-Q", DEFAULT_QT_PATH)
-            else:
-                install_args += ("-Q", args.qt)
+            install_args += ("-q", args.qtver)
+            install_args += ("-Q", args.qt)
 
     return subprocess.run(["./scripts/install.sh"] + install_args, env=environ, check=True)
 
@@ -525,7 +562,9 @@ def parse_args():
     ap.add_argument('--no-priv-install', dest='priv_install',
                     default=True, action='store_false')
     ap.add_argument('--qt', nargs='?', const='', type=str,
-                    help='Build the Qt client with the Qt 5.15 path supplied')
+                    help='Build the Qt client with the Qt path supplied')
+    ap.add_argument('--qtver', default=QT5_VERSION,
+                    help='Sets the Qt version to build with')
 
     dist = choose_distribution()
     if dist == WIN32_DISTRIBUTION_NAME:
@@ -533,8 +572,6 @@ def parse_args():
                         help='Windows use only, specify Visual Studio toolset version')
         ap.add_argument('--sdk', default=win_sdk_default, type=str,
                         help='Windows use only, specify Windows SDK version')
-        ap.add_argument('--qtver', default=QT5_VERSION,
-                        help='Sets the Qt version to build with')
 
     parsed_args = ap.parse_args()
 
diff --git a/scripts/install.sh b/scripts/install.sh
index f02f3b10..132d0f02 100755
--- a/scripts/install.sh
+++ b/scripts/install.sh
@@ -13,6 +13,9 @@ export OSTYPE
 
 set -ex
 
+# Qt_MIN_VER required for client-qt
+QT5_MIN_VER="5.14"
+
 global=false
 static=''
 client=''
@@ -104,6 +107,33 @@ fi
 make -j"${proc}"
 make_install "${global}" "${priv_install}"
 
+
+# For the client-qt, verify system's version if no path provided
+if [ "${client}" = "client-qt" ] && [ -z "$qt5path" ]; then
+    sys_qt5ver=""
+    if command -v qmake &> /dev/null; then
+        sys_qt5ver=$(qmake -v)
+    elif command -v qmake-qt5 &> /dev/null; then
+        sys_qt5ver=$(qmake-qt5 -v)   # Fedora
+    else
+        echo "No valid Qt found"; exit 1;
+    fi
+
+    sys_qt5ver=${sys_qt5ver#*Qt version}
+    sys_qt5ver=${sys_qt5ver%\ in\ *}
+
+    installed_qt5ver=$(echo $sys_qt5ver| cut -d'.' -f 2)
+    required_qt5ver=$(echo $QT5_MIN_VER| cut -d'.' -f 2)
+
+    if [[ $installed_qt5ver -ge $required_qt5ver ]] ; then
+        # Disable qt5path and qt5ver in order to use system's Qt
+        qt5path=""
+        qt5ver=""
+    else
+        echo "No valid Qt found"; exit 1;
+    fi
+fi
+
 # libringclient
 cd "${TOP}/lrc"
 mkdir -p "${BUILDDIR}"
@@ -113,12 +143,12 @@ if [ "${global}" = "true" ]; then
     cmake .. -DCMAKE_PREFIX_PATH="${CMAKE_PREFIX_PATH}" \
              -DCMAKE_BUILD_TYPE=Debug \
              -DCMAKE_INSTALL_PREFIX="${prefix}" $static \
-             -DQT_MIN_VER="${qt5ver}" \
+             -DQT5_VER="${qt5ver}" \
              -DQT5_PATH="${qt5path}"
   else
     cmake .. -DCMAKE_PREFIX_PATH="${CMAKE_PREFIX_PATH}" \
              -DCMAKE_BUILD_TYPE=Debug $static \
-             -DQT_MIN_VER="${qt5ver}" \
+             -DQT5_VER="${qt5ver}" \
              -DQT5_PATH="${qt5path}"
   fi
 else
@@ -126,7 +156,7 @@ else
             -DCMAKE_BUILD_TYPE=Debug \
             -DCMAKE_INSTALL_PREFIX="${INSTALL}/lrc" \
             -DRING_BUILD_DIR="${DAEMON}/src" $static \
-            -DQT_MIN_VER="${qt5ver}" \
+            -DQT5_VER="${qt5ver}" \
             -DQT5_PATH="${qt5path}"
 fi
 make -j"${proc}"
@@ -137,24 +167,18 @@ cd "${TOP}/${client}"
 mkdir -p "${BUILDDIR}"
 cd "${BUILDDIR}"
 if [ "${client}" = "client-qt" ]; then
-    echo building client-qt using Qt ${qt5ver}
-    if ! command -v qmake &> /dev/null; then
-      eval ${qt5path}/bin/qmake PREFIX="${INSTALL}/${client}" ..
+    if [ -z ${qt5path} ]; then
+        if command -v qmake &> /dev/null; then
+            echo "Build client-qt with $(qmake -v)"
+            qmake PREFIX="${INSTALL}/${client}" ..
+        else
+            echo "Build client-qt with $(qmake-qt5 -v)" # Fedora
+            qmake-qt5 PREFIX="${INSTALL}/${client}" ..
+        fi
     else
-      # Extract installed Qt version and compare with minimum required
-      sys_qt5ver=$(qmake -v)
-      sys_qt5ver=${sys_qt5ver#*Qt version}
-      sys_qt5ver=${sys_qt5ver%\ in\ *}
-
-      installed_qt5ver=$(echo $sys_qt5ver| cut -d'.' -f 2)
-      required_qt5ver=$(echo $qt5ver| cut -d'.' -f 2)
-
-      if [[ $installed_qt5ver -ge $required_qt5ver ]] ; then
-        qmake PREFIX="${INSTALL}/${client}" ..
-      else
+        echo "Build client-qt using Qt ${qt5path}"
         eval ${qt5path}/bin/qmake PREFIX="${INSTALL}/${client}" ..
-      fi
-   fi
+    fi
 else
     if [ "${global}" = "true" ]; then
       if [ "${prefix+set}" ]; then
-- 
GitLab