Vinay Kumar Kotegowder | 932eed0 | 2019-08-22 00:42:47 +0530 | [diff] [blame] | 1 | #/** @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 |
| 19 | cmake_minimum_required(VERSION 3.10) |
| 20 | |
| 21 | # cmake_policy |
| 22 | cmake_policy(SET CMP0057 NEW) |
| 23 | |
| 24 | # Find python interpreter version 3 or greater |
| 25 | find_package(PythonInterp 3 REQUIRED) |
| 26 | # Find Git package |
| 27 | find_package(Git REQUIRED) |
| 28 | |
| 29 | get_filename_component(TBSA_ROOT_DIR . ABSOLUTE) |
| 30 | |
| 31 | list(APPEND CMAKE_MODULE_PATH ${TBSA_ROOT_DIR}/cmake) |
| 32 | include("common/Utils") |
| 33 | include(${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 |
| 39 | if(NOT DEFINED COMPILER) |
| 40 | set(COMPILER "GNUARM" CACHE INTERNAL "Compiler used" FORCE) |
| 41 | message(STATUS "[TBSA] : Defaulting compiler to ${COMPILER}") |
| 42 | endif() |
| 43 | |
| 44 | # Check for ARCH command line argument |
| 45 | if(NOT DEFINED ARCH) |
| 46 | message(STATUS "[TBSA] : Defaulting architecture to armv8-m.main") |
| 47 | set(ARCH "main") |
| 48 | endif() |
| 49 | |
| 50 | # Check for CMSIS command line argument which drives platform driver selection |
| 51 | if(NOT DEFINED CMSIS_DRIVER) |
| 52 | set(CMSIS_DRIVER OFF CACHE INTERNAL "CMSIS Driver selection" FORCE) |
| 53 | endif() |
| 54 | |
| 55 | # Check for SUITE command line argument |
| 56 | if(NOT DEFINED SUITE) |
| 57 | set(SUITE "ALL" CACHE INTERNAL "Test Component selection" FORCE) |
| 58 | endif() |
| 59 | |
| 60 | # Supported architectures |
| 61 | list(APPEND ARCHITECTURE_SUPPORT |
| 62 | main |
| 63 | base |
| 64 | ) |
| 65 | |
| 66 | # Supported toolchains |
| 67 | list(APPEND TOOLCHAIN_SUPPORT |
| 68 | GNUARM |
| 69 | ) |
| 70 | |
Øyvind Rønningstad | c50804e | 2021-03-12 12:43:25 +0100 | [diff] [blame] | 71 | # list of supported CROSS_COMPILE toolchains |
| 72 | list(APPEND CROSS_COMPILE_TOOLCHAIN_SUPPORT |
| 73 | GNUARM |
| 74 | ) |
| 75 | |
Vinay Kumar Kotegowder | 932eed0 | 2019-08-22 00:42:47 +0530 | [diff] [blame] | 76 | # Variables of the project |
| 77 | set(TBSA_PROJECT_NAME tbsa) |
| 78 | set(TARGET_CONFIGURATION_FILE ${TBSA_ROOT_DIR}/platform/board/${TARGET}/tbsa_tgt.cfg) |
| 79 | set(TBSA_MAIN_APP_ENTRY tbsa_entry) |
| 80 | set(TBSA_TEST_APP_ENTRY tbsa_test_info) |
| 81 | set(TBSA_TARGET_GENERATE_DATABASE generate_database) |
| 82 | set(TBSA_TARGET_GENERATE_DATABASE_POST generate_database_cleanup) |
| 83 | set(TBSA_TARGET_CMSIS cmsis_setup) |
| 84 | set(TBSA_TARGET_GENERATE_LINKER_SCRIPTS generate_linker_scripts) |
| 85 | set(TBSA_TARGET_TEST_ELF_COMBINE test_elf_combine) |
| 86 | set(TBSA_TARGET_VAL_LIB tbsa_val) |
| 87 | set(TBSA_TARGET_PAL_LIB tbsa_pal) |
| 88 | set(TBSA_CMSIS_GIT_REPO_LINK https://github.com/ARM-software/CMSIS_5.git CACHE INTERNAL "CMSIS Git Repo path" FORCE) |
| 89 | set(TBSA_CMSIS_GIT_REPO_TAG 49ac527aa7406cecbba46d4d3bdbc7f60c6c6d42 CACHE INTERNAL "CMSIS Git Repo Tag Id" FORCE) |
| 90 | set(TBSA_TARGET_CONFIG_HEADER_GENERATOR ${TBSA_ROOT_DIR}/tools/tgt_cfg_parser/targetConfigGen.py) |
| 91 | set(TBSA_LINKER_SCRIPT_GENERATOR ${TBSA_ROOT_DIR}/tools/gen_linker_scripts/gen_linker_scripts.py) |
| 92 | set(TBSA_TEST_ELF_COMBINE_GENERATOR ${TBSA_ROOT_DIR}/tools/test_elf_combine.py) |
| 93 | set(TEST_COMBINED_BINARY_FILE_NAME ${CMAKE_CURRENT_BINARY_DIR}/tbsa_test_combined.bin CACHE INTERNAL "TBSA Test Binary Name" FORCE) |
| 94 | set(TGT_CONFIG_SOURCE_C ${CMAKE_CURRENT_BINARY_DIR}/targetConfigGen.c) |
| 95 | set(OUTPUT_HEADER pal_database.h) |
| 96 | set(DATABASE_TABLE_NAME database) |
| 97 | set(DATABASE_TABLE_SECTION_NAME .ns_target_database) |
| 98 | set(TBSA_MAP_FILE ${CMAKE_CURRENT_BINARY_DIR}/${TBSA_PROJECT_NAME}.map) |
| 99 | set(TBSA_EXECUTABLE_SUFFIX ".elf" CACHE INTERNAL "Executable suffix" FORCE) |
| 100 | |
| 101 | if(NOT DEFINED CMSIS_REPO_PATH) |
| 102 | get_filename_component(CMSIS_5_DIR ${CMAKE_CURRENT_BINARY_DIR}/src/${TBSA_TARGET_CMSIS} ABSOLUTE) |
| 103 | else() |
| 104 | set(CMSIS_5_DIR ${CMSIS_REPO_PATH}) |
| 105 | endif() |
| 106 | |
| 107 | function(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() |
| 117 | endfunction() |
| 118 | |
| 119 | function(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() |
| 127 | endfunction() |
| 128 | |
| 129 | # test pool source directory |
| 130 | set(TEST_POOL_SOURCE_DIR ${TBSA_ROOT_DIR}/test_pool) |
| 131 | if(SUITE STREQUAL "ALL") |
| 132 | # Get all the test pool components |
| 133 | _get_sub_dir_list(TEST_POOL_COMP_LIST ${TEST_POOL_SOURCE_DIR}) |
| 134 | else() |
| 135 | validate_suite_directory() |
| 136 | set(TEST_POOL_COMP_LIST ${SUITE}) |
| 137 | endif() |
| 138 | |
| 139 | # Project starts |
| 140 | project(${TBSA_PROJECT_NAME} C ASM) |
| 141 | |
| 142 | # Name of final executable |
| 143 | set(EXE_NAME ${TBSA_PROJECT_NAME}) |
| 144 | |
| 145 | message(STATUS "[TBSA] : CMake is running on '${CMAKE_HOST_SYSTEM_NAME}'") |
| 146 | validate_target_directory() |
| 147 | |
| 148 | # Check for supported architectues |
| 149 | if(NOT ${ARCH} IN_LIST ARCHITECTURE_SUPPORT) |
| 150 | message(FATAL_ERROR "[TBSA] : armv8-m.${ARCH} architecture support not available") |
| 151 | endif() |
| 152 | |
| 153 | # Check for supported toolchain/s |
| 154 | if(${COMPILER} IN_LIST TOOLCHAIN_SUPPORT) |
Øyvind Rønningstad | c50804e | 2021-03-12 12:43:25 +0100 | [diff] [blame] | 155 | 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 Kotegowder | 932eed0 | 2019-08-22 00:42:47 +0530 | [diff] [blame] | 158 | include(${TBSA_ROOT_DIR}/cmake/compiler/${COMPILER}.cmake) |
| 159 | else() |
| 160 | message(FATAL_ERROR "[TBSA] : ${COMPILER} toolchain support not available") |
| 161 | endif() |
| 162 | |
| 163 | # Files to clean |
| 164 | list(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}) |
| 176 | foreach(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() |
| 191 | endforeach() |
| 192 | |
| 193 | # Target configuration parsing |
| 194 | include(ExternalProject) |
| 195 | ExternalProject_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 |
| 217 | add_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 | |
| 222 | if(NOT DEFINED CMSIS_REPO_PATH) |
| 223 | # Cloning CMSIS_5 repo |
| 224 | ExternalProject_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 | ) |
| 236 | endif() |
| 237 | |
| 238 | # Linker scripts generation |
| 239 | add_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 |
| 252 | add_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 |
| 262 | include(${TBSA_ROOT_DIR}/val/val.cmake) |
| 263 | # Generate PAL LIB |
| 264 | include(${TBSA_ROOT_DIR}/platform/board/${TARGET}/target.cmake) |
| 265 | |
| 266 | # Final executable of the build process |
| 267 | add_executable(${EXE_NAME} ${TBSA_ROOT_DIR}/tbsa_app/tbsa_main.c) |
| 268 | |
| 269 | target_link_libraries(${EXE_NAME} ${TBSA_TARGET_VAL_LIB} ${TBSA_TARGET_PAL_LIB}) |
| 270 | set_target_properties(${EXE_NAME} PROPERTIES SUFFIX ${TBSA_EXECUTABLE_SUFFIX}) |
| 271 | compiler_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}) |
| 275 | target_include_directories(${EXE_NAME} PRIVATE ${TBSA_ROOT_DIR}/tbsa_app) |
| 276 | |
| 277 | # Dependency chain |
| 278 | add_dependencies(${TBSA_TARGET_GENERATE_DATABASE_POST} ${TBSA_TARGET_GENERATE_DATABASE}) |
| 279 | if(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}) |
| 282 | else() |
| 283 | add_dependencies(${TBSA_TARGET_GENERATE_LINKER_SCRIPTS} ${TBSA_TARGET_GENERATE_DATABASE_POST}) |
| 284 | endif() |
| 285 | add_dependencies(${TBSA_TARGET_PAL_LIB} ${TBSA_TARGET_GENERATE_LINKER_SCRIPTS}) |
| 286 | add_dependencies(${TBSA_TARGET_VAL_LIB} ${TBSA_TARGET_PAL_LIB}) |
| 287 | add_dependencies(${TBSA_TARGET_TEST_ELF_COMBINE} ${TBSA_TARGET_VAL_LIB}) |
| 288 | add_dependencies(${EXE_NAME} ${TBSA_TARGET_TEST_ELF_COMBINE}) |
| 289 | |
| 290 | # Generate test ELFs for all the relevant components |
| 291 | foreach(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() |
| 322 | endforeach() |
| 323 | |
| 324 | # Include the files for make clean |
| 325 | foreach(clean_item ${TBSA_CLEAN_LIST}) |
| 326 | set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${clean_item}) |
| 327 | endforeach() |