cmake_minimum_required(VERSION 3.20)

if(APPLE)
    set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0" CACHE STRING
        "Minimum supported macOS version")
endif()

project(BanjoTooieRecompiled LANGUAGES C CXX)

set(BT_DEMO_VERSION "0.1" CACHE STRING
    "Public demo version shown to testers")
set(BT_PROJECT_VERSION "0.1.0" CACHE STRING
    "Semantic version passed to N64ModernRuntime")
set(BT_ISSUES_URL
    "https://github.com/solbakk47-a11y/Banjo-Tooie-Recompiled/issues/new?template=public-test-report.yml"
    CACHE STRING "Public test issue-report URL")
set(BT_BUILD_ID "" CACHE STRING
    "Unique build ID (generated from UTC configure time and Git commit when empty)")

find_package(Git QUIET)
set(BT_GIT_COMMIT "unknown")
if(Git_FOUND)
    execute_process(
        COMMAND "${GIT_EXECUTABLE}" rev-parse --short=12 HEAD
        WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
        RESULT_VARIABLE BT_GIT_RESULT
        OUTPUT_VARIABLE BT_GIT_OUTPUT
        OUTPUT_STRIP_TRAILING_WHITESPACE
        ERROR_QUIET)
    if(BT_GIT_RESULT EQUAL 0 AND NOT BT_GIT_OUTPUT STREQUAL "")
        set(BT_GIT_COMMIT "${BT_GIT_OUTPUT}")
    endif()
endif()

string(TIMESTAMP BT_BUILD_DATE "%Y-%m-%dT%H:%M:%SZ" UTC)
string(TIMESTAMP BT_BUILD_STAMP "%Y%m%d-%H%M%S" UTC)
if(BT_BUILD_ID STREQUAL "")
    set(BT_BUILD_ID "${BT_BUILD_STAMP}-${BT_GIT_COMMIT}")
endif()

configure_file(
    "${CMAKE_CURRENT_SOURCE_DIR}/src/build_info.hpp.in"
    "${CMAKE_CURRENT_BINARY_DIR}/generated/build_info.hpp"
    @ONLY)

message(STATUS "Banjo-Tooie demo version: ${BT_DEMO_VERSION}")
message(STATUS "Banjo-Tooie build ID: ${BT_BUILD_ID}")
message(STATUS "Banjo-Tooie Git commit: ${BT_GIT_COMMIT}")

option(BT_BUILD_DIAGNOSTICS_TESTS
    "Build the standalone local diagnostics smoke-test helper" OFF)
if(BT_BUILD_DIAGNOSTICS_TESTS)
    add_executable(BanjoTooieDiagnosticsSmoke
        tests/diagnostics_smoke.cpp
        src/diagnostics.cpp)
    target_include_directories(BanjoTooieDiagnosticsSmoke PRIVATE
        "${CMAKE_CURRENT_SOURCE_DIR}/src"
        "${CMAKE_CURRENT_BINARY_DIR}/generated")
    target_compile_features(BanjoTooieDiagnosticsSmoke PRIVATE cxx_std_20)
    if(CMAKE_SYSTEM_NAME MATCHES "Linux")
        target_link_libraries(BanjoTooieDiagnosticsSmoke PRIVATE
            ${CMAKE_DL_LIBS})
    endif()
endif()

set(CMAKE_C_STANDARD 17)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS ON)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

if(APPLE)
    enable_language(OBJC OBJCXX)

    # Xcode 26 ships the Metal compiler as a downloadable Cryptex. Sandboxed
    # build runners can execute that mounted compiler but cannot ask xcrun's
    # MobileAsset service to locate it. Put a narrow xcrun compatibility
    # wrapper first in PATH for custom shader commands; it delegates every
    # non-Metal invocation to /usr/bin/xcrun unchanged.
    set(BT_XCRUN_WRAPPER_DIR
        "${CMAKE_CURRENT_SOURCE_DIR}/cmake/tool-wrappers")
    set_property(GLOBAL PROPERTY RULE_LAUNCH_CUSTOM
        "${CMAKE_COMMAND} -E env \"PATH=${BT_XCRUN_WRAPPER_DIR}:$ENV{PATH}\" \"BT_METAL_MODULE_CACHE=${CMAKE_BINARY_DIR}/metal-module-cache\"")
endif()

set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})

# Keep SDL self-contained so the first macOS build does not require Homebrew or
# MacPorts. BanjoRecomp 1.0.2 pins SDL 2.30.3; lib/SDL is that exact tag.
set(SDL_SHARED OFF CACHE BOOL "" FORCE)
set(SDL_STATIC ON CACHE BOOL "" FORCE)
set(SDL_TEST OFF CACHE BOOL "" FORCE)
set(SDL_TESTS OFF CACHE BOOL "" FORCE)
set(SDL_INSTALL OFF CACHE BOOL "" FORCE)
add_subdirectory(lib/SDL EXCLUDE_FROM_ALL)
find_package(SDL2 REQUIRED)

# Build the font renderer locally as well. This keeps the Apple Silicon build
# independent of Homebrew/MacPorts and gives RmlUi its conventional target.
set(FT_DISABLE_ZLIB ON CACHE BOOL "" FORCE)
set(FT_DISABLE_BZIP2 ON CACHE BOOL "" FORCE)
set(FT_DISABLE_PNG ON CACHE BOOL "" FORCE)
set(FT_DISABLE_HARFBUZZ ON CACHE BOOL "" FORCE)
set(FT_DISABLE_BROTLI ON CACHE BOOL "" FORCE)
add_subdirectory(lib/freetype EXCLUDE_FROM_ALL)
if(NOT TARGET Freetype::Freetype)
    add_library(Freetype::Freetype ALIAS freetype)
endif()

set(RT64_STATIC TRUE)
set(RT64_SDL_WINDOW_VULKAN TRUE)
add_compile_definitions(HLSL_CPU __PRFCHWINTRIN_H)

add_subdirectory(lib/rt64)
if(APPLE)
    # The pinned hlsl++ scalar backend calls the C `labs` function without
    # including its declaring header. Apple Clang 21 diagnoses that omission.
    # Inject the standard declaration for RT64 without modifying the pinned
    # vendor submodule.
    target_compile_options(rt64 PRIVATE -include stdlib.h)
endif()
add_subdirectory(lib/N64ModernRuntime)
target_include_directories(rt64 PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/rt64/src")

set(RECOMPILED_FUNCS_DIR
    "${CMAKE_CURRENT_SOURCE_DIR}/build/RecompiledFuncs"
    CACHE PATH "Directory containing generated N64Recomp sources")

option(BT_AUTO_RECOMP
    "Regenerate the Banjo-Tooie native sources when their inputs change" ON)
set(BT_N64RECOMP_CONFIG
    "${CMAKE_CURRENT_SOURCE_DIR}/config/banjo_tooie.us.rev0.toml")
set(BT_N64RECOMP_ELF
    "${CMAKE_CURRENT_SOURCE_DIR}/local/banjotooie_decompressed.elf")
set(BT_N64RECOMP_SECTIONS
    "${CMAKE_CURRENT_SOURCE_DIR}/config/banjo_tooie.us.rev0.sections.txt")

if(BT_AUTO_RECOMP)
    find_program(BT_N64RECOMP_EXECUTABLE
        NAMES N64Recomp
        HINTS
            "${CMAKE_CURRENT_SOURCE_DIR}/../upstream/N64Recomp/build-macos-arm64"
            "${CMAKE_CURRENT_SOURCE_DIR}/../upstream/N64Recomp/build"
            "${CMAKE_CURRENT_SOURCE_DIR}/lib/N64ModernRuntime/N64Recomp/build"
        DOC "Path to the N64Recomp executable")

    if(NOT BT_N64RECOMP_EXECUTABLE)
        message(FATAL_ERROR
            "BT_AUTO_RECOMP is enabled, but N64Recomp was not found. "
            "Build N64Recomp and set -DBT_N64RECOMP_EXECUTABLE=/path/to/N64Recomp, "
            "or explicitly set -DBT_AUTO_RECOMP=OFF.")
    endif()

    foreach(RECOMP_INPUT IN ITEMS
            "${BT_N64RECOMP_CONFIG}"
            "${BT_N64RECOMP_ELF}"
            "${BT_N64RECOMP_SECTIONS}")
        if(NOT EXISTS "${RECOMP_INPUT}")
            message(FATAL_ERROR
                "Required N64Recomp input is missing: ${RECOMP_INPUT}")
        endif()
    endforeach()

    # N64Recomp decides the generated translation-unit list. Run it before
    # file(GLOB CONFIGURE_DEPENDS) whenever a real input is newer, so CMake
    # never creates a compile graph from stale output or an obsolete file list.
    set(BT_N64RECOMP_STAMP
        "${RECOMPILED_FUNCS_DIR}/.n64recomp.stamp")
    set(BT_N64RECOMP_REQUIRED FALSE)
    if(NOT EXISTS "${BT_N64RECOMP_STAMP}")
        set(BT_N64RECOMP_REQUIRED TRUE)
    else()
        foreach(RECOMP_INPUT IN ITEMS
                "${BT_N64RECOMP_EXECUTABLE}"
                "${BT_N64RECOMP_CONFIG}"
                "${BT_N64RECOMP_ELF}"
                "${BT_N64RECOMP_SECTIONS}")
            if("${RECOMP_INPUT}" IS_NEWER_THAN "${BT_N64RECOMP_STAMP}")
                set(BT_N64RECOMP_REQUIRED TRUE)
            endif()
        endforeach()
    endif()

    if(BT_N64RECOMP_REQUIRED)
        file(MAKE_DIRECTORY "${RECOMPILED_FUNCS_DIR}")
        message(STATUS
            "Generating Banjo-Tooie sources with ${BT_N64RECOMP_EXECUTABLE}")
        execute_process(
            COMMAND "${BT_N64RECOMP_EXECUTABLE}" "${BT_N64RECOMP_CONFIG}"
            WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
            RESULT_VARIABLE BT_N64RECOMP_RESULT)
        if(NOT BT_N64RECOMP_RESULT EQUAL 0)
            message(FATAL_ERROR
                "N64Recomp failed with exit code ${BT_N64RECOMP_RESULT}")
        endif()
        file(TOUCH "${BT_N64RECOMP_STAMP}")
    endif()

    set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS
        "${BT_N64RECOMP_EXECUTABLE}"
        "${BT_N64RECOMP_CONFIG}"
        "${BT_N64RECOMP_ELF}"
        "${BT_N64RECOMP_SECTIONS}")
endif()

file(GLOB RECOMPILED_FUNC_SOURCES CONFIGURE_DEPENDS
    "${RECOMPILED_FUNCS_DIR}/funcs_*.c")

if(NOT RECOMPILED_FUNC_SOURCES)
    message(FATAL_ERROR
        "No generated funcs_*.c files found in ${RECOMPILED_FUNCS_DIR}. "
        "Enable BT_AUTO_RECOMP or run N64Recomp with "
        "config/banjo_tooie.us.rev0.toml first.")
endif()

if(NOT EXISTS "${RECOMPILED_FUNCS_DIR}/lookup.cpp")
    message(FATAL_ERROR "Generated lookup.cpp is missing from ${RECOMPILED_FUNCS_DIR}")
endif()

set(RECOMPILED_RSP_SOURCE
    "${CMAKE_CURRENT_SOURCE_DIR}/build/rsp/n_aspMain.cpp")
if(NOT EXISTS "${RECOMPILED_RSP_SOURCE}")
    message(FATAL_ERROR
        "Generated Tooie audio RSP source is missing. Run RSPRecomp with "
        "config/n_aspMain.us.rev0.toml first.")
endif()

add_library(RecompiledFuncs STATIC
    ${RECOMPILED_FUNC_SOURCES}
    "${RECOMPILED_FUNCS_DIR}/lookup.cpp")

target_compile_options(RecompiledFuncs PRIVATE
    -fno-strict-aliasing
    -falign-functions=16
    -Wno-unused-variable
    -Wno-implicit-function-declaration)

target_include_directories(RecompiledFuncs PRIVATE
    "${RECOMPILED_FUNCS_DIR}"
    "${CMAKE_CURRENT_SOURCE_DIR}/src"
    "${CMAKE_CURRENT_SOURCE_DIR}/lib/N64ModernRuntime/N64Recomp/include"
    "${CMAKE_CURRENT_SOURCE_DIR}/lib/N64ModernRuntime/ultramodern/include"
    "${CMAKE_CURRENT_SOURCE_DIR}/lib/N64ModernRuntime/librecomp/include")

set(RECOMP_FRONTEND_N64MODERNRUNTIME_PATH
    "${CMAKE_CURRENT_SOURCE_DIR}/lib/N64ModernRuntime")
set(RECOMP_FRONTEND_RT64_PATH
    "${CMAKE_CURRENT_SOURCE_DIR}/lib/rt64")

# RT64 defines the shader helper functions in its own directory scope. Their
# command variables must be supplied again where RecompFrontend calls them.
set(DXC_COMMON_OPTS "-I${CMAKE_CURRENT_SOURCE_DIR}/src")
set(DXC_DXIL_OPTS "-Wno-ignored-attributes")
set(DXC_SPV_OPTS "-spirv" "-fspv-target-env=vulkan1.0" "-fvk-use-dx-layout")
set(DXC_PS_OPTS "${DXC_COMMON_OPTS}" "-E" "PSMain" "-T" "ps_6_0"
    "-D" "DYNAMIC_RENDER_PARAMS")
set(DXC_VS_OPTS "${DXC_COMMON_OPTS}" "-E" "VSMain" "-T" "vs_6_0"
    "-D" "DYNAMIC_RENDER_PARAMS" "-fvk-invert-y")

if(APPLE)
    set(DXC
        "DYLD_LIBRARY_PATH=${CMAKE_CURRENT_SOURCE_DIR}/lib/rt64/src/contrib/dxc/lib/arm64"
        "${CMAKE_CURRENT_SOURCE_DIR}/lib/rt64/src/contrib/dxc/bin/arm64/dxc-macos")
elseif(CMAKE_SYSTEM_NAME MATCHES "Linux")
    if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND
            CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64|AMD64")
        set(DXC
            "LD_LIBRARY_PATH=${CMAKE_CURRENT_SOURCE_DIR}/lib/rt64/src/contrib/dxc/lib/x64"
            "${CMAKE_CURRENT_SOURCE_DIR}/lib/rt64/src/contrib/dxc/bin/x64/dxc-linux")
    else()
        set(DXC
            "LD_LIBRARY_PATH=${CMAKE_CURRENT_SOURCE_DIR}/lib/rt64/src/contrib/dxc/lib/arm64"
            "${CMAKE_CURRENT_SOURCE_DIR}/lib/rt64/src/contrib/dxc/bin/arm64/dxc-linux")
    endif()
endif()

add_subdirectory(lib/RecompFrontend)

if(CMAKE_SYSTEM_NAME MATCHES "Linux")
    # RecompFrontend includes Plume's RenderWindow definition directly. Keep
    # it on the same SDL/Vulkan window ABI as RT64, matching BanjoRecomp's
    # Linux configuration.
    target_compile_definitions(recompui PRIVATE
        PLUME_SDL_VULKAN_ENABLED
        RT64_SDL_WINDOW_VULKAN)
endif()

add_executable(BanjoTooieRecompiled
    "${RECOMPILED_RSP_SOURCE}"
    src/diagnostics.cpp
    src/main.cpp
    src/recomp_api.cpp
    src/register_overlays.cpp
    lib/rt64/src/contrib/mupen64plus-core/src/device/pif/n64_cic_nus_6105.c)

if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND
        CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64|AMD64")
    # The recompiled RSP vector unit uses SSSE3/SSE4.1 intrinsics. Match the
    # baseline used by upstream BanjoRecomp so these are enabled explicitly
    # instead of depending on the build machine's compiler defaults.
    target_compile_options(BanjoTooieRecompiled PRIVATE
        -march=nehalem
        -fno-omit-frame-pointer
        -fno-strict-aliasing
        -fms-extensions)
else()
    target_compile_options(BanjoTooieRecompiled PRIVATE
        -fno-omit-frame-pointer
        -fno-strict-aliasing
        -fms-extensions)
endif()

target_include_directories(BanjoTooieRecompiled PRIVATE
    "${CMAKE_CURRENT_BINARY_DIR}/generated"
    "${RECOMPILED_FUNCS_DIR}"
    "${CMAKE_CURRENT_SOURCE_DIR}/src"
    "${CMAKE_CURRENT_SOURCE_DIR}/lib/N64ModernRuntime/N64Recomp/include"
    "${CMAKE_CURRENT_SOURCE_DIR}/lib/N64ModernRuntime/ultramodern/include"
    "${CMAKE_CURRENT_SOURCE_DIR}/lib/N64ModernRuntime/librecomp/include"
    "${CMAKE_CURRENT_SOURCE_DIR}/lib/rt64/src"
    "${CMAKE_CURRENT_SOURCE_DIR}/lib/rt64/src/contrib"
    "${CMAKE_CURRENT_SOURCE_DIR}/lib/rt64/src/contrib/mupen64plus-core/src/device/pif"
    "${CMAKE_CURRENT_SOURCE_DIR}/lib/rt64/src/contrib/nativefiledialog-extended/src/include"
    "${CMAKE_CURRENT_SOURCE_DIR}/lib/RecompFrontend/recompinput/include"
    "${CMAKE_CURRENT_SOURCE_DIR}/lib/RecompFrontend/recompui/include"
    "${CMAKE_CURRENT_SOURCE_DIR}/lib/RecompFrontend/recompui/src")

target_link_libraries(BanjoTooieRecompiled PRIVATE
    RecompiledFuncs
    recompui
    recompinput
    librecomp
    ultramodern
    rt64
    nfd
    SDL2::SDL2)

if(CMAKE_SYSTEM_NAME MATCHES "Linux")
    set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
    set(THREADS_PREFER_PTHREAD_FLAG TRUE)
    find_package(Threads REQUIRED)
    target_link_libraries(BanjoTooieRecompiled PRIVATE
        atomic
        ${CMAKE_DL_LIBS}
        Threads::Threads)
    target_link_options(BanjoTooieRecompiled PRIVATE
        -static-libstdc++
        -Wl,--build-id=sha1)
endif()

# RecompFrontend requires a primary font, an emoji fallback and PromptFont.
# The Lato variants come from the pinned RmlUi dependency. PromptFont is the
# same OFL-licensed asset used by BanjoRecomp and is vendored with its license.
set(RMLUI_SAMPLE_ASSETS
    "${CMAKE_CURRENT_SOURCE_DIR}/lib/RecompFrontend/recompui/lib/RmlUi/Samples/assets")
set(PRIMARY_FONT "${RMLUI_SAMPLE_ASSETS}/LatoLatin-Regular.ttf")
set(BOLD_FONT "${RMLUI_SAMPLE_ASSETS}/LatoLatin-Bold.ttf")
set(ITALIC_FONT "${RMLUI_SAMPLE_ASSETS}/LatoLatin-Italic.ttf")
set(BOLD_ITALIC_FONT "${RMLUI_SAMPLE_ASSETS}/LatoLatin-BoldItalic.ttf")
set(EMOJI_FONT "${RMLUI_SAMPLE_ASSETS}/NotoEmoji-Regular.ttf")
set(PROMPT_FONT "${CMAKE_CURRENT_SOURCE_DIR}/assets/promptfont/promptfont.ttf")
set(PROMPT_FONT_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/assets/promptfont/LICENSE.txt")
set(PROMPT_FONT_README "${CMAKE_CURRENT_SOURCE_DIR}/assets/promptfont/README.md")
set(BUILTIN_PROMPT_HD_PACK
    "${CMAKE_CURRENT_SOURCE_DIR}/assets/BanjoTooiePlayStationPromptsHD.rtz")
set(BUILTIN_HD_TEXT_PACK
    "${CMAKE_CURRENT_SOURCE_DIR}/assets/BanjoTooieHDText-v0.2.1.rtz")
if(APPLE)
    set_target_properties(BanjoTooieRecompiled PROPERTIES
        OUTPUT_NAME "Banjo-Tooie Recompiled Demo"
        MACOSX_BUNDLE TRUE
        MACOSX_BUNDLE_BUNDLE_NAME "Banjo-Tooie Recompiled Demo"
        MACOSX_BUNDLE_GUI_IDENTIFIER "no.larssolbakk.BanjoTooieRecompiled"
        MACOSX_BUNDLE_BUNDLE_VERSION "${BT_PROJECT_VERSION}"
        MACOSX_BUNDLE_SHORT_VERSION_STRING "${BT_PROJECT_VERSION}"
        MACOSX_BUNDLE_INFO_STRING
            "Demo v${BT_DEMO_VERSION} (${BT_BUILD_ID})"
        MACOSX_BUNDLE_ICON_FILE "BanjoTooieRecompiled.icns"
        XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "-")
    set_source_files_properties(
        assets/BanjoTooieRecompiled.icns
        PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
    set_source_files_properties(
        assets/recomp.rcss
        ${PRIMARY_FONT}
        ${BOLD_FONT}
        ${ITALIC_FONT}
        ${BOLD_ITALIC_FONT}
        ${EMOJI_FONT}
        ${BUILTIN_PROMPT_HD_PACK}
        ${BUILTIN_HD_TEXT_PACK}
        PROPERTIES MACOSX_PACKAGE_LOCATION "Resources/assets")
    set_source_files_properties(
        ${PROMPT_FONT}
        ${PROMPT_FONT_LICENSE}
        ${PROMPT_FONT_README}
        PROPERTIES MACOSX_PACKAGE_LOCATION "Resources/assets/promptfont")
    target_sources(BanjoTooieRecompiled PRIVATE
        assets/BanjoTooieRecompiled.icns
        assets/recomp.rcss
        ${PRIMARY_FONT}
        ${BOLD_FONT}
        ${ITALIC_FONT}
        ${BOLD_ITALIC_FONT}
        ${EMOJI_FONT}
        ${BUILTIN_PROMPT_HD_PACK}
        ${BUILTIN_HD_TEXT_PACK}
        ${PROMPT_FONT}
        ${PROMPT_FONT_LICENSE}
        ${PROMPT_FONT_README})
    set_property(TARGET BanjoTooieRecompiled APPEND PROPERTY LINK_DEPENDS
        "${CMAKE_CURRENT_SOURCE_DIR}/assets/BanjoTooieRecompiled.icns")
    add_custom_command(TARGET BanjoTooieRecompiled POST_BUILD
        COMMAND codesign --sign - --force --deep
            "$<TARGET_BUNDLE_DIR:BanjoTooieRecompiled>"
        VERBATIM)
elseif(CMAKE_SYSTEM_NAME MATCHES "Linux")
    # Native Linux resolves UI assets relative to its working directory. Put
    # a self-contained assets tree beside the executable; the SteamOS launcher
    # starts from this directory.
    add_custom_command(TARGET BanjoTooieRecompiled POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E make_directory
            "$<TARGET_FILE_DIR:BanjoTooieRecompiled>/assets/promptfont"
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
            "${CMAKE_CURRENT_SOURCE_DIR}/assets/recomp.rcss"
            "${PRIMARY_FONT}"
            "${BOLD_FONT}"
            "${ITALIC_FONT}"
            "${BOLD_ITALIC_FONT}"
            "${EMOJI_FONT}"
            "${BUILTIN_PROMPT_HD_PACK}"
            "${BUILTIN_HD_TEXT_PACK}"
            "$<TARGET_FILE_DIR:BanjoTooieRecompiled>/assets"
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
            "${PROMPT_FONT}"
            "${PROMPT_FONT_LICENSE}"
            "${PROMPT_FONT_README}"
            "$<TARGET_FILE_DIR:BanjoTooieRecompiled>/assets/promptfont"
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
            "${CMAKE_CURRENT_SOURCE_DIR}/assets/BanjoTooieRecompiled.png"
            "$<TARGET_FILE_DIR:BanjoTooieRecompiled>/BanjoTooieRecompiled.png"
        VERBATIM)
endif()
