blob: 03ab24306dea1afcb664ff727bd9a3c8f861af58 [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
Raef Colesf42f0882020-07-10 10:01:58 +010029############################### File list declaration ##########################
Raef Colesf42f0882020-07-10 10:01:58 +010030set(GENERATED_FILE_LISTS ${CMAKE_CURRENT_SOURCE_DIR}/tfm_generated_file_list.yaml)
31set(GENERATED_FILE_LISTS ${GENERATED_FILE_LISTS} ${TFM_EXTRA_GENERATED_FILE_LIST_PATH})
32
Kevin Pengfb1761b2022-05-12 12:11:31 +080033############################### Functions declaration ##########################
34# Parses the given YAML "files" to find out all the items of the given "field"
35# and put them to the "output_variable" as a list.
Raef Colesf42f0882020-07-10 10:01:58 +010036function(parse_field_from_yaml files field output_variable)
Kevin Peng1b8177b2021-12-07 15:06:25 +080037 set(local_variable "")
Raef Colesf42f0882020-07-10 10:01:58 +010038 foreach(yaml_file ${files})
39 # Load the lines that refer to the key we selected
40 file(STRINGS ${yaml_file} temp_variable REGEX " *\"${field}\":")
41 # Take only the value of the key
42 list(TRANSFORM temp_variable REPLACE " *\"${field}\": *" ";")
43 # Remove all commas
44 list(TRANSFORM temp_variable REPLACE "," "")
45 # Remove all quote marks
46 list(TRANSFORM temp_variable REPLACE "\"" "")
Kevin Peng1b8177b2021-12-07 15:06:25 +080047 list(APPEND local_variable ${temp_variable})
Raef Colesf42f0882020-07-10 10:01:58 +010048 endforeach()
Kevin Peng1b8177b2021-12-07 15:06:25 +080049 set(${output_variable} ${local_variable} PARENT_SCOPE)
Raef Colesf42f0882020-07-10 10:01:58 +010050endfunction()
51
Kevin Pengfb1761b2022-05-12 12:11:31 +080052############################### Dependency generation ##########################
53# Get all the manifest files from manifest lists
54foreach(MANIFEST_LIST ${MANIFEST_LISTS})
55 if (NOT EXISTS ${MANIFEST_LIST})
56 message(FATAL_ERROR "Manifest list ${MANIFEST_LIST} doesn't exist")
57 endif()
58
59 # Get the path of the manifest list
60 get_filename_component(MANIFEST_LIST_PATH ${MANIFEST_LIST} DIRECTORY)
61
62 # Get all the "manifest"
63 parse_field_from_yaml(${MANIFEST_LIST} manifest MANIFESTS)
64
65 foreach(MANIFEST ${MANIFESTS})
66 # Convert to absolute paths
67 if (NOT IS_ABSOLUTE ${MANIFEST})
68 get_filename_component(MANIFEST "${MANIFEST_LIST_PATH}/${MANIFEST}" ABSOLUTE)
69 endif()
70 list(APPEND MANIFEST_FILES ${MANIFEST})
71 endforeach()
72endforeach()
73
Raef Colesf42f0882020-07-10 10:01:58 +010074parse_field_from_yaml("${GENERATED_FILE_LISTS}" template TEMPLATE_FILES)
75# Replace relative paths with absolute paths
Kevin Peng1b8177b2021-12-07 15:06:25 +080076# Paths used in GENERATED_FILE_LISTS are all relative to TF-M root (${CMAKE_SOURCE_DIR})
Ken Liua2ac1f92020-10-12 10:58:21 +080077list(TRANSFORM TEMPLATE_FILES REPLACE "^([^/\\][^:].*)" "${CMAKE_SOURCE_DIR}/\\1")
Raef Colesf42f0882020-07-10 10:01:58 +010078
79parse_field_from_yaml("${GENERATED_FILE_LISTS}" output OUTPUT_FILES)
80# Replace relative paths with absolute paths
Kevin Peng1b8177b2021-12-07 15:06:25 +080081# Paths used in GENERATED_FILE_LISTS are all relative to TF-M root (${CMAKE_SOURCE_DIR})
Ken Liua2ac1f92020-10-12 10:58:21 +080082list(TRANSFORM OUTPUT_FILES REPLACE "^([^/\\][^:].*)" "${CMAKE_BINARY_DIR}/generated/\\1")
Raef Colesf42f0882020-07-10 10:01:58 +010083
Kevin Pengfb1761b2022-05-12 12:11:31 +080084############################### Generate Manifest config header ################
85parse_field_from_yaml("${MANIFEST_LISTS}" conditional CONDITIONS)
Kevin Peng1b8177b2021-12-07 15:06:25 +080086
Kevin Pengfb1761b2022-05-12 12:11:31 +080087# Isolation level and backend are required by the manifest tool
88string(APPEND MANIFEST_CONFIG_H_CONTENT
89 "#cmakedefine TFM_ISOLATION_LEVEL @TFM_ISOLATION_LEVEL@\r\n")
90string(APPEND MANIFEST_CONFIG_H_CONTENT
91 "#cmakedefine CONFIG_TFM_SPM_BACKEND @CONFIG_TFM_SPM_BACKEND@\r\n")
Kevin Peng1b8177b2021-12-07 15:06:25 +080092
Kevin Pengfb1761b2022-05-12 12:11:31 +080093foreach(CON ${CONDITIONS})
94 # Secure Partitions may share the same conditions, perform duplication check here
95 string(FIND ${MANIFEST_CONFIG_H_CONTENT} ${CON} CON_EXISTS)
96 if (${CON_EXISTS} EQUAL -1) # Not found
97 string(APPEND MANIFEST_CONFIG_H_CONTENT
98 "#cmakedefine01 ${CON}\r\n")
99 endif()
Kevin Peng1b8177b2021-12-07 15:06:25 +0800100endforeach()
Raef Colesf42f0882020-07-10 10:01:58 +0100101
Kevin Pengfb1761b2022-05-12 12:11:31 +0800102# Generate the config header
103file(WRITE
104 ${CMAKE_CURRENT_BINARY_DIR}/manifest_config.h.in
105 ${MANIFEST_CONFIG_H_CONTENT})
106
107configure_file(${CMAKE_CURRENT_BINARY_DIR}/manifest_config.h.in
108 ${CMAKE_CURRENT_BINARY_DIR}/manifest_config.h)
109
Raef Colesf42f0882020-07-10 10:01:58 +0100110############################### Command declaration ############################
111
112# Workaround for heap support
113if ("${TEST_PSA_API}" STREQUAL "IPC")
114 execute_process(
115 WORKING_DIRECTORY ${PSA_ARCH_TESTS_PATH}/api-tests
116 COMMAND ${Python3_EXECUTABLE} tools/scripts/manifest_update.py
117 )
118endif()
119
Raef Colese43c0202020-09-28 14:11:53 +0100120add_custom_target(tfm_generated_files
121 SOURCES ${OUTPUT_FILES}
Raef Colesf42f0882020-07-10 10:01:58 +0100122)
123
Kevin Pengc32279d2022-02-10 11:11:55 +0800124if (CONFIG_TFM_PARSE_MANIFEST_QUIET)
Jimmy Brisson89d4f8d2021-06-23 10:17:36 -0500125 set(PARSE_MANIFEST_QUIET_FLAG "-q")
126else()
127 set(PARSE_MANIFEST_QUIET_FLAG "")
128endif()
129
Kevin Peng3dd051c2022-07-13 11:02:03 +0800130set(MANIFEST_COMMAND
131 ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tfm_parse_manifest_list.py
Kevin Pengfb1761b2022-05-12 12:11:31 +0800132 -m ${MANIFEST_LISTS}
Kevin Peng3dd051c2022-07-13 11:02:03 +0800133 -f ${GENERATED_FILE_LISTS}
Kevin Pengfb1761b2022-05-12 12:11:31 +0800134 -c ${CMAKE_CURRENT_BINARY_DIR}/manifest_config.h
Kevin Peng3dd051c2022-07-13 11:02:03 +0800135 -o ${CMAKE_BINARY_DIR}/generated
136 ${PARSE_MANIFEST_QUIET_FLAG})
137
Raef Colesf42f0882020-07-10 10:01:58 +0100138add_custom_command(OUTPUT ${OUTPUT_FILES}
Kevin Peng3dd051c2022-07-13 11:02:03 +0800139 COMMAND ${MANIFEST_COMMAND}
Raef Colesf42f0882020-07-10 10:01:58 +0100140 DEPENDS ${TEMPLATE_FILES} ${MANIFEST_FILES}
Kevin Pengfb1761b2022-05-12 12:11:31 +0800141 DEPENDS ${MANIFEST_LISTS} ${GENERATED_FILE_LISTS}
Raef Colesf42f0882020-07-10 10:01:58 +0100142)
143
144# The files need to be generated before cmake will allow them to be used as
145# sources. Due to issue with custom_command scoping the easiest way to do this
Raef Colese43c0202020-09-28 14:11:53 +0100146# is to run the script at cmake-time.
147execute_process(
Kevin Peng3dd051c2022-07-13 11:02:03 +0800148 COMMAND ${MANIFEST_COMMAND}
Raef Colese43c0202020-09-28 14:11:53 +0100149 RESULT_VARIABLE RET
150)
151
Sherry Zhangf58f2bd2022-01-10 17:21:11 +0800152if(RET EQUAL 0)
153 include(${CMAKE_BINARY_DIR}/generated/tools/config_impl.cmake)
154else()
Kevin Pengfb1761b2022-05-12 12:11:31 +0800155 message(FATAL_ERROR "Manifest tool failed to generate files!")
Raef Colesf42f0882020-07-10 10:01:58 +0100156endif()