1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- #
- # 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()
|