cmake_minimum_required(VERSION 3.16) project(FnixLib VERSION 0.1.0 DESCRIPTION "Biblioteca multimedia propia para juegos y aplicaciones 2D/3D" LANGUAGES C) # La versión 0.1.0 solo tiene implementación para Linux (X11). if(NOT CMAKE_SYSTEM_NAME STREQUAL "Linux") message(FATAL_ERROR "FnixLib ${PROJECT_VERSION} solo está implementada para Linux (X11). " "El soporte de Windows todavía no existe.") endif() if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) set(CMAKE_BUILD_TYPE Release CACHE STRING "Tipo de compilación" FORCE) endif() set(CMAKE_C_STANDARD 17) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_EXTENSIONS OFF) option(FNIX_BUILD_EXAMPLES "Compilar los ejemplos" ON) option(FNIX_BUILD_TESTS "Compilar las pruebas (ctest)" ON) option(FNIX_WARNINGS_AS_ERRORS "Tratar las advertencias como errores" OFF) option(FNIX_SANITIZE "Compilar con AddressSanitizer y UBSan" OFF) if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang") add_compile_options(-Wall -Wextra -Wpedantic -Wshadow) if(FNIX_WARNINGS_AS_ERRORS) add_compile_options(-Werror) endif() if(FNIX_SANITIZE) add_compile_options(-fsanitize=address,undefined -fno-omit-frame-pointer -fno-sanitize-recover=undefined) add_link_options(-fsanitize=address,undefined) endif() endif() # Única dependencia del sistema: Xlib (libX11). find_package(X11 REQUIRED) add_library(fnix src/core/errors.c src/core/window.c src/graphics/canvas.c src/graphics/draw2d.c src/input/input.c src/time/time.c src/platform/linux/x11_keys.c src/platform/linux/x11_window.c) add_library(FnixLib::fnix ALIAS fnix) target_include_directories(fnix PUBLIC $ PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src) target_link_libraries(fnix PRIVATE X11::X11) if(FNIX_BUILD_EXAMPLES) add_executable(basic examples/basic/main.c) target_link_libraries(basic PRIVATE fnix) endif() if(FNIX_BUILD_TESTS) enable_testing() foreach(test_name core draw2d input) add_executable(test_${test_name} tests/test_${test_name}.c) target_link_libraries(test_${test_name} PRIVATE fnix) add_test(NAME ${test_name} COMMAND test_${test_name}) endforeach() # test_input comprueba la lógica interna, así que usa cabeceras privadas. target_include_directories(test_input PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src) # Necesita un servidor X11; sin DISPLAY termina con el código 77 (omitida). add_executable(test_window_x11 tests/test_window_x11.c) target_link_libraries(test_window_x11 PRIVATE fnix X11::X11) add_test(NAME window_x11 COMMAND test_window_x11) set_tests_properties(window_x11 PROPERTIES SKIP_RETURN_CODE 77) endif()