meson: Revamp qt5qml plugin and example build code
authorNirbheek Chauhan <nirbheek@centricular.com>
Mon, 11 May 2020 23:00:13 +0000 (04:30 +0530)
committerNirbheek Chauhan <nirbheek@centricular.com>
Mon, 11 May 2020 23:00:13 +0000 (04:30 +0530)
Stricter and simpler. For example, now we properly error out when
gstreamer-gl-1.0 was not found when the qt5 plugin is enabled or when
a C++ compiler is not enabled.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/587>

ext/qt/meson.build
tests/examples/qt/meson.build
tests/examples/qt/qmloverlay/meson.build
tests/examples/qt/qmlsink-dynamically-added/meson.build
tests/examples/qt/qmlsink/meson.build
tests/examples/qt/qmlsrc/meson.build

index 99fc1ee..3689a33 100644 (file)
@@ -17,155 +17,178 @@ moc_headers = [
   'qtglrenderer.h',
 ]
 
-# FIXME: -Dqt5=enabled is silently ignored if a c++ compiler is not found
-if have_cxx and build_gstgl
-  qt5_mod = import('qt5')
-  qt5qml_dep = dependency('qt5', modules : ['Core', 'Gui', 'Qml', 'Quick'],
-                          required: get_option('qt5'), static: host_machine.system() == 'ios')
-
-  # On Linux, distros often have the Qt5 pkg-config files and moc in separate
-  # packages, so the user may not have both installed. Check for moc and ensure
-  # that it's installed.
-  # We don't do this check on other OSes because they need to be able to simply
-  # point the `QMAKE` env var to `qmake` to build against a particular Qt5.
-  if host_system == 'linux'
-    moc = find_program('moc-qt5', 'moc', required : get_option('qt5'))
-  else
-    # We only check if `moc` was found, and then discard it, so we can fake it.
-    # This is also a good unit test of the fact that we *don't* use it.
-    moc = declare_dependency()
+# Define a not-found dependency so this variable is always defined when we're
+# deciding whether to build the qt5 examples
+qt5qml_dep = dependency('', required: false)
+qt5_option = get_option('qt5')
+
+if qt5_option.disabled()
+  subdir_done()
+endif
+
+if not build_gstgl
+  if qt5_option.enabled()
+    error('qt5 qmlglsink plugin is enabled, but gstreamer-gl-1.0 was not found')
   endif
-  if qt5qml_dep.found() and moc.found()
-    optional_deps = []
-    qt_defines = []
-    have_qpa_include = false
-    have_qt_windowing = false
-
-    # Attempt to find the QPA header either through pkg-config (preferred) or qmake
-    # This semi-matches what meson does internally with the qt5 module
-    # FIXME Add a way to get some of this information out of the qt5 module
-    if not have_qpa_include
-      # FIXME: automagic
-      qt5core_dep = dependency('Qt5Core', required: false)
-      if qt5core_dep.found() and qt5core_dep.type_name() == 'pkgconfig'
-        qt_version = qt5core_dep.version()
-        qt_include_dir = qt5core_dep.get_pkgconfig_variable('includedir')
-        qpa_include_path = join_paths(qt_include_dir, 'QtGui', qt_version, 'QtGui')
-        if cxx.has_header('qpa/qplatformnativeinterface.h',
-                dependencies : qt5core_dep,
-                args : '-I' + qpa_include_path)
-          qt_defines += '-DHAVE_QT_QPA_HEADER'
-          qt_defines += '-I' + qpa_include_path
-          have_qpa_include = true
-          message('Found QPA header using pkg-config')
-        endif
-      endif
-    endif
-    if not have_qpa_include
-      qmake = find_program('qmake-qt5', 'qmake')
-      if qmake.found()
-        qt_version = run_command(qmake, '-query', 'QT_VERSION').stdout().strip()
-        qt_include_dir = run_command(qmake, '-query', 'QT_INSTALL_HEADERS').stdout().strip()
-        qpa_include_path = join_paths(qt_include_dir, 'QtGui', qt_version, 'QtGui')
-        if cxx.has_header('qpa/qplatformnativeinterface.h',
-                args : '-I' + qpa_include_path)
-          qt_defines += '-DHAVE_QT_QPA_HEADER'
-          qt_defines += '-I' + qpa_include_path
-          have_qpa_include = true
-          message('Found QPA header using qmake')
-        endif
-      endif
-    endif
+  subdir_done()
+endif
 
-    # Try to come up with all the platform/winsys combinations that will work
+if not have_cxx
+  if qt5_option.enabled()
+    error('qt5 qmlglsink plugin is enabled, but no C++ compiler is available')
+  endif
+  subdir_done()
+endif
 
-    if gst_gl_have_window_x11 and gst_gl_have_platform_glx
-      # FIXME: automagic
-      qt5x11extras = dependency('qt5', modules : ['X11Extras'], required : false)
-      if qt5x11extras.found()
-        optional_deps += qt5x11extras
-        qt_defines += ['-DHAVE_QT_X11']
-        have_qt_windowing = true
-      endif
-    endif
+qt5_mod = import('qt5')
+qt5qml_dep = dependency('qt5', modules : ['Core', 'Gui', 'Qml', 'Quick'],
+                        required: qt5_option, static: host_machine.system() == 'ios')
 
-    if gst_gl_have_platform_egl
-      # Embedded linux (e.g. i.MX6) with or without windowing support
-      qt_defines += ['-DHAVE_QT_EGLFS']
-      egl_dep = dependency('egl', required : false)
-      optional_deps += egl_dep
-      have_qt_windowing = true
-      if have_qpa_include
-        # Wayland windowing
-        if gst_gl_have_window_wayland
-          # FIXME: automagic
-          qt5waylandextras = dependency('qt5', modules : ['WaylandClient'], required : false)
-          if qt5waylandextras.found()
-            optional_deps += qt5waylandextras
-            qt_defines += ['-DHAVE_QT_WAYLAND']
-            have_qt_windowing = true
-          endif
-        endif
-        # Android windowing
-        if gst_gl_have_window_android
-          # FIXME: automagic
-          qt5androidextras = dependency('qt5', modules : ['AndroidExtras'], required : false)
-          # for gl functions in QtGui/qopenglfunctions.h
-          # FIXME: automagic
-          glesv2_dep = cc.find_library('GLESv2', required : false)
-          if glesv2_dep.found() and qt5androidextras.found()
-            optional_deps += [qt5androidextras, glesv2_dep]
-            qt_defines += ['-DHAVE_QT_ANDROID']
-            have_qt_windowing = true
-            # Needed for C++11 support in Cerbero. People building with Android
-            # in some other way need to add the necessary bits themselves.
-            optional_deps += dependency('gnustl', required : false)
-          endif
-        endif
-      endif
+# On Linux, distros often have the Qt5 pkg-config files and moc in separate
+# packages, so the user may not have both installed. Check for moc and ensure
+# that it's installed.
+# We don't do this check on other OSes because they need to be able to simply
+# point the `QMAKE` env var to `qmake` to build against a particular Qt5.
+if host_system == 'linux'
+  moc = find_program('moc-qt5', 'moc', required : qt5_option)
+else
+  # We only check if `moc` was found, and then discard it, so we can fake it.
+  # This is also a good unit test of the fact that we *don't* use it.
+  moc = declare_dependency()
+endif
+
+if not qt5qml_dep.found() or not moc.found()
+  subdir_done()
+endif
+
+optional_deps = []
+qt_defines = []
+have_qpa_include = false
+have_qt_windowing = false
+
+# Attempt to find the QPA header either through pkg-config (preferred) or qmake
+# This semi-matches what meson does internally with the qt5 module
+# FIXME Add a way to get some of this information out of the qt5 module
+if not have_qpa_include
+  # FIXME: automagic
+  qt5core_dep = dependency('Qt5Core', required: false)
+  if qt5core_dep.found() and qt5core_dep.type_name() == 'pkgconfig'
+    qt_version = qt5core_dep.version()
+    qt_include_dir = qt5core_dep.get_pkgconfig_variable('includedir')
+    qpa_include_path = join_paths(qt_include_dir, 'QtGui', qt_version, 'QtGui')
+    if cxx.has_header('qpa/qplatformnativeinterface.h',
+            dependencies : qt5core_dep,
+            args : '-I' + qpa_include_path)
+      qt_defines += '-DHAVE_QT_QPA_HEADER'
+      qt_defines += '-I' + qpa_include_path
+      have_qpa_include = true
+      message('Found QPA header using pkg-config')
     endif
+  endif
+endif
+if not have_qpa_include
+  qmake = find_program('qmake-qt5', 'qmake')
+  if qmake.found()
+    qt_version = run_command(qmake, '-query', 'QT_VERSION').stdout().strip()
+    qt_include_dir = run_command(qmake, '-query', 'QT_INSTALL_HEADERS').stdout().strip()
+    qpa_include_path = join_paths(qt_include_dir, 'QtGui', qt_version, 'QtGui')
+    if cxx.has_header('qpa/qplatformnativeinterface.h',
+            args : '-I' + qpa_include_path)
+      qt_defines += '-DHAVE_QT_QPA_HEADER'
+      qt_defines += '-I' + qpa_include_path
+      have_qpa_include = true
+      message('Found QPA header using qmake')
+    endif
+  endif
+endif
 
-    if gst_gl_have_platform_wgl and gst_gl_have_window_win32
-      # for wglMakeCurrent()
+# Try to come up with all the platform/winsys combinations that will work
+
+if gst_gl_have_window_x11 and gst_gl_have_platform_glx
+  # FIXME: automagic
+  qt5x11extras = dependency('qt5', modules : ['X11Extras'], required : false)
+  if qt5x11extras.found()
+    optional_deps += qt5x11extras
+    qt_defines += ['-DHAVE_QT_X11']
+    have_qt_windowing = true
+  endif
+endif
+
+if gst_gl_have_platform_egl
+  # Embedded linux (e.g. i.MX6) with or without windowing support
+  qt_defines += ['-DHAVE_QT_EGLFS']
+  egl_dep = dependency('egl', required : false)
+  optional_deps += egl_dep
+  have_qt_windowing = true
+  if have_qpa_include
+    # Wayland windowing
+    if gst_gl_have_window_wayland
       # FIXME: automagic
-      opengl32_dep = cc.find_library('opengl32', required : false)
-      if opengl32_dep.found()
-        qt_defines += ['-DHAVE_QT_WIN32']
-        optional_deps += opengl32_dep
+      qt5waylandextras = dependency('qt5', modules : ['WaylandClient'], required : false)
+      if qt5waylandextras.found()
+        optional_deps += qt5waylandextras
+        qt_defines += ['-DHAVE_QT_WAYLAND']
         have_qt_windowing = true
       endif
     endif
-
-    if gst_gl_have_window_cocoa and gst_gl_have_platform_cgl
+    # Android windowing
+    if gst_gl_have_window_android
+      # FIXME: automagic
+      qt5androidextras = dependency('qt5', modules : ['AndroidExtras'], required : false)
+      # for gl functions in QtGui/qopenglfunctions.h
       # FIXME: automagic
-      qt5macextras = dependency('qt5', modules : ['MacExtras'], required : false)
-      if qt5macextras.found()
-        qt_defines += ['-DHAVE_QT_MAC']
-        optional_deps += qt5macextras
+      glesv2_dep = cc.find_library('GLESv2', required : false)
+      if glesv2_dep.found() and qt5androidextras.found()
+        optional_deps += [qt5androidextras, glesv2_dep]
+        qt_defines += ['-DHAVE_QT_ANDROID']
         have_qt_windowing = true
+        # Needed for C++11 support in Cerbero. People building with Android
+        # in some other way need to add the necessary bits themselves.
+        optional_deps += dependency('gnustl', required : false)
       endif
     endif
+  endif
+endif
 
-    if gst_gl_have_window_eagl and gst_gl_have_platform_eagl
-      if host_machine.system() == 'ios'
-        qt_defines += ['-DHAVE_QT_IOS']
-        have_qt_windowing = true
-      endif
-    endif
+if gst_gl_have_platform_wgl and gst_gl_have_window_win32
+  # for wglMakeCurrent()
+  # FIXME: automagic
+  opengl32_dep = cc.find_library('opengl32', required : false)
+  if opengl32_dep.found()
+    qt_defines += ['-DHAVE_QT_WIN32']
+    optional_deps += opengl32_dep
+    have_qt_windowing = true
+  endif
+endif
 
-    if have_qt_windowing
-      # Build it!
-      moc_files = qt5_mod.preprocess(moc_headers : moc_headers)
-      gstqmlgl = library('gstqmlgl', sources, moc_files,
-        cpp_args : gst_plugins_good_args + qt_defines,
-        link_args : noseh_link_args,
-        include_directories: [configinc, libsinc],
-        dependencies : [glib_deps, gst_dep, gstvideo_dep, gstgl_dep, qt5qml_dep, optional_deps],
-        override_options : ['cpp_std=c++11'],
-        install: true,
-        install_dir : plugins_install_dir)
-      pkgconfig.generate(gstqmlgl, install_dir : plugins_pkgconfig_install_dir)
-      plugins += [gstqmlgl]
-    endif
+if gst_gl_have_window_cocoa and gst_gl_have_platform_cgl
+  # FIXME: automagic
+  qt5macextras = dependency('qt5', modules : ['MacExtras'], required : false)
+  if qt5macextras.found()
+    qt_defines += ['-DHAVE_QT_MAC']
+    optional_deps += qt5macextras
+    have_qt_windowing = true
   endif
 endif
+
+if gst_gl_have_window_eagl and gst_gl_have_platform_eagl
+  if host_machine.system() == 'ios'
+    qt_defines += ['-DHAVE_QT_IOS']
+    have_qt_windowing = true
+  endif
+endif
+
+if have_qt_windowing
+  # Build it!
+  moc_files = qt5_mod.preprocess(moc_headers : moc_headers)
+  gstqmlgl = library('gstqmlgl', sources, moc_files,
+    cpp_args : gst_plugins_good_args + qt_defines,
+    link_args : noseh_link_args,
+    include_directories: [configinc, libsinc],
+    dependencies : [glib_deps, gst_dep, gstvideo_dep, gstgl_dep, qt5qml_dep, optional_deps],
+    override_options : ['cpp_std=c++11'],
+    install: true,
+    install_dir : plugins_install_dir)
+  pkgconfig.generate(gstqmlgl, install_dir : plugins_pkgconfig_install_dir)
+  plugins += [gstqmlgl]
+endif
index 1135f17..ede4b5a 100644 (file)
@@ -1,3 +1,19 @@
+if qt5_option.disabled()
+  subdir_done()
+endif
+
+# We already did all the checks when building the qt plugin
+if not qt5qml_dep.found()
+  subdir_done()
+endif
+
+qt5qml_example_deps = dependency('qt5', modules : ['Core', 'Gui', 'Widgets', 'Qml', 'Quick'],
+                         required: get_option('examples'))
+
+if not qt5qml_example_deps.found()
+  subdir_done()
+endif
+
 subdir('qmloverlay')
 subdir('qmlsink')
 subdir('qmlsink-dynamically-added')
index 57a5383..ccf27e9 100644 (file)
@@ -2,19 +2,9 @@ sources = [
   'main.cpp',
 ]
 
-if have_cxx and build_gstgl and gstgl_dep.found()
-  qt5_mod = import('qt5')
-  qt5qml_deps = dependency('qt5', modules : ['Core', 'Gui', 'Widgets', 'Qml', 'Quick'],
-                           required: get_option('examples'))
-
-  # FIXME Add a way to get that information out of the qt5 module
-  moc = find_program('moc-qt5', 'moc', required : get_option('examples'))
-  if qt5qml_deps.found() and moc.found()
-    qt_preprocessed = qt5_mod.preprocess(qresources : 'qmloverlay.qrc')
-    executable('qmlgloverlay', sources, qt_preprocessed,
-        dependencies : [gst_dep, qt5qml_deps],
-        c_args : gst_plugins_good_args,
-        include_directories : [configinc],
-        install: false)
-  endif
-endif
+qt_preprocessed = qt5_mod.preprocess(qresources : 'qmloverlay.qrc')
+executable('qmlgloverlay', sources, qt_preprocessed,
+    dependencies : [gst_dep, qt5qml_example_deps],
+    c_args : gst_plugins_good_args,
+    include_directories : [configinc],
+    install: false)
index ebee3b0..b4eb78b 100644 (file)
@@ -2,19 +2,9 @@ sources = [
   'main.cpp',
 ]
 
-if have_cxx and build_gstgl and gstgl_dep.found()
-  qt5_mod = import('qt5')
-  qt5qml_deps = dependency('qt5', modules : ['Core', 'Gui', 'Widgets', 'Qml', 'Quick'],
-                           required: get_option('examples'))
-
-  # FIXME Add a way to get that information out of the qt5 module
-  moc = find_program('moc-qt5', 'moc', required : get_option('examples'))
-  if qt5qml_deps.found() and moc.found()
-    qt_preprocessed = qt5_mod.preprocess(qresources : 'qmlsink.qrc')
-    executable('qmlsink-dynamically-added', sources, qt_preprocessed,
-        dependencies : [gst_dep, gstgl_dep, qt5qml_deps],
-        c_args : gst_plugins_good_args,
-        include_directories : [configinc],
-        install: false)
-  endif
-endif
+qt_preprocessed = qt5_mod.preprocess(qresources : 'qmlsink.qrc')
+executable('qmlsink-dynamically-added', sources, qt_preprocessed,
+    dependencies : [gst_dep, gstgl_dep, qt5qml_example_deps],
+    c_args : gst_plugins_good_args,
+    include_directories : [configinc],
+    install: false)
index 2f44437..f2a7a16 100644 (file)
@@ -2,19 +2,9 @@ sources = [
   'main.cpp',
 ]
 
-if have_cxx and build_gstgl and gstgl_dep.found()
-  qt5_mod = import('qt5')
-  qt5qml_deps = dependency('qt5', modules : ['Core', 'Gui', 'Widgets', 'Qml', 'Quick'],
-                           required: get_option('examples'))
-
-  # FIXME Add a way to get that information out of the qt5 module
-  moc = find_program('moc-qt5', 'moc', required : get_option('examples'))
-  if qt5qml_deps.found() and moc.found()
-    qt_preprocessed = qt5_mod.preprocess(qresources : 'qmlsink.qrc')
-    executable('qmlsink', sources, qt_preprocessed,
-        dependencies : [gst_dep, qt5qml_deps],
-        c_args : gst_plugins_good_args,
-        include_directories : [configinc],
-        install: false)
-  endif
-endif
+qt_preprocessed = qt5_mod.preprocess(qresources : 'qmlsink.qrc')
+executable('qmlsink', sources, qt_preprocessed,
+    dependencies : [gst_dep, qt5qml_example_deps],
+    c_args : gst_plugins_good_args,
+    include_directories : [configinc],
+    install: false)
index 122e4a6..3d55a28 100644 (file)
@@ -2,18 +2,9 @@ sources = [
   'main.cpp',
 ]
 
-if have_cxx and build_gstgl and gstgl_dep.found()
-  qt5_mod = import('qt5')
-  qt5qml_deps = dependency('qt5', modules : ['Core', 'Gui', 'Widgets', 'Qml', 'Quick'],
-                           required: get_option('examples'))
-  # FIXME Add a way to get that information out of the qt5 module
-  moc = find_program('moc-qt5', 'moc', required : get_option('examples'))
-  if qt5qml_deps.found() and moc.found()
-    qt_preprocessed = qt5_mod.preprocess(qresources : 'qmlsrc.qrc')
-    executable('qmlsrc', sources, qt_preprocessed,
-        dependencies : [gst_dep, qt5qml_deps],
-        c_args : gst_plugins_good_args,
-        include_directories : [configinc],
-        install: false)
-  endif
-endif
+qt_preprocessed = qt5_mod.preprocess(qresources : 'qmlsrc.qrc')
+executable('qmlsrc', sources, qt_preprocessed,
+    dependencies : [gst_dep, qt5qml_example_deps],
+    c_args : gst_plugins_good_args,
+    include_directories : [configinc],
+    install: false)