diff options
Diffstat (limited to 'tools/CMakeLists.txt')
-rw-r--r-- | tools/CMakeLists.txt | 169 |
1 files changed, 130 insertions, 39 deletions
diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 6c276800d1..bf37274e89 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -1,37 +1,39 @@ #------------------------------------------------------------------------------- -# Copyright (c) 2020-2021, Arm Limited. All rights reserved. +# Copyright (c) 2020-2023, Arm Limited. All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause # #------------------------------------------------------------------------------- -cmake_minimum_required(VERSION 3.15) +cmake_minimum_required(VERSION 3.21) find_package(Python3) -############################### Manifest declaration ########################### +############################### Manifest lists declaration ##################### +list(APPEND MANIFEST_LISTS ${TFM_MANIFEST_LIST}) -get_filename_component(list_name ${TFM_MANIFEST_LIST} NAME) -configure_file(${TFM_MANIFEST_LIST} ${CMAKE_CURRENT_BINARY_DIR}/${list_name}) - -set(MANIFEST_LISTS ${CMAKE_CURRENT_BINARY_DIR}/${list_name}) -set(MANIFEST_LISTS ${MANIFEST_LISTS} ${TFM_EXTRA_MANIFEST_LIST_PATH}) - -if ("${TEST_PSA_API}" STREQUAL "IPC") - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/tfm_psa_ff_test_manifest_list.yaml - ${CMAKE_CURRENT_BINARY_DIR}/tfm_psa_ff_test_manifest_list.yaml) +if (TFM_EXTRA_MANIFEST_LIST_FILES) + list(APPEND MANIFEST_LISTS ${TFM_EXTRA_MANIFEST_LIST_FILES}) +endif() - set(MANIFEST_LISTS ${MANIFEST_LISTS} ${CMAKE_CURRENT_BINARY_DIR}/tfm_psa_ff_test_manifest_list.yaml) +if (TFM_EXTRAS_REPO_EXTRA_MANIFEST_LIST) + set(TMP_MANIFEST_LISTS ${TFM_EXTRAS_REPO_EXTRA_MANIFEST_LIST}) + list(TRANSFORM TMP_MANIFEST_LISTS PREPEND ${TFM_EXTRAS_REPO_PATH}/) + list(APPEND MANIFEST_LISTS ${TMP_MANIFEST_LISTS}) endif() -############################### File list declaration ########################## +# Remove any duplicate entries to prevent same path appended twice in case of mulitiple runs +list(REMOVE_DUPLICATES MANIFEST_LISTS) +list(REMOVE_DUPLICATES TFM_EXTRA_GENERATED_FILE_LIST_PATH) +############################### File list declaration ########################## set(GENERATED_FILE_LISTS ${CMAKE_CURRENT_SOURCE_DIR}/tfm_generated_file_list.yaml) set(GENERATED_FILE_LISTS ${GENERATED_FILE_LISTS} ${TFM_EXTRA_GENERATED_FILE_LIST_PATH}) -############################### Dependency generation ########################## - +############################### Functions declaration ########################## +# Parses the given YAML "files" to find out all the items of the given "field" +# and put them to the "output_variable" as a list. function(parse_field_from_yaml files field output_variable) - set(${output_variable} "" PARENT_SCOPE) + set(local_variable "") foreach(yaml_file ${files}) # Load the lines that refer to the key we selected file(STRINGS ${yaml_file} temp_variable REGEX " *\"${field}\":") @@ -41,21 +43,97 @@ function(parse_field_from_yaml files field output_variable) list(TRANSFORM temp_variable REPLACE "," "") # Remove all quote marks list(TRANSFORM temp_variable REPLACE "\"" "") - set(${output_variable} ${${output_variable}} ${temp_variable} PARENT_SCOPE) + list(APPEND local_variable ${temp_variable}) endforeach() + set(${output_variable} ${local_variable} PARENT_SCOPE) endfunction() +############################### Dependency generation ########################## +# Get all the manifest files from manifest lists +foreach(MANIFEST_LIST ${MANIFEST_LISTS}) + if (NOT EXISTS ${MANIFEST_LIST}) + message(FATAL_ERROR "Manifest list ${MANIFEST_LIST} doesn't exist") + endif() + + + # Get the path of the manifest list + get_filename_component(MANIFEST_LIST_PATH ${MANIFEST_LIST} DIRECTORY) + + # Get all the "manifest" + parse_field_from_yaml(${MANIFEST_LIST} manifest MANIFESTS) + + foreach(MANIFEST ${MANIFESTS}) + # Convert to absolute paths + if (NOT IS_ABSOLUTE ${MANIFEST}) + # First try relative to the manifest + if (EXISTS "${MANIFEST_LIST_PATH}/${MANIFEST}") + get_filename_component(MANIFEST "${MANIFEST_LIST_PATH}/${MANIFEST}" ABSOLUTE) + # Then try relative to the root TF-M source directory + elseif (EXISTS "${CMAKE_SOURCE_DIR}/${MANIFEST}") + get_filename_component(MANIFEST "${CMAKE_SOURCE_DIR}/${MANIFEST}" ABSOLUTE) + endif() + endif() + list(APPEND MANIFEST_FILES ${MANIFEST}) + endforeach() +endforeach() + parse_field_from_yaml("${GENERATED_FILE_LISTS}" template TEMPLATE_FILES) # Replace relative paths with absolute paths +# Paths used in GENERATED_FILE_LISTS are all relative to TF-M root (${CMAKE_SOURCE_DIR}) list(TRANSFORM TEMPLATE_FILES REPLACE "^([^/\\][^:].*)" "${CMAKE_SOURCE_DIR}/\\1") +# Append the fixed templates that are not in the GENERATED_FILE_LISTS +list(APPEND TEMPLATE_FILES + ${CMAKE_CURRENT_SOURCE_DIR}/templates/manifestfilename.template + ${CMAKE_CURRENT_SOURCE_DIR}/templates/partition_intermedia.template + ${CMAKE_CURRENT_SOURCE_DIR}/templates/partition_load_info.template + ${CMAKE_CURRENT_SOURCE_DIR}/config_impl.cmake.template +) -parse_field_from_yaml("${GENERATED_FILE_LISTS}" output OUTPUT_FILES) -# Replace relative paths with absolute paths -list(TRANSFORM OUTPUT_FILES REPLACE "^([^/\\][^:].*)" "${CMAKE_BINARY_DIR}/generated/\\1") +############################### Generate Manifest config header ################ + +# The function appends the given `config` to the `out_var` variable. +# Supported `type` are [BOOL, STRING]. +# The format of contents appended is +# #cmakedefine01 config for BOOL types +# #cmakedefine config @config@ for STRING types +function(append_manifest_config out_var config type) + # Operate on a local var and write back to the out_var later + set(local_var ${${out_var}}) + + # Avoid duplications of configs + string(FIND "${local_var}" ${config} config_exists) + if(${config_exists} EQUAL -1) # Not found + if (${type} STREQUAL "BOOL") + string(APPEND local_var "#cmakedefine01 ${config}\r\n") + elseif(${type} STREQUAL "STRING") + string(APPEND local_var "#cmakedefine ${config} @${config}@\r\n") + else() + message(FATAL_ERROR "Unsupported config type: ${type}") + endif() + endif() + + set(${out_var} ${local_var} PARENT_SCOPE) +endfunction() -parse_field_from_yaml("${MANIFEST_LISTS}" manifest MANIFEST_FILES) -# Replace relative paths with absolute paths -list(TRANSFORM MANIFEST_FILES REPLACE "^([^/\\][^:].*)" "${CMAKE_SOURCE_DIR}/\\1") +# The following build configurations are required to pass to manifest tool via the config header +# - The isolation level +# - The SPM backend +# - "conditional" attributes for every Secure Partition in manifest lists +append_manifest_config(MANIFEST_CONFIG_H_CONTENT TFM_ISOLATION_LEVEL STRING) +append_manifest_config(MANIFEST_CONFIG_H_CONTENT CONFIG_TFM_SPM_BACKEND STRING) + +parse_field_from_yaml("${MANIFEST_LISTS}" conditional CONDITIONS) +foreach(CON ${CONDITIONS}) + append_manifest_config(MANIFEST_CONFIG_H_CONTENT ${CON} BOOL) +endforeach() + +# Generate the config header +file(WRITE + ${CMAKE_CURRENT_BINARY_DIR}/manifest_config.h.in + ${MANIFEST_CONFIG_H_CONTENT}) + +configure_file(${CMAKE_CURRENT_BINARY_DIR}/manifest_config.h.in + ${CMAKE_CURRENT_BINARY_DIR}/manifest_config.h) ############################### Command declaration ############################ @@ -67,30 +145,43 @@ if ("${TEST_PSA_API}" STREQUAL "IPC") ) endif() -add_custom_target(tfm_generated_files - SOURCES ${OUTPUT_FILES} +if (CONFIG_TFM_PARSE_MANIFEST_QUIET) + set(PARSE_MANIFEST_QUIET_FLAG "-q") +else() + set(PARSE_MANIFEST_QUIET_FLAG "") +endif() + +set(MANIFEST_COMMAND + ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tfm_parse_manifest_list.py + -m ${MANIFEST_LISTS} + -f ${GENERATED_FILE_LISTS} + -c ${CMAKE_CURRENT_BINARY_DIR}/manifest_config.h + -o ${CMAKE_BINARY_DIR}/generated + ${PARSE_MANIFEST_QUIET_FLAG}) + +add_custom_command( + OUTPUT ${CMAKE_BINARY_DIR}/generated + COMMAND ${MANIFEST_COMMAND} + DEPENDS ${MANIFEST_LISTS} ${GENERATED_FILE_LISTS} + ${MANIFEST_FILES} ${TEMPLATE_FILES} ) -add_custom_command(OUTPUT ${OUTPUT_FILES} - COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tfm_parse_manifest_list.py - -m ${MANIFEST_LISTS} - -f ${GENERATED_FILE_LISTS} - -o ${CMAKE_BINARY_DIR}/generated - DEPENDS ${TEMPLATE_FILES} ${MANIFEST_FILES} - DEPENDS ${MANIFEST_LISTS} +add_custom_target( + manifest_tool + DEPENDS ${CMAKE_BINARY_DIR}/generated ) # The files need to be generated before cmake will allow them to be used as # sources. Due to issue with custom_command scoping the easiest way to do this # is to run the script at cmake-time. execute_process( - COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tfm_parse_manifest_list.py - -m ${MANIFEST_LISTS} - -f ${GENERATED_FILE_LISTS} - -o ${CMAKE_BINARY_DIR}/generated + COMMAND ${MANIFEST_COMMAND} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} RESULT_VARIABLE RET ) -if(NOT RET EQUAL 0) - message(FATAL_ERROR "File generation failed") +if(RET EQUAL 0) + include(${CMAKE_BINARY_DIR}/generated/tools/config_impl.cmake) +else() + message(FATAL_ERROR "Manifest tool failed to generate files!") endif() |