# This file is a hacked CMakeLists.txt from ParaView/Octave
# Thanks to Brad King.

PROJECT(OCTAVIZ)

  ## added from cmake FAQ, JJS 3/29/05; also needs the file cmake_uninstall.cmake.in
  CONFIGURE_FILE(
    "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
    "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
    IMMEDIATE @ONLY)

  ADD_CUSTOM_TARGET(uninstall
    "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
  ##

  OPTION(USE_PREC_HEADERS "Use precompiled headers" OFF)
	STRING(COMPARE EQUAL ${USE_PREC_HEADERS} "OFF" PCH_ON)
	IF(PCH_ON)
		SET(CXX_COMPILER_PCH "g++-3.4" CACHE STRING "CMake overides compiler environment varibles. Put the compiler name here.")
	ENDIF(PCH_ON)

	SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} /usr/local/lib/vtk /usr/lib/vtk)

	FIND_PACKAGE(VTK)
  IF(NOT VTK_FOUND)
    MESSAGE(FATAL_ERROR "VTK is required.  Please set VTK_DIR.")
  ENDIF(NOT VTK_FOUND)

  # load the needed compiler and linker settings to use VTK.
	INCLUDE(${VTK_USE_FILE})
	
	FIND_PACKAGE(X11)
  IF(NOT X11_FOUND)
    MESSAGE(FATAL_ERROR "X11 is required.  Please install X11 development libraries.")
  ENDIF(NOT X11_FOUND)
	LINK_LIBRARIES(${X11_LIBRARIES} Xt)

	# find octave-config
	FIND_PROGRAM(OCTAVE_CONFIG octave-config)
	IF(NOT OCTAVE_CONFIG)
		 MESSAGE(FATAL_ERROR "Octave is required.  Please install Octave and rerun cmake.")
	ENDIF(NOT OCTAVE_CONFIG)
	
	# Set prefix from octave prefix
	EXEC_PROGRAM(${OCTAVE_CONFIG} ARGS "-p PREFIX" OUTPUT_VARIABLE OCT_PREFIX_EXEC)
		
	# check to see if OCT_PREFIX_EXEC is unset
	# unset variables match exactly the name of the variable
	IF(OCT_PREFIX_EXEC MATCHES "^OCT_PREFIX_EXEC$")
	ELSE(OCT_PREFIX_EXEC MATCHES "^OCT_PREFIX_EXEC$")
	# if OCT_PREFIX_EXEC has a value then cache the value
	# so that OCT_PREFIX can be seen in all sub directories of
	# the project
		SET(OCT_PREFIX ${OCT_PREFIX_EXEC} CACHE INTERNAL "" FORCE)
	ENDIF(OCT_PREFIX_EXEC MATCHES "^OCT_PREFIX_EXEC$")
	SET(CMAKE_INSTALL_PREFIX ${OCT_PREFIX} CACHE PATH "Specifies the directory where .oct files will be installed." FORCE)
	
	# Build the vtkOctave wrapping utility first.
	SUBDIRS(Wrapping)
		
	# Build octave wrappers for VTK kits.
	SUBDIRS(Common Filtering Imaging Graphics IO)
	SET(vtk_kits Common Filtering Imaging Graphics IO)
	IF(VTK_USE_RENDERING)
		SUBDIRS(Rendering)
		SET(vtk_kits ${vtk_kits} Rendering)
	ENDIF(VTK_USE_RENDERING)
	IF(VTK_USE_HYBRID)
		SUBDIRS(Hybrid)
		SET(vtk_kits ${vtk_kits} Hybrid)
	ENDIF(VTK_USE_HYBRID)
	IF(VTK_USE_PATENTED)
		SUBDIRS(Patented)
		SET(vtk_kits ${vtk_kits} Patented)
	ENDIF(VTK_USE_PATENTED)
	IF(VTK_USE_PARALLEL)
		SUBDIRS(Parallel)
		SET(vtk_kits ${vtk_kits} Parallel)
	ENDIF(VTK_USE_PARALLEL)
	
	# Hack that creates symbolic links to functions
	#ADD_CUSTOM_TARGET(create_links echo "Symbolic links created.")
	#FOREACH(kit ${vtk_kits})
	#	ADD_CUSTOM_TARGET(create_links_${kit} cd ${kit}\; ${CMAKE_MAKE_PROGRAM} create_links)
	#	ADD_DEPENDENCIES(create_links create_links_${kit})
	#ENDFOREACH(kit)
	
	# Macro to create Octave wrapper functions
	MACRO(OCTAVE_WRAP_VTK kit ukit deps)
		# Hack for symbolic links
		# ADD_CUSTOM_TARGET(create_links echo "Symlinked ${kit}")
		
		INCLUDE(${VTK_KITS_DIR}/vtk${kit}Kit.cmake)
		INCLUDE(${VTK_KITS_DIR}/vtk${kit}Kit.cmake)

		# what we don't want or can't build;
		# this is an ugly hack[TM] and should be fixed by e.g.
		# including a list of not-to-be-built-functions shipped with
		# Octaviz
		SET(VTK_CLASS_WRAP_EXCLUDE_vtkLongLongArray 1)
		SET(VTK_CLASS_WRAP_EXCLUDE_vtkSignedCharArray 1)
		SET(VTK_CLASS_WRAP_EXCLUDE_vtkUnsignedLongLongArray 1)

		SET(all_oct)
		FOREACH(class ${VTK_${ukit}_CLASSES})
			IF(NOT VTK_CLASS_WRAP_EXCLUDE_${class})
				SET(all_oct ${all_oct} ${class}.oct)
			ENDIF(NOT VTK_CLASS_WRAP_EXCLUDE_${class})
		ENDFOREACH(class)

#		ADD_CUSTOM_TARGET(vtk${kit}.cc ALL cat ${all_ccs} > vtk${kit}.cc)
		
		SET(oct_flags -I${VTK_${ukit}_HEADER_DIR} -I../Common)
		SET(oct_link_flags -L${X11_LIBRARY_DIR} -lX11 -lXt -L${VTK_LIBRARY_DIRS} -lvtkCommon  -lvtk${kit} -lvtkFiltering -lvtkGraphics)
#		ADD_CUSTOM_TARGET(vtk${kit}.oct ALL sleep 0\; mkoctfile ${oct_flags} ${oct_link_flags} -L../Common -loctaviz vtk${kit}.cc)
		
		# Precompiled headers
		IF(USE_PREC_HEADERS)
			# Which flags will mkoctfile use?
  		SET (PCHFLAGS "")
			
			EXEC_PROGRAM("mkoctfile" ARGS "-p CXXPICFLAG" OUTPUT_VARIABLE MKOCT_FLAGS_EXEC)
			STRING(REGEX MATCHALL "[^ ]+" MKOCT_FLAGS_LIST ${MKOCT_FLAGS_EXEC})
  		FOREACH (flag ${MKOCT_FLAGS_LIST})
    		SET (PCHFLAGS ${PCHFLAGS} ${flag})
  		ENDFOREACH (flag ${MKOCT_FLAGS_LIST})
						
			EXEC_PROGRAM("mkoctfile" ARGS "-p INCFLAGS" OUTPUT_VARIABLE MKOCT_FLAGS_EXEC)
			STRING(REGEX MATCHALL "[^ ]+" MKOCT_FLAGS_LIST ${MKOCT_FLAGS_EXEC})
  		FOREACH (flag ${MKOCT_FLAGS_LIST})
    		SET (PCHFLAGS ${PCHFLAGS} ${flag})
  		ENDFOREACH (flag ${MKOCT_FLAGS_LIST})

			EXEC_PROGRAM("mkoctfile" ARGS "-p XTRA_CXXFLAGS" OUTPUT_VARIABLE MKOCT_FLAGS_EXEC)
			STRING(REGEX MATCHALL "[^ ]+" MKOCT_FLAGS_LIST ${MKOCT_FLAGS_EXEC})
  		FOREACH (flag ${MKOCT_FLAGS_LIST})
    		SET (PCHFLAGS ${PCHFLAGS} ${flag})
  		ENDFOREACH (flag ${MKOCT_FLAGS_LIST})
			
			#MESSAGE(${PCHFLAGS})
			
			ADD_CUSTOM_TARGET(OctavizCommon.h.gch ALL ${CXX_COMPILER_PCH} "-c" ${PCHFLAGS} ${oct_flags} ../Common/OctavizCommon.h)
		ENDIF(USE_PREC_HEADERS)

		EXEC_PROGRAM(${OCTAVE_CONFIG} ARGS "--oct-site-dir" OUTPUT_VARIABLE OCT_INST_DIR_EXEC)	
		# Remove prefix from oct install dir
		STRING(REGEX REPLACE "${CMAKE_INSTALL_PREFIX}" "" OCT_INST_DIR ${OCT_INST_DIR_EXEC})

		FOREACH(class ${VTK_${ukit}_CLASSES})
			SET(full_name "${VTK_${ukit}_HEADER_DIR}/${class}.h")
			IF(NOT VTK_CLASS_WRAP_EXCLUDE_${class})
				ADD_CUSTOM_TARGET(${class}.cc ALL ../Wrapping/vtkWrapOctave ${full_name} ../Wrapping/hints 1 ${class}.cc)
				ADD_CUSTOM_TARGET(${class}.oct ALL sleep 0 \; mkoctfile ${oct_flags} ${oct_link_flags} -L../Common -loctaviz ${class}.cc)
#				ADD_DEPENDENCIES(vtk${kit}.cc ${class}.cc)
				# Hack for symbolic links
#				ADD_CUSTOM_TARGET(${class}_link echo Symlinking ${class}\; ln -s ${CMAKE_INSTALL_PREFIX}${OCT_INST_DIR}/octaviz/vtk${kit}.oct ${CMAKE_INSTALL_PREFIX}${OCT_INST_DIR}/octaviz/${class}.oct)
#				ADD_DEPENDENCIES(create_links ${class}_link)
			ENDIF(NOT VTK_CLASS_WRAP_EXCLUDE_${class})
		ENDFOREACH(class)
	ENDMACRO(OCTAVE_WRAP_VTK)
  
	#	MARK_AS_ADVANCED(CMAKE_INSTALL_PREFIX)

	SUBDIRS(Scripts)
	SUBDIRS(Examples)
