Skip to content

Commit

Permalink
cmake: update cmake script to SDL3 conventions
Browse files Browse the repository at this point in the history
  • Loading branch information
madebr authored and slouken committed Jan 5, 2023
1 parent 485d49c commit 6053b84
Show file tree
Hide file tree
Showing 7 changed files with 61 additions and 242 deletions.
90 changes: 30 additions & 60 deletions CMakeLists.txt
Expand Up @@ -8,18 +8,18 @@ set(MINOR_VERSION 0)
set(MICRO_VERSION 0)
set(SDL_REQUIRED_VERSION 3.0.0)

include(PrivateSdlFunctions)
sdl_calculate_derived_version_variables()

if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
message(FATAL_ERROR "Prevented in-tree built. Please create a build directory outside of the SDL_image source code and call cmake from there")
endif()

project(SDL3_image
LANGUAGES C
VERSION "${FULL_VERSION}"
VERSION "${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}"
)

include(PrivateSdlFunctions)
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)
Expand All @@ -32,11 +32,6 @@ if(ANDROID)
set(SDL3IMAGE_SAMPLES_DEFAULT OFF)
endif()

# Set defaults preventing destination file conflicts
set(SDL3IMAGE_DEBUG_POSTFIX "d"
CACHE STRING "Name suffix for debug builds")
mark_as_advanced(SDL3IMAGE_DEBUG_POSTFIX)

# Assume MSVC projects don't have a package manager and need vendored dependencies (by default).
# Most other platforms have some kind of package manager.
# FIXME: consider a package manager such as conan/vcpkg instead of vendoring
Expand Down Expand Up @@ -167,7 +162,7 @@ else()
set(sdl3_target_name SDL3::SDL3-static)
endif()

sdl_find_sdl3(${sdl3_target_name} ${SDL_REQUIRED_VERSION})
find_package(SDL3 ${SDL_REQUIRED_VERSION} REQUIRED)

# Set PROJECT_VERSION of subprojects to "" if it's project call does not set VERSION
cmake_policy(SET CMP0048 NEW)
Expand Down Expand Up @@ -230,46 +225,26 @@ set_target_properties(SDL3_image PROPERTIES
C_VISIBILITY_PRESET "hidden"
)
if(NOT ANDROID)
set_target_properties(SDL3_image PROPERTIES
DEBUG_POSTFIX "${SDL3IMAGE_DEBUG_POSTFIX}"
)
if(APPLE)
# the SOVERSION property corresponds to the compatibility version and VERSION corresponds to the current version
# https://cmake.org/cmake/help/latest/prop_tgt/SOVERSION.html#mach-o-versions
set_target_properties(SDL3_image PROPERTIES
SOVERSION "${DYLIB_COMPATIBILITY_VERSION}"
SOVERSION "${DYLIB_COMPAT_VERSION}"
VERSION "${DYLIB_CURRENT_VERSION}"
)
else()
set_target_properties(SDL3_image PROPERTIES
SOVERSION "${LT_MAJOR}"
VERSION "${LT_VERSION}"
SOVERSION "${SO_VERSION_MAJOR}"
VERSION "${SO_VERSION}"
)
endif()
endif()
if(SDL3IMAGE_BUILD_SHARED_LIBS AND (APPLE OR (UNIX AND NOT ANDROID)))
add_custom_command(TARGET SDL3_image POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E create_symlink "$<TARGET_SONAME_FILE_NAME:SDL3_image>" "libSDL3_image$<$<CONFIG:Debug>:${SDL3IMAGE_DEBUG_POSTFIX}>$<TARGET_FILE_SUFFIX:SDL3_image>"
# BYPRODUCTS "libSDL3_image$<$<CONFIG:Debug>:${SDL3IMAGE_DEBUG_POSTFIX}>$<TARGET_FILE_SUFFIX:SDL3_image>" # Needs CMake 3.20
WORKING_DIRECTORY "${PROJECT_BINARY_DIR}"
)
endif()
if(SDL3IMAGE_BUILD_SHARED_LIBS)
if(WIN32 OR OS2)
set_target_properties(SDL3_image PROPERTIES
PREFIX ""
)
endif()
if(OS2)
# OS/2 doesn't support a DLL name longer than 8 characters.
set_target_properties(SDL3_image PROPERTIES
OUTPUT_NAME "SDL3img"
)
elseif(UNIX AND NOT ANDROID)
set_target_properties(SDL3_image PROPERTIES
OUTPUT_NAME "SDL3_image-${LT_RELEASE}"
)
endif()
else()
if(MSVC OR (WATCOM AND (WIN32 OR OS2)))
set_target_properties(SDL3_image PROPERTIES
Expand Down Expand Up @@ -702,15 +677,23 @@ if(SDL3IMAGE_INSTALL)
)
endif()

if(WIN32 AND NOT MINGW)
set(SDLIMAGE_INSTALL_CMAKEDIR_DEFAULT "cmake")
if(WINDOWS AND NOT MINGW)
set(SDL3IMAGE_INSTALL_CMAKEDIR_ROOT_DEFAULT "cmake")
else()
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)")

if(WINDOWS AND NOT MINGW)
set(SDL3IMAGE_INSTALL_CMAKEDIR "${SDL3IMAGE_INSTALL_CMAKEDIR_ROOT}")
set(LICENSES_PREFIX "licenses/SDL3_image")
else()
set(SDLIMAGE_INSTALL_CMAKEDIR_DEFAULT "${CMAKE_INSTALL_LIBDIR}/cmake/SDL3_image")
set(SDL3IMAGE_INSTALL_CMAKEDIR "${SDL3IMAGE_INSTALL_CMAKEDIR_ROOT}/SDL3")
set(LICENSES_PREFIX "${CMAKE_INSTALL_DATAROOTDIR}/licenses/SDL3_image")
endif()
set(SDLIMAGE_INSTALL_CMAKEDIR "${SDLIMAGE_INSTALL_CMAKEDIR_DEFAULT}" CACHE STRING "Location where to install SDL3_imageConfig.cmake")

configure_package_config_file(SDL3_imageConfig.cmake.in SDL3_imageConfig.cmake
INSTALL_DESTINATION "${SDLIMAGE_INSTALL_CMAKEDIR}"
configure_package_config_file(cmake/SDL3_imageConfig.cmake.in SDL3_imageConfig.cmake
INSTALL_DESTINATION "${SDL3IMAGE_INSTALL_CMAKEDIR}"
)
write_basic_package_version_file("${PROJECT_BINARY_DIR}/SDL3_imageConfigVersion.cmake"
VERSION ${FULL_VERSION}
Expand All @@ -722,27 +705,23 @@ if(SDL3IMAGE_INSTALL)
"${CMAKE_CURRENT_BINARY_DIR}/SDL3_imageConfigVersion.cmake"
cmake/Findlibjxl.cmake
cmake/Findwebp.cmake
DESTINATION "${SDLIMAGE_INSTALL_CMAKEDIR}"
DESTINATION "${SDL3IMAGE_INSTALL_CMAKEDIR}"
COMPONENT devel
)
install(EXPORT SDL3ImageExports
FILE SDL3_image-${sdl3_image_install_name_infix}-targets.cmake
NAMESPACE SDL3_image::
DESTINATION "${SDLIMAGE_INSTALL_CMAKEDIR}"
DESTINATION "${SDL3IMAGE_INSTALL_CMAKEDIR}"
COMPONENT devel
)

set(prefix "${CMAKE_INSTALL_PREFIX}")
set(exec_prefix "\${prefix}")
set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
set(PACKAGE "${PROJECT_NAME}")
set(VERSION "${FULL_VERSION}")
set(SDL_VERSION "${SDL_REQUIRED_VERSION}")
string(JOIN " " PC_REQUIRES ${PC_REQUIRES})
string(JOIN " " PC_LIBS ${PC_LIBS})
configure_file("${PROJECT_SOURCE_DIR}/SDL3_image.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/SDL3_image.pc.intermediate" @ONLY)
file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/SDL3_image-$<CONFIG>.pc" INPUT "${CMAKE_CURRENT_BINARY_DIR}/SDL3_image.pc.intermediate")
configure_file(cmake/sdl3-image.pc.in sdl3-image.pc.intermediate @ONLY)
file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/sdl3-image-$<CONFIG>.pc" INPUT "${CMAKE_CURRENT_BINARY_DIR}/sdl3-image.pc.intermediate")

set(PC_DESTDIR)
if(CMAKE_SYSTEM_NAME MATCHES FreeBSD)
Expand All @@ -751,24 +730,15 @@ if(SDL3IMAGE_INSTALL)
else()
set(PC_DESTDIR "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
endif()
# Always install SDL3_net.pc file: libraries might be different between config modes
# Always install sdl3-image.pc file: libraries might be different between config modes
install(CODE "
# FIXME: use file(COPY_FILE) if minimum CMake version >= 3.21
execute_process(COMMAND \"\${CMAKE_COMMAND}\" -E copy_if_different
\"${CMAKE_CURRENT_BINARY_DIR}/SDL3_image-$<CONFIG>.pc\"
\"${CMAKE_CURRENT_BINARY_DIR}/SDL3_image.pc\")
\"${CMAKE_CURRENT_BINARY_DIR}/sdl3-image-$<CONFIG>.pc\"
\"${CMAKE_CURRENT_BINARY_DIR}/sdl3-image.pc\")
file(INSTALL DESTINATION \"\${CMAKE_INSTALL_PREFIX}/${PC_DESTDIR}\"
TYPE FILE
FILES \"${CMAKE_CURRENT_BINARY_DIR}/SDL3_image.pc\")" COMPONENT devel)

if(SDL3IMAGE_BUILD_SHARED_LIBS AND (APPLE OR (UNIX AND NOT ANDROID)))
install(
FILES
"${PROJECT_BINARY_DIR}/libSDL3_image$<$<CONFIG:Debug>:${SDL3IMAGE_DEBUG_POSTFIX}>$<TARGET_FILE_SUFFIX:SDL3_image>"
DESTINATION "${CMAKE_INSTALL_LIBDIR}"
COMPONENT devel
)
endif()
FILES \"${CMAKE_CURRENT_BINARY_DIR}/sdl3-image.pc\")" COMPONENT devel)

install(FILES "LICENSE.txt"
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/licenses/${PROJECT_NAME}"
Expand Down
61 changes: 18 additions & 43 deletions cmake/PrivateSdlFunctions.cmake
@@ -1,52 +1,27 @@
# This file is shared amongst SDL_image/SDL_mixer/SDL_ttf

macro(sdl_calculate_derived_version_variables)
if (NOT DEFINED MAJOR_VERSION OR NOT DEFINED MINOR_VERSION OR NOT DEFINED MICRO_VERSION)
message(FATAL_ERROR "MAJOR_VERSION, MINOR_VERSION and MICRO_VERSION need to be defined")
endif()

set(FULL_VERSION "${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}")
macro(sdl_calculate_derived_version_variables MAJOR MINOR MICRO)
set(SO_VERSION_MAJOR "0")
set(SO_VERSION_MINOR "${MINOR_VERSION}")
set(SO_VERSION_MICRO "${MICRO_VERSION}")
set(SO_VERSION "${SO_VERSION_MAJOR}.${SO_VERSION_MINOR}.${SO_VERSION_MICRO}")

# Calculate a libtool-like version number
math(EXPR BINARY_AGE "${MINOR_VERSION} * 100 + ${MICRO_VERSION}")
math(EXPR IS_DEVELOPMENT "${MINOR_VERSION} % 2")
if (IS_DEVELOPMENT)
# Development branch, 2.5.1 -> libSDL2_XXXXX-2.0.so.0.501.0
set(INTERFACE_AGE 0)
if(MINOR MATCHES "[02468]$")
math(EXPR DYLIB_COMPAT_VERSION_MAJOR "100 * ${MINOR} + 1")
set(DYLIB_COMPAT_VERSION_MINOR "0")
math(EXPR DYLIB_CURRENT_VERSION_MAJOR "${DYLIB_COMPAT_VERSION_MAJOR}")
set(DYLIB_CURRENT_VERSION_MINOR "${MICRO}")
else()
# Stable branch, 2.6.1 -> libSDL2_XXXXX-2.0.so.0.600.1
set(INTERFACE_AGE ${MICRO_VERSION})
math(EXPR DYLIB_COMPAT_VERSION_MAJOR "100 * ${MINOR} + ${MICRO} + 1")
set(DYLIB_COMPAT_VERSION_MINOR "0")
math(EXPR DYLIB_CURRENT_VERSION_MAJOR "${DYLIB_COMPAT_VERSION_MAJOR}")
set(DYLIB_CURRENT_VERSION_MINOR "0")
endif()
set(DYLIB_COMPAT_VERSION_MICRO "0")
set(DYLIB_CURRENT_VERSION_MICRO "0")

# Increment this if there is an incompatible change - but if that happens,
# we should rename the library from SDL2 to SDL3, at which point this would
# reset to 0 anyway.
set(LT_MAJOR "0")

math(EXPR LT_AGE "${BINARY_AGE} - ${INTERFACE_AGE}")
math(EXPR LT_CURRENT "${LT_MAJOR} + ${LT_AGE}")
set(LT_REVISION "${INTERFACE_AGE}")
# For historical reasons, the library name redundantly includes the major
# version twice: libSDL2_XXXXX-2.0.so.0.
# TODO: in SDL 3, set the OUTPUT_NAME to plain SDL3_XXXXX, which will simplify
# it to libSDL2_XXXXX.so.0
set(LT_RELEASE "2.0")
set(LT_VERSION "${LT_MAJOR}.${LT_AGE}.${LT_REVISION}")

# The following should match the versions in the Xcode project file.
# Each version is 1 higher than you might expect, for compatibility
# with libtool: macOS ABI versioning is 1-based, unlike other platforms
# which are normally 0-based.
math(EXPR DYLIB_CURRENT_VERSION_MAJOR "${LT_MAJOR} + ${LT_AGE} + 1")
math(EXPR DYLIB_CURRENT_VERSION_MINOR "${LT_REVISION}")
set(DYLIB_CURRENT_VERSION "${DYLIB_CURRENT_VERSION_MAJOR}.${DYLIB_CURRENT_VERSION_MINOR}.0")
set(DYLIB_COMPATIBILITY_VERSION "${DYLIB_CURRENT_VERSION_MAJOR}.0.0")
endmacro()

macro(sdl_find_sdl3 TARGET VERSION)
if(NOT TARGET ${TARGET})
find_package(SDL3 ${VERSION} REQUIRED QUIET)
endif()
set(DYLIB_CURRENT_VERSION "${DYLIB_CURRENT_VERSION_MAJOR}.${DYLIB_CURRENT_VERSION_MINOR}.${DYLIB_CURRENT_VERSION_MICRO}")
set(DYLIB_COMPAT_VERSION "${DYLIB_COMPAT_VERSION_MAJOR}.${DYLIB_COMPAT_VERSION_MINOR}.${DYLIB_COMPAT_VERSION_MICRO}")
endmacro()

function(read_absolute_symlink DEST PATH)
Expand Down
File renamed without changes.
8 changes: 4 additions & 4 deletions SDL3_image.pc.in → cmake/sdl3-image.pc.in
@@ -1,7 +1,7 @@
prefix=@prefix@
prefix=@CMAKE_INSTALL_PREFIX@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@
includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@

Name: @PACKAGE@
Description: image loading library for Simple DirectMedia Layer
Expand All @@ -10,5 +10,5 @@ Requires: sdl3 >= @SDL_VERSION@
Libs: -L${libdir} -lSDL3_image
Requires.private: @PC_REQUIRES@
Libs.private: @PC_LIBS@
Cflags: -I${includedir}/SDL3
Cflags: -I${includedir} -I${includedir}/SDL3

32 changes: 9 additions & 23 deletions cmake/test/CMakeLists.txt
Expand Up @@ -5,45 +5,31 @@ project(sdl_test LANGUAGES C)

cmake_policy(SET CMP0074 NEW)

# Override CMAKE_FIND_ROOT_PATH_MODE to allow search for SDL2 outside of sysroot
# Override CMAKE_FIND_ROOT_PATH_MODE to allow search for SDL3 outside of sysroot
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE NEVER)

include(FeatureSummary)

option(TEST_SHARED "Test linking to shared SDL2_image library" ON)
option(TEST_SHARED "Test linking to shared SDL3_image library" ON)
add_feature_info("TEST_SHARED" TEST_SHARED "Test linking with shared library")

option(TEST_STATIC "Test linking to static SDL2_image library" ON)
option(TEST_STATIC "Test linking to static SDL3_image library" ON)
add_feature_info("TEST_STATIC" TEST_STATIC "Test linking with static library")

if(TEST_SHARED)
# FIXME: in the distant future, must become REQUIRED
find_package(SDL2 CONFIG COMPONENTS SDL2)
# FIXME: and the following should be removed
if(NOT TARGET SDL2::SDL2)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/..")
include(PrivateSdlFunctions)
sdl_find_sdl2(SDL2::SDL2 2.0)
endif()
find_package(SDL2_image REQUIRED CONFIG)
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 SDL2::SDL2 SDL2_image::SDL2_image)
target_link_libraries(main_shared PRIVATE SDL3::SDL3 SDL3_image::SDL3_image)
endif()

if(TEST_STATIC)
# FIXME: in the distant future, must become REQUIRED
find_package(SDL2 CONFIG COMPONENTS SDL2-static)
# FIXME: and the following should be removed
if(NOT TARGET SDL2::SDL2-static)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/..")
include(PrivateSdlFunctions)
sdl_find_sdl2(SDL2::SDL2-static 2.0)
endif()
find_package(SDL3 REQUIRED CONFIG COMPONENTS SDL3-static)
# some static vendored libraries use c++ (enable CXX after `find_package` might show a warning)
enable_language(CXX)
find_package(SDL2_image REQUIRED CONFIG)
find_package(SDL3_image REQUIRED CONFIG)
add_executable(main_static main.c)
target_link_libraries(main_static PRIVATE SDL2::SDL2-static SDL2_image::SDL2_image-static)
target_link_libraries(main_static PRIVATE SDL3::SDL3-static SDL3_image::SDL3_image-static)
endif()

feature_summary(WHAT ALL)
13 changes: 0 additions & 13 deletions sdl3_image-config-version.cmake.in

This file was deleted.

0 comments on commit 6053b84

Please sign in to comment.