blob: bf8ee8f84b9a9a92ea1ca08a41f58c65c18c0449 [file] [log] [blame]
Raef Colesf42f0882020-07-10 10:01:58 +01001#-------------------------------------------------------------------------------
Kevin Peng38800662021-07-14 10:28:23 +08002# Copyright (c) 2020-2021, 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
11############################### Manifest declaration ###########################
12
Kevin Peng65064c52021-10-27 17:12:17 +080013list(APPEND TEMP_MANIFEST_LISTS ${TFM_MANIFEST_LIST})
David Hub2694202021-07-15 14:58:39 +080014
David Hu12f25872021-08-23 14:55:46 +080015if (TFM_NS_REG_TEST OR TFM_S_REG_TEST)
Kevin Peng65064c52021-10-27 17:12:17 +080016 list(APPEND TEMP_MANIFEST_LISTS ${TFM_TEST_PATH}/test_services/tfm_test_manifest_list.yaml)
17endif()
18
19if ("${TEST_PSA_API}" STREQUAL "IPC")
20 list(APPEND TEMP_MANIFEST_LISTS ${CMAKE_CURRENT_SOURCE_DIR}/tfm_psa_ff_test_manifest_list.yaml)
David Hub2694202021-07-15 14:58:39 +080021endif()
Raef Colesf42f0882020-07-10 10:01:58 +010022
David Huf5f12092021-07-12 16:11:47 +080023if (TFM_EXTRA_MANIFEST_LIST_FILES)
Kevin Peng65064c52021-10-27 17:12:17 +080024 list(APPEND TEMP_MANIFEST_LISTS ${TFM_EXTRA_MANIFEST_LIST_FILES})
David Huf5f12092021-07-12 16:11:47 +080025endif()
26
Kevin Peng65064c52021-10-27 17:12:17 +080027# Build up the manifest list array
28# Each manifest list occupies two elements in manifest list array:
David Huf5f12092021-07-12 16:11:47 +080029# - Manifest list path under build directory after configure_file()
30# - The original path of manifest list in source directory. It can be used to
31# build up manifest file path if manifest file path is a relative one in
32# manifest list.
33set(POSTFIX 1)
34
Kevin Peng65064c52021-10-27 17:12:17 +080035foreach(MANIFEST_LIST IN LISTS TEMP_MANIFEST_LISTS)
David Huf5f12092021-07-12 16:11:47 +080036 if (NOT EXISTS ${MANIFEST_LIST})
Kevin Peng65064c52021-10-27 17:12:17 +080037 message(FATAL_ERROR "Manifest list ${MANIFEST_LIST} doesn't exist")
David Huf5f12092021-07-12 16:11:47 +080038 endif()
39
40 get_filename_component(MANIFEST_LIST_NAME ${MANIFEST_LIST} NAME_WLE)
41 set(TEMP_MANIFEST_LIST
42 ${CMAKE_CURRENT_BINARY_DIR}/${MANIFEST_LIST_NAME}_${POSTFIX}.yaml)
43
44 configure_file(${MANIFEST_LIST} ${TEMP_MANIFEST_LIST})
Kevin Peng65064c52021-10-27 17:12:17 +080045 list(APPEND MANIFEST_LISTS ${TEMP_MANIFEST_LIST})
David Huf5f12092021-07-12 16:11:47 +080046
47 get_filename_component(MANIFEST_LIST_PATH ${MANIFEST_LIST} DIRECTORY)
Kevin Peng65064c52021-10-27 17:12:17 +080048 # Append the original path of the manifest list.
49 list(APPEND MANIFEST_LISTS ${MANIFEST_LIST_PATH})
David Huf5f12092021-07-12 16:11:47 +080050
51 math(EXPR POSTFIX "${POSTFIX} + 1")
52endforeach()
53
Raef Colesf42f0882020-07-10 10:01:58 +010054############################### File list declaration ##########################
55
56set(GENERATED_FILE_LISTS ${CMAKE_CURRENT_SOURCE_DIR}/tfm_generated_file_list.yaml)
57set(GENERATED_FILE_LISTS ${GENERATED_FILE_LISTS} ${TFM_EXTRA_GENERATED_FILE_LIST_PATH})
58
59############################### Dependency generation ##########################
60
61function(parse_field_from_yaml files field output_variable)
62 set(${output_variable} "" PARENT_SCOPE)
63 foreach(yaml_file ${files})
64 # Load the lines that refer to the key we selected
65 file(STRINGS ${yaml_file} temp_variable REGEX " *\"${field}\":")
66 # Take only the value of the key
67 list(TRANSFORM temp_variable REPLACE " *\"${field}\": *" ";")
68 # Remove all commas
69 list(TRANSFORM temp_variable REPLACE "," "")
70 # Remove all quote marks
71 list(TRANSFORM temp_variable REPLACE "\"" "")
72 set(${output_variable} ${${output_variable}} ${temp_variable} PARENT_SCOPE)
73 endforeach()
74endfunction()
75
76parse_field_from_yaml("${GENERATED_FILE_LISTS}" template TEMPLATE_FILES)
77# Replace relative paths with absolute paths
Ken Liua2ac1f92020-10-12 10:58:21 +080078list(TRANSFORM TEMPLATE_FILES REPLACE "^([^/\\][^:].*)" "${CMAKE_SOURCE_DIR}/\\1")
Raef Colesf42f0882020-07-10 10:01:58 +010079
80parse_field_from_yaml("${GENERATED_FILE_LISTS}" output OUTPUT_FILES)
81# Replace relative paths with absolute paths
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
84parse_field_from_yaml("${MANIFEST_LISTS}" manifest MANIFEST_FILES)
85# Replace relative paths with absolute paths
Ken Liua2ac1f92020-10-12 10:58:21 +080086list(TRANSFORM MANIFEST_FILES REPLACE "^([^/\\][^:].*)" "${CMAKE_SOURCE_DIR}/\\1")
Raef Colesf42f0882020-07-10 10:01:58 +010087
88############################### Command declaration ############################
89
90# Workaround for heap support
91if ("${TEST_PSA_API}" STREQUAL "IPC")
92 execute_process(
93 WORKING_DIRECTORY ${PSA_ARCH_TESTS_PATH}/api-tests
94 COMMAND ${Python3_EXECUTABLE} tools/scripts/manifest_update.py
95 )
96endif()
97
Raef Colese43c0202020-09-28 14:11:53 +010098add_custom_target(tfm_generated_files
99 SOURCES ${OUTPUT_FILES}
Raef Colesf42f0882020-07-10 10:01:58 +0100100)
101
102add_custom_command(OUTPUT ${OUTPUT_FILES}
103 COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tfm_parse_manifest_list.py
104 -m ${MANIFEST_LISTS}
105 -f ${GENERATED_FILE_LISTS}
106 -o ${CMAKE_BINARY_DIR}/generated
107 DEPENDS ${TEMPLATE_FILES} ${MANIFEST_FILES}
108 DEPENDS ${MANIFEST_LISTS}
109)
110
111# The files need to be generated before cmake will allow them to be used as
112# sources. Due to issue with custom_command scoping the easiest way to do this
Raef Colese43c0202020-09-28 14:11:53 +0100113# is to run the script at cmake-time.
114execute_process(
115 COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tfm_parse_manifest_list.py
116 -m ${MANIFEST_LISTS}
117 -f ${GENERATED_FILE_LISTS}
118 -o ${CMAKE_BINARY_DIR}/generated
119 RESULT_VARIABLE RET
120)
121
122if(NOT RET EQUAL 0)
123 message(FATAL_ERROR "File generation failed")
Raef Colesf42f0882020-07-10 10:01:58 +0100124endif()