- Huge refactor on Wayland loading to support retrieval of Protocol headers - Setup EGL to create surfaces for Wayland windows
115 lines
4.4 KiB
CMake
115 lines
4.4 KiB
CMake
# ======================================================================================================================
|
|
# 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://www.gnu.org/licenses/>.
|
|
# ======================================================================================================================
|
|
|
|
# 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")
|
|
|
|
add_custom_command(
|
|
TARGET fennec-dependencies PRE_BUILD
|
|
COMMAND ${_SCANNER}
|
|
ARGS client-header "${_XML}" "${_WAYLAND_PROT_H_CODE}"
|
|
)
|
|
|
|
fennec_add_sources(${_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)
|
|
|
|
# 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})
|
|
|
|
# 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/fwd.h
|
|
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/display.h source/platform/linux/wayland/display.cpp
|
|
include/fennec/platform/linux/wayland/window.h source/platform/linux/wayland/window.cpp
|
|
)
|
|
|
|
fennec_add_definitions(
|
|
FENNEC_HAS_WAYLAND=1
|
|
FENNEC_LIB_WAYLAND="${WAYLAND_CLIENT_LIBRARY}"
|
|
FENNEC_LIB_WAYLAND_EGL="${WAYLAND_EGL_LIBRARY}"
|
|
)
|
|
endif()
|
|
endmacro() |