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

#[=======================================================================[.rst:
FindIce
-------

.. versionadded:: 3.1

Finds the Internet Communication Engine (Ice) programs, libraries and datafiles:

.. code-block:: cmake

  find_package(Ice [<version>] COMPONENTS <components>... [...])

Ice is an open-source remote procedure call (RPC) framework developed by ZeroC
and provides SDKs for various languages to develop network applications.

.. versionadded:: 3.4
  Imported targets for components and many new ``*_EXECUTABLE`` variables.

.. versionadded:: 3.7
  Debug and Release library variants are found separately.

.. versionadded:: 3.10
  Ice 3.7 support, including new components, programs and the Nuget package.

Components
^^^^^^^^^^

Ice consists of several libraries and programs (executables).  This find module
supports components, which can be specified using the :command:`find_package`
command, to select specific Ice libraries for use in a CMake project.
Executables provided by Ice installation are always searched automatically,
regardless of the specified components.

The list of available components depends on the Ice version in use.  To
successfully find Ice, at least one component must be specified:

.. code-block:: cmake

  find_package(Ice COMPONENTS <components>...)

Supported components include:

.. hlist::

  - ``Freeze``
  - ``Glacier2``
  - ``Ice``
  - ``IceBox``
  - ``IceDB``
  - ``IceDiscovery``
  - ``IceGrid``
  - ``IceLocatorDiscovery``
  - ``IcePatch``
  - ``IceSSL``
  - ``IceStorm``
  - ``IceUtil``
  - ``IceXML``
  - ``Slice``

Ice 3.7 and later also include C++11-specific components:

.. hlist::

  - ``Glacier2++11``
  - ``Ice++11``
  - ``IceBox++11``
  - ``IceDiscovery++11``
  - ``IceGrid++11``
  - ``IceLocatorDiscovery++11``
  - ``IceSSL++11``
  - ``IceStorm++11``

Imported Targets
^^^^^^^^^^^^^^^^

This module provides the following :ref:`Imported Targets`:

``Ice::<component>``
  .. versionadded:: 3.4

  Target encapsulating the usage requirements for the specified Ice component
  (library), available if that component is found.  The ``<component>`` should
  be written in the same case, as listed above.  For example, use
  ``Ice::Glacier2`` for the Ice Glacier2 library, or ``Ice::Ice++11`` for the
  Ice++11 library, etc.

Result Variables
^^^^^^^^^^^^^^^^

This module defines the following variables:

``Ice_FOUND``
  Boolean indicating whether the main programs, libraries and all requested
  components for using Ice were found.

``Ice_VERSION``
  The version of Ice release found.

``Ice_INCLUDE_DIRS``
  The include directories containing headers needed to use Ice.

``Ice_LIBRARIES``
  Component libraries needed to link against to use Ice.

``Ice_SLICE_DIRS``
  The data directories containing interface definitions (``*.ice`` files) for
  Slice (Specification Language for Ice).

Ice component libraries are stored in:

``Ice_<COMPONENT>_FOUND``
  Boolean indicating whether the specified Ice component is found.  The
  ``<COMPONENT>`` should be written in uppercase.

``Ice_<COMPONENT>_LIBRARIES``
  Libraries provided by the specified Ice component.  The ``<COMPONENT>`` should
  be written in uppercase.

Slice programs are stored in:

``Ice_SLICE2CONFLUENCE_EXECUTABLE``
  .. versionadded:: 3.14

  The path to the ``slice2confluence`` executable.

``Ice_SLICE2CPP_EXECUTABLE``
  The path to the ``slice2cpp`` executable.

``Ice_SLICE2CS_EXECUTABLE``
  The path to the ``slice2cs`` executable.

``Ice_SLICE2FREEZEJ_EXECUTABLE``
  The path to the ``slice2freezej`` executable.

``Ice_SLICE2FREEZE_EXECUTABLE``
  The path to the ``slice2freeze`` executable.

``Ice_SLICE2HTML_EXECUTABLE``
  The path to the ``slice2html`` executable.

``Ice_SLICE2JAVA_EXECUTABLE``
  The path to the ``slice2java`` executable.

``Ice_SLICE2JS_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``slice2js`` executable.

``Ice_SLICE2MATLAB_EXECUTABLE``
  .. versionadded:: 3.14

  The path to the ``slice2matlab`` executable.

``Ice_SLICE2OBJC_EXECUTABLE``
  .. versionadded:: 3.10

  The path to the ``slice2objc`` executable.

``Ice_SLICE2PHP_EXECUTABLE``
  The path to the ``slice2php`` executable.

``Ice_SLICE2PY_EXECUTABLE``
  The path to the ``slice2py`` executable.

``Ice_SLICE2RB_EXECUTABLE``
  The path to the ``slice2rb`` executable.

Ice programs are stored in:

``Ice_GLACIER2ROUTER_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``glacier2router`` executable.

``Ice_ICEBOX_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``icebox`` executable.

``Ice_ICEBOX++11_EXECUTABLE``
  .. versionadded:: 3.10

  The path to the ``icebox++11`` executable.

``Ice_ICEBOXADMIN_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``iceboxadmin`` executable.

``Ice_ICEBOXD_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``iceboxd`` executable.

``Ice_ICEBOXNET_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``iceboxnet`` executable.

``Ice_ICEBRIDGE_EXECUTABLE``
  .. versionadded:: 3.10

  The path to the ``icebridge`` executable.

``Ice_ICEGRIDADMIN_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``icegridadmin`` executable.

``Ice_ICEGRIDDB_EXECUTABLE``
  .. versionadded:: 3.10

  The path to the ``icegriddb`` executable.

``Ice_ICEGRIDNODE_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``icegridnode`` executable.

``Ice_ICEGRIDNODED_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``icegridnoded`` executable.

``Ice_ICEGRIDREGISTRY_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``icegridregistry`` executable.

``Ice_ICEGRIDREGISTRYD_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``icegridregistryd`` executable.

``Ice_ICEPATCH2CALC_EXECUTABLE``
  The path to the ``icepatch2calc`` executable.

``Ice_ICEPATCH2CLIENT_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``icepatch2client`` executable.

``Ice_ICEPATCH2SERVER_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``icepatch2server`` executable.

``Ice_ICESERVICEINSTALL_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``iceserviceinstall`` executable.

``Ice_ICESTORMADMIN_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``icestormadmin`` executable.

``Ice_ICESTORMDB_EXECUTABLE``
  .. versionadded:: 3.10

  The path to the ``icestormdb`` executable.

``Ice_ICESTORMMIGRATE_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``icestormmigrate`` executable.

Ice database programs are stored in the following variables (on Windows, they
are included with the Ice installation; on other platforms, they are usually
available through standard Berkeley DB packages):

``Ice_DB_ARCHIVE_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``db_archive`` executable.

``Ice_DB_CHECKPOINT_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``db_checkpoint`` executable.

``Ice_DB_DEADLOCK_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``db_deadlock`` executable.

``Ice_DB_DUMP_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``db_dump`` executable.

``Ice_DB_HOTBACKUP_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``db_hotbackup`` executable.

``Ice_DB_LOAD_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``db_load`` executable.

``Ice_DB_LOG_VERIFY_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``db_log_verify`` executable.

``Ice_DB_PRINTLOG_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``db_printlog`` executable.

``Ice_DB_RECOVER_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``db_recover`` executable.

``Ice_DB_STAT_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``db_stat`` executable.

``Ice_DB_TUNER_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``db_tuner`` executable.

``Ice_DB_UPGRADE_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``db_upgrade`` executable.

``Ice_DB_VERIFY_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``db_verify`` executable.

``Ice_DUMPDB_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``dumpdb`` executable.

``Ice_TRANSFORMDB_EXECUTABLE``
  .. versionadded:: 3.4

  The path to the ``transformdb`` executable.

Cache Variables
^^^^^^^^^^^^^^^

The following cache variables may also be set:

``Ice_<PROGRAM>_EXECUTABLE``
  The path to the specified ``<PROGRAM>`` executable;  The ``<PROGRAM>`` is the
  uppercase name of the Ice program as listed in above result variables of
  executables.

``Ice_INCLUDE_DIR``
  The directory containing Ice headers.

``Ice_SLICE_DIR``
  The data directory containing interface definitions for Slice.

``Ice_<COMPONENT>_LIBRARY``
  The path to the library for the specified component.  The ``<COMPONENT>``
  should be written in uppercase.

Hints
^^^^^

This module accepts the following variables:

``Ice_HOME``
  Set this CMake variable to the root of the Ice installation in order to
  search for Ice in a custom location.

  .. note::

    On Windows, Ice 3.7.0 and later provide libraries via the NuGet
    package manager.  Appropriate NuGet packages will be searched for
    using :variable:`CMAKE_PREFIX_PATH`, or alternatively ``Ice_HOME`` may be
    set to the location of a specific NuGet package to restrict the search.

``ICE_HOME``
  Environment variable (uppercased) may also be set to the root of the Ice
  installation;  The ``Ice_HOME`` CMake variable takes precedence.

``Ice_DEBUG``
  Set this variable to boolean true to enable debug output from this module.

.. note::

  In most cases, none of the above variables need to be set unless multiple Ice
  versions are installed and a specific one is required.  On Windows, the most
  recent version is typically found using the registry.  On Unix-like systems,
  programs, headers, and libraries are usually found in standard locations,
  although ``Ice_SLICE_DIRS`` might not be detected automatically (commonly
  known locations are searched).  All other variables default based on the value
  of ``Ice_HOME``, if set.

  It's also possible to set ``Ice_HOME`` while selectively overriding specific
  locations for individual components;  This might be required, for example, in
  newer versions of Visual Studio if the heuristics are not sufficient to
  identify the correct programs and libraries for the specific Visual Studio
  version.

Examples
^^^^^^^^

Finding the Ice core library and linking it to a project target:

.. code-block:: cmake

  find_package(Ice COMPONENTS Ice)
  target_link_libraries(project_target PRIVATE Ice::Ice)

Finding Ice core library and IceSSL library, and linking them to a project
target:

.. code-block:: cmake

  find_package(Ice COMPONENTS Ice IceSSL)
  target_link_libraries(project_target PRIVATE Ice::Ice Ice::IceSSL)

Finding Ice core library as required component and Ice Freeze library as
optional:

.. code-block:: cmake

  find_package(Ice COMPONENTS Ice OPTIONAL_COMPONENTS Freeze)
#]=======================================================================]

# Written by Roger Leigh <rleigh@codelibre.net>

  set(_Ice_db_programs
      db_archive
      db_checkpoint
      db_deadlock
      db_dump
      db_hotbackup
      db_load
      db_log_verify
      db_printlog
      db_recover
      db_stat
      db_tuner
      db_upgrade
      db_verify
      dumpdb
      transformdb)

  set(_Ice_programs
      glacier2router
      icebox
      icebox++11
      iceboxadmin
      iceboxd
      iceboxnet
      icebridge
      icegridadmin
      icegriddb
      icegridnode
      icegridnoded
      icegridregistry
      icegridregistryd
      icepatch2calc
      icepatch2client
      icepatch2server
      iceserviceinstall
      icestormadmin
      icestormdb
      icestormmigrate)

  set(_Ice_slice_programs
      slice2confluence
      slice2cpp
      slice2cs
      slice2freezej
      slice2freeze
      slice2html
      slice2java
      slice2js
      slice2matlab
      slice2objc
      slice2php
      slice2py
      slice2rb)


# The Ice checks are contained in a function due to the large number
# of temporary variables needed.
function(_Ice_FIND)
  # Released versions of Ice, including generic short forms
  set(ice_versions
      3
      3.7
      3.7.0
      3.6
      3.6.3
      3.6.2
      3.6.1
      3.6.0
      3.5
      3.5.1
      3.5.0
      3.4
      3.4.2
      3.4.1
      3.4.0
      3.3
      3.3.1
      3.3.0)

  foreach(ver ${ice_versions})
    string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\$" two_digit_version_match "${ver}")
    if(two_digit_version_match)
      string(REGEX REPLACE "^([0-9]+)\\.([0-9]+)\$" "\\1\\2" two_digit_version "${ver}")
      list(APPEND ice_suffix_versions "${two_digit_version}")
    endif()
  endforeach()

  # Set up search paths, taking compiler into account.  Search Ice_HOME,
  # with ICE_HOME in the environment as a fallback if unset.
  if(Ice_HOME)
    list(APPEND ice_roots "${Ice_HOME}")
  else()
    if(NOT "$ENV{ICE_HOME}" STREQUAL "")
      file(TO_CMAKE_PATH "$ENV{ICE_HOME}" NATIVE_PATH)
      list(APPEND ice_roots "${NATIVE_PATH}")
      set(Ice_HOME "${NATIVE_PATH}"
          CACHE PATH "Location of the Ice installation" FORCE)
    endif()
  endif()

  set(_bin "bin/Win32")
  set(_lib "lib/Win32")
  if(CMAKE_SIZEOF_VOID_P EQUAL 8)
    set(_bin "bin/x64")
    set(_lib "lib/x64")
    # 64-bit path suffix
    set(_x64 "/x64")
    # 64-bit library directory
    set(_lib64 "lib64")
  endif()

  unset(vcvers)
  if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC")
    if(MSVC_TOOLSET_VERSION GREATER_EQUAL 141)
      set(vcvers "141;140")
    elseif(MSVC_TOOLSET_VERSION GREATER_EQUAL 100)
      set(vcvers "${MSVC_TOOLSET_VERSION}")
    elseif(MSVC_TOOLSET_VERSION GREATER_EQUAL 90)
      set(vcvers "${MSVC_TOOLSET_VERSION}")
      set(vcyear "2008")
    elseif(MSVC_TOOLSET_VERSION GREATER_EQUAL 80)
      set(vcvers "${MSVC_TOOLSET_VERSION}")
      set(vcyear "2005")
    else() # Unknown version
      set(vcvers Unknown)
    endif()
  endif()

  # For compatibility with ZeroC Windows builds.
  if(vcvers)
    list(APPEND ice_binary_suffixes "build/native/${_bin}/Release" "tools")
    list(APPEND ice_debug_library_suffixes "build/native/${_lib}/Debug")
    list(APPEND ice_release_library_suffixes "build/native/${_lib}/Release")
    foreach(vcver IN LISTS vcvers)
      # Earlier Ice (3.3) builds don't use vcnnn subdirectories, but are harmless to check.
      list(APPEND ice_binary_suffixes "bin/vc${vcver}${_x64}" "bin/vc${vcver}")
      list(APPEND ice_debug_library_suffixes "lib/vc${vcver}${_x64}" "lib/vc${vcver}")
      list(APPEND ice_release_library_suffixes "lib/vc${vcver}${_x64}" "lib/vc${vcver}")
    endforeach()
  endif()
  # Generic 64-bit and 32-bit directories
  list(APPEND ice_binary_suffixes "bin${_x64}" "bin")
  list(APPEND ice_debug_library_suffixes "libx32" "${_lib64}" "lib${_x64}" "lib")
  list(APPEND ice_release_library_suffixes "libx32" "${_lib64}" "lib${_x64}" "lib")
  if(vcvers)
    list(APPEND ice_include_suffixes "build/native/include")
  endif()
  list(APPEND ice_include_suffixes "include")
  list(APPEND ice_slice_suffixes "slice")

  # On Windows, look in the registry for install locations.  Different
  # versions of Ice install support different compiler versions.
  if(vcvers)
    foreach(ice_version ${ice_versions})
      foreach(vcver IN LISTS vcvers)
        list(APPEND ice_nuget_dirs "zeroc.ice.v${vcver}.${ice_version}")
        list(APPEND freeze_nuget_dirs "zeroc.freeze.v${vcver}.${ice_version}")
      endforeach()
    endforeach()
    find_path(Ice_NUGET_DIR
              NAMES "tools/slice2cpp.exe"
              PATH_SUFFIXES ${ice_nuget_dirs}
              DOC "Ice NuGet directory")
    if(Ice_NUGET_DIR)
      list(APPEND ice_roots "${Ice_NUGET_DIR}")
    endif()
    find_path(Freeze_NUGET_DIR
              NAMES "tools/slice2freeze.exe"
              PATH_SUFFIXES ${freeze_nuget_dirs}
              DOC "Freeze NuGet directory")
    if(Freeze_NUGET_DIR)
      list(APPEND ice_roots "${Freeze_NUGET_DIR}")
    endif()
    foreach(ice_version ${ice_versions})
      # Ice 3.3 releases use a Visual Studio year suffix and value is
      # enclosed in double quotes, though only the leading quote is
      # returned by get_filename_component.
      unset(ice_location)
      if(vcyear)
        get_filename_component(ice_location
                               "[HKEY_LOCAL_MACHINE\\SOFTWARE\\ZeroC\\Ice ${ice_version} for Visual Studio ${vcyear};InstallDir]"
                               PATH)
        if(ice_location AND NOT ("${ice_location}" STREQUAL "/registry" OR "${ice_location}" STREQUAL "/"))
          string(REGEX REPLACE "^\"(.*)\"?$" "\\1" ice_location "${ice_location}")
          get_filename_component(ice_location "${ice_location}" ABSOLUTE)
        else()
          unset(ice_location)
        endif()
      endif()
      # Ice 3.4+ releases don't use a suffix
      if(NOT ice_location OR "${ice_location}" STREQUAL "/registry")
        get_filename_component(ice_location
                               "[HKEY_LOCAL_MACHINE\\SOFTWARE\\ZeroC\\Ice ${ice_version};InstallDir]"
                               ABSOLUTE)
      endif()

      if(ice_location AND NOT "${ice_location}" STREQUAL "/registry")
        list(APPEND ice_roots "${ice_location}")
      endif()
    endforeach()
  else()
    foreach(ice_version ${ice_versions})
      # Prefer 64-bit variants if present (and using a 64-bit compiler)
      list(APPEND ice_roots "/opt/Ice-${ice_version}")
    endforeach()
  endif()

  # Find all Ice programs
  foreach(program ${_Ice_db_programs} ${_Ice_programs} ${_Ice_slice_programs})
    string(TOUPPER "${program}" program_upcase)
    set(cache_var "Ice_${program_upcase}_EXECUTABLE")
    set(program_var "Ice_${program_upcase}_EXECUTABLE")
    find_program("${cache_var}" "${program}"
      HINTS ${ice_roots}
      PATH_SUFFIXES ${ice_binary_suffixes}
      DOC "Ice ${program} executable")
    mark_as_advanced(cache_var)
    set("${program_var}" "${${cache_var}}" PARENT_SCOPE)
  endforeach()

  # Get version.
  if(Ice_SLICE2CPP_EXECUTABLE)
    # Execute in C locale for safety
    set(_Ice_SAVED_LC_ALL "$ENV{LC_ALL}")
    set(ENV{LC_ALL} C)

    execute_process(COMMAND ${Ice_SLICE2CPP_EXECUTABLE} --version
      ERROR_VARIABLE Ice_VERSION_SLICE2CPP_FULL
      ERROR_STRIP_TRAILING_WHITESPACE)

    # restore the previous LC_ALL
    set(ENV{LC_ALL} ${_Ice_SAVED_LC_ALL})

    # Make short version
    string(REGEX REPLACE "^(.*)\\.[^.]*$" "\\1" Ice_VERSION_SLICE2CPP_SHORT "${Ice_VERSION_SLICE2CPP_FULL}")
    set(Ice_VERSION "${Ice_VERSION_SLICE2CPP_FULL}" PARENT_SCOPE)
  endif()

  if(NOT Ice_FIND_QUIETLY)
    message(STATUS "Ice version: ${Ice_VERSION_SLICE2CPP_FULL}")
  endif()

  # Find include directory
  find_path(Ice_INCLUDE_DIR
            NAMES "Ice/Ice.h"
            HINTS ${ice_roots}
            PATH_SUFFIXES ${ice_include_suffixes}
            DOC "Ice include directory")
  set(Ice_INCLUDE_DIR "${Ice_INCLUDE_DIR}" PARENT_SCOPE)

  find_path(Freeze_INCLUDE_DIR
            NAMES "Freeze/Freeze.h"
            HINTS ${ice_roots}
            PATH_SUFFIXES ${ice_include_suffixes}
            DOC "Freeze include directory")
  set(Freeze_INCLUDE_DIR "${Freeze_INCLUDE_DIR}" PARENT_SCOPE)

  # In common use on Linux, MacOS X (homebrew) and FreeBSD; prefer
  # version-specific dir
  list(APPEND ice_slice_paths
       /usr/local/share /usr/share)
  list(APPEND ice_slice_suffixes
       "Ice-${Ice_VERSION_SLICE2CPP_FULL}/slice"
       "Ice-${Ice_VERSION_SLICE2CPP_SHORT}/slice"
       "ice/slice"
       Ice)

  # Find slice directory
  find_path(Ice_SLICE_DIR
            NAMES "Ice/Connection.ice"
            HINTS ${ice_roots}
                  ${ice_slice_paths}
            PATH_SUFFIXES ${ice_slice_suffixes}
            NO_DEFAULT_PATH
            DOC "Ice slice directory")
  set(Ice_SLICE_DIR "${Ice_SLICE_DIR}" PARENT_SCOPE)

  # Find all Ice libraries
  set(Ice_REQUIRED_LIBS_FOUND ON)
  foreach(component ${Ice_FIND_COMPONENTS})
    string(TOUPPER "${component}" component_upcase)
    set(component_cache "Ice_${component_upcase}_LIBRARY")
    set(component_cache_release "${component_cache}_RELEASE")
    set(component_cache_debug "${component_cache}_DEBUG")
    set(component_found "${component_upcase}_FOUND")
    set(component_library "${component}")
    unset(component_library_release_names)
    unset(component_library_debug_names)
    if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC")
      string(REGEX MATCH ".+\\+\\+11$" component_library_cpp11 "${component_library}")
      if(component_library_cpp11)
        string(REGEX REPLACE "^(.+)(\\+\\+11)$" "\\1" component_library "${component_library}")
      endif()
      foreach(suffix_ver ${ice_suffix_versions})
        set(_name "${component_library}${suffix_ver}")
        if(component_library_cpp11)
          string(APPEND _name "++11")
        endif()
        list(APPEND component_library_debug_names "${_name}d")
        list(APPEND component_library_release_names "${_name}")
      endforeach()
      set(_name "${component_library}")
      if(component_library_cpp11)
        string(APPEND _name "++11")
      endif()
      list(APPEND component_library_debug_names "${_name}d")
      list(APPEND component_library_release_names "${_name}")
    else()
      list(APPEND component_library_debug_names "${component_library}d")
      list(APPEND component_library_release_names "${component_library}")
    endif()
    find_library("${component_cache_release}" ${component_library_release_names}
      HINTS ${ice_roots}
      PATH_SUFFIXES ${ice_release_library_suffixes}
      DOC "Ice ${component} library (release)")
    find_library("${component_cache_debug}" ${component_library_debug_names}
      HINTS ${ice_roots}
      PATH_SUFFIXES ${ice_debug_library_suffixes}
      DOC "Ice ${component} library (debug)")
    include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake)
    select_library_configurations(Ice_${component_upcase})
    mark_as_advanced("${component_cache_release}" "${component_cache_debug}")
    if(${component_cache})
      set("${component_found}" ON)
      list(APPEND Ice_LIBRARY "${${component_cache}}")
    endif()
    mark_as_advanced("${component_found}")
    set("${component_cache}" "${${component_cache}}" PARENT_SCOPE)
    set("${component_found}" "${${component_found}}" PARENT_SCOPE)
    if(${component_found})
      if (Ice_FIND_REQUIRED_${component})
        list(APPEND Ice_LIBS_FOUND "${component} (required)")
      else()
        list(APPEND Ice_LIBS_FOUND "${component} (optional)")
      endif()
    else()
      if (Ice_FIND_REQUIRED_${component})
        set(Ice_REQUIRED_LIBS_FOUND OFF)
        list(APPEND Ice_LIBS_NOTFOUND "${component} (required)")
      else()
        list(APPEND Ice_LIBS_NOTFOUND "${component} (optional)")
      endif()
    endif()
  endforeach()
  set(_Ice_REQUIRED_LIBS_FOUND "${Ice_REQUIRED_LIBS_FOUND}" PARENT_SCOPE)
  set(Ice_LIBRARY "${Ice_LIBRARY}" PARENT_SCOPE)

  if(NOT Ice_FIND_QUIETLY)
    if(Ice_LIBS_FOUND)
      message(STATUS "Found the following Ice libraries:")
      foreach(found ${Ice_LIBS_FOUND})
        message(STATUS "  ${found}")
      endforeach()
    endif()
    if(Ice_LIBS_NOTFOUND)
      message(STATUS "The following Ice libraries were not found:")
      foreach(notfound ${Ice_LIBS_NOTFOUND})
        message(STATUS "  ${notfound}")
      endforeach()
    endif()
  endif()

  if(Ice_DEBUG)
    message(STATUS "--------FindIce.cmake search debug--------")
    message(STATUS "ICE binary path search order: ${ice_roots}")
    message(STATUS "ICE binary suffixes: ${ice_binary_suffixes}")
    message(STATUS "ICE include path search order: ${ice_roots}")
    message(STATUS "ICE include suffixes: ${ice_include_suffixes}")
    message(STATUS "ICE slice path search order: ${ice_roots} ${ice_slice_paths}")
    message(STATUS "ICE slice suffixes: ${ice_slice_suffixes}")
    message(STATUS "ICE library path search order: ${ice_roots}")
    message(STATUS "ICE debug library suffixes: ${ice_debug_library_suffixes}")
    message(STATUS "ICE release library suffixes: ${ice_release_library_suffixes}")
    message(STATUS "----------------")
  endif()
endfunction()

_Ice_FIND()

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Ice
                                  REQUIRED_VARS Ice_SLICE2CPP_EXECUTABLE
                                                Ice_INCLUDE_DIR
                                                Ice_SLICE_DIR
                                                Ice_LIBRARY
                                                _Ice_REQUIRED_LIBS_FOUND
                                  VERSION_VAR Ice_VERSION
                                  FAIL_MESSAGE "Failed to find all Ice components")

unset(_Ice_REQUIRED_LIBS_FOUND)

if(Ice_FOUND)
  set(Ice_INCLUDE_DIRS "${Ice_INCLUDE_DIR}")
  if (Freeze_INCLUDE_DIR)
    list(APPEND Ice_INCLUDE_DIRS "${Freeze_INCLUDE_DIR}")
  endif()
  set(Ice_SLICE_DIRS "${Ice_SLICE_DIR}")
  set(Ice_LIBRARIES "${Ice_LIBRARY}")
  foreach(_Ice_component ${Ice_FIND_COMPONENTS})
    string(TOUPPER "${_Ice_component}" _Ice_component_upcase)
    set(_Ice_component_cache "Ice_${_Ice_component_upcase}_LIBRARY")
    set(_Ice_component_cache_release "Ice_${_Ice_component_upcase}_LIBRARY_RELEASE")
    set(_Ice_component_cache_debug "Ice_${_Ice_component_upcase}_LIBRARY_DEBUG")
    set(_Ice_component_lib "Ice_${_Ice_component_upcase}_LIBRARIES")
    set(_Ice_component_found "${_Ice_component_upcase}_FOUND")
    set(_Ice_imported_target "Ice::${_Ice_component}")
    if(${_Ice_component_found})
      set("${_Ice_component_lib}" "${${_Ice_component_cache}}")
      if(NOT TARGET ${_Ice_imported_target})
        add_library(${_Ice_imported_target} UNKNOWN IMPORTED)
        set_target_properties(${_Ice_imported_target} PROPERTIES
          INTERFACE_INCLUDE_DIRECTORIES "${Ice_INCLUDE_DIRS}")
        if(EXISTS "${${_Ice_component_cache}}")
          set_target_properties(${_Ice_imported_target} PROPERTIES
            IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
            IMPORTED_LOCATION "${${_Ice_component_cache}}")
        endif()
        if(EXISTS "${${_Ice_component_cache_release}}")
          set_property(TARGET ${_Ice_imported_target} APPEND PROPERTY
            IMPORTED_CONFIGURATIONS RELEASE)
          set_target_properties(${_Ice_imported_target} PROPERTIES
            IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX"
            IMPORTED_LOCATION_RELEASE "${${_Ice_component_cache_release}}")
        endif()
        if(EXISTS "${${_Ice_component_cache_debug}}")
          set_property(TARGET ${_Ice_imported_target} APPEND PROPERTY
            IMPORTED_CONFIGURATIONS DEBUG)
          set_target_properties(${_Ice_imported_target} PROPERTIES
            IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "CXX"
            IMPORTED_LOCATION_DEBUG "${${_Ice_component_cache_debug}}")
        endif()
      endif()
    endif()
    unset(_Ice_component_upcase)
    unset(_Ice_component_cache)
    unset(_Ice_component_lib)
    unset(_Ice_component_found)
    unset(_Ice_imported_target)
  endforeach()
endif()

if(Ice_DEBUG)
  message(STATUS "--------FindIce.cmake results debug--------")
  message(STATUS "Ice_VERSION number: ${Ice_VERSION}")
  message(STATUS "Ice_HOME directory: ${Ice_HOME}")
  message(STATUS "Ice_INCLUDE_DIR directory: ${Ice_INCLUDE_DIR}")
  message(STATUS "Ice_SLICE_DIR directory: ${Ice_SLICE_DIR}")
  message(STATUS "Ice_LIBRARIES: ${Ice_LIBRARIES}")
  message(STATUS "Freeze_INCLUDE_DIR directory: ${Freeze_INCLUDE_DIR}")
  message(STATUS "Ice_INCLUDE_DIRS directory: ${Ice_INCLUDE_DIRS}")

  foreach(program ${_Ice_db_programs} ${_Ice_programs} ${_Ice_slice_programs})
    string(TOUPPER "${program}" program_upcase)
    message(STATUS "${program} executable: ${Ice_${program_upcase}_EXECUTABLE}")
  endforeach()

  foreach(component ${Ice_FIND_COMPONENTS})
    string(TOUPPER "${component}" component_upcase)
    set(component_lib "Ice_${component_upcase}_LIBRARIES")
    set(component_found "${component_upcase}_FOUND")
    message(STATUS "${component} library found: ${${component_found}}")
    message(STATUS "${component} library: ${${component_lib}}")
  endforeach()
  message(STATUS "----------------")
endif()

unset(_Ice_db_programs)
unset(_Ice_programs)
unset(_Ice_slice_programs)
