blob: 479f145de3d9d22667335603ac7fc258b8c5adae [file] [log] [blame]
Imre Kis1c781ef2022-03-04 18:49:23 +01001# Copyright (c) 2020-2022, Arm Limited and Contributors. All rights reserved.
Gyorgy Szing49091802020-11-24 00:33:09 +01002#
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
Imre Kis1c781ef2022-03-04 18:49:23 +010052 set(TGT ${MY_PARAMS_TARGET})
Gyorgy Szing49091802020-11-24 00:33:09 +010053 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()
Gyorgy Szing8925d202022-07-20 06:22:55 +000058 # 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()
Gyorgy Szing49091802020-11-24 00:33:09 +010068endfunction()