blob: 574643c665b948462b93ec69a803a0d9e7b0edf2 [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 Peng38800662021-07-14 10:28:23 +080013get_filename_component(list_name ${TFM_MANIFEST_LIST} NAME)
14configure_file(${TFM_MANIFEST_LIST} ${CMAKE_CURRENT_BINARY_DIR}/${list_name})
Raef Colesf42f0882020-07-10 10:01:58 +010015
Kevin Peng38800662021-07-14 10:28:23 +080016set(MANIFEST_LISTS ${CMAKE_CURRENT_BINARY_DIR}/${list_name})
David Hub2694202021-07-15 14:58:39 +080017
David Huf5f12092021-07-12 16:11:47 +080018if (TFM_TEST)
19 list(APPEND TEMP_EXTRA_MANIFEST_LISTS ${TFM_TEST_PATH}/test_services/tfm_test_manifest_list.yaml)
David Hub2694202021-07-15 14:58:39 +080020endif()
Raef Colesf42f0882020-07-10 10:01:58 +010021
David Huf5f12092021-07-12 16:11:47 +080022if (TFM_EXTRA_MANIFEST_LIST_FILES)
23 list(APPEND TEMP_EXTRA_MANIFEST_LISTS ${TFM_EXTRA_MANIFEST_LIST_FILES})
24endif()
25
26# Build up out-of-tree manifest list array
27# Each manifest list occupies two elements in out-of-tree manifest list array:
28# - Manifest list path under build directory after configure_file()
29# - The original path of manifest list in source directory. It can be used to
30# build up manifest file path if manifest file path is a relative one in
31# manifest list.
32set(POSTFIX 1)
33
34foreach(MANIFEST_LIST IN LISTS TEMP_EXTRA_MANIFEST_LISTS)
35 if (NOT EXISTS ${MANIFEST_LIST})
36 message(FATAL_ERROR "Extra manifest list ${MANIFEST_LIST} doesn't exist")
37 endif()
38
39 get_filename_component(MANIFEST_LIST_NAME ${MANIFEST_LIST} NAME_WLE)
40 set(TEMP_MANIFEST_LIST
41 ${CMAKE_CURRENT_BINARY_DIR}/${MANIFEST_LIST_NAME}_${POSTFIX}.yaml)
42
43 configure_file(${MANIFEST_LIST} ${TEMP_MANIFEST_LIST})
44 list(APPEND OUT_OF_TREE_MANIFEST_LIST ${TEMP_MANIFEST_LIST})
45
46 get_filename_component(MANIFEST_LIST_PATH ${MANIFEST_LIST} DIRECTORY)
47 # Append the manifest list original path.
48 # Manifest file path can be a relative one to manifest list.
49 list(APPEND OUT_OF_TREE_MANIFEST_LIST ${MANIFEST_LIST_PATH})
50
51 math(EXPR POSTFIX "${POSTFIX} + 1")
52endforeach()
53
Raef Colesf42f0882020-07-10 10:01:58 +010054if ("${TEST_PSA_API}" STREQUAL "IPC")
Raef Coles558487a2020-10-29 13:09:44 +000055 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/tfm_psa_ff_test_manifest_list.yaml
56 ${CMAKE_CURRENT_BINARY_DIR}/tfm_psa_ff_test_manifest_list.yaml)
Raef Colesf42f0882020-07-10 10:01:58 +010057
58 set(MANIFEST_LISTS ${MANIFEST_LISTS} ${CMAKE_CURRENT_BINARY_DIR}/tfm_psa_ff_test_manifest_list.yaml)
59endif()
60
61############################### File list declaration ##########################
62
63set(GENERATED_FILE_LISTS ${CMAKE_CURRENT_SOURCE_DIR}/tfm_generated_file_list.yaml)
64set(GENERATED_FILE_LISTS ${GENERATED_FILE_LISTS} ${TFM_EXTRA_GENERATED_FILE_LIST_PATH})
65
66############################### Dependency generation ##########################
67
68function(parse_field_from_yaml files field output_variable)
69 set(${output_variable} "" PARENT_SCOPE)
70 foreach(yaml_file ${files})
71 # Load the lines that refer to the key we selected
72 file(STRINGS ${yaml_file} temp_variable REGEX " *\"${field}\":")
73 # Take only the value of the key
74 list(TRANSFORM temp_variable REPLACE " *\"${field}\": *" ";")
75 # Remove all commas
76 list(TRANSFORM temp_variable REPLACE "," "")
77 # Remove all quote marks
78 list(TRANSFORM temp_variable REPLACE "\"" "")
79 set(${output_variable} ${${output_variable}} ${temp_variable} PARENT_SCOPE)
80 endforeach()
81endfunction()
82
83parse_field_from_yaml("${GENERATED_FILE_LISTS}" template TEMPLATE_FILES)
84# Replace relative paths with absolute paths
Ken Liua2ac1f92020-10-12 10:58:21 +080085list(TRANSFORM TEMPLATE_FILES REPLACE "^([^/\\][^:].*)" "${CMAKE_SOURCE_DIR}/\\1")
Raef Colesf42f0882020-07-10 10:01:58 +010086
87parse_field_from_yaml("${GENERATED_FILE_LISTS}" output OUTPUT_FILES)
88# Replace relative paths with absolute paths
Ken Liua2ac1f92020-10-12 10:58:21 +080089list(TRANSFORM OUTPUT_FILES REPLACE "^([^/\\][^:].*)" "${CMAKE_BINARY_DIR}/generated/\\1")
Raef Colesf42f0882020-07-10 10:01:58 +010090
91parse_field_from_yaml("${MANIFEST_LISTS}" manifest MANIFEST_FILES)
92# Replace relative paths with absolute paths
Ken Liua2ac1f92020-10-12 10:58:21 +080093list(TRANSFORM MANIFEST_FILES REPLACE "^([^/\\][^:].*)" "${CMAKE_SOURCE_DIR}/\\1")
Raef Colesf42f0882020-07-10 10:01:58 +010094
95############################### Command declaration ############################
96
97# Workaround for heap support
98if ("${TEST_PSA_API}" STREQUAL "IPC")
99 execute_process(
100 WORKING_DIRECTORY ${PSA_ARCH_TESTS_PATH}/api-tests
101 COMMAND ${Python3_EXECUTABLE} tools/scripts/manifest_update.py
102 )
103endif()
104
Raef Colese43c0202020-09-28 14:11:53 +0100105add_custom_target(tfm_generated_files
106 SOURCES ${OUTPUT_FILES}
Raef Colesf42f0882020-07-10 10:01:58 +0100107)
108
109add_custom_command(OUTPUT ${OUTPUT_FILES}
110 COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tfm_parse_manifest_list.py
111 -m ${MANIFEST_LISTS}
112 -f ${GENERATED_FILE_LISTS}
113 -o ${CMAKE_BINARY_DIR}/generated
David Hub2694202021-07-15 14:58:39 +0800114 -e ${OUT_OF_TREE_MANIFEST_LIST}
Raef Colesf42f0882020-07-10 10:01:58 +0100115 DEPENDS ${TEMPLATE_FILES} ${MANIFEST_FILES}
116 DEPENDS ${MANIFEST_LISTS}
117)
118
119# The files need to be generated before cmake will allow them to be used as
120# sources. Due to issue with custom_command scoping the easiest way to do this
Raef Colese43c0202020-09-28 14:11:53 +0100121# is to run the script at cmake-time.
122execute_process(
123 COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tfm_parse_manifest_list.py
124 -m ${MANIFEST_LISTS}
125 -f ${GENERATED_FILE_LISTS}
126 -o ${CMAKE_BINARY_DIR}/generated
David Hub2694202021-07-15 14:58:39 +0800127 -e ${OUT_OF_TREE_MANIFEST_LIST}
Raef Colese43c0202020-09-28 14:11:53 +0100128 RESULT_VARIABLE RET
129)
130
131if(NOT RET EQUAL 0)
132 message(FATAL_ERROR "File generation failed")
Raef Colesf42f0882020-07-10 10:01:58 +0100133endif()