# 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(CMAKE_SYSTEM_NAME MATCHES "Darwin") project(yaze VERSION 0.3.8 DESCRIPTION "Yet Another Zelda3 Editor" LANGUAGES CXX C OBJC OBJCXX) else() project(yaze VERSION 0.3.8 DESCRIPTION "Yet Another Zelda3 Editor" LANGUAGES CXX C) endif() # Include build options first include(cmake/options.cmake) # Enable ccache for faster rebuilds if available 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() # 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}) # 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_PATH "${CMAKE_BINARY_DIR}/bin/zelda3.sfc" CACHE STRING "Path to test ROM file") # Export compile commands for clangd/LSP set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # Platform detection if(CMAKE_SYSTEM_NAME MATCHES "Darwin") set(YAZE_PLATFORM_MACOS ON) elseif(CMAKE_SYSTEM_NAME MATCHES "Linux") set(YAZE_PLATFORM_LINUX ON) elseif(CMAKE_SYSTEM_NAME MATCHES "Windows") set(YAZE_PLATFORM_WINDOWS ON) endif() # 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 option(YAZE_BUILD_TOOLS "Build development utility tools" OFF) 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 find_program(CLANG_FORMAT NAMES clang-format clang-format-14 clang-format-15 clang-format-16 clang-format-17 clang-format-18) 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=Google ${ALL_SOURCE_FILES} COMMENT "Running clang-format on source files" ) add_custom_target(yaze-format-check COMMAND ${CLANG_FORMAT} --dry-run --Werror --style=Google ${ALL_SOURCE_FILES} COMMENT "Checking code format" ) endif() # Packaging configuration include(cmake/packaging/cpack.cmake) 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" )