WIP: [cmake] allow static MoltenVK, fix IOKit link
All checks were successful
eden-license / license-header (pull_request) Successful in 25s

Signed-off-by: crueter <crueter@eden-emu.dev>
This commit is contained in:
crueter 2025-10-07 13:10:12 -04:00
parent cf0628af46
commit d086d75cab
Signed by: crueter
GPG key ID: 425ACD2D4830EBC6
3 changed files with 62 additions and 15 deletions

View file

@ -238,7 +238,7 @@ function(download_qt target)
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
endfunction()
function(download_moltenvk version platform)
function(download_moltenvk platform version)
if(NOT version)
message(FATAL_ERROR "download_moltenvk: version argument is required")
endif()
@ -249,12 +249,17 @@ function(download_moltenvk version platform)
set(MOLTENVK_DIR "${CMAKE_BINARY_DIR}/externals/MoltenVK")
set(MOLTENVK_TAR "${CMAKE_BINARY_DIR}/externals/MoltenVK.tar")
message(STATUS "Using bundled MoltenVK")
if(NOT EXISTS "${MOLTENVK_DIR}")
if(NOT EXISTS "${MOLTENVK_TAR}")
message(STATUS "Downloading MoltenVK ${version}")
file(DOWNLOAD "https://github.com/KhronosGroup/MoltenVK/releases/download/${version}/MoltenVK-${platform}.tar"
"${MOLTENVK_TAR}" SHOW_PROGRESS)
endif()
message(STATUS "Extracting MoltenVK tarball at ${MOLTENVK_TAR}")
execute_process(
COMMAND ${CMAKE_COMMAND} -E tar xf "${MOLTENVK_TAR}"
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals"
@ -265,7 +270,36 @@ function(download_moltenvk version platform)
message(FATAL_ERROR "Extracting MoltenVK failed: ${tar_err}")
endif()
endif()
list(APPEND CMAKE_PREFIX_PATH "${MOLTENVK_DIR}/MoltenVK/dylib/${platform}")
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
endfunction()
# TODO: is this portable?
set(MVK_STATIC "${MOLTENVK_DIR}/MoltenVK/static/MoltenVK.xcframework/macos-arm64_x86_64/libMoltenVK.a")
set(MVK_DYLIB "${MOLTENVK_DIR}/MoltenVK/dylib/${platform}/libMoltenVK.dylib")
# prefer static lib if it exists for smaller executable size
if (EXISTS "${MVK_STATIC}")
# Using static MoltenVK requires linking to a few extra libraries
find_library(IOSURFACE_LIBRARY IOSurface)
if(NOT IOSURFACE_LIBRARY)
message(FATAL_ERROR "IOSurface not found, did you install XCode tools?")
endif()
find_library(QUARTZCORE_LIBRARY QuartzCore)
if(NOT QUARTZCORE_LIBRARY)
message(FATAL_ERROR "QuartzCore not found, did you install XCode tools?")
endif()
add_library(moltenvk STATIC IMPORTED)
set_target_properties(moltenvk PROPERTIES
IMPORTED_LOCATION "${MVK_STATIC}"
)
target_link_libraries(moltenvk INTERFACE ${IOSURFACE_LIBRARY} ${QUARTZCORE_LIBRARY})
else()
add_library(moltenvk SHARED IMPORTED)
set_target_properties(moltenvk PROPERTIES
IMPORTED_LOCATION "${MVK_DYLIB}"
)
endif()
add_library(MoltenVK::MoltenVK ALIAS moltenvk)
endfunction()

View file

@ -276,4 +276,13 @@ if(YUZU_USE_PRECOMPILED_HEADERS)
target_precompile_headers(common PRIVATE precompiled_headers.h)
endif()
# IOPS (needed for power state) requires linking to IOKit
if (APPLE)
find_library(IOKIT_LIBRARY IOKit)
if(NOT IOKIT_LIBRARY)
message(FATAL_ERROR "IOKit not found, did you install XCode tools?")
endif()
target_link_libraries(common PRIVATE ${IOKIT_LIBRARY})
endif()
create_target_directory_groups(common)

View file

@ -366,18 +366,22 @@ if (APPLE)
set_target_properties(yuzu PROPERTIES MACOSX_BUNDLE TRUE)
set_target_properties(yuzu PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist)
if (YUZU_USE_BUNDLED_MOLTENVK)
set(MOLTENVK_PLATFORM "macOS")
set(MOLTENVK_VERSION "v1.3.0")
download_moltenvk(${MOLTENVK_PLATFORM} ${MOLTENVK_VERSION})
endif()
find_library(MOLTENVK_LIBRARY MoltenVK REQUIRED)
message(STATUS "Using MoltenVK at ${MOLTENVK_LIBRARY}.")
set_source_files_properties(${MOLTENVK_LIBRARY} PROPERTIES MACOSX_PACKAGE_LOCATION Frameworks
XCODE_FILE_ATTRIBUTES "CodeSignOnCopy")
target_sources(yuzu PRIVATE ${MOLTENVK_LIBRARY})
find_library(MOLTENVK_LIBRARY MoltenVK)
elseif(WIN32)
if (NOT MOLTENVK_LIBRARY OR YUZU_USE_BUNDLED_MOLTENVK)
set(MOLTENVK_PLATFORM "macos")
set(MOLTENVK_VERSION "v1.4.0")
download_moltenvk(${MOLTENVK_PLATFORM} ${MOLTENVK_VERSION})
target_link_libraries(yuzu PRIVATE MoltenVK::MoltenVK)
else()
message(STATUS "Using MoltenVK at ${MOLTENVK_LIBRARY}.")
set_source_files_properties(${MOLTENVK_LIBRARY} PROPERTIES MACOSX_PACKAGE_LOCATION Frameworks
XCODE_FILE_ATTRIBUTES "CodeSignOnCopy")
target_link_libraries(yuzu PRIVATE ${MOLTENVK_LIBRARY})
endif()
endif()
if(WIN32)
# compile as a win32 gui application instead of a console application
target_link_libraries(yuzu PRIVATE Qt6::EntryPointPrivate)
if(MSVC)