homescreen: Change from qmake to meson 45/28045/2
authorMarius Vlad <marius.vlad@collabora.com>
Thu, 29 Sep 2022 11:22:11 +0000 (14:22 +0300)
committerMarius Vlad <marius.vlad@collabora.com>
Fri, 7 Oct 2022 18:28:01 +0000 (21:28 +0300)
This change will basically make way for adding grpc/protobuf support
into homescreen, which turns out it's a pain to do with either qmake or
cmake. Eventually, we'll move all our demos to using meson, which have
gained a lot of support for building and support different technologies
to allow far more saner configurations to take place.

Based heavily on the work done by Scott Murray in libqtappfw,
in the applauncher module.

Bug-AGL: SPEC-4584
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Suggested-by: Scott Murray <scott.murray@konsulko.com>
Change-Id: Id64bf3d5b41912d32df7f78e94ab04d231bb0c83

homescreen/homescreen.pro [deleted file]
homescreen/meson.build [new file with mode: 0644]
homescreen/src/hmi-debug.h
homescreen/src/homescreenhandler.cpp
homescreen/src/main.cpp
homescreen/src/shell.cpp
homescreen/src/shell.h
meson.build [moved from homescreen.pro with 61% similarity]

diff --git a/homescreen/homescreen.pro b/homescreen/homescreen.pro
deleted file mode 100644 (file)
index 16a01f6..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
-# Copyright (c) 2017 TOYOTA MOTOR CORPORATION
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-TEMPLATE = app
-TARGET = homescreen
-QT = qml quick gui-private
-CONFIG += c++11 link_pkgconfig wayland-scanner
-PKGCONFIG += wayland-client
-PKGCONFIG += qtappfw-weather qtappfw-network qtappfw-bt qtappfw-vehicle-signals qtappfw-applauncher
-
-SOURCES += \
-    src/main.cpp \
-    src/shell.cpp \
-    src/statusbarmodel.cpp \
-    src/statusbarserver.cpp \
-    src/applicationlauncher.cpp \
-    src/mastervolume.cpp \
-    src/homescreenhandler.cpp
-
-HEADERS  += \
-    src/shell.h \
-    src/constants.h \
-    src/statusbarmodel.h \
-    src/statusbarserver.h \
-    src/applicationlauncher.h \
-    src/mastervolume.h \
-    src/homescreenhandler.h
-
-OTHER_FILES += \
-    README.md
-
-RESOURCES += \
-    qml/images/MediaPlayer/mediaplayer.qrc \
-    qml/images/MediaMusic/mediamusic.qrc \
-    qml/images/Weather/weather.qrc \
-    qml/images/Shortcut/shortcut.qrc \
-    qml/images/Status/status.qrc \
-    qml/images/images.qrc \
-    qml/qml.qrc
-
-AGL_SHELL_PATH = $$system(pkg-config --variable=pkgdatadir agl-compositor-0.0.20-protocols)
-WAYLANDCLIENTSOURCES += $$AGL_SHELL_PATH/agl-shell.xml
-
-target.path = $${PREFIX}/usr/bin
-target.files += $${OUT_PWD}/$${TARGET}
-target.CONFIG = no_check_exist executable
-
-INSTALLS += target
diff --git a/homescreen/meson.build b/homescreen/meson.build
new file mode 100644 (file)
index 0000000..fc93d06
--- /dev/null
@@ -0,0 +1,107 @@
+cpp = meson.get_compiler('cpp')
+qt5_dep = dependency('qt5', modules: ['Qml', 'Quick', 'Gui'])
+dep_wayland_client = dependency('wayland-client', version: '>= 1.20.0')
+dep_qtappfw = [
+    dependency('qtappfw-weather'),
+    dependency('qtappfw-network'),
+    dependency('qtappfw-bt'),
+    dependency('qtappfw-vehicle-signals'),
+    dependency('qtappfw-applauncher')
+]
+
+qt_defines = []
+qpa_header_path = join_paths(qt5_dep.version(), 'QtGui')
+qpa_header = join_paths(qpa_header_path, 'qpa/qplatformnativeinterface.h')
+# we pass this QT_QPA_HEADER straight in the code as there's no easy
+# way to pass the correct header
+if cpp.has_header(qpa_header, dependencies : qt5_dep)
+  qt_defines += [ '-DQT_QPA_HEADER=<@0@>'.format(qpa_header) ]
+  message('Found QtGui QPA header in ' + qpa_header_path)
+endif
+
+dep_scanner = dependency('wayland-scanner')
+prog_scanner = find_program(dep_scanner.get_pkgconfig_variable('wayland_scanner'))
+agl_compositor_dep = dependency('agl-compositor-0.0.20-protocols')
+dir_agl_compositor_base = agl_compositor_dep.get_pkgconfig_variable('pkgdatadir')
+
+homescreen_dep = [
+    qt5_dep,
+    dep_wayland_client,
+    dep_qtappfw,
+]
+
+homescreen_resources = [
+  'qml/images/MediaPlayer/mediaplayer.qrc',
+  'qml/images/MediaMusic/mediamusic.qrc',
+  'qml/images/Weather/weather.qrc',
+  'qml/images/Shortcut/shortcut.qrc',
+  'qml/images/Status/status.qrc',
+  'qml/images/images.qrc',
+  'qml/qml.qrc'
+]
+
+resource_files = qt5.compile_resources(sources: homescreen_resources)
+
+protocols = [
+        [ 'agl-shell', 'agl-compositor' ],
+]
+
+foreach proto: protocols
+        proto_name = proto[0]
+        if proto[1] == 'agl-compositor'
+                base_file = proto_name
+                xml_path = join_paths(dir_agl_compositor_base, '@0@.xml'.format(base_file))
+        endif
+
+        foreach output_type: [ 'client-header', 'server-header', 'private-code' ]
+                if output_type == 'client-header'
+                        output_file = '@0@-client-protocol.h'.format(base_file)
+                elif output_type == 'server-header'
+                        output_file = '@0@-server-protocol.h'.format(base_file)
+                else
+                        output_file = '@0@-protocol.c'.format(base_file)
+                        if dep_scanner.version().version_compare('< 1.14.91')
+                                output_type = 'code'
+                        endif
+                endif
+
+                var_name = output_file.underscorify()
+                target = custom_target(
+                        '@0@ @1@'.format(base_file, output_type),
+                        command: [ prog_scanner, output_type, '@INPUT@', '@OUTPUT@' ],
+                        input: xml_path,
+                        output: output_file,
+                )
+                message('protocol name is ' + var_name)
+                set_variable(var_name, target)
+        endforeach
+endforeach
+
+homescreen_src_headers = [
+  'src/applicationlauncher.h',
+  'src/mastervolume.h',
+  'src/statusbarmodel.h',
+  'src/statusbarserver.h',
+  'src/homescreenhandler.h',
+  'src/shell.h'
+]
+
+moc_files = qt5.compile_moc(headers: homescreen_src_headers,
+                            dependencies: qt5_dep)
+
+homescreen_src = [
+  'src/shell.cpp',
+  'src/statusbarserver.cpp',
+  'src/statusbarmodel.cpp',
+  'src/applicationlauncher.cpp',
+  'src/mastervolume.cpp',
+  'src/homescreenhandler.cpp',
+  'src/main.cpp',
+  agl_shell_client_protocol_h,
+  agl_shell_protocol_c
+]
+
+executable('homescreen', homescreen_src, resource_files, moc_files,
+            cpp_args: qt_defines,
+            dependencies : homescreen_dep,
+            install: true)
index 47ae1f7..ea9bae8 100644 (file)
@@ -49,7 +49,6 @@ static void _HMI_LOG(enum LOG_LEVEL level, const char* file, const char* func, c
     struct timespec tp;
     uint32_t time;
     va_list args;
-    int ret;
     const int log_level = (getenv("USE_HMI_DEBUG") == NULL) ? LOG_LEVEL_ERROR : atoi(getenv("USE_HMI_DEBUG"));
 
     if(log_level < level) {
index 920c054..2858ef4 100644 (file)
@@ -11,7 +11,8 @@
 #include "homescreenhandler.h"
 #include "hmi-debug.h"
 
-#include <qpa/qplatformnativeinterface.h>
+// defined by meson build file
+#include QT_QPA_HEADER
 
 // LAUNCHER_APP_ID shouldn't be started by applaunchd as it is started as
 // a user session by systemd
index 8c3391f..c910727 100644 (file)
 #include "homescreenhandler.h"
 #include "hmi-debug.h"
 
-#include <qpa/qplatformnativeinterface.h>
+// meson will define these
+#include QT_QPA_HEADER
 #include <wayland-client.h>
 
-#include "wayland-agl-shell-client-protocol.h"
+#include "agl-shell-client-protocol.h"
 #include "shell.h"
 
 #ifndef MIN
index 1427b7c..ffb4439 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2019 Collabora Ltd.
+ * Copyright © 2019, 2022 Collabora Ltd.
  *
  * Permission is hereby granted, free of charge, to any person obtaining
  * a copy of this software and associated documentation files (the
@@ -26,7 +26,8 @@
 #include <QGuiApplication>
 #include <QDebug>
 #include "shell.h"
-#include <qpa/qplatformnativeinterface.h>
+// defined by meson build file
+#include QT_QPA_HEADER
 #include <stdio.h>
 
 static struct wl_output *
index 8bf0e9b..a6e3f7e 100644 (file)
@@ -32,7 +32,7 @@
 #include <QScreen>
 #include <QWindow>
 #include <memory>
-#include "wayland-agl-shell-client-protocol.h"
+#include "agl-shell-client-protocol.h"
 
 /*
  * Basic type to wrap the agl_shell wayland object into a QObject, so that it
similarity index 61%
rename from homescreen.pro
rename to meson.build
index bf0d4bb..3d77b36 100644 (file)
@@ -1,4 +1,5 @@
-# Copyright (c) 2017 TOYOTA MOTOR CORPORATION
+#
+# Copyright ©, 2022 Collabora, Ltd.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+#
 
-TEMPLATE = subdirs
-
-load(configure)
+project (
+  'homescreen',
+  ['c', 'cpp'],
+  version : '1.0.0',
+  license : 'Apache-2.0',
+  meson_version : '>= 0.60.0',
+  default_options :
+    [
+      'warning_level=1',
+      'buildtype=debugoptimized',
+      'c_std=c17',
+      'cpp_std=c++17'
+    ],
+)
 
-SUBDIRS = \
-    homescreen
+qt5 = import('qt5')
+subdir('homescreen')