SDL_image: cmake: remove ability to build standalone tests + relocatable sdl3-image.pc

From 26372c2e26ca50329e309cdd396fb9e234ad96ab Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Mon, 17 Jul 2023 18:13:27 +0200
Subject: [PATCH] cmake: remove ability to build standalone tests + relocatable
 sdl3-image.pc

---
 CMakeLists.txt                  | 23 ++++++----
 cmake/SDL3_imageConfig.cmake.in | 78 +++++++++++++++++----------------
 cmake/sdl3-image.pc.in          |  2 +-
 cmake/test/CMakeLists.txt       |  2 +-
 test/CMakeLists.txt             | 29 +-----------
 5 files changed, 58 insertions(+), 76 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 183af295..bbcf859a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -43,11 +43,15 @@ else()
 endif()
 
 set(sdl3image_install_enableable ON)
-if ((TARGET SDL3 OR TARGET SDL3-static) AND SDL3_DISABLE_INSTALL)
+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(sdl3image_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)
@@ -65,6 +69,7 @@ option(SDL3IMAGE_SAMPLES "Build the SDL3_image sample program(s)" ${SDL3IMAGE_SA
 cmake_dependent_option(SDL3IMAGE_SAMPLES_INSTALL "Install the SDL3_image sample program(s)" OFF "SDL3IMAGE_SAMPLES;SDL3IMAGE_INSTALL" OFF)
 
 option(SDL3IMAGE_TESTS "Build unit tests?" OFF)
+option(SDL3IMAGE_TESTS_INSTALL "Install unit tests?" OFF)
 
 option(SDL3IMAGE_BACKEND_STB "Use stb_image for loading JPEG and PNG files" ON)
 cmake_dependent_option(SDL3IMAGE_BACKEND_WIC "Add WIC backend (Windows Imaging Component)" OFF WIN32 OFF)
@@ -172,7 +177,7 @@ else()
     set(sdl3_target_name SDL3::SDL3)
 endif()
 
-if(NOT TARGET SDL3::Headers)
+if(NOT TARGET SDL3::Headers OR NOT TARGET ${sdl3_target_name})
     find_package(SDL3 ${SDL_REQUIRED_VERSION} REQUIRED COMPONENTS ${sdl_required_components})
 endif()
 
@@ -645,6 +650,7 @@ if(SDL3IMAGE_WEBP)
         add_library(WebP::webpdemux ALIAS webpdemux)
         list(APPEND INSTALL_EXTRA_TARGETS webp webpdemux)
         set_target_properties(webp PROPERTIES EXPORT_NAME "external_libwebp")
+        set_target_properties(webpdemux PROPERTIES EXPORT_NAME "external_webpdemux")
         add_library(SDL3_image::external_libwebp ALIAS webp)
     else()
         message(STATUS "${PROJECT_NAME}: Using system libwebp")
@@ -721,6 +727,7 @@ if(SDL3IMAGE_INSTALL)
         set(SDL3IMAGE_INSTALL_CMAKEDIR_ROOT_DEFAULT "${CMAKE_INSTALL_LIBDIR}/cmake")
     endif()
     set(SDL3IMAGE_INSTALL_CMAKEDIR_ROOT "${SDL3IMAGE_INSTALL_CMAKEDIR_ROOT_DEFAULT}" CACHE STRING "Root folder where to install SDL3Config.cmake related files (SDL3 subfolder for MSVC projects)")
+    set(SDLIMAGE_PKGCONFIG_INSTALLDIR "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
 
     if(WIN32 AND NOT MINGW)
         set(SDL3IMAGE_INSTALL_CMAKEDIR "${SDL3IMAGE_INSTALL_CMAKEDIR_ROOT}")
@@ -752,19 +759,17 @@ if(SDL3IMAGE_INSTALL)
         COMPONENT devel
     )
 
+    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}")
+
     string(JOIN " " PC_REQUIRES ${PC_REQUIRES})
     string(JOIN " " PC_LIBS ${PC_LIBS})
     configure_file(cmake/sdl3-image.pc.in sdl3-image.pc @ONLY)
 
-    if(CMAKE_SYSTEM_NAME MATCHES FreeBSD)
-        # FreeBSD uses ${PREFIX}/libdata/pkgconfig
-        set(PC_DESTDIR "libdata/pkgconfig")
-    else()
-        set(PC_DESTDIR "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
-    endif()
     # Always install sdl3-image.pc file: libraries might be different between config modes
     install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sdl3-image.pc"
-        DESTINATION "${PC_DESTDIR}" COMPONENT devel)
+        DESTINATION "${SDLIMAGE_PKGCONFIG_INSTALLDIR}" COMPONENT devel)
 
     install(FILES "LICENSE.txt"
         DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/licenses/${PROJECT_NAME}"
diff --git a/cmake/SDL3_imageConfig.cmake.in b/cmake/SDL3_imageConfig.cmake.in
index 95012e97..ec35ceea 100644
--- a/cmake/SDL3_imageConfig.cmake.in
+++ b/cmake/SDL3_imageConfig.cmake.in
@@ -37,56 +37,58 @@ set(SDL3IMAGE_BACKEND_WIC       @SDL3IMAGE_BACKEND_WIC@)
 
 set(SDL3IMAGE_SDL3_REQUIRED_VERSION  @SDL_REQUIRED_VERSION@)
 
-if(NOT SDL3IMAGE_VENDORED)
-    set(_sdl_cmake_module_path "${CMAKE_MODULE_PATH}")
-    list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
+if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/SDL3_image-shared-targets.cmake")
+    include("${CMAKE_CURRENT_LIST_DIR}/SDL3_image-shared-targets.cmake")
 endif()
 
-include(CMakeFindDependencyMacro)
+if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/SDL3_image-static-targets.cmake")
 
-if(SDL3IMAGE_AVIF AND NOT SDL3IMAGE_VENDORED AND NOT TARGET avif)
-    find_dependency(libavif @LIBAVIF_MINIMUM_VERSION@)
-endif()
+    if(SDL3IMAGE_VENDORED)
+        if(SDL3IMAGE_JXL)
+            include(CheckLanguage)
+            check_language(CXX)
+            if(NOT CMAKE_CXX_COMPILER AND NOT _sdl3image_nowarning)
+                message(WARNING "CXX language not enabled. Linking to SDL3_image::SDL3_image-static might fail.")
+            endif()
+        endif()
+    else()
+        set(_sdl_cmake_module_path "${CMAKE_MODULE_PATH}")
+        list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
 
-if(SDL3IMAGE_JPG AND NOT SDL3IMAGE_VENDORED AND NOT TARGET JPEG::JPEG)
-    find_dependency(JPEG)
-endif()
+        include(CMakeFindDependencyMacro)
 
-if(SDL3IMAGE_JXL AND NOT SDL3IMAGE_VENDORED AND NOT TARGET libjxl::libjxl)
-    list(APPEND libjxl_ROOT "${CMAKE_CURRENT_LIST_DIR}")
-    find_dependency(libjxl)
-endif()
+        if(SDL3IMAGE_AVIF AND NOT TARGET avif)
+            find_dependency(libavif @LIBAVIF_MINIMUM_VERSION@)
+        endif()
 
-if(SDL3IMAGE_PNG AND NOT SDL3IMAGE_VENDORED AND NOT TARGET PNG::PNG)
-    find_dependency(PNG)
-endif()
+        if(SDL3IMAGE_JPG AND NOT TARGET JPEG::JPEG)
+            find_dependency(JPEG)
+        endif()
 
-if(SDL3IMAGE_TIF AND NOT SDL3IMAGE_VENDORED AND NOT TARGET TIFF::TIFF)
-    find_dependency(TIFF)
-endif()
+        if(SDL3IMAGE_JXL AND NOT TARGET libjxl::libjxl)
+            list(APPEND libjxl_ROOT "${CMAKE_CURRENT_LIST_DIR}")
+            find_dependency(libjxl)
+        endif()
 
-if(SDL3IMAGE_WEBP AND NOT SDL3IMAGE_VENDORED AND NOT TARGET WebP::webp)
-    list(APPEND webp_ROOT "${CMAKE_CURRENT_LIST_DIR}")
-    find_dependency(webp)
-endif()
+        if(SDL3IMAGE_PNG AND NOT TARGET PNG::PNG)
+            find_dependency(PNG)
+        endif()
 
-#FIXME: can't add SDL3IMAGE_SDL3_REQUIRED_VERSION since not all SDL3 installs ship SDL3ConfigVersion.cmake
-if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/SDL3_image-shared-targets.cmake")
-    include("${CMAKE_CURRENT_LIST_DIR}/SDL3_image-shared-targets.cmake")
-endif()
+        if(SDL3IMAGE_TIF AND NOT TARGET TIFF::TIFF)
+            find_dependency(TIFF)
+        endif()
+
+        if(SDL3IMAGE_WEBP AND NOT TARGET WebP::webp)
+            list(APPEND webp_ROOT "${CMAKE_CURRENT_LIST_DIR}")
+            find_dependency(webp)
+        endif()
+
+        set(CMAKE_MODULE_PATH "${_sdl_cmake_module_path}")
+        unset(_sdl_cmake_module_path)
 
-if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/SDL3_image-static-targets.cmake")
-    include(CheckLanguage)
-    check_language(CXX)
-    if(SDL3IMAGE_VENDORED AND NOT CMAKE_CXX_COMPILER AND NOT _sdl3image_nowarning)
-        message(WARNING "CXX language not enabled. Linking to SDL3_image::SDL3_image-static might fail.")
     endif()
-    include("${CMAKE_CURRENT_LIST_DIR}/SDL3_image-static-targets.cmake")
-endif()
 
-if(NOT SDL3IMAGE_VENDORED)
-    set(CMAKE_MODULE_PATH "${_sdl_cmake_module_path}")
-    unset(_sdl_cmake_module_path)
+    include("${CMAKE_CURRENT_LIST_DIR}/SDL3_image-static-targets.cmake")
 endif()
 
 function(_sdl_create_target_alias_compat NEW_TARGET TARGET)
diff --git a/cmake/sdl3-image.pc.in b/cmake/sdl3-image.pc.in
index 534809d8..f7d3d3cc 100644
--- a/cmake/sdl3-image.pc.in
+++ b/cmake/sdl3-image.pc.in
@@ -1,4 +1,4 @@
-prefix=@CMAKE_INSTALL_PREFIX@
+prefix=@SDL_PKGCONFIG_PREFIX@
 exec_prefix=${prefix}
 libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@
 includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
diff --git a/cmake/test/CMakeLists.txt b/cmake/test/CMakeLists.txt
index 62104192..a9dae6bf 100644
--- a/cmake/test/CMakeLists.txt
+++ b/cmake/test/CMakeLists.txt
@@ -20,7 +20,7 @@ if(TEST_SHARED)
     find_package(SDL3 REQUIRED CONFIG COMPONENTS SDL3)
     find_package(SDL3_image REQUIRED CONFIG)
     add_executable(main_shared main.c)
-    target_link_libraries(main_shared PRIVATE SDL3_image::SDL3_image SDL3::SDL3)
+    target_link_libraries(main_shared PRIVATE SDL3_image::SDL3_image-shared SDL3::SDL3)
 endif()
 
 if(TEST_STATIC)
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 9dcc3ac3..74743d43 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -1,32 +1,7 @@
-cmake_minimum_required(VERSION 3.0)
-project(SDL3_image_tests)
+# CMake script for building SDL_image tests
 
 enable_testing()
 
-option(SDL3IMAGE_TESTS_LINK_SHARED "link tests to shared SDL_image library" ${BUILD_SHARED_LIBS})
-option(SDL3IMAGE_TESTS_INSTALL "Install unit tests?" OFF)
-
-set(SDL_REQUIRED_VERSION 3.0.0)
-
-if(SDL3IMAGE_TESTS_LINK_SHARED)
-    set(sdlimage_target_name SDL3_image::SDL3_image-shared)
-else()
-    set(sdlimage_target_name SDL3_image::SDL3_image-static)
-endif()
-
-if(NOT TARGET SDL3::SDL3 OR NOT TARGET SDL3::SDL3_test)
-    find_package(SDL3 ${SDL_REQUIRED_VERSION} REQUIRED COMPONENTS SDL3 SDL3_test)
-    if(NOT TARGET SDL3::SDL3 OR NOT TARGET SDL3::SDL3_test)
-        message(FATAL_ERROR "find_package(SDL3) did not create SDL3::SDL3.")
-    endif()
-endif()
-if(NOT TARGET ${sdlimage_target_name})
-    find_package(SDL3_image 3.0.0 REQUIRED)
-    if(NOT TARGET ${sdlimage_target_name})
-        message(FATAL_ERROR "find_package(SDL3_image) did not create ${sdlimage_target_name}.")
-    endif()
-endif()
-
 add_executable(testimage main.c)
 
 set(ALL_TESTS
@@ -70,7 +45,7 @@ foreach(prog IN LISTS ALL_TESTS)
         "SDL_IMAGE_SAVE_PNG=$<BOOL:${SDL3IMAGE_PNG_SAVE}>"
     )
     sdl_add_warning_options(${prog} WARNING_AS_ERROR ${SDL3IMAGE_WERROR})
-    target_link_libraries(${prog} PRIVATE ${sdlimage_target_name} SDL3::SDL3_test SDL3::SDL3)
+    target_link_libraries(${prog} PRIVATE SDL3_image::SDL3_image SDL3::SDL3_test SDL3::SDL3)
     if(TARGET sdl3image_build_options)
         target_link_libraries(${prog} PRIVATE $<BUILD_INTERFACE:sdl3image_build_options>)
     endif()