2021-11-30 14:51:24 +01:00

170 lines
7.4 KiB
CMake

# Set the required version.
cmake_minimum_required( VERSION 3.13.0 )
# Set the unit-test project.
project( "FreeRTOS-Plus-TCP test"
VERSION 1.0.0
LANGUAGES C )
# Allow the project to be organized into folders.
set_property( GLOBAL PROPERTY USE_FOLDERS ON )
# Use C90.
set( CMAKE_C_STANDARD 99 )
set( CMAKE_C_STANDARD_REQUIRED ON )
# 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()
# Set global path variables.
get_filename_component( __MODULE_ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}/../.." ABSOLUTE )
set( MODULE_ROOT_DIR ${__MODULE_ROOT_DIR} CACHE INTERNAL "FreeRTOS-Plus-TCP repository root." )
# Set the unit-test directory.
set( UNIT_TEST_DIR ${MODULE_ROOT_DIR}/test/unit-test CACHE INTERNAL "Unit-test directory." )
set( KERNEL_DIRECTORY ${MODULE_ROOT_DIR}/test/FreeRTOS-Kernel )
# See if FreRTOS-Kernel is submoduled
if( NOT EXISTS ${KERNEL_DIRECTORY}/include )
# Inform the user of the actions
message( STATUS "FreeRTOS-Kernel is required for this build. Submoduling it..." )
execute_process( COMMAND git submodule update --init --checkout ${KERNEL_DIRECTORY}
WORKING_DIRECTORY ${MODULE_ROOT_DIR} )
endif()
# Set the include directories
string( APPEND GLOBAL_INCLUDES "-I ${MODULE_ROOT_DIR}/include ")
string( APPEND GLOBAL_INCLUDES "-I ${UNIT_TEST_DIR}/ConfigFiles " )
string( APPEND GLOBAL_INCLUDES "-I ${MODULE_ROOT_DIR}/test/FreeRTOS-Kernel/include " )
# Configure options to always show in CMake GUI.
option( BUILD_CLONE_SUBMODULES
"Set this to ON to automatically clone any required Git submodules. When OFF, submodules must be manually cloned."
ON )
# Set output directories.
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin )
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib )
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib )
# Set TCP includes.
set( TCP_INCLUDES "${MODULE_ROOT_DIR}/include/FreeRTOS_IP.h"
"${MODULE_ROOT_DIR}/include/FreeRTOS_ARP.h"
"${MODULE_ROOT_DIR}/include/FreeRTOS_Sockets.h"
"${MODULE_ROOT_DIR}/include/FreeRTOS_IP_Private.h"
"${MODULE_ROOT_DIR}/include/FreeRTOS_UDP_IP.h"
"${MODULE_ROOT_DIR}/include/FreeRTOS_DHCP.h"
"${MODULE_ROOT_DIR}/include/FreeRTOS_DNS.h"
"${MODULE_ROOT_DIR}/include/FreeRTOS_TCP_IP.h"
"${MODULE_ROOT_DIR}/include/FreeRTOS_Stream_Buffer.h"
"${MODULE_ROOT_DIR}/include/FreeRTOS_TCP_WIN.h"
"${MODULE_ROOT_DIR}/include/NetworkBufferManagement.h"
"${MODULE_ROOT_DIR}/include/NetworkInterface.h" )
# Create a directory for the modified files
file( MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/Annexed_TCP )
# ===========================================================================
# ===========================================================================
# Preprocess the TCP include files as they will be mocked later.
foreach( file ${TCP_INCLUDES} )
get_filename_component( MODIFIED_FILE ${file} NAME_WLE )
string(TOUPPER ${MODIFIED_FILE} Guard)
if(${MODIFIED_FILE} STREQUAL "NetworkBufferManagement" )
set( Guard "NETWORK_BUFFER_MANAGEMENT_H" )
elseif( ${MODIFIED_FILE} STREQUAL "NetworkInterface" )
set( Guard "NETWORK_INTERFACE_H" )
else()
set( Guard ${Guard}_H )
endif()
# Remove IPConfigDefaults from the file
execute_process( COMMAND sed "s,#include \"FreeRTOSIPConfigDefaults.h\",,g" ${file}
OUTPUT_FILE ${CMAKE_BINARY_DIR}/Annexed_TCP/${MODIFIED_FILE}_tmp1.h )
# Add the FreeRTOSIPConfig file to each directory
execute_process( COMMAND sed "1 i\#include \"FreeRTOSIPConfig.h\"" ${CMAKE_BINARY_DIR}/Annexed_TCP/${MODIFIED_FILE}_tmp1.h
OUTPUT_FILE ${CMAKE_BINARY_DIR}/Annexed_TCP/${MODIFIED_FILE}_tmp.h )
# Use this tool to process all conditional declarations.
execute_process( COMMAND unifdefall -U${Guard} -D__COVERITY__ -I ${MODULE_ROOT_DIR}/tools/CMock/vendor/unity/src
-I ${MODULE_ROOT_DIR}/test/FreeRTOS-Kernel/include
-I ${UNIT_TEST_DIR}/ConfigFiles
-I ${MODULE_ROOT_DIR}/include
-I ${MODULE_ROOT_DIR}/test/FreeRTOS-Kernel/portable/ThirdParty/GCC/Posix
${CMAKE_BINARY_DIR}/Annexed_TCP/${MODIFIED_FILE}_tmp.h
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
OUTPUT_FILE ${CMAKE_BINARY_DIR}/Annexed_TCP/${MODIFIED_FILE}.h
OUTPUT_QUIET )
# Add the guards back to the files
execute_process( COMMAND sed -i "1 i\#ifndef ${Guard}" ${CMAKE_BINARY_DIR}/Annexed_TCP/${MODIFIED_FILE}.h )
execute_process( COMMAND sed -i -e "$ a\#endif" ${CMAKE_BINARY_DIR}/Annexed_TCP/${MODIFIED_FILE}.h )
execute_process( COMMAND sed -i -E "s,[ ]*extern ipDECL_CAST_.*,,g" ${CMAKE_BINARY_DIR}/Annexed_TCP/${MODIFIED_FILE}.h )
endforeach()
# ===========================================================================
# ===================================== Include the cmake configurations =================================================
# Include filepaths for source and include.
include( ${UNIT_TEST_DIR}/TCPFilePaths.cmake )
# ==================================== Test Configuration ========================================
# Define a CMock resource path.
set( CMOCK_DIR ${MODULE_ROOT_DIR}/tools/CMock CACHE INTERNAL "CMock library source directory." )
# Include CMock build configuration.
include( cmock_build.cmake )
# Check if the CMock source directory exists, and if not present, clone the submodule
# if BUILD_CLONE_SUBMODULES configuration is enabled.
if( NOT EXISTS ${CMOCK_DIR}/src )
# Attempt to clone CMock.
if( ${BUILD_CLONE_SUBMODULES} )
clone_cmock()
else()
message( FATAL_ERROR "The required submodule CMock does not exist. Either clone it manually, or set BUILD_CLONE_SUBMODULES to 'ON' to automatically clone it during build." )
endif()
endif()
# Add unit test and coverage configuration.
# Use CTest utility for managing test runs. This has to be added BEFORE
# defining test targets with add_test()
enable_testing()
# Add build targets for CMock and Unit, required for unit testing.
add_cmock_targets()
# Add function to enable CMock based tests and coverage.
include( ${MODULE_ROOT_DIR}/test/unit-test/cmock/create_test.cmake )
# Include unit-test build configuration
include( ${UNIT_TEST_DIR}/FreeRTOS_ARP/ut.cmake )
include( ${UNIT_TEST_DIR}/FreeRTOS_DHCP/ut.cmake )
include( ${UNIT_TEST_DIR}/FreeRTOS_Sockets/ut.cmake )
include( ${UNIT_TEST_DIR}/FreeRTOS_Stream_Buffer/ut.cmake )
include( ${UNIT_TEST_DIR}/FreeRTOS_UDP_IP/ut.cmake )
# ==================================== Coverage Analysis configuration ========================================
# Add a target for running coverage on tests.
add_custom_target( coverage
COMMAND ${CMAKE_COMMAND} -P ${MODULE_ROOT_DIR}/test/unit-test/cmock/coverage.cmake
DEPENDS cmock unity FreeRTOS_ARP_utest FreeRTOS_DHCP_utest FreeRTOS_UDP_IP_utest FreeRTOS_Stream_Buffer_utest
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)