project(cemuMain) option(CEMU_CXX_FLAGS "Additional flags used for compiling Cemu source code") if(CEMU_CXX_FLAGS) add_compile_options(${CEMU_CXX_FLAGS}) endif() if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8) message( FATAL_ERROR "Pointers are not 64bit" ) endif() if(MSVC) add_compile_definitions(WIN32_LEAN_AND_MEAN CURL_STATICLIB) elseif(UNIX) if(APPLE) add_compile_definitions( _XOPEN_SOURCE VK_USE_PLATFORM_MACOS_MVK VK_USE_PLATFORM_METAL_EXT ) else() add_compile_definitions( VK_USE_PLATFORM_XLIB_KHR # legacy. Do we need to support XLIB surfaces? VK_USE_PLATFORM_XCB_KHR ) if (ENABLE_WAYLAND) add_compile_definitions(VK_USE_PLATFORM_WAYLAND_KHR) endif() endif() # warnings if(CMAKE_C_COMPILER_ID STREQUAL "Clang") add_compile_options(-Wno-ambiguous-reversed-operator) endif() add_compile_options(-Wno-multichar -Wno-invalid-offsetof -Wno-switch -Wno-ignored-attributes -Wno-deprecated-enum-enum-conversion) endif() add_compile_definitions(VK_NO_PROTOTYPES) set(CMAKE_INCLUDE_CURRENT_DIR ON) add_subdirectory(Common) add_subdirectory(gui) add_subdirectory(Cafe) add_subdirectory(Cemu) add_subdirectory(config) add_subdirectory(input) add_subdirectory(audio) add_subdirectory(util) add_subdirectory(imgui) add_subdirectory(resource) add_executable(CemuBin main.cpp mainLLE.cpp ) if(MSVC AND MSVC_VERSION EQUAL 1940) # workaround for an msvc issue on VS 17.10 where generated ILK files are too large # see https://developercommunity.visualstudio.com/t/After-updating-to-VS-1710-the-size-of-/10665511 set_target_properties(CemuBin PROPERTIES LINK_FLAGS "/INCREMENTAL:NO") endif() if(WIN32) target_sources(CemuBin PRIVATE resource/cemu.rc ../dist/windows/cemu.manifest ) endif() string(TIMESTAMP CURRENT_YEAR "%Y" UTC) set_property(TARGET CemuBin PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") set_property(TARGET CemuBin PROPERTY WIN32_EXECUTABLE $>) if(CMAKE_BUILD_TYPE STREQUAL "release") set(OUTPUT_NAME "Cemu") else() set(OUTPUT_NAME "Cemu_$>") endif() if (MACOS_BUNDLE) set_property(TARGET CemuBin PROPERTY MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/resource/MacOSXBundleInfo.plist.in") set(ENTITLEMENTS_FILE "${CMAKE_SOURCE_DIR}/src/resource/cemu.macos.entitlements") set(RESOURCE_FILES "${CMAKE_SOURCE_DIR}/src/resource/cemu.icns") target_sources(CemuBin PRIVATE "${RESOURCE_FILES}") set(MACOSX_BUNDLE_ICON_FILE "cemu.icns") set(MACOSX_BUNDLE_GUI_IDENTIFIER "info.cemu.Cemu") set(MACOSX_BUNDLE_BUNDLE_NAME "${OUTPUT_NAME}") set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${EMULATOR_VERSION_MAJOR}.${EMULATOR_VERSION_MINOR}.${EMULATOR_VERSION_PATCH}") set(MACOSX_BUNDLE_BUNDLE_VERSION "${EMULATOR_VERSION_MAJOR}.${EMULATOR_VERSION_MINOR}.${EMULATOR_VERSION_PATCH}") set(MACOSX_BUNDLE_COPYRIGHT "Copyright © ${CURRENT_YEAR} Cemu Project") set(MACOSX_BUNDLE_CATEGORY "public.app-category.games") set(MACOSX_MINIMUM_SYSTEM_VERSION "13.4") set(MACOSX_BUNDLE_TYPE_EXTENSION "wua") set_target_properties(CemuBin PROPERTIES MACOSX_BUNDLE true RESOURCE "${RESOURCE_FILES}" ) set(FOLDERS gameProfiles resources) foreach(folder ${FOLDERS}) add_custom_command (TARGET CemuBin POST_BUILD COMMAND ${CMAKE_COMMAND} ARGS -E copy_directory "${CMAKE_SOURCE_DIR}/bin/${folder}" "${CMAKE_SOURCE_DIR}/bin/${OUTPUT_NAME}.app/Contents/SharedSupport/${folder}") endforeach(folder) if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(LIBUSB_PATH "${CMAKE_BINARY_DIR}/vcpkg_installed/${VCPKG_TARGET_TRIPLET}/debug/lib/libusb-1.0.0.dylib") else() set(LIBUSB_PATH "${CMAKE_BINARY_DIR}/vcpkg_installed/${VCPKG_TARGET_TRIPLET}/lib/libusb-1.0.0.dylib") endif() if (EXISTS "/usr/local/lib/libMoltenVK.dylib") set(MOLTENVK_PATH "/usr/local/lib/libMoltenVK.dylib") elseif (EXISTS "/opt/homebrew/lib/libMoltenVK.dylib") set(MOLTENVK_PATH "/opt/homebrew/lib/libMoltenVK.dylib") else() message(FATAL_ERROR "failed to find libMoltenVK.dylib") endif () add_custom_command (TARGET CemuBin POST_BUILD COMMAND ${CMAKE_COMMAND} ARGS -E copy "${MOLTENVK_PATH}" "${CMAKE_SOURCE_DIR}/bin/${OUTPUT_NAME}.app/Contents/Frameworks/libMoltenVK.dylib" COMMAND ${CMAKE_COMMAND} ARGS -E copy "${LIBUSB_PATH}" "${CMAKE_SOURCE_DIR}/bin/${OUTPUT_NAME}.app/Contents/Frameworks/libusb-1.0.0.dylib" COMMAND ${CMAKE_COMMAND} ARGS -E copy "${CMAKE_SOURCE_DIR}/src/resource/update.sh" "${CMAKE_SOURCE_DIR}/bin/${OUTPUT_NAME}.app/Contents/MacOS/update.sh" COMMAND bash -c "install_name_tool -add_rpath @executable_path/../Frameworks ${CMAKE_SOURCE_DIR}/bin/${OUTPUT_NAME}.app/Contents/MacOS/${OUTPUT_NAME}" COMMAND install_name_tool -change @rpath/libusb-1.0.0.dylib @executable_path/../Frameworks/libusb-1.0.0.dylib ${CMAKE_SOURCE_DIR}/bin/${OUTPUT_NAME}.app/Contents/MacOS/${OUTPUT_NAME} COMMAND chmod a+x ${CMAKE_SOURCE_DIR}/bin/${OUTPUT_NAME}.app/Contents/MacOS/update.sh COMMAND codesign --entitlements ${ENTITLEMENTS_FILE} --force --deep --preserve-metadata=entitlements,requirements,flags,runtime --sign - --timestamp --options runtime ${CMAKE_SOURCE_DIR}/bin/${OUTPUT_NAME}.app/Contents/MacOS/${OUTPUT_NAME}) else() if(APPLE) find_library(MOLTENVK_LIBRARY NAMES MoltenVK moltenvk libMoltenVK.dylib PATHS /usr/local/lib /opt/homebrew/lib ) if(MOLTENVK_LIBRARY) message(STATUS "Found MoltenVK: ${MOLTENVK_LIBRARY}") target_link_libraries(CemuBin PRIVATE ${MOLTENVK_LIBRARY}) else() message(WARNING "libMoltenVK.dylib not found") endif() set_target_properties(CemuBin PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE INSTALL_RPATH "/usr/local/lib;/opt/homebrew/lib" ) endif() endif() set_target_properties(CemuBin PROPERTIES # multi-configuration generators will add a config subdirectory to RUNTIME_OUTPUT_DIRECTORY if no generator expression is used # to get the same behavior everywhere we append an empty generator expression RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../bin/$<1:>" OUTPUT_NAME "${OUTPUT_NAME}" ) target_link_libraries(CemuBin PRIVATE CemuAudio CemuCafe CemuCommon CemuComponents CemuConfig CemuGui CemuInput CemuUtil SDL2::SDL2 ) if(UNIX AND NOT APPLE) # due to nasm output some linkers will make stack executable # cemu does not require this so we explicity disable it target_link_options(CemuBin PRIVATE -z noexecstack) # some residual debug info from boost/discord-rpc is normally included # most likely not helpful in debugging problems with cemu code target_link_options(CemuBin PRIVATE "$<$:-Xlinker;--strip-debug>") endif() if (BSD) target_link_libraries(CemuBin PRIVATE execinfo SPIRV-Tools SPIRV-Tools-opt) endif()