# - Find an ITK installation or build tree.

# When ITK is found, the ITKConfig.cmake file is sourced to setup the
# location and configuration of ITK.  Please read this file, or
# ITKConfig.cmake.in from the ITK source tree for the full list of
# definitions.  Of particular interest is ITK_USE_FILE, a CMake source file
# that can be included to set the include directories, library directories,
# and preprocessor macros.  In addition to the variables read from
# ITKConfig.cmake, this find module also defines
#  ITK_DIR  - The directory containing ITKConfig.cmake.  
#             This is either the root of the build tree, 
#             or the lib/InsightToolkit directory.  
#             This is the only cache entry.
#   
#  ITK_FOUND - Whether ITK was found.  If this is true, 
#              ITK_DIR is okay.
#
#  USE_ITK_FILE - The full path to the UseITK.cmake file.  
#                 This is provided for backward 
#                 compatability.  Use ITK_USE_FILE
#                 instead.


SET(ITK_DIR_STRING "directory containing ITKConfig.cmake.  This is either the root of the build tree, or PREFIX/lib/InsightToolkit for an installation.")

# Search only if the location is not already known.
IF(NOT ITK_DIR)
  # Get the system search path as a list.
  IF(UNIX)
    STRING(REGEX MATCHALL "[^:]+" ITK_DIR_SEARCH1 "$ENV{PATH}")
  ELSE(UNIX)
    STRING(REGEX REPLACE "\\\\" "/" ITK_DIR_SEARCH1 "$ENV{PATH}")
  ENDIF(UNIX)
  STRING(REGEX REPLACE "/;" ";" ITK_DIR_SEARCH2 ${ITK_DIR_SEARCH1})

  # Construct a set of paths relative to the system search path.
  SET(ITK_DIR_SEARCH "")
  FOREACH(dir ${ITK_DIR_SEARCH2})
    SET(ITK_DIR_SEARCH ${ITK_DIR_SEARCH} "${dir}/../lib/InsightToolkit")
  ENDFOREACH(dir)

  #
  # Look for an installation or build tree.
  #
  FIND_PATH(ITK_DIR ITKConfig.cmake
    # Look for an environment variable ITK_DIR.
    $ENV{ITK_DIR}

    # Look in places relative to the system executable search path.
    ${ITK_DIR_SEARCH}

    # Look in standard UNIX install locations.
    /usr/local/lib/InsightToolkit
    /usr/lib/InsightToolkit

    # Read from the CMakeSetup registry entries.  It is likely that
    # ITK will have been recently built.
    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild1]
    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild2]
    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild3]
    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild4]
    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild5]
    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild6]
    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild7]
    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild8]
    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild9]
    [HKEY_CURRENT_USER\\Software\\Kitware\\CMakeSetup\\Settings\\StartPath;WhereBuild10]

    # Help the user find it if we cannot.
    DOC "The ${ITK_DIR_STRING}"
  )
ENDIF(NOT ITK_DIR)

# If ITK was found, load the configuration file to get the rest of the
# settings.
IF(ITK_DIR)
  SET(ITK_FOUND 1)
  INCLUDE(${ITK_DIR}/ITKConfig.cmake)

  # Set USE_ITK_FILE for backward-compatability.
  SET(USE_ITK_FILE ${ITK_USE_FILE})
ELSE(ITK_DIR)
  SET(ITK_FOUND 0)
  IF(ITK_FIND_REQUIRED)
    MESSAGE(FATAL_ERROR "Please set ITK_DIR to the ${ITK_DIR_STRING}")
  ENDIF(ITK_FIND_REQUIRED)
ENDIF(ITK_DIR)
