cmake_minimum_required(VERSION 3.16) project(aee_2026 VERSION 0.1.0 LANGUAGES CXX) if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) set(CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE) endif() set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # --- GENERACIÓ DEL VERSION.H AMB GIT HASH --- # Si GIT_HASH ve passat des de fora (Makefile), l'usem; si no, el resolem amb git. if(NOT DEFINED GIT_HASH OR GIT_HASH STREQUAL "") find_package(Git QUIET) if(GIT_FOUND) execute_process( COMMAND ${GIT_EXECUTABLE} rev-parse --short=7 HEAD WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE GIT_HASH OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET ) endif() if(NOT DEFINED GIT_HASH OR GIT_HASH STREQUAL "") set(GIT_HASH "unknown") endif() endif() configure_file(${CMAKE_SOURCE_DIR}/source/version.h.in ${CMAKE_BINARY_DIR}/version.h @ONLY) set(APP_SOURCES source/main.cpp source/core/system/director.cpp source/core/rendering/screen.cpp source/core/rendering/gif.cpp source/core/rendering/surface.cpp source/core/rendering/sprite/sprite.cpp source/core/rendering/sprite/moving_sprite.cpp source/core/rendering/sprite/animated_sprite.cpp source/core/resources/resource_helper.cpp source/core/resources/resource_cache.cpp source/utils/utils.cpp source/game/scenes/game_scene.cpp source/game/entities/player.cpp ) find_package(SDL3 REQUIRED CONFIG REQUIRED COMPONENTS SDL3) add_executable(${PROJECT_NAME} ${APP_SOURCES}) target_include_directories(${PROJECT_NAME} PRIVATE "${CMAKE_SOURCE_DIR}/source" "${CMAKE_BINARY_DIR}" ) target_link_libraries(${PROJECT_NAME} PRIVATE SDL3::SDL3) # Copia recursius de la carpeta data/ al costat del binari per que les rutes # relatives ("data/player/player.gif") funcionen sense desplegament. add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/data" "$/data" COMMENT "Copying data/ next to the binary" ) target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra -Wpedantic) target_compile_definitions(${PROJECT_NAME} PRIVATE $<$:_DEBUG> $<$:RELEASE_BUILD> ) # --- STATIC ANALYSIS / FORMAT TARGETS --- find_program(CLANG_TIDY_EXE NAMES clang-tidy) find_program(CLANG_FORMAT_EXE NAMES clang-format) find_program(CPPCHECK_EXE NAMES cppcheck) file(GLOB_RECURSE ALL_SOURCE_FILES "${CMAKE_SOURCE_DIR}/source/*.cpp" "${CMAKE_SOURCE_DIR}/source/*.hpp" "${CMAKE_SOURCE_DIR}/source/*.h" ) list(FILTER ALL_SOURCE_FILES EXCLUDE REGEX ".*/external/.*") set(CPPCHECK_SOURCES ${ALL_SOURCE_FILES}) list(FILTER CPPCHECK_SOURCES INCLUDE REGEX ".*\\.cpp$") if(CLANG_TIDY_EXE) add_custom_target(tidy COMMAND ${CLANG_TIDY_EXE} -p ${CMAKE_BINARY_DIR} ${ALL_SOURCE_FILES} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMENT "Running clang-tidy..." ) add_custom_target(tidy-fix COMMAND ${CLANG_TIDY_EXE} -p ${CMAKE_BINARY_DIR} --fix ${ALL_SOURCE_FILES} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMENT "Running clang-tidy with fixes..." ) else() message(STATUS "clang-tidy no encontrado - targets 'tidy' y 'tidy-fix' no disponibles") endif() if(CLANG_FORMAT_EXE) add_custom_target(format COMMAND ${CLANG_FORMAT_EXE} -i ${ALL_SOURCE_FILES} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMENT "Running clang-format..." ) add_custom_target(format-check COMMAND ${CLANG_FORMAT_EXE} --dry-run --Werror ${ALL_SOURCE_FILES} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMENT "Checking clang-format..." ) else() message(STATUS "clang-format no encontrado - targets 'format' y 'format-check' no disponibles") endif() if(CPPCHECK_EXE) add_custom_target(cppcheck COMMAND ${CPPCHECK_EXE} --enable=warning,style,performance,portability --std=c++20 --language=c++ --inline-suppr --suppress=missingIncludeSystem --suppress=toomanyconfigs --suppress=*:*source/external/* --suppress=normalCheckLevelMaxBranches -D_DEBUG -DLINUX_BUILD --quiet -I ${CMAKE_SOURCE_DIR}/source ${CPPCHECK_SOURCES} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMENT "Running cppcheck..." ) else() message(STATUS "cppcheck no encontrado - target 'cppcheck' no disponible") endif()