Restructure configure features

Create a new module WaylandGlobalPrivate that is merely a collection of
build features that are shared by client, compositor and plugins of
qtwayland.

Move the features wayland-client and wayland-server to
WaylandGlobalPrivate to be able to access both features in
src/CMakeLists.txt. This removes the need for explicitly including the
configure.cmake files of client and compositor, which fixes QTBUG-88261.

Move the features that are defined in both, client and compositor, to
WaylandGlobalPrivate.

The module is defined in src/CMakeLists.txt to ensure that the
targets created by the qt_find_package calls in src/configure.cmake are
accessible in subdirectories below src/.

We need the (nearly) empty src/global directory to satisfy syncqt.
We cannot pass NO_SYNC_QT to qt_internal_add_module, because that
prevents the creation of qtwaylandglobal-config_p.h.

Fixes: QTBUG-88261
Fixes: QTBUG-91705
Change-Id: I776632a86ffe96886dc12f1f675f9ab56a2faf2a
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Reviewed-by: Alexey Edelev <alexey.edelev@qt.io>
This commit is contained in:
Joerg Bornemann 2021-06-18 17:07:44 +02:00
parent 698bea8e9a
commit 46641fddcd
6 changed files with 263 additions and 225 deletions

View File

@ -11,30 +11,8 @@ configure the module on targets that are missing dependencies.")
return()
endif()
# We conditionally add_subdirectory(client) based on a feature that is defined
# in client/configure.cmake, so we need this hack to make sure the feature is
# defined on this level as well.
# TODO: when we remove configure.json support and stop generating
# configure.cmake, we should move the features up one level and deduplicate the
# features shared with the compositor.
qt_feature_module_begin(
NO_MODULE
PUBLIC_FILE "qtwayland-client-config.h"
PRIVATE_FILE "qtwayland-client-config_p.h"
)
include("${CMAKE_CURRENT_SOURCE_DIR}/client/configure.cmake")
qt_feature_module_end(NO_MODULE)
# Similar hack as above, but for the compositor
qt_feature_module_begin(
NO_MODULE
PUBLIC_FILE "qtwayland-compositor-config.h"
PRIVATE_FILE "qtwayland-compositor-config_p.h"
)
include("${CMAKE_CURRENT_SOURCE_DIR}/compositor/configure.cmake")
qt_feature_module_end(NO_MODULE)
# special case end
# See global/README for a description of the following module.
qt_internal_add_module(WaylandGlobalPrivate INTERNAL_MODULE HEADER_MODULE)
add_subdirectory(qtwaylandscanner)
# special case begin

View File

@ -0,0 +1,249 @@
# configure.cmake for the QtWaylandGlobalPrivate module
#### Inputs
#### Libraries
if(LINUX OR QT_FIND_ALL_PACKAGES_ALWAYS)
# waylandclient libraries
qt_find_package(Wayland
PROVIDED_TARGETS Wayland::Client
MODULE_NAME waylandclient
QMAKE_LIB wayland-client)
qt_find_package(Wayland
PROVIDED_TARGETS Wayland::Cursor
MODULE_NAME waylandclient
QMAKE_LIB wayland-cursor)
qt_add_qmake_lib_dependency(wayland-cursor wayland-client)
qt_find_package(Wayland
PROVIDED_TARGETS Wayland::Egl
MODULE_NAME waylandclient
QMAKE_LIB wayland-egl)
qt_find_package(XComposite
PROVIDED_TARGETS PkgConfig::XComposite
MODULE_NAME waylandclient QMAKE_LIB xcomposite)
# waylandcompositor libraries
qt_find_package(Wayland
PROVIDED_TARGETS Wayland::Server
MODULE_NAME waylandcompositor
QMAKE_LIB wayland-server)
qt_find_package(Wayland
PROVIDED_TARGETS Wayland::Egl
MODULE_NAME waylandcompositor
QMAKE_LIB wayland-egl)
qt_find_package(XComposite
PROVIDED_TARGETS PkgConfig::XComposite
MODULE_NAME waylandcompositor QMAKE_LIB xcomposite)
# X11 is not a public dependency of QtGui anymore, so we need to find it manually in a shared build.
# In a static build the dependency is still propagated, so check for the target existence to prevent
# the 'Attempt to promote imported target "X11::X11" to global scope' issue.
if(NOT TARGET X11::X11)
qt_find_package(X11 PROVIDED_TARGETS X11::X11 MODULE_NAME gui QMAKE_LIB xlib)
endif()
# Same for XKB.
if(NOT TARGET XKB::XKB)
qt_find_package(XKB 0.5.0 PROVIDED_TARGETS XKB::XKB MODULE_NAME gui QMAKE_LIB xkbcommon MARK_OPTIONAL)
endif()
endif()
#### Tests
# drm-egl-server
qt_config_compile_test(drm_egl_server
LABEL "DRM EGL Server"
LIBRARIES
EGL::EGL
CODE
"
#include <EGL/egl.h>
#include <EGL/eglext.h>
int main(int argc, char **argv)
{
(void)argc; (void)argv;
/* BEGIN TEST: */
#ifdef EGL_MESA_drm_image
return 0;
#else
#error Requires EGL_MESA_drm_image to be defined
return 1;
#endif
/* END TEST: */
return 0;
}
")
# libhybris-egl-server
qt_config_compile_test(libhybris_egl_server
LABEL "libhybris EGL Server"
LIBRARIES
EGL::EGL
CODE
"
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <hybris/eglplatformcommon/hybris_nativebufferext.h>
int main(int argc, char **argv)
{
(void)argc; (void)argv;
/* BEGIN TEST: */
#ifdef EGL_HYBRIS_native_buffer
return 0;
#else
#error Requires EGL_HYBRIS_native_buffer to be defined
return 1;
#endif
/* END TEST: */
return 0;
}
")
# dmabuf-server-buffer
qt_config_compile_test(dmabuf_server_buffer
LABEL "Linux dma-buf Buffer Sharing"
LIBRARIES
EGL::EGL
Libdrm::Libdrm
CODE
"
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <drm_fourcc.h>
int main(int argc, char **argv)
{
(void)argc; (void)argv;
/* BEGIN TEST: */
#ifdef EGL_LINUX_DMA_BUF_EXT
return 0;
#else
#error Requires EGL_LINUX_DMA_BUF_EXT
return 1;
#endif
/* END TEST: */
return 0;
}
")
# vulkan-server-buffer
qt_config_compile_test(vulkan_server_buffer
LABEL "Vulkan Buffer Sharing"
CODE
"#define VK_USE_PLATFORM_WAYLAND_KHR 1
#include <vulkan/vulkan.h>
int main(int argc, char **argv)
{
(void)argc; (void)argv;
/* BEGIN TEST: */
VkExportMemoryAllocateInfoKHR exportAllocInfo = {};
exportAllocInfo.sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR;
exportAllocInfo.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR;
return 0;
/* END TEST: */
return 0;
}
")
# egl_1_5-wayland
qt_config_compile_test(egl_1_5_wayland
LABEL "EGL 1.5 with Wayland Platform"
LIBRARIES
EGL::EGL
CODE
"
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <wayland-client.h>
int main(int argc, char **argv)
{
(void)argc; (void)argv;
/* BEGIN TEST: */
eglGetPlatformDisplay(EGL_PLATFORM_WAYLAND_EXT, (struct wl_display *)(nullptr), nullptr);
/* END TEST: */
return 0;
}
")
#### Features
qt_feature("wayland-client" PRIVATE
LABEL "Qt Wayland Client"
CONDITION NOT WIN32 AND Wayland_FOUND AND WaylandScanner_FOUND
)
qt_feature("wayland-server" PRIVATE
LABEL "Qt Wayland Compositor"
CONDITION NOT WIN32 AND Wayland_FOUND AND WaylandScanner_FOUND
)
qt_feature("wayland-egl" PRIVATE
LABEL "EGL"
CONDITION (QT_FEATURE_wayland_client OR QT_FEATURE_wayland_server)
AND QT_FEATURE_opengl AND QT_FEATURE_egl
AND (NOT QNX OR QT_FEATURE_egl_extension_platform_wayland)
)
qt_feature("wayland-brcm" PRIVATE
LABEL "Raspberry Pi"
CONDITION (QT_FEATURE_wayland_client OR QT_FEATURE_wayland_server) AND QT_FEATURE_eglfs_brcm
)
qt_feature("wayland-drm-egl-server-buffer" PRIVATE
LABEL "DRM EGL"
CONDITION (QT_FEATURE_wayland_client OR QT_FEATURE_wayland_server) AND QT_FEATURE_opengl
AND QT_FEATURE_egl AND TEST_drm_egl_server
AND (NOT QNX OR QT_FEATURE_egl_extension_platform_wayland)
)
qt_feature("wayland-libhybris-egl-server-buffer" PRIVATE
LABEL "libhybris EGL"
CONDITION (QT_FEATURE_wayland_client OR QT_FEATURE_wayland_server) AND QT_FEATURE_opengl
AND QT_FEATURE_egl AND TEST_libhybris_egl_server
)
qt_feature("wayland-dmabuf-server-buffer" PRIVATE
LABEL "Linux dma-buf server buffer integration"
CONDITION (QT_FEATURE_wayland_client OR QT_FEATURE_wayland_server) AND QT_FEATURE_opengl
AND QT_FEATURE_egl AND TEST_dmabuf_server_buffer
)
qt_feature("wayland-shm-emulation-server-buffer" PRIVATE
LABEL "Shm emulation server buffer integration"
CONDITION (QT_FEATURE_wayland_client OR QT_FEATURE_wayland_server) AND QT_FEATURE_opengl
)
qt_feature("wayland-vulkan-server-buffer" PRIVATE
LABEL "Vulkan-based server buffer integration"
CONDITION (QT_FEATURE_wayland_client OR QT_FEATURE_wayland_server) AND QT_FEATURE_vulkan
AND QT_FEATURE_opengl AND QT_FEATURE_egl AND TEST_vulkan_server_buffer
)
qt_feature("wayland-datadevice" PRIVATE
CONDITION QT_FEATURE_draganddrop OR QT_FEATURE_clipboard
)
qt_feature("xcomposite-egl" PRIVATE
LABEL "XComposite EGL"
CONDITION (QT_FEATURE_wayland_client OR QT_FEATURE_wayland_server)
AND QT_FEATURE_opengl AND QT_FEATURE_egl AND QT_FEATURE_xlib
AND XComposite_FOUND AND QT_FEATURE_egl_x11
)
qt_feature("xcomposite-glx" PRIVATE
LABEL "XComposite GLX"
CONDITION (QT_FEATURE_wayland_client OR QT_FEATURE_wayland_server)
AND QT_FEATURE_opengl AND NOT QT_FEATURE_opengles2
AND QT_FEATURE_xlib AND XComposite_FOUND
)
qt_configure_add_summary_entry(ARGS "wayland-client")
qt_configure_add_summary_entry(ARGS "wayland-server")
qt_configure_add_summary_section(NAME "Qt Wayland Drivers")
qt_configure_add_summary_entry(ARGS "wayland-egl")
qt_configure_add_summary_entry(ARGS "wayland-brcm")
qt_configure_add_summary_entry(ARGS "wayland-drm-egl-server-buffer")
qt_configure_add_summary_entry(ARGS "wayland-libhybris-egl-server-buffer")
qt_configure_add_summary_entry(ARGS "wayland-dmabuf-server-buffer")
qt_configure_add_summary_entry(ARGS "wayland-shm-emulation-server-buffer")
qt_configure_add_summary_entry(ARGS "wayland-vulkan-server-buffer")
qt_configure_add_summary_entry(ARGS "xcomposite-egl")
qt_configure_add_summary_entry(ARGS "xcomposite-glx")
qt_configure_end_summary_section() # end of "Qt Wayland Drivers" section

View File

@ -58,6 +58,7 @@ qt_internal_add_module(WaylandClient
LIBRARIES
Qt::CorePrivate
Qt::GuiPrivate
Qt::WaylandGlobalPrivate
PUBLIC_LIBRARIES
Qt::Core
Qt::Gui
@ -65,6 +66,7 @@ qt_internal_add_module(WaylandClient
PRIVATE_MODULE_INTERFACE
Qt::CorePrivate
Qt::GuiPrivate
Qt::WaylandGlobalPrivate
)
qt6_generate_wayland_protocol_client_sources(WaylandClient

View File

@ -1,167 +1,15 @@
#### Inputs
#### Libraries
if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
qt_find_package(Wayland PROVIDED_TARGETS Wayland::Client MODULE_NAME waylandclient QMAKE_LIB wayland-client)
endif()
if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
qt_find_package(Wayland PROVIDED_TARGETS Wayland::Cursor MODULE_NAME waylandclient QMAKE_LIB wayland-cursor)
endif()
qt_add_qmake_lib_dependency(wayland-cursor wayland-client)
if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
qt_find_package(Wayland PROVIDED_TARGETS Wayland::Egl MODULE_NAME waylandclient QMAKE_LIB wayland-egl)
endif()
qt_find_package(XComposite PROVIDED_TARGETS PkgConfig::XComposite MODULE_NAME waylandclient QMAKE_LIB xcomposite)
# special case begin
# X11 is not a public dependency of QtGui anymore, so we need to find it manually in a shared build.
# In a static build the dependency is still propagated, so check for the target existence to prevent
# the 'Attempt to promote imported target "X11::X11" to global scope' issue.
if(NOT TARGET X11::X11)
qt_find_package(X11 PROVIDED_TARGETS X11::X11 MODULE_NAME gui QMAKE_LIB xlib)
endif()
# Same for XKB.
if(NOT TARGET XKB::XKB)
qt_find_package(XKB 0.5.0 PROVIDED_TARGETS XKB::XKB MODULE_NAME gui QMAKE_LIB xkbcommon MARK_OPTIONAL)
endif()
# special case end
#### Tests
# drm-egl-server
qt_config_compile_test(drm_egl_server
LABEL "DRM EGL Server"
LIBRARIES
EGL::EGL
CODE
"
#include <EGL/egl.h>
#include <EGL/eglext.h>
int main(int argc, char **argv)
{
(void)argc; (void)argv;
/* BEGIN TEST: */
#ifdef EGL_MESA_drm_image
return 0;
#else
#error Requires EGL_MESA_drm_image to be defined
return 1;
#endif
/* END TEST: */
return 0;
}
")
# libhybris-egl-server
qt_config_compile_test(libhybris_egl_server
LABEL "libhybris EGL Server"
LIBRARIES
EGL::EGL
CODE
"
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <hybris/eglplatformcommon/hybris_nativebufferext.h>
int main(int argc, char **argv)
{
(void)argc; (void)argv;
/* BEGIN TEST: */
#ifdef EGL_HYBRIS_native_buffer
return 0;
#else
#error Requires EGL_HYBRIS_native_buffer to be defined
return 1;
#endif
/* END TEST: */
return 0;
}
")
# dmabuf-server-buffer
qt_config_compile_test(dmabuf_server_buffer
LABEL "Linux dma-buf Buffer Sharing"
LIBRARIES
EGL::EGL
Libdrm::Libdrm
CODE
"
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <drm_fourcc.h>
int main(int argc, char **argv)
{
(void)argc; (void)argv;
/* BEGIN TEST: */
#ifdef EGL_LINUX_DMA_BUF_EXT
return 0;
#else
#error Requires EGL_LINUX_DMA_BUF_EXT
return 1;
#endif
/* END TEST: */
return 0;
}
")
# vulkan-server-buffer
qt_config_compile_test(vulkan_server_buffer
LABEL "Vulkan Buffer Sharing"
CODE
"#define VK_USE_PLATFORM_WAYLAND_KHR 1
#include <vulkan/vulkan.h>
int main(int argc, char **argv)
{
(void)argc; (void)argv;
/* BEGIN TEST: */
VkExportMemoryAllocateInfoKHR exportAllocInfo = {};
exportAllocInfo.sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR;
exportAllocInfo.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR;
return 0;
/* END TEST: */
return 0;
}
")
# egl_1_5-wayland
qt_config_compile_test(egl_1_5_wayland
LABEL "EGL 1.5 with Wayland Platform"
LIBRARIES
EGL::EGL
CODE
"
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <wayland-client.h>
int main(int argc, char **argv)
{
(void)argc; (void)argv;
/* BEGIN TEST: */
eglGetPlatformDisplay(EGL_PLATFORM_WAYLAND_EXT, (struct wl_display *)(nullptr), nullptr);
/* END TEST: */
return 0;
}
")
#### Features
qt_feature("wayland-client" PRIVATE
LABEL "Qt Wayland Client"
CONDITION NOT WIN32 AND Wayland_FOUND AND Wayland_FOUND AND WaylandScanner_FOUND
)
qt_feature("wayland-datadevice" PRIVATE
CONDITION QT_FEATURE_draganddrop OR QT_FEATURE_clipboard
)
qt_feature("wayland-client-primary-selection" PRIVATE
LABEL "primary-selection clipboard"
CONDITION QT_FEATURE_clipboard
@ -186,53 +34,6 @@ qt_feature("egl-extension-platform-wayland" PRIVATE
LABEL "EGL wayland platform extension"
CONDITION QT_FEATURE_wayland_client AND QT_FEATURE_opengl AND QT_FEATURE_egl AND TEST_egl_1_5_wayland
)
qt_feature("wayland-egl" PRIVATE
LABEL "EGL"
CONDITION QT_FEATURE_wayland_client AND QT_FEATURE_opengl AND QT_FEATURE_egl AND Wayland_FOUND AND ( NOT QNX OR QT_FEATURE_egl_extension_platform_wayland )
)
qt_feature("wayland-brcm" PRIVATE
LABEL "Raspberry Pi"
CONDITION QT_FEATURE_wayland_client AND QT_FEATURE_eglfs_brcm
)
qt_feature("xcomposite-egl" PRIVATE
LABEL "XComposite EGL"
CONDITION QT_FEATURE_wayland_client AND QT_FEATURE_opengl AND QT_FEATURE_egl AND QT_FEATURE_xlib AND XComposite_FOUND AND QT_FEATURE_egl_x11
)
qt_feature("xcomposite-glx" PRIVATE
LABEL "XComposite GLX"
CONDITION QT_FEATURE_wayland_client AND QT_FEATURE_opengl AND NOT QT_FEATURE_opengles2 AND QT_FEATURE_xlib AND XComposite_FOUND
)
qt_feature("wayland-drm-egl-server-buffer" PRIVATE
LABEL "DRM EGL"
CONDITION QT_FEATURE_wayland_client AND QT_FEATURE_opengl AND QT_FEATURE_egl AND TEST_drm_egl_server AND ( NOT QNX OR QT_FEATURE_egl_extension_platform_wayland )
)
qt_feature("wayland-libhybris-egl-server-buffer" PRIVATE
LABEL "libhybris EGL"
CONDITION QT_FEATURE_wayland_client AND QT_FEATURE_opengl AND QT_FEATURE_egl AND TEST_libhybris_egl_server
)
qt_feature("wayland-dmabuf-server-buffer" PRIVATE
LABEL "Linux dma-buf server buffer integration"
CONDITION QT_FEATURE_wayland_client AND QT_FEATURE_opengl AND QT_FEATURE_egl AND TEST_dmabuf_server_buffer
)
qt_feature("wayland-vulkan-server-buffer" PRIVATE
LABEL "Vulkan-based server buffer integration"
CONDITION QT_FEATURE_wayland_client AND QT_FEATURE_vulkan AND QT_FEATURE_opengl AND QT_FEATURE_egl AND TEST_vulkan_server_buffer
)
qt_feature("wayland-shm-emulation-server-buffer" PRIVATE
LABEL "Shm emulation server buffer integration"
CONDITION QT_FEATURE_wayland_client AND QT_FEATURE_opengl
)
qt_configure_add_summary_section(NAME "Qt Wayland Drivers")
qt_configure_add_summary_entry(ARGS "wayland-egl")
qt_configure_add_summary_entry(ARGS "wayland-brcm")
qt_configure_add_summary_entry(ARGS "xcomposite-egl")
qt_configure_add_summary_entry(ARGS "xcomposite-glx")
qt_configure_add_summary_entry(ARGS "wayland-drm-egl-server-buffer")
qt_configure_add_summary_entry(ARGS "wayland-libhybris-egl-server-buffer")
qt_configure_add_summary_entry(ARGS "wayland-dmabuf-server-buffer")
qt_configure_add_summary_entry(ARGS "wayland-vulkan-server-buffer")
qt_configure_add_summary_entry(ARGS "wayland-shm-emulation-server-buffer")
qt_configure_end_summary_section() # end of "Qt Wayland Drivers" section
qt_configure_add_summary_section(NAME "Qt Wayland Client Shell Integrations")
qt_configure_add_summary_entry(ARGS "wayland-client-xdg-shell")
qt_configure_add_summary_entry(ARGS "wayland-client-xdg-shell-v5")
@ -240,4 +41,3 @@ qt_configure_add_summary_entry(ARGS "wayland-client-xdg-shell-v6")
qt_configure_add_summary_entry(ARGS "wayland-client-ivi-shell")
qt_configure_add_summary_entry(ARGS "wayland-client-wl-shell")
qt_configure_end_summary_section() # end of "Qt Wayland Client Shell Integrations" section
qt_configure_add_summary_entry(ARGS "wayland-client")

View File

@ -0,0 +1,9 @@
The WaylandGlobalPrivate module is a module that contains configure
features, shared by the modules of the qtwayland repository.
The actual definition of this module is in src/CMakeLists.txt,
because we need to have the qt_find_package calls in a directory scope
above src/client and src/compositor.
This file here mostly exists to make the otherwise empty src/global
directory known to git.

View File

@ -51,9 +51,9 @@
// We mean it.
//
#include <QtWaylandGlobal/private/qtwaylandglobal-config_p.h>
#include <QtWaylandClient/qtwaylandclientglobal.h>
#include <QtGui/private/qtguiglobal_p.h>
#include <QtWaylandClient/private/qtwaylandclient-config_p.h>
#endif //QWAYLANDCLIENTGLOBAL_P_H