# Yet Another Zelda3 Editor # by scawful cmake_minimum_required(VERSION 3.16) # Set minimum policy version for subdirectories to allow older dependencies like yaml-cpp # This allows cmake_minimum_required in subdirectories to use versions < 3.5 set(CMAKE_POLICY_VERSION_MINIMUM 3.5 CACHE STRING "Minimum policy version for subdirectories") # Set policies for compatibility cmake_policy(SET CMP0091 NEW) # CMP0091 allows CMAKE_MSVC_RUNTIME_LIBRARY to be set by presets # Windows presets specify dynamic CRT (/MD) to avoid linking issues cmake_policy(SET CMP0048 NEW) cmake_policy(SET CMP0077 NEW) # Enable Objective-C only on macOS where it's actually used if(DEFINED ENV{YAZE_VERSION_OVERRIDE}) set(YAZE_VERSION $ENV{YAZE_VERSION_OVERRIDE}) elseif(DEFINED YAZE_VERSION_OVERRIDE) set(YAZE_VERSION ${YAZE_VERSION_OVERRIDE}) else() set(YAZE_VERSION "0.5.0") set(YAZE_VERSION_SUFFIX "-alpha") endif() if(APPLE) project(yaze VERSION ${YAZE_VERSION} DESCRIPTION "Yet Another Zelda3 Editor" LANGUAGES CXX C OBJC OBJCXX) else() project(yaze VERSION ${YAZE_VERSION} DESCRIPTION "Yet Another Zelda3 Editor" LANGUAGES CXX C) endif() # Set language standards early so dependencies (e.g., Abseil) build with them. set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD_REQUIRED ON) # Include build options first include(cmake/options.cmake) # Enable sccache/ccache for faster rebuilds if available find_program(SCCACHE_FOUND sccache) if(SCCACHE_FOUND) message(STATUS "✓ sccache found, enabling for faster builds") set(CMAKE_CXX_COMPILER_LAUNCHER sccache) set(CMAKE_C_COMPILER_LAUNCHER sccache) else() find_program(CCACHE_FOUND ccache) if(CCACHE_FOUND) message(STATUS "✓ ccache found, enabling for faster builds") set(CMAKE_CXX_COMPILER_LAUNCHER ccache) set(CMAKE_C_COMPILER_LAUNCHER ccache) endif() endif() # Version is defined in project() above - use those variables # CMake automatically sets: yaze_VERSION, yaze_VERSION_MAJOR, yaze_VERSION_MINOR, yaze_VERSION_PATCH # These YAZE_VERSION_* aliases are for compatibility with existing code set(YAZE_VERSION_MAJOR ${yaze_VERSION_MAJOR}) set(YAZE_VERSION_MINOR ${yaze_VERSION_MINOR}) set(YAZE_VERSION_PATCH ${yaze_VERSION_PATCH}) # Suppress deprecation warnings from submodules set(CMAKE_WARN_DEPRECATED OFF CACHE BOOL "Suppress deprecation warnings") # Add cmake directory to module path set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH}) # Platform detection if(APPLE) if(CMAKE_SYSTEM_NAME STREQUAL "iOS") set(YAZE_PLATFORM_IOS ON) else() set(YAZE_PLATFORM_MACOS ON) endif() elseif(CMAKE_SYSTEM_NAME MATCHES "Linux") set(YAZE_PLATFORM_LINUX ON) elseif(CMAKE_SYSTEM_NAME MATCHES "Windows") set(YAZE_PLATFORM_WINDOWS ON) endif() # Include utility functions include(cmake/utils.cmake) # Set up dependencies using CPM.cmake include(cmake/dependencies.cmake) # Additional configuration options option(YAZE_SUPPRESS_WARNINGS "Suppress compiler warnings (use -v preset suffix for verbose)" ON) set(YAZE_TEST_ROM_VANILLA_PATH "" CACHE STRING "Path to vanilla test ROM file") set(YAZE_TEST_ROM_US_PATH "" CACHE STRING "Path to US test ROM file") set(YAZE_TEST_ROM_JP_PATH "" CACHE STRING "Path to JP test ROM file") set(YAZE_TEST_ROM_EU_PATH "" CACHE STRING "Path to EU test ROM file") set(YAZE_TEST_ROM_EXPANDED_PATH "" CACHE STRING "Path to expanded test ROM file") set(YAZE_TEST_ROM_PATH "" CACHE STRING "Legacy path to test ROM file (vanilla)") # Export compile commands for clangd/LSP set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # Setup compiler flags and common interface target yaze_add_compiler_flags() # Configure yaze_config.h configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/src/yaze_config.h.in ${CMAKE_CURRENT_BINARY_DIR}/yaze_config.h @ONLY ) # Output directories include(GNUInstallDirs) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}) set(CMAKE_POSITION_INDEPENDENT_CODE ON) set(BUILD_SHARED_LIBS OFF) # Handle dependencies # Project Files add_subdirectory(src) # Tools if(YAZE_BUILD_TOOLS) message(STATUS "Building development tools") add_subdirectory(tools) endif() # Tests if(YAZE_BUILD_TESTS) add_subdirectory(test) endif() # Code quality targets if(YAZE_ENABLE_CLANG_TIDY) if(NOT YAZE_CLANG_TIDY_EXE) find_program(YAZE_CLANG_TIDY_EXE NAMES clang-tidy clang-tidy-18 clang-tidy-17 clang-tidy-16) endif() if(YAZE_CLANG_TIDY_EXE) message(STATUS "✓ clang-tidy enabled: ${YAZE_CLANG_TIDY_EXE}") set(CMAKE_CXX_CLANG_TIDY "${YAZE_CLANG_TIDY_EXE}") else() message(WARNING "clang-tidy requested but not found") endif() endif() find_program(CLANG_FORMAT NAMES clang-format-18 clang-format HINTS "${HOMEBREW_LLVM_PREFIX}/bin" # Prefer clang-format from Homebrew LLVM NO_DEFAULT_PATH ) if(NOT CLANG_FORMAT) # Fallback to generic search if not found in Homebrew prefix find_program(CLANG_FORMAT NAMES clang-format clang-format-17 clang-format-16 clang-format-15 clang-format-14) endif() if(CLANG_FORMAT) file(GLOB_RECURSE ALL_SOURCE_FILES "${CMAKE_SOURCE_DIR}/src/*.cc" "${CMAKE_SOURCE_DIR}/src/*.h" "${CMAKE_SOURCE_DIR}/test/*.cc" "${CMAKE_SOURCE_DIR}/test/*.h") # Exclude third-party library directories from formatting list(FILTER ALL_SOURCE_FILES EXCLUDE REGEX "src/lib/.*") add_custom_target(yaze-format COMMAND ${CLANG_FORMAT} -i --style=file ${ALL_SOURCE_FILES} COMMENT "Running clang-format on source files" ) add_custom_target(yaze-format-check COMMAND ${CLANG_FORMAT} --dry-run --Werror --style=file ${ALL_SOURCE_FILES} COMMENT "Checking code format" ) endif() # Packaging configuration if(NOT YAZE_PLATFORM_IOS) include(cmake/packaging/cpack.cmake) endif() add_custom_target(build_cleaner COMMAND ${CMAKE_COMMAND} -E echo "Running scripts/build_cleaner.py --dry-run" COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_SOURCE_DIR} ${Python3_EXECUTABLE} scripts/build_cleaner.py --dry-run COMMENT "Validate CMake source lists and includes" )