From 37881b3150e6a26419f7b2b84c24d6d33a0f52c6 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 26 Jul 2024 18:16:58 +0200 Subject: [PATCH] cmake: use genex to link with Apple Frameworks --- CMakeLists.txt | 47 ++++++++++++++++++++++-------------------- cmake/sdltargets.cmake | 21 ++++++++++++------- 2 files changed, 39 insertions(+), 29 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1989bfae73..89c0e89916 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2347,77 +2347,80 @@ 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) find_library(COREMEDIA CoreMedia) if(COREMEDIA) - sdl_link_dependency(corevideo LINK_OPTIONS "-Wl,-framework,CoreMedia") + sdl_link_dependency(corevideo LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,CoreMedia") endif() - sdl_link_dependency(corevideo LINK_OPTIONS "-Wl,-framework,CoreVideo") + sdl_link_dependency(corevideo LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,CoreVideo") endif() if(SDL_FRAMEWORK_COCOA) - sdl_link_dependency(cocoa LINK_OPTIONS "-Wl,-framework,Cocoa") + sdl_link_dependency(cocoa LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,Cocoa") endif() if(SDL_FRAMEWORK_IOKIT) - sdl_link_dependency(iokit LINK_OPTIONS "-Wl,-framework,IOKit") + sdl_link_dependency(iokit LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,IOKit") endif() if(SDL_FRAMEWORK_FF) - sdl_link_dependency(ff LINK_OPTIONS "-Wl,-framework,ForceFeedback") + sdl_link_dependency(ff LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,ForceFeedback") endif() if(SDL_FRAMEWORK_CARBON) - sdl_link_dependency(carbon LINK_OPTIONS "-Wl,-framework,Carbon") + sdl_link_dependency(carbon LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,Carbon") endif() if(SDL_FRAMEWORK_COREAUDIO) - sdl_link_dependency(core_audio LINK_OPTIONS "-Wl,-framework,CoreAudio") + sdl_link_dependency(core_audio LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,CoreAudio") endif() if(SDL_FRAMEWORK_AUDIOTOOLBOX) - sdl_link_dependency(audio_toolbox LINK_OPTIONS "-Wl,-framework,AudioToolbox") + sdl_link_dependency(audio_toolbox LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,AudioToolbox") endif() if(SDL_FRAMEWORK_AVFOUNDATION) - sdl_link_dependency(av_foundation LINK_OPTIONS "-Wl,-framework,AVFoundation") + sdl_link_dependency(av_foundation LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,AVFoundation") endif() if(SDL_FRAMEWORK_COREBLUETOOTH) - sdl_link_dependency(core_bluetooth LINK_OPTIONS "-Wl,-framework,CoreBluetooth") + sdl_link_dependency(core_bluetooth LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,CoreBluetooth") endif() if(SDL_FRAMEWORK_COREGRAPHICS) - sdl_link_dependency(core_graphics LINK_OPTIONS "-Wl,-framework,CoreGraphics") + sdl_link_dependency(core_graphics LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,CoreGraphics") endif() if(SDL_FRAMEWORK_COREMOTION) - sdl_link_dependency(core_motion LINK_OPTIONS "-Wl,-framework,CoreMotion") + sdl_link_dependency(core_motion LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,CoreMotion") endif() if(SDL_FRAMEWORK_FOUNDATION) - sdl_link_dependency(foundation LINK_OPTIONS "-Wl,-framework,Foundation") + sdl_link_dependency(foundation LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,Foundation") endif() if(SDL_FRAMEWORK_GAMECONTROLLER) find_library(GAMECONTROLLER GameController) if(GAMECONTROLLER) - sdl_link_dependency(game_controller LINK_OPTIONS "-Wl,-weak_framework,GameController") + sdl_link_dependency(game_controller LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-weak_framework,GameController") endif() endif() if(SDL_FRAMEWORK_METAL) if(IOS OR TVOS OR VISIONOS OR WATCHOS) - sdl_link_dependency(metal LINK_OPTIONS "-Wl,-framework,Metal") + sdl_link_dependency(metal LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,Metal") else() - sdl_link_dependency(metal LINK_OPTIONS "-Wl,-weak_framework,Metal") + sdl_link_dependency(metal LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-weak_framework,Metal") endif() endif() if(SDL_FRAMEWORK_OPENGLES) - sdl_link_dependency(opengles LINK_OPTIONS "-Wl,-framework,OpenGLES") + sdl_link_dependency(opengles LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,OpenGLES") endif() if(SDL_FRAMEWORK_QUARTZCORE) if(IOS OR TVOS OR VISIONOS OR WATCHOS) - sdl_link_dependency(quartz_core LINK_OPTIONS "-Wl,-framework,QuartzCore") + sdl_link_dependency(quartz_core LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,QuartzCore") else() - sdl_link_dependency(metal LINK_OPTIONS "-Wl,-weak_framework,QuartzCore") + sdl_link_dependency(metal LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-weak_framework,QuartzCore") endif() endif() if(SDL_FRAMEWORK_UIKIT) - sdl_link_dependency(ui_kit LINK_OPTIONS "-Wl,-framework,UIKit") + sdl_link_dependency(ui_kit LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,UIKit") endif() if(SDL_FRAMEWORK_COREHAPTICS) find_library(COREHAPTICS CoreHaptics) if(COREHAPTICS) - sdl_link_dependency(core_haptics LINK_OPTIONS "-Wl,-framework,CoreHaptics") + sdl_link_dependency(core_haptics LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,CoreHaptics") endif() endif() @@ -2885,7 +2888,7 @@ if (SDL_DIALOG) set(HAVE_SDL_DIALOG TRUE) elseif(MACOS) sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/cocoa/SDL_cocoadialog.m) - sdl_link_dependency(uniformtypeidentifiers LINK_OPTIONS "-Wl,-weak_framework,UniformTypeIdentifiers") + sdl_link_dependency(uniformtypeidentifiers LIBS "$" PKG_CONFIG_LINK_OPTIONS "-Wl,-weak_framework,UniformTypeIdentifiers") set(HAVE_SDL_DIALOG TRUE) endif() endif() diff --git a/cmake/sdltargets.cmake b/cmake/sdltargets.cmake index e4a870db5e..d11061c9cb 100644 --- a/cmake/sdltargets.cmake +++ b/cmake/sdltargets.cmake @@ -28,7 +28,7 @@ function(sdl_sources) set_property(TARGET SDL3-collector APPEND PROPERTY INTERFACE_SOURCES ${ARGS_SHARED} ${ARGS_STATIC} ${ARGS_UNPARSED_ARGUMENTS}) endfunction() -# Use sdl_generic_link_dependency to describe a private dependency of SDL3. All options are optional. +# Use sdl_generic_link_dependency to describe a private dependency. All options are optional. # Users should use sdl_link_dependency and sdl_test_link_dependency instead # - SHARED_TARGETS: shared targets to add this dependency to # - STATIC_TARGETS: static targets to add this dependency to @@ -36,12 +36,13 @@ endfunction() # - INCLUDES: the include directories of the dependency # - PKG_CONFIG_PREFIX: name of the prefix, when using the functions of FindPkgConfig # - PKG_CONFIG_SPECS: pkg-config spec, used as argument for the functions of FindPkgConfig -# - PKG_CONFIG_LIBS: libs that will only end up in the Libs.private of sdl3.pc +# - PKG_CONFIG_LIBS: libs that will only end up in the Libs.private of the .pc file +# - PKG_CONFIG_LINK_OPTIONS: ldflags that will only end up in the Libs.private of sdl3.pc # - CMAKE_MODULE: CMake module name of the dependency, used as argument of find_package -# - LIBS: list of libraries to link to -# - LINK_OPTIONS: list of link options +# - LIBS: list of libraries to link to (cmake and pkg-config) +# - LINK_OPTIONS: list of link options (also used in pc file, unless PKG_CONFIG_LINK_OPTION is used) function(sdl_generic_link_dependency ID) - cmake_parse_arguments(ARGS "" "COLLECTOR" "SHARED_TARGETS;STATIC_TARGETS;INCLUDES;PKG_CONFIG_LIBS;PKG_CONFIG_PREFIX;PKG_CONFIG_SPECS;CMAKE_MODULE;LIBS;LINK_OPTIONS" ${ARGN}) + cmake_parse_arguments(ARGS "" "COLLECTOR" "SHARED_TARGETS;STATIC_TARGETS;INCLUDES;PKG_CONFIG_LINK_OPTIONS;PKG_CONFIG_LIBS;PKG_CONFIG_PREFIX;PKG_CONFIG_SPECS;CMAKE_MODULE;LIBS;LINK_OPTIONS" ${ARGN}) foreach(target IN LISTS ARGS_SHARED_TARGETS) if(TARGET ${target}) target_include_directories(${target} SYSTEM PRIVATE ${ARGS_INCLUDES}) @@ -63,6 +64,7 @@ function(sdl_generic_link_dependency ID) set_property(TARGET ${ARGS_COLLECTOR} APPEND PROPERTY INTERFACE_SDL_DEP_${ID}_PKG_CONFIG_PREFIX ${ARGS_PKG_CONFIG_PREFIX}) set_property(TARGET ${ARGS_COLLECTOR} APPEND PROPERTY INTERFACE_SDL_DEP_${ID}_PKG_CONFIG_SPECS ${ARGS_PKG_CONFIG_SPECS}) set_property(TARGET ${ARGS_COLLECTOR} APPEND PROPERTY INTERFACE_SDL_DEP_${ID}_PKG_CONFIG_LIBS ${ARGS_PKG_CONFIG_LIBS}) + set_property(TARGET ${ARGS_COLLECTOR} APPEND PROPERTY INTERFACE_SDL_DEP_${ID}_PKG_CONFIG_LINK_OPTIONS ${ARGS_PKG_CONFIG_LINK_OPTIONS}) set_property(TARGET ${ARGS_COLLECTOR} APPEND PROPERTY INTERFACE_SDL_DEP_${ID}_LIBS ${ARGS_LIBS}) set_property(TARGET ${ARGS_COLLECTOR} APPEND PROPERTY INTERFACE_SDL_DEP_${ID}_LINK_OPTIONS ${ARGS_LINK_OPTIONS}) set_property(TARGET ${ARGS_COLLECTOR} APPEND PROPERTY INTERFACE_SDL_DEP_${ID}_CMAKE_MODULE ${ARGS_CMAKE_MODULE}) @@ -294,14 +296,19 @@ function(configure_sdl3_pc) get_property(CMAKE_MODULE TARGET SDL3-collector PROPERTY INTERFACE_SDL_DEP_${ID}_CMAKE_MODULE) get_property(PKG_CONFIG_SPECS TARGET SDL3-collector PROPERTY INTERFACE_SDL_DEP_${ID}_PKG_CONFIG_SPECS) get_property(PKG_CONFIG_LIBS TARGET SDL3-collector PROPERTY INTERFACE_SDL_DEP_${ID}_PKG_CONFIG_LIBS) + get_property(PKG_CONFIG_LDFLAGS TARGET SDL3-collector PROPERTY INTERFACE_SDL_DEP_${ID}_PKG_CONFIG_LINK_OPTIONS) get_property(LIBS TARGET SDL3-collector PROPERTY INTERFACE_SDL_DEP_${ID}_LIBS) get_property(LINK_OPTIONS TARGET SDL3-collector PROPERTY INTERFACE_SDL_DEP_${ID}_LINK_OPTIONS) list(APPEND private_requires ${PKG_CONFIG_SPECS}) list(APPEND private_libs ${PKG_CONFIG_LIBS}) - if(NOT PKG_CONFIG_SPECS AND NOT CMAKE_MODULE) - list(APPEND private_libs ${LIBS}) + if(PKG_CONFIG_SPECS OR PKG_CONFIG_LIBS OR PKG_CONFIG_LDFLAGS) + list(APPEND private_ldflags ${PKG_CONFIG_LDFLAGS}) + else() list(APPEND private_ldflags ${LINK_OPTIONS}) + if(NOT CMAKE_MODULE) + list(APPEND private_libs ${LIBS}) + endif() endif() endforeach()