FindFreeRTOS.cmake 4.1 KB

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