# REQUIREMENTS: this script needs CMake 2.8 or higher. Downloads are available at http://www.cmake.org

# How to build OCE using CMake under Unix (Linux, Darwin etc.)?
# 1. Copy this file, as-is, to the top-level OCE folder
# 2. Make a build directory somewhere outside the OCE source tree
# 3. cmake "relative/path/to/OCE"
# 4. make
# 5. make install (or sudo make install)

# How to build OCE using CMake under Windows (Linux, Darwin etc.)?
# 1. Copy this file, as-is, to the top-level folder
# 2. Launch the cmake-gui, and select the top-level folder
# 3. You can choose whatever you want as an install directory
# 4. Click 'Configure'
# 5. Choose your generator
# 6. When configure is achived, you can change the variable with a red background
# 7. Click 'Generate'
# 8. From your IDE, open the generated makefile and run the compilation.

PROJECT(OCE)

SET(OCE_VERSION_MAJOR 0)
SET(OCE_VERSION_MINOR 9)
SET(OCE_VERSION_PATCH 1)
#  Empty for official releases, set to -dev, -rc1, etc for development releases
SET(OCE_VERSION_DEVEL )

SET(OCE_VERSION ${OCE_VERSION_MAJOR}.${OCE_VERSION_MINOR}.${OCE_VERSION_PATCH}${OCE_VERSION_DEVEL})

SET(OCE_ABI_SOVERSION 2)
SET(OCE_ABI_VERSION ${OCE_ABI_SOVERSION}.0.0)

# Set the minimum version of cmake required to 2.6
CMAKE_MINIMUM_REQUIRED( VERSION 2.6 )

# Define helper macro OPTION_WITH_DEFAULT
MACRO( OPTION_WITH_DEFAULT OPTION_NAME OPTION_STRING OPTION_DEFAULT )
	IF( NOT DEFINED ${OPTION_NAME} )
		SET( ${OPTION_NAME} ${OPTION_DEFAULT} )
	ENDIF( NOT DEFINED ${OPTION_NAME} )
	OPTION( ${OPTION_NAME} "${OPTION_STRING}" ${${OPTION_NAME}} )
ENDMACRO( OPTION_WITH_DEFAULT OPTION_NAME OPTION_STRING OPTION_DEFAULT )

############################
# Check 32/64 bit platform #
############################
IF (${CMAKE_SIZEOF_VOID_P} MATCHES "8") # It is 64bit, otherwise 32 bit systems match 4
	ADD_DEFINITIONS(-D_OCC64)
	SET(BIT 64)
ELSE (${CMAKE_SIZEOF_VOID_P} MATCHES "8")
	SET(BIT 32)
ENDIF(${CMAKE_SIZEOF_VOID_P} MATCHES "8")

MESSAGE(STATUS "Build ${BIT}bit")

IF (NOT MSVC)
	IF( NOT DEFINED ${PROJECT_NAME}_BUILD_TYPE )
		SET( ${PROJECT_NAME}_BUILD_TYPE "Release" CACHE STRING "Build type" ) # By default set release build
	ENDIF( NOT DEFINED ${PROJECT_NAME}_BUILD_TYPE )
	SET( CMAKE_BUILD_TYPE ${${PROJECT_NAME}_BUILD_TYPE} CACHE INTERNAL "Build type,
		immutable" FORCE )
ENDIF(NOT MSVC)

IF(CMAKE_BUILD_TOOL STREQUAL "nmake")
	SET(NMAKE TRUE)
ENDIF(CMAKE_BUILD_TOOL STREQUAL "nmake")

IF(MSVC)
	OPTION_WITH_DEFAULT( ${PROJECT_NAME}_INSTALL_PDB_FILES "Install PDB files (debug informations)" ON )
ENDIF(MSVC)

IF(MSVC)
	OPTION_WITH_DEFAULT( ${PROJECT_NAME}_USE_BUNDLE "Use OCE Windows Bundle" OFF )
ENDIF(MSVC)

IF(BORLAND)
	OPTION_WITH_DEFAULT( ${PROJECT_NAME}_INSTALL_TDS_FILES "Instal TDS files (debug informations)" ON )
ENDIF(BORLAND)

IF(${PROJECT_NAME}_USE_BUNDLE)
	OPTION_WITH_DEFAULT( ${PROJECT_NAME}_BUNDLE_AUTOINSTALL "Autoinstall bundle DLLs" ON )
	MARK_AS_ADVANCED(${PROJECT_NAME}_BUNDLE_AUTOINSTALL)
ENDIF(${PROJECT_NAME}_USE_BUNDLE)

IF (MSVC AND NOT NMAKE)
	SET(${PROJECT_NAME}_COMPILER_SUPPORTS_PCH TRUE)
	OPTION_WITH_DEFAULT( ${PROJECT_NAME}_USE_PCH "Use Precompiled Headers" ON )
	MARK_AS_ADVANCED(${PROJECT_NAME}_USE_PCH)
ENDIF(MSVC AND NOT NMAKE)

OPTION_WITH_DEFAULT( ${PROJECT_NAME}_BUILD_SHARED_LIB "Build shared ${PROJECT_NAME} libs" ON )
IF(NOT MSVC)
	OPTION_WITH_DEFAULT( ${PROJECT_NAME}_DISABLE_X11 "Disable components requiring X11 support" OFF )
	IF(NOT APPLE AND NOT WIN32)
		MARK_AS_ADVANCED(${PROJECT_NAME}_DISABLE_X11)
	ENDIF(NOT APPLE AND NOT WIN32)
ENDIF(NOT MSVC)
OPTION_WITH_DEFAULT( ${PROJECT_NAME}_MODEL "Build model components" ON )
OPTION_WITH_DEFAULT( ${PROJECT_NAME}_OCAF "Build application framework" ON )
OPTION_WITH_DEFAULT( ${PROJECT_NAME}_DATAEXCHANGE "Build data exchange" ON )
OPTION_WITH_DEFAULT( ${PROJECT_NAME}_DRAW "Build test harness \(DRAW\)" OFF )
OPTION_WITH_DEFAULT( ${PROJECT_NAME}_VISUALISATION "Build visualisation component" ON )
OPTION_WITH_DEFAULT( ${PROJECT_NAME}_WITH_GL2PS "Build with GL2PS" OFF )
OPTION_WITH_DEFAULT( ${PROJECT_NAME}_WITH_FREEIMAGE "Build with FreeImage" OFF )
OPTION_WITH_DEFAULT( ${PROJECT_NAME}_EXTRA_WARNINGS "Enable Maximum Warnings Level" OFF )
MARK_AS_ADVANCED(${PROJECT_NAME}_EXTRA_WARNINGS)
IF( NOT "${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.8 )
	OPTION_WITH_DEFAULT( ${PROJECT_NAME}_TESTING "Enable unittesting framework" OFF )
	MARK_AS_ADVANCED(${PROJECT_NAME}_TESTING)
ENDIF( NOT "${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.8 )
OPTION_WITH_DEFAULT( ${PROJECT_NAME}_ADD_HEADERS "Add headers to project files" OFF )
MARK_AS_ADVANCED(${PROJECT_NAME}_ADD_HEADERS)
OPTION_WITH_DEFAULT( ${PROJECT_NAME}_DISABLE_BSPLINE_MESHER "Disable BSpline Mesher" OFF )
MARK_AS_ADVANCED(${PROJECT_NAME}_DISABLE_BSPLINE_MESHER)
OPTION_WITH_DEFAULT( ${PROJECT_NAME}_RPATH_FILTER_SYSTEM_PATHS "Filter out system paths from RPATH" ON )
MARK_AS_ADVANCED(${PROJECT_NAME}_RPATH_FILTER_SYSTEM_PATHS)

# The default for the DEB define is ON for all the platforms , in debug mode.
# In MSVC it is not desirable to have it ON by default, since users must 
# compile/use the OCE debug libraries to build it's own programs in DEBUG mode.
# DEB should be enabled by developers only, in this case
IF ((MSVC OR BORLAND) AND CMAKE_CONFIGURATION_TYPES)
  SET (DEB_DEFAULT "OFF")
ELSE ()
   SET (DEB_DEFAULT "ON")
ENDIF ((MSVC OR BORLAND) AND CMAKE_CONFIGURATION_TYPES)

OPTION_WITH_DEFAULT( ${PROJECT_NAME}_ENABLE_DEB_FLAG "Enables DEB define in debug configuration" ${DEB_DEFAULT} )
MARK_AS_ADVANCED(${PROJECT_NAME}_ENABLE_DEB_FLAG)

IF(NOT MSVC)
	OPTION_WITH_DEFAULT( ${PROJECT_NAME}_COVERAGE "Build with coverage testing" OFF )
	MARK_AS_ADVANCED(${PROJECT_NAME}_COVERAGE)
ENDIF(NOT MSVC)

IF( NOT DEFINED ${PROJECT_NAME}_MULTITHREAD_LIBRARY)
	SET( ${PROJECT_NAME}_MULTITHREAD_LIBRARY "NONE" CACHE STRING "(values are: NONE TBB OPENMP)" )
ENDIF( NOT DEFINED ${PROJECT_NAME}_MULTITHREAD_LIBRARY)

IF( NOT "${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.8 )
	SET_PROPERTY(CACHE ${PROJECT_NAME}_MULTITHREAD_LIBRARY PROPERTY STRINGS NONE TBB OPENMP)
ENDIF( NOT "${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.8 )

OPTION( ${PROJECT_NAME}_MULTITHREAD_LIBRARY "Multithread library" ${${PROJECT_NAME}_MULTITHREAD_LIBRARY} )

IF( ${PROJECT_NAME}_MULTITHREAD_LIBRARY STREQUAL "TBB" )
	OPTION_WITH_DEFAULT( ${PROJECT_NAME}_TBB_MALLOC_SUPPORT "Use TBB for memory allocation" ON )
ENDIF( ${PROJECT_NAME}_MULTITHREAD_LIBRARY STREQUAL "TBB" )

IF( NOT DEFINED ${PROJECT_NAME}_INSTALL_PREFIX )
	IF( WIN32 )
		SET(${PROJECT_NAME}_INSTALL_PREFIX
			"c:/${PROJECT_NAME}-${${PROJECT_NAME}_VERSION}")
	ELSE( WIN32 )
		SET(${PROJECT_NAME}_INSTALL_PREFIX
			"/usr/local")
	ENDIF( WIN32 )
ENDIF( NOT DEFINED ${PROJECT_NAME}_INSTALL_PREFIX )

SET( ${PROJECT_NAME}_INSTALL_PREFIX ${${PROJECT_NAME}_INSTALL_PREFIX} CACHE
	PATH "Install prefix prepended to target to create install location" )
SET( CMAKE_INSTALL_PREFIX "${${PROJECT_NAME}_INSTALL_PREFIX}" CACHE INTERNAL "Prefix
	prepended to install directories if target destination is not absolute,
	immutable" FORCE )

IF( ${PROJECT_NAME}_BUILD_SHARED_LIB )
	SET( ${PROJECT_NAME}_LIBRARY_TYPE SHARED )
	SET( ${PROJECT_NAME}_BUILD_STATIC_LIB FALSE )
ELSE( ${PROJECT_NAME}_BUILD_SHARED_LIB )
	SET( ${PROJECT_NAME}_LIBRARY_TYPE STATIC )
	SET( ${PROJECT_NAME}_BUILD_STATIC_LIB TRUE )
	IF ( WIN32 )
		ADD_DEFINITIONS("-DHAVE_NO_DLL")
	ENDIF( WIN32 )
ENDIF( ${PROJECT_NAME}_BUILD_SHARED_LIB )

# MSVC specific options
IF(MSVC_IDE)
	IF (NOT DEFINED ${PROJECT_NAME}_USE_MSVC_EXPRESS )
		SET (${PROJECT_NAME}_USE_MSVC_EXPRESS OFF)
	ENDIF (NOT DEFINED ${PROJECT_NAME}_USE_MSVC_EXPRESS)
	OPTION( ${PROJECT_NAME}_USE_MSVC_EXPRESS "Use a Visual C++ express IDE"
		${${PROJECT_NAME}_USE_MSVC_EXPRESS} )
ENDIF(MSVC_IDE)

SET_DIRECTORY_PROPERTIES(PROPERTIES COMPILE_DEFINITIONS_RELEASE NDEBUG)
SET_DIRECTORY_PROPERTIES(PROPERTIES COMPILE_DEFINITIONS_MINSIZEREL NDEBUG)
SET_DIRECTORY_PROPERTIES(PROPERTIES COMPILE_DEFINITIONS_RELWITHDEBINFO  NDEBUG)

IF(${PROJECT_NAME}_ENABLE_DEB_FLAG)
  SET_DIRECTORY_PROPERTIES(PROPERTIES COMPILE_DEFINITIONS_DEBUG "DEB=1;_DEBUG")
ELSE ()
  SET_DIRECTORY_PROPERTIES(PROPERTIES COMPILE_DEFINITIONS_DEBUG "_DEBUG")
ENDIF (${PROJECT_NAME}_ENABLE_DEB_FLAG)

#
# Check components dependencies
#
SET(${PROJECT_NAME}_FOUNDATION TRUE)
IF(${PROJECT_NAME}_OCAF OR ${PROJECT_NAME}_DATAEXCHANGE OR ${PROJECT_NAME}_VISUALISATION OR ${PROJECT_NAME}_DRAW)
  SET(${PROJECT_NAME}_VISU_DEP TRUE)
ELSE(${PROJECT_NAME}_OCAF OR ${PROJECT_NAME}_DATAEXCHANGE OR ${PROJECT_NAME}_VISUALISATION OR ${PROJECT_NAME}_DRAW)
  SET(${PROJECT_NAME}_VISU_DEP FALSE)
ENDIF(${PROJECT_NAME}_OCAF OR ${PROJECT_NAME}_DATAEXCHANGE OR ${PROJECT_NAME}_VISUALISATION OR ${PROJECT_NAME}_DRAW)
IF(${PROJECT_NAME}_DISABLE_X11)
	SET(${PROJECT_NAME}_VISU_DEP FALSE)
ENDIF(${PROJECT_NAME}_DISABLE_X11)
IF(${PROJECT_NAME}_DISABLE_X11)
	SET(${PROJECT_NAME}_DRAW OFF CACHE BOOL "Build DRAWEXE" FORCE)
	SET(${PROJECT_NAME}_VISUALISATION OFF CACHE BOOL "Build visualisation component" FORCE)
ENDIF(${PROJECT_NAME}_DISABLE_X11)

IF(NOT ${PROJECT_NAME}_BUILD_SHARED_LIB AND ${PROJECT_NAME}_DRAW)
	SET(${PROJECT_NAME}_DRAW OFF CACHE BOOL "Build DRAWEXE" FORCE)
	MESSAGE("Warning : DRAW disabled when statically linking")
ENDIF(NOT ${PROJECT_NAME}_BUILD_SHARED_LIB AND ${PROJECT_NAME}_DRAW)

IF(${PROJECT_NAME}_DRAW AND NOT ${PROJECT_NAME}_DATAEXCHANGE)
	SET(${PROJECT_NAME}_DATAEXCHANGE ON CACHE BOOL "Build data exchange" FORCE)
ENDIF(${PROJECT_NAME}_DRAW AND NOT ${PROJECT_NAME}_DATAEXCHANGE)
IF(${PROJECT_NAME}_DATAEXCHANGE AND NOT ${PROJECT_NAME}_OCAF)
	SET(${PROJECT_NAME}_OCAF ON CACHE BOOL "Build application framework" FORCE)
ENDIF(${PROJECT_NAME}_DATAEXCHANGE AND NOT ${PROJECT_NAME}_OCAF)
IF(${PROJECT_NAME}_OCAF AND NOT ${PROJECT_NAME}_MODEL)
	SET(${PROJECT_NAME}_MODEL ON CACHE BOOL "Build model components" FORCE)
ENDIF(${PROJECT_NAME}_OCAF AND NOT ${PROJECT_NAME}_MODEL)
IF(${PROJECT_NAME}_VISUALISATION AND NOT ${PROJECT_NAME}_MODEL)
	SET(${PROJECT_NAME}_MODEL ON CACHE BOOL "Build model components" FORCE)
ENDIF(${PROJECT_NAME}_VISUALISATION AND NOT ${PROJECT_NAME}_MODEL)
IF(${PROJECT_NAME}_DRAW AND NOT ${PROJECT_NAME}_VISUALISATION)
	SET(${PROJECT_NAME}_VISUALISATION ON CACHE BOOL "Build visualisation component" FORCE)
ENDIF(${PROJECT_NAME}_DRAW AND NOT ${PROJECT_NAME}_VISUALISATION)

SET(INSTALL_STDRESOURCE_FILES)
SET(INSTALL_RESOURCE_FILES)
FILE(GLOB OS_TCL_SCRIPTS RELATIVE ${${PROJECT_NAME}_SOURCE_DIR} src/OS/*.tcl)
SET(INSTALL_RESOURCE_FILES ${INSTALL_RESOURCE_FILES}
	${OS_TCL_SCRIPTS}
	src/UnitsAPI/Lexi_Expr.dat
	src/UnitsAPI/Units.dat )
SET(INSTALL_STDRESOURCE_FILES ${INSTALL_STDRESOURCE_FILES}
	src/UnitsAPI/CurrentUnits
	src/UnitsAPI/MDTVBaseUnits
	src/UnitsAPI/MDTVCurrentUnits )

FIND_PACKAGE(Threads)
IF(${PROJECT_NAME}_MULTITHREAD_LIBRARY STREQUAL "TBB")
	FIND_PATH(TBB_INCLUDE_DIR tbb/tbb.h DOC "Location of header files for TBB (containing tbb/tbb.h)" ${CMAKE_SYSTEM_INCLUDE_PATH})
	IF(TBB_INCLUDE_DIR)
		IF(MSVC)
			IF(CMAKE_CL_64)
				SET(TBB_ARCH intel64)
			ELSE(CMAKE_CL_64)
				SET(TBB_ARCH ia32)
			ENDIF(CMAKE_CL_64)

			GET_FILENAME_COMPONENT(TBB_ROOT "${TBB_INCLUDE_DIR}/.." ABSOLUTE)
			IF(OCE_BUILD_SHARED_LIB)
				IF(MSVC80)
					SET(TBB_BIN_DIR "${TBB_ROOT}/bin/${TBB_ARCH}/vc8")
					SET(TBB_LIB_DIR "${TBB_ROOT}/lib/${TBB_ARCH}/vc8")
				ELSEIF(MSVC90)
					SET(TBB_BIN_DIR "${TBB_ROOT}/bin/${TBB_ARCH}/vc9")
					SET(TBB_LIB_DIR "${TBB_ROOT}/lib/${TBB_ARCH}/vc9")
				ELSEIF(MSVC10)
					SET(TBB_BIN_DIR "${TBB_ROOT}/bin/${TBB_ARCH}/vc10")
					SET(TBB_LIB_DIR "${TBB_ROOT}/lib/${TBB_ARCH}/vc10")
				ENDIF()
			ELSE(OCE_BUILD_SHARED_LIB)
				SET(TBB_LIB_DIR "${TBB_ROOT}/lib/${TBB_ARCH}/vc_mt")
			ENDIF(OCE_BUILD_SHARED_LIB)
		ENDIF(MSVC)

		FIND_LIBRARY( TBB_LIBRARY tbb PATHS "${TBB_LIB_DIR}" "Path to the TBB library" )
		IF (${PROJECT_NAME}_TBB_MALLOC_SUPPORT)
			FIND_LIBRARY( TBB_MALLOC_LIBRARY tbbmalloc PATHS "${TBB_LIB_DIR}" "Path to the TBB MALLOC library")
		ENDIF (${PROJECT_NAME}_TBB_MALLOC_SUPPORT)
		IF(CMAKE_CONFIGURATION_TYPES OR NMAKE)
			FIND_LIBRARY( TBB_LIBRARY_DEBUG tbb_debug PATHS "${TBB_LIB_DIR}" "Path to the TBB debug library" )
			IF (${PROJECT_NAME}_TBB_MALLOC_SUPPORT)
				FIND_LIBRARY( TBB_MALLOC_LIBRARY_DEBUG tbbmalloc_debug PATHS "${TBB_LIB_DIR}" "Path to the TBB MALLOC debug library")
			ENDIF (${PROJECT_NAME}_TBB_MALLOC_SUPPORT)
		ENDIF(CMAKE_CONFIGURATION_TYPES OR NMAKE)
	ENDIF(TBB_INCLUDE_DIR)
	MARK_AS_ADVANCED(TBB_INCLUDE_DIR TBB_LIBRARY)
ENDIF(${PROJECT_NAME}_MULTITHREAD_LIBRARY STREQUAL "TBB")

IF(${PROJECT_NAME}_MULTITHREAD_LIBRARY STREQUAL "OPENMP")
	FIND_PACKAGE(OpenMP)
ENDIF(${PROJECT_NAME}_MULTITHREAD_LIBRARY STREQUAL "OPENMP")

IF (${PROJECT_NAME}_USE_BUNDLE)
	FIND_PATH(${PROJECT_NAME}_BUNDLE_ROOT_PATH oce-bundle-root.empty "Path for the OCE-win-bundle")
ENDIF(${PROJECT_NAME}_USE_BUNDLE)

IF(${PROJECT_NAME}_VISUALISATION)
	IF(${PROJECT_NAME}_WITH_FREEIMAGE)
		FIND_PATH(FREEIMAGE_INCLUDE_DIR FreeImagePlus.h DOC "Location of header files for FreeImage" ${CMAKE_SYSTEM_INCLUDE_PATH})
		IF(FREEIMAGE_INCLUDE_DIR)
			FIND_LIBRARY( FREEIMAGE_LIBRARY freeimageplus "Path to the freeimage library" )
	
			IF(CMAKE_CONFIGURATION_TYPES OR NMAKE)
				FIND_LIBRARY( FREEIMAGE_LIBRARY_DEBUG freeimageplusd "Path to the freeimage debug library" )
			ENDIF(CMAKE_CONFIGURATION_TYPES OR NMAKE)
		ENDIF(FREEIMAGE_INCLUDE_DIR)
		MARK_AS_ADVANCED(FREEIMAGE_INCLUDE_DIR FREEIMAGE_LIBRARY)
	ENDIF(${PROJECT_NAME}_WITH_FREEIMAGE)

	IF (NOT WIN32)
		FIND_PACKAGE(X11 REQUIRED)
		FIND_LIBRARY( X11_Xmu_LIB Xmu PATHS /usr/openwin/lib )
		IF( NOT DEFINED X11_FONT_PATH )
			IF(NOT APPLE)
				SET(X11_FONT_PATH
					"/usr/share/X11/fonts"
					"/usr/share/fonts/X11")
			ELSE(NOT APPLE)
				SET(X11_FONT_PATH
					"/usr/X11/lib/X11/fonts"
					"/Library/Fonts"
					"/System/Library/Fonts")
			ENDIF(NOT APPLE)
		ENDIF( NOT DEFINED X11_FONT_PATH )
		SET(X11_FONT_PATH ${X11_FONT_PATH} CACHE PATH
			"Font directories containing fonts.dir listing files")
		MARK_AS_ADVANCED(X11_FONT_PATH)
	ENDIF(NOT WIN32)

	IF (NOT APPLE)
		FIND_PACKAGE(OpenGL REQUIRED)
		IF(NOT ${OPENGL_GLU_FOUND} STREQUAL "YES")
			MESSAGE( FATAL_ERROR "GLU not found" )
		ENDIF(NOT ${OPENGL_GLU_FOUND} STREQUAL "YES")
	ELSE (NOT APPLE)
		# under OSX, builtin FindOpenGl.cmake returns Cocoa OpenGL implementation
		# oce requires the X11 based OpenGL
		SET(OPENGL_INCLUDE_DIR /usr/X11R6/include/)
		SET(OPENGL_LIBRARIES /usr/X11R6/lib/libGL.dylib /usr/X11R6/lib/libGLU.dylib)
	ENDIF (NOT APPLE)

	## FreeType / FTGL
	IF(NOT ${PROJECT_NAME}_USE_BUNDLE)
		FIND_PACKAGE(Freetype REQUIRED)
	ELSE (NOT ${PROJECT_NAME}_USE_BUNDLE)
		FIND_LIBRARY(FREETYPE_LIBRARY freetype)
	ENDIF(NOT ${PROJECT_NAME}_USE_BUNDLE)

	FIND_PATH(FTGL_V212_INCLUDE_DIR FTGL/FTFace.h DOC "Location of header files for FTGL 2.1.2" ${CMAKE_SYSTEM_INCLUDE_PATH})
	FIND_PATH(FTGL_INCLUDE_DIR FTGL/ftgl.h "Location of header files for FTGL > 2.1.2" ${CMAKE_SYSTEM_INCLUDE_PATH})
	IF(NOT FTGL_V212_INCLUDE_DIR AND FTGL_INCLUDE_DIR)
		ADD_DEFINITIONS(-DHAVE_FTGL_NEWER212)
	ENDIF(NOT FTGL_V212_INCLUDE_DIR AND FTGL_INCLUDE_DIR)
	FIND_LIBRARY(FTGL_LIBRARY ftgl "Location of ftgl library (any version)")
	IF(CMAKE_CONFIGURATION_TYPES OR NMAKE)
		FIND_LIBRARY(FTGL_LIBRARY_DEBUG ftgld "Location of ftgl debug library (any version)")
		FIND_LIBRARY(FREETYPE_LIBRARY_DEBUG freetyped "Location of freetype debug library")
	ENDIF(CMAKE_CONFIGURATION_TYPES OR NMAKE)
	MARK_AS_ADVANCED(X11_Xmu_LIB FTGL_V212_INCLUDE_DIR FTGL_INCLUDE_DIR FTGL_LIBRARY)

	## GL2PS
	IF(${PROJECT_NAME}_WITH_GL2PS)
		FIND_PATH(GL2PS_INCLUDE_DIR gl2ps.h DOC "Location of header files for GL2PS (containing gl2ps.h)" ${CMAKE_SYSTEM_INCLUDE_PATH})
		IF(GL2PS_INCLUDE_DIR)
			FIND_LIBRARY( GL2PS_LIBRARY gl2ps "Path to the gl2ps library" )
			IF(CMAKE_CONFIGURATION_TYPES OR NMAKE)
				FIND_LIBRARY( GL2PS_LIBRARY_DEBUG gl2psd "Path to the gl2ps debug library" )
			ENDIF(CMAKE_CONFIGURATION_TYPES OR NMAKE)
		ENDIF(GL2PS_INCLUDE_DIR)
		MARK_AS_ADVANCED(GL2PS_INCLUDE_DIR GL2PS_LIBRARY)
	ENDIF(${PROJECT_NAME}_WITH_GL2PS)

	MESSAGE(STATUS "X11 LIBS: ${X11_LIBRARIES}")
	MESSAGE(STATUS "OPENGL LIBS: ${OPENGL_LIBRARIES}")
	MESSAGE(STATUS "FREETYPE LIBS: ${FREETYPE_LIBRARIES}")
	MESSAGE(STATUS "FREETYPE INCLUDES: ${FREETYPE_INCLUDE_DIRS}")
	MESSAGE(STATUS "THREAD LIB: ${CMAKE_THREAD_LIBS_INIT}")

	FILE(GLOB TEXTURES_RGB_FILES RELATIVE ${${PROJECT_NAME}_SOURCE_DIR} src/Textures/*.rgb)
	SET(INSTALL_RESOURCE_FILES ${INSTALL_RESOURCE_FILES} ${TEXTURES_RGB_FILES})
ENDIF(${PROJECT_NAME}_VISUALISATION)

IF(${PROJECT_NAME}_OCAF)
	FILE(GLOB XMLOCAFRESOURCE_XSD_FILES RELATIVE ${${PROJECT_NAME}_SOURCE_DIR} src/XmlOcafResource/*.xsd)
	SET(INSTALL_RESOURCE_FILES ${INSTALL_RESOURCE_FILES}
		${XMLOCAFRESOURCE_XSD_FILES}
		src/StdResource/MigrationSheet.txt
		src/StdResource/MDTV-Standard.xwd
		src/StdResource/Plugin
		src/StdResource/Standard
		src/StdResource/Standard.us
		src/StdResource/StandardLite
		src/StdResource/TObj
		src/StdResource/XCAF
		src/StdResource/dftree.tcl )
ENDIF(${PROJECT_NAME}_OCAF)

IF(${PROJECT_NAME}_DATAEXCHANGE)
	SET(INSTALL_RESOURCE_FILES ${INSTALL_RESOURCE_FILES}
		src/SHMessage/SHAPE.fr
		src/SHMessage/SHAPE.us
		src/XSMessage/IGES.fr
		src/XSMessage/IGES.us
		src/XSMessage/XSTEP.fr
		src/XSMessage/XSTEP.us
		src/XSTEPResource/IGES
		src/XSTEPResource/STEP )
ENDIF(${PROJECT_NAME}_DATAEXCHANGE)

IF(${PROJECT_NAME}_DRAW)
	IF (NOT APPLE)
		FIND_PACKAGE(TCL REQUIRED)
	ELSE(NOT APPLE)
		# under OSX, should use a X11 based TCL/TK, for instance fink's implementation
		SET(FINK_INSTALL_PATH /sw)
		MARK_AS_ADVANCED(FINK_INSTALL_PATH)
		SET(TCL_LIBRARY ${FINK_INSTALL_PATH}/lib/libtcl.dylib)
		SET(TCL_INCLUDE_PATH ${FINK_INSTALL_PATH}/include)
		SET(TCL_TCLSH ${FINK_INSTALL_PATH}/bin/tclsh)
		SET(TK_LIBRARY ${FINK_INSTALL_PATH}/lib/libtk.dylib)
		SET(TK_INCLUDE_PATH ${FINK_INSTALL_PATH}/include)
		SET(TK_WISH ${FINK_INSTALL_PATH}/bin/wish)
		MARK_AS_ADVANCED(TCL_INCLUDE_PATH TK_INCLUDE_PATH TCL_LIBRARY TK_LIBRARY)
	ENDIF(NOT APPLE)
	MESSAGE(STATUS "TCL LIB: ${TCL_LIBRARY}")
	MESSAGE(STATUS "TK LIB: ${TK_LIBRARY}")
	FILE(GLOB DRAWRESOURCES_TCL_FILES RELATIVE ${${PROJECT_NAME}_SOURCE_DIR} src/DrawResources/*.tcl)
	SET(INSTALL_RESOURCE_FILES ${INSTALL_RESOURCE_FILES}
		${DRAWRESOURCES_TCL_FILES}
		src/DrawResources/DRAW.doc
		src/DrawResources/DRAW.info
		src/DrawResources/DrawDefault
		src/DrawResources/DrawPlugin
		src/DrawResources/demo
		src/DrawResources/demo.bat
		src/DrawResources/idoc
		src/DrawResources/lamp.ico
		src/DrawResources/mdltest
		src/DrawResources/mkdoc
		src/DrawResources/tdoc
		src/DrawResources/test2xl
		src/DrawResources/vmdltest
		src/DrawResources/wing.brep )
ENDIF(${PROJECT_NAME}_DRAW)

IF (${PROJECT_NAME}_USE_BUNDLE AND ${PROJECT_NAME}_BUNDLE_ROOT_PATH)
	MESSAGE("Using OCE Bundle")
	IF (${PROJECT_NAME}_VISUALISATION)
		SET(FTGL_INCLUDE_DIR ${${PROJECT_NAME}_BUNDLE_ROOT_PATH}/include/FTGL CACHE PATH "" FORCE)
		SET(FREETYPE_INCLUDE_DIR_freetype2 ${${PROJECT_NAME}_BUNDLE_ROOT_PATH}/include/freetype CACHE PATH "" FORCE)
		SET(FREETYPE_INCLUDE_DIR_ft2build ${${PROJECT_NAME}_BUNDLE_ROOT_PATH}/include/freetype CACHE PATH "" FORCE)
		SET(FREETYPE_INCLUDE_DIRS ${FREETYPE_INCLUDE_DIR_freetype2} ${FREETYPE_INCLUDE_DIR_ft2build})
		SET(FREETYPE_LIBRARY ${${PROJECT_NAME}_BUNDLE_ROOT_PATH}/Win${BIT}/lib/freetype.lib CACHE FILEPATH "" FORCE)
		SET(FREETYPE_LIBRARIES ${${PROJECT_NAME}_BUNDLE_ROOT_PATH}/Win${BIT}/lib/freetype.lib CACHE FILEPATH "" FORCE)
		SET(FREETYPE_LIBRARY_DEBUG ${${PROJECT_NAME}_BUNDLE_ROOT_PATH}/Win${BIT}/libd/freetyped.lib CACHE FILEPATH "" FORCE)
		SET(FTGL_LIBRARY ${${PROJECT_NAME}_BUNDLE_ROOT_PATH}/Win${BIT}/lib/ftgl.lib CACHE FILEPATH "" FORCE)
		SET(FTGL_LIBRARY_DEBUG ${${PROJECT_NAME}_BUNDLE_ROOT_PATH}/Win${BIT}/libd/ftgld.lib CACHE FILEPATH "" FORCE)
		ADD_DEFINITIONS(-DHAVE_FTGL_NEWER212)

		IF(${PROJECT_NAME}_WITH_GL2PS)
			SET(GL2PS_LIBRARY ${${PROJECT_NAME}_BUNDLE_ROOT_PATH}/Win${BIT}/lib/gl2ps.lib CACHE FILEPATH "" FORCE)
			SET(GL2PS_LIBRARY_DEBUG ${${PROJECT_NAME}_BUNDLE_ROOT_PATH}/Win${BIT}/libd/gl2psd.lib CACHE FILEPATH "" FORCE)
			SET(GL2PS_INCLUDE_DIR ${${PROJECT_NAME}_BUNDLE_ROOT_PATH}/include/gl2ps CACHE PATH "" FORCE)
		ENDIF(${PROJECT_NAME}_WITH_GL2PS)

		IF(${PROJECT_NAME}_WITH_FREEIMAGE)
			SET(FREEIMAGE_LIBRARY ${${PROJECT_NAME}_BUNDLE_ROOT_PATH}/Win${BIT}/lib/FreeImage.lib CACHE FILEPATH "" FORCE)
			SET(FREEIMAGE_LIBRARY_DEBUG ${${PROJECT_NAME}_BUNDLE_ROOT_PATH}/Win${BIT}/libd/FreeImaged.lib CACHE FILEPATH "" FORCE)
			SET(FREEIMAGE_INCLUDE_DIR ${${PROJECT_NAME}_BUNDLE_ROOT_PATH}/include/FreeImage CACHE PATH "" FORCE)
		ENDIF(${PROJECT_NAME}_WITH_FREEIMAGE)
	ENDIF (${PROJECT_NAME}_VISUALISATION)
ENDIF(${PROJECT_NAME}_USE_BUNDLE AND ${PROJECT_NAME}_BUNDLE_ROOT_PATH)

IF(MSVC)
	SET( CMAKE_DEBUG_POSTFIX "d" )
ENDIF(MSVC)

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/build_inc
	${CMAKE_CURRENT_SOURCE_DIR}/inc)

###################################
# Architecture-specific libraries #
###################################
IF(WIN32)
	SET(LM)
	SET(CSF_gdi32_LIB gdi32)
	SET(CSF_advapi32_LIB advapi32)
	SET(CSF_user32_LIB user32)
	SET(CSF_kernel32_LIB kernel32)
	SET(CSF_SOCKETLibs_LIB ws2_32)
	SET(CSF_wsock32_LIB ws2_32)
ELSE(WIN32)
	SET(LM "-lm")
	SET(WIN32_LIBS "")
	SET(CSF_gdi32_LIB "")
	SET(CSF_advapi32_LIB "")
	SET(CSF_user32_LIB "")
	SET(CSF_kernel32_LIB "")
	SET(CSF_SOCKETLibs_LIB "")
	SET(CSF_wsock32_LIB "")
ENDIF(WIN32)

###################################################
# Check required headers, functions and libraries #
###################################################
IF (NOT WIN32)
	# Check headers
	# I think these should all be check cxx headers, as I think there is no c
	# compilation anywhere in ${PROJECT_NAME}
	INCLUDE(CheckIncludeFile)
	#INCLUDE(CheckIncludeFiles)
	CHECK_INCLUDE_FILE(string.h HAVE_STRING_H)
	CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
	CHECK_INCLUDE_FILE(dl.h HAVE_DL_H)
	CHECK_INCLUDE_FILE(ieeefp.h HAVE_IEEEFP_H)
	CHECK_INCLUDE_FILE(time.h HAVE_TIME_H)
	CHECK_INCLUDE_FILE(sys/time.h HAVE_SYS_TIME_H)
	CHECK_INCLUDE_FILE(pwd.h HAVE_PWD_H)
	CHECK_INCLUDE_FILE(sys/statvfs.h HAVE_SYS_STATVFS_H)
	CHECK_INCLUDE_FILE(sys/vfs.h HAVE_SYS_VFS_H)
	CHECK_INCLUDE_FILE(sys/param.h HAVE_SYS_PARAM_H)
	CHECK_INCLUDE_FILE(osfcn.h HAVE_OSFCN_H)
	CHECK_INCLUDE_FILE(netdb.h HAVE_NETDB_H)
	CHECK_INCLUDE_FILE(sys/ioctl.h HAVE_SYS_IOCTL_H)
	CHECK_INCLUDE_FILE(net/if.h HAVE_NET_IF_H)
	CHECK_INCLUDE_FILE(sys/systeminfo.h HAVE_SYS_SYSTEMINFO_H)
	CHECK_INCLUDE_FILE(sys/utsname.h HAVE_SYS_UTSNAME_H)
	CHECK_INCLUDE_FILE(sysent.h HAVE_SYSENT_H)
	CHECK_INCLUDE_FILE(unistd.h HAVE_UNISTD_H)
	CHECK_INCLUDE_FILE(sys/unistd.h HAVE_SYS_UNISTD_H)
	CHECK_INCLUDE_FILE(sys/socket.h HAVE_SYS_SOCKET_H)
	CHECK_INCLUDE_FILE(ndir.h HAVE_NDIR_H)
	CHECK_INCLUDE_FILE(sys/ndir.h HAVE_SYS_NDIR_H)
	CHECK_INCLUDE_FILE(sys/dir.h HAVE_SYS_DIR_H)
	CHECK_INCLUDE_FILE(signal.h HAVE_SIGNAL_H)
	CHECK_INCLUDE_FILE(sys/signal.h HAVE_SYS_SIGNAL_H)
	CHECK_INCLUDE_FILE(sigfpe.h HAVE_SIGFPE_H)
	CHECK_INCLUDE_FILE(floatingpoint.h HAVE_FLOATINGPOINT_H)
	CHECK_INCLUDE_FILE(sys/machsig.h HAVE_SYS_MACHSIG_H)
	CHECK_INCLUDE_FILE(sys/siginfo.h HAVE_SYS_SIGINFO_H)
	CHECK_INCLUDE_FILE(malloc.h HAVE_MALLOC_H)
	CHECK_INCLUDE_FILE(strings.h HAVE_STRINGS_H)
	CHECK_INCLUDE_FILE(sys/stat.h HAVE_SYS_STAT_H)
	CHECK_INCLUDE_FILE(sys/sem.h HAVE_SYS_SEM_H)
	CHECK_INCLUDE_FILE(sys/ipc.h HAVE_SYS_IPC_H)
	CHECK_INCLUDE_FILE(sys/times.h HAVE_SYS_TIMES_H)
	CHECK_INCLUDE_FILE(dirent.h HAVE_DIRENT_H)
	INCLUDE(CheckIncludeFileCXX)
	CHECK_INCLUDE_FILE_CXX(iomanip.h OCE_HAVE_IOMANIP_H)
	CHECK_INCLUDE_FILE_CXX(limits OCE_HAVE_LIMITS)
	CHECK_INCLUDE_FILE_CXX(climits OCE_HAVE_CLIMITS)
	CHECK_INCLUDE_FILE_CXX(limits.h OCE_HAVE_LIMITS_H)
	CHECK_INCLUDE_FILE_CXX(values.h HAVE_VALUES_H)
	CHECK_INCLUDE_FILE_CXX(fstream OCE_HAVE_FSTREAM)
	CHECK_INCLUDE_FILE_CXX(ios HAVE_IOS)
	CHECK_INCLUDE_FILE_CXX(iomanip OCE_HAVE_IOMANIP)
	CHECK_INCLUDE_FILE_CXX(iostream OCE_HAVE_IOSTREAM)
	CHECK_INCLUDE_FILE_CXX(fstream.h OCE_HAVE_FSTREAM_H)
	CHECK_INCLUDE_FILE_CXX(ios.h HAVE_IOS_H)
	CHECK_INCLUDE_FILE_CXX(iostream.h OCE_HAVE_IOSTREAM_H)
	CHECK_INCLUDE_FILE_CXX(stdlib.h HAVE_STDLIB_H)
	CHECK_INCLUDE_FILE_CXX(sys/types.h HAVE_SYS_TYPES_H)
	CHECK_INCLUDE_FILE_CXX(sys/select.h HAVE_SYS_SELECT_H)
	CHECK_INCLUDE_FILE_CXX(X11/extensions/readdisplay.h HAVE_X11_EXTENSIONS_READDISPLAY_H)
	CHECK_INCLUDE_FILE_CXX(X11/extensions/multibuf.h HAVE_X11_EXTENSIONS_MULTIBUF_H)
	CHECK_INCLUDE_FILE_CXX(sys/filio.h HAVE_SYS_FILIO_H)
	CHECK_INCLUDE_FILE_CXX(sys/mman.h HAVE_SYS_MMAN_H)
	CHECK_INCLUDE_FILE_CXX(libc.h HAVE_LIBC_H)
	# Check library functions
	INCLUDE(CheckFunctionExists)
	CHECK_FUNCTION_EXISTS(alloca HAVE_ALLOCA)
	CHECK_FUNCTION_EXISTS(memcmp HAVE_MEMCMP)
	CHECK_FUNCTION_EXISTS(signal HAVE_SIGNAL)
	CHECK_FUNCTION_EXISTS(statfs HAVE_STATFS)
	CHECK_FUNCTION_EXISTS(statvfs HAVE_STATVFS)
	CHECK_FUNCTION_EXISTS(finite HAVE_FINITE)
	CHECK_FUNCTION_EXISTS(localtime_r HAVE_LOCALTIME_R)
	SET(CMAKE_REQUIRED_LIBRARIES sunmath)
	CHECK_FUNCTION_EXISTS(ieee_handler HAVE_SUNMATH)
	SET(CMAKE_REQUIRED_LIBRARIES)
	INCLUDE(CheckTypeSize)
	SET(CMAKE_EXTRA_INCLUDE_FILES sys/time.h)
	CHECK_TYPE_SIZE(tm TM_IN_SYS_TIME)
	SET(CMAKE_EXTRA_INCLUDE_FILES)
	INCLUDE (CheckCSourceCompiles)
	CHECK_C_SOURCE_COMPILES("
		#include <sys/time.h>
		#include <sys/sem.h>
		int main(){union semun c;return 0;}
		"
		SEMUN_DEFINED)
	IF (SEMUN_DEFINED)
		CHECK_C_SOURCE_COMPILES("
			#include <sys/time.h>
			#include <sys/sem.h>
			int main(){union semun c;c.__buf = 0;return 0;}
			"
			SEMUN_BUF_DEFINED)
	ENDIF (SEMUN_DEFINED)
	CHECK_C_SOURCE_COMPILES("
		#include <sys/sem.h>
		static struct sembuf event_flag;
		int main(){int status; int *semid;status = semop(*semid,event_flag,1);return 0;}
		"
		SEMOP_NO_REFERENCE)

	CHECK_C_SOURCE_COMPILES("
		#include <sys/sem.h>
		int get_semaphore(int *semid,int *event,int *value)
		{
			int status;
			status = semctl((*semid),*event,GETVAL,value);
			return 0;
		}
		int main(){ int *a,*b,*c;
		if(get_semaphore(a,b,c))
			return 0;
		return 0;}
		"
		SEMCTL_NO_REFERENCE)

	INCLUDE (CheckCXXSourceCompiles)
	CHECK_CXX_SOURCE_COMPILES("
		#include <ios>
		int main(){static const int input = (std::ios::in)|(std::ios::nocreate);
		static const int output = (std::ios::out);return 0;}
		"
		DEF_IOS_OK)
	CHECK_CXX_SOURCE_COMPILES("
		#include <iostream>
		int main(){std::cout << std::cout.form(\"%9.3e\", 3.14159627e-4) << std::endl;return 0;}
		"
		OSTREAM_FORM_OK)
	INCLUDE(TestBigEndian)
	TEST_BIG_ENDIAN(WORDS_BIGENDIAN)
	SET(STDC_HEADERS TRUE) # Only for really old systems, being lazy
	SET(STACK_DIRECTION 0) # Don't have a test for this, TODO?

# TODO: check all headers/functions/libraries that are checked in configure.ac original OCC script
ENDIF(NOT WIN32)

#######################################################
# Check compiler version - Determine Borland compiler #
#######################################################
IF(BORLAND AND NOT BORLAND_VERSION)
	IF(EXISTS ${CMAKE_CXX_COMPILER})
		EXECUTE_PROCESS(
			COMMAND ${CMAKE_CXX_COMPILER}  /?
			OUTPUT_VARIABLE _output
			ERROR_QUIET
		)
		
		string(REGEX MATCH "Embarcadero C[+][+] [0-9]+.[0-9]+"
			_borland_version "${_output}")
			
		if(_borland_version)
			string(REGEX MATCHALL "[0-9]+" _borland_version_list "${_borland_version}")
			list(GET _borland_version_list 0 _borland_major)
			list(GET _borland_version_list 1 _borland_minor)
		else()
			string(REGEX MATCH "Borland C[+][+] [0-9]+].[0-9]+"
				_borland_version "${_output}")
			
			if(_borland_version)
				string(REGEX MATCHALL "[0-9]+" _borland_version_list "${_borland_version}")
				list(GET _borland_version_list 0 _borland_major)
				list(GET _borland_version_list 1 _borland_minor)
			endif()
		endif()
			
		# XE2 compiler?
		if("v${_borland_major}.${_borland_minor}" STREQUAL "v6.41")
			SET(BORLAND_VERSION "bcc32 v6.41 (RS XE2)")
			SET(BORLAND_VERSION_RS_XE2 1)
		# XE compiler?
		elseif("v${_borland_major}.${_borland_minor}" STREQUAL "v6.30")
			SET(BORLAND_VERSION "bcc32 v6.30 (RS XE)")
			SET(BORLAND_VERSION_RS_XE 1)
		# 2010 compiler?
		elseif("v${_borland_major}.${_borland_minor}" STREQUAL "v6.20")
			SET(BORLAND_VERSION "bcc32 v6.20 (RS 2010)")
			SET(BORLAND_VERSION_RS_2010 1)
		# TODO: 2009 compiler?
		# TODO: 2007 compiler?
		# 2006 compiler?
		elseif("v${_borland_major}.${_borland_minor}" STREQUAL "v5.82")
			SET(BORLAND_VERSION "bcc32 v5.82 (BDS 2006)")
			SET(BORLAND_VERSION_BDS_2006 1)
		#TODO: Older compilers?
		else()
			SET(BORLAND_VERSION "Unknown")
		endif()
		
		UNSET(_output)
		UNSET(_borland_version)
		UNSET(_borland_major)
		UNSET(_borland_minor)
	ENDIF()
ENDIF()

#######################################################
# Check platforms - Define specific compilation flags #
#######################################################
IF(UNIX)
	IF(APPLE)
		######### MacOSX ###########
		MESSAGE(STATUS "MacOSX platform detected")
		SET(PLATFORM Darwin)
	ELSE(APPLE)
		######### Unix/Linux ###########
		MESSAGE(STATUS "Unix/Linux platform detected")
		SET(PLATFORM Unix)
	ENDIF(APPLE)
	ADD_DEFINITIONS(-DHAVE_CONFIG_H -DCSFDB -DOCC_CONVERT_SIGNALS)
ELSE(UNIX)
	IF(WIN32)
		######### Windows ###########
		MESSAGE(STATUS "Windows system detected")
		ADD_DEFINITIONS(-DWNT -DWIN32 -D_WINDOWS -DCSFDB -DHAVE_CONFIG_H )
		######### Borland ###########
		IF(BORLAND)
			MESSAGE(STATUS "Borland compiler detected: ${BORLAND_VERSION}")
			ADD_DEFINITIONS(-DHAVE_IOS )
		ENDIF(BORLAND)
		SET(PLATFORM win)
	ELSE(WIN32)
		MESSAGE(STATUS "Unknown platform")
	ENDIF(WIN32)
ENDIF(UNIX)
# TODO: better detection of different Unices (Linux, Solaris etc.)
# TODO: add CXX compiler flags for each platform

# Enable Extra warnings for each compiler
IF( ${PROJECT_NAME}_EXTRA_WARNINGS)
	IF(MSVC)
		ADD_DEFINITIONS("/W4 /wd4100 /wd4206 /wd4127")
	ENDIF(MSVC)
	IF(CMAKE_COMPILER_IS_GNUCXX)
		ADD_DEFINITIONS("-Wall -Wextra")
	ENDIF(CMAKE_COMPILER_IS_GNUCXX)
	IF(BORLAND)
		#TODO
	ENDIF(BORLAND)
ENDIF(${PROJECT_NAME}_EXTRA_WARNINGS)

################################################
# Define output path for generated libraries:  #
# platform/compiler-build_type-bits            #
# for instance:                                #
#     ./win32/bin/vc7.1-release-64             #
#     ./win32/bin/vc9-debug-32                 #
#     ./Unix/i386-debug-64                     #
################################################
IF(WIN32)
	IF(MSVC) # The compiler used is MSVC
		MESSAGE(STATUS "Found MSVC compiler: ${MSVC} ${MSVC_VERSION}")
		SET(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin/)
	ELSEIF (BORLAND) # The compiler used is BORLAND
		SET(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/win${BIT}/bin/${CMAKE_BUILD_TYPE})
	ELSE()
		SET(LIBRARY_OUTPUT_PATH win${BIT}/bin/${CMAKE_BUILD_TYPE})
	ENDIF()
	SET(EXECUTABLE_OUTPUT_PATH ${LIBRARY_OUTPUT_PATH})
ELSE(WIN32)
	SET(LIBRARY_OUTPUT_PATH ${PLATFORM}/${CMAKE_SYSTEM_PROCESSOR}-${CMAKE_BUILD_TYPE}-${BIT})
ENDIF(WIN32)
MESSAGE(STATUS "output_path: ${LIBRARY_OUTPUT_PATH}")

# TODO: under win32/64, dlls and libs should not be in the same path (non MSVC)

IF(MINGW)
	SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mthreads")
	SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mthreads")
	SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -mthreads -Wl,--export-all-symbols")
	SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -mthreads -Wl,--export-all-symbols")
	# For the file Message_MsgFile.cxx of TKernel we must additionally set the __TCollection_DLL define to resolve the needed HashCode() method
	SET_SOURCE_FILES_PROPERTIES("src/Message/Message_MsgFile.cxx" PROPERTIES COMPILE_FLAGS "-D__Message_DLL -D__TCollection_DLL")
ENDIF(MINGW)

# DISABLE SECURE CRT WARNINGS AND OTHER MS CRT SPECIFC THINGS
IF (MSVC)
	ADD_DEFINITIONS("/D_CRT_SECURE_NO_WARNINGS")
	ADD_DEFINITIONS("/D_CRT_NONSTDC_NO_WARNINGS")
ENDIF(MSVC)

IF(MSVC_IDE)
	IF(NOT ${PROJECT_NAME}_USE_MSVC_EXPRESS)
		#Use solution folders.
		SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON)
		SET(USE_SOLUTION_FOLDERS TRUE)
	ELSE( NOT ${PROJECT_NAME}_USE_MSVC_EXPRESS)
		SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS OFF)
	ENDIF( NOT ${PROJECT_NAME}_USE_MSVC_EXPRESS)
ENDIF(MSVC_IDE)

# Libraries are installed by default in /usr/local/lib on UNIX
# based platforms and c:/${PROJECT_NAME}-VERSION/Win[32|64]/lib on windows based
# platforms

IF(WIN32)
	SET(_PSUFFIX "Win${BIT}/")
ELSE(WIN32)
	SET(_PSUFFIX "")
ENDIF(WIN32)
STRING(TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWERCASE)

# Binaries
IF(NOT DEFINED ${PROJECT_NAME}_INSTALL_BIN_DIR)
	SET(${PROJECT_NAME}_INSTALL_BIN_DIR ${_PSUFFIX}bin)
ENDIF(NOT DEFINED ${PROJECT_NAME}_INSTALL_BIN_DIR)

# Libraries
IF(NOT DEFINED ${PROJECT_NAME}_INSTALL_LIB_DIR)
	SET(${PROJECT_NAME}_INSTALL_LIB_DIR ${_PSUFFIX}lib${LIB_SUFFIX})
ENDIF(NOT DEFINED ${PROJECT_NAME}_INSTALL_LIB_DIR)

IF(MSVC)
	IF(NOT DEFINED ${PROJECT_NAME}_INSTALL_PACKAGE_LIB_DIR)
		SET(${PROJECT_NAME}_INSTALL_PACKAGE_LIB_DIR ${${PROJECT_NAME}_INSTALL_LIB_DIR})
	ENDIF(NOT DEFINED ${PROJECT_NAME}_INSTALL_PACKAGE_LIB_DIR)
ELSE(MSVC)
	IF(NOT DEFINED ${PROJECT_NAME}_INSTALL_PACKAGE_LIB_DIR)
		SET(${PROJECT_NAME}_INSTALL_PACKAGE_LIB_DIR ${${PROJECT_NAME}_INSTALL_LIB_DIR}/${PROJECT_NAME_LOWERCASE}-${${PROJECT_NAME}_VERSION})
	ENDIF(NOT DEFINED ${PROJECT_NAME}_INSTALL_PACKAGE_LIB_DIR)
ENDIF(MSVC)

# Includes
IF(NOT DEFINED ${PROJECT_NAME}_INSTALL_INCLUDE_DIR)
	SET(${PROJECT_NAME}_INSTALL_INCLUDE_DIR include/${PROJECT_NAME_LOWERCASE})
ENDIF(NOT DEFINED ${PROJECT_NAME}_INSTALL_INCLUDE_DIR)

# Scripts
IF(NOT DEFINED ${PROJECT_NAME}_INSTALL_SCRIPT_DIR)
	SET(${PROJECT_NAME}_INSTALL_SCRIPT_DIR ${${PROJECT_NAME}_INSTALL_PACKAGE_LIB_DIR})
ENDIF(NOT DEFINED ${PROJECT_NAME}_INSTALL_SCRIPT_DIR)

# Data
IF(NOT DEFINED ${PROJECT_NAME}_INSTALL_DATA_DIR)
	IF(NOT MSVC)
		SET(${PROJECT_NAME}_INSTALL_DATA_DIR share/${PROJECT_NAME_LOWERCASE}-${${PROJECT_NAME}_VERSION})
	ELSE ()
		SET(${PROJECT_NAME}_INSTALL_DATA_DIR "share/${PROJECT_NAME_LOWERCASE}")
	ENDIF(NOT MSVC)
ENDIF(NOT DEFINED ${PROJECT_NAME}_INSTALL_DATA_DIR)
# Absolute path, written into oce-config.h
SET(${PROJECT_NAME}_ABSPATH_DATA_DIR ${CMAKE_INSTALL_PREFIX}/${${PROJECT_NAME}_INSTALL_DATA_DIR})

# CMake
IF(NOT DEFINED ${PROJECT_NAME}_INSTALL_CMAKE_DATA_DIR)
	#  See http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:find_package
	#  and the definition of ${PROJECT_NAME}_INSTALL_PREFIX at the beginning.
	#  CMake files are installed under INSTALL_PREFIX/INSTALL_CMAKE_DATA_DIR.
	IF(WIN32)
		SET(${PROJECT_NAME}_INSTALL_CMAKE_DATA_DIR cmake)
	ELSE(WIN32)
		IF(APPLE)
			SET(${PROJECT_NAME}_INSTALL_CMAKE_DATA_DIR
				${PROJECT_NAME}.framework/Versions/${${PROJECT_NAME}_VERSION}/Resources)
		ELSE(APPLE)
			SET(${PROJECT_NAME}_INSTALL_CMAKE_DATA_DIR
				lib${LIB_SUFFIX}/${PROJECT_NAME_LOWERCASE}-${${PROJECT_NAME}_VERSION})
		ENDIF(APPLE)
	ENDIF(WIN32)
ENDIF(NOT DEFINED ${PROJECT_NAME}_INSTALL_CMAKE_DATA_DIR)
# This relative path is written into OCEConfig.cmake to set OCE_INCLUDE_DIRS relative to OCEConfig.cmake
# There is no need to prepend ${PROJECT_NAME}_INSTALL_PREFIX, CMake convention is to use slashes.
FILE(RELATIVE_PATH ${PROJECT_NAME}_CMAKE_DATA_TO_INCLUDE_RELATIVE_DIR "/${${PROJECT_NAME}_INSTALL_CMAKE_DATA_DIR}" "/${${PROJECT_NAME}_INSTALL_INCLUDE_DIR}")

FOREACH(RESOURCE_FILE ${INSTALL_RESOURCE_FILES})
	GET_FILENAME_COMPONENT(RESOURCE_PATH ${RESOURCE_FILE} PATH)
	INSTALL(FILES ${RESOURCE_FILE}
		DESTINATION ${${PROJECT_NAME}_INSTALL_DATA_DIR}/${RESOURCE_PATH})
ENDFOREACH(RESOURCE_FILE ${INSTALL_RESOURCE_FILES})
INSTALL(FILES ${INSTALL_STDRESOURCE_FILES}
	DESTINATION ${${PROJECT_NAME}_INSTALL_DATA_DIR}/src/StdResource)

IF(WIN32)
	SET(ENV_SCRIPTS
		${${PROJECT_NAME}_SOURCE_DIR}/env.bat
		${${PROJECT_NAME}_SOURCE_DIR}/env_build.bat
		${${PROJECT_NAME}_SOURCE_DIR}/msvc.bat
	)
	INSTALL(FILES ${ENV_SCRIPTS}
		DESTINATION ${${PROJECT_NAME}_INSTALL_SCRIPT_DIR})
ENDIF(WIN32)

FILE(GLOB header_files ${${PROJECT_NAME}_SOURCE_DIR}/inc/*.*)
INSTALL(FILES ${header_files}
	DESTINATION ${${PROJECT_NAME}_INSTALL_INCLUDE_DIR} COMPONENT Development
)

SET(OCE_INSTALL_DATA_DIR ${${PROJECT_NAME}_INSTALL_DATA_DIR})
IF (NOT MSVC) 
   SET(OCE_DEFAULT_CSF_GraphicShr ${${PROJECT_NAME}_INSTALL_PREFIX}/${${PROJECT_NAME}_INSTALL_LIB_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}TKOpenGl${CMAKE_SHARED_LIBRARY_SUFFIX})
ELSE()
   SET(OCE_DEFAULT_CSF_GraphicShr ${CMAKE_SHARED_LIBRARY_PREFIX}TKOpenGl)
ENDIF(NOT MSVC)

#this is the header used to build OCE
CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/oce_build_config.h.cmake
	${CMAKE_CURRENT_BINARY_DIR}/build_inc/oce-config.h )
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/build_inc/oce-config.h
	RENAME oce_build_config.defs
	DESTINATION ${${PROJECT_NAME}_INSTALL_INCLUDE_DIR} COMPONENT Development )

#this is the header that is installed on the system
CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/oce_install_config.h.cmake
	${CMAKE_CURRENT_BINARY_DIR}/install_inc/oce-config.h )
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/install_inc/oce-config.h
		DESTINATION ${${PROJECT_NAME}_INSTALL_INCLUDE_DIR} COMPONENT Development )

# Version information
IF(NOT ${PROJECT_NAME}_NO_LIBRARY_VERSION)
CONFIGURE_FILE (${CMAKE_CURRENT_SOURCE_DIR}/Version.rc.cmake
				${CMAKE_CURRENT_BINARY_DIR}/Version.rc)
ENDIF(NOT ${PROJECT_NAME}_NO_LIBRARY_VERSION)

MACRO(PROCESS_MODULE modulename modules_std)
	set(modules ${modules_std})
	IF(NOT ${PROJECT_NAME}_DISABLE_X11)
		LIST(APPEND modules ${ARGN})
	ENDIF(NOT ${PROJECT_NAME}_DISABLE_X11)
	FOREACH(module ${modules})
		LIST(APPEND ${PROJECT_NAME}_LIBRARIES ${module})
		SET(TOOLKIT_MODULES "")
		SET(TOOLKIT_DEPENDS "")
		SET(TOOLKIT_INCLUDE_DIRECTORIES "")
		SET(TOOLKIT_LIBS "")
		ADD_SUBDIRECTORY( adm/cmake/${module} )

		IF (USE_SOLUTION_FOLDERS)
			SET_TARGET_PROPERTIES(${module} PROPERTIES FOLDER ${modulename} )
		ENDIF(USE_SOLUTION_FOLDERS)
	ENDFOREACH(module ${modules})
ENDMACRO(PROCESS_MODULE modulename modules_std)

####################################################################################
# Process modules of each ToolKit                                                  #
####################################################################################
# Foundation
PROCESS_MODULE( "Kernel" "TKernel;TKMath;TKAdvTools" )

# Modeling Data
IF (${PROJECT_NAME}_MODEL)
	PROCESS_MODULE( "Modeling Data" "TKG2d;TKG3d;TKGeomBase;TKBRep" )
ENDIF (${PROJECT_NAME}_MODEL)

# Modeling Algorithms
IF (${PROJECT_NAME}_MODEL)
	PROCESS_MODULE( "Modeling Algorithms" "TKGeomAlgo;TKTopAlgo;TKPrim;TKBO;TKHLR;TKMesh;TKShHealing;TKXMesh;TKBool;TKFillet;TKFeat;TKOffset" )
ENDIF (${PROJECT_NAME}_MODEL)

# Visualisation
IF(${PROJECT_NAME}_VISU_DEP)
	PROCESS_MODULE( "Visualization" "" "TKService;TKV2d;TKV3d" )
ENDIF(${PROJECT_NAME}_VISU_DEP)
IF(${PROJECT_NAME}_VISUALISATION)
	PROCESS_MODULE( "Visualization" "" "TKOpenGl;TKMeshVS;TKNIS;TKVoxel" )
ENDIF(${PROJECT_NAME}_VISUALISATION)

# Application framework
IF(${PROJECT_NAME}_OCAF)
	PROCESS_MODULE( "OCAF" "TKCDF;PTKernel;TKLCAF;FWOSPlugin;TKPShape;TKBinL;TKXmlL;TKPLCAF;TKTObj;TKShapeSchema;TKStdLSchema" "TKCAF;TKBin;TKXml;TKPCAF;TKBinTObj;TKXmlTObj;TKStdSchema" )
ENDIF(${PROJECT_NAME}_OCAF)

# Data exchange
IF(${PROJECT_NAME}_DATAEXCHANGE)
	PROCESS_MODULE( "Data Exchange" "TKSTL;TKXSBase;TKSTEPBase;TKIGES;TKSTEPAttr;TKSTEP209;TKSTEP" "TKVRML;TKXCAF;TKXCAFSchema;TKXmlXCAF;TKBinXCAF;TKXDEIGES;TKXDESTEP" )
ENDIF(${PROJECT_NAME}_DATAEXCHANGE)

# Draw
IF(${PROJECT_NAME}_DRAW)
	PROCESS_MODULE( "Draw" "" "TKDraw;TKTopTest;TKViewerTest;TKXSDRAW;TKDCAF;TKXDEDRAW;TKTObjDRAW" )
ENDIF(${PROJECT_NAME}_DRAW)

# DRAWEXE application
IF(${PROJECT_NAME}_DRAW)
	PROCESS_MODULE( "Draw" "" DRAWEXE )
ENDIF(${PROJECT_NAME}_DRAW)

CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/ProjectConfig.cmake.in
	${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake @ONLY )
CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/ProjectConfigVersion.cmake.in
	${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake @ONLY )
INSTALL(FILES ${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake ${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
	DESTINATION ${${PROJECT_NAME}_INSTALL_CMAKE_DATA_DIR} COMPONENT Development )

INSTALL(EXPORT ${PROJECT_NAME}-libraries DESTINATION ${${PROJECT_NAME}_INSTALL_CMAKE_DATA_DIR} COMPONENT Development)

############
# PostBuild Step
############
# In win32, dependent libraries are required to run tests
IF(MSVC AND ${PROJECT_NAME}_TESTING)
			
		# Try to find TCL .dll filename
		IF (${PROJECT_NAME}_DRAW)
			GET_FILENAME_COMPONENT(TCL_BIN_DIR ${TCL_TCLSH} PATH)
			GET_FILENAME_COMPONENT(TCL_LIB_NAME_DIR ${TCL_LIBRARY} NAME_WE)
		ENDIF()

	    # Post-build target. In reality it is not a post-build step	, but it doesn't matter
		ADD_CUSTOM_TARGET(PostBuild ALL ${CMAKE_COMMAND} -E echo Copying dependent files DEPENDS ALL)

		IF ( CMAKE_CONFIGURATION_TYPES )

			# This loop copies the DLLs in each configuration binary dir.
			FOREACH (config ${CMAKE_CONFIGURATION_TYPES})
				ADD_CUSTOM_COMMAND(TARGET PostBuild POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory ${LIBRARY_OUTPUT_PATH}/${config}/ VERBATIM )

				IF (${PROJECT_NAME}_DRAW)
				    ADD_CUSTOM_COMMAND(TARGET PostBuild POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${TCL_BIN_DIR}/${TCL_LIB_NAME_DIR}.dll ${LIBRARY_OUTPUT_PATH}/${config}/ VERBATIM)
				ENDIF()
				
				# Switch between bin and bind dirs
				IF (${config} MATCHES "Debug")
					ADD_CUSTOM_COMMAND(TARGET PostBuild POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${OCE_BUNDLE_ROOT_PATH}/Win${BIT}/bind/ ${LIBRARY_OUTPUT_PATH}/${config}/ VERBATIM )

					# Install TBB libraries
					IF(${PROJECT_NAME}_MULTITHREAD_LIBRARY STREQUAL "TBB" AND TBB_BIN_DIR)
						ADD_CUSTOM_COMMAND(TARGET PostBuild POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${TBB_BIN_DIR}/tbb_debug.dll" ${LIBRARY_OUTPUT_PATH}/${config}/ VERBATIM)
					ENDIF(${PROJECT_NAME}_MULTITHREAD_LIBRARY STREQUAL "TBB" AND TBB_BIN_DIR)

					IF(${PROJECT_NAME}_TBB_MALLOC_SUPPORT AND TBB_BIN_DIR)
						ADD_CUSTOM_COMMAND(TARGET PostBuild POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${TBB_BIN_DIR}/tbbmalloc_debug.dll" ${LIBRARY_OUTPUT_PATH}/${config}/ VERBATIM)
					ENDIF(${PROJECT_NAME}_TBB_MALLOC_SUPPORT AND TBB_BIN_DIR)
				ELSE ()
					ADD_CUSTOM_COMMAND(TARGET PostBuild POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${OCE_BUNDLE_ROOT_PATH}/Win${BIT}/bin/ ${LIBRARY_OUTPUT_PATH}/${config}/ VERBATIM )

					# Install TBB libraries
					IF(${PROJECT_NAME}_MULTITHREAD_LIBRARY STREQUAL "TBB" AND TBB_BIN_DIR)
						ADD_CUSTOM_COMMAND(TARGET PostBuild POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${TBB_BIN_DIR}/tbb.dll" ${LIBRARY_OUTPUT_PATH}/${config}/ VERBATIM)
					ENDIF(${PROJECT_NAME}_MULTITHREAD_LIBRARY STREQUAL "TBB" AND TBB_BIN_DIR)

					IF(${PROJECT_NAME}_TBB_MALLOC_SUPPORT AND TBB_BIN_DIR)
						ADD_CUSTOM_COMMAND(TARGET PostBuild POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${TBB_BIN_DIR}/tbbmalloc.dll" ${LIBRARY_OUTPUT_PATH}/${config}/ VERBATIM)
					ENDIF(${PROJECT_NAME}_TBB_MALLOC_SUPPORT AND TBB_BIN_DIR)
				ENDIF()
			ENDFOREACH()
		ELSE (CMAKE_CONFIGURATION_TYPES )
			# Nmake support : just one configuration
				ADD_CUSTOM_COMMAND(TARGET PostBuild POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory ${LIBRARY_OUTPUT_PATH}/ VERBATIM )
				
				IF (${PROJECT_NAME}_DRAW)
					ADD_CUSTOM_COMMAND(TARGET PostBuild POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${TCL_BIN_DIR}/${TCL_LIB_NAME_DIR}.dll ${LIBRARY_OUTPUT_PATH}/ VERBATIM)
				ENDIF()

				IF (${CMAKE_BUILD_TYPE} MATCHES "Debug")
					ADD_CUSTOM_COMMAND(TARGET PostBuild POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${OCE_BUNDLE_ROOT_PATH}/Win${BIT}/bind/ ${LIBRARY_OUTPUT_PATH} VERBATIM )

					# Install TBB libraries
					IF(${PROJECT_NAME}_MULTITHREAD_LIBRARY STREQUAL "TBB" AND TBB_BIN_DIR)
						ADD_CUSTOM_COMMAND(TARGET PostBuild POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${TBB_BIN_DIR}/tbb_debug.dll" ${LIBRARY_OUTPUT_PATH}/${config}/ VERBATIM)
					ENDIF(${PROJECT_NAME}_MULTITHREAD_LIBRARY STREQUAL "TBB" AND TBB_BIN_DIR)

					IF(${PROJECT_NAME}_TBB_MALLOC_SUPPORT AND TBB_BIN_DIR)
						ADD_CUSTOM_COMMAND(TARGET PostBuild POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${TBB_BIN_DIR}/tbbmalloc_debug.dll" ${LIBRARY_OUTPUT_PATH}/${config}/ VERBATIM)
					ENDIF(${PROJECT_NAME}_TBB_MALLOC_SUPPORT AND TBB_BIN_DIR)
				ELSE ()
					ADD_CUSTOM_COMMAND(TARGET PostBuild POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${OCE_BUNDLE_ROOT_PATH}/Win${BIT}/bin/ ${LIBRARY_OUTPUT_PATH}/ VERBATIM )

					# Install TBB libraries
					IF(${PROJECT_NAME}_MULTITHREAD_LIBRARY STREQUAL "TBB" AND TBB_BIN_DIR)
						ADD_CUSTOM_COMMAND(TARGET PostBuild POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${TBB_BIN_DIR}/tbb.dll" ${LIBRARY_OUTPUT_PATH}/${config}/ VERBATIM)
					ENDIF(${PROJECT_NAME}_MULTITHREAD_LIBRARY STREQUAL "TBB" AND TBB_BIN_DIR)

					IF(${PROJECT_NAME}_TBB_MALLOC_SUPPORT AND TBB_BIN_DIR)
						ADD_CUSTOM_COMMAND(TARGET PostBuild POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${TBB_BIN_DIR}/tbbmalloc.dll" ${LIBRARY_OUTPUT_PATH}/${config}/ VERBATIM)
					ENDIF(${PROJECT_NAME}_TBB_MALLOC_SUPPORT AND TBB_BIN_DIR)
				ENDIF()
		ENDIF (CMAKE_CONFIGURATION_TYPES) 
		
ENDIF(MSVC AND ${PROJECT_NAME}_TESTING)

##############
# Bundle AUTOINSTALL
##############

IF (${PROJECT_NAME}_BUNDLE_AUTOINSTALL)
	IF (${PROJECT_NAME}_VISUALISATION)
		INSTALL(FILES ${${PROJECT_NAME}_BUNDLE_ROOT_PATH}/Win${BIT}/bind/freetyped.dll DESTINATION ${${PROJECT_NAME}_INSTALL_BIN_DIR} CONFIGURATIONS Debug)
		INSTALL(FILES ${${PROJECT_NAME}_BUNDLE_ROOT_PATH}/Win${BIT}/bin/freetype.dll DESTINATION ${${PROJECT_NAME}_INSTALL_BIN_DIR} CONFIGURATIONS Release RelWithDebInfo MinSizeRel)
		INSTALL(FILES ${${PROJECT_NAME}_BUNDLE_ROOT_PATH}/Win${BIT}/bind/FTGLd.dll DESTINATION ${${PROJECT_NAME}_INSTALL_BIN_DIR} CONFIGURATIONS Debug)
		INSTALL(FILES ${${PROJECT_NAME}_BUNDLE_ROOT_PATH}/Win${BIT}/bin/FTGL.dll DESTINATION ${${PROJECT_NAME}_INSTALL_BIN_DIR} CONFIGURATIONS Release RelWithDebInfo MinSizeRel)
	ENDIF(${PROJECT_NAME}_VISUALISATION)

	IF (${PROJECT_NAME}_VISU_DEP AND ${PROJECT_NAME}_WITH_GL2PS )
		INSTALL(FILES ${${PROJECT_NAME}_BUNDLE_ROOT_PATH}/Win${BIT}/bind/gl2psd.dll DESTINATION ${${PROJECT_NAME}_INSTALL_BIN_DIR} CONFIGURATIONS Debug)
		INSTALL(FILES ${${PROJECT_NAME}_BUNDLE_ROOT_PATH}/Win${BIT}/bin/gl2ps.dll DESTINATION ${${PROJECT_NAME}_INSTALL_BIN_DIR} CONFIGURATIONS Release RelWithDebInfo MinSizeRel)
	ENDIF(${PROJECT_NAME}_VISU_DEP AND ${PROJECT_NAME}_WITH_GL2PS)

	IF (${PROJECT_NAME}_VISU_DEP AND ${PROJECT_NAME}_WITH_FREEIMAGE)
		INSTALL(FILES ${${PROJECT_NAME}_BUNDLE_ROOT_PATH}/Win${BIT}/bind/FreeImaged.dll DESTINATION ${${PROJECT_NAME}_INSTALL_BIN_DIR} CONFIGURATIONS Debug)
		INSTALL(FILES ${${PROJECT_NAME}_BUNDLE_ROOT_PATH}/Win${BIT}/bin/FreeImage.dll DESTINATION ${${PROJECT_NAME}_INSTALL_BIN_DIR} CONFIGURATIONS Release RelWithDebInfo MinSizeRel)
	ENDIF(${PROJECT_NAME}_VISU_DEP AND ${PROJECT_NAME}_WITH_FREEIMAGE)

	# Install TCL
	IF (${PROJECT_NAME}_DRAW)
		GET_FILENAME_COMPONENT(TCL_BIN_DIR ${TCL_TCLSH} PATH)
		GET_FILENAME_COMPONENT(TCL_LIB_NAME_DIR ${TCL_LIBRARY} NAME_WE)
		INSTALL(FILES ${TCL_BIN_DIR}/${TCL_LIB_NAME_DIR}.dll DESTINATION ${${PROJECT_NAME}_INSTALL_BIN_DIR} CONFIGURATIONS Debug )
		INSTALL(FILES ${TCL_BIN_DIR}/${TCL_LIB_NAME_DIR}.dll DESTINATION ${${PROJECT_NAME}_INSTALL_BIN_DIR} CONFIGURATIONS Release RelWithDebInfo MinSizeRel )
	ENDIF(${PROJECT_NAME}_DRAW)	

	# Install TBB libraries
	IF(${PROJECT_NAME}_MULTITHREAD_LIBRARY STREQUAL "TBB" AND TBB_BIN_DIR)
		INSTALL(FILES "${TBB_BIN_DIR}/tbb.dll" DESTINATION ${${PROJECT_NAME}_INSTALL_BIN_DIR} CONFIGURATIONS Release RelWithDebInfo MinSizeRel)
		INSTALL(FILES "${TBB_BIN_DIR}/tbb_debug.dll" DESTINATION ${${PROJECT_NAME}_INSTALL_BIN_DIR} CONFIGURATIONS Debug)
	ENDIF(${PROJECT_NAME}_MULTITHREAD_LIBRARY STREQUAL "TBB" AND TBB_BIN_DIR)

	IF(${PROJECT_NAME}_TBB_MALLOC_SUPPORT AND TBB_BIN_DIR)
		INSTALL(FILES "${TBB_BIN_DIR}/tbbmalloc.dll" DESTINATION ${${PROJECT_NAME}_INSTALL_BIN_DIR} CONFIGURATIONS Release RelWithDebInfo MinSizeRel)
		INSTALL(FILES "${TBB_BIN_DIR}/tbbmalloc_debug.dll" DESTINATION ${${PROJECT_NAME}_INSTALL_BIN_DIR} CONFIGURATIONS Debug)
	ENDIF(${PROJECT_NAME}_TBB_MALLOC_SUPPORT AND TBB_BIN_DIR)
ENDIF(${PROJECT_NAME}_BUNDLE_AUTOINSTALL)


###############
# UnitTesting #
###############
IF(${PROJECT_NAME}_TESTING)
	SET( ${PROJECT_NAME}_EXTRA_WARNINGS ON CACHE BOOL "Extra warnings required by testing framework" FORCE)
	INCLUDE(CTest)
	ENABLE_TESTING()
	SUBDIRS(test)
ENDIF(${PROJECT_NAME}_TESTING)
IF(${PROJECT_NAME}_COVERAGE)
	SET(${PROJECT_NAME}_TESTING ON CACHE BOOL "Testing enabled by coverage option" FORCE)
	# build static libs, better coverage report
	SET( ${PROJECT_NAME}_BUILD_SHARED_LIB OFF CACHE BOOL "Build static libs" FORCE )
	SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -fprofile-arcs -ftest-coverage" CACHE STRING "Extra compile flags required by code coverage" FORCE)
	SET(CMAKE_C_FLAGS_DEBUG "-O0 -g -fprofile-arcs -ftest-coverage" CACHE STRING "Extra compile flags required by code coverage" FORCE)
	SET(CMAKE_MODULE_LINKER_FLAGS_DEBUG "-fprofile-arcs -ftest-coverage" CACHE STRING "Extra linker flags required by code coverage" FORCE)
	SET(${PROJECT_NAME}_BUILD_TYPE "Debug" CACHE STRING "Build type required by testing framework" FORCE)
ENDIF(${PROJECT_NAME}_COVERAGE)

###############################################################################
# OCE Packaging                                                               #
# $make package                                                               #
###############################################################################

SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "OpenCASCADE Community Edition")
SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.txt")
SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.txt")
SET(CPACK_SET_DESTDIR "ON")

SET(CPACK_PACKAGE_VERSION_MAJOR ${OCE_VERSION_MAJOR})
SET(CPACK_PACKAGE_VERSION_MINOR ${OCE_VERSION_MINOR})
SET(CPACK_PACKAGE_VERSION_PATCH ${OCE_VERSION_PATCH})
SET(CPACK_PACKAGE_NAME ${PROJECT_NAME} )

SET(CPACK_PACKAGE_CONTACT "OCE Developers <oce-dev@googlegroups.com>")

###############################################################################
# Debian-specific CPack variables. Intended for quick-n-dirty dev packages,   #
# not to replace the official (and superior) debian tools.                    #
# to enable, run cmake with -DCPACK_GENERATOR="DEB", or uncomment             #
#set(CPACK_GENERATOR "DEB")                                                   #
###############################################################################
if( CPACK_GENERATOR MATCHES ".*DEB.*" )
	if( ${CMAKE_VERSION} STREQUAL "2.8.2" )
		# bug http://vtk.org/Bug/view.php?id=11020
		message( WARNING "CMake/CPack version 2.8.2 will not create working .deb packages!")
	endif()
	set(CPACK_DEBIAN_PACKAGE_SECTION "science")
	# debian source packages aren't yet supported by cmake, but the following list will help anyone who is trying to figure out what to apt-get install before building.
	set(CPACK_DEBIAN_PACKAGE_BUILDS_DEPENDS "debhelper (>= 6.0.7~), quilt, cmake (>= 2.8), libtool,
		libx11-dev, libxmu-dev, libxext-dev, tcl8.5-dev, tk8.5-dev,
		libgl1-mesa-dev | libgl-dev, libglu1-mesa-dev | libglu-dev,
		libftgl-dev, libgl2ps-dev")
	set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.3), libfreetype6 (>= 2.2.1), libftgl2 (>= 2.1.3~rc5),
		libgcc1 (>= 1:4.1.1), libgl1-mesa-glx, libgl2ps0, libglu1-mesa,
		libgomp1 (>= 4.2.1), libstdc++6 (>= 4.4.0), libx11-6, libxext6,
		libxmu6, libxt6, tcl8.5 (>= 8.5.0), tk8.5 (>= 8.5.0)")
	set(CPACK_DEBIAN_PACKAGE_SUGGESTS "opencascade-doc")
	set(CPACK_DEBIAN_PACKAGE_PROVIDES "libopencascade-foundation-6.5.0, libopencascade-modeling-6.5.0,
		libopencascade-visualization-6.5.0, libopencascade-ocaf-lite-6.5.0,
		libopencascade-ocaf-6.5.0, opencascade-draw")
	if( BIT EQUAL 64 )
		set( CPACK_DEBIAN_PACKAGE_ARCHITECTURE "amd64" )
	else()
		set( CPACK_DEBIAN_PACKAGE_ARCHITECTURE "i386" )
	endif()
	string( TOLOWER "${CPACK_PACKAGE_NAME}-${OCE_VERSION}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}" CPACK_PACKAGE_FILE_NAME )
endif()

###############################################################################
# RPM-specific CPack variables.                                               #
# to enable, run cmake with -DCPACK_GENERATOR="RPM", or uncomment             #
#set(CPACK_GENERATOR "RPM")                                                   #
# For RPM, package names and versions are guesses and may need changed.       #
#                                                                             #
# As of cmake 2.8.4, RPM requires use of a variable that is also used for     #
# DEB,so simultaneously building multiple package types (i.e.                 #
# -DCPACK_GENERATOR="DEB;RPM") doesn't work well. The RPM won't end up in the #
# correct directory, and packages specified after RPM won't be built.         #
###############################################################################
if( CPACK_GENERATOR MATCHES ".*RPM.*" )
	set( CPACK_RPM_PACKAGE_REQUIRES "libc6 >= 2.3, libfreetype6 >= 2.2.1, libftgl2 >= 2.1.3, libgcc1 >= 4.1.1, libgl1-mesa-glx, libgl2ps0, libglu1-mesa, libgomp1 >= 4.2.1, libstdc++6 >= 4.4.0, libx11-6, libxext6, libxmu6, libxt6, tcl8.5 >= 8.5.0, tk8.5 >= 8.5.0")
	set( CPACK_RPM_PACKAGE_PROVIDES "libopencascade-foundation-6.5.0, libopencascade-modeling-6.5.0, libopencascade-visualization-6.5.0, libopencascade-ocaf-lite-6.5.0, libopencascade-ocaf-6.5.0, opencascade-draw" )
	set( CPACK_PACKAGE_RELOCATABLE "FALSE" )
	if( BIT EQUAL 64 )
		set( CPACK_RPM_PACKAGE_ARCHITECTURE "x86_64" )
	else()
		set( CPACK_RPM_PACKAGE_ARCHITECTURE "i586" )
	endif()
	#CPackRPM ignores CPACK_RPM_FILE_NAME. Must set two other vars instead, and they interfere
	string( TOLOWER "${CPACK_PACKAGE_NAME}-${OCE_VERSION}_${CPACK_RPM_PACKAGE_ARCHITECTURE}.rpm" CPACK_OUTPUT_FILE_NAME )
	if( NOT CPACK_GENERATOR STREQUAL "RPM" )
		message( WARNING "Generating an RPM with other package type(s). Due to a bug in CPackRPM, the package will not get copied to the current directory. It will be found in _CPack_Packages/Linux/RPM, and other packages may fail to build." )
	else()
		#this variable is used by other packagers, don't set it unless RPM is built by itself.
		set( CPACK_PACKAGE_FILE_NAME ${CPACK_OUTPUT_FILE_NAME} )
	endif()
endif()

INCLUDE(CPack)

########################################################################################
# Uninstall code                                                                       #
# From http://www.cmake.org/Wiki/CMake_FAQ#Can_I_do_.22make_uninstall.22_with_CMake.3F #
# ######################################################################################
configure_file(
    "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
    "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
    IMMEDIATE @ONLY)

add_custom_target(uninstall
    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
