cmake_minimum_required(VERSION 3.13) # Задаёт минимальную версию, совместимую с соседними C-библиотеками templates. project(global_time C) # Создаёт независимую цель для программных глобальных часов. add_library(global_time STATIC src/global_time.c) # Собирает переносимое ядро без обязательных MCU заголовков. target_include_directories(global_time PUBLIC include) # Экспортирует потребителю только публичный контракт часов. target_compile_features(global_time PUBLIC c_std_99) # Требует C99 для точных целочисленных типов и uint64_t меток. option(GLOBAL_TIME_BUILD_F28335 "Собирать аппаратный порт TI F28335" OFF) # Позволяет MCU проекту явно включить адаптер со своими TI include-путями. if(GLOBAL_TIME_BUILD_F28335) # Не навязывает host-приложению аппаратные регистры TI. target_sources(global_time PRIVATE ports/tms320f28335/global_time_f28335.c) # Добавляет eCAN и необязательный CPU Timer2 порт к той же библиотеке. target_include_directories(global_time PUBLIC ports/tms320f28335) # Делает аппаратные hooks доступными прошивке потребителя. endif() # Завершает условное подключение аппаратного адаптера. option(GLOBAL_TIME_BUILD_TESTS "Собирать host-проверки глобального времени" ON) # Разрешает выключить host-исполняемые файлы в MCU сборке. if(GLOBAL_TIME_BUILD_TESTS AND NOT GLOBAL_TIME_BUILD_F28335) # Не подмешивает host-модель регистров к настоящему TI порту. enable_testing() # Регистрирует проверяемые сценарии в CTest. add_executable(test_global_time tests/test_global_time.c) # Собирает календарные, CAN и монотонные сценарии. target_link_libraries(test_global_time PRIVATE global_time) # Использует то же ядро, которое подключает прошивка. add_test(NAME global_time COMMAND test_global_time) # Делает host-проверку доступной через ctest. add_executable(test_global_time_f28335 tests/test_f28335.c ports/tms320f28335/global_time_f28335.c) # Собирает настоящий аппаратный адаптер с минимальной моделью регистров. target_include_directories(test_global_time_f28335 PRIVATE tests/f28335_stubs ports/tms320f28335) # Ограничивает подмену заголовков только этой host-целью. target_link_libraries(test_global_time_f28335 PRIVATE global_time) # Связывает аппаратные hooks с реальным ядром часов. add_test(NAME global_time_f28335 COMMAND test_global_time_f28335) # Регистрирует eCAN/Timer2 проверку отдельно от календарной. endif() # Завершает host-проверки без влияния на MCU исходники.