cmake_minimum_required(VERSION 3.20) project(kaizen) if (WIN32) add_compile_definitions(NOMINMAX) add_compile_definitions(_CRT_SECURE_NO_WARNINGS) endif () add_compile_definitions(VK_NO_PROTOTYPES) if(APPLE) set(CMAKE_OSX_DEPLOYMENT_TARGET 11.0) enable_language(OBJC) endif() set(VULKAN_VALIDATION FALSE) set(SANITIZERS FALSE) set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) if(${CMAKE_BUILD_TYPE} MATCHES Release OR ${CMAKE_BUILD_TYPE} MATCHES RelWithDebInfo) if(NOT SANITIZERS) message("LTO ON") set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) endif() endif() include_directories( src/frontend/Settings src/frontend src/ . src/utils src/backend src/backend/core src/backend/core/mmio src/backend/core/mmio/PIF src/backend/core/registers src/backend/core/rsp external external/xbyak external/mio/include external/json/include external/parallel-rdp external/parallel-rdp external/parallel-rdp/parallel-rdp-standalone/parallel-rdp external/parallel-rdp/parallel-rdp-standalone/volk external/parallel-rdp/parallel-rdp-standalone/spirv-cross external/parallel-rdp/parallel-rdp-standalone/vulkan external/parallel-rdp/parallel-rdp-standalone/vulkan-headers/include external/parallel-rdp/parallel-rdp-standalone/util external/unarr external/SDL/include external/sse2neon external/capstone/include external/imgui external/imgui/backends external/cflags/include external/mINI/src/ src/frontend/ImGuiImpl/ ) option(RAPIDJSON_BUILD_DOC "Build rapidjson documentation." OFF) option(RAPIDJSON_BUILD_EXAMPLES "Build rapidjson examples." OFF) option(RAPIDJSON_BUILD_TESTS "Build rapidjson perftests and unittests." OFF) option(BUILD_SHARED_LIBS OFF) include(CheckCCompilerFlag) if(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)") set(X86 TRUE) message("Compiling on x86") else() set(X86 FALSE) endif() if(CMAKE_SYSTEM_PROCESSOR MATCHES "(aarch64)|(AARCH64)|(arm64)|(ARM64)") set(ARM64 TRUE) message("Compiling on Arm64") else() set(ARM64 FALSE) endif() set(SIMD_FLAG NULL) if(ARM64 AND APPLE) message("Defining USE_NEON...") add_compile_definitions(USE_NEON) add_compile_definitions(SIMD_SUPPORT) elseif(NOT ARM64) if(MSVC) set(SIMD_FLAG /arch:AVX) else() set(SIMD_FLAG -msse4.1) endif() check_c_compiler_flag(${SIMD_FLAG} HAS_SIMD) else() message("Compiling on an unsupported Arm device! Good Luck!") endif() if (HAS_SIMD) message("Defining SIMD_SUPPORT...") add_compile_definitions(SIMD_SUPPORT) add_compile_options(${SIMD_FLAG}) endif () if (${CMAKE_BUILD_TYPE} MATCHES Debug AND VULKAN_VALIDATION) message("VALIDATION LAYERS: ON") add_compile_definitions(VULKAN_DEBUG) endif () add_subdirectory(external/mio) add_subdirectory(src/backend) add_subdirectory(external/parallel-rdp) add_subdirectory(external/unarr) add_subdirectory(external/SDL) add_subdirectory(external/cflags) add_subdirectory(external/imgui) add_subdirectory(external/mINI) set(CAPSTONE_ARCHITECTURE_DEFAULT OFF) set(CAPSTONE_MIPS_SUPPORT ON) set(CAPSTONE_X86_SUPPORT ON) add_subdirectory(external/capstone) add_executable(kaizen src/frontend/main.cpp src/frontend/KaizenGui.hpp src/frontend/KaizenGui.cpp src/frontend/RenderWidget.cpp src/frontend/RenderWidget.hpp src/frontend/EmuThread.hpp src/frontend/EmuThread.cpp src/frontend/SettingsWindow.hpp src/frontend/SettingsWindow.cpp src/frontend/Settings/GeneralSettings.hpp src/frontend/Settings/GeneralSettings.cpp src/frontend/Settings/CPUSettings.hpp src/frontend/Settings/CPUSettings.cpp src/frontend/Settings/AudioSettings.hpp src/frontend/Settings/AudioSettings.cpp src/frontend/NativeWindow.hpp src/utils/Options.cpp src/utils/File.cpp src/frontend/Debugger.hpp src/frontend/Debugger.cpp) if (WIN32) set(MIO_LIB mio::mio_full_winapi) else() set(MIO_LIB mio::mio) endif() target_link_libraries(kaizen PUBLIC imgui SDL3::SDL3 SDL3::SDL3-static cflags::cflags ${MIO_LIB} parallel-rdp capstone backend) target_compile_definitions(kaizen PUBLIC SDL_MAIN_HANDLED) if (SANITIZERS) message("UBSAN AND ASAN: ON") target_compile_options(kaizen PUBLIC -fsanitize=undefined -fsanitize=address) target_link_options(kaizen PUBLIC -fsanitize=undefined -fsanitize=address) endif () file(COPY resources/ DESTINATION ${PROJECT_BINARY_DIR}/resources/) file(REMOVE ${PROJECT_BINARY_DIR}/resources/mario.png ${PROJECT_BINARY_DIR}/resources/shader.frag ${PROJECT_BINARY_DIR}/resources/shader.vert)