homescreen: Change from qmake to meson
authorMarius Vlad <marius.vlad@collabora.com>
Thu, 29 Sep 2022 11:22:11 +0000 (14:22 +0300)
committerMarius Vlad <marius.vlad@collabora.com>
Thu, 29 Sep 2022 16:44:20 +0000 (19:44 +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.

Signed-off-by: Marius Vlad <marius.vlad@collabora.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')