Skip to content

Commit

Permalink
cmake: use genexes for linking against apple frameworks
Browse files Browse the repository at this point in the history
  • Loading branch information
madebr committed Jul 27, 2024
1 parent fd32342 commit fa4e6ec
Show file tree
Hide file tree
Showing 6 changed files with 92 additions and 25 deletions.
72 changes: 48 additions & 24 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()

Expand Down Expand Up @@ -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})
Expand Down Expand Up @@ -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>"
Expand Down Expand Up @@ -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>"
Expand Down
2 changes: 1 addition & 1 deletion cmake/sdlchecks.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
24 changes: 24 additions & 0 deletions cmake/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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})
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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-shared main.swift)
target_include_directories(swift-shared PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/swift")
target_link_libraries(swift-shared PRIVATE SDL2::SDL2-static)
endif()
endif()

message(STATUS "SDL2_PREFIX: ${SDL2_PREFIX}")
Expand Down
12 changes: 12 additions & 0 deletions cmake/test/main.swift
Original file line number Diff line number Diff line change
@@ -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)")
4 changes: 4 additions & 0 deletions cmake/test/swift/module.modulemap
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module SDL2 [extern_c] {
header "shim.h"
export *
}
3 changes: 3 additions & 0 deletions cmake/test/swift/shim.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
/* Contributed by Piotr Usewicz (https://github.com/pusewicz) */

#include <SDL2/SDL.h>

0 comments on commit fa4e6ec

Please sign in to comment.