Real-Time Embedded Network Stack
| 1 | cmake_minimum_required(VERSION 3.16) |
| 2 | |
| 3 | project(RTNS |
| 4 | VERSION 1.0.0 |
| 5 | LANGUAGES C |
| 6 | ) |
| 7 | |
| 8 | set(CMAKE_C_STANDARD 11) |
| 9 | set(CMAKE_C_STANDARD_REQUIRED ON) |
| 10 | set(CMAKE_C_EXTENSIONS OFF) |
| 11 | |
| 12 | option(RTNS_USE_PLATFORM_STUBS "Use host stub implementations for platform hooks" OFF) |
| 13 | set(RTNS_PLATFORM "NONE" CACHE STRING "Platform implementation: NONE, FREERTOS, BAREMETAL") |
| 14 | option(RTNS_ENABLE_ASAN "Enable AddressSanitizer for debug builds" OFF) |
| 15 | |
| 16 | if(RTNS_ENABLE_ASAN) |
| 17 | add_compile_options(-fsanitize=address -fno-omit-frame-pointer) |
| 18 | add_link_options(-fsanitize=address -fno-omit-frame-pointer) |
| 19 | endif() |
| 20 | |
| 21 | # Sources |
| 22 | set(RTNS_SOURCES |
| 23 | ${CMAKE_CURRENT_SOURCE_DIR}/src/rtnet_ipv6.c |
| 24 | ) |
| 25 | |
| 26 | set(RTNS_STUB_SOURCES |
| 27 | ${CMAKE_CURRENT_SOURCE_DIR}/stubs/rtnet_platform_stubs.c |
| 28 | ${CMAKE_CURRENT_SOURCE_DIR}/stubs/rtnet_host_api_stubs.c |
| 29 | ) |
| 30 | |
| 31 | set(RTNS_PLATFORM_SOURCES "") |
| 32 | if(RTNS_PLATFORM STREQUAL "FREERTOS") |
| 33 | list(APPEND RTNS_PLATFORM_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/platforms/rtnet_platform_freertos.c) |
| 34 | elseif(RTNS_PLATFORM STREQUAL "BAREMETAL") |
| 35 | list(APPEND RTNS_PLATFORM_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/platforms/rtnet_platform_baremetal.c) |
| 36 | endif() |
| 37 | |
| 38 | if(RTNS_USE_PLATFORM_STUBS) |
| 39 | list(APPEND RTNS_SOURCES ${RTNS_STUB_SOURCES}) |
| 40 | elseif(NOT RTNS_PLATFORM STREQUAL "NONE") |
| 41 | list(APPEND RTNS_SOURCES ${RTNS_PLATFORM_SOURCES}) |
| 42 | endif() |
| 43 | |
| 44 | add_library(rtns STATIC ${RTNS_SOURCES}) |
| 45 | target_include_directories(rtns PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src) |
| 46 | |
| 47 | # Examples (desktop/host) |
| 48 | option(RTNS_BUILD_EXAMPLES "Build desktop examples" ON) |
| 49 | |
| 50 | # Warnings |
| 51 | if(MSVC) |
| 52 | target_compile_options(rtns PRIVATE /W4) |
| 53 | else() |
| 54 | target_compile_options(rtns PRIVATE -Wall -Wextra -Wpedantic) |
| 55 | endif() |
| 56 | |
| 57 | # Test executable (uses the library and optionally platform stubs) |
| 58 | if(RTNS_USE_PLATFORM_STUBS) |
| 59 | set(TEST_SOURCES |
| 60 | ${CMAKE_CURRENT_SOURCE_DIR}/src/rtnet_test_suite.c |
| 61 | ${RTNS_STUB_SOURCES} |
| 62 | ) |
| 63 | |
| 64 | add_executable(rtns_tests ${TEST_SOURCES}) |
| 65 | target_link_libraries(rtns_tests PRIVATE rtns) |
| 66 | target_include_directories(rtns_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src) |
| 67 | |
| 68 | if(MSVC) |
| 69 | target_compile_options(rtns_tests PRIVATE /W4) |
| 70 | else() |
| 71 | target_compile_options(rtns_tests PRIVATE -Wall -Wextra -Wpedantic) |
| 72 | endif() |
| 73 | else() |
| 74 | message(STATUS "RTNS_USE_PLATFORM_STUBS=OFF: skipping host test target") |
| 75 | endif() |
| 76 | |
| 77 | if(RTNS_BUILD_EXAMPLES AND RTNS_USE_PLATFORM_STUBS) |
| 78 | add_executable(rtns_desktop_demo |
| 79 | ${CMAKE_CURRENT_SOURCE_DIR}/examples/desktop_demo/main.c |
| 80 | ${RTNS_STUB_SOURCES} |
| 81 | ) |
| 82 | target_link_libraries(rtns_desktop_demo PRIVATE rtns) |
| 83 | target_include_directories(rtns_desktop_demo PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src) |
| 84 | |
| 85 | if(MSVC) |
| 86 | target_compile_options(rtns_desktop_demo PRIVATE /W4) |
| 87 | else() |
| 88 | target_compile_options(rtns_desktop_demo PRIVATE -Wall -Wextra -Wpedantic) |
| 89 | endif() |
| 90 | elseif(RTNS_BUILD_EXAMPLES AND NOT RTNS_USE_PLATFORM_STUBS) |
| 91 | message(STATUS "RTNS_USE_PLATFORM_STUBS=OFF: skipping desktop_demo example") |
| 92 | endif() |
| 93 |