# ====================================================================================================================== # fennec, a free and open source game engine # Copyright © 2025 Medusa Slockbower # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # ====================================================================================================================== # https://gist.github.com/mariobadr/acc3c8adf4b4e722705be38c3deac59a # this script finds libwayland and dependencies # some of this code is based on SDL3's use of wayland-scanner macro(fennec_wayland_get_header _SCANNER _XML _FILE) set(_WAYLAND_PROT_H_CODE "${WAYLAND_HEADERS_DIR}/${_FILE}-client-protocols.h") set(_WAYLAND_PROT_C_CODE "${WAYLAND_SOURCES_DIR}/${_FILE}-client.c") execute_process( COMMAND ${_SCANNER} client-header "${_XML}" "${_WAYLAND_PROT_H_CODE}" ) execute_process( COMMAND ${_SCANNER} private-code "${_XML}" "${_WAYLAND_PROT_C_CODE}" ) fennec_add_sources(${_WAYLAND_PROT_C_CODE} ${_WAYLAND_PROT_H_CODE}) endmacro() macro(fennec_check_wayland) set(WAYLAND_CLIENT_FOUND 0) find_path( WAYLAND_CLIENT_INCLUDE_DIR NAMES wayland-client.h ) find_library( WAYLAND_CLIENT_LIBRARY NAMES wayland-client libwayland-client ) find_program(WAYLAND_SCANNER NAMES wayland-scanner) # EGL is required find_path( WAYLAND_EGL_INCLUDE_DIR NAMES wayland-egl.h ) find_library( WAYLAND_EGL_LIBRARY NAMES wayland-egl libwayland-egl ) if( (WAYLAND_CLIENT_INCLUDE_DIR AND WAYLAND_CLIENT_LIBRARY AND WAYLAND_SCANNER) AND (WAYLAND_EGL_INCLUDE_DIR AND WAYLAND_EGL_LIBRARY)) message(STATUS "Found Wayland: ${WAYLAND_CLIENT_LIBRARY}") set(WAYLAND_PROTOCOLS_DIR ${FENNEC_SOURCE_DIR}/include/fennec/platform/linux/wayland/lib/protocols) set(WAYLAND_HEADERS_DIR ${FENNEC_SOURCE_DIR}/include/fennec/platform/linux/wayland/lib/headers) set(WAYLAND_SOURCES_DIR ${FENNEC_SOURCE_DIR}/source/platform/linux/wayland/lib/sources) # Search for base protocol xml find_file(WAYLAND_PROTOCOL NAMES wayland.xml PATHS /usr/share/wayland /usr/share/wayland-protocols) file(COPY ${WAYLAND_PROTOCOL} DESTINATION ${WAYLAND_PROTOCOLS_DIR}) # search for xdg protocols find_file(XDG_SHELL_PROTOCOL NAMES xdg-shell.xml PATHS /usr/share/wayland-protocols/stable/xdg-shell) file(COPY ${XDG_SHELL_PROTOCOL} DESTINATION ${WAYLAND_PROTOCOLS_DIR}) # include sub-dependencies include("${FENNEC_SOURCE_DIR}/cmake/xkb.cmake") fennec_check_xkb() # generate protocols, based on SDL3 file(GLOB WAYLAND_PROTOCOLS_XML RELATIVE "${WAYLAND_PROTOCOLS_DIR}" "${WAYLAND_PROTOCOLS_DIR}/*.xml") foreach(_XML IN LISTS WAYLAND_PROTOCOLS_XML) get_filename_component(_FILE ${_XML} NAME_WLE) fennec_wayland_get_header("${WAYLAND_SCANNER}" "${WAYLAND_PROTOCOLS_DIR}/${_XML}" "${_FILE}") endforeach() # Add sources and libraries get_filename_component( WAYLAND_CLIENT_LIBRARY ${WAYLAND_CLIENT_LIBRARY} NAME ) get_filename_component( WAYLAND_EGL_LIBRARY ${WAYLAND_EGL_LIBRARY} NAME ) set(WAYLAND_CLIENT_FOUND 1) set(WAYLAND_EGL_FOUND 1) set(FENNEC_GRAPHICS_WANT_EGL 1) fennec_add_sources( # Dynamic Library Files include/fennec/platform/linux/wayland/lib/sym.h include/fennec/platform/linux/wayland/lib/wayland.h include/fennec/platform/linux/wayland/lib/loader.h source/platform/linux/wayland/lib/loader.cpp # Fennec Files include/fennec/platform/linux/wayland/fwd.h include/fennec/platform/linux/wayland/server.h source/platform/linux/wayland/server.cpp include/fennec/platform/linux/wayland/window.h source/platform/linux/wayland/window.cpp # EGL include/fennec/platform/linux/wayland/egl/context.h source/platform/linux/wayland/egl/context.cpp include/fennec/platform/linux/wayland/egl/surface.h source/platform/linux/wayland/egl/surface.cpp ) fennec_add_definitions( FENNEC_HAS_WAYLAND=1 FENNEC_LIB_WAYLAND="${WAYLAND_CLIENT_LIBRARY}" FENNEC_LIB_WAYLAND_EGL="${WAYLAND_EGL_LIBRARY}" ) endif() endmacro()