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.
62 lines
2.9 KiB
CMake
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()
|