From a82794c0f3679b0dddc6a551d5272aad9db86ab4 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten 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 $ + 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 "$") endif() if(SDL_FRAMEWORK_COCOA) - list(APPEND EXTRA_LDFLAGS "-Wl,-framework,Cocoa") + list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,Cocoa") + list(APPEND CMAKE_LIBS "$") endif() if(SDL_FRAMEWORK_IOKIT) - list(APPEND EXTRA_LDFLAGS "-Wl,-framework,IOKit") + list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,IOKit") + list(APPEND CMAKE_LIBS "$") endif() if(SDL_FRAMEWORK_FF) - list(APPEND EXTRA_LDFLAGS "-Wl,-framework,ForceFeedback") + list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,ForceFeedback") + list(APPEND CMAKE_LIBS "$") endif() if(SDL_FRAMEWORK_CARBON) - list(APPEND EXTRA_LDFLAGS "-Wl,-framework,Carbon") + list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,Carbon") + list(APPEND CMAKE_LIBS "$") endif() if(SDL_FRAMEWORK_COREAUDIO) - list(APPEND EXTRA_LDFLAGS "-Wl,-framework,CoreAudio") + list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,CoreAudio") + list(APPEND CMAKE_LIBS "$") endif() if(SDL_FRAMEWORK_AUDIOTOOLBOX) - list(APPEND EXTRA_LDFLAGS "-Wl,-framework,AudioToolbox") + list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,AudioToolbox") + list(APPEND CMAKE_LIBS "$") endif() if(SDL_FRAMEWORK_AVFOUNDATION) - list(APPEND EXTRA_LDFLAGS "-Wl,-framework,AVFoundation") + list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,AVFoundation") + list(APPEND CMAKE_LIBS "$") endif() if(SDL_FRAMEWORK_COREBLUETOOTH) - list(APPEND EXTRA_LDFLAGS "-Wl,-framework,CoreBluetooth") + list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,CoreBluetooth") + list(APPEND CMAKE_LIBS "$") endif() if(SDL_FRAMEWORK_COREGRAPHICS) - list(APPEND EXTRA_LDFLAGS "-Wl,-framework,CoreGraphics") + list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,CoreGraphics") + list(APPEND CMAKE_LIBS "$") endif() if(SDL_FRAMEWORK_COREMOTION) - list(APPEND EXTRA_LDFLAGS "-Wl,-framework,CoreMotion") + list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,CoreMotion") + list(APPEND CMAKE_LIBS "$") endif() if(SDL_FRAMEWORK_FOUNDATION) - list(APPEND EXTRA_LDFLAGS "-Wl,-framework,Foundation") + list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,Foundation") + list(APPEND CMAKE_LIBS "$") 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 "$") 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 "$") else() - list(APPEND EXTRA_LDFLAGS "-Wl,-weak_framework,Metal") + list(APPEND PKGCONFIG_LDFLAGS "-Wl,-weak_framework,Metal") + list(APPEND CMAKE_LIBS "$") endif() endif() if(SDL_FRAMEWORK_OPENGLES) - list(APPEND EXTRA_LDFLAGS "-Wl,-framework,OpenGLES") + list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,OpenGLES") + list(APPEND CMAKE_LIBS "$") 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 "$") else() - list(APPEND EXTRA_LDFLAGS "-Wl,-weak_framework,QuartzCore") + list(APPEND PKGCONFIG_LDFLAGS "-Wl,-weak_framework,QuartzCore") + list(APPEND CMAKE_LIBS "$") endif() endif() if(SDL_FRAMEWORK_UIKIT) - list(APPEND EXTRA_LDFLAGS "-Wl,-framework,UIKit") + list(APPEND PKGCONFIG_LDFLAGS "-Wl,-framework,UIKit") + list(APPEND CMAKE_LIBS "$") 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 "$") 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 "$" "$" @@ -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 "$" "$" 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_]+)" "$" _sdl2_static_private_libs "${_sdl2_static_private_libs}") +string(REGEX REPLACE "-Wl,-weak_framework,([a-zA-Z0-9_]+)" "$" _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}")