FindFreeRTOS.cmake 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. if(NOT FreeRTOS_FIND_COMPONENTS)
  2. set(FreeRTOS_FIND_COMPONENTS
  3. ARM_CM0 ARM_CM3 ARM_CM4F ARM_CM7
  4. )
  5. endif()
  6. list(REMOVE_DUPLICATES FreeRTOS_FIND_COMPONENTS)
  7. set(FreeRTOS_HEAPS 1 2 3 4 5)
  8. if(NOT FREERTOS_PATH)
  9. set(FREERTOS_PATH $ENV{FREERTOS_PATH} CACHE PATH "Path to FreeRTOS")
  10. endif()
  11. if(NOT FREERTOS_PATH)
  12. set(FREERTOS_PATH /opt/FreeRTOS CACHE PATH "Path to FreeRTOS")
  13. message(STATUS "No FREERTOS_PATH specified using default: ${FREERTOS_PATH}")
  14. endif()
  15. find_path(FreeRTOS_COMMON_INCLUDE
  16. NAMES FreeRTOS.h
  17. PATHS "${FREERTOS_PATH}" "${FREERTOS_PATH}/FreeRTOS"
  18. PATH_SUFFIXES "Source/include" "include"
  19. NO_DEFAULT_PATH
  20. )
  21. if(NOT FreeRTOS_COMMON_INCLUDE)
  22. message(WARNING "FreeRTOS common include path not found, build might fail")
  23. endif()
  24. list(APPEND FreeRTOS_INCLUDE_DIRS "${FreeRTOS_COMMON_INCLUDE}")
  25. find_path(FreeRTOS_SOURCE_DIR
  26. NAMES tasks.c
  27. PATHS "${FREERTOS_PATH}" "${FREERTOS_PATH}/FreeRTOS"
  28. PATH_SUFFIXES "Source"
  29. NO_DEFAULT_PATH
  30. )
  31. if(NOT (TARGET FreeRTOS))
  32. add_library(FreeRTOS INTERFACE IMPORTED)
  33. target_sources(FreeRTOS INTERFACE
  34. "${FreeRTOS_SOURCE_DIR}/tasks.c"
  35. "${FreeRTOS_SOURCE_DIR}/list.c"
  36. "${FreeRTOS_SOURCE_DIR}/queue.c"
  37. )
  38. target_include_directories(FreeRTOS INTERFACE "${FreeRTOS_COMMON_INCLUDE}")
  39. endif()
  40. if(NOT (TARGET FreeRTOS::Coroutine))
  41. add_library(FreeRTOS::Coroutine INTERFACE IMPORTED)
  42. target_sources(FreeRTOS::Coroutine INTERFACE "${FreeRTOS_SOURCE_DIR}/croutine.c")
  43. target_link_libraries(FreeRTOS::Coroutine INTERFACE FreeRTOS)
  44. endif()
  45. if(NOT (TARGET FreeRTOS::EventGroups))
  46. add_library(FreeRTOS::EventGroups INTERFACE IMPORTED)
  47. target_sources(FreeRTOS::EventGroups INTERFACE "${FreeRTOS_SOURCE_DIR}/event_groups.c")
  48. target_link_libraries(FreeRTOS::EventGroups INTERFACE FreeRTOS)
  49. endif()
  50. if(NOT (TARGET FreeRTOS::StreamBuffer))
  51. add_library(FreeRTOS::StreamBuffer INTERFACE IMPORTED)
  52. target_sources(FreeRTOS::StreamBuffer INTERFACE "${FreeRTOS_SOURCE_DIR}/stream_buffer.c")
  53. target_link_libraries(FreeRTOS::StreamBuffer INTERFACE FreeRTOS)
  54. endif()
  55. if(NOT (TARGET FreeRTOS::Timers))
  56. add_library(FreeRTOS::Timers INTERFACE IMPORTED)
  57. target_sources(FreeRTOS::Timers INTERFACE "${FreeRTOS_SOURCE_DIR}/timers.c")
  58. target_link_libraries(FreeRTOS::Timers INTERFACE FreeRTOS)
  59. endif()
  60. foreach(HEAP ${FreeRTOS_HEAPS})
  61. if(NOT (TARGET FreeRTOS::Heap::${HEAP}))
  62. add_library(FreeRTOS::Heap::${HEAP} INTERFACE IMPORTED)
  63. target_sources(FreeRTOS::Heap::${HEAP} INTERFACE "${FreeRTOS_SOURCE_DIR}/portable/MemMang/heap_${HEAP}.c")
  64. target_link_libraries(FreeRTOS::Heap::${HEAP} INTERFACE FreeRTOS)
  65. endif()
  66. endforeach()
  67. foreach(PORT ${FreeRTOS_FIND_COMPONENTS})
  68. find_path(FreeRTOS_${PORT}_PATH
  69. NAMES portmacro.h
  70. PATHS "${FREERTOS_PATH}" "${FREERTOS_PATH}/FreeRTOS"
  71. PATH_SUFFIXES
  72. "portable/GCC/${PORT}/r0p1"
  73. "portable/GCC/${PORT}"
  74. "Source/portable/GCC/${PORT}"
  75. "Source/portable/GCC/${PORT}/r0p1"
  76. NO_DEFAULT_PATH
  77. )
  78. if(NOT FreeRTOS_${PORT}_PATH)
  79. message(WARNING "FreeRTOS port path not found, build might fail")
  80. endif()
  81. list(APPEND FreeRTOS_INCLUDE_DIRS "${FreeRTOS_${PORT}_PATH}")
  82. find_file(FreeRTOS_${PORT}_SOURCE
  83. NAMES port.c
  84. PATHS "${FreeRTOS_${PORT}_PATH}"
  85. NO_DEFAULT_PATH
  86. )
  87. if(NOT (TARGET FreeRTOS::${PORT}))
  88. add_library(FreeRTOS::${PORT} INTERFACE IMPORTED)
  89. target_link_libraries(FreeRTOS::${PORT} INTERFACE FreeRTOS)
  90. target_sources(FreeRTOS::${PORT} INTERFACE "${FreeRTOS_${PORT}_SOURCE}")
  91. target_include_directories(FreeRTOS::${PORT} INTERFACE "${FreeRTOS_${PORT}_PATH}")
  92. endif()
  93. if(FreeRTOS_${PORT}_PATH AND
  94. FreeRTOS_${PORT}_SOURCE AND
  95. FreeRTOS_COMMON_INCLUDE AND
  96. FreeRTOS_SOURCE_DIR)
  97. set(FreeRTOS_${PORT}_FOUND TRUE)
  98. else()
  99. set(FreeRTOS_${PORT}_FOUND FALSE)
  100. endif()
  101. endforeach()
  102. include(FindPackageHandleStandardArgs)
  103. find_package_handle_standard_args(FreeRTOS
  104. REQUIRED_VARS FreeRTOS_INCLUDE_DIRS
  105. FOUND_VAR FreeRTOS_FOUND
  106. HANDLE_COMPONENTS
  107. )