##=========================================================================
## 
##   Copyright (c) Kitware, Inc.
##   All rights reserved.
##   See Copyright.txt or http://www.kitware.com/VolViewCopyright.htm for details.
## 
##      This software is distributed WITHOUT ANY WARRANTY; without even
##      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
##      PURPOSE.  See the above copyright notice for more information.
## 
##=========================================================================
CMAKE_MINIMUM_REQUIRED(VERSION 2.4)
IF(COMMAND CMAKE_POLICY)
  CMAKE_POLICY(SET CMP0003 NEW)
ENDIF(COMMAND CMAKE_POLICY)

project(VolViewPlatform)

# --------------------------------------------------------------------------
# VolViewPlatform_INSTALL_BIN_DIR          - binary dir (executables)
# VolViewPlatform_INSTALL_LIB_DIR          - library dir (libs)
# VolViewPlatform_INSTALL_DATA_DIR         - share dir (say, examples, data)
# VolViewPlatform_INSTALL_INCLUDE_DIR      - include dir (headers)
# VolViewPlatform_INSTALL_PACKAGE_DIR      - package/export config files
# VolViewPlatform_INSTALL_NO_DEVELOPMENT   - do not install development files
# VolViewPlatform_INSTALL_NO_RUNTIME       - do not install runtime files
# VolViewPlatform_INSTALL_NO_DOCUMENTATION - do not install doc files
# --------------------------------------------------------------------------

# --------------------------------------------------------------------------
# Version

set(VolViewPlatform_MAJOR_VERSION 1)
set(VolViewPlatform_MINOR_VERSION 0)

# --------------------------------------------------------------------------
# Output directories

if(NOT LIBRARY_OUTPUT_PATH)
  set(LIBRARY_OUTPUT_PATH ${VolViewPlatform_BINARY_DIR}/bin CACHE INTERNAL
    "Single output directory for building all libraries.")
endif(NOT LIBRARY_OUTPUT_PATH)

if(NOT EXECUTABLE_OUTPUT_PATH)
  set(EXECUTABLE_OUTPUT_PATH ${VolViewPlatform_BINARY_DIR}/bin CACHE INTERNAL
    "Single output directory for building all executables.")
endif(NOT EXECUTABLE_OUTPUT_PATH)
set(CXX_TEST_PATH ${EXECUTABLE_OUTPUT_PATH})

# --------------------------------------------------------------------------
# Some flags

if(APPLE)
  set(CMAKE_CXX_FLAGS "-mlong-branch ${CMAKE_CXX_FLAGS}")
  set(CMAKE_C_FLAGS "-mlong-branch ${CMAKE_C_FLAGS}")
endif(APPLE)

option(BUILD_SHARED_LIBS "Build with shared libraries." ON)
set(VolViewPlatform_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})

option(BUILD_TESTING "Build testing." OFF)
option(VTK_BUILD_TESTING "Build VTK Testing." OFF)
option(ITK_BUILD_TESTING "Build ITK Testing." OFF)
mark_as_advanced(BUILD_TESTING VTK_BUILD_TESTING ITK_BUILD_TESTING)

# Disable deprecation warnings for standard C functions and all the	 
# 1.276E1265 security warnings	 
if(CMAKE_COMPILER_2005)
  add_definitions(
    -D_CRT_FAR_MAPPINGS_NO_DEPRECATE
    -D_CRT_IS_WCTYPE_NO_DEPRECATE 
    -D_CRT_MANAGED_FP_NO_DEPRECATE
    -D_CRT_NONSTDC_NO_DEPRECATE
    -D_CRT_SECURE_NO_DEPRECATE
    -D_CRT_SECURE_NO_DEPRECATE_GLOBALS
    -D_CRT_SETERRORMODE_BEEP_SLEEP_NO_DEPRECATE
    -D_CRT_TIME_FUNCTIONS_NO_DEPRECATE
    -D_CRT_VCCLRIT_NO_DEPRECATE
    -D_SCL_SECURE_NO_DEPRECATE)
endif(CMAKE_COMPILER_2005)

mark_as_advanced(CMAKE_BACKWARDS_COMPATIBILITY)

# Leave skip_rpath to OFF for now. This will make the build tree
# easier to use. The install tree would be busted anyway and require
# special launchers.

set(CMAKE_SKIP_RPATH OFF CACHE INTERNAL "" FORCE)
set(VTK_USE_RPATH ON CACHE INTERNAL "" FORCE)
set(VTKEdge_PAINTBRUSH_LABEL_TYPE "VTK_UNSIGNED_CHAR" CACHE INTERNAL "" FORCE)
if(APPLE)
  set(CMAKE_INSTALL_NAME_DIR "@executable_path/../lib" CACHE INTERNAL "" FORCE)
endif(APPLE)

# --------------------------------------------------------------------------
# Find the source dirs

get_filename_component(VolViewPlatform_PARENT_DIR
  ${VolViewPlatform_SOURCE_DIR} PATH)

find_path(VTK_SOURCE_DIR
  UseVTK.cmake.in
  PATHS ${VolViewPlatform_PARENT_DIR}/VolViewExternalLibraries/VTK
  DOC "Path to VTK source dir.")

find_path(KWWidgets_SOURCE_DIR 
  vtkKWWidget.h
  PATHS ${VolViewPlatform_PARENT_DIR}/VolViewExternalLibraries/KWWidgets
  DOC "Path to KWWidgets source dir.")

find_path(ITK_SOURCE_DIR 
  UseITK.cmake.in
  PATHS ${VolViewPlatform_PARENT_DIR}/VolViewExternalLibraries/Insight
  DOC "Path to ITK source dir.")

find_path(LesionSizingKit_SOURCE_DIR 
  LesionSizingKitReadme.txt
  PATHS ${VolViewPlatform_PARENT_DIR}/VolViewExternalLibraries/LesionSizingKit
  DOC "Path to LesionSizingKit source dir.")

find_path(VolViewLibraries_SOURCE_DIR 
  KWVolView
  PATHS ${VolViewPlatform_PARENT_DIR}/VolViewLibraries
  DOC "Path to VolViewLibraries source dir.")

find_path(VolViewApplications_SOURCE_DIR 
  VolView_Mac_Icon.icns
  PATHS ${VolViewPlatform_PARENT_DIR}/VolViewApplications
  DOC "Path to VolViewApplications source dir.")

if(NOT VTK_SOURCE_DIR OR 
    NOT KWWidgets_SOURCE_DIR OR 
    NOT ITK_SOURCE_DIR OR 
    NOT VolViewLibraries_SOURCE_DIR OR 
    NOT VolViewApplications_SOURCE_DIR)
  message(FATAL_ERROR "Make sure the source directories for the following components are set:\n  - VTK,\n  - KWWidgets,\n  - ITK,\n  - VolViewLibraries,\n  - VolViewApplications.")
endif(NOT VTK_SOURCE_DIR OR 
  NOT KWWidgets_SOURCE_DIR OR 
  NOT ITK_SOURCE_DIR OR 
  NOT VolViewLibraries_SOURCE_DIR OR 
  NOT VolViewApplications_SOURCE_DIR)

# --------------------------------------------------------------------------
# Install directories

if(NOT VolViewPlatform_INSTALL_BIN_DIR)
  set(VolViewPlatform_INSTALL_BIN_DIR "/bin")
endif(NOT VolViewPlatform_INSTALL_BIN_DIR)

if(NOT VolViewPlatform_INSTALL_LIB_DIR)
  set(VolViewPlatform_INSTALL_LIB_DIR "/lib/${PROJECT_NAME}")
endif(NOT VolViewPlatform_INSTALL_LIB_DIR)

if(NOT VolViewPlatform_INSTALL_DATA_DIR)
  set(VolViewPlatform_INSTALL_DATA_DIR "/share/${PROJECT_NAME}")
endif(NOT VolViewPlatform_INSTALL_DATA_DIR)

if(NOT VolViewPlatform_INSTALL_INCLUDE_DIR)
  set(VolViewPlatform_INSTALL_INCLUDE_DIR "/include/${PROJECT_NAME}")
endif(NOT VolViewPlatform_INSTALL_INCLUDE_DIR)

if(NOT VolViewPlatform_INSTALL_PACKAGE_DIR)
  set(VolViewPlatform_INSTALL_PACKAGE_DIR ${VolViewPlatform_INSTALL_LIB_DIR})
endif(NOT VolViewPlatform_INSTALL_PACKAGE_DIR)

set(VTK_INSTALL_LIB_DIR "/lib/vtk")
if(NOT VolViewPlatform_VTK_INSTALL_PACKAGE_DIR)
  set(VolViewPlatform_VTK_INSTALL_PACKAGE_DIR 
    ${VolViewPlatform_INSTALL_PACKAGE_DIR})
endif(NOT VolViewPlatform_VTK_INSTALL_PACKAGE_DIR)

if(NOT VolViewPlatform_ITK_INSTALL_PACKAGE_DIR)
  set(VolViewPlatform_ITK_INSTALL_PACKAGE_DIR 
    ${VolViewPlatform_INSTALL_PACKAGE_DIR})
endif(NOT VolViewPlatform_ITK_INSTALL_PACKAGE_DIR)

set(VolViewPlatform_INSTALL_NO_DEVELOPMENT 1)

if(NOT VolViewPlatform_INSTALL_NO_RUNTIME)
  if(VolViewPlatform_BUILD_SHARED_LIBS)
    set(VolViewPlatform_INSTALL_NO_RUNTIME 0)
  else(VolViewPlatform_BUILD_SHARED_LIBS)
    set(VolViewPlatform_INSTALL_NO_RUNTIME 1)
  endif(VolViewPlatform_BUILD_SHARED_LIBS)
endif(NOT VolViewPlatform_INSTALL_NO_RUNTIME)

if(NOT VolViewPlatform_INSTALL_NO_DOCUMENTATION)
  set(VolViewPlatform_INSTALL_NO_DOCUMENTATION 1)
endif(NOT VolViewPlatform_INSTALL_NO_DOCUMENTATION)

set(VolViewPlatform_INSTALL_NO_LIBRARIES)
if(VolViewPlatform_BUILD_SHARED_LIBS)
  if(VolViewPlatform_INSTALL_NO_RUNTIME AND 
      VolViewPlatform_INSTALL_NO_DEVELOPMENT)
    set(VolViewPlatform_INSTALL_NO_LIBRARIES 1)
  endif(VolViewPlatform_INSTALL_NO_RUNTIME AND 
    VolViewPlatform_INSTALL_NO_DEVELOPMENT)
else(VolViewPlatform_BUILD_SHARED_LIBS)
  if(VolViewPlatform_INSTALL_NO_DEVELOPMENT)
    set(VolViewPlatform_INSTALL_NO_LIBRARIES 1)
  endif(VolViewPlatform_INSTALL_NO_DEVELOPMENT)
endif(VolViewPlatform_BUILD_SHARED_LIBS)

# Propagate to all components

foreach(component
    VTK
    KWWidgets
    GDCM
    ITK
    VolViewLibraries
    VolViewApplications
    )
  set(${component}_BUILD_SHARED_LIBS 
    ${VolViewPlatform_BUILD_SHARED_LIBS})
  set(${component}_INSTALL_BIN_DIR 
    ${VolViewPlatform_INSTALL_BIN_DIR})
  set(${component}_VTK_INSTALL_PACKAGE_DIR 
    ${VolViewPlatform_VTK_INSTALL_PACKAGE_DIR})
  set(${component}_ITK_INSTALL_PACKAGE_DIR 
    ${VolViewPlatform_ITK_INSTALL_PACKAGE_DIR})

  set(${component}_INSTALL_NO_DEVELOPMENT 
    ${VolViewPlatform_INSTALL_NO_DEVELOPMENT})
  set(${component}_INSTALL_NO_RUNTIME 
    ${VolViewPlatform_INSTALL_NO_RUNTIME})
  set(${component}_INSTALL_NO_DOCUMENTATION 
    ${VolViewPlatform_INSTALL_NO_DOCUMENTATION})

  # Do *not* propagate:
  # - VolViewPlatform_INSTALL_INCLUDE_DIR (way too messy)
  # - VolViewPlatform_INSTALL_LIB_DIR     (too messy)
  # - VolViewPlatform_INSTALL_PACKAGE_DIR (too messy)
  # - VolViewPlatform_INSTALL_DATA_DIR    (personal preference)
  #SET(${component}_INSTALL_PACKAGE_DIR 
  #  ${VolViewPlatform_INSTALL_PACKAGE_DIR})

endforeach(component)

# --------------------------------------------------------------------------
# VTK

set(VTK_WRAP_TCL ON CACHE INTERNAL "" FORCE)

if(VolViewPlatform_BUILD_SHARED_LIBS)
  set(VTK_TCL_TK_STATIC OFF CACHE INTERNAL "" FORCE)
else(VolViewPlatform_BUILD_SHARED_LIBS)
  set(VTK_TCL_TK_STATIC ON CACHE INTERNAL "" FORCE)
endif(VolViewPlatform_BUILD_SHARED_LIBS)

# We need Tcl/Tk now

set(VTK_TCL_TK_MACROS_MODULE 
  "${VTK_SOURCE_DIR}/CMake/vtkTclTkMacros.cmake")
set(TclTk_BIN_DIR "${LIBRARY_OUTPUT_PATH}")
set(TclTk_LIB_DIR "${PROJECT_BINARY_DIR}/lib")
set(TclTk_INSTALL_LIB_DIR "/lib")
set(TclTk_INSTALL_BIN_DIR ${VolViewPlatform_INSTALL_BIN_DIR})
add_subdirectory(
  ${VolViewLibraries_SOURCE_DIR}/Utilities/TclTk
  ${VolViewPlatform_BINARY_DIR}/VolViewLibraries/Utilities/TclTk)
set(OLD_BUILD_TESTING ${BUILD_TESTING})
set(BUILD_TESTING ${VTK_BUILD_TESTING})

# Add VTK

set(METAIO_USE_OpenJPEG_DEFAULT ON)
set(VTK_DIR ${VolViewPlatform_BINARY_DIR}/VTK)
add_subdirectory(${VTK_SOURCE_DIR} ${VTK_DIR})

set(BUILD_TESTING ${OLD_BUILD_TESTING})

mark_as_advanced(
  BUILD_EXAMPLES
  VTK_DATA_ROOT
  VTK_USE_CG_SHADERS
  VTK_USE_FFMPEG_ENCODER
  VTK_USE_GLSL_SHADERS
  VTK_USE_PARALLEL
  VTK_USE_RENDERING
  VTK_USE_RPATH
  VTK_WRAP_JAVA
  VTK_WRAP_PYTHON
  )

# --------------------------------------------------------------------------
# Build OpenJPEG.
SET( OpenJPEG_INCLUDE_DIR ${VTK_SOURCE_DIR}/Utilities/OpenJPEG/libopenjpeg 
                          ${VTK_BINARY_DIR}/Utilities/OpenJPEG/libopenjpeg CACHE INTERNAL "" FORCE )
SET( OpenJPEG_LIBRARY vtkopenjpeg CACHE INTERNAL "" FORCE )
SET( OpenJPEG_JP3DVM_INCLUDE_DIR ${VTK_SOURCE_DIR}/Utilities/OpenJPEG/jp3d/libjp3dvm 
                                 ${VTK_BINARY_DIR}/Utilities/OpenJPEG/jp3d/libjp3dvm
                                 CACHE INTERNAL "" FORCE )
SET( OpenJPEG_JP3DVM_LIBRARY vtkopenjp3dvm  CACHE INTERNAL "" FORCE)
SET( OpenJPEG_FOUND_DEFAULT TRUE  CACHE INTERNAL "" FORCE)
SET( OpenJPEG_JP3DVM_FOUND_DEFAULT TRUE  CACHE INTERNAL "" FORCE)


# --------------------------------------------------------------------------
# VolViewLibraries: Utilities: GDCM

set(GDCM_BUILD_EXAMPLES_DEFAULT 0)
set(GDCM_BUILD_TESTING_DEFAULT 0)
set(GDCM_INSTALL_NO_DICTIONARY 1)
set(GDCM_VTK_DEFAULT ON)
set(GDCM_PUB_DICT_PATH "")
set(OPENJPEG_BUILD_SHARED_LIBS ${GDCM_BUILD_SHARED_LIBS})
mark_as_advanced(
  GDCM_BUILD_EXAMPLES
  GDCM_BUILD_SHARED_LIBS
  GDCM_DATA_ROOT
  GDCM_DOCUMENTATION
  GDCM_FORCE_BIGENDIAN_EMULATION
  GDCM_INSTALLER
  GDCM_PUB_DICT_PATH
  GDCM_VTK
  GDCM_WRAP_PYTHON
  )

# GDCM contains an older version of OpenJPEG. We will use the system
# version of OpenJPEG that provides support for JP3D (JPEG2000 Part 10
# Volumetric Compression) among other things.
SET( GDCM_USE_SYSTEM_OpenJPEG ON CACHE INTERNAL "" FORCE )

set(GDCM_DIR ${VolViewPlatform_BINARY_DIR}/VolViewLibraries/Utilities/gdcm)
add_subdirectory(${VolViewLibraries_SOURCE_DIR}/Utilities/gdcm ${GDCM_DIR})

# --------------------------------------------------------------------------
# VolViewLibraries: Utilities: gettext

if(WIN32)
  set(GETTEXT_INCLUDE_DIR 
    "${VolViewLibraries_SOURCE_DIR}/Utilities/gettext/include" CACHE PATH "")
  mark_as_advanced(GETTEXT_INCLUDE_DIR)
endif(WIN32)

# --------------------------------------------------------------------------
# ITK

set(ITK_USE_SYSTEM_GDCM ON CACHE INTERNAL "" FORCE)
set(OLD_BUILD_TESTING ${BUILD_TESTING})
set(BUILD_TESTING ${ITK_BUILD_TESTING})

set(ITK_DIR ${VolViewPlatform_BINARY_DIR}/ITK)
add_subdirectory(${ITK_SOURCE_DIR} ${ITK_DIR})

set(BUILD_TESTING OFF)
set(LesionSizingKit_DIR ${VolViewPlatform_BINARY_DIR}/LesionSizingKit)
add_subdirectory(${LesionSizingKit_SOURCE_DIR} ${LesionSizingKit_DIR})

set(BUILD_TESTING ${OLD_BUILD_TESTING})

# --------------------------------------------------------------------------
# KWWidgets

# We need VTK's include path. Since VTK_SOURCE_DIR is defined, the sub
# packages in VolViewLibraries won't bother using FIND_PACKAGE and will
# rely on include paths and libs path to be set globally, thanks to
# the Complete framework that has been going on for some time.
# Let's not hack and include VTK just to way it is supposed to be.

find_package(VTK REQUIRED)
include(${VTK_USE_FILE})

set(KWWidgets_DIR ${VolViewPlatform_BINARY_DIR}/KWWidgets)

set(HTML_HELP_INCLUDE_PATH "" CACHE INTERNAL "" FORCE)
set(HTML_HELP_LIBRARY "" CACHE INTERNAL "" FORCE)

add_subdirectory(${KWWidgets_SOURCE_DIR} ${KWWidgets_DIR})

# --------------------------------------------------------------------------
# VolViewLibraries

set(VolViewLibraries_USE_ITK ON CACHE INTERNAL "" FORCE)
set(VolViewLibraries_USE_GDCM ON CACHE INTERNAL "" FORCE)
set(VolViewLibraries_DO_NOT_BUILD_GDCM ON CACHE INTERNAL "" FORCE)
set(VolViewLibraries_USE_RPATH ${VTK_USE_RPATH} CACHE INTERNAL "" FORCE)

set(VolViewLibraries_DIR ${VolViewPlatform_BINARY_DIR}/VolViewLibraries)
add_subdirectory(${VolViewLibraries_SOURCE_DIR} ${VolViewLibraries_DIR})

# --------------------------------------------------------------------------
# VolViewApplications

set(VolViewApplications_DIR ${VolViewPlatform_BINARY_DIR}/VolViewApplications)
add_subdirectory(${VolViewApplications_SOURCE_DIR} ${VolViewApplications_DIR})

# --------------------------------------------------------------------------
# Testing

include(CTest)
mark_as_advanced(BUILD_TESTING DART_ROOT TCL_TCLSH)
if(BUILD_TESTING)
  enable_testing()
endif(BUILD_TESTING)
