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