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..fff7bbf71118b 100644 --- a/cmake/test/CMakeLists.txt +++ b/cmake/test/CMakeLists.txt @@ -3,8 +3,20 @@ cmake_minimum_required(VERSION 3.12) project(sdl_test LANGUAGES C) +include(CheckLanguage) include(GenerateExportHeader) +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(ANDROID) macro(add_executable NAME) set(args ${ARGN}) @@ -75,6 +87,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 +129,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"