#
#  Copyright (c) 2002-2007 Nick Gnedin 
#  All rights reserved.
#
#  This file may be distributed and/or modified under the terms of the
#  GNU General Public License version 2 as published by the Free Software
#  Foundation and appearing in the file LICENSE.GPL included in the
#  packaging of this file.
#
CMAKE_MINIMUM_REQUIRED(VERSION 2.0)

IF(COMMAND cmake_policy)
	cmake_policy(SET CMP0003 NEW)
ENDIF(COMMAND cmake_policy)


SET(src ..)
SET(target ifrit)
PROJECT(${target})

SET(Option:OffScreen 0 CACHE BOOL "Compile IFrIT for off-screen rendering (needs VTK with Mesa libraries)")
SET(Option:StereoSupport 1 CACHE BOOL "Enable OpenGL support for displaying stereo (disable this option if you see flicker)")

#
#  Portability options
#
SET(Port:SearchOGL 0 CACHE BOOL "Search for OpenGL (normally should be found automatically)")
SET(Port:SearchX11 0 CACHE BOOL "Search for X11 (normally should be found automatically)")
SET(Port:NoLongLong  0 CACHE BOOL "Do not use long long type")
MARK_AS_ADVANCED(Port:SearchOGL Port:SearchX11 Port:NoLongLong)

IF(NOT CMAKE_BUILD_TYPE)
       SET(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." FORCE)
ENDIF(NOT CMAKE_BUILD_TYPE)

#
# ---------------------------------------------------------------------------
#
# Configuration
#
# ---------------------------------------------------------------------------
#
#  Shells
#
IF(WIN32)
	OPTION(Shell:CL "Include command-line shell" OFF)
ELSE(WIN32)
	OPTION(Shell:CL "Include command-line shell" ON)
ENDIF(WIN32)
OPTION(Shell:QT "Include Qt-based GUI shell" ON)

SET(nsh)
SET(gsh)

IF(Shell:CL)
	SET(nsh ${nsh} cl)
ENDIF(Shell:CL)

IF(Shell:QT)
	SET(gsh ${gsh} qt)
ENDIF(Shell:QT)

IF(NOT nsh AND NOT gsh)
	MESSAGE(FATAL_ERROR "At least one shell must be selected.")
ENDIF(NOT nsh AND NOT gsh)

#
#  Find max extension flag
#
SET(maxNum 1)
FILE(READ ${src}/configure/iextensiondefines.h f)

STRING(REGEX MATCHALL "#define IEXTENSION_[A-Z0-9_]*[ \t]*[0-9]*" m ${f})
IF(m)
	STRING(REGEX REPLACE "#define IEXTENSION_[A-Z0-9_]*[ \t]*([0-9]*)" "\\1;" num ${m})
	SET(num ${num}0)
	FOREACH(n ${num})
		IF(n GREATER ${maxNum})
			SET(maxNum ${n})
		ENDIF(n GREATER ${maxNum})
	ENDFOREACH(n ${num})
ENDIF(m)

#
#  Configure extensions
#
SET(ext)
FILE(GLOB dir ${src}/configure/.CMake.*.def)

IF(dir)
	FOREACH(s ${dir})
		STRING(REGEX REPLACE ".*\\.CMake\\.([A-Z0-9_]*)\\.def" "\\1" e ${s}) 
		IF(e STREQUAL MV)
			OPTION(Extension:MultiView "Include MultiView extension" OFF)
			IF(Extension:MultiView)
				set(ext ${ext} ${e})
			ENDIF(Extension:MultiView)
		ELSE(e STREQUAL MV)
			OPTION(Extension:${e} "Include ${e} extension" ON)
			IF(Extension:${e})
				set(ext ${ext} ${e})
			ENDIF(Extension:${e})
#
#  Check that the define for this extension has been set already.
#			
			STRING(REGEX MATCH "#define IEXTENSION_${e}[ \t]*[0-9]*" m ${f})
			IF(NOT m)

				MESSAGE("Extension ${e} has not been defined in configure/iextensiondefines.h.\n I will define it for you.")
				SET(maxNum 2*${maxNum})
				FILE(APPEND ${src}/configure/iextensiondefines.h "#define IEXTENSION_${e} ${maxNum}\n")

			ENDIF(NOT m)

		ENDIF(e STREQUAL MV)
	ENDFOREACH(s ${dir})
ENDIF(dir)

#
# ---------------------------------------------------------------------------
#
#  Find dependencies
#
# ---------------------------------------------------------------------------
#
SET(EXECUTABLE_OUTPUT_PATH ..)
MARK_AS_ADVANCED(CMAKE_BACKWARDS_COMPATIBILITY CMAKE_INSTALL_PREFIX LIBRARY_OUTPUT_PATH QT_QMAKE_EXECUTABLE)

# Find curses
IF(Shell:CL)
	INCLUDE(${CMAKE_ROOT}/Modules/FindCurses.cmake)
	IF(UNIX AND CURSES_LIBRARY)
		ADD_DEFINITIONS(-DI_USE_CURSES)
	ENDIF(UNIX AND CURSES_LIBRARY)
ENDIF(Shell:CL)

# Find VTK
SET(VTK_DIR $ENV{VTKDIR})
INCLUDE(${CMAKE_ROOT}/Modules/FindVTK.cmake)
IF(NOT VTK_FOUND)
	MESSAGE(FATAL_ERROR "VTK is not found. Please check that VTKDIR variables is set properly.")
ENDIF(NOT VTK_FOUND)
INCLUDE(${VTK_USE_FILE})

IF(VTK_USE_VOLUMEPRO AND VTK_HAVE_VP1000)
	OPTION(CustomVP1000 "Include custom support for VP1000" ON)
ENDIF(VTK_USE_VOLUMEPRO AND VTK_HAVE_VP1000)

# Find OpenGL
IF(Port:SearchOGL)
	INCLUDE(${CMAKE_ROOT}/Modules/FindOpenGL.cmake)
	IF(NOT OPENGL_FOUND)
		MESSAGE(FATAL_ERROR "OpenGL is not found. Please set advanced variables OPENGL_INCLUDE_DIR and OPENGL_LIBRARIES.")
	ENDIF(NOT OPENGL_FOUND)
	INCLUDE_DIRECTORIES(${OPENGL_INCLUDE_DIR})
ENDIF(Port:SearchOGL)

# Find X11
IF(UNIX AND Port:SearchX11)
	INCLUDE(${CMAKE_ROOT}/Modules/FindX11.cmake)
	IF(NOT X11_FOUND)
		MESSAGE(FATAL_ERROR "X11 is not found. Please set advanced variables X11_X11_INCLUDE_PATH and X11_LIBRARIES.")
	ENDIF(NOT X11_FOUND)
	INCLUDE_DIRECTORIES(${X11_X11_INCLUDE_PATH})
ENDIF(UNIX AND Port:SearchX11)

IF(Shell:QT)
	# Find Qt
	SET(QT_REQUIRED 1)
	INCLUDE(${CMAKE_ROOT}/Modules/FindQt.cmake)
	INCLUDE_DIRECTORIES(${QT_INCLUDE_DIR})
	IF(QT4_INSTALLED)
		INCLUDE_DIRECTORIES(${QT_INCLUDE_DIR}/Qt ${QT_QTCORE_INCLUDE_DIR})
	ENDIF(QT4_INSTALLED)
	ADD_DEFINITIONS(${QT_DEFINITIONS})
ENDIF(Shell:QT)

#
# ---------------------------------------------------------------------------
#
#  Create the project
#
# ---------------------------------------------------------------------------
#
SET(shell 0)
SET(exten 0)
#
#  Core
#
FILE(GLOB sources ${src}/configure/*.cpp ${src}/core/*.cpp ${src}/help/*.cpp)
INCLUDE_DIRECTORIES(${src}/configure ${src}/core ${src}/help ${src}/docs)

#
#  Shells
#
IF(gsh)
	FILE(GLOB tmp ${src}/shells/configure/*.cpp ${src}/shells/generic/*.cpp ${src}/shells/base/*.cpp)
	IF(tmp)
		SET(sources ${sources} ${tmp})
		INCLUDE_DIRECTORIES(${src}/shells/configure ${src}/shells/generic ${src}/shells/base)
	ENDIF(tmp)
ENDIF(gsh)

FOREACH(s ${nsh} ${gsh})
	FILE(GLOB tmp ${src}/shells/${s}/*.cpp)
	IF(tmp)
		SET(sources ${sources} ${tmp})
		INCLUDE_DIRECTORIES(${src}/shells/${s})
		STRING(TOUPPER ${s} us)
		SET(shell ${shell}+ISHELL_${us})
	ENDIF(tmp)
ENDFOREACH(s)

#
#  Extensions
#
FOREACH(e ${ext})
	SET(exten ${exten}+IEXTENSION_${e})
ENDFOREACH(e)

#
#  Special
#
IF(Shell:QT)
	SET(qtdir ${src}/shells/qt)
	SET(qthdr ${qtdir}/iqtwidgettexteditorsubject.h ${qtdir}/iqtwidgethelper.h ${qtdir}/iqtrenderwindowsubject.h ${qtdir}/iqtmenuwindowsubject.h ${qtdir}/iqtmainwindowsubject.h ${qtdir}/iqtframesubject.h)
	SET(tmp)
	QT_WRAP_CPP(dummy tmp ${qthdr})
	SET(sources ${sources} ${tmp})
ENDIF(Shell:QT)

IF(CustomVP1000)
	FILE(GLOB tmp ${src}/special/vp1000/*.cpp)
	IF(tmp)
		SET(sources ${sources} ${tmp})
		INCLUDE_DIRECTORIES(${src}/special/vp1000)
		ADD_DEFINITIONS(-DI_CUSTOM_VP1000)
	ENDIF(tmp)
ENDIF(CustomVP1000)

IF(Extension:ART)
	FILE(GLOB tmp ${src}/special/artio/*.c)
	IF(tmp)
		SET(sources ${sources} ${tmp})
		INCLUDE_DIRECTORIES(${src}/special/artio)
	ENDIF(tmp)
ENDIF(Extension:ART)

#
#  Create target
#
IF(nsh)
	ADD_EXECUTABLE(${target} ${sources})
ELSE(nsh)
	ADD_EXECUTABLE(${target} WIN32 ${sources})
ENDIF(nsh)

ADD_DEFINITIONS(-DI_EXTERNAL_CONFIGURATION -DI_CHECK1)

IF(CMAKE_BUILD_TYPE MATCHES "Debug")
	ADD_DEFINITIONS(-DI_DEBUG -DI_CHECK2)
ENDIF(CMAKE_BUILD_TYPE MATCHES "Debug")

IF(Option:OffScreen)
	ADD_DEFINITIONS(-DI_OFFSCREEN)
ENDIF(Option:OffScreen)

#
#  Edition
#
FILE(GLOB tmp ${src}/configure/edition*.cpp)
IF(tmp) 
	ADD_DEFINITIONS(-DI_EDITION)
ENDIF(tmp) 

FILE(GLOB tmp ${src}/configure/iconfiguresettings.ext) 
CONFIGURE_FILE(${tmp} ${tmp}.h @ONLY)

IF(NOT Option:StereoSupport)
	ADD_DEFINITIONS(-DI_NO_STEREO)
ENDIF(NOT Option:StereoSupport)

#
#  Portability
#
IF(Port:NoLongLong)
	ADD_DEFINITIONS(-DI_NO_LONG_LONG)
ENDIF(Port:NoLongLong)

#
#  Add libraries
#
TARGET_LINK_LIBRARIES(${target} vtkFiltering vtkHybrid vtkRendering) 
#
#  Optional libraries
#
IF(VTK_KITS MATCHES "PARALLEL")
	TARGET_LINK_LIBRARIES(${target} vtkParallel) 
ENDIF(VTK_KITS MATCHES "PARALLEL")
IF(VTK_KITS MATCHES "PATENTED")
	TARGET_LINK_LIBRARIES(${target} vtkPatented) 
ENDIF(VTK_KITS MATCHES "PATENTED")
#
#  VTK 5 libraries
#
IF(VTK_KITS MATCHES "WIDGETS")
	TARGET_LINK_LIBRARIES(${target} vtkWidgets) 
ENDIF(VTK_KITS MATCHES "WIDGETS")
IF(VTK_KITS MATCHES "VOLUMERENDERING")
	TARGET_LINK_LIBRARIES(${target} vtkVolumeRendering) 
ENDIF(VTK_KITS MATCHES "VOLUMERENDERING")

IF(AddOGL)
	TARGET_LINK_LIBRARIES(${target} ${OPENGL_LIBRARIES}) 
ENDIF(AddOGL)

IF(UNIX AND AddX11)
	TARGET_LINK_LIBRARIES(${target} ${X11_LIBRARIES})
ENDIF(UNIX AND AddX11)

IF(Shell:QT)
	IF(QT_LIBRARIES)
		TARGET_LINK_LIBRARIES(${target} ${QT_LIBRARIES}) 
	ENDIF(QT_LIBRARIES)
	IF(QT4_INSTALLED)
		TARGET_LINK_LIBRARIES(${target} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QT3SUPPORT_LIBRARY} ${QT_QTOPENGL_LIBRARY}) 
		IF (WIN32)
			FIND_LIBRARY(QT_QTMAIN_LIBRARY qtmain ${QT_LIBRARY_DIR} DOC "This Library is only needed by and included with Qt on MSWindows. It should be NOTFOUND, undefined or IGNORE otherwise.")
			IF(QT_QTMAIN_LIBRARY)
				TARGET_LINK_LIBRARIES(${target} ${QT_QTMAIN_LIBRARY}) 
			ELSE(QT_QTMAIN_LIBRARY)
				MESSAGE(FATAL_ERROR "Qt Main library qtmain.lib is not found.")
			ENDIF(QT_QTMAIN_LIBRARY)
		ENDIF (WIN32)
	ENDIF(QT4_INSTALLED)
ENDIF(Shell:QT)

IF(Shell:CL)
	IF(UNIX AND CURSES_LIBRARY)
		TARGET_LINK_LIBRARIES(${target} curses) 
	ENDIF(UNIX AND CURSES_LIBRARY)
ENDIF(Shell:CL)

