From dd9105468717cf7daf3f1f2df65d0edb81668d25 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 25 Mar 2021 20:04:33 +0100 Subject: [PATCH] added cmake support --- CMakeLists.txt | 137 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..97c0fc769 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,137 @@ +cmake_minimum_required(VERSION 3.13) + +#################################################################################################### +# User configurable options +#################################################################################################### + +option(FREERTOS_CREATE_GCC_SECTIONS + "Generate sections for functions and data. Required to remove unused code" ON +) +if(FREERTOS_CREATE_GCC_SECTIONS) + option(FREERTOS_REMOVE_UNUSED_CODE "Remove unused code." ON) +endif() + +#################################################################################################### +# Pre project configuration +#################################################################################################### +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + if(NOT FREERTOS_WARNING_FLAGS) + set(FREERTOS_WARNING_FLAGS + -Wall + -Wextra + -Wimplicit-fallthrough=1 + -Wno-unused-parameter + -Wshadow=local + ) + endif() +endif() + +set(LIB_FREERTOS_NAME freertos) +add_library(${LIB_FREERTOS_NAME}) + +#################################################################################################### +# Source file handling +#################################################################################################### + +# Convert supplied additional sources to absolute path version. The user should set +# a list of sources like the port source and the selected memory management source file. +foreach(FREERTOS_ADDITIONAL_SRC ${FREERTOS_ADDITIONAL_SOURCES}) + if(IS_ABSOLUTE ${FREERTOS_ADDITIONAL_SRC}) + set(CURRENT_ADDITIONAL_SRC ${FREERTOS_ADDITIONAL_SRC}) + else() + get_filename_component(CURRENT_ADDITIONAL_SRC + ${FREERTOS_ADDITIONAL_SRC} REALPATH BASE_DIR ${CMAKE_SOURCE_DIR} + ) + endif() + + if(CMAKE_VERBOSE) + message(STATUS "FreeRTOS port source: ${FREERTOS_ADDITIONAL_SRC}") + endif() + list(APPEND FREERTOS_ADDITIONAL_SOURCES_ABS ${CURRENT_ADDITIONAL_SRC}) +endforeach() + +target_sources(${LIB_FREERTOS_NAME} PRIVATE + croutine.c + event_groups.c + list.c + queue.c + stream_buffer.c + tasks.c + timers.c +) + +if(NOT FREERTOS_ADDITIONAL_SOURCES) + message(WARNING + "FREERTOS_ADDITIONAL_SOURCES list of FreeRTOS includes was not " + "supplied, build might fail!" + ) +endif() + +#################################################################################################### +# Include handling +#################################################################################################### + +# Convert supplied FreeRTOS includes paths to absolute paths. The user should set +# the path containing files like FreeRTOSConfig.h +foreach(FREERTOS_ADDITIONAL_INC ${FREERTOS_ADDITIONAL_INCLUDE_PATHS}) + if(IS_ABSOLUTE ${FREERTOS_ADDITIONAL_INC}) + set(CURR_ADDITIONAL_INC_ABS "${FREERTOS_ADDITIONAL_INC}") + else() + get_filename_component(CURR_ADDITIONAL_INC_ABS + ${FREERTOS_ADDITIONAL_INC} REALPATH BASE_DIR ${CMAKE_SOURCE_DIR}) + endif() + + if(CMAKE_VERBOSE) + message(STATUS "FreeRTOS configuration path: ${CURR_ABS_FREERTOS_PATH}") + endif() + + list(APPEND FREERTOS_ADDITIONAL_INC_PATHS_ABS ${CURR_ADDITIONAL_INC_ABS}) +endforeach() + +# Also considers the case where the user packages the header files into a freertos folder again +target_include_directories(${LIB_FREERTOS_NAME} INTERFACE + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/include/freertos + ${FREERTOS_ADDITIONAL_INC_PATHS_ABS} +) + +target_include_directories(${LIB_FREERTOS_NAME} PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/include/freertos + ${FREERTOS_ADDITIONAL_INC_PATHS_ABS} +) + +#################################################################################################### +# Library handling +#################################################################################################### + +if(FREERTOS_ADDITIONAL_LIBS) + target_link_libraries(${LIB_FREERTOS_NAME} PRIVATE + ${FREERTOS_ADDITIONAL_LIBS} + ) +endif() + +#################################################################################################### +# Flags and defines +#################################################################################################### + +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + if(FREERTOS_CREATE_GCC_SECTIONS) + target_compile_options(${LIB_FREERTOS_NAME} PRIVATE + ${FREERTOS_WARNING_FLAGS} + ) + + # Create sections for a GCC compiler + target_compile_options(${LIB_FREERTOS_NAME} PRIVATE + "-ffunction-sections" + "-fdata-sections" + ) + + if(FREERTOS_REMOVE_UNUSED_CODE) + target_link_options(${LIB_FREERTOS_NAME} PRIVATE + "-Wl,--gc-sections" + ) + endif() + endif() +endif() +