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


# Do NOT include this module directly into any of your code. It is meant as
# a library for Check*CompilerFlag.cmake and Check*LinkerFlag.cma modules.
# It's content may change in any way between releases.

include_guard(GLOBAL)

macro(CMAKE_CHECK_COMMON_INIT_COMPILE_FLAGS _PREFIX)
  set(${_PREFIX}_EXTRA_CMAKE_ARGUMENTS)
  string(REPLACE "\\;" "\\\\;" CMAKE_REQUIRED_FLAGS
    "${CMAKE_REQUIRED_FLAGS}")
  #[[
  cmake_polify(GET CMP0999 ${_PREFIX}_CMP0999)
  if(${_PREFIX}_CMP0999 STREQUAL "NEW")
    # Join multiple list arguments into the space-separated string that we
    # want. This ensures that the entirety of the value gets passed as
    # compile arguments, which is what the user almost surely intended.
    #
    # FIXME(#27901): This needs a policy to be implemented. This will be
    # available in a future version of CMake.
    list(JOIN CMAKE_REQUIRED_FLAGS " " CMAKE_REQUIRED_FLAGS)
  else()
  #]]
    # If CMAKE_REQUIRED_FLAGS contains an unescaped semicolon, anything after
    # gets passed as flags to 'cmake' itself. This is probably not intended,
    # but we preserve it for compatibility.
    set(${_PREFIX}_EXTRA_CMAKE_ARGUMENTS "${CMAKE_REQUIRED_FLAGS}")
    list(POP_FRONT ${_PREFIX}_EXTRA_CMAKE_ARGUMENTS CMAKE_REQUIRED_FLAGS)
    if(NOT ${_PREFIX}_EXTRA_CMAKE_ARGUMENTS STREQUAL "")
      # cmake_policy(ISSUE_WARNING CMP0999) TODO
      # There are known instances of users accidentally passing '-W' arguments
      # intended for the compiler as arguments to CMake. Since CMake complains
      # about unknown '-W' arguments starting with CMake 4.4, we need to strip
      # these for compatibility.
      string(REPLACE "\\;" "\\\\;" ${_PREFIX}_EXTRA_CMAKE_ARGUMENTS
        "${${_PREFIX}_EXTRA_CMAKE_ARGUMENTS}")
      list(FILTER ${_PREFIX}_EXTRA_CMAKE_ARGUMENTS EXCLUDE REGEX "^-W")
    endif()
  #endif()
endmacro()

macro(CMAKE_CHECK_COMMON_INIT_INCLUDE_DIRECTORIES _PREFIX)
  if(CMAKE_REQUIRED_INCLUDES)
    if(${ARGC} GREATER 1)
      set(${_PREFIX}_INCLUDE_DIRECTORIES
        "-DINCLUDE_DIRECTORIES:STRING=${ARGN};${CMAKE_REQUIRED_INCLUDES}")
    else()
      set(${_PREFIX}_INCLUDE_DIRECTORIES
        "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
    endif()
  elseif(${ARGC} GREATER 1)
    set(${_PREFIX}_INCLUDE_DIRECTORIES
      "-DINCLUDE_DIRECTORIES:STRING=${ARGN}")
  else()
    set(${_PREFIX}_INCLUDE_DIRECTORIES)
  endif()
endmacro()

macro(CMAKE_CHECK_COMMON_INIT_LINK_OPTIONS _PREFIX)
  if(CMAKE_REQUIRED_LINK_OPTIONS OR ${ARGC} GREATER 1)
    set(${_PREFIX}_ADD_LINK_OPTIONS
      LINK_OPTIONS ${ARGN} ${CMAKE_REQUIRED_LINK_OPTIONS})
  else()
    set(${_PREFIX}_ADD_LINK_OPTIONS)
  endif()
endmacro()

macro(CMAKE_CHECK_COMMON_INIT_LINK_LIBRARIES _PREFIX)
  if(CMAKE_REQUIRED_LIBRARIES OR ${ARGC} GREATER 1)
    set(${_PREFIX}_ADD_LINK_LIBRARIES
      LINK_LIBRARIES ${ARGN} ${CMAKE_REQUIRED_LIBRARIES})
  else()
    set(${_PREFIX}_ADD_LINK_LIBRARIES)
  endif()
endmacro()

macro(CMAKE_CHECK_COMMON_INIT_LINK_DIRECTORIES _PREFIX)
  if(CMAKE_REQUIRED_LINK_DIRECTORIES)
    if(${ARGC} GREATER 1)
      set(${_PREFIX}_LINK_DIRECTORIES
        "-DLINK_DIRECTORIES:STRING=${ARGN};${CMAKE_REQUIRED_LINK_DIRECTORIES}")
    else()
      set(${_PREFIX}_LINK_DIRECTORIES
        "-DLINK_DIRECTORIES:STRING=${CMAKE_REQUIRED_LINK_DIRECTORIES}")
    endif()
  elseif(${ARGC} GREATER 1)
    set(${_PREFIX}_LINK_DIRECTORIES
      "-DLINK_DIRECTORIES:STRING=${ARGN}")
  else()
    set(${_PREFIX}_LINK_DIRECTORIES)
  endif()
endmacro()

macro(CMAKE_CHECK_COMMON_INIT_COMPILE_ARGS _PREFIX)
  cmake_check_common_init_compile_flags(${_PREFIX})
  cmake_check_common_init_include_directories(${_PREFIX})
endmacro()

macro(CMAKE_CHECK_COMMON_INIT_LINK_ARGS _PREFIX)
  cmake_check_common_init_link_options(${_PREFIX})
  cmake_check_common_init_link_libraries(${_PREFIX})
  cmake_check_common_init_link_directories(${_PREFIX})
endmacro()

macro(CMAKE_CHECK_COMMON_INIT_ARGS _PREFIX)
  cmake_check_common_init_compile_args(${_PREFIX})
  cmake_check_common_init_link_args(${_PREFIX})
endmacro()

macro(CMAKE_CHECK_COMMON_CLEANUP _PREFIX)
  unset(${_PREFIX}_ADD_LINK_OPTIONS)
  unset(${_PREFIX}_ADD_LINK_LIBRARIES)
  unset(${_PREFIX}_LINK_DIRECTORIES)
  unset(${_PREFIX}_INCLUDE_DIRECTORIES)
  unset(${_PREFIX}_EXTRA_CMAKE_ARGUMENTS)
endmacro()
