forked from FreeRTOS/FreeRTOS-Plus-TCP
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* FreeRTOS#556 Initial Cmake Module definition.
* Fixing CI builds, rely on pcap. (FreeRTOS#556) * Updating tested configurations and minor clean-up of missing network interfaces (FreeRTOS#555) * Further clean-up based on testing with build environment. (FreeRTOS#555) * Using single definition for libraries everywhere. (FreeRTOS#555) * Fixing A_CUSTOM_NETWORK_IF compile option. * Identifying and fixing compile issues. * Adding in additional warnings for GNU to ignore for now. * Fixing formatting issues with uncrustify. * More warnings for GNU used by CI/CD pipeline. * Assuming custom for build tests and using latest freertos-kernel code. Updated readme for how to consume at project level. * Fixing up issues identified in the PR. Making the build_test EXCLUDE_FROM_ALL so only compiled if requested. * Changing to support C89 instead of C99. Renaming tcp_tools to tcp_utilities to mimic the directory. * Using C90 ISO. Fixing compiler warnings. * Fixing non C90 compliant declaration after statement * Separating out CMakeLists so each port is independent. * Updating warning list in code. * Fixed formatting with uncrustify. * Fix failing tests * Fix failing unit-test * Fix a typo. --------- Co-authored-by: Aniruddha Kanhere <[email protected]>
- Loading branch information
Showing
41 changed files
with
1,401 additions
and
141 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,236 @@ | ||
|
||
cmake_minimum_required(VERSION 3.15) | ||
cmake_policy(SET CMP0048 NEW) # project version | ||
cmake_policy(SET CMP0076 NEW) # full paths | ||
|
||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake_modules") | ||
|
||
######################################################################## | ||
# Project Details | ||
project(FreeRTOS-Plus-TCP | ||
VERSION 3.1.0 | ||
DESCRIPTION "FreeRTOS TCP/UDP Network Layer" | ||
HOMEPAGE_URL https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/index.html | ||
LANGUAGES C) | ||
|
||
# Do not allow in-source build. | ||
if( ${PROJECT_SOURCE_DIR} STREQUAL ${PROJECT_BINARY_DIR} ) | ||
message( FATAL_ERROR "In-source build is not allowed. Please build in a separate directory, such as ${PROJECT_SOURCE_DIR}/build." ) | ||
endif() | ||
|
||
# Options | ||
option(FREERTOS_PLUS_TCP_BUILD_TEST "Build the test for FreeRTOS Plus TCP" OFF) | ||
|
||
# Configuration | ||
# Override these at project level with: | ||
# Optional: set(FREERTOS_PLUS_TCP_BUFFER_ALLOCATION "1" CACHE STRING "" FORCE) | ||
# Optional: set(FREERTOS_PLUS_TCP_COMPILER "" CACHE STRING "" FORCE) | ||
# Required: set(FREERTOS_PLUS_TCP_NETWORK_IF "POSIX" CACHE STRING "" FORCE) | ||
|
||
# Select the appropriate buffer allocaiton method. | ||
# See: https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/Embedded_Ethernet_Buffer_Management.html | ||
if (NOT FREERTOS_PLUS_TCP_BUFFER_ALLOCATION) | ||
message(STATUS "Using default FREERTOS_PLUS_TCP_BUFFER_ALLOCATION = 2") | ||
set(FREERTOS_PLUS_TCP_BUFFER_ALLOCATION "2" CACHE STRING "FreeRTOS buffer allocation model number. 1 .. 2.") | ||
endif() | ||
|
||
# Select the Compiler - if left blank will detect using CMake | ||
# Note relies on CMake to detect over any setting here. | ||
# Valid options are: | ||
# FREERTOS_PLUS_TCP_COMPILER | Detected | CMake | ||
# ------------------------------------------------- | ||
# CCS | No | ?TBD? | ||
# GCC | Yes | GNU | ||
# IAR | Yes | IAR | ||
# Keil | Yes | ARMCC | ||
# MSVC | Yes | MSVC # Note only for MinGW | ||
# Renesas | No | ?TBD? | ||
# Will always a attempt to detect and if detectable double checks that the compiler is set correctly. | ||
set(FREERTOS_PLUS_TCP_COMPILER "" CACHE STRING "FreeRTOS Plus TCP Compiler Selection") | ||
|
||
|
||
# Select the appropriate network interface | ||
# This will fail the CMake preparation step if not set to one of those values. | ||
set(FREERTOS_PLUS_TCP_NETWORK_IF "" CACHE STRING "FreeRTOS Plus TCP Network Interface selection") | ||
set(FREERTOS_PLUS_TCP_NETWORK_IF_LIST | ||
A_CUSTOM_NETWORK_IF | ||
ATSAM43 ATSAME5x # AT | ||
DRIVER_SAM | ||
ESP32 | ||
KSZ8851SNL | ||
LPC17xx LPC18xx LPC54018 | ||
M487 | ||
MPS2_AN385 | ||
MW300_RD | ||
PIC32MZEF_ETH PIC32MZEF_WIFI | ||
POSIX WIN_PCAP # Native Linux & Windows respectively | ||
RX | ||
SH2A | ||
STM32FXX STM32HXX # ST Micro | ||
MSP432 | ||
TM4C | ||
XILINX_ULTRASCALE ZYNQ # AMD/Xilinx | ||
) | ||
if(NOT FREERTOS_PLUS_TCP_NETWORK_IF) | ||
# Attempt to detect the system. | ||
if(UNIX) | ||
message(STATUS "Detected UNIX/Posix system setting FREERTOS_PLUS_TCP_NETWORK_IF = POSIX") | ||
set(FREERTOS_PLUS_TCP_NETWORK_IF POSIX) | ||
elseif(MINGW) | ||
message(STATUS "Detected Windows MinGW system setting FREERTOS_PLUS_TCP_NETWORK_IF = WIN_PCAP") | ||
set(FREERTOS_PLUS_TCP_NETWORK_IF WIN_PCAP) | ||
endif() | ||
endif() | ||
|
||
if(NOT FREERTOS_PLUS_TCP_NETWORK_IF IN_LIST FREERTOS_PLUS_TCP_NETWORK_IF_LIST ) | ||
message(FATAL_ERROR " FREERTOS_PLUS_TCP_NETWORK_IF is '${FREERTOS_PLUS_TCP_NETWORK_IF}'.\n" | ||
" Please specify it from top-level CMake file (example):\n" | ||
" set(FREERTOS_PLUS_TCP_NETWORK_IF POSIX CACHE STRING \"\")\n" | ||
" or from CMake command line option:\n" | ||
" -DFREERTOS_PLUS_TCP_NETWORK_IF=POSIX\n" | ||
" \n" | ||
" Available port options: (Tested means compiled with that variant)\n" | ||
" A_CUSTOM_NETWORK_IF Target: User Defined\n" | ||
" ATSAM4E Target: ATSAM4E Tested: TODO\n" | ||
" ATSAME5x Target: ATSAME5x Tested: TODO\n" | ||
" DRIVER_SAM Target: Driver SAM Tested: TODO\n" | ||
" ESP32 Target: ESP-32 Tested: TODO\n" | ||
" KSZ8851SNL Target: ksz8851snl Tested: TODO\n" | ||
" POSIX Target: linux/Posix\n" | ||
" LPC17xx Target: LPC17xx Tested: TODO\n" | ||
" LPC18xx Target: LPC18xx Tested: TODO\n" | ||
" LPC54018 Target: LPC54018 Tested: TODO\n" | ||
" M487 Target: M487 Tested: TODO\n" | ||
" MPS2_AN385 Target: MPS2_AN385 Tested: TODO\n" | ||
" MW300_RD Target: mw300_rd Tested: TODO\n" | ||
" PIC32MZEF_ETH Target: pic32mzef ethernet Tested: TODO\n" | ||
" PIC32MZEF_WIFI Target: pic32mzef Wifi Tested: TODO\n" | ||
" RX Target: RX Tested: TODO\n" | ||
" SH2A Target: SH2A Tested: TODO\n" | ||
" STM32FXX Target: STM32Fxx Tested: TODO\n" | ||
" STM32HXX Target: STM32Hxx Tested: TODO\n" | ||
" MSP432 Target: MSP432 Tested: TODO\n" | ||
" TM4C Target: TM4C Tested: TODO\n" | ||
" WIN_PCAP Target: Windows Tested: TODO\n" | ||
" XILINX_ULTRASCALE Target: Xilinx Ultrascale Tested: TODO\n" | ||
" ZYNQ Target: Xilinx Zynq") | ||
elseif((FREERTOS_PORT STREQUAL "A_CUSTOM_PORT") AND (NOT TARGET freertos_kernel_port) ) | ||
message(FATAL_ERROR " FREERTOS_PLUS_TCP_NETWORK_IF is set to A_CUSTOM_NETWORK_IF.\n" | ||
" Please specify the custom network interface target with all necessary files.\n" | ||
" For example, assuming a directory of:\n" | ||
" FreeRTOSCustomNetworkInterface/\n" | ||
" CMakeLists.txt\n" | ||
" NetworkInterface.c\n\n" | ||
" Where FreeRTOSCustomNetworkInterface/CMakeLists.txt is a modified version of:\n" | ||
" add_library(freertos_plus_tcp_network_if STATIC)\n\n" | ||
" target_sources(freertos_plus_tcp_network_if\n" | ||
" PRIVATE\n" | ||
" NetworkInterface.c)\n\n" | ||
" target_include_directories(freertos_plus_tcp_network_if\n" | ||
" PUBLIC\n" | ||
" .)\n\n" | ||
" taget_link_libraries(freertos_plus_tcp_network_if\n" | ||
" PUBLIC\n" | ||
" freertos_plus_tcp_port\n" | ||
" freertos_plus_tcp_network_if_common\n" | ||
" PRIVATE\n" | ||
" freertos_kernel)") | ||
endif() | ||
|
||
# There is also the need to add a target - typically an interface library that describes the | ||
# Configuration for FreeRTOS-Kernel and FreeRTOS-Plus-TCP. | ||
# This is called freertos_config | ||
# If not defined will be default compile with one of the test build combinations AllEnable. | ||
|
||
# Select the appropriate Build Test configuration | ||
# This is only used when freertos_config is not defined, otherwise the build test will be performed | ||
# on the config defined in the freertos_config | ||
set(FREERTOS_PLUS_TCP_TEST_CONFIGURATION "CUSTOM" CACHE STRING "FreeRTOS Plus TCP Build Test configuration") | ||
set(FREERTOS_PLUS_TCP_TEST_CONFIGURATION_LIST | ||
CUSTOM # Custom (external) configuration -eg from a top-level project | ||
ENABLE_ALL # Enable all configuration settings | ||
DISABLE_ALL # Disable all configuration settings | ||
DEFAULT_CONF # Default (typical) configuration | ||
) | ||
if(NOT FREERTOS_PLUS_TCP_TEST_CONFIGURATION IN_LIST FREERTOS_PLUS_TCP_TEST_CONFIGURATION_LIST) | ||
message(FATAL_ERROR "Invalid FREERTOS_PLUS_TCP_TEST_CONFIGURATION value '${FREERTOS_PLUS_TCP_TEST_CONFIGURATION}' should be one of: ${FREERTOS_PLUS_TCP_TEST_CONFIGURATION_LIST}") | ||
else() | ||
message(STATUS "Using FreeRTOS-Plus-TCP Test Configuration : ${FREERTOS_PLUS_TCP_TEST_CONFIGURATION}") | ||
if (NOT FREERTOS_PLUS_TCP_TEST_CONFIGURATION STREQUAL "CUSTOM") | ||
message(WARNING "FreeRTOS-Kernel configuration settings are configured by FreeRTOS-Plus-TCP") | ||
endif() | ||
endif() | ||
|
||
######################################################################## | ||
# Requirements | ||
set(CMAKE_C_STANDARD 90) # Note FreeRTOS-Kernel uses C99 constructs. | ||
set(CMAKE_C_STANDARD_REQUIRED ON) | ||
|
||
######################################################################## | ||
# Overall Compile Options | ||
# Note the compile option strategy is to error on everything and then | ||
# Per library opt-out of things that are warnings/errors. | ||
# This ensures that no matter what strategy for compilation you take, the | ||
# builds will still occur. | ||
# | ||
# Only tested with GNU and Clang. | ||
# Other options are https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER_ID.html#variable:CMAKE_%3CLANG%3E_COMPILER_ID | ||
# Naming of compilers translation map: | ||
# For the ?TBD? - Suggest trying GNU-based and adding the appropriate toolchain file. | ||
# For Toolchain examples see _deps/cmake-src/toolchain/arm-none-eabil-gcc.toolchain.cmake | ||
# | ||
# FreeRTOS | CMake | ||
# ------------------- | ||
# CCS | ?TBD? | ||
# GCC | GNU, Clang, *Clang Others? | ||
# IAR | IAR | ||
# Keil | ARMCC | ||
# MSVC | MSVC # Note only for MinGW? | ||
# Renesas | ?TBD? | ||
|
||
add_compile_options( | ||
### Gnu/Clang C Options | ||
$<$<COMPILE_LANG_AND_ID:C,GNU>:-fdiagnostics-color=always> | ||
$<$<COMPILE_LANG_AND_ID:C,Clang>:-fcolor-diagnostics> | ||
|
||
$<$<COMPILE_LANG_AND_ID:C,Clang,GNU>:-Wall> | ||
$<$<COMPILE_LANG_AND_ID:C,Clang,GNU>:-Wextra> | ||
$<$<COMPILE_LANG_AND_ID:C,Clang,GNU>:-Wpedantic> | ||
$<$<COMPILE_LANG_AND_ID:C,Clang,GNU>:-Werror> | ||
$<$<COMPILE_LANG_AND_ID:C,Clang>:-Weverything> | ||
|
||
# TODO: Add in other Compilers here. | ||
) | ||
|
||
######################################################################## | ||
# External Dependencies | ||
# Note: For backwards compatibility - still have .gitmodules defining submodules | ||
# To support fetching content in a higher level project see | ||
# README.md `Consume with CMake` | ||
# This will allow you to upgrade submodules and have one common submodule for | ||
# all your builds despite multiple submodules having different versions. | ||
include(FetchContent) | ||
|
||
FetchContent_Declare( freertos_kernel | ||
GIT_REPOSITORY https://github.com/phelter/FreeRTOS-Kernel.git #https://github.com/FreeRTOS/FreeRTOS-Kernel.git | ||
GIT_TAG feature/fixing-clang-gnu-compiler-warnings #master | ||
) | ||
|
||
FetchContent_Declare( cmock | ||
GIT_REPOSITORY https://github.com/ThrowTheSwitch/CMock | ||
GIT_TAG v2.5.3 | ||
) | ||
|
||
add_subdirectory(source) | ||
add_subdirectory(tools) | ||
add_subdirectory(test) | ||
|
||
FetchContent_MakeAvailable(freertos_kernel cmock) | ||
|
||
# Note following are can be removed once FreeRTOS-Kernel v10.5.0 + fixes their issues. | ||
# To ignore header specific issues - change all of the headers to SYSTEM | ||
set(_freertos_kernel_targets freertos_kernel freertos_kernel_port) | ||
# foreach (_target ${_freertos_kernel_targets} ) | ||
# get_target_property( interface_directories ${_target} INTERFACE_INCLUDE_DIRECTORIES ) | ||
# set_target_properties(${_target} PROPERTIES INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${interface_directories}" ) | ||
# endforeach() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
# - Try to find libpcap include dirs and libraries | ||
# | ||
# Usage of this module as follows: | ||
# | ||
# find_package(PCAP) | ||
# | ||
# Variables used by this module, they can change the default behaviour and need | ||
# to be set before calling find_package: | ||
# | ||
# PCAP_ROOT_DIR Set this variable to the root installation of | ||
# libpcap if the module has problems finding the | ||
# proper installation path. | ||
# | ||
# Variables defined by this module: | ||
# | ||
# PCAP_FOUND System has libpcap, include and library dirs found | ||
# PCAP_INCLUDE_DIR The libpcap include directories. | ||
# PCAP_LIBRARY The libpcap library (possibly includes a thread | ||
# library e.g. required by pf_ring's libpcap) | ||
# HAVE_PF_RING If a found version of libpcap supports PF_RING | ||
|
||
find_path(PCAP_ROOT_DIR | ||
NAMES include/pcap.h | ||
) | ||
|
||
find_path(PCAP_INCLUDE_DIR | ||
NAMES pcap.h | ||
HINTS ${PCAP_ROOT_DIR}/include | ||
) | ||
|
||
find_library(PCAP_LIBRARY | ||
NAMES pcap | ||
HINTS ${PCAP_ROOT_DIR}/lib | ||
) | ||
|
||
include(FindPackageHandleStandardArgs) | ||
find_package_handle_standard_args(PCAP DEFAULT_MSG | ||
PCAP_LIBRARY | ||
PCAP_INCLUDE_DIR | ||
) | ||
|
||
include(CheckCSourceCompiles) | ||
set(CMAKE_REQUIRED_LIBRARIES ${PCAP_LIBRARY}) | ||
check_c_source_compiles("int main() { return 0; }" PCAP_LINKS_SOLO) | ||
set(CMAKE_REQUIRED_LIBRARIES) | ||
|
||
# check if linking against libpcap also needs to link against a thread library | ||
if (NOT PCAP_LINKS_SOLO) | ||
find_package(Threads) | ||
if (THREADS_FOUND) | ||
set(CMAKE_REQUIRED_LIBRARIES ${PCAP_LIBRARY} ${CMAKE_THREAD_LIBS_INIT}) | ||
check_c_source_compiles("int main() { return 0; }" PCAP_NEEDS_THREADS) | ||
set(CMAKE_REQUIRED_LIBRARIES) | ||
endif () | ||
if (THREADS_FOUND AND PCAP_NEEDS_THREADS) | ||
set(_tmp ${PCAP_LIBRARY} ${CMAKE_THREAD_LIBS_INIT}) | ||
list(REMOVE_DUPLICATES _tmp) | ||
set(PCAP_LIBRARY ${_tmp} | ||
CACHE STRING "Libraries needed to link against libpcap" FORCE) | ||
else () | ||
message(FATAL_ERROR "Couldn't determine how to link against libpcap") | ||
endif () | ||
endif () | ||
|
||
include(CheckFunctionExists) | ||
set(CMAKE_REQUIRED_LIBRARIES ${PCAP_LIBRARY}) | ||
check_function_exists(pcap_get_pfring_id HAVE_PF_RING) | ||
check_function_exists(pcap_dump_open_append HAVE_PCAP_DUMP_OPEN_APPEND) | ||
set(CMAKE_REQUIRED_LIBRARIES) | ||
|
||
mark_as_advanced( | ||
PCAP_ROOT_DIR | ||
PCAP_INCLUDE_DIR | ||
PCAP_LIBRARY | ||
) |
Oops, something went wrong.