1# SPDX-License-Identifier: Apache-2.0 2 3cmake_minimum_required(VERSION 3.20.0) 4 5include(extensions) 6include(west) 7include(yaml) 8include(root) 9include(zephyr_module) 10include(boards) 11include(hwm_v2) 12include(configuration_files) 13 14include(kconfig) 15include(arch) 16include(soc) 17 18find_package(TargetTools) 19 20enable_language(C CXX ASM) 21 22include(${ZEPHYR_BASE}/cmake/target_toolchain_flags.cmake) 23 24# Parameters: 25# SOURCES: list of source files, default main.c 26# INCLUDE: list of additional include paths relative to ZEPHYR_BASE 27 28foreach(extra_flags EXTRA_CPPFLAGS EXTRA_LDFLAGS EXTRA_CFLAGS EXTRA_CXXFLAGS EXTRA_AFLAGS) 29 list(LENGTH ${extra_flags} flags_length) 30 if(flags_length LESS_EQUAL 1) 31 # A length of zero means no argument. 32 # A length of one means a single argument or a space separated list was provided. 33 # In both cases, it is safe to do a separate_arguments on the argument. 34 separate_arguments(${extra_flags}_AS_LIST UNIX_COMMAND ${${extra_flags}}) 35 else() 36 # Already a proper list, no conversion needed. 37 set(${extra_flags}_AS_LIST "${${extra_flags}}") 38 endif() 39endforeach() 40 41set(ENV_ZEPHYR_BASE $ENV{ZEPHYR_BASE}) 42# This add support for old style boilerplate include. 43if((NOT DEFINED ZEPHYR_BASE) AND (DEFINED ENV_ZEPHYR_BASE)) 44 set(ZEPHYR_BASE ${ENV_ZEPHYR_BASE} CACHE PATH "Zephyr base") 45endif() 46 47if(NOT SOURCES AND EXISTS main.c) 48 set(SOURCES main.c) 49endif() 50 51add_executable(testbinary ${SOURCES}) 52add_library(test_interface INTERFACE) 53target_link_libraries(testbinary PRIVATE test_interface) 54 55set(KOBJ_TYPES_H_TARGET kobj_types_h_target) 56include(${ZEPHYR_BASE}/cmake/kobj.cmake) 57add_dependencies(test_interface ${KOBJ_TYPES_H_TARGET}) 58gen_kobject_list_headers(GEN_DIR_OUT_VAR KOBJ_GEN_DIR) 59 60# Generates empty header files to build 61set(INCL_GENERATED_DIR ${APPLICATION_BINARY_DIR}/zephyr/include/generated/zephyr) 62set(INCL_GENERATED_SYSCALL_DIR ${INCL_GENERATED_DIR}/syscalls) 63list(APPEND INCL_GENERATED_HEADERS 64 ${INCL_GENERATED_DIR}/devicetree_generated.h 65 ${INCL_GENERATED_DIR}/offsets.h 66 ${INCL_GENERATED_DIR}/syscall_list.h 67 ${INCL_GENERATED_DIR}/syscall_macros.h 68 ${INCL_GENERATED_SYSCALL_DIR}/kernel.h 69 ${INCL_GENERATED_SYSCALL_DIR}/kobject.h 70 ${INCL_GENERATED_SYSCALL_DIR}/log_core.h 71 ${INCL_GENERATED_SYSCALL_DIR}/log_ctrl.h 72 ${INCL_GENERATED_SYSCALL_DIR}/log_msg.h 73 ${INCL_GENERATED_SYSCALL_DIR}/sys_clock.h 74) 75 76file(MAKE_DIRECTORY ${INCL_GENERATED_SYSCALL_DIR}) 77foreach(header ${INCL_GENERATED_HEADERS}) 78 file(TOUCH ${header}) 79endforeach() 80 81list(APPEND INCLUDE 82 subsys/testsuite/ztest/include/zephyr 83 subsys/testsuite/ztest/unittest/include 84 subsys/testsuite/include/zephyr 85 subsys/testsuite/ztest/include 86 subsys/testsuite/include 87 include/zephyr 88 include 89 . 90) 91 92if(CMAKE_HOST_APPLE) 93else() 94 95if(M64_MODE) 96set (CMAKE_C_FLAGS "-m64") 97set (CMAKE_CXX_FLAGS "-m64") 98else() 99set (CMAKE_C_FLAGS "-m32") #deprecated on macOS 100set (CMAKE_CXX_FLAGS "-m32") #deprecated on macOS 101endif(M64_MODE) 102 103endif() 104 105target_compile_options(test_interface INTERFACE 106 -imacros ${AUTOCONF_H} 107 -Wall 108 -I ${KOBJ_GEN_DIR} 109 ${EXTRA_CPPFLAGS_AS_LIST} 110 ${EXTRA_CFLAGS_AS_LIST} 111 $<$<COMPILE_LANGUAGE:CXX>:${EXTRA_CXXFLAGS_AS_LIST}> 112 $<$<COMPILE_LANGUAGE:ASM>:${EXTRA_AFLAGS_AS_LIST}> 113 -Wno-format-zero-length 114 ) 115 116target_link_options(testbinary PRIVATE 117 -T "${ZEPHYR_BASE}/subsys/testsuite/include/zephyr/ztest_unittest.ld" 118 ) 119 120target_link_libraries(testbinary PRIVATE 121 ${EXTRA_LDFLAGS_AS_LIST} 122 ) 123 124target_compile_options(test_interface INTERFACE $<TARGET_PROPERTY:compiler,debug>) 125 126if(CONFIG_COVERAGE) 127 target_compile_options(test_interface INTERFACE $<TARGET_PROPERTY:compiler,coverage>) 128 129 target_link_libraries(testbinary PRIVATE $<TARGET_PROPERTY:linker,coverage>) 130endif() 131 132if (CONFIG_COMPILER_WARNINGS_AS_ERRORS) 133 target_compile_options(test_interface INTERFACE $<TARGET_PROPERTY:compiler,warnings_as_errors>) 134endif() 135 136if(LIBS) 137 message(FATAL_ERROR "This variable is not supported, see SOURCES instead") 138endif() 139 140target_sources(testbinary PRIVATE 141 ${ZEPHYR_BASE}/subsys/testsuite/ztest/src/ztest.c 142 ${ZEPHYR_BASE}/subsys/testsuite/ztest/src/ztest_mock.c 143 ${ZEPHYR_BASE}/subsys/testsuite/ztest/src/ztest_rules.c 144 ${ZEPHYR_BASE}/subsys/testsuite/ztest/src/ztest_defaults.c 145) 146 147target_compile_definitions(test_interface INTERFACE ZTEST_UNITTEST) 148 149foreach(inc ${INCLUDE}) 150 target_include_directories(test_interface INTERFACE ${ZEPHYR_BASE}/${inc}) 151endforeach() 152 153find_program(VALGRIND_PROGRAM valgrind) 154if(VALGRIND_PROGRAM) 155 set(VALGRIND ${VALGRIND_PROGRAM}) 156 set(VALGRIND_FLAGS 157 --leak-check=full 158 --error-exitcode=1 159 --log-file=valgrind.log 160 ) 161endif() 162 163add_custom_target(run 164 COMMAND 165 $<TARGET_FILE:testbinary> 166 DEPENDS testbinary 167 WORKING_DIRECTORY ${APPLICATION_BINARY_DIR} 168 ) 169 170add_custom_target(run-test 171 COMMAND 172 ${VALGRIND} ${VALGRIND_FLAGS} 173 $<TARGET_FILE:testbinary> 174 DEPENDS testbinary 175 WORKING_DIRECTORY ${APPLICATION_BINARY_DIR} 176 ) 177# TODO: Redirect output to unit.log 178