1# 2# Arm SCP/MCP Software 3# Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved. 4# 5# SPDX-License-Identifier: BSD-3-Clause 6# 7 8cmake_minimum_required(VERSION 3.18.3) 9 10project( 11 SCP_FWK_TEST 12 VERSION 2.11.0 13 DESCRIPTION "Arm SCP/MCP Software Framework tests" 14 HOMEPAGE_URL 15 "https://developer.arm.com/tools-and-software/open-source-software/firmware/scp-firmware" 16 LANGUAGES C ASM) 17 18set(SCP_FWK_TEST_DIR "${CMAKE_CURRENT_SOURCE_DIR}") 19 20# Get details about current source version 21find_package(Git) 22if(GIT_FOUND) 23 execute_process( 24 COMMAND "${GIT_EXECUTABLE}" describe --tags --dirty --always 25 WORKING_DIRECTORY "${SCP_FWK_TEST_DIR}" 26 OUTPUT_VARIABLE SCP_FWK_TEST_DESCRIBE 27 OUTPUT_STRIP_TRAILING_WHITESPACE) 28endif() 29 30if(NOT SCP_FWK_TEST_DESCRIBE) 31 set(SCP_FWK_TEST_DESCRIBE "v${SCP_FWK_TEST_VERSION}-<unknown>") 32endif() 33 34# Set up toplevel paths 35set(FWK_TEST_ROOT ${CMAKE_CURRENT_SOURCE_DIR}) 36set(FWK_SRC_ROOT ${FWK_TEST_ROOT}/../src) 37set(FWK_INC_ROOT ${FWK_TEST_ROOT}/../include) 38set(FWK_TEST_SRC_ROOT ${FWK_TEST_ROOT}) 39set(FWK_TEST_INC_ROOT ${FWK_TEST_ROOT}/include) 40set(FWK_SCP_ROOT ${FWK_TEST_ROOT}/../..) 41 42# Setup additional compiler flags 43list(APPEND EXTRA_COMPILE_FLAGS -g3) 44list(APPEND EXTRA_COMPILE_FLAGS -Wall) 45list(APPEND EXTRA_COMPILE_FLAGS -Wextra) 46list(APPEND EXTRA_COMPILE_FLAGS -Werror) 47list(APPEND EXTRA_COMPILE_FLAGS -Wno-missing-field-initializers) 48list(APPEND EXTRA_COMPILE_FLAGS -Wno-error=deprecated-declarations) 49list(APPEND EXTRA_COMPILE_FLAGS -Wno-unused-parameter) 50list(APPEND EXTRA_COMPILE_FLAGS -Wno-strict-aliasing) 51list(APPEND EXTRA_COMPILE_FLAGS -std=gnu11) 52list(APPEND EXTRA_COMPILE_FLAGS -DBUILD_MODE_DEBUG) 53list(APPEND EXTRA_COMPILE_FLAGS -DBUILD_TESTS) 54 55# Add test targets 56list(APPEND SCP_FWK_TEST_TARGETS test_fwk_id_equality) 57list(APPEND SCP_FWK_TEST_TARGETS test_fwk_id_get_idx) 58list(APPEND SCP_FWK_TEST_TARGETS test_fwk_id_type) 59list(APPEND SCP_FWK_TEST_TARGETS test_fwk_interrupt) 60list(APPEND SCP_FWK_TEST_TARGETS test_fwk_list_contains) 61list(APPEND SCP_FWK_TEST_TARGETS test_fwk_list_empty) 62list(APPEND SCP_FWK_TEST_TARGETS test_fwk_list_get) 63list(APPEND SCP_FWK_TEST_TARGETS test_fwk_list_head) 64list(APPEND SCP_FWK_TEST_TARGETS test_fwk_list_init) 65list(APPEND SCP_FWK_TEST_TARGETS test_fwk_list_insert) 66list(APPEND SCP_FWK_TEST_TARGETS test_fwk_list_next) 67list(APPEND SCP_FWK_TEST_TARGETS test_fwk_list_pop) 68list(APPEND SCP_FWK_TEST_TARGETS test_fwk_list_push) 69list(APPEND SCP_FWK_TEST_TARGETS test_fwk_list_remove) 70list(APPEND SCP_FWK_TEST_TARGETS test_fwk_macros) 71list(APPEND SCP_FWK_TEST_TARGETS test_fwk_math) 72list(APPEND SCP_FWK_TEST_TARGETS test_fwk_module) 73list(APPEND SCP_FWK_TEST_TARGETS test_fwk_notification) 74list(APPEND SCP_FWK_TEST_TARGETS test_fwk_ring) 75list(APPEND SCP_FWK_TEST_TARGETS test_fwk_ring_init) 76list(APPEND SCP_FWK_TEST_TARGETS test_fwk_string) 77list(APPEND SCP_FWK_TEST_TARGETS test_fwk_core) 78 79# Create a list of the tests that need notifications. 80list(APPEND NOTIFICATION_ENABLED_TEST test_fwk_module test_fwk_notification 81 test_fwk_core) 82 83# Some test may need its own implementation of some of the function 84# for testing purpose. Create a list per test of these functions. 85list(APPEND test_fwk_module_WRAP __fwk_notification_init) 86list(APPEND test_fwk_module_WRAP __fwk_init) 87list(APPEND test_fwk_module_WRAP __fwk_run) 88list(APPEND test_fwk_module_WRAP fwk_mm_calloc) 89 90list(APPEND test_fwk_core_WRAP fwk_module_get_ctx) 91list(APPEND test_fwk_core_WRAP fwk_module_get_element_ctx) 92list(APPEND test_fwk_core_WRAP __fwk_slist_push_tail) 93list(APPEND test_fwk_core_WRAP fwk_mm_calloc) 94list(APPEND test_fwk_core_WRAP fwk_is_interrupt_context) 95list(APPEND test_fwk_core_WRAP fwk_interrupt_global_disable) 96list(APPEND test_fwk_core_WRAP fwk_interrupt_global_enable) 97list(APPEND test_fwk_core_WRAP fwk_module_is_valid_entity_id) 98list(APPEND test_fwk_core_WRAP fwk_module_is_valid_event_id) 99list(APPEND test_fwk_core_WRAP fwk_module_is_valid_notification_id) 100 101list(APPEND test_fwk_notification_WRAP fwk_module_get_ctx) 102list(APPEND test_fwk_notification_WRAP fwk_module_get_element_ctx) 103list(APPEND test_fwk_notification_WRAP __fwk_get_current_event) 104list(APPEND test_fwk_notification_WRAP __fwk_put_notification) 105list(APPEND test_fwk_notification_WRAP fwk_mm_calloc) 106list(APPEND test_fwk_notification_WRAP fwk_is_interrupt_context) 107list(APPEND test_fwk_notification_WRAP fwk_interrupt_global_disable) 108list(APPEND test_fwk_notification_WRAP fwk_interrupt_global_enable) 109list(APPEND test_fwk_notification_WRAP fwk_module_is_valid_entity_id) 110list(APPEND test_fwk_notification_WRAP fwk_module_is_valid_notification_id) 111 112list(APPEND TEST_MODULE_IDX_H test_fwk_module) 113set(test_fwk_module_MODULE_IDX_H test_fwk_module_module_idx.h) 114 115list(LENGTH SCP_FWK_TEST_TARGETS SCP_FWK_TEST_MAX) 116 117# Set up common framework source to be built 118list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_arch.c) 119list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_dlist.c) 120list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_id.c) 121list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_io.c) 122list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_interrupt.c) 123list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_log.c) 124list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_mm.c) 125list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_module.c) 126list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_ring.c) 127list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_slist.c) 128list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_string.c) 129list(APPEND COMMON_SRC ${FWK_TEST_SRC_ROOT}/fwk_test.c) 130list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_delayed_resp.c) 131list(APPEND COMMON_SRC ${FWK_SRC_ROOT}/fwk_time.c) 132 133# CMake internal function enables testing for this directory 134enable_testing() 135 136# cmake-lint: disable=E1120 137foreach(idx RANGE ${SCP_FWK_TEST_MAX}) 138 if(idx EQUAL SCP_FWK_TEST_MAX) 139 break() 140 endif() 141 142 list(GET SCP_FWK_TEST_TARGETS ${idx} TEST_TARGET) 143 144 add_executable(${TEST_TARGET} ${TEST_TARGET}.c) 145 146 target_compile_definitions( 147 ${TEST_TARGET} 148 PUBLIC "BUILD_VERSION_DESCRIBE_STRING=\"${SCP_FWK_TEST_DESCRIBE}\"" 149 "BUILD_VERSION_MAJOR=${SCP_FWK_TEST_VERSION_MAJOR}" 150 "BUILD_VERSION_MINOR=${SCP_FWK_TEST_VERSION_MINOR}") 151 152 foreach(COMPILE_FLAG IN LISTS EXTRA_COMPILE_FLAGS) 153 target_compile_options(${TEST_TARGET} PRIVATE "${COMPILE_FLAG}") 154 endforeach() 155 156 target_include_directories( 157 ${TEST_TARGET} 158 PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}" 159 PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include" 160 PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../include") 161 162 target_sources(${TEST_TARGET} PRIVATE ${COMMON_SRC}) 163 164 target_sources(${TEST_TARGET} PRIVATE ${FWK_SRC_ROOT}/fwk_core.c) 165 166 167 # Check whether this test need notification support 168 list(FIND NOTIFICATION_ENABLED_TEST ${TEST_TARGET} NOTIFICATIONS) 169 if(NOT NOTIFICATIONS EQUAL -1) 170 target_sources(${TEST_TARGET} 171 PRIVATE ${FWK_SRC_ROOT}/fwk_notification.c) 172 target_compile_definitions(${TEST_TARGET} 173 PUBLIC "BUILD_HAS_NOTIFICATION") 174 endif() 175 176 # Check if this test requires any custom module_idx_h file 177 list(FIND TEST_MODULE_IDX_H ${TEST_TARGET} MODULE_IDX_H) 178 if(NOT MODULE_IDX_H EQUAL -1) 179 target_compile_definitions( 180 ${TEST_TARGET} 181 PRIVATE "FWK_TEST_MODULE_IDX_H=\"${${TEST_TARGET}_MODULE_IDX_H}\"") 182 endif() 183 184 # Use linker option to provide wrap functions 185 if(${TEST_TARGET}_WRAP) 186 foreach(link_option IN LISTS ${TEST_TARGET}_WRAP) 187 target_link_options(${TEST_TARGET} 188 PRIVATE "LINKER:-wrap=${link_option}") 189 endforeach() 190 endif() 191 192 add_test(NAME ${TEST_TARGET} COMMAND ${TEST_TARGET}) 193 194endforeach() 195