1392 lines
58 KiB
CMake
1392 lines
58 KiB
CMake
cmake_minimum_required(VERSION 3.16...4.0)
|
|
|
|
if(NOT DEFINED CMAKE_BUILD_TYPE)
|
|
set(cmake_build_type_undefined 1)
|
|
endif()
|
|
|
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
|
|
|
|
# See docs/release_checklist.md
|
|
set(MAJOR_VERSION 3)
|
|
set(MINOR_VERSION 4)
|
|
set(MICRO_VERSION 6)
|
|
set(SDL_REQUIRED_VERSION 3.4.0)
|
|
|
|
project(SDL3_image
|
|
LANGUAGES C
|
|
VERSION "${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}"
|
|
)
|
|
|
|
include("${CMAKE_CURRENT_LIST_DIR}/cmake/GetGitRevisionDescription.cmake")
|
|
include("${CMAKE_CURRENT_LIST_DIR}/cmake/PrivateSdlFunctions.cmake")
|
|
include("${CMAKE_CURRENT_LIST_DIR}/cmake/sdlcpu.cmake")
|
|
include("${CMAKE_CURRENT_LIST_DIR}/cmake/sdlplatform.cmake")
|
|
include("${CMAKE_CURRENT_LIST_DIR}/cmake/sdlmanpages.cmake")
|
|
sdl_calculate_derived_version_variables(${MAJOR_VERSION} ${MINOR_VERSION} ${MICRO_VERSION})
|
|
|
|
message(STATUS "Configuring ${PROJECT_NAME} ${PROJECT_VERSION}")
|
|
|
|
if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
|
|
set(SDLIMAGE_ROOTPROJECT ON)
|
|
else()
|
|
set(SDLIMAGE_ROOTPROJECT OFF)
|
|
endif()
|
|
|
|
# By default, configure in RelWithDebInfo configuration
|
|
if(SDLIMAGE_ROOTPROJECT)
|
|
get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
|
if(is_multi_config)
|
|
# The first item in CMAKE_CONFIGURATION_TYPES is the default configuration
|
|
if(DEFINED CMAKE_CONFIGURATION_TYPES AND "RelWithDebInfo" IN_LIST CMAKE_CONFIGURATION_TYPES)
|
|
list(REMOVE_ITEM CMAKE_CONFIGURATION_TYPES "RelWithDebInfo")
|
|
list(INSERT CMAKE_CONFIGURATION_TYPES 0 "RelWithDebInfo")
|
|
set(CMAKE_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}" CACHE STRING "CMake configuration types" FORCE)
|
|
endif()
|
|
else()
|
|
if(cmake_build_type_undefined)
|
|
set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "CMake build type" FORCE)
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
set(SDLIMAGE_SAMPLES_DEFAULT ${SDLIMAGE_ROOTPROJECT})
|
|
if(ANDROID)
|
|
set(SDLIMAGE_SAMPLES_DEFAULT OFF)
|
|
endif()
|
|
|
|
# Assume MSVC projects don't have a package manager and need vendored dependencies (by default).
|
|
# Most other platforms have some kind of package manager.
|
|
if(ANDROID OR MSVC)
|
|
set(vendored_default ON)
|
|
else()
|
|
set(vendored_default OFF)
|
|
endif()
|
|
|
|
set(sdlimage_install_enableable ON)
|
|
if((TARGET SDL3-shared OR TARGET SDL3-static) AND SDL_DISABLE_INSTALL)
|
|
# Cannot install SDL3_image when SDL3 is built in same built, and is not installed.
|
|
set(sdlimage_install_enableable OFF)
|
|
endif()
|
|
|
|
if(NOT DEFINED CMAKE_FIND_PACKAGE_PREFER_CONFIG)
|
|
set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
|
|
endif()
|
|
|
|
include(CMakeDependentOption)
|
|
include(CMakePackageConfigHelpers)
|
|
include(GNUInstallDirs)
|
|
|
|
set(PLATFORM_SUPPORTS_SHARED ON)
|
|
if(EMSCRIPTEN OR VITA OR PSP OR PS2 OR N3DS OR RISCOS)
|
|
set(PLATFORM_SUPPORTS_SHARED OFF)
|
|
endif()
|
|
|
|
option(CMAKE_POSITION_INDEPENDENT_CODE "Build static libraries with -fPIC" ${PLATFORM_SUPPORTS_SHARED})
|
|
cmake_dependent_option(BUILD_SHARED_LIBS "Build the library as a shared library" ON PLATFORM_SUPPORTS_SHARED OFF)
|
|
|
|
cmake_dependent_option(SDLIMAGE_INSTALL "Enable SDL3_image install target" ${SDLIMAGE_ROOTPROJECT} "${sdlimage_install_enableable}" OFF)
|
|
cmake_dependent_option(SDLIMAGE_INSTALL_CPACK "Create binary SDL3_image archive using CPack" ${SDLIMAGE_ROOTPROJECT} "SDLIMAGE_INSTALL" OFF)
|
|
cmake_dependent_option(SDLIMAGE_INSTALL_MAN "Install man pages for SDL3_image" OFF "SDLIMAGE_INSTALL" OFF)
|
|
cmake_dependent_option(SDLIMAGE_DEPS_SHARED "Load dependencies dynamically" ON PLATFORM_SUPPORTS_SHARED OFF)
|
|
cmake_dependent_option(SDLIMAGE_RELOCATABLE "Create relocatable SDL_image package" "${MSVC}" SDLIMAGE_INSTALL OFF)
|
|
option(SDLIMAGE_VENDORED "Use vendored third-party libraries" ${vendored_default})
|
|
option(SDLIMAGE_WERROR "Treat warnings as errors" OFF)
|
|
|
|
option(SDLIMAGE_STRICT "Fail when a dependency could not be found" OFF)
|
|
set(required "")
|
|
set(fatal_error "STATUS")
|
|
if(SDLIMAGE_STRICT)
|
|
set(required "REQUIRED")
|
|
set(fatal_error "FATAL_ERROR")
|
|
endif()
|
|
|
|
option(SDLIMAGE_SAMPLES "Build the SDL3_image sample program(s)" ${SDLIMAGE_SAMPLES_DEFAULT})
|
|
cmake_dependent_option(SDLIMAGE_SAMPLES_INSTALL "Install the SDL3_image sample program(s)" OFF "SDLIMAGE_SAMPLES;SDLIMAGE_INSTALL" OFF)
|
|
|
|
option(SDLIMAGE_TESTS "Build unit tests?" OFF)
|
|
option(SDLIMAGE_TESTS_INSTALL "Install unit tests?" OFF)
|
|
|
|
option(SDLIMAGE_BACKEND_STB "Use stb_image for loading JPEG files" ON)
|
|
cmake_dependent_option(SDLIMAGE_BACKEND_WIC "Add WIC backend (Windows Imaging Component)" OFF WIN32 OFF)
|
|
cmake_dependent_option(SDLIMAGE_BACKEND_IMAGEIO "Use native Mac OS X frameworks for loading images" ON APPLE OFF)
|
|
|
|
option(SDLIMAGE_ANI "Support loading ANI animations" ON)
|
|
option(SDLIMAGE_AVIF "Support loading AVIF images" ON)
|
|
option(SDLIMAGE_BMP "Support loading BMP images" ON)
|
|
option(SDLIMAGE_GIF "Support loading GIF images" ON)
|
|
option(SDLIMAGE_JPG "Support loading JPEG images" ON)
|
|
option(SDLIMAGE_JXL "Support loading JXL images" OFF)
|
|
option(SDLIMAGE_LBM "Support loading LBM images" ON)
|
|
option(SDLIMAGE_PCX "Support loading PCX images" ON)
|
|
option(SDLIMAGE_PNG "Support loading PNG images" ON)
|
|
option(SDLIMAGE_PNM "Support loading PNM images" ON)
|
|
option(SDLIMAGE_QOI "Support loading QOI images" ON)
|
|
option(SDLIMAGE_SVG "Support loading SVG images" ON)
|
|
option(SDLIMAGE_TGA "Support loading TGA images" ON)
|
|
option(SDLIMAGE_TIF "Support loading TIFF images" ON)
|
|
option(SDLIMAGE_WEBP "Support loading WEBP images" ON)
|
|
option(SDLIMAGE_XCF "Support loading XCF images" ON)
|
|
option(SDLIMAGE_XPM "Support loading XPM images" ON)
|
|
option(SDLIMAGE_XV "Support loading XV images" ON)
|
|
cmake_dependent_option(SDLIMAGE_PNG_LIBPNG "Support loading PNGs using libpng (useful for APNGs)" ON SDLIMAGE_PNG OFF)
|
|
|
|
cmake_dependent_option(SDLIMAGE_ANI_SAVE "Add ANI save support" ON SDLIMAGE_ANI OFF)
|
|
cmake_dependent_option(SDLIMAGE_AVIF_SAVE "Add AVIF save support" ON SDLIMAGE_AVIF OFF)
|
|
cmake_dependent_option(SDLIMAGE_BMP_SAVE "Add BMP save support" ON SDLIMAGE_BMP OFF)
|
|
cmake_dependent_option(SDLIMAGE_GIF_SAVE "Add GIF save support" ON SDLIMAGE_GIF OFF)
|
|
cmake_dependent_option(SDLIMAGE_JPG_SAVE "Add JPEG save support" ON SDLIMAGE_JPG OFF)
|
|
cmake_dependent_option(SDLIMAGE_PNG_SAVE "Add PNG save support" ON SDLIMAGE_PNG OFF)
|
|
cmake_dependent_option(SDLIMAGE_TGA_SAVE "Add TGA save support" ON SDLIMAGE_TGA OFF)
|
|
cmake_dependent_option(SDLIMAGE_WEBP_SAVE "Add WEBP save support" ON SDLIMAGE_WEBP OFF)
|
|
|
|
set(LIBAVIF_MINIMUM_VERSION "1.0")
|
|
if(SDLIMAGE_VENDORED AND SDLIMAGE_AVIF)
|
|
set(SDLIMAGE_AVIF_VENDORED ON)
|
|
else()
|
|
set(SDLIMAGE_AVIF_VENDORED OFF)
|
|
endif()
|
|
cmake_dependent_option(SDLIMAGE_AVIF_SHARED "Dynamically load AVIF support (requires shared libavif)"
|
|
${SDLIMAGE_DEPS_SHARED} SDLIMAGE_AVIF ON)
|
|
|
|
if(SDLIMAGE_AVIF_VENDORED)
|
|
set(SDLIMAGE_DAV1D ON)
|
|
set(SDLIMAGE_DAV1D_VENDORED ON)
|
|
set(SDLIMAGE_AOM ON)
|
|
set(SDLIMAGE_AOM_VENDORED ON)
|
|
else()
|
|
set(SDLIMAGE_DAV1D OFF)
|
|
set(SDLIMAGE_DAV1D_VENDORED OFF)
|
|
set(SDLIMAGE_AOM OFF)
|
|
set(SDLIMAGE_AOM_VENDORED OFF)
|
|
endif()
|
|
if(SDLIMAGE_AVIF_SHARED)
|
|
set(SDLIMAGE_DAV1D_SHARED ON)
|
|
set(SDLIMAGE_AOM_SHARED ON)
|
|
else()
|
|
set(SDLIMAGE_DAV1D_SHARED OFF)
|
|
set(SDLIMAGE_AOM_SHARED OFF)
|
|
endif()
|
|
|
|
if(SDLIMAGE_VENDORED AND SDLIMAGE_JPG AND NOT (SDLIMAGE_BACKEND_WIC OR SDLIMAGE_BACKEND_STB OR SDLIMAGE_BACKEND_IMAGEIO))
|
|
set(SDLIMAGE_JPG_VENDORED ON)
|
|
else()
|
|
set(SDLIMAGE_JPG_VENDORED OFF)
|
|
endif()
|
|
cmake_dependent_option(SDLIMAGE_JPG_SHARED "Dynamically load JPG support (requires shared libjpeg)"
|
|
${SDLIMAGE_DEPS_SHARED} "SDLIMAGE_JPG;NOT SDLIMAGE_BACKEND_WIC;NOT SDLIMAGE_BACKEND_STB;NOT SDLIMAGE_BACKEND_IMAGEIO" OFF)
|
|
|
|
if(SDLIMAGE_VENDORED AND SDLIMAGE_JXL)
|
|
set(SDLIMAGE_JXL_VENDORED ON)
|
|
else()
|
|
set(SDLIMAGE_JXL_VENDORED OFF)
|
|
endif()
|
|
cmake_dependent_option(SDLIMAGE_JXL_SHARED "Dynamically load JXL support (requires shared libjxl)"
|
|
${SDLIMAGE_DEPS_SHARED} SDLIMAGE_JXL OFF)
|
|
|
|
if(SDLIMAGE_VENDORED AND SDLIMAGE_PNG)
|
|
set(SDLIMAGE_PNG_VENDORED ON)
|
|
else()
|
|
set(SDLIMAGE_PNG_VENDORED OFF)
|
|
endif()
|
|
cmake_dependent_option(SDLIMAGE_PNG_SHARED "Dynamically load PNG support (requires shared libpng)"
|
|
${SDLIMAGE_DEPS_SHARED} "SDLIMAGE_PNG" OFF)
|
|
|
|
if(SDLIMAGE_VENDORED AND SDLIMAGE_TIF AND NOT (SDLIMAGE_BACKEND_IMAGEIO OR SDLIMAGE_BACKEND_WIC))
|
|
set(SDLIMAGE_TIF_VENDORED ON)
|
|
else()
|
|
set(SDLIMAGE_TIF_VENDORED OFF)
|
|
endif()
|
|
cmake_dependent_option(SDLIMAGE_TIF_SHARED "Dynamically load TIFF support (requires shared libtiff)"
|
|
${SDLIMAGE_DEPS_SHARED} SDLIMAGE_TIF OFF)
|
|
|
|
if(SDLIMAGE_VENDORED AND SDLIMAGE_WEBP)
|
|
set(SDLIMAGE_WEBP_VENDORED ON)
|
|
else()
|
|
set(SDLIMAGE_WEBP_VENDORED OFF)
|
|
endif()
|
|
cmake_dependent_option(SDLIMAGE_WEBP_SHARED "Dynamically load WEBP support (requires shared libwebp)"
|
|
${SDLIMAGE_DEPS_SHARED} SDLIMAGE_WEBP OFF)
|
|
|
|
if(SDLIMAGE_PNG_LIBPNG AND SDLIMAGE_PNG_VENDORED)
|
|
set(SDLIMAGE_ZLIB ON)
|
|
else()
|
|
set(SDLIMAGE_ZLIB OFF)
|
|
endif()
|
|
|
|
if(SDLIMAGE_VENDORED AND SDLIMAGE_PNG_VENDORED)
|
|
set(SDLIMAGE_ZLIB_VENDORED ON)
|
|
else()
|
|
set(SDLIMAGE_ZLIB_VENDORED OFF)
|
|
endif()
|
|
set(SDLIMAGE_ZLIB_SHARED OFF)
|
|
|
|
# Save BUILD_SHARED_LIBS variable
|
|
set(SDLIMAGE_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
|
|
|
|
set(sdl_required_components Headers)
|
|
|
|
if(SDLIMAGE_BUILD_SHARED_LIBS)
|
|
set(sdl3_image_target_name SDL3_image-shared)
|
|
set(sdl3_target_name SDL3::SDL3-shared)
|
|
|
|
list(APPEND sdl_required_components SDL3-shared)
|
|
else()
|
|
set(sdl3_image_target_name SDL3_image-static)
|
|
set(sdl3_target_name SDL3::SDL3)
|
|
endif()
|
|
|
|
if(NOT TARGET SDL3::Headers OR NOT TARGET ${sdl3_target_name})
|
|
find_package(SDL3 ${SDL_REQUIRED_VERSION} REQUIRED COMPONENTS ${sdl_required_components})
|
|
endif()
|
|
|
|
get_property(sdl3_version TARGET ${sdl3_target_name} PROPERTY SDL_FULL_VERSION)
|
|
if(sdl3_version AND sdl3_version VERSION_LESS SDL_REQUIRED_VERSION)
|
|
message(FATAL_ERROR "SDL3 ${SDL_REQUIRED_VERSION} is required (${sdl3_version} was found)")
|
|
endif()
|
|
|
|
SDL_DetectTargetCPUArchitectures(SDL_CPU_NAMES)
|
|
SDL_DetectCMakePlatform()
|
|
|
|
# Set PROJECT_VERSION of subprojects to "" if it's project call does not set VERSION
|
|
cmake_policy(SET CMP0048 NEW)
|
|
|
|
# Allow cmake_dependent_option to use "Full Condition Syntax"
|
|
if(POLICY CMP0127)
|
|
cmake_policy(SET CMP0127 NEW)
|
|
endif()
|
|
|
|
# OpenGL is required by dependencies of (dependencies of) some vendored libraries
|
|
if(NOT DEFINED OpenGL_GL_PREFERENCE)
|
|
set(OpenGL_GL_PREFERENCE GLVND)
|
|
endif()
|
|
|
|
set(BUILD_SHARED_LIBS ${SDLIMAGE_BUILD_SHARED_LIBS})
|
|
add_library(${sdl3_image_target_name}
|
|
src/IMG.c
|
|
src/IMG_WIC.c
|
|
src/IMG_ani.c
|
|
src/IMG_anim_encoder.c
|
|
src/IMG_anim_decoder.c
|
|
src/IMG_avif.c
|
|
src/IMG_bmp.c
|
|
src/IMG_gif.c
|
|
src/IMG_gpu.c
|
|
src/IMG_jpg.c
|
|
src/IMG_jxl.c
|
|
src/IMG_lbm.c
|
|
src/IMG_pcx.c
|
|
src/IMG_png.c
|
|
src/IMG_pnm.c
|
|
src/IMG_qoi.c
|
|
src/IMG_stb.c
|
|
src/IMG_svg.c
|
|
src/IMG_tga.c
|
|
src/IMG_tif.c
|
|
src/IMG_webp.c
|
|
src/IMG_xcf.c
|
|
src/IMG_xpm.c
|
|
src/IMG_xv.c
|
|
src/IMG_libpng.c
|
|
src/xmlman.c
|
|
)
|
|
add_library(SDL3_image::${sdl3_image_target_name} ALIAS ${sdl3_image_target_name})
|
|
if(NOT TARGET SDL3_image::SDL3_image)
|
|
add_library(SDL3_image::SDL3_image ALIAS ${sdl3_image_target_name})
|
|
endif()
|
|
if("c_std_99" IN_LIST CMAKE_C_COMPILE_FEATURES)
|
|
target_compile_features(${sdl3_image_target_name} PRIVATE c_std_99)
|
|
else()
|
|
message(WARNING "target_compile_features does not know c_std_99 for C compiler")
|
|
endif()
|
|
target_include_directories(${sdl3_image_target_name}
|
|
PUBLIC
|
|
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
|
|
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
|
|
)
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE
|
|
BUILD_SDL
|
|
SDL_BUILD_MAJOR_VERSION=${MAJOR_VERSION}
|
|
SDL_BUILD_MINOR_VERSION=${MINOR_VERSION}
|
|
SDL_BUILD_MICRO_VERSION=${MICRO_VERSION}
|
|
)
|
|
# Make sure SDL3's include directory comes first
|
|
target_include_directories(${sdl3_image_target_name} PRIVATE $<TARGET_PROPERTY:SDL3::Headers,INTERFACE_INCLUDE_DIRECTORIES>)
|
|
target_link_libraries(${sdl3_image_target_name} PUBLIC SDL3::Headers)
|
|
if(SDLIMAGE_BUILD_SHARED_LIBS)
|
|
target_link_libraries(${sdl3_image_target_name} PRIVATE SDL3::SDL3-shared)
|
|
endif()
|
|
sdl_add_warning_options(${sdl3_image_target_name} WARNING_AS_ERROR ${SDLIMAGE_WERROR})
|
|
if(WIN32 AND SDLIMAGE_BUILD_SHARED_LIBS)
|
|
target_sources(${sdl3_image_target_name} PRIVATE
|
|
src/version.rc
|
|
)
|
|
if(MINGW)
|
|
target_link_options(${sdl3_image_target_name} PRIVATE -static-libgcc)
|
|
endif()
|
|
endif()
|
|
set_target_properties(${sdl3_image_target_name} PROPERTIES
|
|
OUTPUT_NAME "SDL3_image"
|
|
DEFINE_SYMBOL DLL_EXPORT
|
|
EXPORT_NAME ${sdl3_image_target_name}
|
|
C_VISIBILITY_PRESET "hidden"
|
|
)
|
|
|
|
sdl_target_link_option_version_file(${sdl3_image_target_name} "${CMAKE_CURRENT_SOURCE_DIR}/src/SDL_image.sym")
|
|
|
|
if(NOT ANDROID)
|
|
set_target_properties(${sdl3_image_target_name} PROPERTIES
|
|
SOVERSION "${SO_VERSION_MAJOR}"
|
|
VERSION "${SO_VERSION}"
|
|
)
|
|
if(APPLE)
|
|
set_target_properties(${sdl3_image_target_name} PROPERTIES
|
|
MACHO_COMPATIBILITY_VERSION "${DYLIB_COMPAT_VERSION}"
|
|
MACHO_CURRENT_VERSION "${DYLIB_CURRENT_VERSION}"
|
|
)
|
|
sdl_no_deprecated_errors(${sdl3_image_target_name})
|
|
set_property(TARGET ${sdl3_image_target_name} APPEND PROPERTY LINK_DEPENDS
|
|
"${PROJECT_SOURCE_DIR}/src/SDL_image.exports")
|
|
target_link_options(${sdl3_image_target_name} PRIVATE
|
|
"SHELL:-Wl,-exported_symbols_list,${PROJECT_SOURCE_DIR}/src/SDL_image.exports")
|
|
endif()
|
|
endif()
|
|
if(SDLIMAGE_BUILD_SHARED_LIBS)
|
|
if(WIN32)
|
|
set_target_properties(${sdl3_image_target_name} PROPERTIES
|
|
PREFIX ""
|
|
DLL_NAME_WITH_SOVERSION FALSE
|
|
)
|
|
endif()
|
|
else()
|
|
if(MSVC)
|
|
set_target_properties(${sdl3_image_target_name} PROPERTIES
|
|
OUTPUT_NAME "SDL3_image-static"
|
|
)
|
|
endif()
|
|
endif()
|
|
|
|
# Use `Compatible Interface Properties` to ensure a shared SDL3_image is built with a shared SDL3
|
|
if(SDLIMAGE_BUILD_SHARED_LIBS)
|
|
set_property(TARGET ${sdl3_image_target_name} PROPERTY INTERFACE_SDL3_SHARED TRUE)
|
|
set_property(TARGET ${sdl3_image_target_name} APPEND PROPERTY COMPATIBLE_INTERFACE_BOOL SDL3_SHARED)
|
|
endif()
|
|
|
|
if(SDLIMAGE_BUILD_SHARED_LIBS)
|
|
sdl_target_link_options_no_undefined(${sdl3_image_target_name})
|
|
endif()
|
|
|
|
if(SDLIMAGE_BUILD_SHARED_LIBS)
|
|
# Make sure static library dependencies are built with -fPIC when building a shared SDL3_image
|
|
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
|
endif()
|
|
|
|
set(install_license_names)
|
|
macro(register_license NAME FILE)
|
|
list(APPEND install_license_names ${NAME})
|
|
set(install_license_${NAME} "${FILE}")
|
|
endmacro()
|
|
|
|
set(INSTALL_EXTRA_TARGETS)
|
|
set(INSTALL_EXTRA_CMAKE_MODULES)
|
|
set(PC_LIBS)
|
|
set(PC_REQUIRES)
|
|
set(SDLIMAGE_BACKENDS)
|
|
|
|
list(APPEND SDLIMAGE_BACKENDS STB)
|
|
set(SDLIMAGE_STB_ENABLED FALSE)
|
|
if(SDLIMAGE_BACKEND_STB)
|
|
set(SDLIMAGE_STB_ENABLED TRUE)
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE USE_STBIMAGE)
|
|
endif()
|
|
|
|
list(APPEND SDLIMAGE_BACKENDS IMAGEIO)
|
|
set(SDLIMAGE_IMAGEIO_ENABLED FALSE)
|
|
if(APPLE)
|
|
if(SDLIMAGE_BACKEND_IMAGEIO)
|
|
enable_language(OBJC)
|
|
set(SDLIMAGE_IMAGEIO_ENABLED TRUE)
|
|
if(CMAKE_VERSION VERSION_LESS "3.24")
|
|
set(genex_FRAMEWORK "1:")
|
|
else()
|
|
set(genex_FRAMEWORK "LINK_LIBRARY:FRAMEWORK,")
|
|
endif()
|
|
if(CMAKE_SYSTEM_NAME MATCHES ".*(Darwin|MacOS).*")
|
|
target_link_libraries(${sdl3_image_target_name} PRIVATE $<${genex_FRAMEWORK}ApplicationServices>)
|
|
target_link_libraries(${sdl3_image_target_name} PRIVATE $<${genex_FRAMEWORK}Foundation>)
|
|
else()
|
|
target_link_libraries(${sdl3_image_target_name} PRIVATE
|
|
$<${genex_FRAMEWORK}CoreGraphics>
|
|
$<${genex_FRAMEWORK}Foundation>
|
|
$<${genex_FRAMEWORK}ImageIO>
|
|
$<${genex_FRAMEWORK}MobileCoreServices>
|
|
$<${genex_FRAMEWORK}UIKit>
|
|
)
|
|
endif()
|
|
target_link_libraries(${sdl3_image_target_name} PRIVATE objc)
|
|
target_sources(${sdl3_image_target_name} PRIVATE
|
|
src/IMG_ImageIO.m
|
|
)
|
|
|
|
if (SDLIMAGE_PNG AND NOT SDLIMAGE_BACKEND_STB)
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE PNG_USES_IMAGEIO)
|
|
endif()
|
|
if (SDLIMAGE_JPG AND NOT SDLIMAGE_BACKEND_STB)
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE JPG_USES_IMAGEIO)
|
|
endif()
|
|
else()
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE SDL_IMAGE_USE_COMMON_BACKEND)
|
|
endif()
|
|
endif()
|
|
|
|
list(APPEND SDLIMAGE_BACKENDS WIC)
|
|
set(SDLIMAGE_WIC_ENABLED FALSE)
|
|
if(SDLIMAGE_BACKEND_WIC)
|
|
set(SDLIMAGE_WIC_ENABLED TRUE)
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE SDL_IMAGE_USE_WIC_BACKEND)
|
|
endif()
|
|
|
|
if(SDLIMAGE_ZLIB)
|
|
if(SDLIMAGE_ZLIB_VENDORED)
|
|
message(STATUS "${PROJECT_NAME}: Using vendored zlib")
|
|
# disable build of zlib example programs:
|
|
set(ZLIB_BUILD_EXAMPLES OFF CACHE BOOL "zlib examples" FORCE)
|
|
sdl_check_project_in_subfolder(external/zlib zlib SDLIMAGE_VENDORED)
|
|
add_subdirectory(external/zlib external/zlib-build EXCLUDE_FROM_ALL)
|
|
register_license(zlib external/zlib/LICENSE)
|
|
set(ZLIB_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/external/zlib;${CMAKE_CURRENT_BINARY_DIR}/external/zlib-build")
|
|
# ZLIB_INCLUDE_DIR variable is used by vendored libpng
|
|
set(ZLIB_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external/zlib;${CMAKE_CURRENT_BINARY_DIR}/external/zlib-build" CACHE STRING "path of zlib, passed to libpng" FORCE)
|
|
# ZLIB_LIBRARY variable is used by vendored libpng
|
|
if(SDLIMAGE_ZLIB_SHARED)
|
|
set(ZLIB_LIBRARY zlib)
|
|
else()
|
|
set(ZLIB_LIBRARY zlibstatic)
|
|
set(SKIP_INSTALL_CONFIG_FILE ON)
|
|
endif()
|
|
if(NOT TARGET ZLIB::ZLIB)
|
|
add_library(ZLIB::ZLIB ALIAS ${ZLIB_LIBRARY})
|
|
endif()
|
|
if(NOT TARGET ZLIB::zlibstatic)
|
|
add_library(ZLIB::zlibstatic ALIAS ${ZLIB_LIBRARY})
|
|
endif()
|
|
set(ZLIB_FOUND TRUE)
|
|
# ZLIB_LIBRARIES variable is used by vendored libpng
|
|
set(ZLIB_LIBRARIES "${ZLIB_LIBRARY}")
|
|
# ZLIB_INCLUDE_DIRS variable is used by vendored libpng
|
|
set(ZLIB_INCLUDE_DIRS "${ZLIB_INCLUDE_DIR}")
|
|
target_include_directories(${ZLIB_LIBRARY} INTERFACE $<BUILD_INTERFACE:${ZLIB_INCLUDE_DIRS}>)
|
|
if(SDLIMAGE_ZLIB_SHARED OR (SDLIMAGE_PNG AND NOT SDLIMAGE_PNG_SHARED))
|
|
list(APPEND INSTALL_EXTRA_TARGETS ${ZLIB_LIBRARY})
|
|
endif()
|
|
set_target_properties(${ZLIB_LIBRARY} PROPERTIES EXPORT_NAME external_zlib)
|
|
add_library(SDL3_image::external_zlib ALIAS ${ZLIB_LIBRARY})
|
|
else()
|
|
message(FATAL_ERROR "Internal error (zlib is only required when requesting vendored dependencies)")
|
|
endif()
|
|
endif()
|
|
|
|
if(SDLIMAGE_DAV1D)
|
|
if(SDLIMAGE_DAV1D_VENDORED)
|
|
message(STATUS "${PROJECT_NAME}: Using vendored dav1d")
|
|
set(BUILD_SHARED_LIBS ${SDLIMAGE_DAV1D_SHARED})
|
|
add_subdirectory(external/dav1d external/dav1d-build EXCLUDE_FROM_ALL)
|
|
register_license(dav1d external/dav1d/COPYING)
|
|
if(DAV1D_ASM AND (SDL_CPU_X64 OR SDL_CPU_X86))
|
|
enable_language(ASM_NASM)
|
|
endif()
|
|
set(DAV1D_LIBRARY dav1d)
|
|
if(SDLIMAGE_DAV1D_SHARED OR NOT SDLIMAGE_BUILD_SHARED_LIBS)
|
|
list(APPEND INSTALL_EXTRA_TARGETS dav1d)
|
|
endif()
|
|
else()
|
|
message(FATAL_ERROR "Internal error (dav1d is only required when requesting vendored dependencies)")
|
|
endif()
|
|
endif()
|
|
|
|
if(SDLIMAGE_AOM)
|
|
if(SDLIMAGE_AOM_VENDORED)
|
|
message(STATUS "${PROJECT_NAME}: Using vendored aom")
|
|
set(BUILD_SHARED_LIBS ${SDLIMAGE_AOM_SHARED})
|
|
set(ENABLE_DOCS OFF CACHE BOOL "")
|
|
set(ENABLE_EXAMPLES OFF CACHE BOOL "")
|
|
set(ENABLE_TESTDATA OFF CACHE BOOL "")
|
|
set(ENABLE_TESTS OFF CACHE BOOL "")
|
|
set(ENABLE_TOOLS OFF CACHE BOOL "")
|
|
if(SDLIMAGE_AOM_SHARED)
|
|
set(CONFIG_AV1_DECODER 1 CACHE BOOL "" FORCE)
|
|
else()
|
|
set(CONFIG_AV1_DECODER 0 CACHE BOOL "" FORCE)
|
|
endif()
|
|
set(CONFIG_AV1_ENCODER 1 CACHE BOOL "" FORCE)
|
|
# aom detects cpu using CMAKE_SYSTEM_NAME
|
|
if(SDL_CPU_X86)
|
|
set(AOM_TARGET_CPU "x86")
|
|
elseif(SDL_CPU_X64)
|
|
set(AOM_TARGET_CPU "x86_64")
|
|
elseif(SDL_CPU_ARM32)
|
|
set(AOM_TARGET_CPU "arm")
|
|
set(AOM_NEON_INTRIN_FLAG "-mfpu=neon" CACHE STRING "AOM CFLAGS for enabling neon intrinsics")
|
|
elseif(SDL_CPU_ARM64)
|
|
set(AOM_TARGET_CPU "aarch64")
|
|
elseif(SDL_CPU_POWERPC32 OR SDL_CPU_POWERPC64)
|
|
set(AOM_TARGET_CPU "ppc")
|
|
else()
|
|
set(AOM_TARGET_CPU "generic")
|
|
endif()
|
|
add_subdirectory(external/aom external/aom-build EXCLUDE_FROM_ALL)
|
|
register_license(aom external/aom/LICENSE)
|
|
set(AOM_LIBRARY aom)
|
|
if(SDLIMAGE_AOM_SHARED OR NOT SDLIMAGE_BUILD_SHARED_LIBS)
|
|
list(APPEND INSTALL_EXTRA_TARGETS aom)
|
|
endif()
|
|
else()
|
|
message(FATAL_ERROR "Internal error (aom is only required when requesting vendored dependencies)")
|
|
endif()
|
|
endif()
|
|
|
|
list(APPEND SDLIMAGE_BACKENDS AVIF)
|
|
set(SDLIMAGE_AVIF_ENABLED FALSE)
|
|
if(SDLIMAGE_AVIF)
|
|
if(SDLIMAGE_AVIF_VENDORED)
|
|
set(SDLIMAGE_AVIF_ENABLED TRUE)
|
|
message(STATUS "${PROJECT_NAME}: Using vendored libavif")
|
|
sdl_check_project_in_subfolder(external/libavif libavif SDLIMAGE_VENDORED)
|
|
set(LIBAVIF_SDLIMAGE_BUILD TRUE)
|
|
set(SKIP_INSTALL_LIBRARIES TRUE)
|
|
set(BUILD_SHARED_LIBS ${SDLIMAGE_AVIF_SHARED})
|
|
set(AVIF_CODEC_LIBGAV1 OFF CACHE STRING "Use libgav1 for avif" FORCE)
|
|
if(SDLIMAGE_WEBP)
|
|
set(AVIF_LIBSHARPYUV SYSTEM CACHE STRING "Use sharpyuv for avif (re-use sharpyuv built by libwebp)" FORCE)
|
|
else()
|
|
set(AVIF_LIBSHARPYUV OFF CACHE STRING "Use sharpyuv for avif" FORCE)
|
|
endif()
|
|
set(AVIF_LIBYUV OFF CACHE BOOL "Use libyuv for avif" FORCE)
|
|
set(AVIF_CODEC_DAV1D "SYSTEM" CACHE STRING "Use dav1d codec for decoding" FORCE)
|
|
set(AVIF_CODEC_AOM "SYSTEM" CACHE STRING "Use aom codec for decoding" FORCE)
|
|
set(AVIF_CODEC_AOM_ENCODE ON CACHE BOOL "Enable aom encoder" FORCE)
|
|
set(AVIF_CODEC_AOM_DECODE OFF CACHE BOOL "Enable aom decoder" FORCE)
|
|
set(BUILD_SHARED_LIBS ${SDLIMAGE_AVIF_SHARED})
|
|
set(AOM_LIBRARIES "aom" CACHE STRING "aom libraries" FORCE)
|
|
add_subdirectory(external/libavif external/libavif-build EXCLUDE_FROM_ALL)
|
|
register_license(avif external/libavif/LICENSE)
|
|
if(SDLIMAGE_AVIF_SHARED OR NOT SDLIMAGE_BUILD_SHARED_LIBS)
|
|
list(APPEND INSTALL_EXTRA_TARGETS avif)
|
|
endif()
|
|
set_target_properties(avif PROPERTIES EXPORT_NAME external_libavif)
|
|
add_library(SDL3_image::external_libavif ALIAS avif)
|
|
if(NOT SDLIMAGE_AVIF_SHARED)
|
|
list(APPEND PC_LIBS -l$<TARGET_FILE_BASE_NAME:avif>)
|
|
endif()
|
|
if(NOT MSVC AND NOT CMAKE_SYSTEM_NAME MATCHES ".*OpenBSD.*")
|
|
sdl_check_linker_flag("-Wl,--no-undefined" LINKER_SUPPORTS_WL_NO_UNDEFINED)
|
|
if(LINKER_SUPPORTS_WL_NO_UNDEFINED)
|
|
target_link_options(avif PRIVATE "-Wl,--no-undefined")
|
|
endif()
|
|
endif()
|
|
elseif(SDLIMAGE_AVIF_SHARED AND DEFINED SDLIMAGE_DYNAMIC_AVIF AND EXISTS "${SDLIMAGE_DYNAMIC_AVIF}")
|
|
message(STATUS "${PROJECT_NAME}: Using libavif from CMake variable")
|
|
set(SDLIMAGE_AVIF_ENABLED TRUE)
|
|
else()
|
|
find_package(libavif "${LIBAVIF_MINIMUM_VERSION}" QUIET ${required})
|
|
if(libavif_FOUND)
|
|
message(STATUS "${PROJECT_NAME}: Using system libavif")
|
|
set(SDLIMAGE_AVIF_ENABLED TRUE)
|
|
if(NOT SDLIMAGE_AVIF_SHARED)
|
|
list(APPEND PC_REQUIRES "libavif >= ${LIBAVIF_MINIMUM_VERSION}")
|
|
endif()
|
|
else()
|
|
message(STATUS "libavif-${LIBAVIF_MINIMUM_VERSION} or compatible not found")
|
|
message(${fatal_error} "libavif NOT found")
|
|
endif()
|
|
endif()
|
|
if(SDLIMAGE_AVIF_ENABLED)
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE
|
|
LOAD_AVIF
|
|
SAVE_AVIF=$<BOOL:${SDLIMAGE_AVIF_SAVE}>
|
|
)
|
|
if(SDLIMAGE_AVIF_SHARED)
|
|
if(NOT DEFINED SDLIMAGE_DYNAMIC_AVIF)
|
|
target_include_directories(${sdl3_image_target_name} PRIVATE
|
|
$<TARGET_PROPERTY:avif,INCLUDE_DIRECTORIES>
|
|
$<TARGET_PROPERTY:avif,INTERFACE_INCLUDE_DIRECTORIES>
|
|
$<TARGET_PROPERTY:avif,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
|
|
)
|
|
if(SDLIMAGE_AVIF_VENDORED)
|
|
add_dependencies(${sdl3_image_target_name} avif)
|
|
endif()
|
|
endif()
|
|
target_get_dynamic_library(SDLIMAGE_DYNAMIC_AVIF avif)
|
|
message(STATUS "Dynamic libavif: ${SDLIMAGE_DYNAMIC_AVIF}")
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_AVIF_DYNAMIC=\"${SDLIMAGE_DYNAMIC_AVIF}\"")
|
|
else()
|
|
target_link_libraries(${sdl3_image_target_name} PRIVATE avif)
|
|
endif()
|
|
else()
|
|
# Variable is used by test suite
|
|
set(SDLIMAGE_AVIF_SAVE OFF)
|
|
endif()
|
|
endif()
|
|
|
|
list(APPEND SDLIMAGE_BACKENDS ANI)
|
|
set(SDLIMAGE_ANI_ENABLED FALSE)
|
|
if(SDLIMAGE_ANI)
|
|
set(SDLIMAGE_ANI_ENABLED TRUE)
|
|
if(SDLIMAGE_ANI_ENABLED)
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE
|
|
LOAD_ANI
|
|
SAVE_ANI=$<BOOL:${SDLIMAGE_ANI_SAVE}>
|
|
)
|
|
else()
|
|
# Variable is used by test suite
|
|
set(SDLIMAGE_ANI_SAVE OFF)
|
|
endif()
|
|
endif()
|
|
|
|
list(APPEND SDLIMAGE_BACKENDS BMP)
|
|
set(SDLIMAGE_BMP_ENABLED FALSE)
|
|
if(SDLIMAGE_BMP)
|
|
set(SDLIMAGE_BMP_ENABLED TRUE)
|
|
if(SDLIMAGE_BMP_ENABLED)
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE
|
|
LOAD_BMP
|
|
SAVE_BMP=$<BOOL:${SDLIMAGE_BMP_SAVE}>
|
|
)
|
|
else()
|
|
# Variable is used by test suite
|
|
set(SDLIMAGE_BMP_SAVE OFF)
|
|
endif()
|
|
endif()
|
|
|
|
list(APPEND SDLIMAGE_BACKENDS GIF)
|
|
set(SDLIMAGE_GIF_ENABLED FALSE)
|
|
if(SDLIMAGE_GIF)
|
|
set(SDLIMAGE_GIF_ENABLED TRUE)
|
|
if(SDLIMAGE_GIF_ENABLED)
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE
|
|
LOAD_GIF
|
|
SAVE_GIF=$<BOOL:${SDLIMAGE_GIF_SAVE}>
|
|
)
|
|
else()
|
|
# Variable is used by test suite
|
|
set(SDLIMAGE_GIF_SAVE OFF)
|
|
endif()
|
|
endif()
|
|
|
|
list(APPEND SDLIMAGE_BACKENDS JPG)
|
|
set(SDLIMAGE_JPG_ENABLED FALSE)
|
|
if(SDLIMAGE_JPG)
|
|
if(SDLIMAGE_BACKEND_STB OR SDLIMAGE_BACKEND_WIC OR SDLIMAGE_BACKEND_IMAGEIO)
|
|
set(SDLIMAGE_JPG_ENABLED TRUE)
|
|
else()
|
|
if(SDLIMAGE_JPG_VENDORED)
|
|
set(SDLIMAGE_JPG_ENABLED TRUE)
|
|
message(STATUS "${PROJECT_NAME}: Using vendored libjpeg")
|
|
sdl_check_project_in_subfolder(external/jpeg libjpeg SDLIMAGE_VENDORED)
|
|
set(BUILD_SHARED_LIBS ${SDLIMAGE_JPG_SHARED})
|
|
add_subdirectory(external/jpeg external/jpeg-build EXCLUDE_FROM_ALL)
|
|
register_license(jpeg external/jpeg/COPYING)
|
|
if(SDLIMAGE_JPG_SHARED OR NOT SDLIMAGE_BUILD_SHARED_LIBS)
|
|
list(APPEND INSTALL_EXTRA_TARGETS jpeg)
|
|
endif()
|
|
set_target_properties(jpeg PROPERTIES EXPORT_NAME external_libjpeg)
|
|
add_library(SDL3_image::external_libjpeg ALIAS jpeg)
|
|
if(NOT SDLIMAGE_JPG_SHARED)
|
|
list(APPEND PC_LIBS -l$<TARGET_FILE_BASE_NAME:jpeg>)
|
|
endif()
|
|
elseif(SDLIMAGE_JPG_SHARED AND DEFINED SDLIMAGE_DYNAMIC_JPEG AND EXISTS "${SDLIMAGE_DYNAMIC_JPEG}")
|
|
message(STATUS "${PROJECT_NAME}: Using libjpeg from CMake variable")
|
|
set(SDLIMAGE_JPG_ENABLED TRUE)
|
|
else()
|
|
find_package(JPEG ${required})
|
|
if(JPEG_FOUND)
|
|
message(STATUS "${PROJECT_NAME}: Using system libjpeg")
|
|
set(SDLIMAGE_JPG_ENABLED TRUE)
|
|
if(NOT SDLIMAGE_JPG_SHARED)
|
|
list(APPEND PC_REQUIRES libjpeg)
|
|
endif()
|
|
else()
|
|
message(${fatal_error} "libjpeg NOT found")
|
|
endif()
|
|
endif()
|
|
if(SDLIMAGE_JPG_ENABLED)
|
|
if(SDLIMAGE_JPG_SHARED)
|
|
if(NOT DEFINED SDLIMAGE_DYNAMIC_JPEG)
|
|
target_include_directories(${sdl3_image_target_name} PRIVATE
|
|
$<TARGET_PROPERTY:JPEG::JPEG,INCLUDE_DIRECTORIES>
|
|
$<TARGET_PROPERTY:JPEG::JPEG,INTERFACE_INCLUDE_DIRECTORIES>
|
|
$<TARGET_PROPERTY:JPEG::JPEG,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
|
|
)
|
|
if(SDLIMAGE_JPG_VENDORED)
|
|
add_dependencies(${sdl3_image_target_name} JPEG::JPEG)
|
|
endif()
|
|
endif()
|
|
target_get_dynamic_library(SDLIMAGE_DYNAMIC_JPEG JPEG::JPEG)
|
|
message(STATUS "Dynamic libjpeg: ${SDLIMAGE_DYNAMIC_JPEG}")
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_JPG_DYNAMIC=\"${SDLIMAGE_DYNAMIC_JPEG}\"")
|
|
else()
|
|
target_link_libraries(${sdl3_image_target_name} PRIVATE JPEG::JPEG)
|
|
endif()
|
|
endif()
|
|
endif()
|
|
if(SDLIMAGE_JPG_ENABLED)
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE
|
|
LOAD_JPG
|
|
SAVE_JPG=$<BOOL:${SDLIMAGE_JPG_SAVE}>
|
|
)
|
|
else()
|
|
# Variable is used by test suite
|
|
set(SDLIMAGE_JPG_SAVE OFF)
|
|
endif()
|
|
endif()
|
|
|
|
list(APPEND SDLIMAGE_BACKENDS JXL)
|
|
set(SDLIMAGE_JXL_ENABLED FALSE)
|
|
if(SDLIMAGE_JXL)
|
|
if(SDLIMAGE_JXL_VENDORED)
|
|
set(SDLIMAGE_JXL_ENABLED TRUE)
|
|
enable_language(CXX)
|
|
message(STATUS "${PROJECT_NAME}: Using vendored libjxl")
|
|
# BUILD_TESTING variable is used by libjxl
|
|
set(BUILD_TESTING OFF CACHE BOOL "build testing")
|
|
# JPEGXL_ENABLE_BENCHMARK variable is used by libjxl
|
|
set(JPEGXL_ENABLE_BENCHMARK OFF CACHE BOOL "libjpegxl benchmark" FORCE)
|
|
# JPEGXL_ENABLE_TOOLS variable is used by libjxl
|
|
set(JPEGXL_ENABLE_JNI OFF CACHE BOOL "build jpegxl jni" FORCE)
|
|
# JPEGXL_ENABLE_SJPEG variable is used by libjxl
|
|
set(JPEGXL_ENABLE_SJPEG OFF CACHE BOOL "build jpegxl sjpeg" FORCE)
|
|
# JPEGXL_BUNDLE_SKCMS variable is used by libjxl
|
|
set(JPEGXL_BUNDLE_SKCMS OFF CACHE BOOL "build jpegxl bundle sjpeg" FORCE)
|
|
# JPEGXL_ENABLE_OPENEXR variable is used by libjxl
|
|
set(JPEGXL_ENABLE_OPENEXR OFF CACHE BOOL "build jpegxl openxr" FORCE)
|
|
# JPEGXL_ENABLE_MANPAGES variable is used by libjxl
|
|
set(JPEGXL_ENABLE_MANPAGES OFF CACHE BOOL "libjxl manpage option" FORCE)
|
|
# JPEGXL_ENABLE_PLUGINS variable is used by libjxl
|
|
set(JPEGXL_ENABLE_PLUGINS OFF CACHE BOOL "libjxl manpage option" FORCE)
|
|
# JPEGXL_ENABLE_SKCMS variable is used by libjxl
|
|
# Singe: upstream forces lcms2 here, which is libjxl's own fallback for big-endian
|
|
# machines. Every target Singe builds is little-endian, where libjxl defaults to skcms --
|
|
# far smaller, and one less library to vendor. Left as a default rather than forced, so a
|
|
# caller can still ask for lcms2.
|
|
set(JPEGXL_ENABLE_SKCMS ON CACHE BOOL "libjxl skcms option")
|
|
# JPEGXL_FORCE_SYSTEM_HWY variable is used by libjxl
|
|
set(JPEGXL_FORCE_SYSTEM_HWY OFF CACHE BOOL "libjxl highway option" FORCE)
|
|
sdl_check_project_in_subfolder(external/libjxl libjxl SDLIMAGE_VENDORED)
|
|
set(BUILD_SHARED_LIBS ${SDLIMAGE_JXL_SHARED})
|
|
add_subdirectory(external/libjxl external/libjxl-build EXCLUDE_FROM_ALL)
|
|
register_license(jxl external/libjxl/LICENSE)
|
|
if(SDLIMAGE_JXL_SHARED)
|
|
set(jxl_lib jxl)
|
|
set(jxl_install_libs brotlidec brotlicommon brotlienc jxl)
|
|
else()
|
|
set(jxl_lib jxl_dec-static)
|
|
set(jxl_install_libs brotlidec brotlicommon hwy jxl_dec-static)
|
|
list(APPEND PC_LIBS
|
|
-l$<TARGET_FILE_BASE_NAME:brotlidec> -l$<TARGET_FILE_BASE_NAME:brotlicommon>
|
|
-l$<TARGET_FILE_BASE_NAME:brotlienc> -l$<TARGET_FILE_BASE_NAME:jxl>
|
|
)
|
|
endif()
|
|
if(SDLIMAGE_JXL_SHARED OR NOT SDLIMAGE_BUILD_SHARED_LIBS)
|
|
list(APPEND INSTALL_EXTRA_TARGETS ${jxl_install_libs})
|
|
endif()
|
|
set_target_properties(${jxl_lib} PROPERTIES EXPORT_NAME external_libjxl)
|
|
add_library(SDL3_image::external_libjxl ALIAS ${jxl_lib})
|
|
if(NOT TARGET libjxl::libjxl)
|
|
add_library(libjxl::libjxl ALIAS ${jxl_lib})
|
|
endif()
|
|
elseif(SDLIMAGE_JXL_SHARED AND DEFINED SDLIMAGE_DYNAMIC_JXL AND EXISTS "${SDLIMAGE_DYNAMIC_JXL}")
|
|
message(STATUS "${PROJECT_NAME}: Using libjxl from CMake variable")
|
|
set(SDLIMAGE_JXL_ENABLED TRUE)
|
|
else()
|
|
find_package(libjxl ${required})
|
|
if(libjxl_FOUND)
|
|
message(STATUS "${PROJECT_NAME}: Using system libjxl")
|
|
set(SDLIMAGE_JXL_ENABLED TRUE)
|
|
if(NOT SDLIMAGE_JXL_SHARED)
|
|
list(APPEND PC_REQUIRES libjxl)
|
|
list(APPEND INSTALL_EXTRA_CMAKE_MODULES cmake/Findlibjxl.cmake)
|
|
endif()
|
|
else()
|
|
message(${fatal_error} "libjxl NOT found")
|
|
endif()
|
|
endif()
|
|
if(SDLIMAGE_JXL_ENABLED)
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_JXL)
|
|
if(SDLIMAGE_JXL_SHARED)
|
|
if(NOT DEFINED SDLIMAGE_DYNAMIC_JXL)
|
|
target_include_directories(${sdl3_image_target_name} PRIVATE
|
|
$<TARGET_PROPERTY:libjxl::libjxl,INCLUDE_DIRECTORIES>
|
|
$<TARGET_PROPERTY:libjxl::libjxl,INTERFACE_INCLUDE_DIRECTORIES>
|
|
$<TARGET_PROPERTY:libjxl::libjxl,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
|
|
)
|
|
if(SDLIMAGE_JXL_VENDORED)
|
|
add_dependencies(${sdl3_image_target_name} libjxl::libjxl)
|
|
endif()
|
|
endif()
|
|
target_get_dynamic_library(SDLIMAGE_DYNAMIC_JXL libjxl::libjxl)
|
|
message(STATUS "Dynamic libjxl: ${SDLIMAGE_DYNAMIC_JXL}")
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_JXL_DYNAMIC=\"${SDLIMAGE_DYNAMIC_JXL}\"")
|
|
else()
|
|
target_link_libraries(${sdl3_image_target_name} PRIVATE libjxl::libjxl)
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
list(APPEND SDLIMAGE_BACKENDS LBM)
|
|
set(SDLIMAGE_LBM_ENABLED FALSE)
|
|
if(SDLIMAGE_LBM)
|
|
set(SDLIMAGE_LBM_ENABLED TRUE)
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_LBM)
|
|
endif()
|
|
|
|
list(APPEND SDLIMAGE_BACKENDS PCX)
|
|
set(SDLIMAGE_PCX_ENABLED FALSE)
|
|
if(SDLIMAGE_PCX)
|
|
set(SDLIMAGE_PCX_ENABLED TRUE)
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_PCX)
|
|
endif()
|
|
|
|
list(APPEND SDLIMAGE_BACKENDS PNG)
|
|
list(APPEND SDLIMAGE_BACKENDS APNG)
|
|
set(SDLIMAGE_PNG_ENABLED FALSE)
|
|
if(SDLIMAGE_PNG)
|
|
set(SDLIMAGE_APNG_ENABLED FALSE)
|
|
set(SDLIMAGE_PNG_ENABLED TRUE)
|
|
set(SDLIMAGE_LIBPNG_ENABLED FALSE)
|
|
|
|
if(SDLIMAGE_PNG_LIBPNG)
|
|
if(SDLIMAGE_PNG_VENDORED)
|
|
set(PNG_SHARED "${SDLIMAGE_PNG_SHARED}")
|
|
set(SDLIMAGE_LIBPNG_ENABLED TRUE)
|
|
message(STATUS "${PROJECT_NAME}: Using vendored libpng")
|
|
set(PNG_TESTS OFF CACHE BOOL "Build PNG Tests" FORCE)
|
|
set(SKIP_INSTALL_EXPORT TRUE)
|
|
sdl_check_project_in_subfolder(external/libpng libpng SDLIMAGE_VENDORED)
|
|
add_subdirectory(external/libpng external/libpng-build EXCLUDE_FROM_ALL)
|
|
register_license(libpng external/libpng/LICENSE)
|
|
if(SDLIMAGE_PNG_SHARED)
|
|
set(PNG_LIBRARY png_shared)
|
|
else()
|
|
set(PNG_LIBRARY png_static)
|
|
endif()
|
|
add_library(PNG::PNG ALIAS ${PNG_LIBRARY})
|
|
set_property(TARGET ${PNG_LIBRARY} PROPERTY DEBUG_POSTFIX "")
|
|
target_include_directories(${sdl3_image_target_name} PRIVATE external/libpng)
|
|
if(SDLIMAGE_PNG_SHARED OR NOT SDLIMAGE_BUILD_SHARED_LIBS)
|
|
list(APPEND INSTALL_EXTRA_TARGETS ${PNG_LIBRARY})
|
|
endif()
|
|
set_target_properties(${PNG_LIBRARY} PROPERTIES EXPORT_NAME external_libpng)
|
|
add_library(SDL3_image::external_libpng ALIAS ${PNG_LIBRARY})
|
|
if(NOT SDLIMAGE_PNG_SHARED)
|
|
list(APPEND PC_LIBS -l$<TARGET_FILE_BASE_NAME:${PNG_LIBRARY}>)
|
|
if(SDLIMAGE_ZLIB_VENDORED)
|
|
list(APPEND PC_LIBS -l$<TARGET_FILE_BASE_NAME:${ZLIB_LIBRARY}>)
|
|
else()
|
|
list(APPEND PC_REQUIRES zlib)
|
|
endif()
|
|
endif()
|
|
elseif(SDLIMAGE_PNG_SHARED AND DEFINED SDLIMAGE_DYNAMIC_PNG AND EXISTS "${SDLIMAGE_DYNAMIC_PNG}")
|
|
message(STATUS "${PROJECT_NAME}: Using libpng from CMake variable")
|
|
set(SDLIMAGE_LIBPNG_ENABLED TRUE)
|
|
else()
|
|
find_package(PNG ${required})
|
|
if(PNG_FOUND)
|
|
message(STATUS "${PROJECT_NAME}: Using system libpng")
|
|
set(SDLIMAGE_LIBPNG_ENABLED TRUE)
|
|
if(NOT SDLIMAGE_PNG_SHARED)
|
|
list(APPEND PC_REQUIRES libpng)
|
|
endif()
|
|
else()
|
|
message(${FATAL_ERROR} "libpng NOT found")
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
if(SDLIMAGE_LIBPNG_ENABLED)
|
|
set(SDLIMAGE_APNG_ENABLED TRUE)
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE
|
|
SDL_IMAGE_LIBPNG
|
|
)
|
|
if(SDLIMAGE_PNG_SHARED)
|
|
if(NOT DEFINED SDLIMAGE_DYNAMIC_PNG)
|
|
if(TARGET PNG::png_shared)
|
|
set(png_target PNG::png_shared)
|
|
else()
|
|
set(png_target PNG::PNG)
|
|
endif()
|
|
target_include_directories(${sdl3_image_target_name} PRIVATE
|
|
$<TARGET_PROPERTY:${png_target},INTERFACE_INCLUDE_DIRECTORIES>
|
|
)
|
|
if(SDLIMAGE_PNG_VENDORED)
|
|
add_dependencies(${sdl3_image_target_name} ${png_target})
|
|
endif()
|
|
else()
|
|
# target_get_dynamic_library will ignore target
|
|
set(png_target dont_care)
|
|
endif()
|
|
target_get_dynamic_library(SDLIMAGE_DYNAMIC_PNG ${png_target})
|
|
message(STATUS "Dynamic libpng: ${SDLIMAGE_DYNAMIC_PNG}")
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_LIBPNG_DYNAMIC=\"${SDLIMAGE_DYNAMIC_PNG}\"")
|
|
else()
|
|
target_link_libraries(${sdl3_image_target_name} PRIVATE PNG::PNG)
|
|
endif()
|
|
endif()
|
|
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE
|
|
LOAD_PNG
|
|
SAVE_PNG=$<BOOL:${SDLIMAGE_PNG_SAVE}>
|
|
)
|
|
endif()
|
|
|
|
list(APPEND SDLIMAGE_BACKENDS PNM)
|
|
set(SDLIMAGE_PNM_ENABLED FALSE)
|
|
if(SDLIMAGE_PNM)
|
|
set(SDLIMAGE_PNM_ENABLED TRUE)
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_PNM)
|
|
endif()
|
|
|
|
list(APPEND SDLIMAGE_BACKENDS QOI)
|
|
set(SDLIMAGE_QOI_ENABLED FALSE)
|
|
if(SDLIMAGE_QOI)
|
|
set(SDLIMAGE_QOI_ENABLED TRUE)
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_QOI)
|
|
endif()
|
|
|
|
list(APPEND SDLIMAGE_BACKENDS SVG)
|
|
set(SDLIMAGE_SVG_ENABLED FALSE)
|
|
if(SDLIMAGE_SVG)
|
|
set(SDLIMAGE_SVG_ENABLED TRUE)
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_SVG)
|
|
endif()
|
|
|
|
list(APPEND SDLIMAGE_BACKENDS TGA)
|
|
set(SDLIMAGE_TGA_ENABLED FALSE)
|
|
if(SDLIMAGE_TGA)
|
|
set(SDLIMAGE_TGA_ENABLED TRUE)
|
|
if(SDLIMAGE_TGA_ENABLED)
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE
|
|
LOAD_TGA
|
|
SAVE_TGA=$<BOOL:${SDLIMAGE_TGA_SAVE}>
|
|
)
|
|
else()
|
|
# Variable is used by test suite
|
|
set(SDLIMAGE_TGA_SAVE OFF)
|
|
endif()
|
|
endif()
|
|
|
|
list(APPEND SDLIMAGE_BACKENDS TIF)
|
|
set(SDLIMAGE_TIF_ENABLED FALSE)
|
|
if(SDLIMAGE_TIF)
|
|
if(SDLIMAGE_BACKEND_IMAGEIO OR SDLIMAGE_BACKEND_WIC)
|
|
set(SDLIMAGE_TIF_ENABLED TRUE)
|
|
else()
|
|
if(SDLIMAGE_TIF_VENDORED)
|
|
set(SDLIMAGE_TIF_ENABLED TRUE)
|
|
message(STATUS "${PROJECT_NAME}: Using vendored libtiff")
|
|
# tiff-cxx variable is used by vendored libtiff
|
|
set(tiff-cxx OFF CACHE BOOL "libtiff: C++ API" FORCE)
|
|
# tiff-tests variable is used by vendored libtiff
|
|
set(tiff-tests OFF CACHE BOOL "libtiff: tests" FORCE)
|
|
# tiff-opengl variable is used by vendored libtiff
|
|
set(tiff-opengl OFF CACHE BOOL "libtiff: OpenGL option" FORCE)
|
|
# jpeg variable is used by vendored libtiff
|
|
set(jpeg OFF CACHE BOOL "libtiff: jpeg option" FORCE)
|
|
# libdeflate variable is used by vendored libtiff
|
|
set(libdeflate OFF CACHE BOOL "libtiff: libdeflate option" FORCE)
|
|
# DEFLATE_FOUND variable is used by vendored libtiff
|
|
set(DEFLATE_FOUND OFF CACHE BOOL "libtiff: libdeflate option" FORCE)
|
|
# zlib variable is used by vendored libtiff (controls use of `find_package`)
|
|
set(zlib OFF CACHE BOOL "libtiff: find zlib using find_package" FORCE)
|
|
# ZLIB_FOUND is used by vendored libtiff
|
|
set(ZLIB_FOUND "")
|
|
# lerc variable is used by vendored libtiff
|
|
set(lerc OFF CACHE BOOL "libtiff: lerc option" FORCE)
|
|
# lzma variable is used by vendored libtiff
|
|
set(lzma OFF CACHE BOOL "libtiff: lzma option" FORCE)
|
|
# webp variable is used by vendored libtiff
|
|
set(webp OFF CACHE BOOL "libtiff: webp option" FORCE)
|
|
# zstd variable is used by vendored libtiff
|
|
set(zstd OFF CACHE BOOL "libtiff: zstd option" FORCE)
|
|
# ZSTD_FOUND variable is used by vendored libtiff
|
|
set(ZSTD_FOUND OFF)
|
|
# WEBP_LIBRARY variable is used by vendored libtiff
|
|
set(WEBP_LIBRARY "")
|
|
sdl_check_project_in_subfolder(external/libtiff libtiff SDLIMAGE_VENDORED)
|
|
set(BUILD_SHARED_LIBS ${SDLIMAGE_TIF_SHARED})
|
|
add_subdirectory(external/libtiff external/libtiff-build EXCLUDE_FROM_ALL)
|
|
register_license(tiff external/libtiff/LICENSE.md)
|
|
add_library(TIFF::TIFF ALIAS tiff)
|
|
set(SDLIMAGE_TIF_TARGET "TIFF::tiff")
|
|
if(SDLIMAGE_TIF_SHARED OR NOT SDLIMAGE_BUILD_SHARED_LIBS)
|
|
list(APPEND INSTALL_EXTRA_TARGETS tiff)
|
|
endif()
|
|
set_target_properties(tiff PROPERTIES EXPORT_NAME external_libtiff)
|
|
add_library(SDL3_image::external_libtiff ALIAS tiff)
|
|
if(NOT SDLIMAGE_TIF_SHARED)
|
|
list(APPEND PC_LIBS -l$<TARGET_FILE_BASE_NAME:tiff>)
|
|
endif()
|
|
elseif(SDLIMAGE_TIF_SHARED AND DEFINED SDLIMAGE_DYNAMIC_TIF AND EXISTS "${SDLIMAGE_DYNAMIC_TIF}")
|
|
message(STATUS "${PROJECT_NAME}: Using libtiff from CMake variable")
|
|
set(SDLIMAGE_TIF_ENABLED TRUE)
|
|
set(SDLIMAGE_TIF_TARGET "tiff-non-existing-target")
|
|
else()
|
|
find_package(TIFF ${required})
|
|
if(TIFF_FOUND)
|
|
message(STATUS "${PROJECT_NAME}: Using system libtiff")
|
|
set(SDLIMAGE_TIF_ENABLED TRUE)
|
|
if(NOT SDLIMAGE_TIF_SHARED)
|
|
list(APPEND PC_REQUIRES libtiff-4)
|
|
endif()
|
|
if(TARGET TIFF::tiff)
|
|
# introduced in CMake 3.28
|
|
# TIFF::TIFF still exists, but it is an INTERFACE library linking to TIFF::tiff (no ALIAS library)
|
|
set(SDLIMAGE_TIF_TARGET "TIFF::tiff")
|
|
else()
|
|
set(SDLIMAGE_TIF_TARGET "TIFF::TIFF")
|
|
endif()
|
|
else()
|
|
message(${fatal_error} "libtiff NOT found")
|
|
endif()
|
|
endif()
|
|
if(SDLIMAGE_TIF_ENABLED)
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_TIF)
|
|
if(SDLIMAGE_TIF_SHARED)
|
|
if(NOT DEFINED SDLIMAGE_DYNAMIC_TIF)
|
|
target_include_directories(${sdl3_image_target_name} PRIVATE
|
|
$<TARGET_PROPERTY:${SDLIMAGE_TIF_TARGET},INCLUDE_DIRECTORIES>
|
|
$<TARGET_PROPERTY:${SDLIMAGE_TIF_TARGET},INTERFACE_INCLUDE_DIRECTORIES>
|
|
$<TARGET_PROPERTY:${SDLIMAGE_TIF_TARGET},INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
|
|
)
|
|
if(SDLIMAGE_TIF_VENDORED)
|
|
add_dependencies(${sdl3_image_target_name} ${SDLIMAGE_TIF_TARGET})
|
|
endif()
|
|
else()
|
|
# target_get_dynamic_library will ignore target
|
|
set(SDLIMAGE_TIF_TARGET dont_care)
|
|
endif()
|
|
target_get_dynamic_library(SDLIMAGE_DYNAMIC_TIF ${SDLIMAGE_TIF_TARGET})
|
|
message(STATUS "Dynamic libtiff: ${SDLIMAGE_DYNAMIC_TIF}")
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_TIF_DYNAMIC=\"${SDLIMAGE_DYNAMIC_TIF}\"")
|
|
else()
|
|
target_link_libraries(${sdl3_image_target_name} PRIVATE ${SDLIMAGE_TIF_TARGET})
|
|
endif()
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
list(APPEND SDLIMAGE_BACKENDS WEBP)
|
|
set(SDLIMAGE_WEBP_ENABLED FALSE)
|
|
if(SDLIMAGE_WEBP)
|
|
# missing cpufeatures
|
|
if(SDLIMAGE_WEBP_VENDORED)
|
|
set(SDLIMAGE_WEBP_ENABLED TRUE)
|
|
set(WEBP_BUILD_ANIM_UTILS OFF CACHE BOOL "" FORCE)
|
|
set(WEBP_BUILD_CWEBP OFF CACHE BOOL "" FORCE)
|
|
set(WEBP_BUILD_DWEBP OFF CACHE BOOL "" FORCE)
|
|
set(WEBP_BUILD_GIF2WEBP OFF CACHE BOOL "" FORCE)
|
|
set(WEBP_BUILD_IMG2WEBP OFF CACHE BOOL "" FORCE)
|
|
set(WEBP_BUILD_VWEBP OFF CACHE BOOL "" FORCE)
|
|
set(WEBP_BUILD_WEBPINFO OFF CACHE BOOL "" FORCE)
|
|
set(WEBP_BUILD_LIBWEBPMUX ON CACHE BOOL "" FORCE)
|
|
set(WEBP_BUILD_WEBPMUX ON CACHE BOOL "" FORCE)
|
|
set(WEBP_BUILD_EXTRAS OFF CACHE BOOL "" FORCE)
|
|
message(STATUS "${PROJECT_NAME}: Using vendored libwebp")
|
|
sdl_check_project_in_subfolder(external/libwebp libwebp SDLIMAGE_VENDORED)
|
|
set(BUILD_SHARED_LIBS ${SDLIMAGE_WEBP_SHARED})
|
|
add_subdirectory(external/libwebp external/libwebp-build EXCLUDE_FROM_ALL)
|
|
register_license(webp external/libwebp/COPYING)
|
|
target_include_directories(${sdl3_image_target_name} PRIVATE external/libwebp/src)
|
|
add_library(WebP::webp ALIAS webp)
|
|
add_library(WebP::webpdemux ALIAS webpdemux)
|
|
add_library(WebP::libwebpmux ALIAS libwebpmux)
|
|
if(SDLIMAGE_WEBP_SHARED OR NOT SDLIMAGE_BUILD_SHARED_LIBS)
|
|
list(APPEND INSTALL_EXTRA_TARGETS webp webpdemux libwebpmux)
|
|
if(NOT SDLIMAGE_WEBP_SHARED)
|
|
list(APPEND INSTALL_EXTRA_TARGETS sharpyuv)
|
|
endif()
|
|
endif()
|
|
set_target_properties(webp PROPERTIES EXPORT_NAME "external_libwebp")
|
|
set_target_properties(webpdemux PROPERTIES EXPORT_NAME "external_webpdemux")
|
|
set_target_properties(libwebpmux PROPERTIES EXPORT_NAME "external_libwebpmux")
|
|
set_target_properties(sharpyuv PROPERTIES EXPORT_NAME "external_sharpyuv")
|
|
add_library(SDL3_image::external_libwebp ALIAS webp)
|
|
elseif(SDLIMAGE_WEBP_SHARED AND DEFINED SDLIMAGE_DYNAMIC_WEBP AND EXISTS "${SDLIMAGE_DYNAMIC_WEBP}" AND DEFINED SDLIMAGE_DYNAMIC_WEBPDEMUX AND EXISTS "${SDLIMAGE_DYNAMIC_WEBPDEMUX}" AND DEFINED SDLIMAGE_DYNAMIC_WEBPMUX AND EXISTS "${SDLIMAGE_DYNAMIC_WEBPMUX}")
|
|
message(STATUS "${PROJECT_NAME}: Using libwebp from CMake variable")
|
|
set(SDLIMAGE_WEBP_ENABLED TRUE)
|
|
else()
|
|
find_package(webp ${required})
|
|
if(webp_FOUND)
|
|
message(STATUS "${PROJECT_NAME}: Using system libwebp")
|
|
set(SDLIMAGE_WEBP_ENABLED TRUE)
|
|
if(NOT SDLIMAGE_WEBP_SHARED)
|
|
list(APPEND PC_REQUIRES libwebp libwebpdemux libwebpmux)
|
|
list(APPEND INSTALL_EXTRA_CMAKE_MODULES cmake/Findwebp.cmake)
|
|
endif()
|
|
else()
|
|
message(${fatal_error} "libwebp NOT found")
|
|
endif()
|
|
endif()
|
|
if(SDLIMAGE_WEBP_ENABLED)
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE
|
|
LOAD_WEBP
|
|
SAVE_WEBP=$<BOOL:${SDLIMAGE_WEBP_SAVE}>
|
|
)
|
|
if(SDLIMAGE_WEBP_SHARED)
|
|
if(NOT DEFINED SDLIMAGE_DYNAMIC_WEBP AND NOT DEFINED SDLIMAGE_DYNAMIC_WEBPDEMUX AND NOT DEFINED SDLIMAGE_DYNAMIC_WEBPMUX)
|
|
target_include_directories(${sdl3_image_target_name} PRIVATE
|
|
$<TARGET_PROPERTY:WebP::webp,INCLUDE_DIRECTORIES>
|
|
$<TARGET_PROPERTY:WebP::webp,INTERFACE_INCLUDE_DIRECTORIES>
|
|
$<TARGET_PROPERTY:WebP::webp,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
|
|
$<TARGET_PROPERTY:WebP::webpdemux,INCLUDE_DIRECTORIES>
|
|
$<TARGET_PROPERTY:WebP::webpdemux,INTERFACE_INCLUDE_DIRECTORIES>
|
|
$<TARGET_PROPERTY:WebP::webpdemux,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
|
|
$<TARGET_PROPERTY:WebP::libwebpmux,INCLUDE_DIRECTORIES>
|
|
$<TARGET_PROPERTY:WebP::libwebpmux,INTERFACE_INCLUDE_DIRECTORIES>
|
|
$<TARGET_PROPERTY:WebP::libwebpmux,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
|
|
)
|
|
if(SDLIMAGE_WEBP_VENDORED)
|
|
add_dependencies(${sdl3_image_target_name} WebP::webp WebP::webpdemux WebP::libwebpmux)
|
|
endif()
|
|
endif()
|
|
target_get_dynamic_library(SDLIMAGE_DYNAMIC_WEBPDEMUX WebP::webpdemux)
|
|
message(STATUS "Dynamic libwebpdemux: ${SDLIMAGE_DYNAMIC_WEBPDEMUX}")
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_WEBPDEMUX_DYNAMIC=\"${SDLIMAGE_DYNAMIC_WEBPDEMUX}\"")
|
|
target_get_dynamic_library(SDLIMAGE_DYNAMIC_WEBPMUX WebP::libwebpmux)
|
|
message(STATUS "Dynamic libwebpmux: ${SDLIMAGE_DYNAMIC_WEBPMUX}")
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_WEBPMUX_DYNAMIC=\"${SDLIMAGE_DYNAMIC_WEBPMUX}\"")
|
|
target_get_dynamic_library(SDLIMAGE_DYNAMIC_WEBP WebP::webp)
|
|
message(STATUS "Dynamic libwebp: ${SDLIMAGE_DYNAMIC_WEBP}")
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_WEBP_DYNAMIC=\"${SDLIMAGE_DYNAMIC_WEBP}\"")
|
|
else()
|
|
target_link_libraries(${sdl3_image_target_name} PRIVATE WebP::webp WebP::webpdemux WebP::libwebpmux)
|
|
endif()
|
|
else()
|
|
# Variable is used by test suite
|
|
set(SDLIMAGE_WEBP_SAVE OFF)
|
|
endif()
|
|
endif()
|
|
|
|
list(APPEND SDLIMAGE_BACKENDS XCF)
|
|
set(SDLIMAGE_XCF_ENABLED FALSE)
|
|
if(SDLIMAGE_XCF)
|
|
set(SDLIMAGE_XCF_ENABLED TRUE)
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_XCF)
|
|
endif()
|
|
|
|
list(APPEND SDLIMAGE_BACKENDS XPM)
|
|
set(SDLIMAGE_XPM_ENABLED FALSE)
|
|
if(SDLIMAGE_XPM)
|
|
set(SDLIMAGE_XPM_ENABLED TRUE)
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_XPM)
|
|
endif()
|
|
|
|
list(APPEND SDLIMAGE_BACKENDS XV)
|
|
set(SDLIMAGE_XV_ENABLED FALSE)
|
|
if(SDLIMAGE_XV)
|
|
set(SDLIMAGE_XV_ENABLED TRUE)
|
|
target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_XV)
|
|
endif()
|
|
|
|
# Restore BUILD_SHARED_LIBS
|
|
set(BUILD_SHARED_LIBS ${SDLIMAGE_BUILD_SHARED_LIBS})
|
|
|
|
if(SDLIMAGE_INSTALL)
|
|
install(
|
|
TARGETS ${sdl3_image_target_name}
|
|
EXPORT SDL3ImageExports
|
|
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT devel
|
|
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT library
|
|
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT library
|
|
)
|
|
install(
|
|
FILES "${CMAKE_CURRENT_SOURCE_DIR}/include/SDL3_image/SDL_image.h"
|
|
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/SDL3_image" COMPONENT DEVEL
|
|
)
|
|
|
|
export(TARGETS ${sdl3_image_target_name} ${INSTALL_EXTRA_TARGETS} NAMESPACE "SDL3_image::" FILE "${sdl3_image_target_name}-targets.cmake")
|
|
|
|
if(BUILD_SHARED_LIBS)
|
|
set(pdbdir "${CMAKE_INSTALL_BINDIR}")
|
|
else()
|
|
set(pdbdir "${CMAKE_INSTALL_LIBDIR}")
|
|
endif()
|
|
if(MSVC)
|
|
SDL_install_pdb("${sdl3_image_target_name}" "${pdbdir}")
|
|
endif()
|
|
|
|
if(INSTALL_EXTRA_TARGETS)
|
|
set_property(TARGET ${INSTALL_EXTRA_TARGETS} PROPERTY PUBLIC_HEADER "")
|
|
set(archive_destination)
|
|
if(NOT BUILD_SHARED_LIBS)
|
|
set(archive_destination ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT devel)
|
|
endif()
|
|
install(
|
|
TARGETS ${INSTALL_EXTRA_TARGETS}
|
|
EXPORT SDL3ImageExports
|
|
${archive_destination}
|
|
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT library
|
|
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT library
|
|
)
|
|
if(MSVC)
|
|
foreach(tgt IN LISTS INSTALL_EXTRA_TARGETS)
|
|
SDL_install_pdb("${tgt}" "${pdbdir}")
|
|
endforeach()
|
|
endif()
|
|
endif()
|
|
|
|
if(WIN32 AND NOT MINGW)
|
|
set(SDLIMAGE_INSTALL_CMAKEDIR_ROOT_DEFAULT "cmake")
|
|
else()
|
|
set(SDLIMAGE_INSTALL_CMAKEDIR_ROOT_DEFAULT "${CMAKE_INSTALL_LIBDIR}/cmake")
|
|
endif()
|
|
set(SDLIMAGE_INSTALL_CMAKEDIR_ROOT "${SDLIMAGE_INSTALL_CMAKEDIR_ROOT_DEFAULT}" CACHE STRING "Root folder where to install SDL3_imageConfig.cmake related files (SDL3_image subfolder for MSVC projects)")
|
|
set(SDLIMAGE_PKGCONFIG_INSTALLDIR "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
|
|
|
|
if(WIN32 AND NOT MINGW)
|
|
set(SDLIMAGE_INSTALL_CMAKEDIR "${SDLIMAGE_INSTALL_CMAKEDIR_ROOT}")
|
|
else()
|
|
set(SDLIMAGE_INSTALL_CMAKEDIR "${SDLIMAGE_INSTALL_CMAKEDIR_ROOT}/SDL3_image")
|
|
endif()
|
|
|
|
configure_package_config_file(cmake/SDL3_imageConfig.cmake.in SDL3_imageConfig.cmake
|
|
NO_SET_AND_CHECK_MACRO
|
|
INSTALL_DESTINATION "${SDLIMAGE_INSTALL_CMAKEDIR}"
|
|
)
|
|
write_basic_package_version_file("${PROJECT_BINARY_DIR}/SDL3_imageConfigVersion.cmake"
|
|
COMPATIBILITY AnyNewerVersion
|
|
)
|
|
install(
|
|
FILES
|
|
"${CMAKE_CURRENT_BINARY_DIR}/SDL3_imageConfig.cmake"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/SDL3_imageConfigVersion.cmake"
|
|
${INSTALL_EXTRA_CMAKE_MODULES}
|
|
DESTINATION "${SDLIMAGE_INSTALL_CMAKEDIR}"
|
|
COMPONENT devel
|
|
)
|
|
install(EXPORT SDL3ImageExports
|
|
FILE ${sdl3_image_target_name}-targets.cmake
|
|
NAMESPACE SDL3_image::
|
|
DESTINATION "${SDLIMAGE_INSTALL_CMAKEDIR}"
|
|
COMPONENT devel
|
|
)
|
|
|
|
if(SDLIMAGE_RELOCATABLE)
|
|
file(RELATIVE_PATH SDL_PATH_PREFIX_RELATIVE_TO_PKGCONFIG "${CMAKE_INSTALL_PREFIX}/${SDLIMAGE_PKGCONFIG_INSTALLDIR}" "${CMAKE_INSTALL_PREFIX}")
|
|
string(REGEX REPLACE "[/]+$" "" SDL_PATH_PREFIX_RELATIVE_TO_PKGCONFIG "${SDL_PATH_PREFIX_RELATIVE_TO_PKGCONFIG}")
|
|
set(SDL_PKGCONFIG_PREFIX "\${pcfiledir}/${SDL_PATH_PREFIX_RELATIVE_TO_PKGCONFIG}")
|
|
else()
|
|
set(SDL_PKGCONFIG_PREFIX "${CMAKE_INSTALL_PREFIX}")
|
|
endif()
|
|
|
|
if(IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}")
|
|
set(INCLUDEDIR_FOR_PKG_CONFIG "${CMAKE_INSTALL_INCLUDEDIR}")
|
|
else()
|
|
set(INCLUDEDIR_FOR_PKG_CONFIG "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
|
|
endif()
|
|
if(IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}")
|
|
set(LIBDIR_FOR_PKG_CONFIG "${CMAKE_INSTALL_LIBDIR}")
|
|
else()
|
|
set(LIBDIR_FOR_PKG_CONFIG "\${prefix}/${CMAKE_INSTALL_LIBDIR}")
|
|
endif()
|
|
|
|
string(JOIN " " PC_REQUIRES ${PC_REQUIRES})
|
|
string(JOIN " " PC_LIBS ${PC_LIBS})
|
|
configure_file(cmake/sdl3-image.pc.in sdl3-image.pc @ONLY)
|
|
|
|
# Always install sdl3-image.pc file: libraries might be different between config modes
|
|
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sdl3-image.pc"
|
|
DESTINATION "${SDLIMAGE_PKGCONFIG_INSTALLDIR}" COMPONENT devel)
|
|
|
|
install(FILES "LICENSE.txt"
|
|
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/licenses/${PROJECT_NAME}"
|
|
COMPONENT library
|
|
)
|
|
|
|
foreach(license_name IN LISTS install_license_names)
|
|
install(FILES "${install_license_${license_name}}" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/licenses/${PROJECT_NAME}/optional" RENAME "LICENSE.${license_name}.txt")
|
|
endforeach()
|
|
|
|
if(SDLIMAGE_INSTALL_CPACK)
|
|
if(MSVC)
|
|
set(CPACK_GENERATOR "ZIP")
|
|
else()
|
|
set(CPACK_GENERATOR "TGZ")
|
|
endif()
|
|
configure_file(cmake/CPackProjectConfig.cmake.in CPackProjectConfig.cmake @ONLY)
|
|
set(CPACK_PROJECT_CONFIG_FILE "${PROJECT_BINARY_DIR}/CPackProjectConfig.cmake")
|
|
# CPACK_SOURCE_PACKAGE_FILE_NAME must end with "-src" (so we can block creating a source archive)
|
|
set(CPACK_SOURCE_PACKAGE_FILE_NAME "SDL${PROJECT_VERSION_MAJOR}-${PROJECT_VERSION}-src")
|
|
set(CPACK_PACKAGE_DIRECTORY "${CMAKE_BINARY_DIR}/dist")
|
|
include(CPack)
|
|
endif()
|
|
|
|
if(SDLIMAGE_INSTALL_MAN)
|
|
sdl_get_git_revision_hash(SDLIMAGE_REVISION)
|
|
SDL_generate_manpages(
|
|
HEADERS_DIR "${PROJECT_SOURCE_DIR}/include/SDL3_image"
|
|
SYMBOL "IMG_Init"
|
|
WIKIHEADERS_PL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/build-scripts/wikiheaders.pl"
|
|
REVISION "${SDLIMAGE_REVISION}"
|
|
)
|
|
endif()
|
|
|
|
if(SDLIMAGE_ROOTPROJECT)
|
|
configure_file(cmake/cmake_uninstall.cmake.in cmake_uninstall.cmake IMMEDIATE @ONLY)
|
|
|
|
add_custom_target(uninstall
|
|
COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
|
|
endif()
|
|
endif()
|
|
|
|
if(SDLIMAGE_SAMPLES)
|
|
function(add_sdl_image_example_executable TARGET)
|
|
if(ANDROID)
|
|
add_library(${TARGET} SHARED ${ARGN})
|
|
else()
|
|
add_executable(${TARGET} ${ARGN})
|
|
endif()
|
|
sdl_add_warning_options(${TARGET} WARNING_AS_ERROR ${SDLIMAGE_WERROR})
|
|
sdl_target_link_options_no_undefined(${TARGET})
|
|
target_link_libraries(${TARGET} PRIVATE SDL3_image::${sdl3_image_target_name})
|
|
target_link_libraries(${TARGET} PRIVATE ${sdl3_target_name})
|
|
|
|
if(SDLIMAGE_SAMPLES_INSTALL)
|
|
install(TARGETS ${TARGET}
|
|
RUNTIME DESTINATION "${CMAKE_INSTALL_LIBEXECDIR}/installed-tests/SDL3_image"
|
|
)
|
|
if(MSVC)
|
|
SDL_install_pdb("${TARGET}" "${CMAKE_INSTALL_LIBEXECDIR}/installed-tests/SDL3_image")
|
|
endif()
|
|
endif()
|
|
endfunction()
|
|
add_sdl_image_example_executable(showanim examples/showanim.c)
|
|
add_sdl_image_example_executable(showimage examples/showimage.c)
|
|
add_sdl_image_example_executable(showclipboard examples/showclipboard.c)
|
|
add_sdl_image_example_executable(showgpuimage examples/showgpuimage.c)
|
|
endif()
|
|
|
|
if(SDLIMAGE_TESTS)
|
|
enable_testing()
|
|
add_subdirectory(test)
|
|
endif()
|
|
|
|
|
|
set(available_deps)
|
|
set(unavailable_deps)
|
|
foreach(dep IN LISTS SDLIMAGE_BACKENDS)
|
|
set(var SDLIMAGE_${dep}_ENABLED)
|
|
if(NOT DEFINED ${var})
|
|
message(AUTHOR_WARNING "${var} not defined")
|
|
endif()
|
|
if(${var})
|
|
list(APPEND available_deps ${dep})
|
|
else()
|
|
list(APPEND unavailable_deps ${dep})
|
|
endif()
|
|
endforeach()
|
|
string(JOIN " " avail_str ${available_deps})
|
|
string(TOLOWER "${avail_str}" avail_str)
|
|
string(JOIN " " unavail_str ${unavailable_deps})
|
|
string(TOLOWER "${unavail_str}" unavail_str)
|
|
message(STATUS "SDL3_image backends:")
|
|
message(STATUS "- enabled: ${avail_str}")
|
|
message(STATUS "- disabled: ${unavail_str}")
|