diff options
| author | coco875 <59367621+coco875@users.noreply.github.com> | 2026-07-23 02:02:58 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-07-22 18:02:58 -0600 |
| commit | 4c24ae2bc2294c96a81d296a68b6d404f34358e7 (patch) | |
| tree | 0a4d1fb0e353e1b14755d1a2c8d2fcc4d4c29b70 /CMakeLists.txt | |
| parent | 022e0737d598e93429355db66c07be39e974926f (diff) | |
Refactor cmake (#721)
* some start of refactor
* Update SetFlags.cmake
* Update SetCmakeVar.cmake
* Update SetFlags.cmake
* Fix error int-convertion
* more refactor
* clean up include and source file
* fix link of lib
* fix a warning
* fix include in src/actors
* fix include in src/debug
* fix include in src/ending
* fix include in src/engine/actors
* fix include in src/engine/cameras
* fix include in src/engine/editor
* fix include in src/engine/objects
* fix include in src/engine/tracks
* fix include in src/port/ui
* fix include in src/racing
* fix include in src/engine/vehicles
* fix include in subfolder of src/engine
* fix include in src/engine
* fix include in src/enhancements
* fix include in src
* fix switch
* invert common and findlib
* Update SetFlags.cmake
* clean up some workflow
* some splification
* Update build.sh
* Update Game.h
* add header back
* Delete test_check.cmake
* continue
* Update common.cmake
Diffstat (limited to 'CMakeLists.txt')
| -rw-r--r-- | CMakeLists.txt | 891 |
1 files changed, 200 insertions, 691 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 53ae41d78..883763dfe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,334 +1,113 @@ cmake_minimum_required(VERSION 3.16.0 FATAL_ERROR) # Set the project version and language -project(Spaghettify VERSION 1.0.0 LANGUAGES C CXX ASM) +project( + Spaghettify + VERSION 1.0.0 + LANGUAGES C CXX ASM) include(FetchContent) -# fmt's consteval format-string checking fails to compile under newer -# AppleClang (Xcode 16+) with the spdlog/fmt versions in use (both vcpkg's on -# CI and Torch's bundled copy — see cmake/TorchExternalFixes.cmake for the -# latter): -# error: call to consteval function 'fmt::basic_format_string<...>' is not -# a constant expression -# Defining FMT_CONSTEVAL as empty falls back to fmt's pre-C++20 constexpr -# checking, which compiles cleanly with identical runtime behavior. Scoped to -# AppleClang; other platforms and compilers are untouched. -# TODO: Temporary hack. Remove this (plus cmake/TorchExternalFixes.cmake and -# the vcpkg.json fmt/spdlog pins) once the Torch pin is bumped past Torch's -# spdlog/fmt update. Note the bump also needs matching MK64 loader changes, -# see the discussion on PR #712. -if(APPLE AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") - add_compile_definitions("FMT_CONSTEVAL=") -endif() +# Set Project Version +include(cmake/GetVersion.cmake) -set(NATO_PHONETIC_ALPHABET - "Alfa" "Bravo" "Charlie" "Delta" "Echo" "Foxtrot" "Golf" "Hotel" - "India" "Juliett" "Kilo" "Lima" "Mike" "November" "Oscar" "Papa" - "Quebec" "Romeo" "Sierra" "Tango" "Uniform" "Victor" "Whiskey" - "Xray" "Yankee" "Zulu" -) - -# Get the patch version number from the project version -math(EXPR PATCH_INDEX "${PROJECT_VERSION_PATCH}") - -# Use the patch number to select the correct word -list(GET NATO_PHONETIC_ALPHABET ${PATCH_INDEX} PROJECT_PATCH_WORD) - -set(PROJECT_BUILD_NAME "Bolognese ${PROJECT_PATCH_WORD}" CACHE STRING "" FORCE) -set(PROJECT_TEAM "SpaghettiKart Team - HarbourMasters") - -execute_process( - COMMAND git config --global --add safe.directory ${CMAKE_SOURCE_DIR} - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_QUIET -) - -execute_process( - COMMAND git describe --tags - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE PROJECT_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE -) -if (DEFINED PROJECT_VERSION AND NOT "${PROJECT_VERSION}" STREQUAL "") - string(REPLACE "-" ";" PROJECT_VERSION_LIST "${PROJECT_VERSION}") - list(GET PROJECT_VERSION_LIST 0 PROJECT_VERSION_PATCH) - string(REPLACE "." ";" PROJECT_VERSION_LIST "${PROJECT_VERSION_PATCH}") - list(LENGTH PROJECT_VERSION_LIST PROJECT_VERSION_LIST_LENGTH) - if (${PROJECT_VERSION_LIST_LENGTH} LESS 3) - set(PROJECT_VERSION_PATCH 0) - else() - list(GET PROJECT_VERSION_LIST 2 PROJECT_VERSION_PATCH) - endif() -else() - set(PROJECT_VERSION "Unknown") - execute_process( - COMMAND git log --pretty=format:%h -1 - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE PROJECT_VERSION_PATCH - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - if (DEFINED PROJECT_VERSION_PATCH AND NOT "${PROJECT_VERSION_PATCH}" STREQUAL "") - set(PROJECT_VERSION "${PROJECT_VERSION}-${PROJECT_VERSION_PATCH}") - endif() - set(PROJECT_VERSION_PATCH 0) -endif() +# Set some Cmake variable +include(cmake/SetCmakeVar.cmake) -message("Spaghetti Kart version: ${PROJECT_VERSION} ${PROJECT_PATCH_WORD}") +# add_compile_options(-fsanitize=address) add_link_options(-fsanitize=address) -if(APPLE) - enable_language(OBJCXX) -endif() - -# Set the minimum version of CMake and the deployment target for macOS -set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version") - -# Set CMake to build as Universal Binary for macOS -set(CMAKE_OSX_ARCHITECTURES=arm64;x86_64) - -# Set the C++ standard and enable the MSVC parallel build option -set(CMAKE_CXX_STANDARD 20 CACHE STRING "The C++ standard to use") -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_C_STANDARD 11 CACHE STRING "The C standard to use") -set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT Spaghettify) -#add_compile_options(-fsanitize=address) -#add_link_options(-fsanitize=address) - -# Add a custom module path to locate additional CMake modules -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/") set(YAML_CPP_STATIC_DEFINE ON) -add_compile_definitions(YAML_CPP_STATIC_DEFINE) -include(cmake/lus-cvars.cmake) - -if (WIN32) - include(cmake/automate-vcpkg.cmake) - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(VCPKG_TRIPLET x64-windows-static) - set(VCPKG_TARGET_TRIPLET x64-windows-static) - else() - set(VCPKG_TRIPLET x86-windows-static) - set(VCPKG_TARGET_TRIPLET x86-windows-static) - endif() - vcpkg_bootstrap() - vcpkg_install_packages() +include(libultraship/cmake/cvars.cmake) - set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT ${PROJECT_NAME}) - set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_DEBUGGER_WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) +if(WIN32) + option(ENABLE_VCPKG "Enable vcpkg for dependencies" ON) +else() + option(ENABLE_VCPKG "Enable vcpkg for dependencies" OFF) endif() -if (MSVC) - set(CPP "${CMAKE_C_COMPILER}" "/EP") -else() - set(CPP "${CMAKE_C_COMPILER}" "-E" "-P" "-Wno-trigraphs" "-x" "c") +if(ENABLE_VCPKG) + include(cmake/dependencies/vcpkg.cmake) endif() -if(IOS) +set(SPAGHETTIKART_IOS OFF) +if(IOS OR CMAKE_SYSTEM_NAME STREQUAL "iOS") + set(SPAGHETTIKART_IOS ON) set(PLATFORM "OS64") include(cmake/ios.toolchain.cmake) - add_compile_definitions( - PLATFORM_IOS=1 -) set(CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "YOUR_TEAM_ID") set(PROJECT_ID "dev.net64.game") endif() -################################################################################ -# Set target arch type if empty. Visual studio solution generator provides it. -################################################################################ -if (CMAKE_SYSTEM_NAME STREQUAL "Windows") - if(NOT CMAKE_VS_PLATFORM_NAME) - set(CMAKE_VS_PLATFORM_NAME "x64") - endif() - message("${CMAKE_VS_PLATFORM_NAME} architecture in use") - - if(NOT ("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64" - OR "${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Win32")) - message(FATAL_ERROR "${CMAKE_VS_PLATFORM_NAME} arch is not supported!") - endif() -endif() - -################################################################################ -# Compiler specific configuration types -################################################################################ -if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU|Clang|AppleClang") - set(COMMON_FLAGS "-Wall -Wextra -Wno-error \ - -Wno-return-type \ - -Wno-unused-parameter \ - -Wno-unused-function \ - -Wno-unused-variable \ - -Wno-missing-field-initializers \ - -Wno-parentheses \ - -Wno-narrowing \ - -Wno-missing-braces \ - -ffast-math \ - -flto=auto \ - -pipe" - ) - - set(COMMON_C_FLAGS "${COMMON_FLAGS} -Wno-int-conversion -Werror-implicit-function-declaration -Wno-incompatible-pointer-types") - set(COMMON_CXX_FLAGS "${COMMON_FLAGS} -Wno-c++11-narrowing -Wno-deprecated-enum-enum-conversion -fpermissive -fomit-frame-pointer") -elseif (MSVC) - set(COMMON_FLAGS "/fp:fast") - set(COMMON_C_FLAGS "${COMMON_FLAGS}") - set(COMMON_CXX_FLAGS "${COMMON_FLAGS}") -else() - set(COMMON_C_FLAGS "") - set(COMMON_CXX_FLAGS "") -endif() - -# fix LTO breaks debug information on Apple/Ninja https://gitlab.kitware.com/cmake/cmake/-/issues/25202 -if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "AppleClang" AND "${CMAKE_BUILD_TYPE}" STREQUAL "Debug") - add_link_options("-fno-lto") - add_compile_options("-fno-lto") -endif() - -################################################################################ -# Global configuration types -################################################################################ -if (MSVC) - set(CMAKE_C_FLAGS_DEBUG "/Od /Zi /DNDEBUG ${COMMON_C_FLAGS}") - set(CMAKE_CXX_FLAGS_DEBUG "/Od /Zi /DNDEBUG ${COMMON_CXX_FLAGS}") - set(CMAKE_C_FLAGS_RELEASE "/O2 /DNDEBUG ${COMMON_C_FLAGS}") - set(CMAKE_CXX_FLAGS_RELEASE "/O2 /DNDEBUG ${COMMON_CXX_FLAGS}") -else() - set(CMAKE_C_FLAGS_DEBUG "-g -DNDEBUG ${COMMON_C_FLAGS}") - set(CMAKE_CXX_FLAGS_DEBUG "-g -DNDEBUG ${COMMON_CXX_FLAGS}") - set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG ${COMMON_C_FLAGS}") - set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG ${COMMON_CXX_FLAGS}") - set(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG ${COMMON_C_FLAGS}") - set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG ${COMMON_CXX_FLAGS}") - set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g -DNDEBUG ${COMMON_C_FLAGS}") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -DNDEBUG ${COMMON_CXX_FLAGS}") -endif() - # Toggle for GLES (Required for many ARM/Mobile platforms) option(USE_OPENGLES "Use OpenGLES instead of Desktop OpenGL" OFF) # Set game compilation version set(VERSION us) -set(USE_NETWORKING OFF) set(SKIP_XCODE_VERSION_CHECK ON) # TODO: Sorry i broke this set(GFX_DEBUG_DISASSEMBLER OFF) -if(NOT MSVC) -include(CheckCCompilerFlag) -include(CheckCXXCompilerFlag) -check_c_compiler_flag("-Wno-error=int-conversion" HAS_WNO_ERROR_INT_CONVERSION) -check_cxx_compiler_flag("-Wno-error=changes-meaning" HAS_WNO_ERROR_CHANGES_MEANING) - -add_compile_options("$<$<COMPILE_LANGUAGE:C>:-Wno-error=incompatible-pointer-types>" "$<$<COMPILE_LANGUAGE:CXX>:-Wno-error=narrowing>") - -if(HAS_WNO_ERROR_INT_CONVERSION) - add_compile_options("$<$<COMPILE_LANGUAGE:C>:-Wno-error=int-conversion>") -endif() - -if(HAS_WNO_ERROR_CHANGES_MEANING) - add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-Wno-error=changes-meaning>") -endif() +if(MSVC) + set(CPP "${CMAKE_C_COMPILER}" "/EP") +else() + set(CPP "${CMAKE_C_COMPILER}" "-E" "-P" "-Wno-trigraphs" "-x" "c") endif() -# Add compile definitions for the target -add_compile_definitions( - VERSION_US=1 - $<$<BOOL:${USE_OPENGLES}>:USE_OPENGLES> - ENABLE_RUMBLE=1 - F3DEX_GBI=1 - _LANGUAGE_C - _USE_MATH_DEFINES - CIMGUI_DEFINE_ENUMS_AND_STRUCTS - NON_MATCHING=1 - NON_EQUIVALENT=1 - AVOID_UB=1 - SPAGHETTI_VERSION="${PROJECT_VERSION}" -) - - -if (CMAKE_SYSTEM_NAME STREQUAL "Windows") - configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/properties.h.in ${CMAKE_CURRENT_SOURCE_DIR}/properties.h @ONLY) +if(WIN32) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/properties.h.in + ${CMAKE_CURRENT_SOURCE_DIR}/properties.h @ONLY) endif() -# Include directories -include_directories( - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/include - ${CMAKE_CURRENT_SOURCE_DIR}/include/assets - ${CMAKE_CURRENT_SOURCE_DIR}/src - ${CMAKE_CURRENT_SOURCE_DIR}/src/racing - ${CMAKE_CURRENT_SOURCE_DIR}/src/ending - ${CMAKE_CURRENT_SOURCE_DIR}/src/data - ${CMAKE_CURRENT_SOURCE_DIR}/src/buffers - ${CMAKE_CURRENT_SOURCE_DIR}/src/audio - ${CMAKE_CURRENT_SOURCE_DIR}/src/debug - ${CMAKE_CURRENT_SOURCE_DIR}/src/engine - ${CMAKE_CURRENT_SOURCE_DIR}/src/engine/tracks - ${CMAKE_CURRENT_SOURCE_DIR}/src/engine/actors - ${CMAKE_CURRENT_SOURCE_DIR}/src/engine/objects - ${CMAKE_CURRENT_SOURCE_DIR}/src/engine/sky - ${CMAKE_CURRENT_SOURCE_DIR}/src/engine/particles - ${CMAKE_CURRENT_SOURCE_DIR}/src/enhancements - ${CMAKE_CURRENT_SOURCE_DIR}/src/enhancements/freecam -) - # Collect source files to build the executable -file(GLOB ALL_FILES_ROOT RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} - "src/*.c" - "src/*.h" - "src/os/guLookAtF.c" - "src/os/guPerspectiveF.c" - "src/os/guMtxF2L.c" - "src/os/guRotateF.c" - "src/os/guOrthoF.c" - "src/os/guScaleF.c" - "src/os/guTranslateF.c" - "src/os/guMtxCatF.c" - "src/os/guMtxCatL.c" - "src/os/guNormalize.c" -) - -file(GLOB_RECURSE ALL_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} - "src/buffers/*.c" - "src/buffers/*.h" - "src/data/*.c" - "src/data/*.h" - "src/debug/*.c" - "src/debug/*.h" - "src/ending/*.c" - "src/ending/*.h" - "src/racing/*.c" - "src/racing/*.h" - "src/audio/*.c" - "src/audio/*.h" - "src/port/*.h" - "src/port/*.c" - "src/port/*.cpp" - "src/mods/*.h" - "src/mods/*.c" - "src/mods/*.cpp" - "assets/code/*.c" - "courses/*.c" - "courses/*.h" - "src/engine/*.cpp" - "src/engine/*.h" - "src/engine/tracks/*.c" - "src/engine/tracks/*.h" - "src/engine/actors/*.cpp" - "src/engine/actors/*.h" - "src/engine/objects/*.cpp" - "src/engine/objects/*.h" - "src/engine/sky/*.cpp" - "src/engine/sky/*.h" - "src/engine/particles/*.cpp" - "src/engine/particles/*.h" - "src/enhancements/*.c" - "src/enhancements/*.h" - "src/enhancements/freecam/*.c" - "src/enhancements/freecam/*.cpp" - "src/enhancements/freecam/*.h" - "src/engine/*.cpp" - "src/engine/*.h" - "Resource.rc" -) +file( + GLOB ALL_FILES_ROOT + CONFIGURE_DEPENDS + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + "src/*.c" + "src/*.h" + "src/os/guLookAtF.c" + "src/os/guPerspectiveF.c" + "src/os/guMtxF2L.c" + "src/os/guRotateF.c" + "src/os/guOrthoF.c" + "src/os/guScaleF.c" + "src/os/guTranslateF.c" + "src/os/guMtxCatF.c" + "src/os/guMtxCatL.c" + "src/os/guNormalize.c") + +file( + GLOB_RECURSE ALL_FILES + CONFIGURE_DEPENDS + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + "src/buffers/*.c" + "src/buffers/*.h" + "src/data/*.c" + "src/data/*.h" + "src/debug/*.c" + "src/debug/*.h" + "src/ending/*.c" + "src/ending/*.h" + "src/racing/*.c" + "src/racing/*.h" + "src/audio/*.c" + "src/audio/*.h" + "src/port/*.c" + "src/port/*.cpp" + "src/port/*.h" + "src/mods/*.c" + "src/mods/*.cpp" + "src/mods/*.h" + "assets/code/*.c" + "courses/*.c" + "courses/*.h" + "src/engine/*.cpp" + "src/engine/*.c" + "src/engine/*.h" + "src/enhancements/*.c" + "src/enhancements/*.cpp" + "src/enhancements/*.h" + "Resource.rc") list(APPEND ALL_FILES ${ALL_FILES_ROOT}) @@ -336,7 +115,7 @@ list(APPEND ALL_FILES ${ALL_FILES_ROOT}) list(FILTER ALL_FILES EXCLUDE REGEX ".*.inc.c") list(FILTER ALL_FILES EXCLUDE REGEX "./src/debug/crash_screen_enhancement.c") -if (CMAKE_SYSTEM_NAME STREQUAL "iOS") +if(SPAGHETTIKART_IOS) set(IOS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/ios) set(STORYBOARD_FILE ${IOS_DIR}/Launch.storyboard) @@ -345,379 +124,95 @@ if (CMAKE_SYSTEM_NAME STREQUAL "iOS") list(APPEND ALL_FILES ${STORYBOARD_FILE} ${IMAGE_FILES} ${ICON_FILES}) - add_executable(${PROJECT_NAME} ${ALL_FILES}) - set_xcode_property(${PROJECT_NAME} PRODUCT_BUNDLE_IDENTIFIER ${PROJECT_ID} All) - set_target_properties( - ${PROJECT_NAME} - PROPERTIES - MACOSX_BUNDLE TRUE - MACOSX_BUNDLE_INFO_PLIST ${IOS_DIR}/plist.in - RESOURCE "${IMAGE_FILES};${STORYBOARD_FILE};${ICON_FILES}" - ) -else() - add_executable(${PROJECT_NAME} ${ALL_FILES}) endif() -################################################################################ -# OpenGL / OpenGLES library -################################################################################ -if (UNIX AND NOT APPLE) - if (USE_OPENGLES) - find_library(GLESv2_LIBRARY GLESv2 REQUIRED) - target_link_libraries(${PROJECT_NAME} PRIVATE ${GLESv2_LIBRARY}) - else() - find_package(OpenGL REQUIRED) - target_link_libraries(${PROJECT_NAME} PRIVATE OpenGL::GL) - endif() -endif() - -################################################################################ -# MSVC runtime library -################################################################################ -if (MSVC) - if (CMAKE_SYSTEM_NAME STREQUAL "Windows") - get_property(MSVC_RUNTIME_LIBRARY_DEFAULT TARGET ${PROJECT_NAME} PROPERTY MSVC_RUNTIME_LIBRARY) - if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") - string(CONCAT "MSVC_RUNTIME_LIBRARY_STR" - $<$<CONFIG:Debug>: - MultiThreadedDebug - > - $<$<CONFIG:Release>: - MultiThreaded - > - $<$<NOT:$<OR:$<CONFIG:Debug>,$<CONFIG:Release>>>:${MSVC_RUNTIME_LIBRARY_DEFAULT}> - ) - elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Win32") - string(CONCAT "MSVC_RUNTIME_LIBRARY_STR" - $<$<CONFIG:Debug>: - MultiThreadedDebug - > - $<$<CONFIG:Release>: - MultiThreaded - > - $<$<NOT:$<OR:$<CONFIG:Debug>,$<CONFIG:Release>>>:${MSVC_RUNTIME_LIBRARY_DEFAULT}> - ) - endif() - set_target_properties(${PROJECT_NAME} PROPERTIES MSVC_RUNTIME_LIBRARY ${MSVC_RUNTIME_LIBRARY_STR}) - endif() -endif() - -#=================== SSE2NEON =================== -set(SSE2NEON_DIR ${CMAKE_BINARY_DIR}/_deps/sse2neon) -file(DOWNLOAD "https://raw.githubusercontent.com/DLTcollab/sse2neon/refs/heads/master/sse2neon.h" "${SSE2NEON_DIR}/sse2neon.h") - -include_directories(${SSE2NEON_DIR}) - -#================== SEMVER =================== -set(SEMVER_DIR ${CMAKE_BINARY_DIR}/_deps/semver) -file(DOWNLOAD "https://raw.githubusercontent.com/Neargye/semver/refs/tags/v1.0.0-rc/include/semver.hpp" "${SEMVER_DIR}/semver.hpp") - -include_directories(${SEMVER_DIR}) - -#=================== DRLibs =================== -FetchContent_Declare( - dr_libs - GIT_REPOSITORY https://github.com/mackron/dr_libs.git - GIT_TAG da35f9d6c7374a95353fd1df1d394d44ab66cf01 -) -FetchContent_MakeAvailable(dr_libs) - -#=================== STB =================== -include_directories(${STB_DIR}) - -#=================== tomlplusplus =================== -include(FetchContent) -FetchContent_Declare( - tomlplusplus - GIT_REPOSITORY https://github.com/marzer/tomlplusplus.git - GIT_TAG v3.4.0 -) -FetchContent_MakeAvailable(tomlplusplus) -target_link_libraries(${PROJECT_NAME} PRIVATE tomlplusplus::tomlplusplus) - -#==============================================================================# -# Libultraship Integration # -#==============================================================================# - -# Removes MPQ/OTR support -set(EXCLUDE_MPQ_SUPPORT TRUE CACHE BOOL "") -set(ENABLE_EXP_AUTO_CONFIGURE_CONTROLLERS ON CACHE BOOL "") -add_compile_definitions(EXCLUDE_MPQ_SUPPORT) - -if(CMAKE_SYSTEM_NAME STREQUAL "NintendoSwitch") - find_package(SDL2) +add_executable(${PROJECT_NAME} ${ALL_FILES}) +target_include_directories( + ${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/include/assets + ${CMAKE_CURRENT_SOURCE_DIR}/src) +target_compile_definitions(${PROJECT_NAME} PRIVATE YAML_CPP_STATIC_DEFINE) + +if(SPAGHETTIKART_IOS) + target_compile_definitions(${PROJECT_NAME} PRIVATE PLATFORM_IOS=1) + set_xcode_property(${PROJECT_NAME} PRODUCT_BUNDLE_IDENTIFIER ${PROJECT_ID} + All) + set_target_properties( + ${PROJECT_NAME} + PROPERTIES MACOSX_BUNDLE TRUE + MACOSX_BUNDLE_INFO_PLIST ${IOS_DIR}/plist.in + RESOURCE "${IMAGE_FILES};${STORYBOARD_FILE};${ICON_FILES}") endif() -include_directories( - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/include - ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/include/libultraship - ${SDL2_INCLUDE_DIRS} - ${dr_libs_SOURCE_DIR} -) +include(cmake/SetFlags.cmake) -if (NOT USE_OPENGLES) - include_directories(${GLEW_INCLUDE_DIRS}) +# ############################################################################## +# MSVC runtime library +# ############################################################################## +if(MSVC) + set_property( + TARGET ${PROJECT_NAME} + PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") endif() -add_subdirectory(libultraship ${CMAKE_CURRENT_SOURCE_DIR}/libultraship) -add_dependencies(${PROJECT_NAME} libultraship) -target_link_libraries(${PROJECT_NAME} PRIVATE libultraship) - -if (CMAKE_SYSTEM_NAME STREQUAL "Windows") - target_compile_definitions(${PROJECT_NAME} PRIVATE - "$<$<CONFIG:Debug>:" - "_DEBUG;" - "_CRT_SECURE_NO_WARNINGS;" - "ENABLE_DX11;" - ">" - "$<$<CONFIG:Release>:" - "NDEBUG" - ">" - "INCLUDE_GAME_PRINTF;" - "NOMINMAX" - "UNICODE;" - "_UNICODE;" - "_CRT_SECURE_NO_WARNINGS;" - "_SILENCE_ALL_MS_EXT_DEPRECATION_WARNINGS;" - ) - add_compile_definitions(STORMLIB_NO_AUTO_LINK) - set(STORMLIB_NO_AUTO_LINK ON) -elseif (CMAKE_SYSTEM_NAME STREQUAL "CafeOS") - target_compile_definitions(${PROJECT_NAME} PRIVATE - "$<$<CONFIG:Debug>:" - "_DEBUG" - ">" - "$<$<CONFIG:Release>:" - "NDEBUG" - ">" - "SPDLOG_ACTIVE_LEVEL=3;" - "SPDLOG_NO_THREAD_ID;" - "SPDLOG_NO_TLS;" - "STBI_NO_THREAD_LOCALS;" - ) -elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU|Clang|AppleClang") - target_compile_definitions(${PROJECT_NAME} PRIVATE - "$<$<CONFIG:Debug>:" - "_DEBUG" - ">" - "$<$<CONFIG:Release>:" - "NDEBUG" - ">" - "$<$<BOOL:${BUILD_CROWD_CONTROL}>:ENABLE_CROWD_CONTROL>" - "SPDLOG_ACTIVE_LEVEL=0;" - "_CONSOLE;" - "_CRT_SECURE_NO_WARNINGS;" - "UNICODE;" - "_UNICODE" - ) -endif() - -if (CMAKE_SYSTEM_NAME STREQUAL "Windows") - find_package(Ogg CONFIG REQUIRED) - link_libraries(Ogg::ogg) - - find_package(Vorbis CONFIG REQUIRED) - link_libraries(Vorbis::vorbisfile) - set(ADDITIONAL_LIBRARY_DEPENDENCIES - "Ogg::ogg" - "Vorbis::vorbis" - "Vorbis::vorbisenc" - "Vorbis::vorbisfile" - ) -elseif(CMAKE_SYSTEM_NAME STREQUAL "NintendoSwitch") - set(ADDITIONAL_LIBRARY_DEPENDENCIES - -lglad - SDL2::SDL2 - ) -elseif(CMAKE_SYSTEM_NAME STREQUAL "CafeOS") - set(ADDITIONAL_LIBRARY_DEPENDENCIES - "$<$<CONFIG:Debug>:-Wl,--wrap=abort>" - ) - target_include_directories(${PROJECT_NAME} PRIVATE - ${DEVKITPRO}/portlibs/wiiu/include/ - ) -else() - find_package(Ogg REQUIRED) - find_package(Vorbis REQUIRED) - set(ADDITIONAL_LIBRARY_DEPENDENCIES - "Ogg::ogg" - "Vorbis::vorbis" - "Vorbis::vorbisenc" - "Vorbis::vorbisfile" - ) -endif() +include(cmake/dependencies/common.cmake) +include(cmake/dependencies/FindLib.cmake) -if(USE_NETWORKING) - if(MSVC) - vcpkg_install_packages(sdl2-net) - endif() - include_directories(${SDL2_NET_INCLUDE_DIRS}) - target_compile_definitions(${PROJECT_NAME} PRIVATE USE_NETWORKING) - if(CMAKE_SYSTEM_NAME STREQUAL "NintendoSwitch") - target_link_libraries(${PROJECT_NAME} PRIVATE SDL2_net) - elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") - find_package(SDL2_net REQUIRED) - target_link_libraries(${PROJECT_NAME} PRIVATE $<IF:$<TARGET_EXISTS:SDL2_net::SDL2_net>,SDL2_net::SDL2_net,SDL2_net::SDL2_net-static>) - else() - find_package(SDL2_net REQUIRED) - target_link_libraries(${PROJECT_NAME} PRIVATE SDL2_net::SDL2_net-static) - endif() +# fmt's consteval format-string checking fails to compile under newer +# AppleClang (Xcode 16+) with the spdlog/fmt versions in use (both vcpkg's on +# CI and Torch's bundled copy — see cmake/TorchExternalFixes.cmake for the +# latter): +# error: call to consteval function 'fmt::basic_format_string<...>' is not +# a constant expression +# Defining FMT_CONSTEVAL as empty falls back to fmt's pre-C++20 constexpr +# checking, which compiles cleanly with identical runtime behavior. Scoped to +# AppleClang; other platforms and compilers are untouched. +# TODO: Temporary hack. Remove this (plus cmake/TorchExternalFixes.cmake and +# the vcpkg.json fmt/spdlog pins) once the Torch pin is bumped past Torch's +# spdlog/fmt update. Note the bump also needs matching MK64 loader changes, +# see the discussion on PR #712. +if(APPLE AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") + foreach(FMT_CONSUMER ${PROJECT_NAME} libultraship torch) + target_compile_definitions(${FMT_CONSUMER} PRIVATE "FMT_CONSTEVAL=") + endforeach() endif() -option(USE_STANDALONE "Build as a standalone executable" OFF) -option(BUILD_STORMLIB "Build with StormLib support" OFF) - -option(BUILD_SM64 "Build with Super Mario 64 support" OFF) -option(BUILD_MK64 "Build with Mario Kart 64 support" ON) -option(BUILD_SF64 "Build with Star Fox 64 support" OFF) -option(BUILD_FZERO "Build with F-Zero X support" OFF) -option(BUILD_MARIO_ARTIST "Build with Mario Artist support" OFF) - -add_subdirectory(torch) -target_link_libraries(${PROJECT_NAME} PRIVATE torch "${ADDITIONAL_LIBRARY_DEPENDENCIES}") - -if(CMAKE_SYSTEM_NAME MATCHES "NintendoSwitch") - - nx_generate_nacp(${PROJECT_NAME}.nacp - NAME "${PROJECT_NAME}" - AUTHOR "${PROJECT_TEAM}" - VERSION "${PROJECT_VERSION}" -) - - nx_create_nro(${PROJECT_NAME} - NACP ${PROJECT_NAME}.nacp - ICON ${CMAKE_CURRENT_SOURCE_DIR}/icon.png -) +if(CMAKE_SYSTEM_NAME STREQUAL "NintendoSwitch") - INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.nro DESTINATION . COMPONENT ${PROJECT_NAME}) + nx_generate_nacp( + ${PROJECT_NAME}.nacp + NAME + "${PROJECT_NAME}" + AUTHOR + "${PROJECT_TEAM}" + VERSION + "${PROJECT_VERSION}") + + nx_create_nro(${PROJECT_NAME} NACP ${PROJECT_NAME}.nacp ICON + ${CMAKE_CURRENT_SOURCE_DIR}/icon.png) + + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.nro + DESTINATION . + COMPONENT ${PROJECT_NAME}) endif() -################################################################################ +# ############################################################################## # Compile and link options -################################################################################ -if(MSVC) - if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") - target_compile_options(${PROJECT_NAME} PRIVATE - $<$<CONFIG:Debug>: - /w; - /Od; - /MTd - > - $<$<CONFIG:Release>: - /Oi; - /Gy; - /W3; - /MT - > - /permissive-; - /MP; - ${DEFAULT_CXX_DEBUG_INFORMATION_FORMAT}; - ${DEFAULT_CXX_EXCEPTION_HANDLING} - ) - target_compile_options(${PROJECT_NAME} PRIVATE $<$<CONFIG:Debug>:/ZI;>) - target_compile_options(${PROJECT_NAME} PRIVATE $<$<CONFIG:Release>:/Zi;>) - elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Win32") - target_compile_options(${PROJECT_NAME} PRIVATE - $<$<CONFIG:Debug>: - /MTd - > - $<$<CONFIG:Release>: - /O2; - /Oi; - /Gy; - /MT - > - /permissive-; - /MP; - /w; - ${DEFAULT_CXX_DEBUG_INFORMATION_FORMAT}; - ${DEFAULT_CXX_EXCEPTION_HANDLING} - ) - endif() - if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") - target_link_options(${PROJECT_NAME} PRIVATE - $<$<CONFIG:Debug>: - /INCREMENTAL - > - $<$<CONFIG:Release>: - /OPT:REF; - /OPT:ICF; - /INCREMENTAL:NO; - /FORCE:MULTIPLE - > - /MANIFEST:NO; - /DEBUG; - /SUBSYSTEM:WINDOWS - ) - elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Win32") - target_link_options(${PROJECT_NAME} PRIVATE - $<$<CONFIG:Debug>: - /STACK:8777216 - > - $<$<CONFIG:Release>: - /OPT:REF; - /OPT:ICF; - /INCREMENTAL:NO; - /FORCE:MULTIPLE - > - /MANIFEST:NO; - /DEBUG; - /SUBSYSTEM:WINDOWS - ) - endif() - - # Remove /RTC from msvc flags - foreach (fentry - CMAKE_C_FLAGS - CMAKE_CXX_FLAGS - ) - string (REGEX REPLACE "/RTC(su|[1su])" "" ${fentry} "${${fentry}}") - endforeach(fentry) -endif() +# ############################################################################## -if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang") - if (CMAKE_SYSTEM_NAME STREQUAL "Darwin" OR CMAKE_SYSTEM_NAME STREQUAL "iOS") - target_compile_options(${PROJECT_NAME} PRIVATE - -pthread - ) - - target_link_options(${PROJECT_NAME} PRIVATE - -pthread - ) - elseif (CMAKE_SYSTEM_NAME STREQUAL "NintendoSwitch") - target_compile_options(${PROJECT_NAME} PRIVATE - -pthread - ) - - target_link_options(${PROJECT_NAME} PRIVATE - -pthread - ) - elseif (NOT CMAKE_SYSTEM_NAME STREQUAL "CafeOS") - if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") - set(CPU_OPTION -msse2 -mfpmath=sse) - endif() - - target_compile_options(${PROJECT_NAME} PRIVATE - -pthread - ${CPU_OPTION} - ) - - target_link_options(${PROJECT_NAME} PRIVATE - -pthread - -Wl,-export-dynamic - ) - endif() -endif() add_custom_command( - TARGET ${PROJECT_NAME} POST_BUILD - COMMENT "Copying asset yamls..." - COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/config.yml" "$<TARGET_FILE_DIR:Spaghettify>/config.yml" - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/yamls/" "$<TARGET_FILE_DIR:Spaghettify>/yamls/" - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/meta/" "$<TARGET_FILE_DIR:Spaghettify>/meta/" -) + TARGET ${PROJECT_NAME} + POST_BUILD + COMMENT "Copying asset yamls..." + COMMAND + ${CMAKE_COMMAND} -DSOURCE_DIR=${CMAKE_SOURCE_DIR} + -DDESTINATION_DIR=$<TARGET_FILE_DIR:${PROJECT_NAME}> + -P ${CMAKE_SOURCE_DIR}/cmake/StageRuntimeFiles.cmake + VERBATIM) if(NOT CMAKE_SYSTEM_NAME STREQUAL "NintendoSwitch") include(ExternalProject) @@ -736,11 +231,20 @@ if(NOT CMAKE_SYSTEM_NAME STREQUAL "NintendoSwitch") SOURCE_DIR ${CMAKE_SOURCE_DIR}/torch CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/torch -DCMAKE_PROJECT_INCLUDE=${CMAKE_SOURCE_DIR}/cmake/TorchExternalFixes.cmake -) + -DUSE_STANDALONE=ON + -DBUILD_STORMLIB=${BUILD_STORMLIB} + -DBUILD_SM64=${BUILD_SM64} + -DBUILD_MK64=${BUILD_MK64} + -DBUILD_SF64=${BUILD_SF64} + -DBUILD_FZERO=${BUILD_FZERO} + -DBUILD_MARIO_ARTIST=${BUILD_MARIO_ARTIST} + -DBUILD_NAUDIO=${BUILD_NAUDIO} + ) ExternalProject_Get_Property(TorchExternal install_dir) - if (MSVC) - set(TORCH_EXECUTABLE ${install_dir}/src/TorchExternal-build/$<CONFIGURATION>/torch) + if(MSVC) + set(TORCH_EXECUTABLE + ${install_dir}/src/TorchExternal-build/$<CONFIGURATION>/torch) else() set(TORCH_EXECUTABLE ${install_dir}/src/TorchExternal-build/torch) endif() @@ -750,57 +254,62 @@ if(NOT CMAKE_SYSTEM_NAME STREQUAL "NintendoSwitch") DEPENDS TorchExternal WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMAND ${TORCH_EXECUTABLE} header -o baserom.us.z64 - COMMAND ${TORCH_EXECUTABLE} o2r baserom.us.z64 --additional-files meta/mods.toml - COMMAND ${TORCH_EXECUTABLE} pack assets spaghetti.o2r o2r - COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/mk64.o2r" "${CMAKE_BINARY_DIR}/mk64.o2r" - COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/spaghetti.o2r" "${CMAKE_BINARY_DIR}/spaghetti.o2r" -) + COMMAND ${TORCH_EXECUTABLE} o2r baserom.us.z64 --additional-files + meta/mods.toml + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/mk64.o2r" + "${CMAKE_BINARY_DIR}/mk64.o2r" + COMMAND + ${CMAKE_COMMAND} -DTORCH_EXECUTABLE=${TORCH_EXECUTABLE} + -DSOURCE_DIR=${CMAKE_SOURCE_DIR} -DBINARY_DIR=${CMAKE_BINARY_DIR} + -P ${CMAKE_SOURCE_DIR}/cmake/GenerateO2R.cmake + VERBATIM) add_custom_target( GenerateO2R DEPENDS TorchExternal - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - COMMAND ${TORCH_EXECUTABLE} pack assets spaghetti.o2r o2r - COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/spaghetti.o2r" "${CMAKE_BINARY_DIR}/spaghetti.o2r" -) - - if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") - install(FILES "${CMAKE_BINARY_DIR}/spaghetti.o2r" DESTINATION . COMPONENT ${PROJECT_NAME}) + COMMAND + ${CMAKE_COMMAND} -DTORCH_EXECUTABLE=${TORCH_EXECUTABLE} + -DSOURCE_DIR=${CMAKE_SOURCE_DIR} -DBINARY_DIR=${CMAKE_BINARY_DIR} + -P ${CMAKE_SOURCE_DIR}/cmake/GenerateO2R.cmake + VERBATIM) + + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + install( + FILES "${CMAKE_BINARY_DIR}/spaghetti.o2r" + DESTINATION . + COMPONENT ${PROJECT_NAME}) endif() - if(CMAKE_SYSTEM_NAME MATCHES "Darwin") - add_custom_target(CreateOSXIcons - COMMAND mkdir -p ${CMAKE_BINARY_DIR}/macosx/spaghettikart.iconset - COMMAND sips -z 16 16 icon.png --out ${CMAKE_BINARY_DIR}/macosx/spaghettikart.iconset/icon_16x16.png - COMMAND sips -z 32 32 icon.png --out ${CMAKE_BINARY_DIR}/macosx/spaghettikart.iconset/icon_16x16@2x.png - COMMAND sips -z 32 32 icon.png --out ${CMAKE_BINARY_DIR}/macosx/spaghettikart.iconset/icon_32x32.png - COMMAND sips -z 64 64 icon.png --out ${CMAKE_BINARY_DIR}/macosx/spaghettikart.iconset/icon_32x32@2x.png - COMMAND sips -z 128 128 icon.png --out ${CMAKE_BINARY_DIR}/macosx/spaghettikart.iconset/icon_128x128.png - COMMAND sips -z 256 256 icon.png --out ${CMAKE_BINARY_DIR}/macosx/spaghettikart.iconset/icon_128x128@2x.png - COMMAND sips -z 256 256 icon.png --out ${CMAKE_BINARY_DIR}/macosx/spaghettikart.iconset/icon_256x256.png - COMMAND sips -z 512 512 icon.png --out ${CMAKE_BINARY_DIR}/macosx/spaghettikart.iconset/icon_256x256@2x.png - COMMAND sips -z 512 512 icon.png --out ${CMAKE_BINARY_DIR}/macosx/spaghettikart.iconset/icon_512x512.png - COMMAND cp icon.png ${CMAKE_BINARY_DIR}/macosx/spaghettikart.iconset/icon_512x512@2x.png - COMMAND iconutil -c icns -o ${CMAKE_BINARY_DIR}/macosx/spaghettikart.icns ${CMAKE_BINARY_DIR}/macosx/spaghettikart.iconset - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - COMMENT "Creating OSX icons ..." - ) + if(APPLE AND NOT SPAGHETTIKART_IOS) + add_custom_target( + CreateOSXIcons + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/macosx + COMMAND sips -s format icns icon.png --out + ${CMAKE_BINARY_DIR}/macosx/spaghettikart.icns + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + COMMENT "Creating OSX icons ...") add_dependencies(${PROJECT_NAME} CreateOSXIcons) - configure_file("${CMAKE_SOURCE_DIR}/Info.plist" "${CMAKE_BINARY_DIR}/Info.plist" COPYONLY) + configure_file("${CMAKE_SOURCE_DIR}/Info.plist" + "${CMAKE_BINARY_DIR}/Info.plist" COPYONLY) endif() - set_property(TARGET ${PROJECT_NAME} PROPERTY APPIMAGE_DESKTOP_FILE_TERMINAL YES) - set_property(TARGET ${PROJECT_NAME} PROPERTY APPIMAGE_DESKTOP_FILE "${CMAKE_SOURCE_DIR}/SpaghettiKart.desktop") - set_property(TARGET ${PROJECT_NAME} PROPERTY APPIMAGE_ICON_FILE "${CMAKE_SOURCE_DIR}/icon.png") + set_property(TARGET ${PROJECT_NAME} PROPERTY APPIMAGE_DESKTOP_FILE_TERMINAL + YES) + set_property( + TARGET ${PROJECT_NAME} PROPERTY APPIMAGE_DESKTOP_FILE + "${CMAKE_SOURCE_DIR}/SpaghettiKart.desktop") + set_property(TARGET ${PROJECT_NAME} PROPERTY APPIMAGE_ICON_FILE + "${CMAKE_SOURCE_DIR}/icon.png") endif() -if(CMAKE_SYSTEM_NAME MATCHES "Linux") +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") set(CPACK_GENERATOR "External") elseif(CMAKE_SYSTEM_NAME MATCHES "Windows|NintendoSwitch|CafeOS") set(CPACK_GENERATOR "ZIP") -elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin") +elseif(APPLE) set(CPACK_GENERATOR "Bundle") endif() -set(CPACK_PROJECT_CONFIG_FILE ${CMAKE_SOURCE_DIR}/cmake/configure-packaging.cmake) +set(CPACK_PROJECT_CONFIG_FILE + ${CMAKE_SOURCE_DIR}/cmake/configure-packaging.cmake) include(cmake/packaging.cmake) |
