cmake_minimum_required(VERSION 3.16)
project(embedded_runtime_observer VERSION 0.1.0 LANGUAGES C)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)
set(RTM_TRACE_CAPACITY 64 CACHE STRING "Per-core trace capacity (0 disables)")
option(RTM_SANITIZE "Address and undefined-behavior sanitizers" OFF)
if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang")
  add_compile_options(-Wall -Wextra -Wpedantic -Werror)
  if(RTM_SANITIZE)
    add_compile_options(-fsanitize=address,undefined -fno-omit-frame-pointer)
    add_link_options(-fsanitize=address,undefined)
  endif()
endif()
add_library(rtm STATIC src/rtm.c src/port.c)
target_include_directories(rtm PUBLIC include)
target_compile_definitions(rtm PUBLIC RTM_TRACE_CAPACITY=${RTM_TRACE_CAPACITY})
include(CTest)
if(BUILD_TESTING)
  add_executable(rtm_tests tests/test_rtm.c)
  target_link_libraries(rtm_tests PRIVATE rtm)
  add_test(NAME contracts COMMAND rtm_tests)
  find_package(Threads REQUIRED)
  add_executable(rtm_concurrent_tests tests/test_concurrent.c)
  target_link_libraries(rtm_concurrent_tests PRIVATE rtm Threads::Threads)
  add_test(NAME concurrent_snapshots COMMAND rtm_concurrent_tests)
  find_package(Python3 COMPONENTS Interpreter)
  if(Python3_FOUND)
    add_test(NAME host_tools COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tests/test_tools.py)
  endif()
endif()
foreach(example basic task_isr multicore autosar_concept)
  add_executable(${example} examples/${example}.c)
  target_link_libraries(${example} PRIVATE rtm)
  if(BUILD_TESTING)
    add_test(NAME example_${example} COMMAND ${example})
  endif()
endforeach()
add_executable(baremetal examples/baremetal.c ports/stm_low32.c)
target_link_libraries(baremetal PRIVATE rtm)
if(BUILD_TESTING)
  add_test(NAME example_baremetal COMMAND baremetal)
endif()
if(UNIX)
  add_executable(benchmark tools/benchmark.c)
  target_link_libraries(benchmark PRIVATE rtm)
endif()
