| # Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| # file Copyright.txt or https://cmake.org/licensing for details. |
| |
| |
| # Do NOT include this module directly into any of your code. It is used by |
| # the try_compile() implementation to work around a specific issue with |
| # conflicting flags when building for Apple platforms. |
| if(NOT APPLE) |
| return() |
| endif() |
| |
| cmake_policy(PUSH) |
| cmake_policy(SET CMP0054 NEW) # if() quoted variables not dereferenced |
| |
| function(__cmake_internal_workaround_headerpad_flag_conflict _LANG) |
| |
| # Until we can avoid hard-coding -Wl,-headerpad_max_install_names in the |
| # linker flags, we need to remove it here for cases where we know it will |
| # conflict with other flags, generate a warning and be ignored. |
| set(regex "(^| )(-fembed-bitcode(-marker|=(all|bitcode|marker))?|-bundle_bitcode)($| )") |
| set(remove_headerpad NO) |
| |
| # Check arbitrary flags that the user or project has set. These compiler |
| # flags get added to the linker command line. |
| if("${CMAKE_${_LANG}_FLAGS}" MATCHES "${regex}") |
| set(remove_headerpad YES) |
| endif() |
| if(NOT remove_headerpad) |
| get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) |
| if(is_multi_config) |
| # Only one of these config-specific variables will be set by try_compile() |
| # and the rest will be unset, but we can't easily tell which one is set. |
| # No harm to just add them all here, empty ones won't add flags to check. |
| foreach(config IN LISTS CMAKE_CONFIGURATION_TYPES) |
| if("${CMAKE_${_LANG}_FLAGS_${config}}" MATCHES "${regex}") |
| set(remove_headerpad YES) |
| break() |
| endif() |
| endforeach() |
| else() |
| if("${CMAKE_${_LANG}_FLAGS_${CMAKE_BUILD_TYPE}}" MATCHES "${regex}") |
| set(remove_headerpad YES) |
| endif() |
| endif() |
| endif() |
| |
| # The try_compile() command passes compiler flags to check in a way that |
| # results in them being added to add_definitions(). Those don't end up on |
| # the linker command line, so we don't need to check them here. |
| |
| if(remove_headerpad) |
| foreach(flag IN ITEMS |
| CMAKE_${_LANG}_LINK_FLAGS |
| CMAKE_SHARED_LIBRARY_CREATE_${_LANG}_FLAGS |
| CMAKE_SHARED_MODULE_CREATE_${_LANG}_FLAGS) |
| string(REPLACE "-Wl,-headerpad_max_install_names" "" ${flag} "${${flag}}") |
| set(${flag} "${${flag}}" PARENT_SCOPE) |
| endforeach() |
| endif() |
| endfunction() |
| |
| get_property(__enabled_languages GLOBAL PROPERTY ENABLED_LANGUAGES) |
| foreach(__lang IN LISTS __enabled_languages) |
| __cmake_internal_workaround_headerpad_flag_conflict(${__lang}) |
| endforeach() |
| unset(__lang) |
| unset(__enabled_languages) |
| |
| cmake_policy(POP) |