SDL_ttf: cmake: always allow linking to shared SDL3 library

From 5002e0ab38e93a5ffe218791976f2846b9d3cfca Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Mon, 3 Jul 2023 03:39:25 +0200
Subject: [PATCH] cmake: always allow linking to shared SDL3 library

---
 CMakeLists.txt                  | 23 +++++++++++++++--------
 cmake/PrivateSdlFunctions.cmake |  9 +++++++++
 cmake/SDL3_ttfConfig.cmake.in   | 28 ++++++++++++++--------------
 cmake/test/CMakeLists.txt       |  6 +++---
 cmake/test/main.c               |  6 ++++--
 5 files changed, 45 insertions(+), 27 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 188b1524..6d414aeb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -39,7 +39,7 @@ else()
 endif()
 
 set(sdl3ttf_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_ttf when SDL3 is built in same built, and is not installed.
     set(sdl3ttf_install_enableable OFF)
 endif()
@@ -70,16 +70,20 @@ set(SDL3TTF_HARFBUZZ_VENDORED "${SDL3TTF_VENDORED}")
 # Save BUILD_SHARED_LIBS variable
 set(SDL3TTF_BUILD_SHARED_LIBS "${BUILD_SHARED_LIBS}")
 
+set(sdl_required_components Headers)
+
 if(SDL3TTF_BUILD_SHARED_LIBS)
     set(sdl3_ttf_target_name SDL3_ttf-shared)
     set(sdl3_target_name SDL3::SDL3-shared)
+
+    list(APPEND sdl_required_components SDL3-shared)
 else()
     set(sdl3_ttf_target_name SDL3_ttf-static)
-    set(sdl3_target_name SDL3::SDL3-static)
+    set(sdl3_target_name SDL3::SDL3)
 endif()
 
-if(NOT TARGET ${sdl3_target_name})
-    find_package(SDL3 ${SDL_REQUIRED_VERSION} REQUIRED)
+if(NOT TARGET SDL3::Headers OR NOT TARGET ${sdl3_target_name})
+    find_package(SDL3 ${SDL_REQUIRED_VERSION} REQUIRED COMPONENTS ${sdl_required_components})
 endif()
 
 # Enable large file support on 32-bit glibc, so that the vendored libraries
@@ -94,7 +98,7 @@ add_library(${sdl3_ttf_target_name}
 )
 add_library(SDL3_ttf::${sdl3_ttf_target_name} ALIAS ${sdl3_ttf_target_name})
 if(NOT TARGET SDL3_ttf::SDL3_ttf)
-    add_library(SDL3_ttf::SDL3_mixer ALIAS ${sdl3_ttf_target_name})
+    add_library(SDL3_ttf::SDL3_ttf ALIAS ${sdl3_ttf_target_name})
 endif()
 target_include_directories(${sdl3_ttf_target_name}
     PUBLIC
@@ -109,7 +113,10 @@ target_compile_definitions(${sdl3_ttf_target_name} PRIVATE
     SDL_BUILD_MINOR_VERSION=${MINOR_VERSION}
     SDL_BUILD_MICRO_VERSION=${MICRO_VERSION}
 )
-target_link_libraries(${sdl3_ttf_target_name} PRIVATE $<BUILD_INTERFACE:${sdl3_target_name}>)
+target_link_libraries(${sdl3_ttf_target_name} PUBLIC SDL3::Headers)
+if(SDL3TTF_BUILD_SHARED_LIBS)
+    target_link_libraries(${sdl3_ttf_target_name} PRIVATE SDL3::SDL3-shared)
+endif()
 sdl_add_warning_options(${sdl3_ttf_target_name} WARNING_AS_ERROR ${SDL3TTF_WERROR})
 if(WIN32 AND SDL3TTF_BUILD_SHARED_LIBS)
     target_sources(${sdl3_ttf_target_name} PRIVATE
@@ -117,10 +124,10 @@ if(WIN32 AND SDL3TTF_BUILD_SHARED_LIBS)
     )
 endif()
 set_target_properties(${sdl3_ttf_target_name} PROPERTIES
+    OUTPUT_NAME SDL3_ttf
     DEFINE_SYMBOL DLL_EXPORT
     EXPORT_NAME ${sdl3_ttf_target_name}
     C_VISIBILITY_PRESET "hidden"
-    OUTPUT_NAME SDL3_ttf
 )
 if(NOT ANDROID)
     if(APPLE)
@@ -358,7 +365,7 @@ if(SDL3TTF_SAMPLES)
         if(SDL3TTF_SAMPLES_INSTALL)
             install(TARGETS ${prog}
                 RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
-                )
+            )
         endif()
     endforeach()
 endif()
diff --git a/cmake/PrivateSdlFunctions.cmake b/cmake/PrivateSdlFunctions.cmake
index 7c1dfc46..6ac243a2 100644
--- a/cmake/PrivateSdlFunctions.cmake
+++ b/cmake/PrivateSdlFunctions.cmake
@@ -1,5 +1,7 @@
 # This file is shared amongst SDL_image/SDL_mixer/SDL_ttf
 
+include(CheckCCompilerFlag)
+
 macro(sdl_calculate_derived_version_variables MAJOR MINOR MICRO)
     set(SO_VERSION_MAJOR "0")
     set(SO_VERSION_MINOR "${MINOR_VERSION}")
@@ -253,3 +255,10 @@ function(sdl_add_warning_options TARGET)
         endif()
     endif()
 endfunction()
+
+function(sdl_no_deprecated_errors TARGET)
+    check_c_compiler_flag(-Wno-error=deprecated-declarations HAVE_WNO_ERROR_DEPRECATED_DECLARATIONS)
+    if(HAVE_WNO_ERROR_DEPRECATED_DECLARATIONS)
+        target_compile_options(${TARGET} PRIVATE "-Wno-error=deprecated-declarations")
+    endif()
+endfunction()
diff --git a/cmake/SDL3_ttfConfig.cmake.in b/cmake/SDL3_ttfConfig.cmake.in
index 8ac8d49e..06885cea 100644
--- a/cmake/SDL3_ttfConfig.cmake.in
+++ b/cmake/SDL3_ttfConfig.cmake.in
@@ -15,29 +15,23 @@ set(SDL3TTF_FREETYPE @SDL3TTF_FREETYPE@)
 
 set(SDL3TTF_SDL3_REQUIRED_VERSION  @SDL_REQUIRED_VERSION@)
 
-include(CMakeFindDependencyMacro)
-
-if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/SDL3_ttf-shared-targets.cmake")
+if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/SDL3_ttf-shared-targets.cmake")
     include("${CMAKE_CURRENT_LIST_DIR}/SDL3_ttf-shared-targets.cmake")
 endif()
 
-if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/SDL3_ttf-static-targets.cmake")
+if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/SDL3_ttf-static-targets.cmake")
     if(SDL3TTF_VENDORED)
         include(CheckLanguage)
         check_language(CXX)
         if(NOT CMAKE_CXX_COMPILER AND NOT _sdl3ttf_nowarning)
             message(WARNING "CXX language not enabled. Linking to SDL3_ttf::SDL3_ttf-static might fail.")
         endif()
-    endif()
-    include("${CMAKE_CURRENT_LIST_DIR}/SDL3_ttf-static-targets.cmake")
-endif()
-
+    else()
+        include(CMakeFindDependencyMacro)
 
-if(NOT SDL3TTF_VENDORED)
-    set(_sdl_cmake_module_path "${CMAKE_MODULE_PATH}")
-    list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
+        set(_sdl_cmake_module_path "${CMAKE_MODULE_PATH}")
+        list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}")
 
-    if(TARGET SDL3_ttf::SDL3_ttf-static)
         if(SDL3TTF_FREETYPE)
             find_dependency(Freetype)
         endif()
@@ -46,8 +40,14 @@ if(NOT SDL3TTF_VENDORED)
             list(APPEND harfbuzz_ROOT "${CMAKE_CURRENT_LIST_DIR}")
             find_dependency(harfbuzz)
         endif()
+
+        set(CMAKE_MODULE_PATH "${_sdl_cmake_module_path}")
+        unset(_sdl_cmake_module_path)
     endif()
 
-    set(CMAKE_MODULE_PATH "${_sdl_cmake_module_path}")
-    unset(_sdl_cmake_module_path)
+    include("${CMAKE_CURRENT_LIST_DIR}/SDL3_ttf-static-targets.cmake")
+endif()
+
+
+if(NOT SDL3TTF_VENDORED)
 endif()
diff --git a/cmake/test/CMakeLists.txt b/cmake/test/CMakeLists.txt
index cb98cccb..8484d8c5 100644
--- a/cmake/test/CMakeLists.txt
+++ b/cmake/test/CMakeLists.txt
@@ -20,16 +20,16 @@ if(TEST_SHARED)
     find_package(SDL3 REQUIRED CONFIG COMPONENTS SDL3)
     find_package(SDL3_ttf REQUIRED CONFIG)
     add_executable(main_shared main.c)
-    target_link_libraries(main_shared PRIVATE SDL3::SDL3 SDL3_ttf::SDL3_ttf)
+    target_link_libraries(main_shared PRIVATE SDL3_ttf::SDL3_ttf-shared SDL3::SDL3)
 endif()
 
 if(TEST_STATIC)
-    find_package(SDL3 REQUIRED CONFIG COMPONENTS SDL3-static)
+    find_package(SDL3 REQUIRED CONFIG COMPONENTS SDL3)
     # some static vendored libraries use c++ (enable CXX after `find_package` might show a warning)
     enable_language(CXX)
     find_package(SDL3_ttf REQUIRED CONFIG)
     add_executable(main_static main.c)
-    target_link_libraries(main_static PRIVATE SDL3::SDL3-static SDL3_ttf::SDL3_ttf-static)
+    target_link_libraries(main_static PRIVATE SDL3_ttf::SDL3_ttf-static SDL3::SDL3)
 endif()
 
 feature_summary(WHAT ALL)
diff --git a/cmake/test/main.c b/cmake/test/main.c
index 7e583ec7..83577a1c 100644
--- a/cmake/test/main.c
+++ b/cmake/test/main.c
@@ -4,12 +4,14 @@
 
 int main(int argc, char *argv[])
 {
+    (void)argc;
+    (void)argv;
     if (SDL_Init(0) < 0) {
-        SDL_Log("SDL_Init: could not initialize SDL: %s\n", SDL_GetError());
+        SDL_Log("SDL_Init: could not initialize SDL: %s", SDL_GetError());
         return 1;
     }
     if (TTF_Init() == -1) {
-        fprintf(stderr, "TTF_Init: %s\n", TTF_GetError());
+        SDL_Log("TTF_Init: %s", TTF_GetError());
     }
     TTF_Quit();
     SDL_Quit();