##=========================================================================
## 
##   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(VolViewLibraries)

# --------------------------------------------------------------------------
# To use this library in a larger project you will need to SUBDIR into this
# directory so that it gets built and then you will use the following variables
# in your CMakeLists files to get the proper include paths and libraries
set(VolViewLibraries_INCLUDE_PATH ""
  CACHE INTERNAL "include paths for VolViewLibraries")

set(VolViewLibraries_LIBRARIES ""
  CACHE INTERNAL "libraries for VolViewLibraries")

# You will also need to define a value for the following variables:
# VolViewLibraries_INSTALL_BIN_DIR          - binary dir (executables)
# VolViewLibraries_INSTALL_LIB_DIR          - library dir (libs)
# VolViewLibraries_INSTALL_DATA_DIR         - share dir (say, examples, data)
# VolViewLibraries_INSTALL_INCLUDE_DIR      - include dir (headers)
# VolViewLibraries_INSTALL_PACKAGE_DIR      - package/export config files
# VolViewLibraries_VTK_INSTALL_PACKAGE_DIR  - VTK package/export config files
# VolViewLibraries_ITK_INSTALL_PACKAGE_DIR  - ITK package/export config files
# VolViewLibraries_KWVolView_INSTALL_PACKAGE_DIR  - KWVolView package/export config files
# VolViewLibraries_INSTALL_NO_DEVELOPMENT   - do not install development files
# VolViewLibraries_INSTALL_NO_RUNTIME       - do not install runtime files
# VolViewLibraries_INSTALL_NO_DOCUMENTATION - do not install doc files
# --------------------------------------------------------------------------

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

set(VolViewLibraries_MAJOR_VERSION 1)
set(VolViewLibraries_MINOR_VERSION 0)

# --------------------------------------------------------------------------
# A few important variables

set(WIN32_64BITS ${CMAKE_CL_64})

set(VolViewLibraries_USE_GDCM 1)

set(BUILD_EXAMPLES 0)

# CMake includes
include (CheckIncludeFiles)

# --------------------------------------------------------------------------
# We need various packages

macro(VolViewLibraries_REQUIRE_PACKAGE PACKAGE_NAME)
  if(NOT ${PACKAGE_NAME}_SOURCE_DIR)
    find_package(${PACKAGE_NAME} REQUIRED)
    if(${PACKAGE_NAME}_FOUND)
      include(${${PACKAGE_NAME}_USE_FILE})
    endif(${PACKAGE_NAME}_FOUND)
  endif(NOT ${PACKAGE_NAME}_SOURCE_DIR)
endmacro(VolViewLibraries_REQUIRE_PACKAGE PACKAGE_NAME)

# KWWidgets (this will bring VTK)

volviewlibraries_require_package(KWWidgets)
mark_as_advanced(CMAKE_BUILD_TYPE)

# ITK
# Not sure yet if we should include the package, since it brings so many
# include paths and dependencies. But we need to check the GDCM issue.
# Maybe this can be put in a macro.

option(VolViewLibraries_USE_ITK "Enable ITK support." 0)
if(VolViewLibraries_USE_ITK)
  volviewlibraries_require_package(ITK)
  if(NOT ITK_USE_SYSTEM_GDCM AND VolViewLibraries_USE_GDCM)
    message(FATAL_ERROR "${PROJECT_NAME} uses its own version of the GDCM library, but so does ITK. For ITK support to be enabled, please make sure ITK is using the GDCM library built by ${PROJECT_NAME}. In order to do so, please:\n  - turn VolViewLibraries_USE_ITK back to OFF,\n  - build the entire ${PROJECT_NAME} project,\n  - set ITK_USE_SYSTEM_GDCM to ON in ITK,\n  - set GDCM_DIR to ${PROJECT_BINARY_DIR}/Utilities/gdcm in ITK,\n  - build ITK,\n  - turn VolViewLibraries_USE_ITK back to ON,\n  - build ${PROJECT_NAME}.")
  endif(NOT ITK_USE_SYSTEM_GDCM AND VolViewLibraries_USE_GDCM)
endif(VolViewLibraries_USE_ITK)

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

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

set(VolViewLibraries_LIBRARY_DIRS ${LIBRARY_OUTPUT_PATH})
set(VolViewLibraries_RUNTIME_DIRS ${LIBRARY_OUTPUT_PATH})

if(NOT EXECUTABLE_OUTPUT_PATH)
  set(EXECUTABLE_OUTPUT_PATH ${VolViewLibraries_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

# 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)

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

set(BUILD_SHARED_LIBS ${VTK_BUILD_SHARED_LIBS})
set(VolViewLibraries_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})

set(VolViewLibraries_CMAKE_DIR "${VolViewLibraries_SOURCE_DIR}/CMake")
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${VolViewLibraries_CMAKE_DIR}")

set(VolViewLibraries_CONFIGURATION_TYPES ${CMAKE_CONFIGURATION_TYPES})

mark_as_advanced(CMAKE_BACKWARDS_COMPATIBILITY)
if(NOT WIN32)
  mark_as_advanced(
    TCL_INCLUDE_PATH
    TCL_LIBRARY_DEBUG
    TK_INCLUDE_PATH
    TK_LIBRARY_DEBUG
    TK_WISH
    )
endif(NOT WIN32)

if(NOT WIN32 AND BUILD_SHARED_LIBS)
  option(VolViewLibraries_USE_RPATH 
    "Enable RPATH support. Leave it ON unless you really need that feature." 
    ON)
  mark_as_advanced(VolViewLibraries_USE_RPATH)
  if(VolViewLibraries_USE_RPATH)
    set(CMAKE_SKIP_RPATH OFF CACHE INTERNAL "" FORCE)
  else(VolViewLibraries_USE_RPATH)
    set(CMAKE_SKIP_RPATH ON CACHE INTERNAL "" FORCE)
  endif(VolViewLibraries_USE_RPATH)
endif(NOT WIN32 AND BUILD_SHARED_LIBS)

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

include(CTest)
mark_as_advanced(BUILD_TESTING DART_ROOT TCL_TCLSH)
if(BUILD_TESTING)
  enable_testing()
  find_path(VolView_DATA_ROOT VolViewDataREADME.txt 
    ${VolViewLibraries_SOURCE_DIR}/../VolViewData 
    ${VolViewLibraries_SOURCE_DIR}/../../VolViewData 
    ${VolViewLibraries_SOURCE_DIR}/../VolViewData-cvs 
    ${VolViewLibraries_SOURCE_DIR}/../../VolViewData-cvs 
    $ENV{VolViewData_ROOT}
    )
  mark_as_advanced(VolView_DATA_ROOT)
endif(BUILD_TESTING)

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

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

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

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

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

if(NOT VolViewLibraries_INSTALL_PACKAGE_DIR)
  set(VolViewLibraries_INSTALL_PACKAGE_DIR ${VolViewLibraries_INSTALL_LIB_DIR})
endif(NOT VolViewLibraries_INSTALL_PACKAGE_DIR)

if(NOT VolViewLibraries_VTK_INSTALL_PACKAGE_DIR)
  set(VolViewLibraries_VTK_INSTALL_PACKAGE_DIR ${VTK_INSTALL_PACKAGE_DIR})
endif(NOT VolViewLibraries_VTK_INSTALL_PACKAGE_DIR)

if(NOT VolViewLibraries_ITK_INSTALL_PACKAGE_DIR)
  set(VolViewLibraries_ITK_INSTALL_PACKAGE_DIR ${ITK_INSTALL_PACKAGE_DIR})
endif(NOT VolViewLibraries_ITK_INSTALL_PACKAGE_DIR)

if(NOT VolViewLibraries_KWVolView_INSTALL_PACKAGE_DIR)
  set(VolViewLibraries_KWVolView_INSTALL_PACKAGE_DIR "/lib/KWVolView")
endif(NOT VolViewLibraries_KWVolView_INSTALL_PACKAGE_DIR)

option(VolViewLibraries_INSTALL_DEVELOPMENT "Install VolViewLibraries development components (headers, config files, etc.)" 0)
mark_as_advanced(VolViewLibraries_INSTALL_DEVELOPMENT)
if(VolViewLibraries_INSTALL_DEVELOPMENT)
  set(VolViewLibraries_INSTALL_NO_DEVELOPMENT 0)
else(VolViewLibraries_INSTALL_DEVELOPMENT)
  set(VolViewLibraries_INSTALL_NO_DEVELOPMENT 1)
endif(VolViewLibraries_INSTALL_DEVELOPMENT)

if(NOT VolViewLibraries_INSTALL_NO_RUNTIME)
  if(VolViewLibraries_BUILD_SHARED_LIBS)
    set(VolViewLibraries_INSTALL_NO_RUNTIME 0)
  else(VolViewLibraries_BUILD_SHARED_LIBS)
    set(VolViewLibraries_INSTALL_NO_RUNTIME 1)
  endif(VolViewLibraries_BUILD_SHARED_LIBS)
endif(NOT VolViewLibraries_INSTALL_NO_RUNTIME)

if(NOT VolViewLibraries_INSTALL_NO_DOCUMENTATION)
  set(VolViewLibraries_INSTALL_NO_DOCUMENTATION 0)
endif(NOT VolViewLibraries_INSTALL_NO_DOCUMENTATION)

set(VolViewLibraries_INSTALL_NO_LIBRARIES)
if(VolViewLibraries_BUILD_SHARED_LIBS)
  if(VolViewLibraries_INSTALL_NO_RUNTIME AND 
      VolViewLibraries_INSTALL_NO_DEVELOPMENT)
    set(VolViewLibraries_INSTALL_NO_LIBRARIES 1)
  endif(VolViewLibraries_INSTALL_NO_RUNTIME AND 
    VolViewLibraries_INSTALL_NO_DEVELOPMENT)
else(VolViewLibraries_BUILD_SHARED_LIBS)
  if(VolViewLibraries_INSTALL_NO_DEVELOPMENT)
    set(VolViewLibraries_INSTALL_NO_LIBRARIES 1)
  endif(VolViewLibraries_INSTALL_NO_DEVELOPMENT)
endif(VolViewLibraries_BUILD_SHARED_LIBS)

# Propagate to all packages

foreach(package
    VTKEdge
    GDCM
    CTNLIB
    Curl
    KWCommon
    KWCommonPro
    KWWidgetsPro
    KWVolView
    )
  set(${package}_BUILD_SHARED_LIBS 
    ${VolViewLibraries_BUILD_SHARED_LIBS})
  set(${package}_INSTALL_BIN_DIR 
    ${VolViewLibraries_INSTALL_BIN_DIR})
  set(${package}_VTK_INSTALL_PACKAGE_DIR 
    ${VolViewLibraries_VTK_INSTALL_PACKAGE_DIR})
  set(${package}_ITK_INSTALL_PACKAGE_DIR 
    ${VolViewLibraries_ITK_INSTALL_PACKAGE_DIR})
  set(${package}_INSTALL_NO_DEVELOPMENT 
    ${VolViewLibraries_INSTALL_NO_DEVELOPMENT})
  set(${package}_INSTALL_NO_RUNTIME 
    ${VolViewLibraries_INSTALL_NO_RUNTIME})
  set(${package}_INSTALL_NO_DOCUMENTATION 
    ${VolViewLibraries_INSTALL_NO_DOCUMENTATION})

  # Do *not* propagate:
  # - VolViewLibraries_INSTALL_INCLUDE_DIR (way too messy)
  # - VolViewLibraries_INSTALL_LIB_DIR     (too messy)
  # - VolViewLibraries_INSTALL_PACKAGE_DIR (too messy)
  # - VolViewLibraries_INSTALL_DATA_DIR    (personal preference)
  #SET(${package}_INSTALL_PACKAGE_DIR 
  #  ${VolViewLibraries_INSTALL_PACKAGE_DIR})

endforeach(package)

# --------------------------------------------------------------------------
# Utilities: Tcl/Tk

if(WIN32)
  set(APPLICATION_BINARY_DIR) # we do not need the DLL in the build dir
  #SET(TclTk_BIN_DIR)         # (same)
  if(NOT DEFINED TclTk_LIB_DIR)
    if(BUILD_SHARED_LIBS)
      set(TclTk_LIB_DIR)
    else(BUILD_SHARED_LIBS)
      set(TclTk_LIB_DIR "${VolViewLibraries_BINARY_DIR}/lib")
    endif(BUILD_SHARED_LIBS)
    set(TclTk_INSTALL_LIB_DIR "/lib")
    set(TclTk_INSTALL_BIN_DIR ${VolViewLibraries_INSTALL_BIN_DIR})
    add_subdirectory(
      ${CMAKE_CURRENT_SOURCE_DIR}/Utilities/TclTk
      ${CMAKE_CURRENT_BINARY_DIR}/Utilities/TclTk)
  endif(NOT DEFINED TclTk_LIB_DIR)
endif(WIN32)

# --------------------------------------------------------------------------
# VTKEdge

set(VTKEdge_DIR ${VolViewLibraries_BINARY_DIR}/VTKEdge)
set(VTKEdge_BUILD_Common_KIT_DEFAULT ON)
set(VTKEdge_BUILD_Filtering_KIT_DEFAULT OFF)
set(VTKEdge_BUILD_Graphics_KIT_DEFAULT ON)
set(VTKEdge_BUILD_Hybrid_KIT_DEFAULT OFF)
set(VTKEdge_BUILD_Imaging_KIT_DEFAULT OFF)
set(VTKEdge_BUILD_IO_KIT_DEFAULT OFF)
set(VTKEdge_BUILD_Rendering_KIT_DEFAULT OFF)
set(VTKEdge_BUILD_VolumeRendering_KIT_DEFAULT ON)
set(VTKEdge_BUILD_Widgets_KIT_DEFAULT ON)  
set(VTKEdge_USE_ITK_DEFAULT ON)           
subdirs(VTKEdge)
mark_as_advanced(
  VTKEdge_BUILD_EXAMPLES
  VTKEdge_BUILD_PARAVIEW_PLUGINS
  VTKEdge_USE_CUDA
  )

# --------------------------------------------------------------------------
# Utilities: Html Help

if(WIN32)
  find_path(HTML_HELP_PATH htmlhelp.h 
    ${VolViewLibraries_SOURCE_DIR}/Utilities/HtmlHelp)
  find_library(HTML_HELP_LIBRARY htmlhelp
    ${VolViewLibraries_SOURCE_DIR}/Utilities/HtmlHelp)
  mark_as_advanced(HTML_HELP_LIBRARY HTML_HELP_PATH)
endif(WIN32)


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

if(VolViewLibraries_USE_GDCM AND NOT VolViewLibraries_DO_NOT_BUILD_GDCM)
  set(GDCM_DIR ${VolViewLibraries_BINARY_DIR}/Utilities/gdcm)
  set(GDCM_BUILD_EXAMPLES_DEFAULT 0)
  set(GDCM_INSTALL_NO_DICTIONARY 1)
  if(NOT DEFINED GDCM_BUILD_TESTING_DEFAULT)
    set(GDCM_BUILD_TESTING_DEFAULT 0)
  endif(NOT DEFINED GDCM_BUILD_TESTING_DEFAULT)
  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
    )
  subdirs(Utilities/gdcm)
endif(VolViewLibraries_USE_GDCM AND NOT VolViewLibraries_DO_NOT_BUILD_GDCM)

# --------------------------------------------------------------------------
# Utilities: FFMPEG

if (APPLE)
  subdirs(Utilities/ffmpeg)
endif (APPLE)

# --------------------------------------------------------------------------
# Utilities: CTNLIB

set(CTNLIB_DIR ${VolViewLibraries_BINARY_DIR}/Utilities/ctnlib)
subdirs(Utilities/ctnlib)

# Curl
subdirs( Utilities/Curl )

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

if(NOT DEFINED GETTEXT_BIN_DIR)
  set(GETTEXT_BIN_DIR "${LIBRARY_OUTPUT_PATH}")
endif(NOT DEFINED GETTEXT_BIN_DIR)
if(NOT DEFINED GETTEXT_INSTALL_BIN_DIR)
  set(GETTEXT_INSTALL_BIN_DIR ${VolViewLibraries_INSTALL_BIN_DIR})
endif(NOT DEFINED GETTEXT_INSTALL_BIN_DIR)
if(KWWidgets_USE_INTERNATIONALIZATION)
  subdirs(Utilities/gettext)
endif(KWWidgets_USE_INTERNATIONALIZATION)

# --------------------------------------------------------------------------
# Utilities: Tar library.

check_include_files("stddef.h" HAVE_STDDEF_H)
set(CMTAR_ZLIB_LIBRARIES vtkzlib)
set(CMTAR_ZLIB_HEADER vtk_zlib.h)
set(CMTAR_ZLIB_INCLUDE_DIRS
  ${VTK_SOURCE_DIR}/Utilities
  ${VTK_BINARY_DIR}/Utilities
  ${VTK_SOURCE_DIR}
  ${VTK_BINARY_DIR}
  )
subdirs(Utilities/cmtar)
# with -fPIC
if(UNIX AND NOT WIN32)
  find_program(CMAKE_UNAME uname /bin /usr/bin /usr/local/bin )
  if(CMAKE_UNAME)
    exec_program(uname ARGS -m OUTPUT_VARIABLE CMAKE_SYSTEM_PROCESSOR)
    set(CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR} CACHE INTERNAL "processor type (i386 and x86_64)")
    if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
      add_definitions(-fPIC)
    endif(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
  endif(CMAKE_UNAME)
endif(UNIX AND NOT WIN32)


# --------------------------------------------------------------------------
# KWCommon

set(KWCommon_DIR ${VolViewLibraries_BINARY_DIR}/KWCommon)
set(KWCommon_BUILD_TESTING_DEFAULT 1)
subdirs(KWCommon)

# --------------------------------------------------------------------------
# KWCommonPro

set(KWCommonPro_DIR ${VolViewLibraries_BINARY_DIR}/KWCommonPro)
set(KWCommonPro_BUILD_TESTING_DEFAULT 1)
set(KWCommonPro_USE_GDCM_DEFAULT ${VolViewLibraries_USE_GDCM})
subdirs(KWCommonPro)

# --------------------------------------------------------------------------
# KWWidgetsPro

set(KWWidgetsPro_DIR ${VolViewLibraries_BINARY_DIR}/KWWidgetsPro)
set(KWWidgetsPro_BUILD_TESTING_DEFAULT 1)
subdirs(KWWidgetsPro)

# --------------------------------------------------------------------------
# KWVolView

set(KWVolView_DIR ${VolViewLibraries_BINARY_DIR}/KWVolView)
set(KWVolView_USE_GDCM_DEFAULT ${VolViewLibraries_USE_GDCM})
set(KWVolView_BUILD_TESTING_DEFAULT 1)
subdirs(KWVolView)

# --------------------------------------------------------------------------
# Utilities: Doxygen

subdirs(Utilities/Doxygen)

# --------------------------------------------------------------------------
# Configure the export configuration

subdirs(CMake/ExportConfiguration)
