# - Find CABLE
# This module finds if CABLE is installed and determines where the
# include files and libraries are.  This code sets the following variables:
#
#  CABLE             the path to the cable executable
#  CABLE_TCL_LIBRARY the path to the Tcl wrapper library
#  CABLE_INCLUDE_DIR the path to the include directory
#
# To build Tcl wrappers, you should add shared library and link it to
# ${CABLE_TCL_LIBRARY}.  You should also add ${CABLE_INCLUDE_DIR} as
# an include directory.

IF(NOT CABLE)
  FIND_PATH(CABLE_BUILD_DIR cableVersion.h)
ENDIF(NOT CABLE)

IF(CABLE_BUILD_DIR)
  LOAD_CACHE(${CABLE_BUILD_DIR}
             EXCLUDE
               BUILD_SHARED_LIBS
               LIBRARY_OUTPUT_PATH
               EXECUTABLE_OUTPUT_PATH
               MAKECOMMAND
               CMAKE_INSTALL_PREFIX
             INCLUDE_INTERNALS
               CABLE_LIBRARY_PATH
               CABLE_EXECUTABLE_PATH)

  IF(CABLE_LIBRARY_PATH)
    FIND_LIBRARY(CABLE_TCL_LIBRARY NAMES CableTclFacility PATHS
                 ${CABLE_LIBRARY_PATH}
                 ${CABLE_LIBRARY_PATH}/*)
  ELSE(CABLE_LIBRARY_PATH)
    FIND_LIBRARY(CABLE_TCL_LIBRARY NAMES CableTclFacility PATHS
                 ${CABLE_BINARY_DIR}/CableTclFacility
                 ${CABLE_BINARY_DIR}/CableTclFacility/*)
  ENDIF(CABLE_LIBRARY_PATH)

  IF(CABLE_EXECUTABLE_PATH)
    FIND_PROGRAM(CABLE NAMES cable PATHS
                 ${CABLE_EXECUTABLE_PATH}
                 ${CABLE_EXECUTABLE_PATH}/*)
  ELSE(CABLE_EXECUTABLE_PATH)
    FIND_PROGRAM(CABLE NAMES cable PATHS
                 ${CABLE_BINARY_DIR}/Executables
                 ${CABLE_BINARY_DIR}/Executables/*)
  ENDIF(CABLE_EXECUTABLE_PATH)

  FIND_PATH(CABLE_INCLUDE_DIR CableTclFacility/ctCalls.h
            ${CABLE_SOURCE_DIR})
ELSE(CABLE_BUILD_DIR)
  # Find the cable executable in the path.
  FIND_PROGRAM(CABLE NAMES cable)

  # Get the path where the executable sits, but without the executable
  # name on it.
  GET_FILENAME_COMPONENT(CABLE_ROOT_BIN ${CABLE} PATH)

  # Find the cable include directory in a path relative to the cable
  # executable.
  FIND_PATH(CABLE_INCLUDE_DIR CableTclFacility/ctCalls.h
            ${CABLE_ROOT_BIN}/../include/Cable)

  # Find the WrapTclFacility library in a path relative to the cable
  # executable.
  FIND_LIBRARY(CABLE_TCL_LIBRARY NAMES CableTclFacility PATHS
               ${CABLE_ROOT_BIN}/../lib/Cable)
ENDIF(CABLE_BUILD_DIR)
