cmake_minimum_required(VERSION 3.16.0 FATAL_ERROR) # Set the project version and language project(Lylat64 VERSION 0.1.0 LANGUAGES C CXX ASM) 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 the C++ standard and enable the MSVC parallel build option set(CMAKE_CXX_STANDARD 20 CACHE STRING "The C++ standard to use") set(CMAKE_C_STANDARD 11 CACHE STRING "The C standard to use") #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/") include(FindFontconfig) if (WIN32) include(cmake/automate-vcpkg.cmake) # Forced to use MSVC set(MSVC ON) if(MSVC) set(VCPKG_TRIPLET x64-windows-static) set(VCPKG_TARGET_TRIPLET x64-windows-static) else() set(VCPKG_TRIPLET x64-mingw-static) set(VCPKG_TARGET_TRIPLET x64-mingw-static) endif() vcpkg_bootstrap() vcpkg_install_packages(fontconfig sdl2 zlib bzip2 libpng getopt dirent libusb pthread glew glfw3) endif() if (MSVC) set(CPP "${CMAKE_C_COMPILER}" "/EP") else() set(CPP "${CMAKE_C_COMPILER}" "-E" "-P" "-Wno-trigraphs" "-x" "c") endif() # Set game compilation version set(VERSION us) set(USE_NETWORKING ON) # Add compile definitions for the target add_compile_definitions( VERSION_US=1 ENABLE_RUMBLE=1 F3DEX_GBI=1 _LANGUAGE_C _USE_MATH_DEFINES CIMGUI_DEFINE_ENUMS_AND_STRUCTS NON_MATCHING=1 NON_EQUIVALENT=1 ) # Find necessary libraries if (UNIX AND NOT APPLE) find_package(OpenGL REQUIRED) endif() # Include directories include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ) # Collect source files to build the executable file(GLOB_RECURSE ALL_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/libultra/io/aisetfreq.c" "src/libultra/gu/sqrtf.c" "src/libultra/gu/mtxutil.c" "src/libultra/gu/ortho.c" "src/main/*.c" "src/main/*.h" "src/port/*.h" "src/port/*.cpp" "src/assets/*.c" "src/overlays/*.c" "src/port/importer/*.cpp" "src/port/importer/types/*.cpp" ) # Exclude specific files from the ALL_FILES list list(FILTER ALL_FILES EXCLUDE REGEX ".*.inc.c") # list(FILTER ALL_FILES EXCLUDE REGEX "src/main/fox_demo.c") # list(FILTER ALL_FILES EXCLUDE REGEX "src/main/fox_versus.c") # list(FILTER ALL_FILES EXCLUDE REGEX "src/main/fox_edisplay.c") # list(FILTER ALL_FILES EXCLUDE REGEX "src/main/fox_hud.c") # list(FILTER ALL_FILES EXCLUDE REGEX "src/main/fox_360.c") # list(FILTER ALL_FILES EXCLUDE REGEX "src/main/fox_beam.c") # list(FILTER ALL_FILES EXCLUDE REGEX "src/main/fox_bg.c") # list(FILTER ALL_FILES EXCLUDE REGEX "src/main/fox_play.c") # list(FILTER ALL_FILES EXCLUDE REGEX "src/main/fox_effect.c") # list(FILTER ALL_FILES EXCLUDE REGEX "src/main/fox_tank.c") # list(FILTER ALL_FILES EXCLUDE REGEX "src/main/fox_edata.c") # list(FILTER ALL_FILES EXCLUDE REGEX "src/main/fox_enmy.c") # list(FILTER ALL_FILES EXCLUDE REGEX "src/main/fox_enmy2.c") # list(FILTER ALL_FILES EXCLUDE REGEX "src/main/fox_edata_1C.c") # list(FILTER ALL_FILES EXCLUDE REGEX "src/main/fox_display.c") list(FILTER ALL_FILES EXCLUDE REGEX "src/main/sys_fault.c") add_executable(${PROJECT_NAME} ${ALL_FILES} ${GENERATED_SOURCES}) ################################################################################ # 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" $<$: MultiThreadedDebug > $<$: MultiThreaded > $<$,$>>:${MSVC_RUNTIME_LIBRARY_DEFAULT}> ) elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Win32") string(CONCAT "MSVC_RUNTIME_LIBRARY_STR" $<$: MultiThreadedDebug > $<$: MultiThreaded > $<$,$>>:${MSVC_RUNTIME_LIBRARY_DEFAULT}> ) endif() set_target_properties(${PROJECT_NAME} PROPERTIES MSVC_RUNTIME_LIBRARY ${MSVC_RUNTIME_LIBRARY_STR}) endif() endif() #==============================================================================# # Libultraship Integration # #==============================================================================# include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/include ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/include/libultraship ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/log ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/debug ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/menu ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/utils ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/utils/binarytools ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/config ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/resource ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/resource/type ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/resource/factory ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/audio ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/window ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/window/gui ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/config ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/public ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/public/libultra ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/public/bridge ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/extern ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/extern/tinyxml2 ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/libultraship/Lib/ ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/libultraship/Lib/libjpeg/include/ ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/libultraship/Lib/spdlog/include/ ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/graphic/Fast3D/U64/PR ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/graphic ${SDL2_INCLUDE_DIRS} ${GLEW_INCLUDE_DIRS} ) if (CMAKE_SYSTEM_NAME STREQUAL "Windows") if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") target_compile_definitions(${PROJECT_NAME} PRIVATE "$<$:" "_DEBUG;" "_CRT_SECURE_NO_WARNINGS;" "ENABLE_DX11;" ">" "$<$:" "NDEBUG" ">" "INCLUDE_GAME_PRINTF;" "UNICODE;" "_UNICODE" STORMLIB_NO_AUTO_LINK "_CRT_SECURE_NO_WARNINGS;" ) elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Win32") target_compile_definitions(${PROJECT_NAME} PRIVATE "$<$:" "NOINCLUDE_GAME_PRINTF;" "_DEBUG;" "_CRT_SECURE_NO_WARNINGS;" "ENABLE_OPENGL" ">" "$<$:" "NDEBUG;" ">" "INCLUDE_GAME_PRINTF;" "WIN32;" "UNICODE;" "_UNICODE" STORMLIB_NO_AUTO_LINK ) endif() elseif (CMAKE_SYSTEM_NAME STREQUAL "CafeOS") target_compile_definitions(${PROJECT_NAME} PRIVATE "$<$:" "_DEBUG" ">" "$<$:" "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 "$<$:" "_DEBUG" ">" "$<$:" "NDEBUG" ">" "$<$:ENABLE_CROWD_CONTROL>" "SPDLOG_ACTIVE_LEVEL=0;" "_CONSOLE;" "_CRT_SECURE_NO_WARNINGS;" "ENABLE_OPENGL;" "UNICODE;" "_UNICODE" ) endif() add_subdirectory(libultraship ${CMAKE_CURRENT_SOURCE_DIR}/libultraship) add_dependencies(${PROJECT_NAME} libultraship) target_link_libraries(${PROJECT_NAME} PRIVATE libultraship) if(USE_NETWORKING) if(MSVC) vcpkg_install_packages(sdl2-net) endif() find_package(SDL2_net REQUIRED) include_directories(${SDL2_NET_INCLUDE_DIRS}) target_link_libraries(${PROJECT_NAME} PRIVATE SDL2_net::SDL2_net) target_compile_definitions(${PROJECT_NAME} PRIVATE USE_NETWORKING) endif() ################################################################################ # Compile and link options ################################################################################ if(MSVC) if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") target_compile_options(${PROJECT_NAME} PRIVATE $<$: /w; /Od; /MTd > $<$: /Oi; /Gy; /W3; /MT > /permissive-; /MP; ${DEFAULT_CXX_DEBUG_INFORMATION_FORMAT}; ${DEFAULT_CXX_EXCEPTION_HANDLING} ) target_compile_options(${PROJECT_NAME} PRIVATE $<$:/ZI;>) elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Win32") target_compile_options(${PROJECT_NAME} PRIVATE $<$: /MTd > $<$: /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 $<$: /INCREMENTAL > $<$: /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 $<$: /STACK:8777216 > $<$: /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") target_compile_options(${PROJECT_NAME} PRIVATE -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 $<$: -Werror-implicit-function-declaration -Wno-incompatible-pointer-types > $<$:-fpermissive> $<$: -Wno-c++11-narrowing -Wno-deprecated-enum-enum-conversion > -pthread ) target_link_options(${PROJECT_NAME} PRIVATE -pthread ) elseif (CMAKE_SYSTEM_NAME STREQUAL "NintendoSwitch") target_compile_options(${PROJECT_NAME} PRIVATE -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 $<$: -Werror-implicit-function-declaration -Wno-incompatible-pointer-types > $<$:-fpermissive> $<$: -Wno-c++11-narrowing -Wno-deprecated-enum-enum-conversion > -pthread ) target_link_options(${PROJECT_NAME} PRIVATE -pthread ) elseif (CMAKE_SYSTEM_NAME STREQUAL "CafeOS") target_compile_options(${PROJECT_NAME} PRIVATE -O2 # disable some warnings to not clutter output -Wno-multichar -Wno-return-type -Wno-narrowing -Wno-switch-outside-range $<$: -Werror-implicit-function-declaration -Wno-incompatible-pointer-types -Wno-discarded-array-qualifiers -Wno-discarded-qualifiers -Wno-int-conversion -Wno-builtin-declaration-mismatch -Wno-switch-unreachable -Wno-stringop-overflow > ) else() if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") set(CPU_OPTION -msse2 -mfpmath=sse) endif() target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra -Wno-error -Wno-unused-parameter -Wno-unused-function -Wno-unused-variable -Wno-missing-field-initializers -Wno-parentheses -Wno-narrowing -Wno-missing-braces $<$: -Werror-implicit-function-declaration -Wno-incompatible-pointer-types > $<$:-fpermissive> $<$:-Wno-deprecated-enum-enum-conversion> -pthread ${CPU_OPTION} ) target_link_options(${PROJECT_NAME} PRIVATE -pthread -Wl,-export-dynamic ) endif() endif()