# ====================================================================================================================== # 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 function(fennec_wayland_get_protocol) set( _OPTIONS_ARGS ) set( _ONE_VALUE_ARGS ) set( _MULTI_VALUE_ARGS NAMES PATHS ) cmake_parse_arguments(_FINDPROTOCOLS "${_OPTIONS_ARGS}" "${_ONE_VALUE_ARGS}" "${_MULTI_VALUE_ARGS}" ${ARGN} ) find_file(_FINDPROTOCOLS_TEMP NAMES ${_FINDPROTOCOLS_NAMES} PATHS ${_FINDPROTOCOLS_PATHS}) file(COPY ${_FINDPROTOCOLS_TEMP} DESTINATION ${WAYLAND_PROTOCOLS_DIR}) endfunction() 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 fennec_wayland_get_protocol(NAMES "wayland.xml" PATHS "/usr/share/wayland" "/usr/share/wayland-protocols") fennec_wayland_get_protocol(NAMES "xdg-shell.xml" PATHS "/usr/share/wayland/stable/xdg-shell" "/usr/share/wayland-protocols/stable/xdg-shell") # 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}" VK_USE_PLATFORM_WAYLAND_KHR=1 ) # find libdecor find_path( LIBDECOR_INCLUDE_DIR PATH_SUFFIXES libdecor libdecor-0 NAMES libdecor.h libdecor.h ) find_library( LIBDECOR_LIBRARY PATH_SUFFIXES libdecor libdecor-0 NAMES libdecor.so libdecor-0.so ) if(LIBDECOR_INCLUDE_DIR AND LIBDECOR_LIBRARY) message(STATUS "Found libdecor: ${LIBDECOR_LIBRARY}") fennec_add_definitions( FENNEC_HAS_LIBDECOR=1 FENNEC_LIB_LIBDECOR="${LIBDECOR_LIBRARY}" ) include_directories( ${LIBDECOR_INCLUDE_DIR} ) fennec_add_sources( include/fennec/platform/linux/wayland/libdecor/sym.h include/fennec/platform/linux/wayland/libdecor/libdecor.h include/fennec/platform/linux/wayland/libdecor/loader.h source/platform/linux/wayland/libdecor/loader.cpp ) endif() endif() endmacro()