81 lines
2.7 KiB
CMake
81 lines
2.7 KiB
CMake
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 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
|
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()
|