blob: 6c3033dddf7d0c52fffb3d489e28a2d4979b1a4e [file] [log] [blame]
Raef Colesf42f0882020-07-10 10:01:58 +01001#-------------------------------------------------------------------------------
Raef Colesd97a7e72021-12-10 14:58:06 +00002# Copyright (c) 2020-2022, Arm Limited. All rights reserved.
Raef Colesf42f0882020-07-10 10:01:58 +01003#
4# SPDX-License-Identifier: BSD-3-Clause
5#
6#-------------------------------------------------------------------------------
7
Raef Coles69817322020-10-19 14:14:14 +01008cmake_minimum_required(VERSION 3.15)
Raef Colesf42f0882020-07-10 10:01:58 +01009find_package(Python3)
10
Kevin Pengfb1761b2022-05-12 12:11:31 +080011############################### Manifest lists declaration #####################
12list(APPEND MANIFEST_LISTS ${TFM_MANIFEST_LIST})
David Hub2694202021-07-15 14:58:39 +080013
David Hu12f25872021-08-23 14:55:46 +080014if (TFM_NS_REG_TEST OR TFM_S_REG_TEST)
Kevin Pengfb1761b2022-05-12 12:11:31 +080015 list(APPEND MANIFEST_LISTS ${TFM_TEST_PATH}/secure_fw/tfm_test_manifest_list.yaml)
Kevin Peng65064c52021-10-27 17:12:17 +080016endif()
17
18if ("${TEST_PSA_API}" STREQUAL "IPC")
Kevin Pengfb1761b2022-05-12 12:11:31 +080019 # The manifest tool does not recognize CMake varibles. Do configure_file() first.
20 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/tfm_psa_ff_test_manifest_list.yaml
21 ${CMAKE_CURRENT_BINARY_DIR}/tfm_psa_ff_test_manifest_list.yaml)
22 list(APPEND MANIFEST_LISTS ${CMAKE_CURRENT_BINARY_DIR}/tfm_psa_ff_test_manifest_list.yaml)
David Hub2694202021-07-15 14:58:39 +080023endif()
Raef Colesf42f0882020-07-10 10:01:58 +010024
David Huf5f12092021-07-12 16:11:47 +080025if (TFM_EXTRA_MANIFEST_LIST_FILES)
Kevin Pengfb1761b2022-05-12 12:11:31 +080026 list(APPEND MANIFEST_LISTS ${TFM_EXTRA_MANIFEST_LIST_FILES})
David Huf5f12092021-07-12 16:11:47 +080027endif()
28
Maulik Patel7cfee4a2022-07-19 09:39:38 +010029if (TFM_EXTRAS_REPO_EXTRA_MANIFEST_LIST)
30 set(TMP_MANIFEST_LISTS ${TFM_EXTRAS_REPO_EXTRA_MANIFEST_LIST})
31 list(TRANSFORM TMP_MANIFEST_LISTS PREPEND ${TFM_EXTRAS_REPO_PATH}/)
32 list(APPEND MANIFEST_LISTS ${TMP_MANIFEST_LISTS})
33endif()
34
35# Remove any duplicate entries to prevent same path appended twice in case of mulitiple runs
36list(REMOVE_DUPLICATES MANIFEST_LISTS)
37
Raef Colesf42f0882020-07-10 10:01:58 +010038############################### File list declaration ##########################
Raef Colesf42f0882020-07-10 10:01:58 +010039set(GENERATED_FILE_LISTS ${CMAKE_CURRENT_SOURCE_DIR}/tfm_generated_file_list.yaml)
40set(GENERATED_FILE_LISTS ${GENERATED_FILE_LISTS} ${TFM_EXTRA_GENERATED_FILE_LIST_PATH})
41
Kevin Pengfb1761b2022-05-12 12:11:31 +080042############################### Functions declaration ##########################
43# Parses the given YAML "files" to find out all the items of the given "field"
44# and put them to the "output_variable" as a list.
Raef Colesf42f0882020-07-10 10:01:58 +010045function(parse_field_from_yaml files field output_variable)
Kevin Peng1b8177b2021-12-07 15:06:25 +080046 set(local_variable "")
Raef Colesf42f0882020-07-10 10:01:58 +010047 foreach(yaml_file ${files})
48 # Load the lines that refer to the key we selected
49 file(STRINGS ${yaml_file} temp_variable REGEX " *\"${field}\":")
50 # Take only the value of the key
51 list(TRANSFORM temp_variable REPLACE " *\"${field}\": *" ";")
52 # Remove all commas
53 list(TRANSFORM temp_variable REPLACE "," "")
54 # Remove all quote marks
55 list(TRANSFORM temp_variable REPLACE "\"" "")
Kevin Peng1b8177b2021-12-07 15:06:25 +080056 list(APPEND local_variable ${temp_variable})
Raef Colesf42f0882020-07-10 10:01:58 +010057 endforeach()
Kevin Peng1b8177b2021-12-07 15:06:25 +080058 set(${output_variable} ${local_variable} PARENT_SCOPE)
Raef Colesf42f0882020-07-10 10:01:58 +010059endfunction()
60
Kevin Pengfb1761b2022-05-12 12:11:31 +080061############################### Dependency generation ##########################
62# Get all the manifest files from manifest lists
63foreach(MANIFEST_LIST ${MANIFEST_LISTS})
64 if (NOT EXISTS ${MANIFEST_LIST})
65 message(FATAL_ERROR "Manifest list ${MANIFEST_LIST} doesn't exist")
66 endif()
67
68 # Get the path of the manifest list
69 get_filename_component(MANIFEST_LIST_PATH ${MANIFEST_LIST} DIRECTORY)
70
71 # Get all the "manifest"
72 parse_field_from_yaml(${MANIFEST_LIST} manifest MANIFESTS)
73
74 foreach(MANIFEST ${MANIFESTS})
75 # Convert to absolute paths
76 if (NOT IS_ABSOLUTE ${MANIFEST})
77 get_filename_component(MANIFEST "${MANIFEST_LIST_PATH}/${MANIFEST}" ABSOLUTE)
78 endif()
79 list(APPEND MANIFEST_FILES ${MANIFEST})
80 endforeach()
81endforeach()
82
Raef Colesf42f0882020-07-10 10:01:58 +010083parse_field_from_yaml("${GENERATED_FILE_LISTS}" template TEMPLATE_FILES)
84# Replace relative paths with absolute paths
Kevin Peng1b8177b2021-12-07 15:06:25 +080085# Paths used in GENERATED_FILE_LISTS are all relative to TF-M root (${CMAKE_SOURCE_DIR})
Ken Liua2ac1f92020-10-12 10:58:21 +080086list(TRANSFORM TEMPLATE_FILES REPLACE "^([^/\\][^:].*)" "${CMAKE_SOURCE_DIR}/\\1")
Raef Colesf42f0882020-07-10 10:01:58 +010087
Kevin Pengfb1761b2022-05-12 12:11:31 +080088############################### Generate Manifest config header ################
Kevin Peng93efad02022-08-01 17:58:13 +080089
90# The function appends the given `config` to the `out_var` variable.
91# Supported `type` are [BOOL, STRING].
92# The format of contents appended is
93# #cmakedefine01 config for BOOL types
94# #cmakedefine config @config@ for STRING types
95function(append_manifest_config out_var config type)
96 # Operate on a local var and write back to the out_var later
97 set(local_var ${${out_var}})
98
99 # Avoid duplications of configs
100 string(FIND "${local_var}" ${config} config_exists)
101 if(${config_exists} EQUAL -1) # Not found
102 if (${type} STREQUAL "BOOL")
103 string(APPEND local_var "#cmakedefine01 ${config}\r\n")
104 elseif(${type} STREQUAL "STRING")
105 string(APPEND local_var "#cmakedefine ${config} @${config}@\r\n")
106 else()
107 message(FATAL_ERROR "Unsupported config type: ${type}")
108 endif()
109 endif()
110
111 set(${out_var} ${local_var} PARENT_SCOPE)
112endfunction()
113
114# The following build configurations are required to pass to manifest tool via the config header
115# - The isolation level
116# - The SPM backend
117# - "conditional" attributes for every Secure Partition in manifest lists
Kevin Peng93efad02022-08-01 17:58:13 +0800118append_manifest_config(MANIFEST_CONFIG_H_CONTENT TFM_ISOLATION_LEVEL STRING)
119append_manifest_config(MANIFEST_CONFIG_H_CONTENT CONFIG_TFM_SPM_BACKEND STRING)
120
Kevin Pengfb1761b2022-05-12 12:11:31 +0800121parse_field_from_yaml("${MANIFEST_LISTS}" conditional CONDITIONS)
Kevin Pengfb1761b2022-05-12 12:11:31 +0800122foreach(CON ${CONDITIONS})
Kevin Peng93efad02022-08-01 17:58:13 +0800123 append_manifest_config(MANIFEST_CONFIG_H_CONTENT ${CON} BOOL)
124endforeach()
125
Kevin Pengfb1761b2022-05-12 12:11:31 +0800126# Generate the config header
127file(WRITE
128 ${CMAKE_CURRENT_BINARY_DIR}/manifest_config.h.in
129 ${MANIFEST_CONFIG_H_CONTENT})
130
131configure_file(${CMAKE_CURRENT_BINARY_DIR}/manifest_config.h.in
132 ${CMAKE_CURRENT_BINARY_DIR}/manifest_config.h)
133
Raef Colesf42f0882020-07-10 10:01:58 +0100134############################### Command declaration ############################
135
136# Workaround for heap support
137if ("${TEST_PSA_API}" STREQUAL "IPC")
138 execute_process(
139 WORKING_DIRECTORY ${PSA_ARCH_TESTS_PATH}/api-tests
140 COMMAND ${Python3_EXECUTABLE} tools/scripts/manifest_update.py
141 )
142endif()
143
Kevin Pengc32279d2022-02-10 11:11:55 +0800144if (CONFIG_TFM_PARSE_MANIFEST_QUIET)
Jimmy Brisson89d4f8d2021-06-23 10:17:36 -0500145 set(PARSE_MANIFEST_QUIET_FLAG "-q")
146else()
147 set(PARSE_MANIFEST_QUIET_FLAG "")
148endif()
149
Kevin Peng3dd051c2022-07-13 11:02:03 +0800150set(MANIFEST_COMMAND
151 ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tfm_parse_manifest_list.py
Kevin Pengfb1761b2022-05-12 12:11:31 +0800152 -m ${MANIFEST_LISTS}
Kevin Peng3dd051c2022-07-13 11:02:03 +0800153 -f ${GENERATED_FILE_LISTS}
Kevin Pengfb1761b2022-05-12 12:11:31 +0800154 -c ${CMAKE_CURRENT_BINARY_DIR}/manifest_config.h
Kevin Peng3dd051c2022-07-13 11:02:03 +0800155 -o ${CMAKE_BINARY_DIR}/generated
156 ${PARSE_MANIFEST_QUIET_FLAG})
157
Raef Colesf42f0882020-07-10 10:01:58 +0100158# The files need to be generated before cmake will allow them to be used as
159# sources. Due to issue with custom_command scoping the easiest way to do this
Raef Colese43c0202020-09-28 14:11:53 +0100160# is to run the script at cmake-time.
161execute_process(
Kevin Peng3dd051c2022-07-13 11:02:03 +0800162 COMMAND ${MANIFEST_COMMAND}
Raef Colese43c0202020-09-28 14:11:53 +0100163 RESULT_VARIABLE RET
164)
165
Sherry Zhangf58f2bd2022-01-10 17:21:11 +0800166if(RET EQUAL 0)
167 include(${CMAKE_BINARY_DIR}/generated/tools/config_impl.cmake)
168else()
Kevin Pengfb1761b2022-05-12 12:11:31 +0800169 message(FATAL_ERROR "Manifest tool failed to generate files!")
Raef Colesf42f0882020-07-10 10:01:58 +0100170endif()