# *** Configuration files
Configure_File(Version.hpp.cmake Version.hpp)
Configure_File(Config.hpp.cmake Config.hpp)

# Default process Makefile
# We have to extract include paths and defines from our required Qt5 modules
Set(QT_INCLUDE)
Set(QT_DEFINES)
Set(QT_LIBS)
ForEach(QtModule Qt5Core Qt5Gui Qt5OpenGL Qt5Widgets Qt5Xml Qt5PrintSupport)
  List(APPEND QT_INCLUDE ${${QtModule}_INCLUDE_DIRS})
  List(APPEND QT_DEFINES ${${QtModule}_DEFINITIONS})
  List(APPEND QT_LIBS "-l${QtModule}")
EndForEach(QtModule)
List(REMOVE_DUPLICATES QT_INCLUDE)
List(REMOVE_DUPLICATES QT_DEFINES)
String(REPLACE ";" " -I" QT_INCLUDE "-I${QT_INCLUDE}")
String(REPLACE ";" " " QT_DEFINES "${QT_DEFINES}")
String(REPLACE ";" " " QT_LIBS "${QT_LIBS}")
Include_Directories(${CImg_DIR})

# Add the process Makefile for our Unix users
If(UNIX)
  Configure_File(${CMAKE_CURRENT_SOURCE_DIR}/MGXProcess.mk.linux.cmake
                 ${CMAKE_CURRENT_BINARY_DIR}/MGXProcess.mk)
  Install(FILES ${CMAKE_CURRENT_BINARY_DIR}/MGXProcess.mk
          DESTINATION ${MGX_RESOURCES_DIR}
	  COMPONENT MGXCore)
EndIf(UNIX)

# Due to a bug in CMake not fixed until v3.1
# (https://cmake.org/Bug/view.php?id=14981)
# we cannot rely on autouic and have to
# list the .ui files for special processing:
Qt5_Wrap_UI( MorphoGraphX_UIS_H
  EditParms.ui ImportMesh.ui LoadStack.ui
  TaskEditor.ui ColorEditDlg.ui ExportMesh.ui ImportStack.ui
  ManageAttrDlg.ui TransferFunctionDlg.ui ColorEditorDlg.ui
  ExportStack.ui LabelEditorDlg.ui PathEditorDlg.ui
  DebugDlg.ui GUI.ui LoadHeatMap.ui ProcessDocs.ui EditMarkersDlg.ui ParentAttrDlg.ui
  HeatMap.ui LoadMesh.ui SaveMesh.ui HeatMapNew.ui HeatMapManipulate.ui )

# *** Target mgx
Set(MorphoGraphX_SO_SRCS
  Attributes.cpp
  Function.cpp
  GraphUtils.cpp
  GraphAlgorithms.cpp
  Contour.cpp
  Bezier.cpp
  OMPGuard.cpp
  Quaternion.cpp
  ProcessParms.cpp
  Process.cpp
  Progress.cpp
  Vertex.cpp
  CellTissue.cpp
  MGXSubdivide.cpp
  TransferFunction.cpp
  Information.cpp
  Clip.cpp
  ClipRegion.cpp
  Color.cpp
  ImageData.cpp
  QTransferFunctionViewer.cpp
  TransferFunctionDlg.cpp
  EditMarkersDlg.cpp
  ProcessDocsDlg.cpp
  ProcessUtils.cpp
  TransferMarkers.cpp
  Colors.cpp
  ColorMap.cpp
  Shader.cpp
  Parms.cpp
  ScaleBar.cpp
  CutSurf.cpp
  ColorBar.cpp
  Misc.cpp
  Dir.cpp
  Polygonizer.cpp
  Mesh.cpp
  Store.cpp
  Stack.cpp
  Mangling.cpp
  SystemProcess.cpp
  SystemProcessLoadVTK.cpp
  SystemProcessLoad.cpp
  SystemProcessSave.cpp
  FileListWidget.cpp
  ProcessThread.cpp
  Image.cpp
  CuttingSurface.cpp
  PlyFile.cpp
  Random.cpp
  Assert.cpp
  Function.cpp
  PCA.cpp
  Triangulate.cpp
  ColorEditDlg.cpp
  ThirdParty/triangle.cpp
  )
Set(MorphoGraphX_SO_HEADERS
  Attributes.hpp
  Triangle.hpp
  Function.hpp
  Contour.hpp
  Bezier.hpp
  Curvature.hpp
  DistMatrix.hpp
  DistMatrixProto.hpp
  DistObject.hpp
  DistObjectProto.hpp
  GraphUtils.hpp
  ProcessUtils.hpp
  KrylovMethods.hpp
  OMPGuard.hpp
  Vertex.hpp
  TransferFunction.hpp
  Information.hpp
  Color.hpp
  Geometry.hpp
  GraphAlgorithms.hpp
  Util.hpp
  Mesh.hpp
  Shader.hpp
  Parms.hpp
  ScaleBar.hpp
  ColorBar.hpp
  ColorEditDlg.hpp
  Misc.hpp
  Dir.hpp
  Polygonizer.hpp
  Vector.hpp
  Quaternion.hpp
  Matrix.hpp
  Hash.hpp
  VVGraph.hpp
  Edge.hpp
  VertexData.hpp
  EdgeData.hpp
  CellData.hpp
  WallData.hpp
  CellTissue.hpp
  Subdivide.hpp
  MGXSubdivide.hpp
  UnorderedMap.hpp
  UnorderedSet.hpp
  Tie.hpp
  Types.hpp
  MemberIterator.hpp
  Mangling.hpp
  Insert.hpp
  Forall.hpp
  Features.hpp
  Clamp.hpp
  CircIterator.hpp
  StaticAssert.hpp
  Assert.hpp
  Image.hpp
  GL.hpp
  SystemProcess.hpp
  Random.hpp
  SetVector.hpp
  SymmetricTensor.hpp
  PCA.hpp
  Triangulate.hpp
  Common.hpp
  ThirdParty/triangle.h
  Progress.hpp
  ProcessParms.hpp
  Process.hpp
  MGXCamera.hpp
  Clip.hpp
  ClipRegion.hpp
  ImageData.hpp
  VisFlags.hpp
  QTransferFunctionViewer.hpp
# FIXME: these headers can't be public - they include private UI headers. To work around, those would have to be public as well.
#  TransferFunctionDlg.hpp
#  EditMarkersDlg.hpp
  TransferMarkers.hpp
  ProcessDocsDlg.hpp
  Colors.hpp
  ColorMap.hpp
  CutSurf.hpp
  SystemProcessLoad.hpp
  SystemProcessSave.hpp
  FileListWidget.hpp
  ProcessThread.hpp
  Store.hpp
  Stack.hpp
  CuttingSurface.hpp
  BoundingBox.hpp
  PlyFile.hpp
  ThrustTypes.hpp
  Thrust.hpp
  ${CMAKE_CURRENT_BINARY_DIR}/Config.hpp
  ${CMAKE_CURRENT_BINARY_DIR}/Version.hpp
  )
Set(MorphoGraphX_CUDA_SRCS
  cuda/Cuda.cu
  cuda/ImageCuda.cu
  cuda/DistObject.cu
  cuda/DistMatrix.cu
  cuda/CachedAlloc.cpp
  )
Set(CUDA_HEADERS
  cuda/Cuda.hpp
  cuda/CudaExport.hpp
  cuda/CudaGlobal.hpp
  cuda/ImageCuda.hpp
  cuda/DistObjectCuda.hpp
  cuda/DistMatrixCuda.hpp
  cuda/CachedAlloc.hpp
  )

Include_Directories(${MGX_SOURCE_PATH} ${MGX_BINARY_PATH} cuda)
If("${THRUST_DEVICE_SYSTEM}" STREQUAL "CUDA")
  Include_Directories(${CUDA_TOOLKIT_INCLUDE})
  CUDA_Add_Library(mgx SHARED ${MorphoGraphX_CUDA_SRCS} ${MorphoGraphX_SO_SRCS} ${MorphoGraphX_UIS_H})
  message(STATUS "CUDA_VERSION" ${CUDA_VERSION})
  # inspired by CMake commit 5717121e
  if(NOT CUDA_VERSION VERSION_LESS "5.0")
    cuda_find_library_local_first(CUDA_cudadevrt_LIBRARY cudadevrt "\"cudadevrt\" library")
  endif()
  Target_Link_Libraries(mgx ${CUDA_LIBRARIES})
Else()
  Fake_CUDA(MorphoGraphX_CUDA_CXX ${MorphoGraphX_CUDA_SRCS})
  Add_Library(mgx SHARED ${MorphoGraphX_CUDA_CXX} ${MorphoGraphX_SO_SRCS} ${MorphoGraphX_UIS_H} )
  Target_Compile_Options(mgx PRIVATE ${CUDA_OPTIONS})
EndIf()
Add_Dependencies(mgx MGXViewer)
#message(STATUS "HDF5 libs: ${HDF5_LIBRARIES}" )
Include_Directories(SYSTEM ${MGXViewer_SOURCE_PATH})
Target_Link_Libraries(mgx
  MGXViewer
  Qt5::Widgets Qt5::PrintSupport
	${GSL_LIBRARIES} ${TIFF_LIBRARIES} ${TBB_LIBRARIES})
Message(STATUS "Addon libs:"  ${ADDON_LIBS})
If(WIN32)
  Install(TARGETS mgx
          RUNTIME DESTINATION bin COMPONENT MGXCore
	  LIBRARY DESTINATION lib COMPONENT MGXCore)
Else()
  Set_Property(TARGET mgx PROPERTY
    PUBLIC_HEADER ${MorphoGraphX_SO_HEADERS})
  Install(TARGETS mgx
          RUNTIME DESTINATION bin COMPONENT MGXCore
          LIBRARY DESTINATION lib COMPONENT MGXCore
          ARCHIVE DESTINATION lib COMPONENT MGXCore
          PUBLIC_HEADER DESTINATION "include/MorphoGraphX" COMPONENT MGXCore)
  Install(FILES ${CUDA_HEADERS}
          DESTINATION "include/MorphoGraphX/cuda" COMPONENT MGXCore)
EndIf()

# *** Target MorphoGraphX
Set(MorphoGraphX_SRCS
  Main.cpp
  MorphoGraphX.cpp
  About.cpp
  MorphoViewer.cpp
  ColorEditorDlg.cpp
  LabelEditorDlg.cpp
  ProcessParmsModel.cpp
  TaskEditDlg.cpp
  TasksView.cpp
  ResetableSlider.cpp
  DebugDlg.cpp
  Library.cpp
  PathEditorDlg.cpp
  CameraPath.cpp
  )
Set(MorphoGraphX_QRCS
  Icons.qrc
  Shaders.qrc
  )
If(WIN32)
  # Add Windows resource file
  Add_Executable(MorphoGraphX
    ${MorphoGraphX_SRCS} ${MorphoGraphX_QRCS} WinRes.rc)
Else()
  Add_Executable(MorphoGraphX ${MorphoGraphX_SRCS} ${MorphoGraphX_QRCS})
EndIf()
Add_Dependencies(MorphoGraphX mgx MGXViewer)
Target_Link_Libraries(MorphoGraphX
  mgx MGXViewer ${CMAKE_DL_LIBS} Qt5::Widgets
  ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY}
  ${CUDA_cudadevrt_LIBRARY}
  )
Install(TARGETS MorphoGraphX DESTINATION bin COMPONENT MGXCore)
If(WIN32)
  Install(PROGRAMS mgx.bat DESTINATION bin COMPONENT MGXCore)
Else()
  Install(PROGRAMS mgx DESTINATION bin COMPONENT MGXCore)
EndIf()

# *** Basic system process plugins
Set(MorphoGraphX_SYSTEM_PLUGIN
  GlobalProcess.cpp
  StackProcess.cpp
  StackProcessFilters.cpp
  StackProcessLabels.cpp
  StackProcessMorphology.cpp
  StackProcessAnalyses.cpp
  StackProcessMerge.cpp
  MeshProcessCellAnalysis3D.cpp
  MeshProcessCreation.cpp
  MeshProcessMulti.cpp
  MeshProcessStructure.cpp
  MeshProcessSignal.cpp
  MeshProcessSegmentation.cpp
  MeshProcessHeatMap.cpp
  MeshProcessMeasures.cpp
  MeshProcessMeasures3D.cpp
  MeshProcessAttributes.cpp
  MeshProcessLineage.cpp
  MeshProcessCellMesh.cpp
  MeshProcessImport.cpp
  MeshProcessExport.cpp
  MeshProcessSelection.cpp
  MeshProcessCellAxis.cpp
  MeshProcessPDG.cpp
  MeshProcessFibril.cpp
  MeshProcessCurv.cpp
  MeshProcessSignalOrientation.cpp
  MeshProcessTriangleData.cpp
  MeshBuilder.cpp
  PCAnalysis.cpp
  AutoTrim.cpp
   
  BezierProcess.cpp
  MiscProcessAnimate.cpp
  # Solver.cpp
  # Surface.cpp
  # PolarSurface.cpp
  # BezierSurface.cpp
  # HejnowiczSurface.cpp
  # DynamXProcessCellDivide.cpp
  # DynamXProcessMorphogens.cpp
  # DynamXProcessUniformGrowth.cpp
  # DynamXProcessPolarSurface.cpp
  # DynamXProcessBezierSurface.cpp
  # DynamXProcessHejnowicz.cpp
  # DynamXProcessColorMap.cpp
  )
Set(MorphoGraphX_SYSTEM_PLUGIN_HEADERS
   GlobalProcess.hpp
   StackProcess.hpp
   StackProcessFilters.hpp
   StackProcessLabels.hpp
   StackProcessMorphology.hpp
   StackProcessAnalyses.hpp
   StackProcessMerge.hpp
   MeshProcessCellAnalysis3D.hpp
   MeshProcessCreation.hpp
   MeshProcessMulti.hpp
   MeshProcessStructure.hpp
   MeshProcessSignal.hpp
   MeshProcessSegmentation.hpp
   MeshProcessHeatMap.hpp
   MeshProcessMeasures.hpp
   MeshProcessMeasures3D.hpp
# # FIXME: public header containing private UI includes
   MeshProcessAttributes.hpp
   MeshProcessLineage.hpp
   MeshProcessCellMesh.hpp
   MeshProcessImport.hpp
   MeshProcessExport.hpp
   MeshProcessSelection.hpp
   MeshProcessCellAxis.hpp
   MeshProcessPDG.hpp
   MeshProcessFibril.hpp
   MeshProcessCurv.hpp
   MeshProcessSignalOrientation.hpp
   MeshProcessTriangleData.hpp
   MeshBuilder.hpp
   PCAnalysis.hpp
   Eigenvalues.hpp
   AutoTrim.hpp
   
#   Solver.hpp

   BezierProcess.hpp
   MiscProcessAnimate.hpp
#   Surface.hpp
#   PolarSurface.hpp
#   BezierSurface.hpp
#   HejnowiczSurface.hpp
#   DynamXProcessCellDivide.hpp
#   DynamXProcessCellTissue.hpp
#   DynamXProcessMorphogens.hpp
#   DynamXProcessUniformGrowth.hpp
#   DynamXProcessPolarSurface.hpp
#   DynamXProcessBezierSurface.hpp
#   DynamXProcessHejnowicz.hpp
#   DynamXProcessColorMap.hpp
)
Set(BASE_COMPILE TRUE CACHE BOOL
  "Check to compile the basic processes")
If(BASE_COMPILE)
  Add_Library(mgxBase ${MODULE_TYPE} ${MorphoGraphX_SYSTEM_PLUGIN})
  Add_Dependencies(mgxBase mgx)
  Target_Link_Libraries(mgxBase mgx)
  Set_Property(TARGET mgxBase PROPERTY DEFINE_SYMBOL mgxBase_EXPORTS)
  If(WIN32)
    Install(TARGETS mgxBase
            RUNTIME DESTINATION ${MGX_PROCESS_DIR} COMPONENT MGXBase)
  Else()
    Set_Property(TARGET mgxBase PROPERTY PUBLIC_HEADER
      ${MorphoGraphX_SYSTEM_PLUGIN_HEADERS})
    Install(TARGETS mgxBase
            DESTINATION ${MGX_PROCESS_DIR} COMPONENT MGXBase
            PUBLIC_HEADER DESTINATION ${MGX_PROCESS_INCLUDE_DIR} COMPONENT MGXBase)
  EndIf()
EndIf()
# *** Python library
Set(MGX_PYTHON_SRCS
  PythonProcess.cpp
  )
Set(MGX_PYTHON_HEADERS
  PythonProcess.hpp
  )
If(PYTHONLIBS_FOUND)
  Set(PYTHON_COMPILE True CACHE BOOL
    "Check to compile the python module")
Else()
  Set(PYTHON_COMPILE False)
EndIf()
If(PYTHON_COMPILE)
  Include_Directories(SYSTEM ${PYTHON_INCLUDE_DIRS})
  Add_Library(mgxPython ${MODULE_TYPE} ${MGX_PYTHON_SRCS})
  Target_Link_Libraries(mgxPython mgx ${PYTHON_LIBRARIES})
  If(WIN32)
    Set_Target_Properties(mgxPython PROPERTIES PREFIX "")
    Install(TARGETS mgxPython
            RUNTIME DESTINATION ${MGX_PROCESS_DIR} COMPONENT MGXBase)
  Else()
   Set_Target_Properties(mgxPython PROPERTIES
     PREFIX ""
     PUBLIC_HEADER "${MGX_PYTHON_HEADERS}")
    Install(TARGETS mgxPython
            DESTINATION ${MGX_PROCESS_DIR} COMPONENT MGXBase
            PUBLIC_HEADER DESTINATION ${MGX_PROCESS_INCLUDE_DIR} COMPONENT MGXBase)
  EndIf()
EndIf()
