cmake: use genexes for linking against apple frameworks

This commit is contained in:
Anonymous Maarten 2024-07-27 15:41:33 +02:00
parent 73066492f6
commit 50a6a39dd6
7 changed files with 96 additions and 27 deletions

View File

@ -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>"

View File

@ -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)

View File

@ -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}")

12
cmake/test/main.swift Normal file
View File

@ -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)")

View File

@ -0,0 +1,4 @@
module SDL2 [extern_c] {
header "shim.h"
export *
}

3
cmake/test/swift/shim.h Normal file
View File

@ -0,0 +1,3 @@
/* Contributed by Piotr Usewicz (https://github.com/pusewicz) */
#include "SDL.h"

View File

@ -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}")