blob: 0ed887fa9dce47651928c8bd42e29e0a7798e4c7 [file] [log] [blame]
Vinay Kumar Kotegowder932eed02019-08-22 00:42:47 +05301#/** @file
2# * Copyright (c) 2019, Arm Limited or its affiliates. All rights reserved.
3# * SPDX-License-Identifier : Apache-2.0
4# *
5# * Licensed under the Apache License, Version 2.0 (the "License");
6# * you may not use this file except in compliance with the License.
7# * You may obtain a copy of the License at
8# *
9# * http://www.apache.org/licenses/LICENSE-2.0
10# *
11# * Unless required by applicable law or agreed to in writing, software
12# * distributed under the License is distributed on an "AS IS" BASIS,
13# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# * See the License for the specific language governing permissions and
15# * limitations under the License.
16#**/
17
18# Set the minimum required version of CMake for the project
19cmake_minimum_required(VERSION 3.10)
20
21# cmake_policy
22cmake_policy(SET CMP0057 NEW)
23
24# Find python interpreter version 3 or greater
25find_package(PythonInterp 3 REQUIRED)
26# Find Git package
27find_package(Git REQUIRED)
28
29get_filename_component(TBSA_ROOT_DIR . ABSOLUTE)
30
31list(APPEND CMAKE_MODULE_PATH ${TBSA_ROOT_DIR}/cmake)
32include("common/Utils")
33include(${TBSA_ROOT_DIR}/cmake/common/CMakeSettings.cmake)
34
35# Check for TARGET command line argument
36_check_arguments("TARGET")
37
38# Check for COMPILER command line argument
39if(NOT DEFINED COMPILER)
40 set(COMPILER "GNUARM" CACHE INTERNAL "Compiler used" FORCE)
41 message(STATUS "[TBSA] : Defaulting compiler to ${COMPILER}")
42endif()
43
44# Check for ARCH command line argument
45if(NOT DEFINED ARCH)
46 message(STATUS "[TBSA] : Defaulting architecture to armv8-m.main")
47 set(ARCH "main")
48endif()
49
50# Check for CMSIS command line argument which drives platform driver selection
51if(NOT DEFINED CMSIS_DRIVER)
52 set(CMSIS_DRIVER OFF CACHE INTERNAL "CMSIS Driver selection" FORCE)
53endif()
54
55# Check for SUITE command line argument
56if(NOT DEFINED SUITE)
57 set(SUITE "ALL" CACHE INTERNAL "Test Component selection" FORCE)
58endif()
59
60# Supported architectures
61list(APPEND ARCHITECTURE_SUPPORT
62 main
63 base
64)
65
66# Supported toolchains
67list(APPEND TOOLCHAIN_SUPPORT
68 GNUARM
69)
70
Øyvind Rønningstadc50804e2021-03-12 12:43:25 +010071# list of supported CROSS_COMPILE toolchains
72list(APPEND CROSS_COMPILE_TOOLCHAIN_SUPPORT
73 GNUARM
74)
75
Vinay Kumar Kotegowder932eed02019-08-22 00:42:47 +053076# Variables of the project
77set(TBSA_PROJECT_NAME tbsa)
78set(TARGET_CONFIGURATION_FILE ${TBSA_ROOT_DIR}/platform/board/${TARGET}/tbsa_tgt.cfg)
79set(TBSA_MAIN_APP_ENTRY tbsa_entry)
80set(TBSA_TEST_APP_ENTRY tbsa_test_info)
81set(TBSA_TARGET_GENERATE_DATABASE generate_database)
82set(TBSA_TARGET_GENERATE_DATABASE_POST generate_database_cleanup)
83set(TBSA_TARGET_CMSIS cmsis_setup)
84set(TBSA_TARGET_GENERATE_LINKER_SCRIPTS generate_linker_scripts)
85set(TBSA_TARGET_TEST_ELF_COMBINE test_elf_combine)
86set(TBSA_TARGET_VAL_LIB tbsa_val)
87set(TBSA_TARGET_PAL_LIB tbsa_pal)
88set(TBSA_CMSIS_GIT_REPO_LINK https://github.com/ARM-software/CMSIS_5.git CACHE INTERNAL "CMSIS Git Repo path" FORCE)
89set(TBSA_CMSIS_GIT_REPO_TAG 49ac527aa7406cecbba46d4d3bdbc7f60c6c6d42 CACHE INTERNAL "CMSIS Git Repo Tag Id" FORCE)
90set(TBSA_TARGET_CONFIG_HEADER_GENERATOR ${TBSA_ROOT_DIR}/tools/tgt_cfg_parser/targetConfigGen.py)
91set(TBSA_LINKER_SCRIPT_GENERATOR ${TBSA_ROOT_DIR}/tools/gen_linker_scripts/gen_linker_scripts.py)
92set(TBSA_TEST_ELF_COMBINE_GENERATOR ${TBSA_ROOT_DIR}/tools/test_elf_combine.py)
93set(TEST_COMBINED_BINARY_FILE_NAME ${CMAKE_CURRENT_BINARY_DIR}/tbsa_test_combined.bin CACHE INTERNAL "TBSA Test Binary Name" FORCE)
94set(TGT_CONFIG_SOURCE_C ${CMAKE_CURRENT_BINARY_DIR}/targetConfigGen.c)
95set(OUTPUT_HEADER pal_database.h)
96set(DATABASE_TABLE_NAME database)
97set(DATABASE_TABLE_SECTION_NAME .ns_target_database)
98set(TBSA_MAP_FILE ${CMAKE_CURRENT_BINARY_DIR}/${TBSA_PROJECT_NAME}.map)
99set(TBSA_EXECUTABLE_SUFFIX ".elf" CACHE INTERNAL "Executable suffix" FORCE)
100
101if(NOT DEFINED CMSIS_REPO_PATH)
102 get_filename_component(CMSIS_5_DIR ${CMAKE_CURRENT_BINARY_DIR}/src/${TBSA_TARGET_CMSIS} ABSOLUTE)
103else()
104 set(CMSIS_5_DIR ${CMSIS_REPO_PATH})
105endif()
106
107function(validate_target_directory)
108 # Get the list of available directories under platform/board
109 _get_sub_dir_list(BOARD_LIST ${TBSA_ROOT_DIR}/platform/board)
110 # Removing include directory which is not a target
111 list(REMOVE_ITEM BOARD_LIST include)
112 if(${TARGET} IN_LIST BOARD_LIST)
113 message(STATUS "[TBSA] : Working on target '${TARGET}'")
114 else()
115 message(FATAL_ERROR "[TBSA] : Specified target directory '${TARGET}' not found!")
116 endif()
117endfunction()
118
119function(validate_suite_directory)
120 # Get the list of available directories under test_pool
121 _get_sub_dir_list(SUITE_LIST ${TBSA_ROOT_DIR}/test_pool)
122 if(${SUITE} IN_LIST SUITE_LIST)
123 message(STATUS "[TBSA] : Testing '${SUITE}' suite")
124 else()
125 message(FATAL_ERROR "[TBSA] : Specified suite directory '${SUITE}' not found!")
126 endif()
127endfunction()
128
129# test pool source directory
130set(TEST_POOL_SOURCE_DIR ${TBSA_ROOT_DIR}/test_pool)
131if(SUITE STREQUAL "ALL")
132 # Get all the test pool components
133 _get_sub_dir_list(TEST_POOL_COMP_LIST ${TEST_POOL_SOURCE_DIR})
134else()
135 validate_suite_directory()
136 set(TEST_POOL_COMP_LIST ${SUITE})
137endif()
138
139# Project starts
140project(${TBSA_PROJECT_NAME} C ASM)
141
142# Name of final executable
143set(EXE_NAME ${TBSA_PROJECT_NAME})
144
145message(STATUS "[TBSA] : CMake is running on '${CMAKE_HOST_SYSTEM_NAME}'")
146validate_target_directory()
147
148# Check for supported architectues
149if(NOT ${ARCH} IN_LIST ARCHITECTURE_SUPPORT)
150 message(FATAL_ERROR "[TBSA] : armv8-m.${ARCH} architecture support not available")
151endif()
152
153# Check for supported toolchain/s
154if(${COMPILER} IN_LIST TOOLCHAIN_SUPPORT)
Øyvind Rønningstadc50804e2021-03-12 12:43:25 +0100155 if(CROSS_COMPILE AND NOT (${TOOLCHAIN} IN_LIST CROSS_COMPILE_TOOLCHAIN_SUPPORT))
156 message(FATAL_ERROR "[PSA] : Error: CROSS_COMPILE not supported for this toolchain, supported toolchain are : ${CROSS_COMPILE_TOOLCHAIN_SUPPORT}")
157 endif()
Vinay Kumar Kotegowder932eed02019-08-22 00:42:47 +0530158 include(${TBSA_ROOT_DIR}/cmake/compiler/${COMPILER}.cmake)
159else()
160 message(FATAL_ERROR "[TBSA] : ${COMPILER} toolchain support not available")
161endif()
162
163# Files to clean
164list(APPEND TBSA_CLEAN_LIST
165 ${TEST_COMBINED_BINARY_FILE_NAME}
166 ${TBSA_MAP_FILE}
167 ${TGT_CONFIG_SOURCE_C}
168 ${TBSA_LINKER_SCRIPT}
169 ${TBSA_TEST_S_LINKER_SCRIPT}
170 ${TBSA_TEST_NS_LINKER_SCRIPT}
171 ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_HEADER}
172)
173
174# Adding files to clean for incremental build
175_get_sub_dir_list(TEST_POOL_CLEAN_LIST ${TEST_POOL_SOURCE_DIR})
176foreach(test_comp ${TEST_POOL_CLEAN_LIST})
177 # Set source directory
178 set(TEST_COMP_SOURCE_DIR ${TEST_POOL_SOURCE_DIR}/${test_comp})
179 # Get all the test folders from a given test component
180 _get_sub_dir_list(COMP_TEST_LIST ${TEST_COMP_SOURCE_DIR})
181 foreach(test ${COMP_TEST_LIST})
182 set(TEST_S_EXE_NAME "${test}.secure${TBSA_EXECUTABLE_SUFFIX}")
183 set(TEST_NS_EXE_NAME "${test}.non_secure${TBSA_EXECUTABLE_SUFFIX}")
184 list(APPEND TBSA_CLEAN_LIST
185 ${CMAKE_CURRENT_BINARY_DIR}/${TEST_S_EXE_NAME}
186 ${CMAKE_CURRENT_BINARY_DIR}/${test}.secure.map)
187 list(APPEND TBSA_CLEAN_LIST
188 ${CMAKE_CURRENT_BINARY_DIR}/${TEST_NS_EXE_NAME}
189 ${CMAKE_CURRENT_BINARY_DIR}/${test}.non_secure.map)
190 endforeach()
191endforeach()
192
193# Target configuration parsing
194include(ExternalProject)
195ExternalProject_Add(
196 ${TBSA_TARGET_GENERATE_DATABASE}
197 PREFIX ${CMAKE_CURRENT_BINARY_DIR}
198 DOWNLOAD_COMMAND ""
199 UPDATE_COMMAND ""
200 PATCH_COMMAND ""
201 BUILD_COMMAND ""
202 SOURCE_DIR "${TBSA_ROOT_DIR}/tools/tgt_cfg_parser"
203 CMAKE_ARGS -DPYTHON_EXECUTABLE=${PYTHON_EXECUTABLE}
204 -DOUT_DIR=${CMAKE_CURRENT_BINARY_DIR}
205 -DTARGET=${TARGET}
206 -DGENERATOR_FILE=${TBSA_TARGET_CONFIG_HEADER_GENERATOR}
207 -DINCLUDE_DIR=${TBSA_ROOT_DIR}/val/include
208 -DTARGET_CONFIGURATION_FILE=${TARGET_CONFIGURATION_FILE}
209 -DTGT_CONFIG_SOURCE_C=${TGT_CONFIG_SOURCE_C}
210 -DOUTPUT_HEADER=${OUTPUT_HEADER}
211 -DDATABASE_TABLE_NAME=${DATABASE_TABLE_NAME}
212 -DDATABASE_TABLE_SECTION_NAME=${DATABASE_TABLE_SECTION_NAME}
213 TEST_COMMAND ""
214)
215
216# Add custom target to clean generated files of the external project
217add_custom_target(
218 ${TBSA_TARGET_GENERATE_DATABASE_POST}
219 COMMAND ${CMAKE_COMMAND} --build ${CMAKE_CURRENT_BINARY_DIR}/src/${TBSA_TARGET_GENERATE_DATABASE}-build/ -- clean
220)
221
222if(NOT DEFINED CMSIS_REPO_PATH)
223# Cloning CMSIS_5 repo
224ExternalProject_Add(
225 ${TBSA_TARGET_CMSIS}
226 PREFIX ${CMAKE_CURRENT_BINARY_DIR}
227 GIT_REPOSITORY ${TBSA_CMSIS_GIT_REPO_LINK}
228 GIT_TAG ${TBSA_CMSIS_GIT_REPO_TAG}
229 CONFIGURE_COMMAND ""
230 UPDATE_COMMAND ""
231 PATCH_COMMAND ""
232 BUILD_COMMAND ""
233 TEST_COMMAND ""
234 INSTALL_COMMAND ""
235)
236endif()
237
238# Linker scripts generation
239add_custom_target(
240 ${TBSA_TARGET_GENERATE_LINKER_SCRIPTS}
241 COMMENT "[TBSA] : Generating linker scripts for the target"
242 COMMAND ${PYTHON_EXECUTABLE} ${TBSA_LINKER_SCRIPT_GENERATOR}
243 ${TARGET_CONFIGURATION_FILE}
244 ${TBSA_LINKER_TEMPLATE}
245 ${TBSA_TEST_LINKER_TEMPLATE}
246 ${TBSA_LINKER_SCRIPT}
247 ${TBSA_TEST_S_LINKER_SCRIPT}
248 ${TBSA_TEST_NS_LINKER_SCRIPT}
249)
250
251#Combine test ELFs into binary file
252add_custom_target(
253 ${TBSA_TARGET_TEST_ELF_COMBINE}
254 COMMENT "[TBSA] : Combining TEST ELFs"
255 COMMAND ${PYTHON_EXECUTABLE} ${TBSA_TEST_ELF_COMBINE_GENERATOR}
256 ${CMAKE_CURRENT_BINARY_DIR}
257 ${TEST_COMBINED_BINARY_FILE_NAME}
258)
259
260
261# Generate VAL LIB
262include(${TBSA_ROOT_DIR}/val/val.cmake)
263# Generate PAL LIB
264include(${TBSA_ROOT_DIR}/platform/board/${TARGET}/target.cmake)
265
266# Final executable of the build process
267add_executable(${EXE_NAME} ${TBSA_ROOT_DIR}/tbsa_app/tbsa_main.c)
268
269target_link_libraries(${EXE_NAME} ${TBSA_TARGET_VAL_LIB} ${TBSA_TARGET_PAL_LIB})
270set_target_properties(${EXE_NAME} PROPERTIES SUFFIX ${TBSA_EXECUTABLE_SUFFIX})
271compiler_set_linker_options(TARGET_NAME ${EXE_NAME}
272 ENTRY_FUNCTION ${TBSA_MAIN_APP_ENTRY}
273 LINKER_SCRIPT ${TBSA_LINKER_SCRIPT}
274 MAP_FILE ${TBSA_MAP_FILE})
275target_include_directories(${EXE_NAME} PRIVATE ${TBSA_ROOT_DIR}/tbsa_app)
276
277# Dependency chain
278add_dependencies(${TBSA_TARGET_GENERATE_DATABASE_POST} ${TBSA_TARGET_GENERATE_DATABASE})
279if(NOT DEFINED CMSIS_REPO_PATH)
280 add_dependencies(${TBSA_TARGET_CMSIS} ${TBSA_TARGET_GENERATE_DATABASE_POST})
281 add_dependencies(${TBSA_TARGET_GENERATE_LINKER_SCRIPTS} ${TBSA_TARGET_CMSIS})
282else()
283 add_dependencies(${TBSA_TARGET_GENERATE_LINKER_SCRIPTS} ${TBSA_TARGET_GENERATE_DATABASE_POST})
284endif()
285add_dependencies(${TBSA_TARGET_PAL_LIB} ${TBSA_TARGET_GENERATE_LINKER_SCRIPTS})
286add_dependencies(${TBSA_TARGET_VAL_LIB} ${TBSA_TARGET_PAL_LIB})
287add_dependencies(${TBSA_TARGET_TEST_ELF_COMBINE} ${TBSA_TARGET_VAL_LIB})
288add_dependencies(${EXE_NAME} ${TBSA_TARGET_TEST_ELF_COMBINE})
289
290# Generate test ELFs for all the relevant components
291foreach(test_comp ${TEST_POOL_COMP_LIST})
292 # Set source directory
293 set(TEST_COMP_SOURCE_DIR ${TEST_POOL_SOURCE_DIR}/${test_comp})
294 # Get all the test folders from a given test component
295 _get_sub_dir_list(COMP_TEST_LIST ${TEST_COMP_SOURCE_DIR})
296 foreach(test ${COMP_TEST_LIST})
297 set(TEST_S_EXE_NAME "${test}.secure")
298 set(TEST_NS_EXE_NAME "${test}.non_secure")
299 set(TEST_S_SRC_C "${TEST_POOL_SOURCE_DIR}/${test_comp}/${test}/secure.c")
300 set(TEST_NS_SRC_C "${TEST_POOL_SOURCE_DIR}/${test_comp}/${test}/non_secure.c")
301 # Secure Test ELF
302 add_executable(${TEST_S_EXE_NAME} ${TEST_S_SRC_C})
303 target_link_libraries(${TEST_S_EXE_NAME} ${TBSA_TARGET_VAL_LIB} ${TBSA_TARGET_PAL_LIB})
304 set_target_properties(${TEST_S_EXE_NAME} PROPERTIES SUFFIX ${TBSA_EXECUTABLE_SUFFIX})
305 compiler_set_linker_options(TARGET_NAME ${TEST_S_EXE_NAME}
306 ENTRY_FUNCTION ${TBSA_TEST_APP_ENTRY}
307 LINKER_SCRIPT ${TBSA_TEST_S_LINKER_SCRIPT}
308 MAP_FILE ${CMAKE_CURRENT_BINARY_DIR}/${test}.secure.map)
309 add_dependencies(${EXE_NAME} ${TEST_S_EXE_NAME})
310 add_dependencies(${TBSA_TARGET_TEST_ELF_COMBINE} ${TEST_S_EXE_NAME})
311 # Non secure Test ELF
312 add_executable(${TEST_NS_EXE_NAME} ${TEST_NS_SRC_C})
313 target_link_libraries(${TEST_NS_EXE_NAME} ${TBSA_TARGET_VAL_LIB} ${TBSA_TARGET_PAL_LIB})
314 set_target_properties(${TEST_NS_EXE_NAME} PROPERTIES SUFFIX ${TBSA_EXECUTABLE_SUFFIX})
315 compiler_set_linker_options(TARGET_NAME ${TEST_NS_EXE_NAME}
316 ENTRY_FUNCTION ${TBSA_TEST_APP_ENTRY}
317 LINKER_SCRIPT ${TBSA_TEST_NS_LINKER_SCRIPT}
318 MAP_FILE ${CMAKE_CURRENT_BINARY_DIR}/${test}.non_secure.map)
319 add_dependencies(${EXE_NAME} ${TEST_NS_EXE_NAME})
320 add_dependencies(${TBSA_TARGET_TEST_ELF_COMBINE} ${TEST_NS_EXE_NAME})
321 endforeach()
322endforeach()
323
324# Include the files for make clean
325foreach(clean_item ${TBSA_CLEAN_LIST})
326 set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${clean_item})
327endforeach()