Files
FnixLib/CMakeLists.txt

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()