180 lines
5.9 KiB
CMake
180 lines
5.9 KiB
CMake
# CMakeLists.txt
|
|
|
|
cmake_minimum_required(VERSION 3.10)
|
|
project(orni VERSION 0.7.2)
|
|
|
|
# Info del proyecto
|
|
set(PROJECT_LONG_NAME "Orni Attack")
|
|
set(PROJECT_COPYRIGHT_ORIGINAL "© 1999 Visente i Sergi")
|
|
set(PROJECT_COPYRIGHT_PORT "© 2025 JailDesigner")
|
|
set(PROJECT_COPYRIGHT "${PROJECT_COPYRIGHT_ORIGINAL}, ${PROJECT_COPYRIGHT_PORT}")
|
|
|
|
# Establecer estándar de C++
|
|
set(CMAKE_CXX_STANDARD 20)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED True)
|
|
|
|
# Exportar comandos de compilación para herramientas de análisis
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
|
|
# --- GENERACIÓN DE VERSIÓN AUTOMÁTICA ---
|
|
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
|
|
)
|
|
else()
|
|
set(GIT_HASH "unknown")
|
|
endif()
|
|
|
|
# Configurar archivo de versión
|
|
configure_file(${CMAKE_SOURCE_DIR}/source/project.h.in ${CMAKE_BINARY_DIR}/project.h @ONLY)
|
|
|
|
# --- LISTA DE FUENTES (AUTO-DESCUBRIMIENTO) ---
|
|
# Buscar automáticamente todos los archivos .cpp en core/, game/ y main.cpp
|
|
file(GLOB_RECURSE CORE_SOURCES "${CMAKE_SOURCE_DIR}/source/core/*.cpp")
|
|
file(GLOB_RECURSE GAME_SOURCES "${CMAKE_SOURCE_DIR}/source/game/*.cpp")
|
|
set(APP_SOURCES
|
|
${CORE_SOURCES}
|
|
${GAME_SOURCES}
|
|
source/main.cpp
|
|
)
|
|
|
|
# Excluir archivos legacy (código Pascal de referencia)
|
|
list(FILTER APP_SOURCES EXCLUDE REGEX ".*/legacy/.*")
|
|
|
|
# Log de archivos encontrados (útil para debug)
|
|
list(LENGTH APP_SOURCES APP_SOURCES_COUNT)
|
|
message(STATUS "Archivos .cpp encontrados: ${APP_SOURCES_COUNT}")
|
|
|
|
# Configuración de SDL3
|
|
find_package(SDL3 REQUIRED CONFIG REQUIRED COMPONENTS SDL3)
|
|
message(STATUS "SDL3 encontrado: ${SDL3_INCLUDE_DIRS}")
|
|
|
|
# --- AÑADIR EJECUTABLE ---
|
|
add_executable(${PROJECT_NAME} ${APP_SOURCES})
|
|
|
|
# --- DIRECTORIOS DE INCLUSIÓN ---
|
|
target_include_directories(${PROJECT_NAME} PUBLIC
|
|
"${CMAKE_SOURCE_DIR}/source"
|
|
"${CMAKE_BINARY_DIR}"
|
|
)
|
|
|
|
# Enlazar las librerías SDL3
|
|
target_link_libraries(${PROJECT_NAME} PRIVATE SDL3::SDL3)
|
|
|
|
# --- CONFIGURACIÓN PLATAFORMAS Y COMPILADOR ---
|
|
# Configuración de flags de compilación
|
|
target_compile_options(${PROJECT_NAME} PRIVATE -Wall)
|
|
target_compile_options(${PROJECT_NAME} PRIVATE $<$<CONFIG:RELEASE>:-O2 -ffunction-sections -fdata-sections>)
|
|
|
|
# Definir _DEBUG en modo Debug y RELEASE_BUILD en modo Release
|
|
target_compile_definitions(${PROJECT_NAME} PRIVATE $<$<CONFIG:DEBUG>:_DEBUG>)
|
|
target_compile_definitions(${PROJECT_NAME} PRIVATE $<$<CONFIG:RELEASE>:RELEASE_BUILD>)
|
|
|
|
# Definir MACOS_BUNDLE si es un bundle de macOS
|
|
if(APPLE AND MACOSX_BUNDLE)
|
|
target_compile_definitions(${PROJECT_NAME} PRIVATE MACOS_BUNDLE)
|
|
endif()
|
|
|
|
# Configuración específica para cada plataforma
|
|
if(WIN32)
|
|
target_compile_definitions(${PROJECT_NAME} PRIVATE WINDOWS_BUILD)
|
|
target_link_libraries(${PROJECT_NAME} PRIVATE mingw32)
|
|
# Static linking for libgcc and libstdc++ (avoid DLL dependencies for distribution)
|
|
target_link_options(${PROJECT_NAME} PRIVATE
|
|
-static-libgcc
|
|
-static-libstdc++
|
|
-static
|
|
)
|
|
# Añadir icono en Windows (se configurará desde el Makefile con windres)
|
|
elseif(APPLE)
|
|
target_compile_definitions(${PROJECT_NAME} PRIVATE MACOS_BUILD)
|
|
target_compile_options(${PROJECT_NAME} PRIVATE -Wno-deprecated)
|
|
set(CMAKE_OSX_ARCHITECTURES "arm64")
|
|
elseif(UNIX AND NOT APPLE)
|
|
target_compile_definitions(${PROJECT_NAME} PRIVATE LINUX_BUILD)
|
|
endif()
|
|
|
|
# Especificar la ubicación del ejecutable
|
|
set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR})
|
|
|
|
# --- STATIC ANALYSIS TARGETS ---
|
|
# Buscar herramientas de análisis estático
|
|
find_program(CLANG_FORMAT_EXE NAMES clang-format)
|
|
find_program(CLANG_TIDY_EXE NAMES clang-tidy)
|
|
|
|
# Recopilar todos los archivos fuente para formateo
|
|
file(GLOB_RECURSE ALL_SOURCE_FILES
|
|
"${CMAKE_SOURCE_DIR}/source/*.cpp"
|
|
"${CMAKE_SOURCE_DIR}/source/*.hpp"
|
|
)
|
|
# Excluir directorios con checks deshabilitados
|
|
list(FILTER ALL_SOURCE_FILES EXCLUDE REGEX ".*/audio/.*")
|
|
list(FILTER ALL_SOURCE_FILES EXCLUDE REGEX ".*/legacy/.*")
|
|
|
|
# Targets de clang-format
|
|
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()
|
|
|
|
# Targets de clang-tidy
|
|
if(CLANG_TIDY_EXE)
|
|
# En macOS, obtener la ruta del SDK para que clang-tidy encuentre los headers del sistema
|
|
set(CLANG_TIDY_EXTRA_ARGS "")
|
|
if(APPLE)
|
|
execute_process(
|
|
COMMAND xcrun --show-sdk-path
|
|
OUTPUT_VARIABLE MACOS_SDK_PATH
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
)
|
|
if(MACOS_SDK_PATH)
|
|
set(CLANG_TIDY_EXTRA_ARGS "--extra-arg=-isysroot${MACOS_SDK_PATH}")
|
|
message(STATUS "clang-tidy usará SDK de macOS: ${MACOS_SDK_PATH}")
|
|
endif()
|
|
endif()
|
|
|
|
add_custom_target(tidy
|
|
COMMAND ${CLANG_TIDY_EXE}
|
|
-p ${CMAKE_BINARY_DIR}
|
|
${CLANG_TIDY_EXTRA_ARGS}
|
|
--fix
|
|
--fix-errors
|
|
${ALL_SOURCE_FILES}
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
COMMENT "Running clang-tidy with auto-fix..."
|
|
)
|
|
|
|
add_custom_target(tidy-check
|
|
COMMAND ${CLANG_TIDY_EXE}
|
|
-p ${CMAKE_BINARY_DIR}
|
|
${CLANG_TIDY_EXTRA_ARGS}
|
|
--warnings-as-errors='*'
|
|
${ALL_SOURCE_FILES}
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
COMMENT "Checking clang-tidy..."
|
|
)
|
|
else()
|
|
message(STATUS "clang-tidy no encontrado - targets 'tidy' y 'tidy-check' no disponibles")
|
|
endif()
|