# ================================================================ # FIND CMOCKA (system → FetchContent as fallback) # ================================================================ find_package(cmocka QUIET) if(NOT cmocka_FOUND) message( STATUS "[arena] cmocka not found on system — fetching with FetchContent...") include(FetchContent) FetchContent_Declare( cmocka GIT_REPOSITORY https://git.cryptomilk.org/projects/cmocka.git GIT_TAG cmocka-1.1.7 GIT_SHALLOW TRUE) # Static lib only, no cmocka examples or self-tests set(WITH_STATIC_LIB ON CACHE BOOL "" FORCE) set(WITH_SHARED_LIB OFF CACHE BOOL "" FORCE) set(WITH_CMOCKERY_SUPPORT OFF CACHE BOOL "" FORCE) set(WITH_EXAMPLES OFF CACHE BOOL "" FORCE) set(UNIT_TESTING OFF CACHE BOOL "" FORCE) set(PICKY_DEVELOPER OFF CACHE BOOL "" FORCE) FetchContent_MakeAvailable(cmocka) # Normalize the target name (varies across cmocka versions) if(NOT TARGET cmocka::cmocka) if(TARGET cmocka-static) add_library(cmocka::cmocka ALIAS cmocka-static) elseif(TARGET cmocka) add_library(cmocka::cmocka ALIAS cmocka) else() message( WARNING "[arena] Could not create cmocka::cmocka target — skipping tests.") return() endif() endif() endif() # ================================================================ # DETECT ADDRESS SANITIZER SUPPORT # ================================================================ set(ARENA_USE_ASAN OFF) if(ARENA_ENABLE_SANITIZERS) if(MSVC) if(MSVC_VERSION GREATER_EQUAL 1928) set(ARENA_USE_ASAN ON) else() message(STATUS "[arena] MSVC < 16.9: ASAN not available.") endif() elseif(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang" AND NOT WIN32) include(CheckCCompilerFlag) check_c_compiler_flag(-fsanitize=address ARENA_COMPILER_HAS_ASAN) if(ARENA_COMPILER_HAS_ASAN) set(ARENA_USE_ASAN ON) else() message(STATUS "[arena] Compiler does not support -fsanitize=address.") endif() else() message(STATUS "[arena] Unknown platform/compiler — ASAN skipped.") endif() if(ARENA_USE_ASAN) message(STATUS "[arena] Address Sanitizer enabled.") endif() endif() # ================================================================ # TEST EXECUTABLE # ================================================================ add_executable(test_arena test_arena.c) target_link_libraries(test_arena PRIVATE arena cmocka::cmocka) target_compile_features(test_arena PRIVATE c_std_11) # Apply ASAN flags per compiler if(ARENA_USE_ASAN) if(MSVC) target_compile_options(test_arena PRIVATE /fsanitize=address) else() target_compile_options(test_arena PRIVATE -fsanitize=address -fno-omit-frame-pointer) target_link_options(test_arena PRIVATE -fsanitize=address) endif() endif() # ================================================================ # CTEST REGISTRATION # ================================================================ add_test(NAME arena_tests COMMAND test_arena) set_tests_properties(arena_tests PROPERTIES TIMEOUT 30)