gstreamer/subprojects/gst-plugins-good/ext/qt/meson.build
Nirbheek Chauhan 8e8d8206f1 meson: Add build_rpath for qt5 plugin on macOS
Without this, the plugin cannot be loaded in a devenv because the
RPATH is not added to the plugin dylib. This RPATH will be stripped on
install, which is what we want.

When deploying apps, people are supposed to use `macdeployqt` to
create an AppBundle that bundles Qt for you and sets the RPATHs
correctly to point to that bundled Qt.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3708>
2023-01-25 11:38:52 +00:00

175 lines
5.5 KiB
Meson

sources = [
'gstplugin.cc',
'gstqtelement.cc',
'gstqsgtexture.cc',
'gstqtglutility.cc',
'gstqtoverlay.cc',
'gstqtsink.cc',
'gstqtsrc.cc',
'qtglrenderer.cc',
'qtitem.cc',
'qtwindow.cc',
]
moc_headers = [
'qtitem.h',
'qtwindow.h',
'gstqsgtexture.h',
'qtglrenderer.h',
]
# 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')
qt5_method = get_option('qt-method')
if qt5_option.disabled()
subdir_done()
endif
if not have_gstgl
if qt5_option.enabled()
error('qt5 qmlglsink plugin is enabled, but gstreamer-gl-1.0 was not found')
endif
subdir_done()
endif
if not add_languages('cpp', native: false, required: qt5_option)
subdir_done()
endif
qt5_mod = import('qt5')
qt5qml_dep = dependency('qt5', modules : ['Core', 'Gui', 'Qml', 'Quick'],
method: qt5_method, required: qt5_option, static: host_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' and not meson.is_cross_build()
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
# Look for the QPA platform native interface header
qpa_header_path = join_paths(qt5qml_dep.version(), 'QtGui')
qpa_header = join_paths(qpa_header_path, 'qpa/qplatformnativeinterface.h')
if cxx.has_header(qpa_header, dependencies : qt5qml_dep)
qt_defines += '-DHAVE_QT_QPA_HEADER'
qt_defines += '-DQT_QPA_HEADER=' + '<@0@>'.format(qpa_header)
have_qpa_include = true
message('Found QtGui QPA header in ' + qpa_header_path)
endif
# 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'], method: qt5_method, required : false)
if qt5x11extras.found()
optional_deps += [qt5x11extras, gstglx11_dep]
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']
optional_deps += gstglegl_dep
have_qt_windowing = true
if have_qpa_include
# Wayland windowing
if gst_gl_have_window_wayland
# FIXME: automagic
qt5waylandextras = dependency('qt5', modules : ['WaylandClient'], method: qt5_method, required : false)
if qt5waylandextras.found()
optional_deps += [qt5waylandextras, gstglwayland_dep]
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'], method: qt5_method, 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
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 gst_gl_have_window_cocoa and gst_gl_have_platform_cgl
# FIXME: automagic
qt5macextras = dependency('qt5', modules : ['MacExtras'], method: qt5_method, 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
# rpath is needed to be able to load the plugin on macOS inside the devenv
qmlgl_kwargs = {}
if host_system == 'darwin'
fs = import('fs')
qt_bindir = fs.parent(find_program('qmake').full_path())
qt_libdir = fs.parent(qt_bindir) / 'lib'
qmlgl_kwargs += {'build_rpath': qt_libdir}
endif
# 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 : [gst_dep, gstvideo_dep, gstgl_dep, gstglproto_dep, qt5qml_dep, optional_deps],
override_options : ['cpp_std=c++11'],
kwargs: qmlgl_kwargs,
install: true,
install_dir : plugins_install_dir)
plugins += [gstqmlgl]
endif