SDL_ttf: Allow vendored libraries

From cc46a3155727270e3074b957ca1b12cc9790bb1a Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Wed, 11 May 2022 21:48:06 +0200
Subject: [PATCH] Allow vendored libraries

---
 .github/workflows/main.yml |   8 +-
 CMakeLists.txt             | 373 ++++++++++++++++++++++---------------
 Makefile.am                |   2 +-
 Makefile.in                |   2 +-
 SDL2_ttf-config.cmake.in   |  14 ++
 SDL2_ttfConfig.cmake       |   3 -
 test-versioning.sh         |   8 +
 7 files changed, 250 insertions(+), 160 deletions(-)
 create mode 100644 SDL2_ttf-config.cmake.in
 delete mode 100644 SDL2_ttfConfig.cmake

diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 91a36751..70503e0c 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -66,19 +66,21 @@ jobs:
       if: "matrix.platform.cmake"
       run: |
         cmake -B build \
+          -DTTF_WITH_HARFBUZZ=ON \
+          -DBUILD_SAMPLES=ON \
           -DBUILD_SHARED_LIBS=ON \
           -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
-          -DCMAKE_VERBOSE_MAKEFILE=ON \
+          -DCMAKE_BUILD_TYPE=Release \
           ${{ matrix.platform.cmake }}
     - name: Build
       if: "matrix.platform.cmake"
-      run: cmake --build build/ --config Release
+      run: cmake --build build/ --config Release --verbose
     - name: Install
       if: "matrix.platform.shell == 'sh' && matrix.platform.cmake"
       run: |
         set -eu
         rm -fr DESTDIR-cmake
-        DESTDIR=$(pwd)/DESTDIR-cmake cmake --install build/ --config Release
+        DESTDIR=$(pwd)/DESTDIR-cmake cmake --install build/ --config Release --verbose
         ( cd DESTDIR-cmake; find ) | LC_ALL=C sort -u
 
     - name: Configure Autotools
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 68b78bfc..c36d9d2d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,22 +1,11 @@
-# FIXME: CMAKE SUPPORT IN SDL2_ttf IS VERY INCOMPLETE YET !!!
-#
-# FIXME: make it able build against system libs or the included ones.
-# FIXME: handle library versioning.
-# FIXME: test accross different target platforms.
-
-if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
-  message(FATAL_ERROR "Prevented in-tree built. Please create a build directory outside of the SDL_ttf source code and call cmake from there")
-endif()
-
-##### general #####
-cmake_minimum_required(VERSION 3.0)
-project(SDL_ttf C)
+cmake_minimum_required(VERSION 3.10)
 
 # See docs/release_checklist.md
 set(MAJOR_VERSION 2)
 set(MINOR_VERSION 19)
 set(MICRO_VERSION 0)
 set(SDL_TTF_VERSION "${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}")
+set(SDL_REQUIRED_VERSION 2.0.10)
 
 # Calculate a libtool-like version number
 math(EXPR BINARY_AGE "${MINOR_VERSION} * 100 + ${MICRO_VERSION}")
@@ -54,173 +43,253 @@ set(DYLIB_CURRENT_VERSION "${DYLIB_CURRENT_VERSION_MAJOR}.${DYLIB_CURRENT_VERSIO
 # For historical reasons this is 15.0.0 rather than the expected 1.0.0
 set(DYLIB_COMPATIBILITY_VERSION "15.0.0")
 
-# For the static assertions in SDL_ttf.c
-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSDL_BUILD_MAJOR_VERSION=${MAJOR_VERSION}")
-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSDL_BUILD_MINOR_VERSION=${MINOR_VERSION}")
-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSDL_BUILD_MICRO_VERSION=${MICRO_VERSION}")
+if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
+    message(FATAL_ERROR "Prevented in-tree built. Please create a build directory outside of the SDL_ttf source code and call cmake from there")
+endif()
 
-if (ANDROID)
-    option(TTF_WITH_HARFBUZZ "use harfbuzz to improve text shaping" OFF)
+project(SDL_ttf LANGUAGES C
+    VERSION "${SDL_TTF_VERSION}")
 
-    add_library(SDL2_ttf SHARED)
-    target_sources(SDL2_ttf PRIVATE SDL_ttf.c)
+message(STATUS "Configuring ${PROJECT_NAME} ${PROJECT_VERSION}")
 
-    if (TTF_WITH_HARFBUZZ)
-        set(HARFBUZZ_INCLUDE_DIRS ../../external/harfbuzz/src)
-        set(HARFBUZZ_LIBRARIES harfbuzz)
-        set(FREETYPE_INCLUDE_DIRS ../../external/freetype/include)
-        set(FREETYPE_LIBRARY freetype)
+if (NOT ANDROID AND NOT (TARGET SDL2::SDL2 OR TARGET SDL2::SDL2-static))
+    find_package(SDL2 REQUIRED)
+endif()
 
-        add_definitions("-DTTF_USE_HARFBUZZ=1")
-        set(HB_BUILD_TESTS OFF CACHE BOOL "" FORCE)
-        set(HB_HAVE_FREETYPE ON CACHE BOOL "" FORCE)
-        set(FT_WITH_HARFBUZZ ON CACHE BOOL "" FORCE)
+# Workaround for Ubuntu 20.04's SDL being older than
+# https://github.com/libsdl-org/SDL/issues/3531
+if (NOT TARGET SDL2::SDL2)
+    find_library(SDL2_LIBRARY
+        NAMES SDL2
+        HINTS "${SDL2_EXEC_PREFIX}"
+        REQUIRED
+    )
+    if (NOT SDL2_LIBRARY)
+        message(FATAL_ERROR "Could not find SDL2 library. Please define SDL2_EXEC_PREFIX and/or SLD2_LIBRARY")
+    endif()
+    add_library(SDL2::SDL2 SHARED IMPORTED)
+    set_target_properties(SDL2::SDL2 PROPERTIES
+        INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIRS}"
+        IMPORTED_LINK_INTERFACE_LANGUAGES "C"
+        IMPORTED_LOCATION "${SDL2_LIBRARY}"
+    )
+endif()
 
-        add_subdirectory(external/harfbuzz)
-        target_include_directories(SDL2_ttf PUBLIC external/harfbuzz/src)
-        target_link_libraries(SDL2_ttf PRIVATE harfbuzz)
+include(CMakeDependentOption)
+include(CMakePackageConfigHelpers)
+include(GNUInstallDirs)
 
-    else()
-        set(FT_WITH_HARFBUZZ OFF CACHE BOOL "" FORCE)
-    endif()
+option(VENDORED_DEFAULT "Default value for *_VENDORED options. Can be overridden for each library. Is only used in the first configure run." ON)
 
-    add_subdirectory(external/freetype)
-    include_directories(external/freetype/include)
+# For style consistency, create a TTF_WITH_FREETYPE CMake variable. This variable is NOT configurable.
+set(TTF_WITH_FREETYPE ON)
+cmake_dependent_option(TTF_WITH_FREETYPE_VENDORED "Use vendored freetype library" ${VENDORED_DEFAULT} TTF_WITH_FREETYPE OFF)
 
-    target_include_directories(SDL2_ttf PUBLIC .)
-    target_link_libraries(SDL2_ttf PRIVATE freetype SDL2)
+option(TTF_WITH_HARFBUZZ "Use harfbuzz to improve text shaping" OFF)
+cmake_dependent_option(TTF_WITH_HARFBUZZ_VENDORED "Use vendored harfbuzz library" ${VENDORED_DEFAULT} TTF_WITH_HARFBUZZ OFF)
 
-else()
+option(BUILD_SAMPLES "Build the SDL2_ttf sample program(s)" ON)
+option(BUILD_SHARED_LIBS "Build the library as a shared library" ON)
+option(TTF_DISABLE_INSTALL "Disable installing SDL2_ttf" OFF)
 
-include(GNUInstallDirs)
-include(CMakePackageConfigHelpers)
+add_library(SDL2_ttf
+    SDL_ttf.c
+    SDL_ttf.h
+)
+add_library(SDL2_ttf::SDL2_ttf ALIAS SDL2_ttf)
 
-find_package(PkgConfig QUIET)
-if (NOT (TARGET SDL2 OR TARGET SDL2-static))
-  find_package(SDL2 REQUIRED)
-endif()
-if (NOT (TARGET Freetype::Freetype))
-  pkg_check_modules(freetype2 IMPORTED_TARGET freetype2)
-  if (freetype2_FOUND)
-    set(PC_REQUIRES "freetype2 ${PC_REQUIRES}")
-  else()
-    find_package(Freetype REQUIRED)
-  endif()
+target_compile_definitions(SDL2_ttf PRIVATE
+    SDL_BUILD_MAJOR_VERSION=${MAJOR_VERSION}
+    SDL_BUILD_MINOR_VERSION=${MINOR_VERSION}
+    SDL_BUILD_MICRO_VERSION=${MICRO_VERSION}
+)
+
+if (BUILD_SHARED_LIBS)
+    target_link_libraries(SDL2_ttf PRIVATE SDL2::SDL2)
+else()
+    target_link_libraries(SDL2_ttf PRIVATE SDL2::SDL2-static)
 endif()
 
-##### library generation #####
-add_library(SDL2_ttf SDL_ttf.c SDL_ttf.h)
+set(INSTALL_EXTRA_TARGETS)
+set(PC_LIBS)
+set(PC_REQUIRES)
+
+if (TTF_WITH_HARFBUZZ)
+    target_compile_definitions(SDL2_ttf PRIVATE TTF_USE_HARFBUZZ=1)
+    if (TTF_WITH_HARFBUZZ_VENDORED)
+        set(HB_BUILD_UTILS OFF)
+        set(SKIP_INSTALL_LIBRARIES ON)
+        set(HB_HAVE_FREETYPE ${TTF_WITH_FREETYPE} CACHE BOOL "harfbuzz freetype helpers" FORCE)
+        add_subdirectory(external/harfbuzz EXCLUDE_FROM_ALL)
+        list(APPEND INSTALL_EXTRA_TARGETS harfbuzz)
+        if (NOT TARGET harfbuzz::harfbuzz)
+            add_library(harfbuzz::harfbuzz ALIAS harfbuzz)
+        endif()
+        list(APPEND PC_LIBS -l$<TARGET_FILE_BASE_NAME:harfbuzz>)
+    else()
+        find_package(harfbuzz REQUIRED)
+        list(APPEND PC_REQUIRES harfbuzz)
+    endif()
+    target_link_libraries(SDL2_ttf PRIVATE harfbuzz::harfbuzz)
+endif()
 
-# Workaround for Ubuntu 20.04's SDL being older than
-# https://github.com/libsdl-org/SDL/issues/3531
-if (NOT TARGET SDL2::SDL2)
-  add_library(SDL2::SDL2 SHARED IMPORTED)
-  find_library(SDL2_LIBRARY
-    NAMES SDL2
-    HINTS "${SDL2_EXEC_PREFIX}"
-    REQUIRED)
-  set_target_properties(SDL2::SDL2 PROPERTIES
-    INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIRS}"
-    IMPORTED_LINK_INTERFACE_LANGUAGES "C"
-    IMPORTED_LOCATION "${SDL2_LIBRARY}")
+if (TTF_WITH_FREETYPE)
+    if (TTF_WITH_FREETYPE_VENDORED)
+        set(FT_DISABLE_ZLIB ON CACHE BOOL "freetype zlib option")
+        set(FT_DISABLE_BZIP2 ON CACHE BOOL "freetype bzip2 option")
+        set(FT_DISABLE_PNG ON CACHE BOOL "freetype png option")
+        set(FT_DISABLE_BROTLI ON CACHE BOOL "freetype option")
+        if (TTF_WITH_HARFBUZZ)
+            set(FT_DISABLE_HARFBUZZ OFF CACHE BOOL "freetype harfbuzz option" FORCE)
+            set(FT_REQUIRE_HARFBUZZ ON CACHE BOOL "freetype harfbuzz option" FORCE)
+            #set(HarfBuzz_INCLUDE_DIR "$<TARGET_PROPERTY:harfbuzz::harfbuzz,INCLUDE_DIRECTORIES>" CACHE STRING "freetype harfbuzz include path" FORCE)
+            #set(HarfBuzz_LIBRARY harfbuzz::harfbuzz CACHE STRING "freetype harfbuzz library path" FORCE)
+        else()
+            set(FT_DISABLE_HARFBUZZ ON CACHE BOOL "freetype harfbuzz option" FORCE)
+            set(FT_REQUIRE_HARFBUZZ OFF CACHE BOOL "freetype harfbuzz option" FORCE)
+        endif()
+        add_subdirectory(external/freetype EXCLUDE_FROM_ALL)
+        list(APPEND INSTALL_EXTRA_TARGETS freetype)
+        if (NOT TARGET Freetype::Freetype)
+            add_library(Freetype::Freetype ALIAS freetype)
+        endif()
+        list(APPEND PC_LIBS -l$<TARGET_FILE_BASE_NAME:freetype>)
+    else()
+        find_package(Freetype REQUIRED)
+        list(APPEND PC_REQUIRES freetype2)
+    endif()
+    target_link_libraries(SDL2_ttf PRIVATE Freetype::Freetype)
 endif()
 
+set_target_properties(SDL2_ttf PROPERTIES
+    DEFINE_SYMBOL DLL_EXPORT
+    PUBLIC_HEADER SDL_ttf.h
+    EXPORT_NAME SDL2_ttf
+    C_VISIBILITY_PRESET "hidden"
+)
+
 if (APPLE)
-  # TODO: Use DYLIB_COMPATIBILITY_VERSION, DYLIB_CURRENT_VERSION here
-elseif (UNIX AND NOT ANDROID)
-  # This is compatible with the libtool build
-  set_target_properties(SDL2_ttf PROPERTIES
-    VERSION ${LT_VERSION}
-    SOVERSION ${LT_MAJOR}
-    OUTPUT_NAME "SDL2_ttf-${LT_RELEASE}"
-  )
+    # TODO: Use DYLIB_COMPATIBILITY_VERSION, DYLIB_CURRENT_VERSION here
+elseif (UNIX AND NOT APPLE AND NOT ANDROID)
+    set_target_properties(SDL2_ttf PROPERTIES
+        SOVERSION "${LT_MAJOR}"
+        VERSION "${LT_VERSION}"
+    )
 endif()
-
 if (BUILD_SHARED_LIBS)
-  target_link_libraries(SDL2_ttf SDL2::SDL2)
-  if (WIN32 OR CYGWIN)
-    set_target_properties(SDL2_ttf PROPERTIES DEFINE_SYMBOL DLL_EXPORT)
-    target_sources(SDL2_ttf PRIVATE version.rc)
-  endif()
-else()
-  target_link_libraries(SDL2_ttf SDL2::SDL2-static)
-  if (NOT PSP)
-    set_target_properties(SDL2_ttf PROPERTIES POSITION_INDEPENDENT_CODE ON)
-  endif()
+    if (WIN32)
+        set_target_properties(SDL2_ttf PROPERTIES
+            PREFIX ""
+        )
+    elseif (UNIX AND NOT APPLE AND NOT ANDROID)
+        set_target_properties(SDL2_ttf PROPERTIES
+            OUTPUT_NAME "SDL2_ttf-${LT_RELEASE}"
+        )
+    endif()
 endif()
-if (TARGET Freetype::Freetype)
-  target_link_libraries(SDL2_ttf Freetype::Freetype)
-else()
-  target_link_libraries(SDL2_ttf PkgConfig::freetype2)
+
+if (WIN32 AND BUILD_SHARED_LIBS)
+    target_sources(SDL2_ttf PRIVATE version.rc)
 endif()
 
-target_include_directories(SDL2_ttf
-  PUBLIC $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/SDL2>
-  PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
-)
+if (NOT TTF_DISABLE_INSTALL)
+    install(
+        TARGETS SDL2_ttf
+        EXPORT SDL2_ttfTargets
+        PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/SDL2"
+        ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+        LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+        RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
+    )
+
+    if (INSTALL_EXTRA_TARGETS)
+        install(TARGETS ${INSTALL_EXTRA_TARGETS} EXPORT SDL2_ttfTargets
+            ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+            LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+            RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
+            PUBLIC_HEADER DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/external_include"
+        )
+    endif()
+
+    ##### export files #####
+    if (APPLE)
+        set(PKG_PREFIX "SDL2_ttf.framework/Resources")
+    elseif (WIN32)
+        set(PKG_PREFIX "cmake")
+    else ()
+        set(PKG_PREFIX "${CMAKE_INSTALL_LIBDIR}/cmake/SDL2_ttf")
+    endif ()
 
-option(SDL2_TTF_DISABLE_INSTALL "Disable installing SDL2_ttf" OFF)
-if (NOT SDL2_TTF_DISABLE_INSTALL)
-  install(
-    TARGETS SDL2_ttf
-    EXPORT SDL2_ttfTargets
-    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
-    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
-    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
-  )
-  install(
-    FILES SDL_ttf.h
-    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/SDL2
-  )
-
-  ##### export files #####
-  if (APPLE)
-    set(PKG_PREFIX "SDL2_ttf.framework/Resources")
-  elseif (WIN32)
-    set(PKG_PREFIX "cmake")
-  else ()
-    set(PKG_PREFIX "lib/cmake/SDL2")
-  endif ()
-
-  write_basic_package_version_file("${CMAKE_BINARY_DIR}/SDL2_ttfConfigVersion.cmake"
-    VERSION ${SDL_TTF_VERSION}
-    COMPATIBILITY AnyNewerVersion
-  )
-
-  install(
-    EXPORT SDL2_ttfTargets
-    FILE SDL2_ttfTargets.cmake
-    NAMESPACE SDL2_ttf::
-    DESTINATION ${PKG_PREFIX}
-  )
-  install(
-    FILES
-      ${CMAKE_CURRENT_SOURCE_DIR}/SDL2_ttfConfig.cmake
-      ${CMAKE_BINARY_DIR}/SDL2_ttfConfigVersion.cmake
-    DESTINATION ${PKG_PREFIX}
-    COMPONENT Devel
-  )
-
-  ##### pkg-config #####
-  if (PKG_CONFIG_FOUND)
-    set(SDL_VERSION 2.0.0)
-    set(prefix ${CMAKE_INSTALL_PREFIX})
+    configure_package_config_file(SDL2_ttf-config.cmake.in SDL2_ttf-config.cmake
+        INSTALL_DESTINATION "${PKG_PREFIX}"
+    )
+    write_basic_package_version_file("${PROJECT_BINARY_DIR}/SDL2_ttf-config-version.cmake"
+        VERSION ${SDL_TTF_VERSION}
+        COMPATIBILITY AnyNewerVersion
+    )
+
+    install(EXPORT SDL2_ttfTargets
+        FILE SDL2_ttf-targets.cmake
+        NAMESPACE SDL2_ttf::
+        DESTINATION "${PKG_PREFIX}"
+    )
+
+    set(VERSION ${SDL_TTF_VERSION})
+    set(SDL_VERSION ${SDL_REQUIRED_VERSION})
+    set(prefix "${CMAKE_INSTALL_PREFIX}")
     set(exec_prefix "\${prefix}")
-    set(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
+    set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
     set(bindir "\${exec_prefix}/bin")
-    set(includedir "\${prefix}/include")
-
-    configure_file("${SDL_ttf_SOURCE_DIR}/SDL2_ttf.pc.in"
-      "${SDL_ttf_BINARY_DIR}/SDL2_ttf.pc" @ONLY)
+    set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
+    string(JOIN " " PC_REQUIRES ${PC_REQUIRES})
+    string(JOIN " " PC_LIBS ${PC_LIBS})
+    configure_file(SDL2_ttf.pc.in ${CMAKE_CURRENT_BINARY_DIR}/SDL2_ttf.pc.intermediate @ONLY)
+    file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/SDL2_ttf.pc" INPUT "${CMAKE_CURRENT_BINARY_DIR}/SDL2_ttf.pc.intermediate")
 
     if (CMAKE_SYSTEM_NAME MATCHES FreeBSD)
-      # FreeBSD uses ${PREFIX}/libdata/pkgconfig
-      install(FILES ${SDL_ttf_BINARY_DIR}/SDL2_ttf.pc DESTINATION "libdata/pkgconfig")
+        # FreeBSD uses ${PREFIX}/libdata/pkgconfig
+        install(FILES ${SDL_ttf_BINARY_DIR}/SDL2_ttf.pc DESTINATION "libdata/pkgconfig")
     else ()
-      install(FILES ${SDL_ttf_BINARY_DIR}/SDL2_ttf.pc
-        DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
+        install(FILES ${SDL_ttf_BINARY_DIR}/SDL2_ttf.pc
+            DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
     endif ()
-  endif ()
-endif ()
 
+    install(
+        FILES
+            "${CMAKE_CURRENT_BINARY_DIR}/SDL2_ttf-config.cmake"
+            "${CMAKE_CURRENT_BINARY_DIR}/SDL2_ttf-config-version.cmake"
+        DESTINATION ${PKG_PREFIX}
+        COMPONENT devel
+    )
+
+    if (BUILD_SAMPLES)
+        add_executable(glfont glfont.c)
+        add_executable(showfont showfont.c)
+
+        set(OpenGL_GL_PREFERENCE GLVND)
+        find_package(OpenGL)
+        if (TARGET OpenGL::OpenGL)
+            target_compile_definitions(glfont PRIVATE HAVE_OPENGL)
+            target_link_libraries(glfont PRIVATE OpenGL::OpenGL)
+        elseif (TARGET OpenGL::GL)
+            target_compile_definitions(glfont PRIVATE HAVE_OPENGL)
+            target_link_libraries(glfont PRIVATE OpenGL::GL)
+        endif()
+
+        foreach(prog glfont showfont)
+            if (MINGW)
+                target_link_libraries(${prog} PRIVATE mingw32)
+                target_link_options(${prog} PRIVATE -mwindows)
+            endif()
+            target_link_libraries(${prog} PRIVATE SDL2_ttf::SDL2_ttf)
+            if (TARGET SDL2::SDL2main)
+                target_link_libraries(${prog} PRIVATE SDL2::SDL2main)
+            endif()
+            if (BUILD_SHARED_LIBS)
+                target_link_libraries(${prog} PRIVATE SDL2::SDL2)
+            else()
+                target_link_libraries(${prog} PRIVATE SDL2::SDL2-static)
+            endif()
+        endforeach()
+    endif()
 endif()
diff --git a/Makefile.am b/Makefile.am
index 0c16fafb..32822f60 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -144,7 +144,7 @@ EXTRA_DIST = CHANGES.txt COPYING.txt README.txt \
 	Android.mk Makefile.os2 version.rc	\
 	VisualC VisualC-WinRT Xcode external	\
 	SDL2_ttf.spec SDL2_ttf.spec.in		\
-	SDL2_ttfConfig.cmake			\
+	SDL2_ttf-config.cmake.in		\
 	autogen.sh gcc-fat.sh
 
 noinst_PROGRAMS = showfont glfont
diff --git a/Makefile.in b/Makefile.in
index 02edc127..66fa41bc 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -818,7 +818,7 @@ EXTRA_DIST = CHANGES.txt COPYING.txt README.txt \
 	Android.mk Makefile.os2 version.rc	\
 	VisualC VisualC-WinRT Xcode external	\
 	SDL2_ttf.spec SDL2_ttf.spec.in		\
-	SDL2_ttfConfig.cmake			\
+	SDL2_ttf-config.cmake.in		\
 	autogen.sh gcc-fat.sh
 
 showfont_LDADD = libSDL2_ttf.la
diff --git a/SDL2_ttf-config.cmake.in b/SDL2_ttf-config.cmake.in
new file mode 100644
index 00000000..2aa8edeb
--- /dev/null
+++ b/SDL2_ttf-config.cmake.in
@@ -0,0 +1,14 @@
+set(SDL2_TTF_WITH_HARFBUZZ @TTF_WITH_HARFBUZZ@)
+set(SDL2_TTF_WITH_FREETYPE @TTF_WITH_FREETYPE@)
+
+include(CMakeFindDependencyMacro)
+
+if(SDL2_TTF_WITH_FREETYPE AND NOT @TTF_WITH_FREETYPE_VENDORED@)
+	find_dependency(Freetype REQUIRED)
+endif()
+
+if(SDL2_TTF_WITH_HARFBUZZ AND NOT @TTF_WITH_HARFBUZZ_VENDORED@)
+	find_dependency(harfbuzz REQUIRED)
+endif()
+
+include("${CMAKE_CURRENT_LIST_DIR}/SDL2_ttf-targets.cmake")
diff --git a/SDL2_ttfConfig.cmake b/SDL2_ttfConfig.cmake
deleted file mode 100644
index 270bc09c..00000000
--- a/SDL2_ttfConfig.cmake
+++ /dev/null
@@ -1,3 +0,0 @@
-include(CMakeFindDependencyMacro)
-find_dependency(Freetype)
-include("${CMAKE_CURRENT_LIST_DIR}/SDL2_TTFTargets.cmake")
diff --git a/test-versioning.sh b/test-versioning.sh
index 8bb9ec7f..11ff43c6 100755
--- a/test-versioning.sh
+++ b/test-versioning.sh
@@ -27,6 +27,7 @@ major=$(sed -Ene 's/^m4_define\(\[MAJOR_VERSION_MACRO\], \[([0-9]+)\]\)$/\1/p' c
 minor=$(sed -Ene 's/^m4_define\(\[MINOR_VERSION_MACRO\], \[([0-9]+)\]\)$/\1/p' configure.ac)
 micro=$(sed -Ene 's/^m4_define\(\[MICRO_VERSION_MACRO\], \[([0-9]+)\]\)$/\1/p' configure.ac)
 version="${major}.${minor}.${micro}"
+ref_sdl_req=$(sed -ne 's/^SDL_VERSION=//p' configure.ac)
 
 if [ "$ref_version" = "$version" ]; then
     ok "configure.ac $version"
@@ -37,6 +38,7 @@ fi
 major=$(sed -ne 's/^set(MAJOR_VERSION \([0-9]\+\))$/\1/p' CMakeLists.txt)
 minor=$(sed -ne 's/^set(MINOR_VERSION \([0-9]\+\))$/\1/p' CMakeLists.txt)
 micro=$(sed -ne 's/^set(MICRO_VERSION \([0-9]\+\))$/\1/p' CMakeLists.txt)
+sdl_req=$(sed -ne 's/^set(SDL_REQUIRED_VERSION \([0-9.]\+\))$/\1/p' CMakeLists.txt)
 version="${major}.${minor}.${micro}"
 
 if [ "$ref_version" = "$version" ]; then
@@ -45,6 +47,12 @@ else
     not_ok "CMakeLists.txt $version disagrees with SDL_ttf.h $ref_version"
 fi
 
+if [ "$ref_sdl_req" = "$sdl_req" ]; then
+    ok "CMakeLists.txt $sdl_req"
+else
+    not_ok "CMakeLists.txt SDL_REQUIRED_VERSION=$sdl_req disagrees with configure.ac SDL_VERSION=$ref_sdl_req"
+fi
+
 major=$(sed -ne 's/^MAJOR_VERSION *= *//p' Makefile.os2)
 minor=$(sed -ne 's/^MINOR_VERSION *= *//p' Makefile.os2)
 micro=$(sed -ne 's/^MICRO_VERSION *= *//p' Makefile.os2)