Browse Source

Add USE_SDL3 build option

This does not actually add SDL3 support but adds enough
CMake stuff to make the following succeed:

```bash
cmake -S. -Bbuild-sdl3 -DUSE_SDL3=ON -DDEVILUTIONX_SYSTEM_SDL3=OFF -DDEVILUTIONX_STATIC_SDL3=ON -DNOSOUND=ON
```

`NOSOUND` is needed because `SDL_audiolib` does not support SDL3.
pull/8198/head^2
Gleb Mazovetskiy 5 months ago
parent
commit
c0975bfa8b
  1. 22
      3rdParty/SDL3/CMakeLists.txt
  2. 53
      3rdParty/SDL3_image/CMakeLists.txt
  3. 33
      CMake/Dependencies.cmake
  4. 2
      CMake/VcPkgManifestFeatures.cmake
  5. 5
      CMakeLists.txt
  6. 13
      Source/CMakeLists.txt

22
3rdParty/SDL3/CMakeLists.txt vendored

@ -0,0 +1,22 @@
if(DEVILUTIONX_STATIC_SDL3)
set(BUILD_SHARED_LIBS OFF)
set(SDL_SHARED OFF)
set(SDL_STATIC ON)
if(PIE)
set(SDL_STATIC_PIC ON)
endif()
else()
set(BUILD_SHARED_LIBS ON)
set(SDL_SHARED ON)
set(SDL_STATIC OFF)
endif()
set(SDL_TEST_ENABLED_BY_DEFAULT OFF)
include(functions/FetchContent_ExcludeFromAll_backport)
include(FetchContent)
FetchContent_Declare(SDL3
URL https://github.com/libsdl-org/SDL/releases/download/release-3.2.24/SDL3-3.2.24.tar.gz
URL_HASH SHA256=81cc0fc17e5bf2c1754eeca9af9c47a76789ac5efdd165b3b91cbbe4b90bfb76
)
FetchContent_MakeAvailable_ExcludeFromAll(SDL3)

53
3rdParty/SDL3_image/CMakeLists.txt vendored

@ -0,0 +1,53 @@
include(functions/dependency_options)
if(NOT DEFINED DEVILUTIONX_SYSTEM_LIBPNG)
find_package(PNG QUIET)
if(PNG_FOUND)
message("-- Found png ${PNG_VERSION_STRING}")
else()
message("-- Suitable system png package not found, will use png from source")
set(DEVILUTIONX_SYSTEM_LIBPNG OFF)
endif()
endif()
dependency_options("libpng" DEVILUTIONX_SYSTEM_LIBPNG ON DEVILUTIONX_STATIC_LIBPNG)
if(DEVILUTIONX_SYSTEM_LIBPNG)
find_package(PNG REQUIRED)
else()
add_subdirectory(../libpng libpng)
endif()
include(functions/FetchContent_ExcludeFromAll_backport)
include(FetchContent)
if(DEVILUTIONX_STATIC_SDL_IMAGE)
set(BUILD_SHARED_LIBS OFF)
else()
set(BUILD_SHARED_LIBS ON)
endif()
set(SDLIMAGE_AVIF OFF)
set(SDLIMAGE_BMP OFF)
set(SDLIMAGE_GIF OFF)
set(SDLIMAGE_JPG OFF)
set(SDLIMAGE_JXL OFF)
set(SDLIMAGE_LBM OFF)
set(SDLIMAGE_PCX OFF)
set(SDLIMAGE_PNG ON)
set(SDLIMAGE_PNM OFF)
set(SDLIMAGE_QOI OFF)
set(SDLIMAGE_SVG OFF)
set(SDLIMAGE_TGA OFF)
set(SDLIMAGE_TIF OFF)
set(SDLIMAGE_WEBP OFF)
set(SDLIMAGE_XCF OFF)
set(SDLIMAGE_XPM OFF)
set(SDLIMAGE_XV OFF)
set(SDLIMAGE_AVIF_SAVE OFF)
set(SDLIMAGE_JPG_SAVE OFF)
set(SDLIMAGE_PNG_SAVE ON)
FetchContent_Declare_ExcludeFromAll(SDL_image
URL https://github.com/libsdl-org/SDL_image/releases/download/release-3.2.4/SDL3_image-3.2.4.tar.gz
URL_HASH SHA256=a725bd6d04261fdda0dd8d950659e1dc15a8065d025275ef460d32ae7dcfc182
)
FetchContent_MakeAvailable_ExcludeFromAll(SDL_image)

33
CMake/Dependencies.cmake

@ -63,6 +63,13 @@ if(EMSCRIPTEN)
elseif(USE_SDL1)
find_package(SDL 1.2.10 REQUIRED)
include_directories(${SDL_INCLUDE_DIR})
elseif(USE_SDL3)
dependency_options("SDL3" DEVILUTIONX_SYSTEM_SDL3 ON DEVILUTIONX_STATIC_SDL3)
if(DEVILUTIONX_SYSTEM_SDL3)
find_package(SDL3 3.2.24 REQUIRED CONFIG REQUIRED COMPONENTS SDL3)
else()
add_subdirectory(3rdParty/SDL3)
endif()
else()
dependency_options("SDL2" DEVILUTIONX_SYSTEM_SDL2 ON DEVILUTIONX_STATIC_SDL2)
if(DEVILUTIONX_SYSTEM_SDL2)
@ -103,6 +110,9 @@ add_library(DevilutionX::SDL INTERFACE IMPORTED GLOBAL)
if(USE_SDL1)
target_link_libraries(DevilutionX::SDL INTERFACE ${SDL_LIBRARY})
target_compile_definitions(DevilutionX::SDL INTERFACE USE_SDL1)
elseif(USE_SDL3)
target_link_libraries(DevilutionX::SDL INTERFACE SDL3::SDL3)
target_compile_definitions(DevilutionX::SDL INTERFACE USE_SDL3)
else()
if(TARGET SDL2::SDL2 AND NOT (DEVILUTIONX_STATIC_SDL2 AND TARGET SDL2::SDL2-static))
target_link_libraries(DevilutionX::SDL INTERFACE SDL2::SDL2)
@ -126,7 +136,28 @@ macro(_find_SDL_image QUIET_OR_REQUIRED)
endif()
endmacro()
if(NOT USE_SDL1)
if(USE_SDL1)
# No need for SDL_image.
elseif(USE_SDL3)
if(NOT DEFINED DEVILUTIONX_SYSTEM_SDL_IMAGE)
find_package(SDL3_image QUIET CONFIG)
if(SDL3_image_FOUND)
message("-- Found SDL3_image")
else()
message("-- Suitable system SDL3_image package not found, will use SDL3_image from source")
set(DEVILUTIONX_SYSTEM_SDL_IMAGE OFF)
endif()
endif()
dependency_options("SDL3_image" DEVILUTIONX_SYSTEM_SDL_IMAGE ON DEVILUTIONX_STATIC_SDL_IMAGE)
if(DEVILUTIONX_SYSTEM_SDL_IMAGE)
find_package(SDL3_image REQUIRED CONFIG)
else()
# Must be the same, see:
# https://github.com/libsdl-org/SDL_image/blob/11154afb7855293159588b245b446a4ef09e574f/CMakeLists.txt#L225-L233
set(DEVILUTIONX_STATIC_SDL_IMAGE ${DEVILUTIONX_STATIC_SDL3})
add_subdirectory(3rdParty/SDL3_image)
endif()
else()
if(EMSCRIPTEN)
emscripten_system_library("SDL_image" SDL2::SDL2_image USE_SDL_IMAGE=2 "SDL2_IMAGE_FORMATS='[\"png\"]'")
else()

2
CMake/VcPkgManifestFeatures.cmake

@ -1,6 +1,8 @@
# See https://vcpkg.readthedocs.io/en/latest/users/manifests/
if(USE_SDL1)
list(APPEND VCPKG_MANIFEST_FEATURES "sdl1")
elseif(USE_SDL3)
list(APPEND VCPKG_MANIFEST_FEATURES "sdl3")
else()
list(APPEND VCPKG_MANIFEST_FEATURES "sdl2")
endif()

5
CMakeLists.txt

@ -31,6 +31,7 @@ include(functions/genex)
# Options required by `VcPkgManifestFeatures`, which must be included before the `project` call.
option(USE_SDL1 "Use SDL1.2 instead of SDL2" OFF)
option(USE_SDL3 "Use SDL3 instead of SDL2" OFF)
option(NONET "Disable network support" OFF)
cmake_dependent_option(PACKET_ENCRYPTION "Encrypt network packets" ON "NOT NONET" OFF)
# The gettext[tools] package takes a very long time to install
@ -105,6 +106,10 @@ option(WIN_NSIS "Generate an NSIS installer" OFF)
cmake_dependent_option(DISABLE_TCP "Disable TCP multiplayer option" OFF "NOT NONET" ON)
cmake_dependent_option(DISABLE_ZERO_TIER "Disable ZeroTier multiplayer option" OFF "NOT NONET" ON)
if(USE_SDL1 AND USE_SDL3)
message(FATAL_ERROR "USE_SDL1 and USE_SDL3 cannot be set at the same time")
endif()
# Graphics options
if(NOT USE_SDL1)
set(DEVILUTIONX_DISPLAY_TEXTURE_FORMAT "SDL_PIXELFORMAT_RGB888" CACHE STRING "Texture format for DevilutionX textures when using the GPU renderer")

13
Source/CMakeLists.txt

@ -869,10 +869,15 @@ if(DEVILUTIONX_SCREENSHOT_FORMAT STREQUAL DEVILUTIONX_SCREENSHOT_FORMAT_PNG)
target_link_dependencies(libdevilutionx_surface_to_png
PUBLIC
DevilutionX::SDL
SDL2::SDL2_image
tl
libdevilutionx_surface
)
if(USE_SDL3)
target_link_dependencies(libdevilutionx_surface_to_png PUBLIC SDL3_image::SDL3_image)
target_compile_definitions(libdevilutionx_surface_to_png INTERFACE USE_SDL3)
else()
target_link_dependencies(libdevilutionx_surface_to_png PUBLIC SDL2::SDL2_image)
endif()
endif()
add_devilutionx_object_library(libdevilutionx ${libdevilutionx_SRCS})
@ -973,7 +978,11 @@ if(SCREEN_READER_INTEGRATION)
endif()
endif()
if(NOT USE_SDL1)
if(USE_SDL1)
# No need for SDL_image
elseif(USE_SDL3)
target_link_libraries(libdevilutionx PUBLIC SDL3_image::SDL3_image)
else()
target_link_libraries(libdevilutionx PUBLIC SDL2::SDL2_image)
endif()

Loading…
Cancel
Save