From d086d75cab204f1ee8722ca0f1ca623da49d3537 Mon Sep 17 00:00:00 2001 From: crueter Date: Tue, 7 Oct 2025 13:10:12 -0400 Subject: [PATCH] WIP: [cmake] allow static MoltenVK, fix IOKit link Signed-off-by: crueter --- CMakeModules/DownloadExternals.cmake | 42 +++++++++++++++++++++++++--- src/common/CMakeLists.txt | 9 ++++++ src/yuzu/CMakeLists.txt | 26 +++++++++-------- 3 files changed, 62 insertions(+), 15 deletions(-) diff --git a/CMakeModules/DownloadExternals.cmake b/CMakeModules/DownloadExternals.cmake index f6e3aaa4ad..90336b193b 100644 --- a/CMakeModules/DownloadExternals.cmake +++ b/CMakeModules/DownloadExternals.cmake @@ -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() diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 96ea429e5a..dcc70c9ac7 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -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) diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index c03f7a3abf..71b463b495 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -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)