From 50a6a39dd6d31592114af3f95e6d4c875084f90d Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Sat, 27 Jul 2024 15:41:33 +0200
Subject: [PATCH] cmake: use genexes for linking against apple frameworks
---
CMakeLists.txt | 72 ++++++++++++++++++++-----------
cmake/sdlchecks.cmake | 2 +-
cmake/test/CMakeLists.txt | 27 +++++++++++-
cmake/test/main.swift | 12 ++++++
cmake/test/swift/module.modulemap | 4 ++
cmake/test/swift/shim.h | 3 ++
sdl2-config.cmake.in | 3 ++
7 files changed, 96 insertions(+), 27 deletions(-)
create mode 100644 cmake/test/main.swift
create mode 100644 cmake/test/swift/module.modulemap
create mode 100644 cmake/test/swift/shim.h
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5b2a94fb627e6..b025679239d06 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -22,7 +22,8 @@ endif()
set(EXTRA_LIBS)
set(EXTRA_LDFLAGS)
-set(CMAKE_DEPENDS)
+set(CMAKE_LIBS)
+set(PKGCONFIG_LDFLAGS)
set(PKGCONFIG_DEPENDS)
# This is a virtual "library" that just exists to collect up compiler and
@@ -2284,73 +2285,96 @@ elseif(APPLE)
endif()
endif()
+ # Minimum version for $<LINK_LIBRARY:feature,library-list>
+ cmake_minimum_required(VERSION 3.24)
+
# Actually load the frameworks at the end so we don't duplicate include.
if(SDL_FRAMEWORK_COREVIDEO)
- list(APPEND EXTRA_LDFLAGS "-Wl,-framework,CoreVideo")
+ list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,CoreVideo")
+ list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,CoreVideo>")
endif()
if(SDL_FRAMEWORK_COCOA)
- list(APPEND EXTRA_LDFLAGS "-Wl,-framework,Cocoa")
+ list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,Cocoa")
+ list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,Cocoa>")
endif()
if(SDL_FRAMEWORK_IOKIT)
- list(APPEND EXTRA_LDFLAGS "-Wl,-framework,IOKit")
+ list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,IOKit")
+ list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,IOKit>")
endif()
if(SDL_FRAMEWORK_FF)
- list(APPEND EXTRA_LDFLAGS "-Wl,-framework,ForceFeedback")
+ list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,ForceFeedback")
+ list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,ForceFeedback>")
endif()
if(SDL_FRAMEWORK_CARBON)
- list(APPEND EXTRA_LDFLAGS "-Wl,-framework,Carbon")
+ list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,Carbon")
+ list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,Carbon>")
endif()
if(SDL_FRAMEWORK_COREAUDIO)
- list(APPEND EXTRA_LDFLAGS "-Wl,-framework,CoreAudio")
+ list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,CoreAudio")
+ list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,CoreAudio>")
endif()
if(SDL_FRAMEWORK_AUDIOTOOLBOX)
- list(APPEND EXTRA_LDFLAGS "-Wl,-framework,AudioToolbox")
+ list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,AudioToolbox")
+ list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,AudioToolbox>")
endif()
if(SDL_FRAMEWORK_AVFOUNDATION)
- list(APPEND EXTRA_LDFLAGS "-Wl,-framework,AVFoundation")
+ list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,AVFoundation")
+ list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,AVFoundation>")
endif()
if(SDL_FRAMEWORK_COREBLUETOOTH)
- list(APPEND EXTRA_LDFLAGS "-Wl,-framework,CoreBluetooth")
+ list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,CoreBluetooth")
+ list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,CoreBluetooth>")
endif()
if(SDL_FRAMEWORK_COREGRAPHICS)
- list(APPEND EXTRA_LDFLAGS "-Wl,-framework,CoreGraphics")
+ list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,CoreGraphics")
+ list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,CoreGraphics>")
endif()
if(SDL_FRAMEWORK_COREMOTION)
- list(APPEND EXTRA_LDFLAGS "-Wl,-framework,CoreMotion")
+ list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,CoreMotion")
+ list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,Coremotion>")
endif()
if(SDL_FRAMEWORK_FOUNDATION)
- list(APPEND EXTRA_LDFLAGS "-Wl,-framework,Foundation")
+ list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,Foundation")
+ list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,Foundation>")
endif()
if(SDL_FRAMEWORK_GAMECONTROLLER)
find_library(GAMECONTROLLER GameController)
if(GAMECONTROLLER)
- list(APPEND EXTRA_LDFLAGS "-Wl,-weak_framework,GameController")
+ list(APPEND PKGCONFIG_LDFLAGS "-Wl,-weak_framework,GameController")
+ list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:WEAK_FRAMEWORK,GameController>")
endif()
endif()
if(SDL_FRAMEWORK_METAL)
if(IOS OR TVOS)
- list(APPEND EXTRA_LDFLAGS "-Wl,-framework,Metal")
+ list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,Metal")
+ list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,Metal>")
else()
- list(APPEND EXTRA_LDFLAGS "-Wl,-weak_framework,Metal")
+ list(APPEND PKGCONFIG_LDFLAGS "-Wl,-weak_framework,Metal")
+ list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:WEAK_FRAMEWORK,Metal>")
endif()
endif()
if(SDL_FRAMEWORK_OPENGLES)
- list(APPEND EXTRA_LDFLAGS "-Wl,-framework,OpenGLES")
+ list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,OpenGLES")
+ list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,OpenGLES>")
endif()
if(SDL_FRAMEWORK_QUARTZCORE)
if(IOS OR TVOS)
- list(APPEND EXTRA_LDFLAGS "-Wl,-framework,QuartzCore")
+ list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,QuartzCore")
+ list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,QuartzCore>")
else()
- list(APPEND EXTRA_LDFLAGS "-Wl,-weak_framework,QuartzCore")
+ list(APPEND PKGCONFIG_LDFLAGS "-Wl,-weak_framework,QuartzCore")
+ list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:WEAK_FRAMEWORK,QuartzCore>")
endif()
endif()
if(SDL_FRAMEWORK_UIKIT)
- list(APPEND EXTRA_LDFLAGS "-Wl,-framework,UIKit")
+ list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,UIKit")
+ list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,UIKit>")
endif()
if(SDL_FRAMEWORK_COREHAPTICS)
find_library(COREHAPTICS CoreHaptics)
if(COREHAPTICS)
- list(APPEND EXTRA_LDFLAGS "-Wl,-weak_framework,CoreHaptics")
+ list(APPEND PKGCONFIG_LDFLAGS "-Wl,-weak_framework,CoreHaptics")
+ list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:WEAK_FRAMEWORK,CoreHaptics>")
endif()
endif()
@@ -3152,7 +3176,7 @@ endif()
# Clean up the different lists
listtostr(EXTRA_LIBS _EXTRA_LIBS "-l")
-set(SDL_STATIC_LIBS ${EXTRA_LDFLAGS} ${_EXTRA_LIBS})
+set(SDL_STATIC_LIBS ${EXTRA_LDFLAGS} ${_EXTRA_LIBS} ${PKGCONFIG_LDFLAGS})
list(REMOVE_DUPLICATES SDL_STATIC_LIBS)
listtostr(SDL_STATIC_LIBS _SDL_STATIC_LIBS)
set(SDL_STATIC_LIBS ${_SDL_STATIC_LIBS})
@@ -3442,7 +3466,7 @@ if(SDL_SHARED)
set_property(TARGET SDL2 APPEND_STRING PROPERTY STATIC_LIBRARY_FLAGS " /NODEFAULTLIB")
endif()
# FIXME: if CMAKE_VERSION >= 3.13, use target_link_options for EXTRA_LDFLAGS
- target_link_libraries(SDL2 PRIVATE ${EXTRA_LIBS} ${EXTRA_LDFLAGS} ${EXTRA_LDFLAGS_BUILD} ${CMAKE_DEPENDS})
+ target_link_libraries(SDL2 PRIVATE ${EXTRA_LIBS} ${EXTRA_LDFLAGS} ${EXTRA_LDFLAGS_BUILD} ${CMAKE_LIBS})
target_include_directories(SDL2 PUBLIC
"$<BUILD_INTERFACE:${SDL2_BINARY_DIR}/include>"
"$<BUILD_INTERFACE:${SDL2_BINARY_DIR}/include/SDL2>"
@@ -3478,7 +3502,7 @@ if(SDL_STATIC)
target_compile_definitions(SDL2-static PRIVATE SDL_STATIC_LIB)
# TODO: Win32 platforms keep the same suffix .lib for import and static
# libraries - do we need to consider this?
- target_link_libraries(SDL2-static PRIVATE ${EXTRA_LIBS} ${EXTRA_LDFLAGS} ${CMAKE_DEPENDS})
+ target_link_libraries(SDL2-static PRIVATE ${EXTRA_LIBS} ${EXTRA_LDFLAGS} ${CMAKE_LIBS})
target_include_directories(SDL2-static PUBLIC
"$<BUILD_INTERFACE:${SDL2_BINARY_DIR}/include>"
"$<BUILD_INTERFACE:${SDL2_BINARY_DIR}/include/SDL2>"
diff --git a/cmake/sdlchecks.cmake b/cmake/sdlchecks.cmake
index 0ffb6d8cfbdb5..4c4428da7bc31 100644
--- a/cmake/sdlchecks.cmake
+++ b/cmake/sdlchecks.cmake
@@ -119,7 +119,7 @@ macro(CheckALSA)
endif()
endif()
if(NOT HAVE_ALSA_SHARED)
- list(APPEND CMAKE_DEPENDS ALSA::ALSA)
+ list(APPEND CMAKE_LIBS ALSA::ALSA)
list(APPEND PKGCONFIG_DEPENDS alsa)
endif()
set(HAVE_SDL_AUDIO TRUE)
diff --git a/cmake/test/CMakeLists.txt b/cmake/test/CMakeLists.txt
index 388e86c54ce42..f53a3ea2dda8d 100644
--- a/cmake/test/CMakeLists.txt
+++ b/cmake/test/CMakeLists.txt
@@ -3,6 +3,8 @@
cmake_minimum_required(VERSION 3.12)
project(sdl_test LANGUAGES C)
+include(CheckLanguage)
+include(FeatureSummary)
include(GenerateExportHeader)
if(ANDROID)
@@ -19,14 +21,23 @@ cmake_policy(SET CMP0074 NEW)
# Override CMAKE_FIND_ROOT_PATH_MODE to allow search for SDL2 outside of sysroot
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE NEVER)
-include(FeatureSummary)
-
option(TEST_SHARED "Test linking to shared SDL2 library" ON)
add_feature_info("TEST_SHARED" TEST_SHARED "Test linking with shared library")
option(TEST_STATIC "Test linking to static SDL2 library" ON)
add_feature_info("TEST_STATIC" TEST_STATIC "Test linking with static library")
+if(APPLE)
+ # multiple values for CMAKE_OSX_ARCHITECTURES not supported with Swift
+ list(LENGTH CMAKE_OSX_ARCHITECTURES count_osx_archs)
+ if(count_osx_archs LESS_EQUAL 1)
+ check_language(Swift)
+ if(CMAKE_Swift_COMPILER)
+ enable_language(Swift)
+ endif()
+ endif()
+endif()
+
if(TEST_SHARED)
find_package(SDL2 REQUIRED CONFIG COMPONENTS SDL2)
if(EMSCRIPTEN OR (WIN32 AND NOT WINDOWS_STORE))
@@ -75,6 +86,12 @@ if(TEST_SHARED)
generate_export_header(sharedlib-shared-vars EXPORT_MACRO_NAME MYLIBRARY_EXPORT)
target_compile_definitions(sharedlib-shared-vars PRIVATE "EXPORT_HEADER=\"${CMAKE_CURRENT_BINARY_DIR}/sharedlib-shared-vars_export.h\"")
set_target_properties(sharedlib-shared-vars PROPERTIES C_VISIBILITY_PRESET "hidden")
+
+ if(CMAKE_Swift_COMPILER)
+ add_executable(swift-shared main.swift)
+ target_include_directories(swift-shared PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/swift")
+ target_link_libraries(swift-shared PRIVATE SDL2::SDL2)
+ endif()
endif()
if(TEST_STATIC)
@@ -111,6 +128,12 @@ if(TEST_STATIC)
target_link_libraries(cli-static-vars PRIVATE ${SDL2_STATIC_LIBRARIES})
target_include_directories(cli-static-vars PRIVATE ${SDL2_INCLUDE_DIRS})
endif()
+
+ if(CMAKE_Swift_COMPILER)
+ add_executable(swift-static main.swift)
+ target_include_directories(swift-static PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/swift")
+ target_link_libraries(swift-static PRIVATE SDL2::SDL2-static)
+ endif()
endif()
message(STATUS "SDL2_PREFIX: ${SDL2_PREFIX}")
diff --git a/cmake/test/main.swift b/cmake/test/main.swift
new file mode 100644
index 0000000000000..67789fdfe1bc0
--- /dev/null
+++ b/cmake/test/main.swift
@@ -0,0 +1,12 @@
+/* Contributed by Piotr Usewicz (https://github.com/pusewicz) */
+
+import SDL2
+
+guard SDL_Init(Uint32(SDL_INIT_VIDEO)) == 0 else {
+ fatalError("SDL_Init error: \(String(cString: SDL_GetError()))")
+}
+
+var sdlVersion = SDL_version()
+SDL_GetVersion(&sdlVersion)
+
+print("SDL version: \(sdlVersion.major).\(sdlVersion.minor).\(sdlVersion.patch)")
diff --git a/cmake/test/swift/module.modulemap b/cmake/test/swift/module.modulemap
new file mode 100644
index 0000000000000..a3a627422aeb8
--- /dev/null
+++ b/cmake/test/swift/module.modulemap
@@ -0,0 +1,4 @@
+module SDL2 [extern_c] {
+ header "shim.h"
+ export *
+}
diff --git a/cmake/test/swift/shim.h b/cmake/test/swift/shim.h
new file mode 100644
index 0000000000000..ed54a9bb1d12f
--- /dev/null
+++ b/cmake/test/swift/shim.h
@@ -0,0 +1,3 @@
+/* Contributed by Piotr Usewicz (https://github.com/pusewicz) */
+
+#include "SDL.h"
diff --git a/sdl2-config.cmake.in b/sdl2-config.cmake.in
index 842f826bb5a3f..f3fa08c218318 100644
--- a/sdl2-config.cmake.in
+++ b/sdl2-config.cmake.in
@@ -56,6 +56,9 @@ list(APPEND _sdl2_libdirs "${SDL2_LIBDIR}")
string(REGEX MATCHALL "(-[lm]([-a-zA-Z0-9._]+))|(-Wl,[^ ]*framework[^ ]*)|(-pthread)" _sdl2_static_private_libs "${_sdl2_static_private_libs_in}")
string(REGEX REPLACE "^-l" "" _sdl2_static_private_libs "${_sdl2_static_private_libs}")
string(REGEX REPLACE ";-l" ";" _sdl2_static_private_libs "${_sdl2_static_private_libs}")
+string(REGEX REPLACE "-Wl,-framework,([a-zA-Z0-9_]+)" "$<LINK_LIBRARY:FRAMEWORK,\\1>" _sdl2_static_private_libs "${_sdl2_static_private_libs}")
+string(REGEX REPLACE "-Wl,-weak_framework,([a-zA-Z0-9_]+)" "$<LINK_LIBRARY:WEAK_FRAMEWORK,\\1>" _sdl2_static_private_libs "${_sdl2_static_private_libs}")
+
string(REGEX MATCHALL "-L([-a-zA-Z0-9._/]+)" _sdl2_static_private_libdirs "${_sdl2_static_private_libs_in}")
string(REGEX REPLACE "^-L" "" _sdl2_static_private_libdirs "${_sdl2_static_private_libdirs}")
string(REGEX REPLACE ";-L" ";" _sdl2_static_private_libdirs "${_sdl2_static_private_libdirs}")