From 4ff27afa450eabd2a827e49ed86fab9e3bf826c5 Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Thu, 23 Jan 2025 03:31:30 +0100
Subject: [PATCH] cmake: allow overriding SDLIMAGE_DYNAMIC_<XXX> variables
CFLAGS are assumed to be configured through CMAKE_C_FLAGS
---
CMakeLists.txt | 171 ++++++++++++++++-----------
build-scripts/build-release.py | 13 ++-
build-scripts/release-info.json | 14 ++-
cmake/PrivateSdlFunctions.cmake | 198 +++++++++++++++++---------------
4 files changed, 225 insertions(+), 171 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 35e996d0..0a0cc03b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -531,6 +531,9 @@ if(SDLIMAGE_AVIF)
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)
@@ -550,17 +553,19 @@ if(SDLIMAGE_AVIF)
SDL_IMAGE_SAVE_AVIF=$<BOOL:${SDLIMAGE_AVIF_SAVE}>
)
if(SDLIMAGE_AVIF_SHARED)
- 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>
- )
- target_get_dynamic_library(dynamic_avif avif)
- message(STATUS "Dynamic libavif: ${dynamic_avif}")
- target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_AVIF_DYNAMIC=\"${dynamic_avif}\"")
- if(SDLIMAGE_AVIF_VENDORED)
- add_dependencies(${sdl3_image_target_name} avif)
+ 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()
@@ -602,6 +607,9 @@ if(SDLIMAGE_JPG)
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)
@@ -616,17 +624,19 @@ if(SDLIMAGE_JPG)
endif()
if(SDLIMAGE_JPG_ENABLED)
if(SDLIMAGE_JPG_SHARED)
- 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>
- )
- target_get_dynamic_library(dynamic_jpeg JPEG::JPEG)
- message(STATUS "Dynamic libjpeg: ${dynamic_jpeg}")
- target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_JPG_DYNAMIC=\"${dynamic_jpeg}\"")
- if(SDLIMAGE_JPG_VENDORED)
- add_dependencies(${sdl3_image_target_name} JPEG::JPEG)
+ 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()
@@ -684,6 +694,9 @@ if(SDLIMAGE_JXL)
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)
@@ -700,17 +713,19 @@ if(SDLIMAGE_JXL)
if(SDLIMAGE_JXL_ENABLED)
target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_JXL)
if(SDLIMAGE_JXL_SHARED)
- 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>
- )
- target_get_dynamic_library(dynamic_jxl libjxl::libjxl)
- message(STATUS "Dynamic libjxl: ${dynamic_jxl}")
- target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_JXL_DYNAMIC=\"${dynamic_jxl}\"")
- if(SDLIMAGE_JXL_VENDORED)
- add_dependencies(${sdl3_image_target_name} libjxl::libjxl)
+ 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()
@@ -766,6 +781,9 @@ if(SDLIMAGE_PNG)
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_PNG_ENABLED TRUE)
else()
find_package(PNG ${required})
if(PNG_FOUND)
@@ -780,17 +798,19 @@ if(SDLIMAGE_PNG)
endif()
if(SDLIMAGE_PNG_ENABLED)
if(SDLIMAGE_PNG_SHARED)
- target_include_directories(${sdl3_image_target_name} PRIVATE
- $<TARGET_PROPERTY:PNG::PNG,INCLUDE_DIRECTORIES>
- $<TARGET_PROPERTY:PNG::PNG,INTERFACE_INCLUDE_DIRECTORIES>
- $<TARGET_PROPERTY:PNG::PNG,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
- )
- target_get_dynamic_library(dynamic_png PNG::PNG)
- message(STATUS "Dynamic libpng: ${dynamic_png}")
- target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_PNG_DYNAMIC=\"${dynamic_png}\"")
- if(SDLIMAGE_PNG_VENDORED)
- add_dependencies(${sdl3_image_target_name} PNG::PNG)
+ if(NOT DEFINED SDLIMAGE_DYNAMIC_PNG)
+ target_include_directories(${sdl3_image_target_name} PRIVATE
+ $<TARGET_PROPERTY:PNG::PNG,INCLUDE_DIRECTORIES>
+ $<TARGET_PROPERTY:PNG::PNG,INTERFACE_INCLUDE_DIRECTORIES>
+ $<TARGET_PROPERTY:PNG::PNG,INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
+ )
+ if(SDLIMAGE_PNG_VENDORED)
+ add_dependencies(${sdl3_image_target_name} PNG::PNG)
+ endif()
endif()
+ target_get_dynamic_library(SDLIMAGE_DYNAMIC_PNG PNG::PNG)
+ message(STATUS "Dynamic libpng: ${SDLIMAGE_DYNAMIC_PNG}")
+ target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_PNG_DYNAMIC=\"${SDLIMAGE_DYNAMIC_PNG}\"")
else()
target_link_libraries(${sdl3_image_target_name} PRIVATE PNG::PNG)
endif()
@@ -868,7 +888,7 @@ if(SDLIMAGE_TIF)
add_subdirectory(external/libtiff EXCLUDE_FROM_ALL)
register_license(tiff external/libtiff/LICENSE.md)
add_library(TIFF::TIFF ALIAS tiff)
- set(SDL2IMAGE_TIF_TARGET "TIFF::tiff")
+ set(SDLIMAGE_TIF_TARGET "TIFF::tiff")
if(SDLIMAGE_TIF_SHARED OR NOT SDLIMAGE_BUILD_SHARED_LIBS)
list(APPEND INSTALL_EXTRA_TARGETS tiff)
endif()
@@ -877,6 +897,10 @@ if(SDLIMAGE_TIF)
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)
@@ -888,9 +912,9 @@ if(SDLIMAGE_TIF)
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(SDL2IMAGE_TIF_TARGET "TIFF::tiff")
+ set(SDLIMAGE_TIF_TARGET "TIFF::tiff")
else()
- set(SDL2IMAGE_TIF_TARGET "TIFF::TIFF")
+ set(SDLIMAGE_TIF_TARGET "TIFF::TIFF")
endif()
else()
message(${fatal_error} "libtiff NOT found")
@@ -899,19 +923,21 @@ if(SDLIMAGE_TIF)
if(SDLIMAGE_TIF_ENABLED)
target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_TIF)
if(SDLIMAGE_TIF_SHARED)
- target_include_directories(${sdl3_image_target_name} PRIVATE
- $<TARGET_PROPERTY:${SDL2IMAGE_TIF_TARGET},INCLUDE_DIRECTORIES>
- $<TARGET_PROPERTY:${SDL2IMAGE_TIF_TARGET},INTERFACE_INCLUDE_DIRECTORIES>
- $<TARGET_PROPERTY:${SDL2IMAGE_TIF_TARGET},INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>
- )
- target_get_dynamic_library(dynamic_tif ${SDL2IMAGE_TIF_TARGET})
- message(STATUS "Dynamic libtiff: ${dynamic_tif}")
- target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_TIF_DYNAMIC=\"${dynamic_tif}\"")
- if(SDLIMAGE_TIF_VENDORED)
- add_dependencies(${sdl3_image_target_name} ${SDL2IMAGE_TIF_TARGET})
+ 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()
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 ${SDL2IMAGE_TIF_TARGET})
+ target_link_libraries(${sdl3_image_target_name} PRIVATE ${SDLIMAGE_TIF_TARGET})
endif()
endif()
endif()
@@ -941,6 +967,9 @@ if(SDLIMAGE_WEBP)
set_target_properties(webpdemux PROPERTIES EXPORT_NAME "external_webpdemux")
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}")
+ message(STATUS "${PROJECT_NAME}: Using libwebp from CMake variable")
+ set(SDLIMAGE_WEBP_ENABLED TRUE)
else()
find_package(webp ${required})
if(webp_FOUND)
@@ -957,23 +986,25 @@ if(SDLIMAGE_WEBP)
if(SDLIMAGE_WEBP_ENABLED)
target_compile_definitions(${sdl3_image_target_name} PRIVATE LOAD_WEBP)
if(SDLIMAGE_WEBP_SHARED)
- 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_get_dynamic_library(dynamic_webpdemux WebP::webpdemux)
- message(STATUS "Dynamic libwebpdemux: ${dynamic_webpdemux}")
- target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_WEBPDEMUX_DYNAMIC=\"${dynamic_webpdemux}\"")
- target_get_dynamic_library(dynamic_webp WebP::webp)
- message(STATUS "Dynamic libwebp: ${dynamic_webp}")
- target_compile_definitions(${sdl3_image_target_name} PRIVATE "LOAD_WEBP_DYNAMIC=\"${dynamic_webp}\"")
- if(SDLIMAGE_WEBP_VENDORED)
- add_dependencies(${sdl3_image_target_name} WebP::webp WebP::webpdemux)
+ if(NOT DEFINED SDLIMAGE_DYNAMIC_WEBP AND NOT DEFINED SDLIMAGE_DYNAMIC_WEBPDEMUX)
+ 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>
+ )
+ if(SDLIMAGE_WEBP_VENDORED)
+ add_dependencies(${sdl3_image_target_name} WebP::webp WebP::webpdemux)
+ 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_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)
endif()
diff --git a/build-scripts/build-release.py b/build-scripts/build-release.py
index f3faa06c..27b28fca 100755
--- a/build-scripts/build-release.py
+++ b/build-scripts/build-release.py
@@ -700,7 +700,8 @@ def verify_mingw_library(self, triplet: str, path: Path):
libraries = re.findall(r"DLL Name: ([^\n]+)", objdump_output)
logger.info("%s (%s) libraries: %r", path, triplet, libraries)
illegal_libraries = list(filter(RE_ILLEGAL_MINGW_LIBRARIES.match, libraries))
- logger.error("Detected 'illegal' libraries: %r", illegal_libraries)
+ if illegal_libraries:
+ logger.error("Detected 'illegal' libraries: %r", illegal_libraries)
if illegal_libraries:
raise Exception(f"{path} links to illegal libraries: {illegal_libraries}")
@@ -834,7 +835,16 @@ def extract_filter(member: tarfile.TarInfo, path: str, /):
"ARCH": arch,
"DEP_PREFIX": str(mingw_deps_path / triplet),
})
+ my_cflags = f"-ffile-prefix-map={self.root}=/src/{self.project}"
extra_args = configure_text_list(text_list=self.release_info["mingw"]["cmake"]["args"], context=context)
+ try:
+ extra_cflags_i, extra_cmake_c_flags = next((arg_i, a) for (arg_i, a) in enumerate(extra_args) if a.startswith("-DCMAKE_C_FLAGS"))
+ extra_cflags = extra_cmake_c_flags.removeprefix("-DCMAKE_C_FLAGS=")
+ assert extra_cflags[:1] not in "'\"" and extra_cflags[:-1] not in "'\""
+ extra_args[extra_cflags_i] = f"-DCMAKE_C_FLAGS={extra_cflags} {my_cflags}"
+ except StopIteration:
+ extra_args.append(f"-DCMAKE_C_FLAGS={my_cflags}")
+
build_path = build_parent_dir / f"build-{triplet}"
install_path = build_parent_dir / f"install-{triplet}"
@@ -851,7 +861,6 @@ def extract_filter(member: tarfile.TarInfo, path: str, /):
f"cmake",
f"-S", str(self.root), "-B", str(build_path),
f"-DCMAKE_BUILD_TYPE={build_type}",
- f'''-DCMAKE_C_FLAGS="-ffile-prefix-map={self.root}=/src/{self.project}"''',
f'''-DCMAKE_CXX_FLAGS="-ffile-prefix-map={self.root}=/src/{self.project}"''',
f"-DCMAKE_PREFIX_PATH={mingw_deps_path / triplet}",
f"-DCMAKE_INSTALL_PREFIX={install_path}",
diff --git a/build-scripts/release-info.json b/build-scripts/release-info.json
index f60dc81e..ee8617cd 100644
--- a/build-scripts/release-info.json
+++ b/build-scripts/release-info.json
@@ -36,7 +36,7 @@
"archs": ["x86", "x64"],
"args": [
"-DBUILD_SHARED_LIBS=ON",
- "-DSDLIMAGE_AVIF=OFF",
+ "-DSDLIMAGE_AVIF=ON",
"-DSDLIMAGE_BMP=ON",
"-DSDLIMAGE_GIF=ON",
"-DSDLIMAGE_JPG=ON",
@@ -48,15 +48,21 @@
"-DSDLIMAGE_QOI=ON",
"-DSDLIMAGE_SVG=ON",
"-DSDLIMAGE_TGA=ON",
- "-DSDLIMAGE_TIF=OFF",
- "-DSDLIMAGE_WEBP=OFF",
+ "-DSDLIMAGE_TIF=ON",
+ "-DSDLIMAGE_WEBP=ON",
"-DSDLIMAGE_XCF=ON",
"-DSDLIMAGE_XPM=ON",
"-DSDLIMAGE_XV=ON",
"-DSDLIMAGE_RELOCATABLE=ON",
"-DSDLIMAGE_SAMPLES=OFF",
"-DSDLIMAGE_TESTS=OFF",
- "-DSDLIMAGE_VENDORED=OFF"
+ "-DSDLIMAGE_VENDORED=OFF",
+ "-DSDLIMAGE_DEPS_SHARED=ON",
+ "-DCMAKE_C_FLAGS=-I@<@PROJECT_ROOT@>@/VisualC/external/include",
+ "-DSDLIMAGE_DYNAMIC_AVIF=@<@PROJECT_ROOT@>@/VisualC/external/optional/@<@ARCH@>@/libavif-16.dll",
+ "-DSDLIMAGE_DYNAMIC_TIF=@<@PROJECT_ROOT@>@/VisualC/external/optional/@<@ARCH@>@/libtiff-6.dll",
+ "-DSDLIMAGE_DYNAMIC_WEBP=@<@PROJECT_ROOT@>@/VisualC/external/optional/@<@ARCH@>@/libwebp-7.dll",
+ "-DSDLIMAGE_DYNAMIC_WEBPDEMUX=@<@PROJECT_ROOT@>@/VisualC/external/optional/@<@ARCH@>@/libwebpdemux-2.dll"
],
"shared-static": "args"
},
diff --git a/cmake/PrivateSdlFunctions.cmake b/cmake/PrivateSdlFunctions.cmake
index 5fde085f..e6965fae 100644
--- a/cmake/PrivateSdlFunctions.cmake
+++ b/cmake/PrivateSdlFunctions.cmake
@@ -111,114 +111,122 @@ endfunction()
function(target_get_dynamic_library DEST TARGET)
set(result)
- get_actual_target(TARGET)
- if(WIN32)
- # Use the target dll of the import library
- set(props_to_check IMPORTED_IMPLIB)
- if(CMAKE_BUILD_TYPE)
- list(APPEND props_to_check IMPORTED_IMPLIB_${CMAKE_BUILD_TYPE})
+ if(DEFINED ${DEST})
+ if(NOT EXISTS "${${DEST}}")
+ message(FATAL_ERROR "${DEST}=${${DEST}} does not exist")
endif()
- list(APPEND props_to_check IMPORTED_LOCATION)
- if(CMAKE_BUILD_TYPE)
- list(APPEND props_to_check IMPORTED_LOCATION_${CMAKE_BUILD_TYPE})
- endif()
- foreach (config_type ${CMAKE_CONFIGURATION_TYPES} RELEASE DEBUG RELWITHDEBINFO MINSIZEREL)
- list(APPEND props_to_check IMPORTED_IMPLIB_${config_type})
- list(APPEND props_to_check IMPORTED_LOCATION_${config_type})
- endforeach()
+ get_filename_component(filename ${${DEST}} NAME)
+ set(${DEST} ${filename} PARENT_SCOPE)
+ else()
+ get_actual_target(TARGET)
+ if(WIN32)
+ # Use the target dll of the import library
+ set(props_to_check IMPORTED_IMPLIB)
+ if(CMAKE_BUILD_TYPE)
+ list(APPEND props_to_check IMPORTED_IMPLIB_${CMAKE_BUILD_TYPE})
+ endif()
+ list(APPEND props_to_check IMPORTED_LOCATION)
+ if(CMAKE_BUILD_TYPE)
+ list(APPEND props_to_check IMPORTED_LOCATION_${CMAKE_BUILD_TYPE})
+ endif()
+ foreach (config_type ${CMAKE_CONFIGURATION_TYPES} RELEASE DEBUG RELWITHDEBINFO MINSIZEREL)
+ list(APPEND props_to_check IMPORTED_IMPLIB_${config_type})
+ list(APPEND props_to_check IMPORTED_LOCATION_${config_type})
+ endforeach()
- foreach(prop_to_check ${props_to_check})
- if(NOT result)
- get_target_property(propvalue "${TARGET}" ${prop_to_check})
- if(propvalue AND EXISTS "${propvalue}")
- win32_implib_identify_dll(result "${propvalue}" NOTFATAL)
+ foreach(prop_to_check ${props_to_check})
+ if(NOT result)
+ get_target_property(propvalue "${TARGET}" ${prop_to_check})
+ if(propvalue AND EXISTS "${propvalue}")
+ win32_implib_identify_dll(result "${propvalue}" NOTFATAL)
+ endif()
endif()
- endif()
- endforeach()
- else()
- # 1. find the target library a file might be symbolic linking to
- # 2. find all other files in the same folder that symolic link to it
- # 3. sort all these files, and select the 1st item on Linux, and last on Macos
- set(location_properties IMPORTED_LOCATION)
- if(CMAKE_BUILD_TYPE)
- list(APPEND location_properties IMPORTED_LOCATION_${CMAKE_BUILD_TYPE})
- endif()
- foreach (config_type ${CMAKE_CONFIGURATION_TYPES} RELEASE DEBUG RELWITHDEBINFO MINSIZEREL)
- list(APPEND location_properties IMPORTED_LOCATION_${config_type})
- endforeach()
- if(APPLE)
- set(valid_shared_library_regex "\\.[0-9]+\\.dylib$")
+ endforeach()
else()
- set(valid_shared_library_regex "\\.so\\.([0-9.]+)?[0-9]")
- endif()
- foreach(location_property ${location_properties})
- if(NOT result)
- get_target_property(library_path "${TARGET}" ${location_property})
- message(DEBUG "get_target_property(${TARGET} ${location_propert}) -> ${library_path}")
- if(EXISTS "${library_path}")
- get_filename_component(library_path "${library_path}" ABSOLUTE)
- while (IS_SYMLINK "${library_path}")
- read_absolute_symlink(library_path "${library_path}")
- endwhile()
- message(DEBUG "${TARGET} -> ${library_path}")
- get_filename_component(libdir "${library_path}" DIRECTORY)
- file(GLOB subfiles "${libdir}/*")
- set(similar_files "${library_path}")
- foreach(subfile ${subfiles})
- if(IS_SYMLINK "${subfile}")
- read_absolute_symlink(subfile_target "${subfile}")
- while(IS_SYMLINK "${subfile_target}")
- read_absolute_symlink(subfile_target "${subfile_target}")
- endwhile()
- get_filename_component(subfile_target "${subfile_target}" ABSOLUTE)
- if(subfile_target STREQUAL library_path AND subfile MATCHES "${valid_shared_library_regex}")
- list(APPEND similar_files "${subfile}")
+ # 1. find the target library a file might be symbolic linking to
+ # 2. find all other files in the same folder that symolic link to it
+ # 3. sort all these files, and select the 1st item on Linux, and last on Macos
+ set(location_properties IMPORTED_LOCATION)
+ if(CMAKE_BUILD_TYPE)
+ list(APPEND location_properties IMPORTED_LOCATION_${CMAKE_BUILD_TYPE})
+ endif()
+ foreach (config_type ${CMAKE_CONFIGURATION_TYPES} RELEASE DEBUG RELWITHDEBINFO MINSIZEREL)
+ list(APPEND location_properties IMPORTED_LOCATION_${config_type})
+ endforeach()
+ if(APPLE)
+ set(valid_shared_library_regex "\\.[0-9]+\\.dylib$")
+ else()
+ set(valid_shared_library_regex "\\.so\\.([0-9.]+)?[0-9]")
+ endif()
+ foreach(location_property ${location_properties})
+ if(NOT result)
+ get_target_property(library_path "${TARGET}" ${location_property})
+ message(DEBUG "get_target_property(${TARGET} ${location_propert}) -> ${library_path}")
+ if(EXISTS "${library_path}")
+ get_filename_component(library_path "${library_path}" ABSOLUTE)
+ while (IS_SYMLINK "${library_path}")
+ read_absolute_symlink(library_path "${library_path}")
+ endwhile()
+ message(DEBUG "${TARGET} -> ${library_path}")
+ get_filename_component(libdir "${library_path}" DIRECTORY)
+ file(GLOB subfiles "${libdir}/*")
+ set(similar_files "${library_path}")
+ foreach(subfile ${subfiles})
+ if(IS_SYMLINK "${subfile}")
+ read_absolute_symlink(subfile_target "${subfile}")
+ while(IS_SYMLINK "${subfile_target}")
+ read_absolute_symlink(subfile_target "${subfile_target}")
+ endwhile()
+ get_filename_component(subfile_target "${subfile_target}" ABSOLUTE)
+ if(subfile_target STREQUAL library_path AND subfile MATCHES "${valid_shared_library_regex}")
+ list(APPEND similar_files "${subfile}")
+ endif()
endif()
+ endforeach()
+ list(SORT similar_files)
+ message(DEBUG "files that are similar to \"${library_path}\"=${similar_files}")
+ if(APPLE)
+ list(REVERSE similar_files)
endif()
- endforeach()
- list(SORT similar_files)
- message(DEBUG "files that are similar to \"${library_path}\"=${similar_files}")
- if(APPLE)
- list(REVERSE similar_files)
+ list(GET similar_files 0 item)
+ get_filename_component(result "${item}" NAME)
endif()
- list(GET similar_files 0 item)
- get_filename_component(result "${item}" NAME)
endif()
- endif()
- endforeach()
- endif()
- if(result)
- string(TOLOWER "${result}" result_lower)
- if(WIN32 OR OS2)
- if(NOT result_lower MATCHES ".*dll")
- message(FATAL_ERROR "\"${result}\" is not a .dll library")
- endif()
- elseif(APPLE)
- if(NOT result_lower MATCHES ".*dylib.*")
- message(FATAL_ERROR "\"${result}\" is not a .dylib shared library")
+ endforeach()
+ endif()
+ if(result)
+ string(TOLOWER "${result}" result_lower)
+ if(WIN32 OR OS2)
+ if(NOT result_lower MATCHES ".*dll")
+ message(FATAL_ERROR "\"${result}\" is not a .dll library")
+ endif()
+ elseif(APPLE)
+ if(NOT result_lower MATCHES ".*dylib.*")
+ message(FATAL_ERROR "\"${result}\" is not a .dylib shared library")
+ endif()
+ else()
+ if(NOT result_lower MATCHES ".*so.*")
+ message(FATAL_ERROR "\"${result}\" is not a .so shared library")
+ endif()
endif()
else()
- if(NOT result_lower MATCHES ".*so.*")
- message(FATAL_ERROR "\"${result}\" is not a .so shared library")
+ get_target_property(target_type ${TARGET} TYPE)
+ if(target_type MATCHES "SHARED_LIBRARY|MODULE_LIBRARY")
+ # OK
+ elseif(target_type MATCHES "STATIC_LIBRARY|OBJECT_LIBRARY|INTERFACE_LIBRARY|EXECUTABLE")
+ message(SEND_ERROR "${TARGET} is not a shared library, but has type=${target_type}")
+ else()
+ message(WARNING "Unable to extract dynamic library from target=${TARGET}, type=${target_type}.")
+ endif()
+ # TARGET_SONAME_FILE is not allowed for DLL target platforms.
+ if(WIN32)
+ set(result "$<TARGET_FILE_NAME:${TARGET}>")
+ else()
+
(Patch may be truncated, please check the link at the top of this post.)