blob: d6e5e113b8bf31169a2b3e339720f0727b735ab6 [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
88parse_field_from_yaml("${GENERATED_FILE_LISTS}" output OUTPUT_FILES)
89# Replace relative paths with absolute paths
Kevin Peng1b8177b2021-12-07 15:06:25 +080090# Paths used in GENERATED_FILE_LISTS are all relative to TF-M root (${CMAKE_SOURCE_DIR})
Ken Liua2ac1f92020-10-12 10:58:21 +080091list(TRANSFORM OUTPUT_FILES REPLACE "^([^/\\][^:].*)" "${CMAKE_BINARY_DIR}/generated/\\1")
Raef Colesf42f0882020-07-10 10:01:58 +010092
Kevin Pengfb1761b2022-05-12 12:11:31 +080093############################### Generate Manifest config header ################
Kevin Peng93efad02022-08-01 17:58:13 +080094
95# The function appends the given `config` to the `out_var` variable.
96# Supported `type` are [BOOL, STRING].
97# The format of contents appended is
98# #cmakedefine01 config for BOOL types
99# #cmakedefine config @config@ for STRING types
100function(append_manifest_config out_var config type)
101 # Operate on a local var and write back to the out_var later
102 set(local_var ${${out_var}})
103
104 # Avoid duplications of configs
105 string(FIND "${local_var}" ${config} config_exists)
106 if(${config_exists} EQUAL -1) # Not found
107 if (${type} STREQUAL "BOOL")
108 string(APPEND local_var "#cmakedefine01 ${config}\r\n")
109 elseif(${type} STREQUAL "STRING")
110 string(APPEND local_var "#cmakedefine ${config} @${config}@\r\n")
111 else()
112 message(FATAL_ERROR "Unsupported config type: ${type}")
113 endif()
114 endif()
115
116 set(${out_var} ${local_var} PARENT_SCOPE)
117endfunction()
118
119# The following build configurations are required to pass to manifest tool via the config header
120# - The isolation level
121# - The SPM backend
122# - "conditional" attributes for every Secure Partition in manifest lists
123# - "stack_size" in manifests
124# - "heap_size" in manifests
125append_manifest_config(MANIFEST_CONFIG_H_CONTENT TFM_ISOLATION_LEVEL STRING)
126append_manifest_config(MANIFEST_CONFIG_H_CONTENT CONFIG_TFM_SPM_BACKEND STRING)
127
Kevin Pengfb1761b2022-05-12 12:11:31 +0800128parse_field_from_yaml("${MANIFEST_LISTS}" conditional CONDITIONS)
Kevin Pengfb1761b2022-05-12 12:11:31 +0800129foreach(CON ${CONDITIONS})
Kevin Peng93efad02022-08-01 17:58:13 +0800130 append_manifest_config(MANIFEST_CONFIG_H_CONTENT ${CON} BOOL)
131endforeach()
132
133parse_field_from_yaml("${MANIFEST_FILES}" stack_size STACK_SIZES)
134foreach(STK_SIZE ${STACK_SIZES})
135 if (NOT STK_SIZE GREATER 0)
136 # The "stack_size" might not be a valid number. Treat it as a configuration
137 append_manifest_config(MANIFEST_CONFIG_H_CONTENT ${STK_SIZE} STRING)
138 endif()
139endforeach()
140
141parse_field_from_yaml("${MANIFEST_FILES}" heap_size HEAP_SIZES)
142foreach(HEAP_SIZE ${HEAP_SIZES})
143 if (NOT HEAP_SIZE GREATER 0)
144 # The "heap_size" might not be a valid number. Treat it as a configuration
145 append_manifest_config(MANIFEST_CONFIG_H_CONTENT ${HEAP_SIZE} STRING)
Kevin Pengfb1761b2022-05-12 12:11:31 +0800146 endif()
Kevin Peng1b8177b2021-12-07 15:06:25 +0800147endforeach()
Raef Colesf42f0882020-07-10 10:01:58 +0100148
Kevin Pengfb1761b2022-05-12 12:11:31 +0800149# Generate the config header
150file(WRITE
151 ${CMAKE_CURRENT_BINARY_DIR}/manifest_config.h.in
152 ${MANIFEST_CONFIG_H_CONTENT})
153
154configure_file(${CMAKE_CURRENT_BINARY_DIR}/manifest_config.h.in
155 ${CMAKE_CURRENT_BINARY_DIR}/manifest_config.h)
156
Raef Colesf42f0882020-07-10 10:01:58 +0100157############################### Command declaration ############################
158
159# Workaround for heap support
160if ("${TEST_PSA_API}" STREQUAL "IPC")
161 execute_process(
162 WORKING_DIRECTORY ${PSA_ARCH_TESTS_PATH}/api-tests
163 COMMAND ${Python3_EXECUTABLE} tools/scripts/manifest_update.py
164 )
165endif()
166
Raef Colese43c0202020-09-28 14:11:53 +0100167add_custom_target(tfm_generated_files
168 SOURCES ${OUTPUT_FILES}
Raef Colesf42f0882020-07-10 10:01:58 +0100169)
170
Kevin Pengc32279d2022-02-10 11:11:55 +0800171if (CONFIG_TFM_PARSE_MANIFEST_QUIET)
Jimmy Brisson89d4f8d2021-06-23 10:17:36 -0500172 set(PARSE_MANIFEST_QUIET_FLAG "-q")
173else()
174 set(PARSE_MANIFEST_QUIET_FLAG "")
175endif()
176
Kevin Peng3dd051c2022-07-13 11:02:03 +0800177set(MANIFEST_COMMAND
178 ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tfm_parse_manifest_list.py
Kevin Pengfb1761b2022-05-12 12:11:31 +0800179 -m ${MANIFEST_LISTS}
Kevin Peng3dd051c2022-07-13 11:02:03 +0800180 -f ${GENERATED_FILE_LISTS}
Kevin Pengfb1761b2022-05-12 12:11:31 +0800181 -c ${CMAKE_CURRENT_BINARY_DIR}/manifest_config.h
Kevin Peng3dd051c2022-07-13 11:02:03 +0800182 -o ${CMAKE_BINARY_DIR}/generated
183 ${PARSE_MANIFEST_QUIET_FLAG})
184
Raef Colesf42f0882020-07-10 10:01:58 +0100185add_custom_command(OUTPUT ${OUTPUT_FILES}
Kevin Peng3dd051c2022-07-13 11:02:03 +0800186 COMMAND ${MANIFEST_COMMAND}
Raef Colesf42f0882020-07-10 10:01:58 +0100187 DEPENDS ${TEMPLATE_FILES} ${MANIFEST_FILES}
Kevin Pengfb1761b2022-05-12 12:11:31 +0800188 DEPENDS ${MANIFEST_LISTS} ${GENERATED_FILE_LISTS}
Raef Colesf42f0882020-07-10 10:01:58 +0100189)
190
191# The files need to be generated before cmake will allow them to be used as
192# sources. Due to issue with custom_command scoping the easiest way to do this
Raef Colese43c0202020-09-28 14:11:53 +0100193# is to run the script at cmake-time.
194execute_process(
Kevin Peng3dd051c2022-07-13 11:02:03 +0800195 COMMAND ${MANIFEST_COMMAND}
Raef Colese43c0202020-09-28 14:11:53 +0100196 RESULT_VARIABLE RET
197)
198
Sherry Zhangf58f2bd2022-01-10 17:21:11 +0800199if(RET EQUAL 0)
200 include(${CMAKE_BINARY_DIR}/generated/tools/config_impl.cmake)
201else()
Kevin Pengfb1761b2022-05-12 12:11:31 +0800202 message(FATAL_ERROR "Manifest tool failed to generate files!")
Raef Colesf42f0882020-07-10 10:01:58 +0100203endif()