Files
Arena/CMakeLists.txt

98 lines
3.0 KiB
CMake
Raw Normal View History

2026-03-29 10:40:09 -06:00
cmake_minimum_required(VERSION 3.20)
2026-05-20 17:00:02 -06:00
project(
arena
VERSION 1.0
LANGUAGES C)
2026-03-29 10:40:09 -06:00
2026-05-20 18:53:21 -06:00
# ------------------------------------------------
# C standard — no compiler extensions
# ------------------------------------------------
2026-03-29 10:40:09 -06:00
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
2026-05-20 18:53:21 -06:00
set(CMAKE_C_EXTENSIONS OFF)
# Export compile_commands.json (clangd / IDEs)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
2026-03-29 10:40:09 -06:00
2026-05-20 17:00:02 -06:00
# ------------------------------------------------
2026-05-20 18:53:21 -06:00
# Is this the root project or embedded (CPM / FetchContent)?
2026-05-20 17:00:02 -06:00
# ------------------------------------------------
if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
set(ARENA_IS_TOP_LEVEL ON)
else()
set(ARENA_IS_TOP_LEVEL OFF)
endif()
2026-05-20 18:53:21 -06:00
# ------------------------------------------------
# Options
# ------------------------------------------------
option(ARENA_BUILD_TESTS "Build arena tests" ${ARENA_IS_TOP_LEVEL})
option(ARENA_BUILD_EXAMPLE "Build arena example" ${ARENA_IS_TOP_LEVEL})
option(ARENA_ENABLE_INSTALL "Install arena" ${ARENA_IS_TOP_LEVEL})
option(ARENA_ENABLE_SANITIZERS "Enable Address Sanitizer in tests" ON)
# ------------------------------------------------
# Portable warning flags
# ------------------------------------------------
if(MSVC)
set(ARENA_WARNING_FLAGS /W4)
else()
set(ARENA_WARNING_FLAGS -Wall -Wextra -Wpedantic)
endif()
2026-04-23 12:09:07 -06:00
2026-05-20 18:53:21 -06:00
# ================================================================
# LIBRARY
# ================================================================
2026-05-20 17:00:02 -06:00
add_library(arena src/arena.c)
2026-04-23 12:00:35 -06:00
2026-05-20 18:53:21 -06:00
# Namespaced alias → consumers can write arena::arena
add_library(arena::arena ALIAS arena)
2026-05-20 17:00:02 -06:00
target_include_directories(
arena PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>)
2026-03-29 10:40:09 -06:00
2026-05-20 18:53:21 -06:00
# Propagate C11 requirement to consumers
target_compile_features(arena PUBLIC c_std_11)
# Warnings only for the lib itself, not propagated
target_compile_options(arena PRIVATE ${ARENA_WARNING_FLAGS})
2026-03-29 10:40:09 -06:00
2026-05-20 18:53:21 -06:00
# ================================================================
# EXAMPLE (optional, only when top-level)
# ================================================================
if(ARENA_BUILD_EXAMPLE)
add_executable(arena_example src/main.c)
target_link_libraries(arena_example PRIVATE arena)
endif()
# ================================================================
# TESTS
# ================================================================
2026-04-23 12:09:07 -06:00
if(ARENA_BUILD_TESTS)
2026-05-20 17:00:02 -06:00
enable_testing()
add_subdirectory(test)
endif()
2026-05-20 18:53:21 -06:00
# ================================================================
# INSTALL
# ================================================================
if(ARENA_ENABLE_INSTALL)
include(GNUInstallDirs)
install(
TARGETS arena
EXPORT arenaTargets
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(
EXPORT arenaTargets
FILE arenaTargets.cmake
NAMESPACE arena::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/arena)
endif()