1# Copyright (c) 2020-2022, Arm Limited and Contributors. All rights reserved.
2#
3# SPDX-License-Identifier: BSD-3-Clause
4#
5#-------------------------------------------------------------------------------
6
7#[===[.rst:
8Add build components to the current build.
9------------------------------------------
10
11#]===]
12
13
14#[===[.rst:
15.. cmake:command:: add_components
16
17	.. code:: cmake
18
19		add_components(TARGET <target name> COMPONENTS <list of component directories>)
20
21	INPUTS:
22
23	``BASE_DIR``
24	If defined components are include relative to this directory. If nor paths must be
25	relative to CMAKE_SOURCE_DIR or be absolute.
26
27	``TARGET``
28	The name of an already defined target to add components to.
29
30	``COMPONENTS``
31	List of components relative to :cmake:variable:`CMAKE_SOURCE_DIR`
32
33#]===]
34
35function(add_components)
36	set(options  )
37	set(oneValueArgs TARGET BASE_DIR)
38	set(multiValueArgs COMPONENTS)
39	cmake_parse_arguments(MY_PARAMS "${options}" "${oneValueArgs}"
40						"${multiValueArgs}" ${ARGN} )
41
42	if(NOT DEFINED MY_PARAMS_TARGET)
43		message(FATAL_ERROR "add_component: mandatory parameter TARGET not defined!")
44	endif()
45	if(NOT DEFINED MY_PARAMS_COMPONENTS)
46		message(FATAL_ERROR "add_component: mandatory parameter COMPONENTS not defined!")
47	endif()
48	if(DEFINED MY_PARAMS_BASE_DIR AND NOT MY_PARAMS_BASE_DIR MATCHES ".*/$")
49		set(MY_PARAMS_BASE_DIR "${MY_PARAMS_BASE_DIR}/")
50	endif()
51
52	set(TGT ${MY_PARAMS_TARGET})
53	foreach(_comp IN ITEMS ${MY_PARAMS_COMPONENTS})
54		set(_file ${MY_PARAMS_BASE_DIR}${_comp}/component.cmake)
55		include(${_file})
56		set(CMAKE_CONFIGURE_DEPENDS ${_file})
57	endforeach()
58	# Remove duplicate settings
59	foreach(_prop IN ITEMS INTERFACE_INCLUDE_DIRECTORIES INCLUDE_DIRECTORIES
60						   INTERFACE_COMPILE_DEFINITIONS COMPILE_DEFINITIONS
61						   INTERFACE_COMPILE_OPTIONS COMPILE_OPTIONS
62						   INTERFACE_SOURCES SOURCES
63						   PUBLIC_HEADER)
64		get_property(_tmp TARGET ${MY_PARAMS_TARGET} PROPERTY ${_prop})
65		list(REMOVE_DUPLICATES _tmp)
66		set_property(TARGET ${MY_PARAMS_TARGET} PROPERTY ${_prop} ${_tmp})
67	endforeach()
68endfunction()
69