cmake_minimum_required (VERSION 2.6)
project (IfcOpenShell)

FIND_PACKAGE(Boost REQUIRED COMPONENTS program_options)
MESSAGE(STATUS "Boost include files found in ${Boost_INCLUDE_DIRS}")
MESSAGE(STATUS "Boost libraries found in ${Boost_LIBRARY_DIRS}")

# Find Open CASCADE header files
IF("$ENV{OCC_INCLUDE_DIR}" STREQUAL "") 
	SET(OCC_INCLUDE_DIR "/usr/include/opencascade/" CACHE FILEPATH "Open CASCADE header files")
	MESSAGE(STATUS "Looking for opencascade include files in: ${OCC_INCLUDE_DIR}")
	MESSAGE(STATUS "Use OCC_INCLUDE_DIR to specify another directory")
ELSE()
	SET(OCC_INCLUDE_DIR $ENV{OCC_INCLUDE_DIR} CACHE FILEPATH "Open CASCADE header files")
	MESSAGE(STATUS "Looking for opencascade include files in: ${OCC_INCLUDE_DIR}")
ENDIF()

FIND_FILE(gp_Pnt_hxx "gp_Pnt.hxx" ${OCC_INCLUDE_DIR} /usr/inc /usr/local/inc /usr/local/include/oce)
IF(gp_Pnt_hxx)
	MESSAGE(STATUS "Header files found")
ELSE()
	MESSAGE(FATAL_ERROR "Unable to find header files, aborting")
ENDIF()

# Find Open CASCADE library files
IF("$ENV{OCC_LIBRARY_DIR}" STREQUAL "") 
	SET(OCC_LIBRARY_DIR "/usr/lib/" CACHE FILEPATH "Open CASCADE library files")
	MESSAGE(STATUS "Looking for opencascade library files in: ${OCC_LIBRARY_DIR}")
	MESSAGE(STATUS "Use OCC_LIBRARY_DIR to specify another directory")
ELSE()
	SET(OCC_LIBRARY_DIR $ENV{OCC_LIBRARY_DIR} CACHE FILEPATH "Open CASCADE library files")
	MESSAGE(STATUS "Looking for opencascade library files in: ${OCC_LIBRARY_DIR}")
ENDIF()

FIND_LIBRARY(libTKernel "TKernel" ${OCC_LIBRARY_DIR} /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64)
IF(libTKernel)
	MESSAGE(STATUS "Library files found")
ELSE()
	MESSAGE(FATAL_ERROR "Unable to find library files, aborting")
ENDIF()

IF("$ENV{ICU_INCLUDE_DIR}" STREQUAL "")
    MESSAGE(STATUS "No ICU include directory specified")
ElSE()
    SET(ICU_INCLUDE_DIR CACHE FILEPATH "ICU header files")
ENDIF()

IF("$ENV{ICU_LIBRARY_DIR}" STREQUAL "")
    MESSAGE(STATUS "No ICU library directory specified")
ElSE()
    SET(ICU_LIBRARY_DIR CACHE FILEPATH "ICU library files")
ENDIF()

FIND_LIBRARY(icu "icuuc" /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64 ${ICU_LIBRARY_DIR})

IF(icu)
    MESSAGE(STATUS "ICU libraries found")
    ADD_DEFINITIONS(-DHAVE_ICU)
ELSE()
    MESSAGE(STATUS "Unable to find ICU library files, continuing")	
ENDIF()

IF("$ENV{OPENCOLLADA_INCLUDE_DIR}" STREQUAL "")
    MESSAGE(STATUS "No OpenCOLLADA include directory specified")
    SET(OPENCOLLADA_INCLUDE_DIR "/usr/local/include/opencollada" CACHE FILEPATH "OpenCOLLADA header files")
ElSE()
    SET(OPENCOLLADA_INCLUDE_DIR "$ENV{OPENCOLLADA_INCLUDE_DIR}" CACHE FILEPATH "OpenCOLLADA header files")
ENDIF()

IF("$ENV{OPENCOLLADA_LIBRARY_DIR}" STREQUAL "")
    MESSAGE(STATUS "No OpenCOLLADA library directory specified")
    SET(OPENCOLLADA_LIBRARY_DIR "/usr/local/lib/opencollada" CACHE FILEPATH "OpenCOLLADA library files")
ElSE()
    SET(OPENCOLLADA_LIBRARY_DIR "$ENV{OPENCOLLADA_LIBRARY_DIR}" CACHE FILEPATH "OpenCOLLADA library files")
ENDIF()

SET(OPENCOLLADA_INCLUDE_DIRS "${OPENCOLLADA_INCLUDE_DIR}/COLLADABaseUtils" "${OPENCOLLADA_INCLUDE_DIR}/COLLADAStreamWriter")

FIND_FILE(COLLADASWStreamWriter_h "COLLADASWStreamWriter.h" ${OPENCOLLADA_INCLUDE_DIRS})
IF(COLLADASWStreamWriter_h)
    MESSAGE(STATUS "OpenCOLLADA header files found")
    ADD_DEFINITIONS(-DWITH_OPENCOLLADA)
    SET(OPENCOLLADA_LIBRARIES 
        GeneratedSaxParser MathMLSolver OpenCOLLADABaseUtils
        OpenCOLLADAFramework OpenCOLLADASaxFrameworkLoader
        OpenCOLLADAStreamWriter UTF buffer ftoa pcre
    )
ELSE()
    MESSAGE(STATUS "OpenCOLLADA header files not found, continuing without COLLADA support")
ENDIF()

INCLUDE(CheckIncludeFileCXX)

MACRO(CHECK_ADD_OCE_OCC_DEF INCLUDE)
	STRING(REPLACE . _ STR ${INCLUDE})
	STRING(TOUPPER ${STR} STR)
	CHECK_INCLUDE_FILE_CXX("${INCLUDE}" FOUND_${STR})
	IF(FOUND_${STR})
		ADD_DEFINITIONS(-DOCE_HAVE_${STR})
		ADD_DEFINITIONS(-DHAVE_${STR})
	ENDIF(FOUND_${STR})
ENDMACRO(CHECK_ADD_OCE_OCC_DEF)

CHECK_ADD_OCE_OCC_DEF(limits)
CHECK_ADD_OCE_OCC_DEF(climits)
CHECK_ADD_OCE_OCC_DEF(limits.h)  
CHECK_ADD_OCE_OCC_DEF(fstream)
CHECK_ADD_OCE_OCC_DEF(fstream.h)
CHECK_ADD_OCE_OCC_DEF(iomanip)
CHECK_ADD_OCE_OCC_DEF(iomanip.h)
CHECK_ADD_OCE_OCC_DEF(iostream)  
CHECK_ADD_OCE_OCC_DEF(iostream.h)

IF(NOT CMAKE_BUILD_TYPE)
 	SET(CMAKE_BUILD_TYPE "Release")
ENDIF(NOT CMAKE_BUILD_TYPE)

IF(MSVC)
    ADD_DEFINITIONS(-D_UNICODE)
ElSE(MSVC)
    ADD_DEFINITIONS(-fPIC -Wno-non-virtual-dtor)
ENDIF(MSVC)

INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} ${OCC_INCLUDE_DIR} ${OPENCOLLADA_INCLUDE_DIRS} /usr/inc /usr/local/inc /usr/local/include/oce ${ICU_INCLUDE_DIR} ${Boost_INCLUDE_DIRS})

ADD_LIBRARY(IfcParse STATIC 
  ../src/ifcparse/Ifc2x3.cpp
  ../src/ifcparse/Ifc4.cpp
  ../src/ifcparse/IfcUtil.cpp
  ../src/ifcparse/IfcParse.cpp
  ../src/ifcparse/IfcCharacterDecoder.cpp
  
  ../src/ifcparse/IfcWrite.cpp
  ../src/ifcparse/IfcGuidHelper.cpp
  
  ../src/ifcparse/IfcHierarchyHelper.cpp
  
  ../src/ifcparse/Ifc2x3-rt.cpp
  ../src/ifcparse/Ifc4-rt.cpp
  ../src/ifcparse/IfcUntypedEntity.cpp
)

ADD_LIBRARY(IfcGeom STATIC
  ../src/ifcgeom/IfcGeomCurves.cpp
  ../src/ifcgeom/IfcGeomFaces.cpp
  ../src/ifcgeom/IfcGeomFunctions.cpp
  ../src/ifcgeom/IfcGeomHelpers.cpp
  ../src/ifcgeom/IfcGeomObjects.cpp
  ../src/ifcgeom/IfcGeomRenderStyles.cpp
  ../src/ifcgeom/IfcGeomShapes.cpp
  ../src/ifcgeom/IfcGeomWires.cpp
  ../src/ifcgeom/IfcRegister.cpp
)

IF(icu)
    TARGET_LINK_LIBRARIES(IfcParse icuuc)
ENDIF()

TARGET_LINK_LIBRARIES(IfcGeom IfcParse)

LINK_DIRECTORIES (${LINK_DIRECTORIES} ${IfcOpenShell_BINARY_DIR} ${OCC_LIBRARY_DIR} ${OPENCOLLADA_LIBRARY_DIR} /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64 ${ICU_LIBRARY_DIR} ${Boost_LIBRARY_DIRS}) 

ADD_EXECUTABLE(IfcConvert 
    ../src/ifcconvert/ColladaSerializer.cpp
    ../src/ifcconvert/IfcConvert.cpp
    ../src/ifcconvert/OpenCascadeBasedSerializer.cpp
    ../src/ifcconvert/WavefrontObjSerializer.cpp   
)

TARGET_LINK_LIBRARIES (IfcConvert IfcParse IfcGeom TKernel TKMath TKBRep TKGeomBase TKGeomAlgo TKG3d TKG2d TKShHealing TKTopAlgo TKMesh TKPrim TKBool TKBO TKFillet TKSTEP TKSTEPBase TKSTEPAttr TKXSBase TKSTEP209 TKIGES TKOffset ${Boost_LIBRARIES} ${OPENCOLLADA_LIBRARIES})

ADD_EXECUTABLE(IfcGeomServer
    ../src/ifcgeomserver/IfcGeomServer.cpp
)

TARGET_LINK_LIBRARIES (IfcGeomServer IfcParse IfcGeom TKernel TKMath TKBRep TKGeomBase TKGeomAlgo TKG3d TKG2d TKShHealing TKTopAlgo TKMesh TKPrim TKBool TKBO TKFillet TKSTEP TKSTEPBase TKSTEPAttr TKXSBase TKSTEP209 TKIGES TKOffset)

# Build python wrapper using separate CMakeLists.txt
ADD_SUBDIRECTORY(../src/ifcwrap ifcwrap)

# Build IfcParseExamples using separate CMakeLists.txt
ADD_SUBDIRECTORY(../src/examples examples)

# ADD_SUBDIRECTORY(../src/qtviewer qtviewer)

# CMake installation targets
SET(include_files_geom
    ../src/ifcgeom/IfcGeom.h
    ../src/ifcgeom/IfcGeomObjects.h
    ../src/ifcgeom/IfcGeomRenderStyles.h
    ../src/ifcgeom/IfcRegister.h
    ../src/ifcgeom/IfcRegisterConvertCurve.h
    ../src/ifcgeom/IfcRegisterConvertFace.h
    ../src/ifcgeom/IfcRegisterConvertShape.h
    ../src/ifcgeom/IfcRegisterConvertShapes.h
    ../src/ifcgeom/IfcRegisterConvertWire.h
    ../src/ifcgeom/IfcRegisterCreateCache.h
    ../src/ifcgeom/IfcRegisterDef.h
    ../src/ifcgeom/IfcRegisterGeomHeader.h
    ../src/ifcgeom/IfcRegisterIsShapeCollection.h
    ../src/ifcgeom/IfcRegisterPurgeCache.h
    ../src/ifcgeom/IfcRegisterUndef.h
    ../src/ifcgeom/IfcGeomRenderStyles.h
    ../src/ifcgeom/IfcRepresentationShapeItem.h
)
SET(include_files_parse
    ../src/ifcparse/Ifc2x3.h
    ../src/ifcparse/Ifc2x3enum.h
    ../src/ifcparse/Ifc4.h
    ../src/ifcparse/Ifc4enum.h
    ../src/ifcparse/IfcCharacterDecoder.h
    ../src/ifcparse/IfcException.h
    ../src/ifcparse/IfcFile.h
    ../src/ifcparse/IfcHierarchyHelper.h
    ../src/ifcparse/IfcParse.h
    ../src/ifcparse/IfcUtil.h
    ../src/ifcparse/SharedPointer.h
    
    ../src/ifcparse/IfcWrite.h
    ../src/ifcparse/IfcWritableEntity.h

    ../src/ifcparse/Ifc2x3-rt.h
    ../src/ifcparse/Ifc4-rt.h
    ../src/ifcparse/IfcUntypedEntity.h
    ../src/ifcparse/IfcEntityDescriptor.h
)
INSTALL(FILES ${include_files_geom} DESTINATION include/ifcgeom)
INSTALL(FILES ${include_files_parse} DESTINATION include/ifcparse)
INSTALL(TARGETS IfcConvert DESTINATION bin)
INSTALL(TARGETS IfcParse IfcGeom DESTINATION lib)
