Skip to content

Commit 50a6a39

Browse files
committed
cmake: use genexes for linking against apple frameworks
1 parent 7306649 commit 50a6a39

File tree

7 files changed

+96
-27
lines changed

7 files changed

+96
-27
lines changed

CMakeLists.txt

Lines changed: 48 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ endif()
2222
set(EXTRA_LIBS)
2323
set(EXTRA_LDFLAGS)
2424

25-
set(CMAKE_DEPENDS)
25+
set(CMAKE_LIBS)
26+
set(PKGCONFIG_LDFLAGS)
2627
set(PKGCONFIG_DEPENDS)
2728

2829
# This is a virtual "library" that just exists to collect up compiler and
@@ -2284,73 +2285,96 @@ elseif(APPLE)
22842285
endif()
22852286
endif()
22862287

2288+
# Minimum version for $<LINK_LIBRARY:feature,library-list>
2289+
cmake_minimum_required(VERSION 3.24)
2290+
22872291
# Actually load the frameworks at the end so we don't duplicate include.
22882292
if(SDL_FRAMEWORK_COREVIDEO)
2289-
list(APPEND EXTRA_LDFLAGS "-Wl,-framework,CoreVideo")
2293+
list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,CoreVideo")
2294+
list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,CoreVideo>")
22902295
endif()
22912296
if(SDL_FRAMEWORK_COCOA)
2292-
list(APPEND EXTRA_LDFLAGS "-Wl,-framework,Cocoa")
2297+
list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,Cocoa")
2298+
list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,Cocoa>")
22932299
endif()
22942300
if(SDL_FRAMEWORK_IOKIT)
2295-
list(APPEND EXTRA_LDFLAGS "-Wl,-framework,IOKit")
2301+
list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,IOKit")
2302+
list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,IOKit>")
22962303
endif()
22972304
if(SDL_FRAMEWORK_FF)
2298-
list(APPEND EXTRA_LDFLAGS "-Wl,-framework,ForceFeedback")
2305+
list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,ForceFeedback")
2306+
list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,ForceFeedback>")
22992307
endif()
23002308
if(SDL_FRAMEWORK_CARBON)
2301-
list(APPEND EXTRA_LDFLAGS "-Wl,-framework,Carbon")
2309+
list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,Carbon")
2310+
list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,Carbon>")
23022311
endif()
23032312
if(SDL_FRAMEWORK_COREAUDIO)
2304-
list(APPEND EXTRA_LDFLAGS "-Wl,-framework,CoreAudio")
2313+
list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,CoreAudio")
2314+
list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,CoreAudio>")
23052315
endif()
23062316
if(SDL_FRAMEWORK_AUDIOTOOLBOX)
2307-
list(APPEND EXTRA_LDFLAGS "-Wl,-framework,AudioToolbox")
2317+
list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,AudioToolbox")
2318+
list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,AudioToolbox>")
23082319
endif()
23092320
if(SDL_FRAMEWORK_AVFOUNDATION)
2310-
list(APPEND EXTRA_LDFLAGS "-Wl,-framework,AVFoundation")
2321+
list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,AVFoundation")
2322+
list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,AVFoundation>")
23112323
endif()
23122324
if(SDL_FRAMEWORK_COREBLUETOOTH)
2313-
list(APPEND EXTRA_LDFLAGS "-Wl,-framework,CoreBluetooth")
2325+
list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,CoreBluetooth")
2326+
list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,CoreBluetooth>")
23142327
endif()
23152328
if(SDL_FRAMEWORK_COREGRAPHICS)
2316-
list(APPEND EXTRA_LDFLAGS "-Wl,-framework,CoreGraphics")
2329+
list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,CoreGraphics")
2330+
list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,CoreGraphics>")
23172331
endif()
23182332
if(SDL_FRAMEWORK_COREMOTION)
2319-
list(APPEND EXTRA_LDFLAGS "-Wl,-framework,CoreMotion")
2333+
list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,CoreMotion")
2334+
list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,Coremotion>")
23202335
endif()
23212336
if(SDL_FRAMEWORK_FOUNDATION)
2322-
list(APPEND EXTRA_LDFLAGS "-Wl,-framework,Foundation")
2337+
list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,Foundation")
2338+
list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,Foundation>")
23232339
endif()
23242340
if(SDL_FRAMEWORK_GAMECONTROLLER)
23252341
find_library(GAMECONTROLLER GameController)
23262342
if(GAMECONTROLLER)
2327-
list(APPEND EXTRA_LDFLAGS "-Wl,-weak_framework,GameController")
2343+
list(APPEND PKGCONFIG_LDFLAGS "-Wl,-weak_framework,GameController")
2344+
list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:WEAK_FRAMEWORK,GameController>")
23282345
endif()
23292346
endif()
23302347
if(SDL_FRAMEWORK_METAL)
23312348
if(IOS OR TVOS)
2332-
list(APPEND EXTRA_LDFLAGS "-Wl,-framework,Metal")
2349+
list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,Metal")
2350+
list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,Metal>")
23332351
else()
2334-
list(APPEND EXTRA_LDFLAGS "-Wl,-weak_framework,Metal")
2352+
list(APPEND PKGCONFIG_LDFLAGS "-Wl,-weak_framework,Metal")
2353+
list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:WEAK_FRAMEWORK,Metal>")
23352354
endif()
23362355
endif()
23372356
if(SDL_FRAMEWORK_OPENGLES)
2338-
list(APPEND EXTRA_LDFLAGS "-Wl,-framework,OpenGLES")
2357+
list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,OpenGLES")
2358+
list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,OpenGLES>")
23392359
endif()
23402360
if(SDL_FRAMEWORK_QUARTZCORE)
23412361
if(IOS OR TVOS)
2342-
list(APPEND EXTRA_LDFLAGS "-Wl,-framework,QuartzCore")
2362+
list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,QuartzCore")
2363+
list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,QuartzCore>")
23432364
else()
2344-
list(APPEND EXTRA_LDFLAGS "-Wl,-weak_framework,QuartzCore")
2365+
list(APPEND PKGCONFIG_LDFLAGS "-Wl,-weak_framework,QuartzCore")
2366+
list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:WEAK_FRAMEWORK,QuartzCore>")
23452367
endif()
23462368
endif()
23472369
if(SDL_FRAMEWORK_UIKIT)
2348-
list(APPEND EXTRA_LDFLAGS "-Wl,-framework,UIKit")
2370+
list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,UIKit")
2371+
list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:FRAMEWORK,UIKit>")
23492372
endif()
23502373
if(SDL_FRAMEWORK_COREHAPTICS)
23512374
find_library(COREHAPTICS CoreHaptics)
23522375
if(COREHAPTICS)
2353-
list(APPEND EXTRA_LDFLAGS "-Wl,-weak_framework,CoreHaptics")
2376+
list(APPEND PKGCONFIG_LDFLAGS "-Wl,-weak_framework,CoreHaptics")
2377+
list(APPEND CMAKE_LIBS "$<LINK_LIBRARY:WEAK_FRAMEWORK,CoreHaptics>")
23542378
endif()
23552379
endif()
23562380

@@ -3152,7 +3176,7 @@ endif()
31523176

31533177
# Clean up the different lists
31543178
listtostr(EXTRA_LIBS _EXTRA_LIBS "-l")
3155-
set(SDL_STATIC_LIBS ${EXTRA_LDFLAGS} ${_EXTRA_LIBS})
3179+
set(SDL_STATIC_LIBS ${EXTRA_LDFLAGS} ${_EXTRA_LIBS} ${PKGCONFIG_LDFLAGS})
31563180
list(REMOVE_DUPLICATES SDL_STATIC_LIBS)
31573181
listtostr(SDL_STATIC_LIBS _SDL_STATIC_LIBS)
31583182
set(SDL_STATIC_LIBS ${_SDL_STATIC_LIBS})
@@ -3442,7 +3466,7 @@ if(SDL_SHARED)
34423466
set_property(TARGET SDL2 APPEND_STRING PROPERTY STATIC_LIBRARY_FLAGS " /NODEFAULTLIB")
34433467
endif()
34443468
# FIXME: if CMAKE_VERSION >= 3.13, use target_link_options for EXTRA_LDFLAGS
3445-
target_link_libraries(SDL2 PRIVATE ${EXTRA_LIBS} ${EXTRA_LDFLAGS} ${EXTRA_LDFLAGS_BUILD} ${CMAKE_DEPENDS})
3469+
target_link_libraries(SDL2 PRIVATE ${EXTRA_LIBS} ${EXTRA_LDFLAGS} ${EXTRA_LDFLAGS_BUILD} ${CMAKE_LIBS})
34463470
target_include_directories(SDL2 PUBLIC
34473471
"$<BUILD_INTERFACE:${SDL2_BINARY_DIR}/include>"
34483472
"$<BUILD_INTERFACE:${SDL2_BINARY_DIR}/include/SDL2>"
@@ -3478,7 +3502,7 @@ if(SDL_STATIC)
34783502
target_compile_definitions(SDL2-static PRIVATE SDL_STATIC_LIB)
34793503
# TODO: Win32 platforms keep the same suffix .lib for import and static
34803504
# libraries - do we need to consider this?
3481-
target_link_libraries(SDL2-static PRIVATE ${EXTRA_LIBS} ${EXTRA_LDFLAGS} ${CMAKE_DEPENDS})
3505+
target_link_libraries(SDL2-static PRIVATE ${EXTRA_LIBS} ${EXTRA_LDFLAGS} ${CMAKE_LIBS})
34823506
target_include_directories(SDL2-static PUBLIC
34833507
"$<BUILD_INTERFACE:${SDL2_BINARY_DIR}/include>"
34843508
"$<BUILD_INTERFACE:${SDL2_BINARY_DIR}/include/SDL2>"

cmake/sdlchecks.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ macro(CheckALSA)
119119
endif()
120120
endif()
121121
if(NOT HAVE_ALSA_SHARED)
122-
list(APPEND CMAKE_DEPENDS ALSA::ALSA)
122+
list(APPEND CMAKE_LIBS ALSA::ALSA)
123123
list(APPEND PKGCONFIG_DEPENDS alsa)
124124
endif()
125125
set(HAVE_SDL_AUDIO TRUE)

cmake/test/CMakeLists.txt

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
cmake_minimum_required(VERSION 3.12)
44
project(sdl_test LANGUAGES C)
55

6+
include(CheckLanguage)
7+
include(FeatureSummary)
68
include(GenerateExportHeader)
79

810
if(ANDROID)
@@ -19,14 +21,23 @@ cmake_policy(SET CMP0074 NEW)
1921
# Override CMAKE_FIND_ROOT_PATH_MODE to allow search for SDL2 outside of sysroot
2022
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE NEVER)
2123

22-
include(FeatureSummary)
23-
2424
option(TEST_SHARED "Test linking to shared SDL2 library" ON)
2525
add_feature_info("TEST_SHARED" TEST_SHARED "Test linking with shared library")
2626

2727
option(TEST_STATIC "Test linking to static SDL2 library" ON)
2828
add_feature_info("TEST_STATIC" TEST_STATIC "Test linking with static library")
2929

30+
if(APPLE)
31+
# multiple values for CMAKE_OSX_ARCHITECTURES not supported with Swift
32+
list(LENGTH CMAKE_OSX_ARCHITECTURES count_osx_archs)
33+
if(count_osx_archs LESS_EQUAL 1)
34+
check_language(Swift)
35+
if(CMAKE_Swift_COMPILER)
36+
enable_language(Swift)
37+
endif()
38+
endif()
39+
endif()
40+
3041
if(TEST_SHARED)
3142
find_package(SDL2 REQUIRED CONFIG COMPONENTS SDL2)
3243
if(EMSCRIPTEN OR (WIN32 AND NOT WINDOWS_STORE))
@@ -75,6 +86,12 @@ if(TEST_SHARED)
7586
generate_export_header(sharedlib-shared-vars EXPORT_MACRO_NAME MYLIBRARY_EXPORT)
7687
target_compile_definitions(sharedlib-shared-vars PRIVATE "EXPORT_HEADER=\"${CMAKE_CURRENT_BINARY_DIR}/sharedlib-shared-vars_export.h\"")
7788
set_target_properties(sharedlib-shared-vars PROPERTIES C_VISIBILITY_PRESET "hidden")
89+
90+
if(CMAKE_Swift_COMPILER)
91+
add_executable(swift-shared main.swift)
92+
target_include_directories(swift-shared PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/swift")
93+
target_link_libraries(swift-shared PRIVATE SDL2::SDL2)
94+
endif()
7895
endif()
7996

8097
if(TEST_STATIC)
@@ -111,6 +128,12 @@ if(TEST_STATIC)
111128
target_link_libraries(cli-static-vars PRIVATE ${SDL2_STATIC_LIBRARIES})
112129
target_include_directories(cli-static-vars PRIVATE ${SDL2_INCLUDE_DIRS})
113130
endif()
131+
132+
if(CMAKE_Swift_COMPILER)
133+
add_executable(swift-static main.swift)
134+
target_include_directories(swift-static PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/swift")
135+
target_link_libraries(swift-static PRIVATE SDL2::SDL2-static)
136+
endif()
114137
endif()
115138

116139
message(STATUS "SDL2_PREFIX: ${SDL2_PREFIX}")

cmake/test/main.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/* Contributed by Piotr Usewicz (https://github.com/pusewicz) */
2+
3+
import SDL2
4+
5+
guard SDL_Init(Uint32(SDL_INIT_VIDEO)) == 0 else {
6+
fatalError("SDL_Init error: \(String(cString: SDL_GetError()))")
7+
}
8+
9+
var sdlVersion = SDL_version()
10+
SDL_GetVersion(&sdlVersion)
11+
12+
print("SDL version: \(sdlVersion.major).\(sdlVersion.minor).\(sdlVersion.patch)")

cmake/test/swift/module.modulemap

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
module SDL2 [extern_c] {
2+
header "shim.h"
3+
export *
4+
}

cmake/test/swift/shim.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
/* Contributed by Piotr Usewicz (https://github.com/pusewicz) */
2+
3+
#include "SDL.h"

sdl2-config.cmake.in

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ list(APPEND _sdl2_libdirs "${SDL2_LIBDIR}")
5656
string(REGEX MATCHALL "(-[lm]([-a-zA-Z0-9._]+))|(-Wl,[^ ]*framework[^ ]*)|(-pthread)" _sdl2_static_private_libs "${_sdl2_static_private_libs_in}")
5757
string(REGEX REPLACE "^-l" "" _sdl2_static_private_libs "${_sdl2_static_private_libs}")
5858
string(REGEX REPLACE ";-l" ";" _sdl2_static_private_libs "${_sdl2_static_private_libs}")
59+
string(REGEX REPLACE "-Wl,-framework,([a-zA-Z0-9_]+)" "$<LINK_LIBRARY:FRAMEWORK,\\1>" _sdl2_static_private_libs "${_sdl2_static_private_libs}")
60+
string(REGEX REPLACE "-Wl,-weak_framework,([a-zA-Z0-9_]+)" "$<LINK_LIBRARY:WEAK_FRAMEWORK,\\1>" _sdl2_static_private_libs "${_sdl2_static_private_libs}")
61+
5962
string(REGEX MATCHALL "-L([-a-zA-Z0-9._/]+)" _sdl2_static_private_libdirs "${_sdl2_static_private_libs_in}")
6063
string(REGEX REPLACE "^-L" "" _sdl2_static_private_libdirs "${_sdl2_static_private_libdirs}")
6164
string(REGEX REPLACE ";-L" ";" _sdl2_static_private_libdirs "${_sdl2_static_private_libdirs}")

0 commit comments

Comments
 (0)