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

block(SCOPE_FOR POLICIES)
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)

endblock()
