You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/cmake/Platform/Common/TargetIncludeSystemDirector...

62 lines
2.9 KiB
CMake

#
# Copyright (c) Contributors to the Open 3D Engine Project.
# For complete copyright and license terms please see the LICENSE at the root of this distribution.
#
# SPDX-License-Identifier: Apache-2.0 OR MIT
#
#
#! ly_target_include_system_directories: adds a system include to the target. This is the same behavior as target_include_directories
# passing the SYSTEM parameter. However, this supports doing it in generators that CMake still does not.
#
# To handle platforms that yet not support SYSTEM includes, we pass the includes as part of compilation options
# Once all platforms support it, we can roll back to target_include_directories
# We are using the same variable for the system include that CMake does, so this works in all platforms where cmake supports
# it and by defining the variables, it will support it in platforms where the compiler supports it but CMake still didnt
# add it to the generator (e.g. MSVC: https://gitlab.kitware.com/cmake/cmake/issues/17904)
#
# \arg:TARGET name of the target
# \arg:INTERFACE includes to apply to INTERFACE
# \arg:PUBLIC includes to apply to PUBLIC
# \arg:PRIVATE includes to apply to PRIVATE
#
function(ly_target_include_system_directories)
set(options)
set(oneValueArgs TARGET)
set(multiValueArgs INTERFACE PUBLIC PRIVATE)
cmake_parse_arguments(ly_target_include_system_directories "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(NOT ly_target_include_system_directories_TARGET)
message(FATAL_ERROR "Target not provided")
endif()
if(LY_CXX_SYSTEM_INCLUDE_CONFIGURATION_FLAG)
target_compile_options(${ly_target_include_system_directories_TARGET}
INTERFACE
${LY_CXX_SYSTEM_INCLUDE_CONFIGURATION_FLAG}
)
endif()
foreach(type ITEMS INTERFACE PUBLIC PRIVATE)
foreach(include_dir ${ly_target_include_system_directories_${type}})
string(GENEX_STRIP ${include_dir} include_genex_expr)
# Skip over any include directory value which contains a generator expression
# It's path cannot be validated at configure
# The check validates that the string stripped from generation expressions is the same as the original string
if(include_genex_expr STREQUAL include_dir AND NOT EXISTS ${include_dir})
message(FATAL_ERROR "Cannot find 3rdParty library ${ly_add_external_target_NAME} include path ${include_dir}")
endif()
target_compile_options(${ly_target_include_system_directories_TARGET}
${type} ${CMAKE_INCLUDE_SYSTEM_FLAG_CXX}${include_dir}
)
# For windows add the includes to the INTERFACE_SYSTEM_INCLUDE_DIRECTORIES directly so that the property
# is available in dependent targets
set_property(TARGET ${ly_target_include_system_directories_TARGET} APPEND
PROPERTY INTERFACE_SYSTEM_INCLUDE_DIRECTORIES ${include_dir})
endforeach()
endforeach()
endfunction()