Description
Problem:
The method of using FREERTOS_CONFIG_FILE_DIRECTORY
limits the integration and what is included in the FreeRTOSConfig.h
file.
With this method a user of FreeRTOS-Kernel cannot include or link other libraries into the FreeRTOSConfig.h
file:
One example would be to include a local file for the project:
// FreeRTOSConfig.h file
#include "project_settings.h" # This is in a different directory.
Solution:
Suggest using an assumed name for a target eg : FreeRTOS::config
that is included in all of the freertos_* libs etc.
An example integration with the project would be - where all of the FreeRTOS based config files would reside: project_config
The project_config
target would provide location to where where FreeRTOSConfig.h and all other FreeRTOS submodule config files reside.
# Toplevel or Project CMakeLists.txt
add_library(project_config INTERFACE)
target_include_directories( project_config
INTERFACE
include
)
And the only thing you would need to have defined in your project is something like:
# Add this line to the target that publicizes the FreeRTOS configuration files.
add_library(FreeRTOS::config ALIAS project_config)
And in all of the libraries that are in the CMakeLists.txt - these would have eg: here for freertos_kernel
target_link_libraries(freertos_kernel
PUBLIC
FreeRTOS::config
freertos_kernel_port
)
And remove the use of FREERTOS_CONFIG_FILE_DIRECTORY
in the target_include_directories
Alternatives:
Alternative solution:
I currently copy the CMakeLists.txt into a separate directory under my project directory, modify them with the above changes and then use
config_file(<local cmake file> <Dir with FreeRTOS code and CMakeLists.txt> COPYONLY)
To overwrite the existing CMakeLists.txt inside the FreeRTOS directory, but this is only to workaround the limitation of defining a FreeRTOS::config target.
How many devices will this feature impact?
N/A - used for compile.
What are your project timelines?
N/A - using Alternative workaround for now.
Additional context
None.
Would also suggest doing this for the portable freertos_kernel_port
target as well.
Per portable/* directory have a CMakeLists.txt
file and partition the monolithic portable/CMakeLists.txt into their own directories - so they are unique to each of those. This would also simplify the portable.
An example CMakeLists.txt
file for the portable directories:
# portable/GCC/ARM_CA9/CMakeLists.txt
add_library(freertos_kernel_port_GCC_ARM_CA9 STATIC EXCLUDE_FROM_ALL)
target_sources(freertos_kernel_port_GCC_ARM_CA9
PRIVATE
port.c
portASM.S
portmacro.h
)
target_include_directories(freertos_kernel_port_GCC_ARM_CA9
PUBLIC
.
)
target_link_libraries(freertos_kernel_port_GCC_ARM_CA9
PRIVATE
freertos_kernel
)
And then in the portable/CMakeLists.txt
This just includes all of the port directories - they won't compile unless they are used due to the EXCLUDE_FROM_ALL
option.
If you still want tosupport FREERTOS_PORT
- then you can have a single large case
statement
if(NOT TARGET freertos_kernel_port)
add_library(freertos_kernel_port ALIAS
$<$<STREQUAL:${FREERTOS_PORT},BCC_16BIT_DOS_FLSH186>:freertos_kernel_port_BCC_16BIT_DOS_FLSH186>
#...
$<$<STREQUAL:${FREERTOS_PORT},GCC_ARM_CA9>:freertos_kernel_port_GCC_ARM_CA9>
#...
$<$<STREQUAL:${FREERTOS_PORT},WIZC_PIC18>:freertos_kernel_port_WIZC_PIC18>
)
else()
message(STATUS "freertos_kernel_port already defined - using that.")
endif()
For the FreeRTOS-Kernel/CMakeLists.txt check for FREERTOS_PORT this changes to:
if(NOT TARGET freertos_kernel_port)
message(FATAL_ERROR " `freertos_kernel_port library alias is not defined. Please specify it from top-level CMake file (example):\n"
" add_library(freertos_kernel_port ALIAS freertos_kernel_port_GCC_ARM_CM4F)\n"
" or from CMake command line option:\n"
" -DFREERTOS_PORT=GCC_ARM_CM4F\n"
" \n"
" Available port options:\n"
#...)
endif()