# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.

#[=======================================================================[.rst:
CMakeFindFrameworks
-------------------

.. deprecated:: 3.31
  This module does nothing, unless policy :policy:`CMP0173` is set to ``OLD``.

helper module to find OSX frameworks

This module reads hints about search locations from variables::

  CMAKE_FIND_FRAMEWORK_EXTRA_LOCATIONS - Extra directories
#]=======================================================================]

cmake_policy(GET CMP0173 _cmp0173)
if(_cmp0173 STREQUAL "NEW")
  message(FATAL_ERROR
    "CMakeFindFrameworks.cmake is not maintained and lacks support for more "
    "recent framework handling. It will be removed in a future version of "
    "CMake. Update the code to use find_library() instead. "
    "Use of this module is now an error according to policy CMP0173."
  )
elseif(_cmp0173 STREQUAL "")
  # CMake will have already emitted the standard policy warning for the point
  # of inclusion. We only need to add the context-specific info here.
  message(AUTHOR_WARNING
    "CMakeFindFrameworks.cmake is not maintained and lacks support for more "
    "recent framework handling. It will be removed in a future version of "
    "CMake. Update the code to use find_library() instead."
  )
endif ()
unset(_cmp0173)

if(NOT CMAKE_FIND_FRAMEWORKS_INCLUDED)
  set(CMAKE_FIND_FRAMEWORKS_INCLUDED 1)
  macro(CMAKE_FIND_FRAMEWORKS fwk)
    set(${fwk}_FRAMEWORKS)
    if(APPLE)
      # 'Frameworks' directory from Brew (Apple Silicon and Intel)
      if(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64")
        set(_brew_framework_path /opt/homebrew/Frameworks)
      else()
        set(_brew_framework_path /usr/local/Frameworks)
      endif()

      file(TO_CMAKE_PATH "$ENV{CMAKE_FRAMEWORK_PATH}" _cmff_CMAKE_FRAMEWORK_PATH)
      set(_cmff_search_paths
            ${CMAKE_FRAMEWORK_PATH}
            ${_cmff_CMAKE_FRAMEWORK_PATH}
            ~/Library/Frameworks
            ${_brew_framework_path}
            /Library/Frameworks
            /System/Library/Frameworks
            /Network/Library/Frameworks
            ${CMAKE_SYSTEM_FRAMEWORK_PATH})

      # For backwards compatibility reasons,
      # CMAKE_FIND_FRAMEWORK_EXTRA_LOCATIONS includes ${fwk}.framework
      list(TRANSFORM _cmff_search_paths APPEND /${fwk}.framework)
      list(APPEND _cmff_search_paths ${CMAKE_FIND_FRAMEWORK_EXTRA_LOCATIONS})

      list(REMOVE_DUPLICATES _cmff_search_paths)

      foreach(dir IN LISTS _cmff_search_paths)
        if(EXISTS ${dir})
          set(${fwk}_FRAMEWORKS ${${fwk}_FRAMEWORKS} ${dir})
        endif()
      endforeach()
    endif()
  endmacro()
endif()
