#===============================================================================
# Medical Data Segmentation Toolkit (MDSTk)
# Copyright (c) 2007 by PGMed@FIT
#
# Authors: Miroslav Svub, svub@fit.vutbr.cz
#          Michal Spanel, spanel@fit.vutbr.cz
# Section: MDSTk 
# Date:    2007/08/25
#
# $Id:$
#
# Description:
# - Configuration file for the CMake build system.

# Main project name
PROJECT( MDSTk )

# Set default build type
IF( NOT MSVC )
  IF( NOT CMAKE_BUILD_TYPE )
    SET( CMAKE_BUILD_TYPE Release CACHE STRING 
         "Choose the type of build, options are: Release and Debug." FORCE )
  ENDIF( NOT CMAKE_BUILD_TYPE )
ENDIF( NOT MSVC )

# Set platform specific preprocessor definitions
IF( WIN32 )
  ADD_DEFINITIONS( -D_WIN32 )
ELSE( WIN32 )
  IF( UNIX )
    ADD_DEFINITIONS( -D_LINUX )
    IF( CMAKE_BUILD_TYPE STREQUAL "Debug" )
      ADD_DEFINITIONS( -D_DEBUG )
    ENDIF( CMAKE_BUILD_TYPE STREQUAL "Debug" )
  ENDIF( UNIX )
ENDIF( WIN32 )


# Set output path for libraries
SET( LIBRARY_OUTPUT_PATH ${MDSTk_BINARY_DIR}/lib CACHE PATH
     "Output directory for the MDSTk libraries." )

# Set output path for binaries
SET( EXECUTABLE_OUTPUT_PATH ${MDSTk_BINARY_DIR}/bin CACHE PATH
     "Output directory for the MDSTk executables." )

# Add path to MDSTk include directories
INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/include/ )


# Build options
OPTION( BUILD_LIBRARIES "Should MDSTk libraries be built?" ON )
OPTION( BUILD_MODULES "Should MDSTk libraries be built ?" ON )
OPTION( BUILD_VECTOR_ENTITY "Should vector entity library be built?" ON )
OPTION( BUILD_TESTS "Should MDSTk tests be built ?" OFF )
OPTION( BUILD_DOCUMENTATION "Should documentation be generated ?" OFF )


# Compilation options
OPTION( MDS_LOGGING_DISABLED "Completely disables logging." OFF )
OPTION( MDS_MULTITHREADED "Enables support for multithreaded applications." OFF )
OPTION( MDS_FFTW_ENABLED "Enables the FFTW library (see its license)." ON )

# Prepare the 'configure.h' file
CONFIGURE_FILE( ${MDSTk_SOURCE_DIR}/include/MDSTk/configure.in
                ${MDSTk_BINARY_DIR}/include/MDSTk/configure.h
                @ONLY )

# Add path to the 'configure.h'
INCLUDE_DIRECTORIES( ${PROJECT_BINARY_DIR}/include/ )


# Prefer pre-compiled libraries?
OPTION( MDSTk_PREFER_SUPPLIED_LIBS
        "Prefer libraries supplied with MDSTk instead of the system ones?" ON )

# Declare paths to supplied libraries
IF( WIN32 )
  IF( MSVC )
    SET( MDSTk_SUPPLIED_LIBS_PATH ${PROJECT_SOURCE_DIR}/lib/vc
         CACHE STRING "Path to precompiled libraries supplied with MDSTk." )
  ELSE( MSVC )
    SET( MDSTk_SUPPLIED_LIBS_PATH ${PROJECT_SOURCE_DIR}/lib/win
         CACHE STRING "Path to precompiled libraries supplied with MDSTk." )
  ENDIF( MSVC )
ENDIF( WIN32 )
  IF( UNIX )
    SET( MDSTk_SUPPLIED_LIBS_PATH ${PROJECT_SOURCE_DIR}/lib/linux
         CACHE STRING "Path to precompiled libraries supplied with MDSTk." )
ENDIF( UNIX )

# Include path to libraries supplied with MDSTk
INCLUDE_DIRECTORIES( ${MDSTk_SUPPLIED_LIBS_PATH} )

# Initialize path to the supplied libraries
SET( MDSTk_ATLAS_PATH ${MDSTk_SUPPLIED_LIBS_PATH}/atlas )
SET( MDSTk_FFTW_PATH ${MDSTk_SUPPLIED_LIBS_PATH}/fftw )
SET( MDSTk_JPEG_PATH ${MDSTk_SUPPLIED_LIBS_PATH}/jpeg )
SET( MDSTk_PNG_PATH ${MDSTk_SUPPLIED_LIBS_PATH}/png )
SET( MDSTk_UMFPACK_PATH ${MDSTk_SUPPLIED_LIBS_PATH}/umfpack )
SET( MDSTk_ZLIB_PATH ${MDSTk_SUPPLIED_LIBS_PATH}/zlib )

# Find libraries supplied with MDSTk
FIND_LIBRARY( MDSTk_ATLAS
              NAMES atlas libatlas
              PATHS ${MDSTk_ATLAS_PATH}
              NO_DEFAULT_PATH NO_CMAKE_ENVIRONMENT_PATH
              NO_CMAKE_PATH NO_SYSTEM_ENVIRONMENT_PATH
              NO_CMAKE_SYSTEM_PATH )

FIND_LIBRARY( MDSTk_fftw_LIBRARY
              NAMES fftw fftw3
              PATHS ${MDSTk_FFTW_PATH}
              NO_DEFAULT_PATH NO_CMAKE_ENVIRONMENT_PATH
              NO_CMAKE_PATH NO_SYSTEM_ENVIRONMENT_PATH
              NO_CMAKE_SYSTEM_PATH )
FIND_LIBRARY( MDSTk_fftwf_LIBRARY
              NAMES fftwf fftw3f
              PATHS ${MDSTk_FFTW_PATH}
              NO_DEFAULT_PATH NO_CMAKE_ENVIRONMENT_PATH
              NO_CMAKE_PATH NO_SYSTEM_ENVIRONMENT_PATH
              NO_CMAKE_SYSTEM_PATH )
IF( MDSTk_fftwf_LIBRARY )
  SET( MDSTk_FFTW ${MDSTk_fftw_LIBRARY} ${MDSTk_fftwf_LIBRARY}
       CACHE STRING "Full path to the FFTW library." )
ELSE( MDSTk_fftwf_LIBRARY )
  SET( MDSTk_FFTW ${MDSTk_fftw_LIBRARY}
       CACHE STRING "Full path to the FFTW library." )
ENDIF( MDSTk_fftwf_LIBRARY )
MARK_AS_ADVANCED( MDSTk_fftw_LIBRARY MDSTk_fftwf_LIBRARY )

FIND_LIBRARY( MDSTk_JPEG
              NAMES jpeg libjpeg
              PATHS ${MDSTk_JPEG_PATH}
              NO_DEFAULT_PATH NO_CMAKE_ENVIRONMENT_PATH
              NO_CMAKE_PATH NO_SYSTEM_ENVIRONMENT_PATH
              NO_CMAKE_SYSTEM_PATH )

FIND_LIBRARY( MDSTk_PNG
              NAMES png libpng
              PATHS ${MDSTk_PNG_PATH}
              NO_DEFAULT_PATH NO_CMAKE_ENVIRONMENT_PATH
              NO_CMAKE_PATH NO_SYSTEM_ENVIRONMENT_PATH
              NO_CMAKE_SYSTEM_PATH )

FIND_LIBRARY( MDSTk_UMFPACK
              NAMES umfpack libumfpack
              PATHS ${MDSTk_UMFPACK_PATH}
              NO_DEFAULT_PATH NO_CMAKE_ENVIRONMENT_PATH
              NO_CMAKE_PATH NO_SYSTEM_ENVIRONMENT_PATH
              NO_CMAKE_SYSTEM_PATH )

FIND_LIBRARY( MDSTk_ZLIB zlib ${MDSTk_ZLIB_PATH}
              NO_DEFAULT_PATH NO_CMAKE_ENVIRONMENT_PATH
              NO_CMAKE_PATH NO_SYSTEM_ENVIRONMENT_PATH
              NO_CMAKE_SYSTEM_PATH )

SET( MDSTk_SUPPLIED_LIBS ${MDSTk_ATLAS}
                         ${MDSTk_FFTW}
                         ${MDSTk_JPEG}
                         ${MDSTk_PNG}
                         ${MDSTk_UMFPACK}
                         ${MDSTk_ZLIB} )


# Find the OpenGL library
IF( NOT MDSTk_OPENGL )
  INCLUDE( FindOpenGL )
  FIND_PACKAGE( OpenGL )

  # Set up used OpenGL libraries
  IF( OPENGL_FOUND )
    SET( MDSTk_OPENGL ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY}
         CACHE STRING "Full path to the OpenGL libraries." )
  ELSE( OPENGL_FOUND )
    # Set up OpenGL library manually
    IF( WIN32 )
      SET( MDSTk_OPENGL "opengl32 glu32"
           CACHE STRING "Full path to the OpenGL libraries." )
    ELSE( WIN32 )
      SET( MDSTk_OPENGL "GL GLU X11 Xi Xmu"
           CACHE STRING "Full path to the OpenGL libraries." )
    ENDIF( WIN32 )
  ENDIF( OPENGL_FOUND )

  # Error message
  IF( NOT OPENGL_FOUND )
    MESSAGE( SEND_ERROR "OpenGL library not found! Check if the predefined value MDSTk_OPENGL is valid!" )
  ENDIF( NOT OPENGL_FOUND )
ENDIF( NOT MDSTk_OPENGL )


# Find the GLUT library
IF( NOT MDSTk_GLUT )
  INCLUDE( FindGLUT )
  FIND_PACKAGE( GLUT )

  # Set up used GLUT libraries
  IF( GLUT_FOUND )
    SET( MDSTk_GLUT ${GLUT_LIBRARIES}
         CACHE STRING "Full path to the GLUT library." )
  ELSE( GLUT_FOUND )
    # Set up GLUT library manually
    IF( WIN32 )
      SET( MDSTk_GLUT glut32
           CACHE STRING "Full path to the GLUT library." )
    ELSE( WIN32 )
      SET( MDSTk_GLUT glut
           CACHE STRING "Full path to the GLUT library." )
    ENDIF( WIN32 )
  ENDIF( GLUT_FOUND )

  # Error message
  IF( NOT GLUT_FOUND )
    MESSAGE( SEND_ERROR "GLUT library not found! Check if the predefined value MDSTk_GLUT is valid!" )
  ENDIF( NOT GLUT_FOUND )
ENDIF( NOT MDSTk_GLUT )


# Continue with subdirectories
ADD_SUBDIRECTORY( src )
ADD_SUBDIRECTORY( doc )
