# Id
#
## Copyright 2003 Sandia Coporation
## Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
## license for use of this work by or on behalf of the U.S. Government.
## Redistribution and use in source and binary forms, with or without
## modification, are permitted provided that this Notice and any statement
## of authorship are reproduced on all copies.
#

PROJECT(ICET C)
CMAKE_MINIMUM_REQUIRED(VERSION 2.4)
IF(COMMAND cmake_policy)
  CMAKE_POLICY(SET CMP0003 NEW)
ENDIF(COMMAND cmake_policy)

# Set the current ICE-T version.
SET(ICET_MAJOR_VERSION 1)
SET(ICET_MINOR_VERSION 0)
SET(ICET_PATCH_VERSION 0)
SET(ICET_VERSION "${ICET_MAJOR_VERSION}.${ICET_MINOR_VERSION}.${ICET_PATCH_VERSION}")

# Set output paths.
SET(LIBRARY_OUTPUT_PATH ${ICET_BINARY_DIR}/bin CACHE PATH
  "Output directory for building all libraries.")
SET(EXECUTABLE_OUTPUT_PATH ${ICET_BINARY_DIR}/bin CACHE PATH
  "Output directory for building all executable.")
MARK_AS_ADVANCED(LIBRARY_OUTPUT_PATH EXECUTABLE_OUTPUT_PATH)
SET(ICET_LIBRARY_DIR ${LIBRARY_OUTPUT_PATH})
SET(ICET_EXECUTABLE_DIR ${EXECUTABLE_OUTPUT_PATH})
SET(C_TEST_PATH ${EXECUTABLE_OUTPUT_PATH})

# Turn shared libraries on or off.
OPTION(BUILD_SHARED_LIBS "Build ICE-T with shared libraries." OFF)
SET(ICET_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})

# Configure testing support.
INCLUDE(Dart)
IF (BUILD_TESTING)
  ENABLE_TESTING()
ENDIF (BUILD_TESTING)

IF (CMAKE_BUILD_TYPE MATCHES "Debug")
  ADD_DEFINITIONS(-DDEBUG)
ENDIF (CMAKE_BUILD_TYPE MATCHES "Debug")


# Configure OpenGL support.
FIND_PACKAGE(OpenGL)
IF (OPENGL_FOUND)
  INCLUDE_DIRECTORIES(${OPENGL_INCLUDE_DIR})
  LINK_LIBRARIES(${OPENGL_LIBRARIES})
ELSE (OPENGL_FOUND)

  FIND_PACKAGE(OSMesa)
  IF (OSMESA_INCLUDE_DIR AND OSMESA_LIBRARY)
    INCLUDE_DIRECTORIES(${OSMESA_INCLUDE_DIR})
    LINK_LIBRARIES(${OSMESA_LIBRARY})
  ELSE(OSMESA_INCLUDE_DIR AND OSMESA_LIBRARY)
    MESSAGE(SEND_ERROR "Could not find OpenGL or OSMesa, which is required to compile ICE-T.")
  ENDIF (OSMESA_INCLUDE_DIR AND OSMESA_LIBRARY)
ENDIF (OPENGL_FOUND)

# Configure MPI support.
FIND_PACKAGE(MPI)
MARK_AS_ADVANCED(CLEAR MPI_INCLUDE_PATH)
MARK_AS_ADVANCED(CLEAR MPI_LIBRARY)
MARK_AS_ADVANCED(CLEAR MPI_EXTRA_LIBRARY)
IF (MPI_INCLUDE_PATH)
  INCLUDE_DIRECTORIES(${MPI_INCLUDE_PATH})
ELSE (MPI_INCLUDE_PATH)
  MESSAGE(SEND_ERROR "Could not find MPI includes, which is required to compile ICE-T.")
ENDIF (MPI_INCLUDE_PATH)
IF (MPI_LIBRARY)
  LINK_LIBRARIES(${MPI_LIBRARY})
ELSE (MPI_LIBRARY)
  MESSAGE(SEND_ERROR "Could not find MPI library, which is required to compile ICE-T.")
ENDIF (MPI_LIBRARY)
IF (MPI_EXTRA_LIBRARY)
  LINK_LIBRARIES(${MPI_EXTRA_LIBRARY})
ENDIF (MPI_EXTRA_LIBRARY)


# Configure MPI testing support.
IF (BUILD_TESTING)
  OPTION(ICET_BUILD_TESTING "Build and run the ICE-T tests." ON)
  FIND_PROGRAM(ICET_MPIRUN_EXE NAMES mpirun lamexec)
  SET(ICET_MPI_PREFLAGS "-np;2" CACHE STRING "Flags used by MPI start program.")
  SET(ICET_MPI_POSTFLAGS "" CACHE STRING "Flags used by MPI start program.")
  SET(ICET_MPI_MAX_NUMPROCS "2" CACHE STRING "Maximum number of processors available to run parallel applications.")
  MARK_AS_ADVANCED(ICET_BUILD_TESTING ICET_MPIRUN_EXE ICET_MPI_PREFLAGS ICET_MPI_POSTFLAGS ICET_MPI_MAX_NUMPROCS)
  SEPARATE_ARGUMENTS(ICET_MPI_PREFLAGS)
  SEPARATE_ARGUMENTS(ICET_MPI_POSTFLAGS)
ENDIF (BUILD_TESTING)

# Configure data type sizes.
INCLUDE (CheckTypeSize)
CHECK_TYPE_SIZE(char        ICET_SIZEOF_CHAR)
CHECK_TYPE_SIZE(short       ICET_SIZEOF_SHORT)
CHECK_TYPE_SIZE(int         ICET_SIZEOF_INT)
CHECK_TYPE_SIZE(long        ICET_SIZEOF_LONG)
CHECK_TYPE_SIZE("long long" ICET_SIZEOF_LONG_LONG)
CHECK_TYPE_SIZE(__int64     ICET_SIZEOF___INT64)
CHECK_TYPE_SIZE(float       ICET_SIZEOF_FLOAT)
CHECK_TYPE_SIZE(double      ICET_SIZEOF_DOUBLE)
CHECK_TYPE_SIZE("void*"     ICET_SIZEOF_VOID_P)

#-----------------------------------------------------------------------------
# Configure install locations.  This allows parent projects to modify
# the install location.
IF(NOT ICET_INSTALL_BIN_DIR)
  SET(ICET_INSTALL_BIN_DIR bin)
ENDIF(NOT ICET_INSTALL_BIN_DIR)
IF(NOT ICET_INSTALL_INCLUDE_DIR)
  SET(ICET_INSTALL_INCLUDE_DIR include)
ENDIF(NOT ICET_INSTALL_INCLUDE_DIR)
IF(NOT ICET_INSTALL_LIB_DIR)
  SET(ICET_INSTALL_LIB_DIR lib)
ENDIF(NOT ICET_INSTALL_LIB_DIR)
IF(NOT ICET_INSTALL_MAN_DIR)
  SET(ICET_INSTALL_MAN_DIR share/man)
ENDIF(NOT ICET_INSTALL_MAN_DIR)

# Shared libraries are considered both runtime and development and
# static libraries are considered development only.  In order to
# switch library installation on and off correctly we make the
# decision here.
SET(ICET_INSTALL_NO_LIBRARIES)
IF(BUILD_SHARED_LIBS)
  IF(ICET_INSTALL_NO_RUNTIME AND ICET_INSTALL_NO_DEVELOPMENT)
    SET(ICET_INSTALL_NO_LIBRARIES 1)
  ENDIF(ICET_INSTALL_NO_RUNTIME AND ICET_INSTALL_NO_DEVELOPMENT)
ELSE(BUILD_SHARED_LIBS)
  IF(ICET_INSTALL_NO_DEVELOPMENT)
    SET(ICET_INSTALL_NO_LIBRARIES 1)
  ENDIF(ICET_INSTALL_NO_DEVELOPMENT)
ENDIF(BUILD_SHARED_LIBS)

# Configure files with settings for use by the build.
CONFIGURE_FILE(${ICET_SOURCE_DIR}/src/include/GL/ice-t_config.h.in
               ${ICET_BINARY_DIR}/src/include/GL/ice-t_config.h)

# Point to ICE-T include files.
INCLUDE_DIRECTORIES(${ICET_SOURCE_DIR}/src/include)
INCLUDE_DIRECTORIES(${ICET_BINARY_DIR}/src/include)

ADD_SUBDIRECTORY(src)

IF (BUILD_TESTING AND ICET_BUILD_TESTING)
  IF (NOT APPLE)
    ADD_SUBDIRECTORY(tests)
  ELSE (NOT APPLE)
    MESSAGE(STATUS "Tests not supported on Mac.  Disabling.")
  ENDIF (NOT APPLE)
ENDIF (BUILD_TESTING AND ICET_BUILD_TESTING)

ADD_SUBDIRECTORY(doc)

# Save the CMake settings so another project can import them.  Loaded by:
#  INCLUDE(${CMAKE_ROOT}/Modules/CMakeImportBuildSettings.cmake)
#  CMAKE_IMPORT_BUILD_SETTINGS(<build_file>)
INCLUDE(CMakeExportBuildSettings)
CMAKE_EXPORT_BUILD_SETTINGS(${ICET_BINARY_DIR}/ICETBuildSettings.cmake)
INSTALL(FILES ${ICET_BINARY_DIR}/ICETBuildSettings.cmake DESTINATION ${ICET_INSTALL_LIB_DIR})

# Save the library dependency graph for external projects.
EXPORT_LIBRARY_DEPENDENCIES(${ICET_BINARY_DIR}/ICETLibraryDepends.cmake)
INSTALL(FILES ${ICET_BINARY_DIR}/ICETLibraryDepends.cmake DESTINATION ${ICET_INSTALL_LIB_DIR})

# Save ICE-T specific configuration options.
#First, configuration for build directory.
SET(ICET_INCLUDE_DIRS_CONFIG "${ICET_SOURCE_DIR}/src/include;${ICET_BINARY_DIR}/src/include")
SET(ICET_LIBRARY_DIRS_CONFIG ${ICET_LIBRARY_DIR})
SET(ICET_USE_FILE_CONFIG ${ICET_SOURCE_DIR}/UseICET.cmake)
SET(ICET_BUILD_SETTINGS_FILE_CONFIG ${ICET_BINARY_DIR}/ICETBuildSettings.cmake)
SET(ICET_LIBRARY_DEPENDS_FILE ${ICET_BINARY_DIR}/ICETLibraryDepends.cmake)
GET_TARGET_PROPERTY(ICET_LIBRARY_FILE icet LOCATION)
GET_TARGET_PROPERTY(ICET_STRATEGIES_LIBRARY_FILE icet_strategies LOCATION)
GET_TARGET_PROPERTY(ICET_MPI_LIBRARY_FILE icet_mpi LOCATION)
CONFIGURE_FILE(${ICET_SOURCE_DIR}/ICETConfig.cmake.in
  ${ICET_BINARY_DIR}/ICETConfig.cmake @ONLY IMMEDIATE)
#Second, configuration for install directory.
SET(ICET_INCLUDE_DIRS_CONFIG ${CMAKE_INSTALL_PREFIX}${ICET_INSTALL_INCLUDE_DIR})
SET(ICET_LIBRARY_DIRS_CONFIG ${CMAKE_INSTALL_PREFIX}${ICET_INSTALL_LIB_DIR})
SET(ICET_USE_FILE_CONFIG ${CMAKE_INSTALL_PREFIX}${ICET_INSTALL_LIB_DIR}/UseICET.cmake)
SET(ICET_BUILD_SETTINGS_FILE_CONFIG
  ${CMAKE_INSTALL_PREFIX}${ICET_INSTALL_LIB_DIR}/ICETBuildSettings.cmake)
SET(ICET_LIBRARY_DEPENDS_FILE
  ${CMAKE_INSTALL_PREFIX}${ICET_INSTALL_LIB_DIR}/ICETLibraryDepends.cmake)
GET_FILENAME_COMPONENT(ICET_LIBRARY_FILE "${ICET_LIBRARY_FILE}" NAME)
SET(ICET_LIBRARY_FILE "${CMAKE_INSTALL_PREFIX}${ICET_INSTALL_LIB_DIR}/${ICET_LIBRARY_FILE}")
GET_FILENAME_COMPONENT(ICET_STRATEGIES_LIBRARY_FILE "${ICET_STRATEGIES_LIBRARY_FILE}" NAME)
SET(ICET_STRATEGIES_LIBRARY_FILE "${CMAKE_INSTALL_PREFIX}${ICET_INSTALL_LIB_DIR}/${ICET_STRATEGIES_LIBRARY_FILE}")
GET_FILENAME_COMPONENT(ICET_MPI_LIBRARY_FILE "${ICET_MPI_LIBRARY_FILE}" NAME)
SET(ICET_MPI_LIBRARY_FILE "${CMAKE_INSTALL_PREFIX}${ICET_INSTALL_LIB_DIR}/${ICET_MPI_LIBRARY_FILE}")
CONFIGURE_FILE(${ICET_SOURCE_DIR}/ICETConfig.cmake.in
               ${ICET_LIBRARY_DIR}/ICETConfig.cmake @ONLY IMMEDIATE)
INSTALL(FILES ${ICET_SOURCE_DIR}/UseICET.cmake ${ICET_LIBRARY_DIR}/ICETConfig.cmake DESTINATION ${ICET_INSTALL_LIB_DIR})

# Allow local additions to this file without CVS conflicts.
INCLUDE(${ICET_BINARY_DIR}/LocalUserOptions.cmake OPTIONAL)
INCLUDE(${ICET_SOURCE_DIR}/LocalUserOptions.cmake OPTIONAL)
