blob: 479f145de3d9d22667335603ac7fc258b8c5adae [file] [log] [blame]
# Copyright (c) 2020-2022, Arm Limited and Contributors. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
#-------------------------------------------------------------------------------
#[===[.rst:
Add build components to the current build.
------------------------------------------
#]===]
#[===[.rst:
.. cmake:command:: add_components
.. code:: cmake
add_components(TARGET <target name> COMPONENTS <list of component directories>)
INPUTS:
``BASE_DIR``
If defined components are include relative to this directory. If nor paths must be
relative to CMAKE_SOURCE_DIR or be absolute.
``TARGET``
The name of an already defined target to add components to.
``COMPONENTS``
List of components relative to :cmake:variable:`CMAKE_SOURCE_DIR`
#]===]
function(add_components)
set(options )
set(oneValueArgs TARGET BASE_DIR)
set(multiValueArgs COMPONENTS)
cmake_parse_arguments(MY_PARAMS "${options}" "${oneValueArgs}"
"${multiValueArgs}" ${ARGN} )
if(NOT DEFINED MY_PARAMS_TARGET)
message(FATAL_ERROR "add_component: mandatory parameter TARGET not defined!")
endif()
if(NOT DEFINED MY_PARAMS_COMPONENTS)
message(FATAL_ERROR "add_component: mandatory parameter COMPONENTS not defined!")
endif()
if(DEFINED MY_PARAMS_BASE_DIR AND NOT MY_PARAMS_BASE_DIR MATCHES ".*/$")
set(MY_PARAMS_BASE_DIR "${MY_PARAMS_BASE_DIR}/")
endif()
set(TGT ${MY_PARAMS_TARGET})
foreach(_comp IN ITEMS ${MY_PARAMS_COMPONENTS})
set(_file ${MY_PARAMS_BASE_DIR}${_comp}/component.cmake)
include(${_file})
set(CMAKE_CONFIGURE_DEPENDS ${_file})
endforeach()
# Remove duplicate settings
foreach(_prop IN ITEMS INTERFACE_INCLUDE_DIRECTORIES INCLUDE_DIRECTORIES
INTERFACE_COMPILE_DEFINITIONS COMPILE_DEFINITIONS
INTERFACE_COMPILE_OPTIONS COMPILE_OPTIONS
INTERFACE_SOURCES SOURCES
PUBLIC_HEADER)
get_property(_tmp TARGET ${MY_PARAMS_TARGET} PROPERTY ${_prop})
list(REMOVE_DUPLICATES _tmp)
set_property(TARGET ${MY_PARAMS_TARGET} PROPERTY ${_prop} ${_tmp})
endforeach()
endfunction()