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