# FindIce

Added in version 3.1.

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

    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.

Added in version 3.4: Imported targets for components and many new `*_EXECUTABLE` variables.

Added in version 3.7: Debug and Release library variants are found separately.

Added in version 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 `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:

    find_package(Ice COMPONENTS <components>...)

Supported components include:

- `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:

- `Glacier2++11`

- `Ice++11`

- `IceBox++11`

- `IceDiscovery++11`

- `IceGrid++11`

- `IceLocatorDiscovery++11`

- `IceSSL++11`

- `IceStorm++11`

## Imported Targets

This module provides the following Imported Targets:

`Ice::<component>`

  Added in version 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 (requested version of) 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 was 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`

  Added in version 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`

  Added in version 3.4.

  The path to the `slice2js` executable.

`Ice_SLICE2MATLAB_EXECUTABLE`

  Added in version 3.14.

  The path to the `slice2matlab` executable.

`Ice_SLICE2OBJC_EXECUTABLE`

  Added in version 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`

  Added in version 3.4.

  The path to the `glacier2router` executable.

`Ice_ICEBOX_EXECUTABLE`

  Added in version 3.4.

  The path to the `icebox` executable.

`Ice_ICEBOX++11_EXECUTABLE`

  Added in version 3.10.

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

`Ice_ICEBOXADMIN_EXECUTABLE`

  Added in version 3.4.

  The path to the `iceboxadmin` executable.

`Ice_ICEBOXD_EXECUTABLE`

  Added in version 3.4.

  The path to the `iceboxd` executable.

`Ice_ICEBOXNET_EXECUTABLE`

  Added in version 3.4.

  The path to the `iceboxnet` executable.

`Ice_ICEBRIDGE_EXECUTABLE`

  Added in version 3.10.

  The path to the `icebridge` executable.

`Ice_ICEGRIDADMIN_EXECUTABLE`

  Added in version 3.4.

  The path to the `icegridadmin` executable.

`Ice_ICEGRIDDB_EXECUTABLE`

  Added in version 3.10.

  The path to the `icegriddb` executable.

`Ice_ICEGRIDNODE_EXECUTABLE`

  Added in version 3.4.

  The path to the `icegridnode` executable.

`Ice_ICEGRIDNODED_EXECUTABLE`

  Added in version 3.4.

  The path to the `icegridnoded` executable.

`Ice_ICEGRIDREGISTRY_EXECUTABLE`

  Added in version 3.4.

  The path to the `icegridregistry` executable.

`Ice_ICEGRIDREGISTRYD_EXECUTABLE`

  Added in version 3.4.

  The path to the `icegridregistryd` executable.

`Ice_ICEPATCH2CALC_EXECUTABLE`

  The path to the `icepatch2calc` executable.

`Ice_ICEPATCH2CLIENT_EXECUTABLE`

  Added in version 3.4.

  The path to the `icepatch2client` executable.

`Ice_ICEPATCH2SERVER_EXECUTABLE`

  Added in version 3.4.

  The path to the `icepatch2server` executable.

`Ice_ICESERVICEINSTALL_EXECUTABLE`

  Added in version 3.4.

  The path to the `iceserviceinstall` executable.

`Ice_ICESTORMADMIN_EXECUTABLE`

  Added in version 3.4.

  The path to the `icestormadmin` executable.

`Ice_ICESTORMDB_EXECUTABLE`

  Added in version 3.10.

  The path to the `icestormdb` executable.

`Ice_ICESTORMMIGRATE_EXECUTABLE`

  Added in version 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`

  Added in version 3.4.

  The path to the `db_archive` executable.

`Ice_DB_CHECKPOINT_EXECUTABLE`

  Added in version 3.4.

  The path to the `db_checkpoint` executable.

`Ice_DB_DEADLOCK_EXECUTABLE`

  Added in version 3.4.

  The path to the `db_deadlock` executable.

`Ice_DB_DUMP_EXECUTABLE`

  Added in version 3.4.

  The path to the `db_dump` executable.

`Ice_DB_HOTBACKUP_EXECUTABLE`

  Added in version 3.4.

  The path to the `db_hotbackup` executable.

`Ice_DB_LOAD_EXECUTABLE`

  Added in version 3.4.

  The path to the `db_load` executable.

`Ice_DB_LOG_VERIFY_EXECUTABLE`

  Added in version 3.4.

  The path to the `db_log_verify` executable.

`Ice_DB_PRINTLOG_EXECUTABLE`

  Added in version 3.4.

  The path to the `db_printlog` executable.

`Ice_DB_RECOVER_EXECUTABLE`

  Added in version 3.4.

  The path to the `db_recover` executable.

`Ice_DB_STAT_EXECUTABLE`

  Added in version 3.4.

  The path to the `db_stat` executable.

`Ice_DB_TUNER_EXECUTABLE`

  Added in version 3.4.

  The path to the `db_tuner` executable.

`Ice_DB_UPGRADE_EXECUTABLE`

  Added in version 3.4.

  The path to the `db_upgrade` executable.

`Ice_DB_VERIFY_EXECUTABLE`

  Added in version 3.4.

  The path to the `db_verify` executable.

`Ice_DUMPDB_EXECUTABLE`

  Added in version 3.4.

  The path to the `dumpdb` executable.

`Ice_TRANSFORMDB_EXECUTABLE`

  Added in version 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 `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:

    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:

    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:

    find_package(Ice COMPONENTS Ice OPTIONAL_COMPONENTS Freeze)