mirror of
https://github.com/mitch030504/Wiicompiled_VR_Frame.git
synced 2026-10-06 00:00:17 +02:00
Ported from heurazy's mario-kart-wii-VR-port. F10 > Controllers > USB wheel and pedals (also in the headset panel) picks and calibrates the steering axis and both pedals by moving them, and assigns buttons by pressing them, over raw SDL joysticks: no per-model table or gamepad mapping, and separate pedals, reversed axes and combined pedal axes all calibrate the same way. Settings live in PhysicalWheel.toml beside Config.toml; heurazy's five-button files load unchanged. The wheel is player 1's GameCube controller. In a race it owns port 0 (steering on the stick, the accelerator on A, the brake pedal braking then reversing over A and drift, the paddles on R and L), keeping only the other source's pause and item aim. In menus it adds only deliberate presses. It arms once every pedal and button is released, stays neutral in a race while its setup is incomplete, and nothing is opened until it is enabled. Optional light rumble follows the game's own, capped at 15 %. Added here: its confirm, a new back button and the steering device's first hat (D-pad) work the menus, since our VR controllers default to a Wii Remote and the wheel needs to navigate on its own. Devices SDL classifies as wheels are marked in the list. In the VR cockpit the wheel follows the hardware steering and hand steering steps aside while it drives. README documents setup and Logitech notes (G HUB, the G29's PS3 switch, shifter gears as buttons); not yet tried on a physical wheel. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
644 lines
37 KiB
CMake
644 lines
37 KiB
CMake
cmake_minimum_required(VERSION 3.16)
|
|
project(mkw_recompiled)
|
|
|
|
if(NOT CMAKE_CXX_COMPILER_ID MATCHES "^(Clang|AppleClang)$" OR NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
|
|
message(FATAL_ERROR "WiiCompiled requires a 64-bit Clang toolchain")
|
|
endif()
|
|
|
|
if(WIN32 AND MINGW AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(AMD64|amd64|x86_64|X86_64)$")
|
|
set(MKW_PLATFORM_WINDOWS TRUE)
|
|
elseif(APPLE AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm64|ARM64)$")
|
|
# The first native macOS target is Apple Silicon. Intel and universal
|
|
# binaries remain future compatibility work; do not silently claim them.
|
|
set(MKW_PLATFORM_MACOS TRUE)
|
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(AMD64|amd64|x86_64|X86_64|aarch64|arm64|ARM64)$")
|
|
set(MKW_PLATFORM_LINUX TRUE)
|
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "Android" AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64|ARM64)$")
|
|
# Android arm64 through the NDK toolchain file (Meta Quest standalone).
|
|
# Bionic is Linux underneath, so the libco fibers, the mmap guest memory
|
|
# and the POSIX networking all follow the Linux branch; only paths, the
|
|
# SDL entry point and the OpenXR/Vulkan binding are Android-specific.
|
|
set(MKW_PLATFORM_ANDROID TRUE)
|
|
else()
|
|
message(FATAL_ERROR
|
|
"WiiCompiled supports 64-bit LLVM-MinGW Clang on Windows, native Linux x86_64/aarch64, Apple Clang on macOS arm64, or the Android NDK on arm64-v8a")
|
|
endif()
|
|
if(NOT CMAKE_BUILD_TYPE STREQUAL "Release")
|
|
message(FATAL_ERROR "WiiCompiled only supports Release builds")
|
|
endif()
|
|
|
|
option(MKW_BUILD_PRODUCTS "Build translated WiiCompiled product targets" ON)
|
|
|
|
# Preprocessor definitions that belong to this project's own code (the runtime,
|
|
# the translated shards and the product glue) and to nothing else. They are
|
|
# applied directory-scoped, immediately after the aurora add_subdirectory() call,
|
|
# so every target created afterwards (mkw_runtime_common, the translated shard
|
|
# libraries and the products in cmake/PublicProducts.cmake) inherits them while
|
|
# aurora-main and its third-party tree stay unaffected.
|
|
set(MKW_PROJECT_COMPILE_DEFINITIONS NOMINMAX)
|
|
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
|
|
# Declared before the vendored libraries so the third-party block below can
|
|
# branch on it and so cmake/NativePrebuilt.cmake is included after the names it
|
|
# must provide are known.
|
|
set(MKW_NATIVE_PREBUILT_DIR "" CACHE PATH
|
|
"Precompiled aurora/third-party package to link instead of building aurora-main")
|
|
# Maintainer-only counterpart: describe the configured aurora build so the
|
|
# package can be harvested from it.
|
|
set(MKW_NATIVE_PREBUILT_EXPORT_DIR "" CACHE PATH
|
|
"Maintainer-only: write a description of the configured aurora build here")
|
|
|
|
# The two Crypto++ configuration macros are load-bearing for ABI: they shape the
|
|
# structs and inline code the headers generate, so a first-party TU including
|
|
# <cryptopp/...> must see exactly what the archive was compiled with. Both the
|
|
# from-source target below and the prebuilt import in cmake/NativePrebuilt.cmake
|
|
# consume this one definition.
|
|
set(MKW_CRYPTOPP_INTERFACE_DEFINITIONS CRYPTOPP_DISABLE_ASM CRYPTOPP_NO_GLOBAL_BYTE)
|
|
|
|
# Riivolution XML is parsed with pugixml, matching the parser used by Dolphin.
|
|
# The four upstream files from v1.15 (ee86beb30e4973f5feffe3ce63bfa4fbadf72f38)
|
|
# are vendored so builds remain usable with FETCHCONTENT_FULLY_DISCONNECTED.
|
|
add_library(mkw_pugixml STATIC third_party/pugixml/pugixml.cpp)
|
|
add_library(mkw::pugixml ALIAS mkw_pugixml)
|
|
target_include_directories(mkw_pugixml PUBLIC third_party/pugixml)
|
|
target_compile_features(mkw_pugixml PUBLIC cxx_std_17)
|
|
set_target_properties(mkw_pugixml PROPERTIES UNITY_BUILD OFF)
|
|
|
|
# Linux guest-fiber scheduling (runtime/src/host_context.cpp) needs a symmetric
|
|
# stackful-coroutine primitive to stand in for Win32 Fibers. libco's co_switch() transfers
|
|
# directly to any other created coroutine, matching SwitchToFiber's semantics exactly (unlike
|
|
# asymmetric resume/yield coroutine libraries, which would need every call site restructured).
|
|
# Vendored from upstream (higan-emu/libco @ e18e09d, 2019-10-16, ISC license; valgrind.h is
|
|
# separately BSD-style licensed, see third_party/libco/LICENSE). Windows keeps native Fibers
|
|
# and macOS uses the project's x18-safe AArch64 assembly backend, so this target is Linux-only.
|
|
if(MKW_PLATFORM_LINUX OR MKW_PLATFORM_ANDROID)
|
|
add_library(mkw_libco STATIC third_party/libco/libco.c)
|
|
add_library(mkw::libco ALIAS mkw_libco)
|
|
target_include_directories(mkw_libco PUBLIC third_party/libco)
|
|
set_target_properties(mkw_libco PROPERTIES UNITY_BUILD OFF)
|
|
endif()
|
|
|
|
# Runtime configuration is real TOML, parsed by toml11 rather than a project-
|
|
# specific line parser. Keep it header-only and vendored so disconnected release
|
|
# builds have exactly the same parser as developer builds.
|
|
add_library(mkw_toml11 INTERFACE)
|
|
add_library(mkw::toml11 ALIAS mkw_toml11)
|
|
target_include_directories(mkw_toml11 SYSTEM INTERFACE third_party/toml11)
|
|
target_compile_features(mkw_toml11 INTERFACE cxx_std_17)
|
|
|
|
# Wii ES signatures use the standard binary-field sect233r1 curve. Crypto++
|
|
# supplies that curve, SHA-1, ECDSA and an OS-seeded CSPRNG. The complete 8.9.0
|
|
# source distribution is vendored. Assembly and algorithm-specific SIMD units
|
|
# are disabled to keep the library portable and independent of the runtime's
|
|
# x86-64-v3 policy; the static linker retains only the algorithms we reference.
|
|
#
|
|
# Crypto++ is by far the most expensive vendored library to compile (~150
|
|
# translation units), and under the shipped fixed toolchain it is bit-for-bit
|
|
# identical for every user, so the prebuilt package harvests its archive and
|
|
# this block is skipped entirely in that mode (see cmake/NativePrebuilt.cmake).
|
|
if(NOT MKW_NATIVE_PREBUILT_DIR)
|
|
file(GLOB MKW_CRYPTOPP_SOURCES CONFIGURE_DEPENDS
|
|
"${CMAKE_CURRENT_LIST_DIR}/third_party/cryptopp/*.cpp")
|
|
list(FILTER MKW_CRYPTOPP_SOURCES EXCLUDE REGEX
|
|
"/(adhoc|bench[123]|datatest|dlltest|fipsalgt|fipstest|pch|regtest[1234]|simple|test|validat[0-9]+)\\.cpp$")
|
|
list(FILTER MKW_CRYPTOPP_SOURCES EXCLUDE REGEX
|
|
"(_avx|_ppc|_simd|_sse)\\.cpp$")
|
|
if(MKW_PLATFORM_ANDROID)
|
|
# cpu.cpp reads the ARM feature bits through the NDK's cpu-features
|
|
# library, which the NDK ships as source rather than a prebuilt (see the
|
|
# comment above its #include "cpu-features.h"). Compiling it here is the
|
|
# arrangement upstream's own setenv-android.sh sets up.
|
|
set(MKW_ANDROID_CPU_FEATURES_DIR "${CMAKE_ANDROID_NDK}/sources/android/cpufeatures")
|
|
if(NOT EXISTS "${MKW_ANDROID_CPU_FEATURES_DIR}/cpu-features.c")
|
|
message(FATAL_ERROR
|
|
"Crypto++ needs the NDK cpu-features source: ${MKW_ANDROID_CPU_FEATURES_DIR}")
|
|
endif()
|
|
list(APPEND MKW_CRYPTOPP_SOURCES "${MKW_ANDROID_CPU_FEATURES_DIR}/cpu-features.c")
|
|
endif()
|
|
add_library(mkw_cryptopp STATIC ${MKW_CRYPTOPP_SOURCES})
|
|
add_library(mkw::cryptopp ALIAS mkw_cryptopp)
|
|
target_include_directories(mkw_cryptopp SYSTEM PUBLIC third_party)
|
|
if(MKW_PLATFORM_ANDROID)
|
|
target_include_directories(mkw_cryptopp SYSTEM PRIVATE "${MKW_ANDROID_CPU_FEATURES_DIR}")
|
|
endif()
|
|
target_compile_features(mkw_cryptopp PUBLIC cxx_std_17)
|
|
target_compile_definitions(mkw_cryptopp PUBLIC ${MKW_CRYPTOPP_INTERFACE_DEFINITIONS})
|
|
target_compile_options(mkw_cryptopp PRIVATE -w)
|
|
set_target_properties(mkw_cryptopp PROPERTIES UNITY_BUILD OFF)
|
|
endif()
|
|
|
|
set(MKW_TRANSLATED_COMPILE_JOBS 0 CACHE STRING
|
|
"Cap on concurrently compiling translated shard TUs via a Ninja job pool (0 = uncapped). \
|
|
Scheduling only - never affects output bytes, so it is deliberately outside the canonical flag fingerprint.")
|
|
set(MKW_CPPWINRT_INCLUDE_DIR "" CACHE PATH "Optional self-contained C++/WinRT include directory")
|
|
|
|
# The functional backend is currently Windows D3D12, so only Windows defaults
|
|
# to carrying the loader. Linux keeps the capability-gated Vulkan scaffold
|
|
# available to explicit developer builds without making a nonfunctional SDK
|
|
# fetch part of every normal build.
|
|
set(MKW_ENABLE_OPENXR_DEFAULT OFF)
|
|
if(MKW_PLATFORM_WINDOWS OR MKW_PLATFORM_ANDROID)
|
|
set(MKW_ENABLE_OPENXR_DEFAULT ON)
|
|
endif()
|
|
option(MKW_ENABLE_OPENXR "Build OpenXR VR support" ${MKW_ENABLE_OPENXR_DEFAULT})
|
|
unset(MKW_ENABLE_OPENXR_DEFAULT)
|
|
set(MKW_OPENXR_SDK_DIR "" CACHE PATH
|
|
"Optional OpenXR-SDK source tree; when empty, use a package or fetch the pinned SDK")
|
|
|
|
# Precompiled aurora + third-party package (see launcher/Prepare-NativePrebuilt.ps1).
|
|
# Empty - the default - keeps the from-source behaviour every developer build
|
|
# uses. When set, aurora-main, its extern/ tree and the vendored Crypto++ are
|
|
# not compiled at all; imported targets with the same names are wired up from
|
|
# the package instead, so this project's own code compiles and links exactly
|
|
# as before.
|
|
set(MKW_AURORA_DIR "${CMAKE_CURRENT_LIST_DIR}/../aurora-main")
|
|
|
|
# The translator's explicit float casts are PPC single-precision rounding points.
|
|
# Fast-math may erase them and change guest-visible integer conversions.
|
|
set(MKW_TRANSLATED_PPC_FP_OPTIONS -fno-fast-math -ffp-contract=off)
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Third-party: aurora-main (provides SDL3 + GPU backends)
|
|
# ----------------------------------------------------------------------
|
|
if(MKW_NATIVE_PREBUILT_DIR)
|
|
# Precompiled aurora + third-party archives. The source trees are still
|
|
# present (the runtime includes aurora headers directly), they are simply
|
|
# not compiled here.
|
|
include("${CMAKE_CURRENT_LIST_DIR}/cmake/NativePrebuilt.cmake")
|
|
else()
|
|
if(NOT EXISTS ${MKW_AURORA_DIR}/CMakeLists.txt)
|
|
message(FATAL_ERROR "Requested aurora-main but ${MKW_AURORA_DIR} is missing")
|
|
endif()
|
|
if(MKW_PLATFORM_ANDROID)
|
|
# encounter/dawn-build publishes the same release for android-aarch64;
|
|
# the provider pins its digest and maps the asset name. SDL3 is built
|
|
# from source as a shared library because SDLActivity loads libSDL3.so
|
|
# before libmain.so; a Gradle build may instead pass
|
|
# -DAURORA_SDL3_PROVIDER=system to use the prefab from the SDL3 AAR.
|
|
set(AURORA_DAWN_PROVIDER package CACHE STRING "" FORCE)
|
|
set(AURORA_SDL3_LINKAGE shared CACHE STRING "" FORCE)
|
|
if(NOT AURORA_SDL3_PROVIDER OR AURORA_SDL3_PROVIDER STREQUAL "auto")
|
|
set(AURORA_SDL3_PROVIDER vendor CACHE STRING "" FORCE)
|
|
endif()
|
|
endif()
|
|
set(DAWN_ENABLE_D3D11 OFF CACHE BOOL "" FORCE)
|
|
if(MKW_PLATFORM_WINDOWS)
|
|
set(DAWN_ENABLE_D3D12 ON CACHE BOOL "" FORCE)
|
|
set(DAWN_ENABLE_VULKAN ON CACHE BOOL "" FORCE)
|
|
set(DAWN_ENABLE_METAL OFF CACHE BOOL "" FORCE)
|
|
set(TINT_BUILD_HLSL_WRITER ON CACHE BOOL "" FORCE)
|
|
elseif(MKW_PLATFORM_MACOS)
|
|
set(DAWN_ENABLE_D3D12 OFF CACHE BOOL "" FORCE)
|
|
set(DAWN_ENABLE_VULKAN OFF CACHE BOOL "" FORCE)
|
|
set(DAWN_ENABLE_METAL ON CACHE BOOL "" FORCE)
|
|
set(TINT_BUILD_HLSL_WRITER OFF CACHE BOOL "" FORCE)
|
|
else()
|
|
set(DAWN_ENABLE_D3D12 OFF CACHE BOOL "" FORCE)
|
|
set(DAWN_ENABLE_VULKAN ON CACHE BOOL "" FORCE)
|
|
set(DAWN_ENABLE_METAL OFF CACHE BOOL "" FORCE)
|
|
set(TINT_BUILD_HLSL_WRITER OFF CACHE BOOL "" FORCE)
|
|
endif()
|
|
set(DAWN_BUILD_SAMPLES OFF CACHE BOOL "" FORCE)
|
|
set(DAWN_BUILD_TESTS OFF CACHE BOOL "" FORCE)
|
|
|
|
# Provide a tiny stub for DXProgrammableCapture when the SDK/PIX headers are
|
|
# missing (common on MinGW). Dawn only includes the header; no symbols are
|
|
# referenced when PIX isn't present.
|
|
if(MKW_PLATFORM_WINDOWS)
|
|
set(MKW_DX_STUB_DIR "${CMAKE_BINARY_DIR}/aurora_dx_stubs")
|
|
if(NOT EXISTS "${MKW_DX_STUB_DIR}/DXProgrammableCapture.h")
|
|
file(MAKE_DIRECTORY ${MKW_DX_STUB_DIR})
|
|
file(WRITE "${MKW_DX_STUB_DIR}/DXProgrammableCapture.h"
|
|
"#pragma once\n// Stubbed PIX capture header for Dawn; no functionality when PIX isn't present.\n")
|
|
endif()
|
|
endif()
|
|
# Deliberately NOT injected project-wide. Only a from-source Dawn build ever
|
|
# includes DXProgrammableCapture.h, and this tree consumes Dawn as a prebuilt
|
|
# package (AURORA_DAWN_PROVIDER=package), so the old
|
|
# include_directories()/add_compile_options(-I...) pair only added a dead
|
|
# -I to every one of the ~500 third-party and runtime compile lines. The
|
|
# aurora_* targets that do want it get it from the
|
|
# target_include_directories() call further down; a from-source Dawn build
|
|
# should add it to the Dawn targets the same way.
|
|
|
|
# Keep SDL3 lean when aurora is enabled.
|
|
if(MKW_PLATFORM_ANDROID)
|
|
set(SDL_SHARED ON CACHE BOOL "" FORCE)
|
|
set(SDL_STATIC OFF CACHE BOOL "" FORCE)
|
|
else()
|
|
set(SDL_SHARED OFF CACHE BOOL "" FORCE)
|
|
set(SDL_STATIC ON CACHE BOOL "" FORCE)
|
|
endif()
|
|
set(SDL_TEST OFF CACHE BOOL "" FORCE)
|
|
|
|
# MinGW/WSL can choke on SDL precompiled headers; disable PCH for aurora/SDL.
|
|
set(CMAKE_DISABLE_PRECOMPILE_HEADERS ON)
|
|
# Isolate aurora build products to a subdirectory under the main build dir.
|
|
add_subdirectory(${MKW_AURORA_DIR} ${CMAKE_BINARY_DIR}/aurora-build EXCLUDE_FROM_ALL)
|
|
set(CMAKE_DISABLE_PRECOMPILE_HEADERS OFF)
|
|
|
|
# Keep upstream Aurora split: several sources intentionally use file-local
|
|
# names that collide under this repo's aggressive unity build settings.
|
|
set(AURORA_TARGETS aurora_core aurora_gx aurora_pad aurora_si aurora_mtx aurora_vi)
|
|
foreach(t ${AURORA_TARGETS})
|
|
if(TARGET ${t})
|
|
set_target_properties(${t} PROPERTIES UNITY_BUILD OFF)
|
|
target_compile_options(${t} PRIVATE -O3 -ffast-math -w -pipe)
|
|
if(MKW_PLATFORM_WINDOWS)
|
|
target_include_directories(${t} PRIVATE ${MKW_DX_STUB_DIR})
|
|
endif()
|
|
# Aurora's own sources include Windows headers and call std::min/max;
|
|
# they relied on the old project-wide NOMINMAX that no longer leaks
|
|
# into this subtree, so the define is applied per target here.
|
|
target_compile_definitions(${t} PRIVATE NOMINMAX)
|
|
endif()
|
|
endforeach()
|
|
|
|
# Frame interpolation filters guest NaN/Inf matrices out of a std::sort
|
|
# comparator, which makes its std::isfinite guards load-bearing for memory
|
|
# safety, not just match quality. -ffinite-math-only (part of -ffast-math
|
|
# above) folds those guards to constants and poisons NaN float arguments
|
|
# via nofpclass, so this one file opts back out of the finite-math
|
|
# assumption; the file #errors if built without this. Source-scoped
|
|
# COMPILE_OPTIONS append after the target options, so this overrides the
|
|
# target's -ffast-math for exactly this TU.
|
|
if(TARGET aurora_gx)
|
|
set_source_files_properties("${MKW_AURORA_DIR}/lib/gx/frame_interpolation.cpp"
|
|
TARGET_DIRECTORY aurora_gx
|
|
PROPERTIES COMPILE_OPTIONS "-fno-finite-math-only")
|
|
endif()
|
|
|
|
if(MKW_NATIVE_PREBUILT_EXPORT_DIR)
|
|
include("${CMAKE_CURRENT_LIST_DIR}/cmake/NativePrebuiltExport.cmake")
|
|
endif()
|
|
endif()
|
|
|
|
# Everything from here down is this project's own code, so this is where the
|
|
# project definitions enter the directory scope. A directory-scoped definition
|
|
# seeds the COMPILE_DEFINITIONS of targets as they are created, which means:
|
|
# * aurora-main and its third-party tree were added above -> unaffected;
|
|
# * mkw_runtime_common, the translated shard libraries and the products in
|
|
# cmake/PublicProducts.cmake are all created below (that file is include()d,
|
|
# not add_subdirectory()d, so it shares this directory scope) -> they pick
|
|
# the definitions up exactly as before.
|
|
if(MKW_PROJECT_COMPILE_DEFINITIONS)
|
|
add_compile_definitions(${MKW_PROJECT_COMPILE_DEFINITIONS})
|
|
endif()
|
|
|
|
if(MKW_PLATFORM_WINDOWS AND MKW_ENABLE_OPENXR)
|
|
include(FetchContent)
|
|
FetchContent_Declare(vulkan_headers
|
|
URL "https://github.com/KhronosGroup/Vulkan-Headers/archive/015e25c3c91b70eb1a754d36fb14c4ba6ad9b0b9.tar.gz"
|
|
DOWNLOAD_EXTRACT_TIMESTAMP TRUE)
|
|
FetchContent_MakeAvailable(vulkan_headers)
|
|
include_directories("${vulkan_headers_SOURCE_DIR}/include")
|
|
endif()
|
|
|
|
set(MKW_OPENXR_TARGET "")
|
|
if(MKW_ENABLE_OPENXR)
|
|
if(NOT MKW_PLATFORM_WINDOWS AND NOT MKW_PLATFORM_LINUX AND NOT MKW_PLATFORM_ANDROID)
|
|
message(WARNING "OpenXR is not wired for this platform; disabling MKW_ENABLE_OPENXR")
|
|
set(MKW_ENABLE_OPENXR OFF)
|
|
else()
|
|
# An installer-supplied SDK must win over any developer machine package.
|
|
if(NOT MKW_OPENXR_SDK_DIR AND NOT FETCHCONTENT_SOURCE_DIR_OPENXR)
|
|
find_package(OpenXR CONFIG QUIET)
|
|
endif()
|
|
if(NOT TARGET OpenXR::openxr_loader AND NOT TARGET openxr_loader)
|
|
include(FetchContent)
|
|
set(BUILD_API_LAYERS OFF CACHE BOOL "" FORCE)
|
|
set(BUILD_TESTS OFF CACHE BOOL "" FORCE)
|
|
set(BUILD_CONFORMANCE_TESTS OFF CACHE BOOL "" FORCE)
|
|
set(BUILD_SDK_TESTS OFF CACHE BOOL "" FORCE)
|
|
set(DYNAMIC_LOADER OFF CACHE BOOL "" FORCE)
|
|
if(MKW_OPENXR_SDK_DIR)
|
|
if(NOT EXISTS "${MKW_OPENXR_SDK_DIR}/CMakeLists.txt")
|
|
message(FATAL_ERROR
|
|
"MKW_OPENXR_SDK_DIR does not contain OpenXR-SDK: ${MKW_OPENXR_SDK_DIR}")
|
|
endif()
|
|
add_subdirectory("${MKW_OPENXR_SDK_DIR}"
|
|
"${CMAKE_BINARY_DIR}/openxr-sdk" EXCLUDE_FROM_ALL)
|
|
else()
|
|
# Keep the FetchContent name aligned with the installer's
|
|
# BuildWorkspace/Dependencies/openxr directory. The bundled
|
|
# build passes FETCHCONTENT_SOURCE_DIR_OPENXR and runs fully
|
|
# disconnected, while developer builds may fetch this pin.
|
|
FetchContent_Declare(openxr
|
|
URL https://github.com/KhronosGroup/OpenXR-SDK/archive/refs/tags/release-1.1.61.tar.gz
|
|
URL_HASH SHA256=d5e2773d282642e6e250bd10266f316fc3ff3b8602c83db009a1f434205998e6
|
|
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
|
|
EXCLUDE_FROM_ALL)
|
|
FetchContent_MakeAvailable(openxr)
|
|
endif()
|
|
endif()
|
|
if(TARGET OpenXR::openxr_loader)
|
|
set(MKW_OPENXR_TARGET OpenXR::openxr_loader)
|
|
elseif(TARGET openxr_loader)
|
|
set(MKW_OPENXR_TARGET openxr_loader)
|
|
else()
|
|
message(FATAL_ERROR "OpenXR was enabled but no loader target was provided")
|
|
endif()
|
|
add_compile_definitions(MKW_ENABLE_OPENXR=1)
|
|
endif()
|
|
endif()
|
|
|
|
# Runtime sources. CONFIGURE_DEPENDS costs one glob re-check per build (measured
|
|
# at ~55 ms across the 100+ globs this build already re-verifies for SDL), and it
|
|
# buys correctness: without it, a newly added src/*.cpp that is not referenced by
|
|
# a registration file is silently never compiled and never errors. The stale-glob
|
|
# failure mode is worth far more than the milliseconds.
|
|
file(GLOB_RECURSE SOURCES CONFIGURE_DEPENDS "src/*.cpp")
|
|
set_source_files_properties(src/vr/openxr_vulkan_win32.cpp PROPERTIES SKIP_UNITY_BUILD_INCLUSION ON)
|
|
if(MKW_PLATFORM_MACOS)
|
|
list(REMOVE_ITEM SOURCES "${CMAKE_CURRENT_LIST_DIR}/src/guest_flat_memory.cpp")
|
|
# HostContext's Apple Silicon backend is implemented in a small assembly
|
|
# companion. It must be part of the product runtime as well as the
|
|
# standalone context test; otherwise the final executable is missing
|
|
# mkw_co_init/mkw_co_switch at link time.
|
|
enable_language(ASM)
|
|
list(APPEND SOURCES "${CMAKE_CURRENT_LIST_DIR}/src/platform/macos/co_switch.S")
|
|
else()
|
|
list(REMOVE_ITEM SOURCES "${CMAKE_CURRENT_LIST_DIR}/src/guest_flat_memory_macos.cpp")
|
|
endif()
|
|
set(MKW_PLATFORM_SOURCE "${CMAKE_CURRENT_LIST_DIR}/src/platform/host_platform.cpp")
|
|
set(MKW_BASE_PRODUCT_SOURCE "${CMAKE_CURRENT_LIST_DIR}/src/product/base_product.cpp")
|
|
set(MKW_RETRO_REWIND_PRODUCT_SOURCE "${CMAKE_CURRENT_LIST_DIR}/src/product/retro_rewind_product.cpp")
|
|
# The host ISA guard is the one translation unit that must not receive the
|
|
# x86-64-v3 flags, so it gets its own object library instead of riding along in
|
|
# mkw_runtime_common. See cmake/PublicProducts.cmake and the file's own header.
|
|
set(MKW_CPU_BASELINE_SOURCE "${CMAKE_CURRENT_LIST_DIR}/src/host_cpu_baseline.cpp")
|
|
list(REMOVE_ITEM SOURCES ${MKW_BASE_PRODUCT_SOURCE} ${MKW_RETRO_REWIND_PRODUCT_SOURCE}
|
|
${MKW_CPU_BASELINE_SOURCE} ${MKW_PLATFORM_SOURCE})
|
|
|
|
# This deliberately small library contains host services that are safe to
|
|
# validate before guest memory and fiber work makes a full runtime build viable.
|
|
add_library(mkw_platform STATIC "${MKW_PLATFORM_SOURCE}")
|
|
target_include_directories(mkw_platform PUBLIC "${CMAKE_CURRENT_LIST_DIR}/include")
|
|
target_compile_features(mkw_platform PUBLIC cxx_std_17)
|
|
set_target_properties(mkw_platform PROPERTIES UNITY_BUILD OFF)
|
|
|
|
# Keep these independent from Aurora's BUILD_TESTING option: they validate the
|
|
# project's host-platform contracts, not Aurora's third-party test suite.
|
|
# A cross-compiled Android tree cannot run them, so it does not build them.
|
|
if(MKW_PLATFORM_ANDROID)
|
|
set(MKW_BUILD_TESTS_DEFAULT OFF)
|
|
else()
|
|
set(MKW_BUILD_TESTS_DEFAULT ON)
|
|
endif()
|
|
option(MKW_BUILD_TESTS "Build the runtime host-contract test executables" ${MKW_BUILD_TESTS_DEFAULT})
|
|
unset(MKW_BUILD_TESTS_DEFAULT)
|
|
if(MKW_BUILD_TESTS)
|
|
enable_testing()
|
|
add_executable(mkw_frame_interpolation_pacing_tests tests/frame_interpolation_pacing_tests.cpp)
|
|
target_include_directories(mkw_frame_interpolation_pacing_tests PRIVATE "${CMAKE_CURRENT_LIST_DIR}/include")
|
|
target_link_libraries(mkw_frame_interpolation_pacing_tests PRIVATE mkw::toml11)
|
|
target_compile_features(mkw_frame_interpolation_pacing_tests PRIVATE cxx_std_20)
|
|
add_test(NAME mkw_frame_interpolation_pacing_tests COMMAND mkw_frame_interpolation_pacing_tests)
|
|
add_executable(mkw_platform_paths_tests "${CMAKE_CURRENT_LIST_DIR}/tests/platform_paths_tests.cpp")
|
|
target_link_libraries(mkw_platform_paths_tests PRIVATE mkw_platform)
|
|
target_compile_features(mkw_platform_paths_tests PRIVATE cxx_std_17)
|
|
add_test(NAME mkw_platform_paths_tests COMMAND mkw_platform_paths_tests)
|
|
|
|
# The first-person VR camera's transform is deliberately header-only and free of
|
|
# guest access so it can be checked here, without a headset or a running game.
|
|
add_executable(mkw_vr_first_person_tests "${CMAKE_CURRENT_LIST_DIR}/tests/vr_first_person_tests.cpp")
|
|
target_include_directories(mkw_vr_first_person_tests PRIVATE "${CMAKE_CURRENT_LIST_DIR}/include")
|
|
target_compile_features(mkw_vr_first_person_tests PRIVATE cxx_std_17)
|
|
add_test(NAME mkw_vr_first_person_tests COMMAND mkw_vr_first_person_tests)
|
|
|
|
# The first-person cockpit (seated eye, wheel and handlebar geometry, level seat,
|
|
# native wheel vertices) and hand steering (grab, turn, hand-off to the game),
|
|
# ported from heurazy's mario-kart-wii-VR-port. All header-only.
|
|
foreach(test_name mkw_steering_wheel_tests mkw_vr_cockpit_tests mkw_vr_hand_steering_tests)
|
|
string(REGEX REPLACE "^mkw_" "" test_source "${test_name}")
|
|
add_executable(${test_name} "${CMAKE_CURRENT_LIST_DIR}/tests/${test_source}.cpp")
|
|
target_include_directories(${test_name} PRIVATE "${CMAKE_CURRENT_LIST_DIR}/include")
|
|
target_compile_features(${test_name} PRIVATE cxx_std_17)
|
|
add_test(NAME ${test_name} COMMAND ${test_name})
|
|
endforeach()
|
|
|
|
# The USB wheel's calibration and GameCube pad mapping (physical_wheel.h),
|
|
# ported from heurazy's mario-kart-wii-VR-port. Header-only; needs dolphin/pad.h.
|
|
add_executable(mkw_physical_wheel_tests "${CMAKE_CURRENT_LIST_DIR}/tests/physical_wheel_tests.cpp")
|
|
target_include_directories(mkw_physical_wheel_tests PRIVATE "${CMAKE_CURRENT_LIST_DIR}/include"
|
|
"${CMAKE_CURRENT_LIST_DIR}/../aurora-main/include")
|
|
target_compile_definitions(mkw_physical_wheel_tests PRIVATE TARGET_PC)
|
|
target_compile_features(mkw_physical_wheel_tests PRIVATE cxx_std_17)
|
|
add_test(NAME mkw_physical_wheel_tests COMMAND mkw_physical_wheel_tests)
|
|
|
|
# The VR controllers' Wii Remote presentation (accelerometer frame, pointer
|
|
# raycast, debounce, button profile) is header-only for the same reason.
|
|
add_executable(mkw_vr_wii_remote_tests "${CMAKE_CURRENT_LIST_DIR}/tests/vr_wii_remote_tests.cpp")
|
|
target_include_directories(mkw_vr_wii_remote_tests PRIVATE "${CMAKE_CURRENT_LIST_DIR}/include")
|
|
target_compile_features(mkw_vr_wii_remote_tests PRIVATE cxx_std_17)
|
|
add_test(NAME mkw_vr_wii_remote_tests COMMAND mkw_vr_wii_remote_tests)
|
|
|
|
# The in-headset settings panel's controller chord, release latch, selection,
|
|
# scrolling and canvas mapping, plus the thread bridge they publish through.
|
|
add_executable(mkw_vr_settings_panel_tests tests/vr_settings_panel_tests.cpp src/vr/openxr_settings_panel.cpp)
|
|
target_include_directories(mkw_vr_settings_panel_tests PRIVATE "${CMAKE_CURRENT_LIST_DIR}/include")
|
|
target_compile_features(mkw_vr_settings_panel_tests PRIVATE cxx_std_17)
|
|
set_target_properties(mkw_vr_settings_panel_tests PROPERTIES UNITY_BUILD OFF)
|
|
add_test(NAME mkw_vr_settings_panel_tests COMMAND mkw_vr_settings_panel_tests)
|
|
|
|
# Resolve the real local-kart pointer walk against synthetic offline/online rosters.
|
|
add_executable(mkw_vr_player_tests "${CMAKE_CURRENT_LIST_DIR}/tests/vr_player_tests.cpp")
|
|
target_include_directories(mkw_vr_player_tests PRIVATE "${CMAKE_CURRENT_LIST_DIR}/include")
|
|
target_compile_features(mkw_vr_player_tests PRIVATE cxx_std_17)
|
|
add_test(NAME mkw_vr_player_tests COMMAND mkw_vr_player_tests)
|
|
|
|
add_executable(mkw_vr_policy_tests tests/vr_policy_tests.cpp src/vr/mkw_vr_policy.cpp)
|
|
target_include_directories(mkw_vr_policy_tests PRIVATE "${CMAKE_CURRENT_LIST_DIR}/include")
|
|
target_compile_features(mkw_vr_policy_tests PRIVATE cxx_std_17)
|
|
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU")
|
|
target_compile_options(mkw_vr_policy_tests PRIVATE -ffast-math)
|
|
endif()
|
|
add_test(NAME mkw_vr_policy_tests COMMAND mkw_vr_policy_tests)
|
|
|
|
# F10 > Diagnostics: the OpenXR frame-diagnostics collector is free of OpenXR
|
|
# and guest state, so its window accounting runs on a synthetic clock here.
|
|
add_executable(mkw_openxr_diagnostics_tests tests/openxr_diagnostics_tests.cpp src/vr/openxr_diagnostics.cpp)
|
|
target_include_directories(mkw_openxr_diagnostics_tests PRIVATE "${CMAKE_CURRENT_LIST_DIR}/include")
|
|
target_link_libraries(mkw_openxr_diagnostics_tests PRIVATE mkw::toml11)
|
|
target_compile_features(mkw_openxr_diagnostics_tests PRIVATE cxx_std_20)
|
|
set_target_properties(mkw_openxr_diagnostics_tests PROPERTIES UNITY_BUILD OFF)
|
|
add_test(NAME mkw_openxr_diagnostics_tests COMMAND mkw_openxr_diagnostics_tests)
|
|
|
|
# F10 > Diagnostics > Export Logs, against temporary folders.
|
|
add_executable(mkw_log_export_tests tests/log_export_tests.cpp src/log_export.cpp)
|
|
target_include_directories(mkw_log_export_tests PRIVATE "${CMAKE_CURRENT_LIST_DIR}/include")
|
|
target_compile_features(mkw_log_export_tests PRIVATE cxx_std_20)
|
|
set_target_properties(mkw_log_export_tests PROPERTIES UNITY_BUILD OFF)
|
|
add_test(NAME mkw_log_export_tests COMMAND mkw_log_export_tests)
|
|
|
|
if(MKW_ENABLE_OPENXR AND MKW_PLATFORM_WINDOWS)
|
|
add_executable(mkw_openxr_replay_tests
|
|
tests/openxr_d3d12_replay_tests.cpp src/vr/openxr_d3d12.cpp src/vr/openxr_diagnostics.cpp)
|
|
target_include_directories(mkw_openxr_replay_tests PRIVATE
|
|
"${CMAKE_CURRENT_LIST_DIR}/include"
|
|
"${CMAKE_CURRENT_LIST_DIR}/../aurora-main/include"
|
|
"$<TARGET_PROPERTY:${MKW_OPENXR_TARGET},INTERFACE_INCLUDE_DIRECTORIES>")
|
|
target_compile_definitions(mkw_openxr_replay_tests PRIVATE MKW_ENABLE_OPENXR=1)
|
|
target_compile_features(mkw_openxr_replay_tests PRIVATE cxx_std_17)
|
|
set_target_properties(mkw_openxr_replay_tests PROPERTIES UNITY_BUILD OFF)
|
|
add_test(NAME mkw_openxr_replay_tests COMMAND mkw_openxr_replay_tests)
|
|
add_executable(mkw_openxr_vulkan_replay_tests
|
|
tests/openxr_d3d12_replay_tests.cpp src/vr/openxr_vulkan_win32.cpp src/vr/openxr_diagnostics.cpp)
|
|
target_include_directories(mkw_openxr_vulkan_replay_tests PRIVATE
|
|
"${CMAKE_CURRENT_LIST_DIR}/include"
|
|
"${CMAKE_CURRENT_LIST_DIR}/../aurora-main/include"
|
|
"$<TARGET_PROPERTY:${MKW_OPENXR_TARGET},INTERFACE_INCLUDE_DIRECTORIES>")
|
|
target_compile_definitions(mkw_openxr_vulkan_replay_tests PRIVATE MKW_ENABLE_OPENXR=1 TEST_WINDOWS_VULKAN=1)
|
|
target_compile_features(mkw_openxr_vulkan_replay_tests PRIVATE cxx_std_17)
|
|
set_target_properties(mkw_openxr_vulkan_replay_tests PROPERTIES UNITY_BUILD OFF)
|
|
add_test(NAME mkw_openxr_vulkan_replay_tests COMMAND mkw_openxr_vulkan_replay_tests)
|
|
endif()
|
|
|
|
add_executable(mkw_nand_save_tests "${CMAKE_CURRENT_LIST_DIR}/tests/nand_save_tests.cpp")
|
|
target_include_directories(mkw_nand_save_tests PRIVATE "${CMAKE_CURRENT_LIST_DIR}/include")
|
|
target_compile_features(mkw_nand_save_tests PRIVATE cxx_std_17)
|
|
add_test(NAME mkw_nand_save_tests COMMAND mkw_nand_save_tests)
|
|
|
|
add_executable(mkw_nand_settings_tests "${CMAKE_CURRENT_LIST_DIR}/tests/nand_settings_tests.cpp")
|
|
find_package(Threads REQUIRED)
|
|
target_link_libraries(mkw_nand_settings_tests PRIVATE Threads::Threads)
|
|
target_include_directories(mkw_nand_settings_tests PRIVATE "${CMAKE_CURRENT_LIST_DIR}/include")
|
|
target_compile_features(mkw_nand_settings_tests PRIVATE cxx_std_17)
|
|
add_test(NAME mkw_nand_settings_tests COMMAND mkw_nand_settings_tests)
|
|
|
|
add_executable(mkw_sc_serial_tests "${CMAKE_CURRENT_LIST_DIR}/tests/sc_serial_tests.cpp")
|
|
target_include_directories(mkw_sc_serial_tests PRIVATE "${CMAKE_CURRENT_LIST_DIR}/include")
|
|
target_compile_features(mkw_sc_serial_tests PRIVATE cxx_std_17)
|
|
add_test(NAME mkw_sc_serial_tests COMMAND mkw_sc_serial_tests)
|
|
|
|
# The input expression engine is self-contained, so it can be exercised without
|
|
# linking the runtime or SDL.
|
|
add_executable(mkw_input_expr_tests
|
|
"${CMAKE_CURRENT_LIST_DIR}/tests/test_expr.cpp"
|
|
"${CMAKE_CURRENT_LIST_DIR}/src/input_expr.cpp")
|
|
target_include_directories(mkw_input_expr_tests PRIVATE "${CMAKE_CURRENT_LIST_DIR}/include")
|
|
target_compile_features(mkw_input_expr_tests PRIVATE cxx_std_17)
|
|
add_test(NAME mkw_input_expr_tests COMMAND mkw_input_expr_tests)
|
|
|
|
# HostContext deliberately keeps the platform-specific context primitive out
|
|
# of fiber_manager.cpp. Exercise the Linux libco handoff directly so future
|
|
# refactors cannot silently remove its headers, implementation, or link edge.
|
|
if(MKW_PLATFORM_LINUX)
|
|
add_executable(mkw_linux_host_context_tests
|
|
"${CMAKE_CURRENT_LIST_DIR}/tests/host_context_tests.cpp"
|
|
"${CMAKE_CURRENT_LIST_DIR}/src/host_context.cpp")
|
|
target_include_directories(mkw_linux_host_context_tests PRIVATE
|
|
"${CMAKE_CURRENT_LIST_DIR}/include"
|
|
"${CMAKE_CURRENT_LIST_DIR}/third_party/libco")
|
|
target_compile_features(mkw_linux_host_context_tests PRIVATE cxx_std_17)
|
|
target_link_libraries(mkw_linux_host_context_tests PRIVATE mkw::libco)
|
|
add_test(NAME mkw_linux_host_context_tests COMMAND mkw_linux_host_context_tests)
|
|
endif()
|
|
|
|
if(MKW_PLATFORM_MACOS)
|
|
# Exercise the Apple Silicon context ABI and the public host-memory
|
|
# contracts separately from translated products.
|
|
enable_language(ASM)
|
|
add_executable(mkw_macos_context_abi_tests
|
|
"${CMAKE_CURRENT_LIST_DIR}/tests/macos_context_abi_tests.cpp"
|
|
"${CMAKE_CURRENT_LIST_DIR}/src/platform/macos/co_switch.S")
|
|
target_compile_features(mkw_macos_context_abi_tests PRIVATE cxx_std_17)
|
|
add_test(NAME mkw_macos_context_abi_tests COMMAND mkw_macos_context_abi_tests)
|
|
|
|
add_executable(mkw_macos_host_context_tests
|
|
"${CMAKE_CURRENT_LIST_DIR}/tests/host_context_tests.cpp"
|
|
"${CMAKE_CURRENT_LIST_DIR}/src/host_context.cpp"
|
|
"${CMAKE_CURRENT_LIST_DIR}/src/platform/macos/co_switch.S")
|
|
target_include_directories(mkw_macos_host_context_tests PRIVATE "${CMAKE_CURRENT_LIST_DIR}/include")
|
|
target_compile_features(mkw_macos_host_context_tests PRIVATE cxx_std_17)
|
|
add_test(NAME mkw_macos_host_context_tests COMMAND mkw_macos_host_context_tests)
|
|
|
|
add_executable(mkw_macos_guest_flat_memory_tests
|
|
"${CMAKE_CURRENT_LIST_DIR}/tests/macos_guest_flat_memory_tests.cpp"
|
|
"${CMAKE_CURRENT_LIST_DIR}/src/guest_flat_memory_macos.cpp")
|
|
target_include_directories(mkw_macos_guest_flat_memory_tests PRIVATE "${CMAKE_CURRENT_LIST_DIR}/include")
|
|
target_compile_features(mkw_macos_guest_flat_memory_tests PRIVATE cxx_std_17)
|
|
add_test(NAME mkw_macos_guest_flat_memory_tests COMMAND mkw_macos_guest_flat_memory_tests)
|
|
endif()
|
|
endif() # MKW_BUILD_TESTS
|
|
|
|
# The translator emits the complete, content-addressed source graph. Consuming
|
|
# this one manifest keeps configure independent of the 28k generated function
|
|
# files and of optional Retro Rewind artifacts such as code.map.
|
|
if(MKW_BUILD_PRODUCTS)
|
|
set(MKW_TRANSLATED_SHARD_MANIFEST
|
|
"${CMAKE_CURRENT_LIST_DIR}/../generated/build_shards/shards.cmake"
|
|
CACHE FILEPATH "Translator-owned aggregate shard manifest")
|
|
# The prebuilt export only needs the aurora/third-party closure configured above, so a
|
|
# packaging machine without a translation stops here instead of failing.
|
|
if(MKW_NATIVE_PREBUILT_EXPORT_DIR AND NOT EXISTS "${MKW_TRANSLATED_SHARD_MANIFEST}")
|
|
message(STATUS "No translator shard manifest; configuring the native prebuilt export only")
|
|
return()
|
|
endif()
|
|
if(NOT EXISTS "${MKW_TRANSLATED_SHARD_MANIFEST}")
|
|
message(FATAL_ERROR
|
|
"Missing translator-owned shard manifest: ${MKW_TRANSLATED_SHARD_MANIFEST}. "
|
|
"Run Translator.Cli emit-build-shards first; see translator/README.md.")
|
|
endif()
|
|
include("${MKW_TRANSLATED_SHARD_MANIFEST}")
|
|
set(MKW_HAVE_RETRO_REWIND ${MKW_HAVE_RETRO_REWIND_SHARDS})
|
|
message(STATUS
|
|
"Translator graph: ${MKW_SHARED_BASE_FUNCTION_COUNT}/${MKW_BASE_FUNCTION_COUNT} base functions shared; "
|
|
"${MKW_PROFILE_SENSITIVE_CALLER_COUNT} profile-sensitive callers; "
|
|
"${MKW_RETRO_REWIND_FUNCTION_COUNT} Retro Rewind functions")
|
|
|
|
set(MKW_RUNTIME_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}")
|
|
include("${CMAKE_CURRENT_LIST_DIR}/cmake/PublicProducts.cmake")
|
|
else()
|
|
if(MKW_PLATFORM_MACOS)
|
|
# Compile-only audit of native runtime sources. It deliberately avoids
|
|
# translated products until their host dependencies are portable.
|
|
# These sources depend on generated/RuntimeConfig.h, which is emitted for
|
|
# a particular game by the translator and is intentionally unavailable
|
|
# in this platform-only configuration.
|
|
set(MKW_MACOS_NATIVE_AUDIT_SOURCES ${SOURCES})
|
|
list(REMOVE_ITEM MKW_MACOS_NATIVE_AUDIT_SOURCES
|
|
"${CMAKE_CURRENT_LIST_DIR}/src/abi_bridge.cpp"
|
|
"${CMAKE_CURRENT_LIST_DIR}/src/hle/os/os_alarm.cpp")
|
|
add_library(mkw_macos_native_compile OBJECT ${MKW_MACOS_NATIVE_AUDIT_SOURCES})
|
|
target_include_directories(mkw_macos_native_compile PRIVATE
|
|
"${CMAKE_CURRENT_LIST_DIR}/include" "${CMAKE_CURRENT_LIST_DIR}/src"
|
|
"${CMAKE_CURRENT_LIST_DIR}/.." "${CMAKE_CURRENT_LIST_DIR}/../aurora-main/include")
|
|
target_compile_features(mkw_macos_native_compile PRIVATE cxx_std_20)
|
|
target_compile_definitions(mkw_macos_native_compile PRIVATE SDL_MAIN_HANDLED TARGET_PC)
|
|
target_link_libraries(mkw_macos_native_compile PRIVATE
|
|
aurora::gx aurora::pad aurora::si aurora::vi aurora::mtx
|
|
mkw::pugixml mkw::toml11 mkw::cryptopp)
|
|
set_target_properties(mkw_macos_native_compile PROPERTIES UNITY_BUILD OFF)
|
|
endif()
|
|
if(MKW_PLATFORM_ANDROID)
|
|
# Compile-only audit of the native runtime for arm64 Android, including
|
|
# the OpenXR Vulkan backend and the Android platform glue, without a
|
|
# translated game. Same exclusions as the macOS audit: those two files
|
|
# include the translator-emitted RuntimeConfig.h.
|
|
set(MKW_ANDROID_NATIVE_AUDIT_SOURCES ${SOURCES})
|
|
list(REMOVE_ITEM MKW_ANDROID_NATIVE_AUDIT_SOURCES
|
|
"${CMAKE_CURRENT_LIST_DIR}/src/abi_bridge.cpp"
|
|
"${CMAKE_CURRENT_LIST_DIR}/src/hle/os/os_alarm.cpp")
|
|
add_library(mkw_android_native_compile OBJECT ${MKW_ANDROID_NATIVE_AUDIT_SOURCES})
|
|
target_include_directories(mkw_android_native_compile PRIVATE
|
|
"${CMAKE_CURRENT_LIST_DIR}/include" "${CMAKE_CURRENT_LIST_DIR}/src"
|
|
"${CMAKE_CURRENT_LIST_DIR}/.." "${CMAKE_CURRENT_LIST_DIR}/../aurora-main/include")
|
|
target_compile_features(mkw_android_native_compile PRIVATE cxx_std_20)
|
|
target_compile_definitions(mkw_android_native_compile PRIVATE TARGET_PC)
|
|
target_link_libraries(mkw_android_native_compile PRIVATE
|
|
aurora::gx aurora::pad aurora::si aurora::vi aurora::mtx
|
|
mkw::pugixml mkw::toml11 mkw::cryptopp mkw::libco)
|
|
if(MKW_ENABLE_OPENXR)
|
|
target_link_libraries(mkw_android_native_compile PRIVATE ${MKW_OPENXR_TARGET})
|
|
endif()
|
|
# Same precompiled header as the product objects: several sources rely on
|
|
# it for abi_bridge.h / ppc_runtime.h rather than including them directly.
|
|
target_precompile_headers(mkw_android_native_compile PRIVATE "${CMAKE_CURRENT_LIST_DIR}/include/mkw_pch.h")
|
|
set_target_properties(mkw_android_native_compile PROPERTIES UNITY_BUILD OFF)
|
|
endif()
|
|
add_custom_target(mkw_platform_paths_check DEPENDS mkw_platform)
|
|
message(STATUS "Translated product targets disabled (MKW_BUILD_PRODUCTS=OFF)")
|
|
endif()
|