1cmake_minimum_required(VERSION 3.15)
2
3# User is responsible to one mandatory option:
4#   FREERTOS_PORT, if not specified and native port detected, uses the native compile.
5#
6# User is responsible for one library target:
7#   freertos_config ,typically an INTERFACE library
8#
9# DEPRECATED: FREERTOS_CONFIG_FILE_DIRECTORY - but still supported if no freertos_config defined for now.
10#             May be removed at some point in the future.
11#
12# User can choose which heap implementation to use (either the implementations
13# included with FreeRTOS [1..5] or a custom implementation) by providing the
14# option FREERTOS_HEAP. When dynamic allocation is used, the user must specify a
15# heap implementation. If the option is not set, the cmake will use no heap
16# implementation (e.g. when only static allocation is used).
17
18# `freertos_config` target defines the path to FreeRTOSConfig.h and optionally other freertos based config files
19if(NOT TARGET freertos_config )
20    if (NOT DEFINED FREERTOS_CONFIG_FILE_DIRECTORY )
21
22        message(FATAL_ERROR " freertos_config target not specified.  Please specify a cmake target that defines the include directory for FreeRTOSConfig.h:\n"
23            "  add_library(freertos_config INTERFACE)\n"
24            "  target_include_directories(freertos_config SYSTEM\n"
25            "    INTERFACE\n"
26            "      include) # The config file directory\n"
27            "  target_compile_definitions(freertos_config\n"
28            "    PUBLIC\n"
29            "    projCOVERAGE_TEST=0)\n")
30    else()
31        message(WARNING " Using deprecated 'FREERTOS_CONFIG_FILE_DIRECTORY' - please update your project CMakeLists.txt file:\n"
32            "  add_library(freertos_config INTERFACE)\n"
33            "  target_include_directories(freertos_config SYSTEM\n"
34            "    INTERFACE\n"
35            "      include) # The config file directory\n"
36            "  target_compile_definitions(freertos_config\n"
37            "    PUBLIC\n"
38            "    projCOVERAGE_TEST=0)\n")
39    endif()
40endif()
41
42# FreeRTOS port option
43if(NOT FREERTOS_PORT)
44    message(WARNING " FREERTOS_PORT is not set. Please specify it from top-level CMake file (example):\n"
45        "  set(FREERTOS_PORT GCC_ARM_CM4F CACHE STRING \"\")\n"
46        " or from CMake command line option:\n"
47        "  -DFREERTOS_PORT=GCC_ARM_CM4F\n"
48        " \n"
49        " Available port options:\n"
50        " A_CUSTOM_PORT                    - Compiler: User Defined  Target: User Defined\n"
51        " BCC_16BIT_DOS_FLSH186            - Compiler: BCC           Target: 16 bit DOS Flsh186\n"
52        " BCC_16BIT_DOS_PC                 - Compiler: BCC           Target: 16 bit DOS PC\n"
53        " CCS_ARM_CM3                      - Compiler: CCS           Target: ARM Cortex-M3\n"
54        " CCS_ARM_CM4F                     - Compiler: CCS           Target: ARM Cortex-M4 with FPU\n"
55        " CCS_ARM_CR4                      - Compiler: CCS           Target: ARM Cortex-R4\n"
56        " CCS_MSP430X                      - Compiler: CCS           Target: MSP430X\n"
57        " CODEWARRIOR_COLDFIRE_V1          - Compiler: CoreWarrior   Target: ColdFire V1\n"
58        " CODEWARRIOR_COLDFIRE_V2          - Compiler: CoreWarrior   Target: ColdFire V2\n"
59        " CODEWARRIOR_HCS12                - Compiler: CoreWarrior   Target: HCS12\n"
60        " GCC_ARM_CA9                      - Compiler: GCC           Target: ARM Cortex-A9\n"
61        " GCC_ARM_AARCH64                  - Compiler: GCC           Target: ARM v8-A\n"
62        " GCC_ARM_AARCH64_SRE              - Compiler: GCC           Target: ARM v8-A SRE\n"
63        " GCC_ARM_CM0                      - Compiler: GCC           Target: ARM Cortex-M0\n"
64        " GCC_ARM_CM3                      - Compiler: GCC           Target: ARM Cortex-M3\n"
65        " GCC_ARM_CM3_MPU                  - Compiler: GCC           Target: ARM Cortex-M3 with MPU\n"
66        " GCC_ARM_CM4_MPU                  - Compiler: GCC           Target: ARM Cortex-M4 with MPU\n"
67        " GCC_ARM_CM4F                     - Compiler: GCC           Target: ARM Cortex-M4 with FPU\n"
68        " GCC_ARM_CM7                      - Compiler: GCC           Target: ARM Cortex-M7\n"
69        " GCC_ARM_CM23_NONSECURE           - Compiler: GCC           Target: ARM Cortex-M23 non-secure\n"
70        " GCC_ARM_CM23_SECURE              - Compiler: GCC           Target: ARM Cortex-M23 secure\n"
71        " GCC_ARM_CM23_NTZ_NONSECURE       - Compiler: GCC           Target: ARM Cortex-M23 non-trustzone non-secure\n"
72        " GCC_ARM_CM33_NONSECURE           - Compiler: GCC           Target: ARM Cortex-M33 non-secure\n"
73        " GCC_ARM_CM33_SECURE              - Compiler: GCC           Target: ARM Cortex-M33 secure\n"
74        " GCC_ARM_CM33_NTZ_NONSECURE       - Compiler: GCC           Target: ARM Cortex-M33 non-trustzone non-secure\n"
75        " GCC_ARM_CM33_TFM                 - Compiler: GCC           Target: ARM Cortex-M33 non-secure for TF-M\n"
76        " GCC_ARM_CM35P_NONSECURE          - Compiler: GCC           Target: ARM Cortex-M35P non-secure\n"
77        " GCC_ARM_CM35P_SECURE             - Compiler: GCC           Target: ARM Cortex-M35P secure\n"
78        " GCC_ARM_CM35P_NTZ_NONSECURE      - Compiler: GCC           Target: ARM Cortex-M35P non-trustzone non-secure\n"
79        " GCC_ARM_CM55_NONSECURE           - Compiler: GCC           Target: ARM Cortex-M55 non-secure\n"
80        " GCC_ARM_CM55_SECURE              - Compiler: GCC           Target: ARM Cortex-M55 secure\n"
81        " GCC_ARM_CM55_NTZ_NONSECURE       - Compiler: GCC           Target: ARM Cortex-M55 non-trustzone non-secure\n"
82        " GCC_ARM_CM55_TFM                 - Compiler: GCC           Target: ARM Cortex-M55 non-secure for TF-M\n"
83        " GCC_ARM_CM85_NONSECURE           - Compiler: GCC           Target: ARM Cortex-M85 non-secure\n"
84        " GCC_ARM_CM85_SECURE              - Compiler: GCC           Target: ARM Cortex-M85 secure\n"
85        " GCC_ARM_CM85_NTZ_NONSECURE       - Compiler: GCC           Target: ARM Cortex-M85 non-trustzone non-secure\n"
86        " GCC_ARM_CM85_TFM                 - Compiler: GCC           Target: ARM Cortex-M85 non-secure for TF-M\n"
87        " GCC_ARM_CR5                      - Compiler: GCC           Target: ARM Cortex-R5\n"
88        " GCC_ARM_CRX_MPU                  - Compiler: GCC           Target: ARM Cortex-Rx with MPU\n"
89        " GCC_ARM_CRX_NOGIC                - Compiler: GCC           Target: ARM Cortex-Rx no GIC\n"
90        " GCC_ARM7_AT91FR40008             - Compiler: GCC           Target: ARM7 Atmel AT91R40008\n"
91        " GCC_ARM7_AT91SAM7S               - Compiler: GCC           Target: ARM7 Atmel AT91SAM7S\n"
92        " GCC_ARM7_LPC2000                 - Compiler: GCC           Target: ARM7 LPC2000\n"
93        " GCC_ARM7_LPC23XX                 - Compiler: GCC           Target: ARM7 LPC23xx\n"
94        " GCC_ATMEGA323                    - Compiler: GCC           Target: ATMega323\n"
95        " GCC_AVR32_UC3                    - Compiler: GCC           Target: AVR32 UC3\n"
96        " GCC_COLDFIRE_V2                  - Compiler: GCC           Target: ColdFire V2\n"
97        " GCC_CORTUS_APS3                  - Compiler: GCC           Target: CORTUS APS3\n"
98        " GCC_H8S2329                      - Compiler: GCC           Target: H8S2329\n"
99        " GCC_HCS12                        - Compiler: GCC           Target: HCS12\n"
100        " GCC_IA32_FLAT                    - Compiler: GCC           Target: IA32 flat\n"
101        " GCC_MICROBLAZE                   - Compiler: GCC           Target: MicroBlaze\n"
102        " GCC_MICROBLAZE_V8                - Compiler: GCC           Target: MicroBlaze V8\n"
103        " GCC_MICROBLAZE_V9                - Compiler: GCC           Target: MicroBlaze V9\n"
104        " GCC_MSP430F449                   - Compiler: GCC           Target: MSP430F449\n"
105        " GCC_NIOSII                       - Compiler: GCC           Target: NiosII\n"
106        " GCC_PPC405_XILINX                - Compiler: GCC           Target: Xilinx PPC405\n"
107        " GCC_PPC440_XILINX                - Compiler: GCC           Target: Xilinx PPC440\n"
108        " GCC_RISC_V                       - Compiler: GCC           Target: RISC-V\n"
109        " GCC_RISC_V_PULPINO_VEGA_RV32M1RM - Compiler: GCC           Target: RISC-V Pulpino Vega RV32M1RM\n"
110        " GCC_RISC_V_GENERIC               - Compiler: GCC           Target: RISC-V with FREERTOS_RISCV_EXTENSION\n"
111        " GCC_RL78                         - Compiler: GCC           Target: Renesas RL78\n"
112        " GCC_RX100                        - Compiler: GCC           Target: Renesas RX100\n"
113        " GCC_RX200                        - Compiler: GCC           Target: Renesas RX200\n"
114        " GCC_RX600                        - Compiler: GCC           Target: Renesas RX600\n"
115        " GCC_RX600_V2                     - Compiler: GCC           Target: Renesas RX600 v2\n"
116        " GCC_RX700_V3_DPFPU               - Compiler: GCC           Target: Renesas RX700 v3 with DPFPU\n"
117        " GCC_STR75X                       - Compiler: GCC           Target: STR75x\n"
118        " GCC_TRICORE_1782                 - Compiler: GCC           Target: TriCore 1782\n"
119        " GCC_ARC_EM_HS                    - Compiler: GCC           Target: DesignWare ARC EM HS\n"
120        " GCC_ARC_V1                       - Compiler: GCC           Target: DesignWare ARC v1\n"
121        " GCC_ATMEGA                       - Compiler: GCC           Target: ATmega\n"
122        " GCC_POSIX                        - Compiler: GCC           Target: Posix\n"
123        " GCC_RP2040                       - Compiler: GCC           Target: RP2040 ARM Cortex-M0+\n"
124        " GCC_XTENSA_ESP32                 - Compiler: GCC           Target: Xtensa ESP32\n"
125        " GCC_AVRDX                        - Compiler: GCC           Target: AVRDx\n"
126        " GCC_AVR_MEGA0                    - Compiler: GCC           Target: AVR Mega0\n"
127        " IAR_78K0K                        - Compiler: IAR           Target: Renesas 78K0K\n"
128        " IAR_ARM_CA5_NOGIC                - Compiler: IAR           Target: ARM Cortex-A5 no GIC\n"
129        " IAR_ARM_CA9                      - Compiler: IAR           Target: ARM Cortex-A9\n"
130        " IAR_ARM_CM0                      - Compiler: IAR           Target: ARM Cortex-M0\n"
131        " IAR_ARM_CM3                      - Compiler: IAR           Target: ARM Cortex-M3\n"
132        " IAR_ARM_CM4F                     - Compiler: IAR           Target: ARM Cortex-M4 with FPU\n"
133        " IAR_ARM_CM4F_MPU                 - Compiler: IAR           Target: ARM Cortex-M4 with FPU and MPU\n"
134        " IAR_ARM_CM7                      - Compiler: IAR           Target: ARM Cortex-M7\n"
135        " IAR_ARM_CM23_NONSECURE           - Compiler: IAR           Target: ARM Cortex-M23 non-secure\n"
136        " IAR_ARM_CM23_SECURE              - Compiler: IAR           Target: ARM Cortex-M23 secure\n"
137        " IAR_ARM_CM23_NTZ_NONSECURE       - Compiler: IAR           Target: ARM Cortex-M23 non-trustzone non-secure\n"
138        " IAR_ARM_CM33_NONSECURE           - Compiler: IAR           Target: ARM Cortex-M33 non-secure\n"
139        " IAR_ARM_CM33_SECURE              - Compiler: IAR           Target: ARM Cortex-M33 secure\n"
140        " IAR_ARM_CM33_NTZ_NONSECURE       - Compiler: IAR           Target: ARM Cortex-M33 non-trustzone non-secure\n"
141        " IAR_ARM_CM35P_NONSECURE          - Compiler: IAR           Target: ARM Cortex-M35P non-secure\n"
142        " IAR_ARM_CM35P_SECURE             - Compiler: IAR           Target: ARM Cortex-M35P secure\n"
143        " IAR_ARM_CM35P_NTZ_NONSECURE      - Compiler: IAR           Target: ARM Cortex-M35P non-trustzone non-secure\n"
144        " IAR_ARM_CM55_NONSECURE           - Compiler: IAR           Target: ARM Cortex-M55 non-secure\n"
145        " IAR_ARM_CM55_SECURE              - Compiler: IAR           Target: ARM Cortex-M55 secure\n"
146        " IAR_ARM_CM55_NTZ_NONSECURE       - Compiler: IAR           Target: ARM Cortex-M55 non-trustzone non-secure\n"
147        " IAR_ARM_CM85_NONSECURE           - Compiler: IAR           Target: ARM Cortex-M85 non-secure\n"
148        " IAR_ARM_CM85_SECURE              - Compiler: IAR           Target: ARM Cortex-M85 secure\n"
149        " IAR_ARM_CM85_NTZ_NONSECURE       - Compiler: IAR           Target: ARM Cortex-M85 non-trustzone non-secure\n"
150        " IAR_ARM_CRX_NOGIC                - Compiler: IAR           Target: ARM Cortex-Rx no GIC\n"
151        " IAR_ATMEGA323                    - Compiler: IAR           Target: ATMega323\n"
152        " IAR_ATMEL_SAM7S64                - Compiler: IAR           Target: Atmel SAM7S64\n"
153        " IAR_ATMEL_SAM9XE                 - Compiler: IAR           Target: Atmel SAM9XE\n"
154        " IAR_AVR_AVRDX                    - Compiler: IAR           Target: AVRDx\n"
155        " IAR_AVR_MEGA0                    - Compiler: IAR           Target: AVR Mega0\n"
156        " IAR_AVR32_UC3                    - Compiler: IAR           Target: AVR32 UC3\n"
157        " IAR_LPC2000                      - Compiler: IAR           Target: LPC2000\n"
158        " IAR_MSP430                       - Compiler: IAR           Target: MSP430\n"
159        " IAR_MSP430X                      - Compiler: IAR           Target: MSP430X\n"
160        " IAR_RISC_V                       - Compiler: IAR           Target: RISC-V\n"
161        " IAR_RISC_V_GENERIC               - Compiler: IAR           Target: RISC-V with FREERTOS_RISCV_EXTENSION\n"
162        " IAR_RL78                         - Compiler: IAR           Target: Renesas RL78\n"
163        " IAR_RX100                        - Compiler: IAR           Target: Renesas RX100\n"
164        " IAR_RX600                        - Compiler: IAR           Target: Renesas RX600\n"
165        " IAR_RX700_V3_DPFPU               - Compiler: IAR           Target: Renesas RX700 v3 with DPFPU\n"
166        " IAR_RX_V2                        - Compiler: IAR           Target: Renesas RX v2\n"
167        " IAR_STR71X                       - Compiler: IAR           Target: STR71x\n"
168        " IAR_STR75X                       - Compiler: IAR           Target: STR75x\n"
169        " IAR_STR91X                       - Compiler: IAR           Target: STR91x\n"
170        " IAR_V850ES_FX3                   - Compiler: IAR           Target: Renesas V850ES/Fx3\n"
171        " IAR_V850ES_HX3                   - Compiler: IAR           Target: Renesas V850ES/Hx3\n"
172        " MIKROC_ARM_CM4F                  - Compiler: MikroC        Target: ARM Cortex-M4 with FPU\n"
173        " MPLAB_PIC18F                     - Compiler: MPLAB         Target: PIC18F\n"
174        " MPLAB_PIC24                      - Compiler: MPLAB         Target: PIC24\n"
175        " MPLAB_PIC32MEC14XX               - Compiler: MPLAB         Target: PIC32MEC14xx\n"
176        " MPLAB_PIC32MX                    - Compiler: MPLAB         Target: PIC32MX\n"
177        " MPLAB_PIC32MZ                    - Compiler: MPLAB         Target: PIC32MZ\n"
178        " MSVC_MINGW                       - Compiler: MSVC or MinGW Target: x86\n"
179        " OWATCOM_16BIT_DOS_FLSH186        - Compiler: Open Watcom   Target: 16 bit DOS Flsh186\n"
180        " OWATCOM_16BIT_DOS_PC             - Compiler: Open Watcom   Target: 16 bit DOS PC\n"
181        " PARADIGM_TERN_EE_LARGE           - Compiler: Paradigm      Target: Tern EE large\n"
182        " PARADIGM_TERN_EE_SMALL           - Compiler: Paradigm      Target: Tern EE small\n"
183        " RENESAS_RX100                    - Compiler: Renesas       Target: RX100\n"
184        " RENESAS_RX200                    - Compiler: Renesas       Target: RX200\n"
185        " RENESAS_RX600                    - Compiler: Renesas       Target: RX600\n"
186        " RENESAS_RX600_V2                 - Compiler: Renesas       Target: RX600 v2\n"
187        " RENESAS_RX700_V3_DPFPU           - Compiler: Renesas       Target: RX700 v3 with DPFPU\n"
188        " RENESAS_SH2A_FPU                 - Compiler: Renesas       Target: SH2A with FPU\n"
189        " ROWLEY_MSP430F449                - Compiler: Rowley        Target: MSP430F449\n"
190        " RVDS_ARM_CA9                     - Compiler: RVDS          Target: ARM Cortex-A9\n"
191        " RVDS_ARM_CM0                     - Compiler: RVDS          Target: ARM Cortex-M0\n"
192        " RVDS_ARM_CM3                     - Compiler: RVDS          Target: ARM Cortex-M3\n"
193        " RVDS_ARM_CM4_MPU                 - Compiler: RVDS          Target: ARM Cortex-M4 with MPU\n"
194        " RVDS_ARM_CM4F                    - Compiler: RVDS          Target: ARM Cortex-M4 with FPU\n"
195        " RVDS_ARM_CM7                     - Compiler: RVDS          Target: ARM Cortex-M7\n"
196        " RVDS_ARM7_LPC21XX                - Compiler: RVDS          Target: ARM7 LPC21xx\n"
197        " SDCC_CYGNAL                      - Compiler: SDCC          Target: Cygnal\n"
198        " SOFTUNE_MB91460                  - Compiler: Softune       Target: MB91460\n"
199        " SOFTUNE_MB96340                  - Compiler: Softune       Target: MB96340\n"
200        " TASKING_ARM_CM4F                 - Compiler: Tasking       Target: ARM Cortex-M4 with FPU\n"
201        " TEMPLATE                         - Compiler: HOST          Target: None\n"
202        " CDK_THEAD_CK802                  - Compiler: CDK           Target: T-head CK802\n"
203        " XCC_XTENSA                       - Compiler: XCC           Target: Xtensa\n"
204        " WIZC_PIC18                       - Compiler: WizC          Target: PIC18")
205    # Native FREERTOS_PORT for Linux and Windows MINGW builds
206    if(UNIX)
207        message(STATUS " Auto-Detected Unix, setting FREERTOS_PORT=GCC_POSIX")
208        set(FREERTOS_PORT GCC_POSIX CACHE STRING "FreeRTOS port name")
209    elseif(MINGW)
210        message(STATUS " Auto-Detected MINGW, setting FREERTOS_PORT=MSVC_MINGW")
211        set(FREERTOS_PORT MSVC_MINGW CACHE STRING "FreeRTOS port name")
212    endif()
213elseif((FREERTOS_PORT STREQUAL "A_CUSTOM_PORT") AND (NOT TARGET freertos_kernel_port) )
214    message(FATAL_ERROR " FREERTOS_PORT is set to A_CUSTOM_PORT. Please specify the custom port target with all necessary files. For example:\n"
215    " Assuming a directory of:\n"
216    "  FreeRTOSCustomPort/\n"
217    "    CMakeLists.txt\n"
218    "    port.c\n"
219    "    portmacro.h\n"
220    " Where FreeRTOSCustomPort/CMakeLists.txt is a modified version of:\n"
221    "   add_library(freertos_kernel_port OBJECT)\n"
222    "   target_sources(freertos_kernel_port\n"
223    "     PRIVATE\n"
224    "       port.c\n"
225    "       portmacro.h)\n"
226    "   add_library(freertos_kernel_port_headers INTERFACE)\n"
227    "     target_include_directories(freertos_kernel_port_headers INTERFACE \n"
228    "      .)\n"
229    "   target_link_libraries(freertos_kernel_port\n"
230    "     PRIVATE\n"
231    "       freertos_kernel_port_headers\n"
232    "       freertos_kernel_include)")
233endif()
234
235add_library(freertos_kernel STATIC)
236
237########################################################################
238add_subdirectory(include)
239add_subdirectory(portable)
240
241target_sources(freertos_kernel PRIVATE
242    croutine.c
243    event_groups.c
244    list.c
245    queue.c
246    stream_buffer.c
247    tasks.c
248    timers.c
249)
250
251if (DEFINED FREERTOS_HEAP )
252    # User specified a heap implementation add heap implementation to freertos_kernel.
253    target_sources(freertos_kernel PRIVATE
254        # If FREERTOS_HEAP is digit between 1 .. 5 - it is heap number, otherwise - it is path to custom heap source file
255        $<IF:$<BOOL:$<FILTER:${FREERTOS_HEAP},EXCLUDE,^[1-5]$>>,${FREERTOS_HEAP},portable/MemMang/heap_${FREERTOS_HEAP}.c>
256    )
257endif()
258
259
260target_link_libraries(freertos_kernel
261    PUBLIC
262        freertos_kernel_include
263        freertos_kernel_port_headers
264    PRIVATE
265        freertos_kernel_port
266
267)
268
269########################################################################
270