project(monitoring)

if (PACKAGING_NSIS)
    set(LIB_NAME library_monitoring)
else()
    set(LIB_NAME library-monitoring)
endif()

# TODO properly define the path to the XML Schema at run time (in MonitoringManager and MonitoringManagerFactory)
# otherwise this generates an error when executing the application on a machine that have no or a different
# source dir path!
#add_definitions(-DMONITORIN_XSD="${CMAKE_CURRENT_SOURCE_DIR}/../schema/MonitorIn.xsd")
#add_definitions(-DMONITOROUT_XSD="${CMAKE_CURRENT_SOURCE_DIR}/../schema/MonitorOut.xsd")

option(MML_GENERATE_GUI "Generates MML GUI for CamiTK action" ON)
if(MML_GENERATE_GUI)
  add_definitions(-DMML_GENERATE_GUI)
endif(MML_GENERATE_GUI)

# "find" SOFA (you need to have a SOFA_DIR environment variable
# or to define it manually during configuration process)
set(MML_SOFA_DIR $ENV{MML_SOFA_DIR} CACHE PATH "Where to find SOFA (for SOFA svn, this is the build directory)")
if(EXISTS ${MML_SOFA_DIR})
  # Compile SOFA .scn import filter? (ON or OFF)
  option(MML_SOFA_SUPPORT "Compile SOFA Simulator?" ON)
endif(EXISTS ${MML_SOFA_DIR})

# sofa settings
if(MML_SOFA_SUPPORT)
  add_definitions(-DSOFA_SUPPORT)
  add_definitions(-DSOFA_PATH="${MML_SOFA_DIR}")
  
  # support multiple version of SOFA. Two version are possible:
  # sofa svn version, the sofa 1.0 RC1 from the sofa website or the old sofa beta 4 from the debian repository
  option(MML_SOFA_SVN "Set to ON (default) if SOFA svn build dir is available in ${MML_SOFA_DIR}" ON) # latest
  option(MML_SOFA_1_0_RC1 "Set to ON if SOFA 1.0 RC1 is available in ${MML_SOFA_DIR}" OFF)
  option(MML_SOFA_1_0_BETA4 "Set to if SOFA 1.0 beta 4 is available in ${MML_SOFA_DIR}" OFF)

  # compilation flag
  if (MML_SOFA_SVN)
    # include and everything else needed => path to source tree needed
    # automatically get the value of CMAKE_SOURCE_DIR in the build directory toplevel Makefile
    # 1. Get the correct line from the CMakeCache file 
    file(STRINGS ${MML_SOFA_DIR}/CMakeCache.txt SOFA_SOURCE_DIR_LINE REGEX "^Sofa_SOURCE_DIR:STATIC=(.*)$")
    # 2. Use a regex to extract the path from the line
    string(REGEX REPLACE "^Sofa_SOURCE_DIR:STATIC=(.*)$" "\\1" SOFA_SOURCE_DIR "${SOFA_SOURCE_DIR_LINE}")
    message("Detected sofa source directory is ${SOFA_SOURCE_DIR}")

    add_definitions(-DSOFA_SVN)
    
#     # use Find SOFA script
#     set(SOFA_DIR ${SOFA_SOURCE_DIR})
#     include(${SOFA_DIR}/cmake/Modules/FindSOFA.cmake)
#     list(APPEND CMAKE_MODULE_PATH "${SOFA_DIR}/cmake/Modules")
#     find_package(SOFA) 
#     # Check the FindSofa.cmake and "translate" all their variables here
#     set(MML_SOFA_INCLUDE_DIR ${SOFA_INCLUDE_DIRS})
#         set(MML_SOFA_LIBS ${SOFA_LIB_CORE}
#         ${SOFA_LIB_HELPER}
#         ${SOFA_LIB_DEFAULT_TYPE})
  endif()
  
  if (MML_SOFA_1_0_RC1)
    add_definitions(-DSOFA_1_0_RC1)
  endif()
  
  if (MML_SOFA_1_0_BETA4)
    add_definitions(-DSOFA_1_0_BETA4)
  endif()
    
    
  
  # library settings depends on the sofa version
  
  if (MML_SOFA_SVN)
    set(MML_SOFA_LIBS 
        # SOFA_LIB_NAME
        #SofaGui            
        #SofaTree           
        SofaCore            
        SofaGuiQt           
        SofaHelper          
        SofaGuiGlut         
        SofaGuiMain         
        #SofaModeler        
        #SofaSimulation     
        #SofaObjectCreator  
        SofaDefaultType     
        #SofaGraph          

        # SOFA_LIB_COMPONENT_NAME
        #SofaComponent           
        #SofaComponentDev        
        SofaComponentBase        
        SofaComponentMisc        
        SofaComponentCommon      
        SofaComponentGeneral     
        #SofaComponentMiscDev    
        SofaComponentAdvanced    
        #SofaComponentAdvancedDev

        # SOFA_LIB_BASE_NAME
        SofaBaseAnimationLoop      
        SofaBaseCollision          
        SofaBaseLinearSolver       
        SofaBaseMechanics          
        SofaBaseTopology           
        SofaBaseVisual             

        # SOFA_LIB_GENERAL_NAME
        SofaBoundaryCondition     
        SofaConstraint            
        SofaDenseSolver           
        SofaEngine                
        SofaExporter              
        SofaGraphComponent        
        SofaOpenglVisual          
        SofaPreconditioner        
        SofaTopologyMapping       
        SofaUserInteraction       
        SofaValidation            
        SofaHaptics               
        
        # SOFA_LIB_ADVANCED_NAME
        #SofaAdvancedConstraint  
        #SofaAdvancedFem         
        #SofaAdvancedInteraction 
        SofaEigen2Solver         
        SofaEulerianFluid        
        #SofaMjedFem             
        SofaNonUniformFem        
        #SofaNonUniformFemDev    
        SofaSphFluid             
        SofaVolumetricData       
        
        # SOFA_LIB_MISC_NAME
        SofaMisc                  
        SofaMiscCollision         
        #SofaMiscCollisionDev      
        SofaMiscFem              
        #SofaMiscDev             
        #SofaMiscFemDev          
        SofaMiscForceField       
        #SofaMiscForcefieldDev   
        SofaMiscMapping          
        #SofaMiscMappingDev      
        SofaMiscSolver           
        #SofaMiscSolverDev       
        SofaMiscTopology         
        #SofaMiscTopologyDev     
        SofaMiscEngine           
    )
    set(MML_SOFA_LIB_DIR ${MML_SOFA_DIR}/lib)
  endif()

  if (MML_SOFA_1_0_RC1)
    # old sofa RC1 from the tarballs
    if(WIN32)
        set(MML_SOFA_LIB_DIR ${MML_SOFA_DIR}/lib/win32/ReleaseVC9 ${MML_SOFA_DIR}/lib/win32 ${MML_SOFA_DIR}/lib ${MML_SOFA_DIR}/bin )
    else()
        set(MML_SOFA_LIB_DIR ${MML_SOFA_DIR}/lib/linux ${MML_SOFA_DIR}/lib)
    endif()

    # set dependencies
    set(MML_SOFA_LIBS sofacore #sofa_component_dev
    #sofa_component_advanced_dev sofa_component_misc_dev
    sofa_component
    #sofa_non_uniform_fem_dev
    #sofa_advanced_fem 
    #sofa_mjed_fem 
    #sofa_advanced_constraint 
    #sofa_advanced_interaction 
    #sofa_misc_topology_dev 
    #sofa_misc_mapping_dev 
    #sofa_misc_forcefield_dev 
    #sofa_misc_fem_dev 
    #sofa_misc_collision_dev 
    #sofa_misc_solver_dev 
    #sofa_misc_dev
    sofa_exporter sofa_loader sofa_misc_forcefield sofa_component_base sofa_component_common sofa_component_general sofa_component_advanced sofa_component_misc sofahelper sofa_engine sofa_sph_fluid sofa_non_uniform_fem sofa_base_topology sofa_boundary_condition sofa_haptics sofa_constraint sofatree sofa_base_linear_solver sofa_implicit_ode_solver sofa_simple_fem sofa_topology_mapping sofa_user_interaction sofa_misc_collision sofa_preconditioner sofa_misc_topology sofa_mesh_collision sofa_volumetric_data 
    #sofabgl 
    sofa_base_collision sofa_deformable sofa_graph_component sofa_base_mechanics sofa_rigid sofa_base_animation_loop sofa_object_interaction sofa_explicit_ode_solver sofa_eigen2_solver sofa_validation sofa_dense_solver sofa_eulerian_fluid sofa_misc_mapping sofa_misc_fem sofa_misc_engine sofa_misc_solver sofa_misc
    sofa_base_visual #-lnewmat -lGLEW -lpng
        sofasimulation #-lminiFlowVR
        sofacore #-ltinyxml
        sofadefaulttype #-lQt3Support -lQtOpenGL -lQtGui -lQtCore -lGLU -lGL -lpthread
            sofamodeler
    )
  endif()

  if(MML_SOFA_1_0_BETA4)
    # Sofa1.0beta4 from the package
    set(MML_SOFA_LIBS sofacore sofacomponent sofasimulation sofatree sofahelper sofadefaulttype)
  endif()
  
  # add debug suffix (TODO update for SOFA SVN)
  if(WIN32)
        if( CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo" )
            set(MML_SOFA_LIBS_WIN32 ${MML_SOFA_LIBS})
            set(MML_SOFA_LIBS)
            if(MML_SOFA_1_0_RC1)
                set(SOFA_VERSION_SUFFIX "_1_0d")
            endif()
            if(MML_SOFA_1_0_BETA4)
                set(SOFA_VERSION_SUFFIX "d")
            endif()            
            foreach(SOFA_LIB ${MML_SOFA_LIBS_WIN32})
                    set(MML_SOFA_LIBS ${MML_SOFA_LIBS} ${SOFA_LIB}${SOFA_VERSION_SUFFIX})
            endforeach()
        endif()
  endif()
  
  # SOFA include directories
  
  # use sofa source directory for sofa svn version
  if (MML_SOFA_SVN)
    set(MML_SOFA_INCLUDE_DIR ${SOFA_SOURCE_DIR}/include ${SOFA_SOURCE_DIR}/modules ${SOFA_SOURCE_DIR}/framework
        ${SOFA_SOURCE_DIR}/extlibs/miniBoost ${SOFA_SOURCE_DIR}/include/modules
        ${SOFA_SOURCE_DIR}/include/framework ${SOFA_SOURCE_DIR}/include/extlibs/miniBoost
        ${SOFA_SOURCE_DIR}/extlibs/tinyxml )
  endif()
  
  if (MML_SOFA_1_0_BETA4 OR MML_SOFA_1_0_RC1)
    # includes
    set(MML_SOFA_INCLUDE_DIR ${MML_SOFA_DIR}/include ${MML_SOFA_DIR}/modules ${MML_SOFA_DIR}/framework
        ${MML_SOFA_DIR}/extlibs/miniBoost ${MML_SOFA_DIR}/include/modules
        ${MML_SOFA_DIR}/include/framework ${MML_SOFA_DIR}/include/extlibs/miniBoost )
  endif()
     
  if(MML_GENERATE_GUI)
    set(sofa_MOC_SRCS SofaWidget.h)
    set(sofa_UIS SofaWidget.ui)
    qt4_wrap_ui(sofa_UIS_H ${sofa_UIS})
    qt4_wrap_cpp(sofa_MOCS ${sofa_MOC_SRCS})
    set(sofa_QT_SRC SofaWidget.cpp)
  endif(MML_GENERATE_GUI)
  
  set(MML_SOFA_HEADERS  SofaSimulator.h
                        TranslationConstraint.h
                        ${sofa_UIS_H}
                        ${sofa_MOC_SRCS}
  )
  set(MML_SOFA_SRC SofaSimulator.cpp
                    TranslationConstraint.cpp
                    TranslationConstraint.inl
                    ${sofa_MOCS}
                    ${sofa_MOC_UI}
                    ${sofa_QT_SRC}
  )
endif(MML_SOFA_SUPPORT)


set(MML_ANSYS_BIN $ENV{MML_ANSYS_BIN} CACHE FILE "Where to find Ansys binary")
set(MML_ANSYS_WORKING_DIR $ENV{MML_ANSYS_WORKING_DIR} CACHE PATH "Specify a folder for ansys working files")
if(EXISTS ${MML_ANSYS_BIN})
if(EXISTS ${MML_ANSYS_WORKING_DIR})
  # Compile Ansys simulator files (ON or OFF)
  option(MML_ANSYS_SUPPORT "Compile Ansys simulator?" ON)

  # ansys settings
  if(MML_ANSYS_SUPPORT)
    # compilation flag
    add_definitions(-DANSYS_SUPPORT)
    add_definitions(-DANSYS_BIN="${MML_ANSYS_BIN}" -DANSYS_WORKING_DIR="${MML_ANSYS_WORKING_DIR}")

    if(MML_GENERATE_GUI)
        set(ansys_MOC_SRCS  AnsysWidget.h)
        set(ansys_UIS       AnsysWidget.ui)
        qt4_wrap_ui(ansys_UIS_H ${ansys_UIS})
        qt4_wrap_cpp(ansys_MOC_UI ${ansys_UIS_H})
        qt4_wrap_cpp(ansys_MOCS ${ansys_MOC_SRCS})
        set(ansys_QT_SRC AnsysWidget.cpp)
    endif(MML_GENERATE_GUI)

    set(MML_ANSYS_HEADERS       AnsysBatch.h  
                                AnsysBatchWriter.h
                                PrepWriter.h
                                SoluWriter.h
                                PostWriter.h
                                ParametersWriter.h
                                AnsysSimulator.h
                                ${ansys_UIS_H}
                                ${ansys_MOC_SRCS}
    )

    set(MML_ANSYS_SRC           AnsysBatch.cpp
                                AnsysBatchWriter.cpp
                                PrepWriter.cpp
                                SoluWriter.cpp
                                PostWriter.cpp
                                ParametersWriter.cpp
                                AnsysSimulator.cpp
                                ${ansys_MOCS}
                                ${ansys_MOC_UI}
                                ${ansys_QT_SRC}
    )
  endif(MML_ANSYS_SUPPORT)
endif(EXISTS ${MML_ANSYS_WORKING_DIR})
endif(EXISTS ${MML_ANSYS_BIN})

set(MML_ARTISYNTH_BIN $ENV{MML_ARTISYNTH_BIN} CACHE FILE "Where to find artisynth binary")
set(MML_ARTISYNTH_WORKING_DIR $ENV{MML_ARTISYNTH_WORKING_DIR} CACHE PATH "Specify a folder for artisynth working files")
if(EXISTS ${MML_ARTISYNTH_BIN})
if(EXISTS ${MML_ARTISYNTH_WORKING_DIR})
  # Compile ARTISYNTH simulator files (ON or OFF)
  option(MML_ARTISYNTH_SUPPORT "Compile Artisynth simulator?" ON)

  # ARTISYNTH settings
  if(MML_ARTISYNTH_SUPPORT)
    # compilation flag
    add_definitions(-DARTISYNTH_SUPPORT)
    add_definitions(-DARTISYNTH_BIN="${MML_ARTISYNTH_BIN}" -DARTISYNTH_WORKING_DIR="${MML_ARTISYNTH_WORKING_DIR}")
    set(MML_ARTISYNTH_HEADERS   ArtiSynthSimulator.h)
    set(MML_ARTISYNTH_SRC       ArtiSynthSimulator.cpp)
  endif(MML_ARTISYNTH_SUPPORT)
endif(EXISTS ${MML_ARTISYNTH_WORKING_DIR})
endif(EXISTS ${MML_ARTISYNTH_BIN})

if(MML_GENERATE_GUI)
    set(MML_MOC_SRCS    SimulatorWidget.h          
                        Xmlhighlighter.h
    )
  qt4_wrap_cpp(MML_MOCS ${MML_MOC_SRCS})
  set(MML_QT_SRC        SimulatorWidget.cpp    
                        Xmlhighlighter.cpp
  )
endif(MML_GENERATE_GUI)

set(monitoring_H        MMLAPI.h
                        StoppingCriterion.h
                        StoppingCriterionFactory.h
                        Criterion.h
                        CriterionFactory.h
                        MultipleCriterion.h
                        MultipleCriterionFactory.h
                        Method.h
                        MethodFactory.h
                        Force.h 
                        KineticEnergy.h
                        Position.h
                        TimeMonitoring.h
                        Velocity.h
                        AndMultipleCriterion.h
                        OrMultipleCriterion.h
                        MinThreshold.h
                        Threshold.h
                        Simulator.h
                        NonInteractiveSimulator.h
                        InteractiveSimulator.h
                        SimulatorFactory.h
                        InitSimulators.h
                        ${MML_SOFA_HEADERS}
                        ${MML_ANSYS_HEADERS}
                        ${MML_ARTISYNTH_HEADERS}
                        ${MML_MOC_SRCS}       
                        Monitor.h 
                        MonitorFactory.h
                        MonitorGeometricDeviation.h
                        MonitorPosition.h
                        MonitorRen.h
                        MonitorForce.h
                        MonitorPointSetDistance.h
                        MonitorPointFinalSetDistance.h
                        MonitorVolume.h
                        MonitorSurface.h
                        MonitorDisplacement.h
                        MonitorNormDisplacement.h
                        MonitorPointToTriangleMeshDistanceFinal.h
                        MonitorDistanceX.h
                        MonitorDistanceY.h
                        MonitorDistanceZ.h
                        MonitorComputingTime.h
                        Reference.h
                        Chrono.h
                        Tools.h
                        Macros.h
                        AtomIterator.h
                        Facet.h
                        SurfaceExtractor.h
                        MonitoringManager.h
                        MonitoringManagerFactory.h
                        InteractiveMonitoringManager.h
                        NonInteractiveMonitoringManager.h
)

set(monitoring_SRCS     ${monitoring_H}
                        StoppingCriterion.cpp
                        StoppingCriterionFactory.cpp
                        Criterion.cpp
                        CriterionFactory.cpp
                        MultipleCriterion.cpp
                        MultipleCriterionFactory.cpp
                        Method.cpp
                        MethodFactory.cpp
                        Force.cpp 
                        KineticEnergy.cpp
                        Position.cpp
                        TimeMonitoring.cpp
                        Velocity.cpp
                        AndMultipleCriterion.cpp
                        OrMultipleCriterion.cpp
                        MinThreshold.cpp
                        Threshold.cpp
                        Simulator.cpp
                        NonInteractiveSimulator.cpp
                        InteractiveSimulator.cpp
                        SimulatorFactory.cpp
                        ${MML_SOFA_SRC}
                        ${MML_ANSYS_SRC}
                        ${MML_ARTISYNTH_SRC}
                        ${MML_MOCS}
                        ${MML_QT_SRC}
                        Monitor.cpp
                        MonitorFactory.cpp
                        MonitorGeometricDeviation.cpp
                        MonitorPosition.cpp
                        MonitorRen.cpp
                        MonitorForce.cpp
                        MonitorPointSetDistance.cpp
                        MonitorPointFinalSetDistance.cpp
                        MonitorVolume.cpp
                        MonitorSurface.cpp
                        MonitorDisplacement.cpp
                        MonitorNormDisplacement.cpp
                        MonitorDistanceX.cpp
                        MonitorDistanceY.cpp
                        MonitorDistanceZ.cpp
                        MonitorComputingTime.cpp
                        MonitorPointToTriangleMeshDistanceFinal.cpp
                        Reference.cpp
                        Chrono.cpp
                        Tools.cpp
                        AtomIterator.cpp
                        Facet.cpp
                        SurfaceExtractor.cpp
                        MonitoringManager.cpp
                        MonitoringManagerFactory.cpp
                        InteractiveMonitoringManager.cpp
                        NonInteractiveMonitoringManager.cpp
)

if (PACKAGING_NSIS)
    set(    monitoring_LIBRARIES
            library_mml
            library_pml
            library_lml
        )
else()
    set(    monitoring_LIBRARIES
            library-mml
            library-pml
            library-lml
        )
endif()

set(monitoring_link)

if(MML_SOFA_SUPPORT)
  set(monitoring_LIBRARIES      ${monitoring_LIBRARIES}
                                ${MML_SOFA_LIBS}
  )
  set(monitoring_link   ${monitoring_link} 
                        ${MML_SOFA_LIB_DIR}
  )
endif(MML_SOFA_SUPPORT)

if(MML_GENERATE_GUI)
  set(monitoring_LIBRARIES      ${monitoring_LIBRARIES}
                                ${QT_LIBRARIES}
  )
endif(MML_GENERATE_GUI)

if(MML_GENERATE_GUI)
  set(monitoring_INCLUDE_DIR ${monitoring_INCLUDE_DIR} ${QT_INCLUDE_DIR})
endif(MML_GENERATE_GUI)

# Add all the include directories
set(monitoring_INCLUDE_DIR ${monitoring_INCLUDE_DIR} ${MML_SOFA_INCLUDE_DIR} ${MML_ANSYS_WORKING_DIR} ${MML_ARTISYNTH_WORKING_DIR})

# add_definitions(-DCOMPILE_MML_TOOL)
# add_definitions(-D_CRT_SECURE_NO_WARNINGS)

# add lib as a camitk library
camitk_library( SHARED
                SOURCES ${monitoring_SRCS}
                DEFINES COMPILE_MML_TOOL
                NEEDS_QT_MODULES
                NEEDS_XERCESC
                NEEDS_LIBXML2
                NEEDS_CEP_LIBRARIES mml pml lml 
                INCLUDE_DIRECTORIES ${monitoring_INCLUDE_DIR}
                LINK_DIRECTORIES ${MML_SOFA_DIR}/lib
                # Caution: probably need here for Ansys and Artisynth library something like - LINK_DIRECTORIES ${MML_ANSYS_WORKING_DIR}/lib ${MML_ARTISYNTH_WORKING_DIR}/lib
                EXTERNAL_LIBRARIES ${MML_SOFA_LIBS}
                CEP_NAME CEP_MODELING
                DESCRIPTION "Tools to monitor a biomechanical deformation."
)

if (PACKAGING_NSIS)
    add_dependencies(library_monitoring library_lml library_pml library_mml)
else()
    add_dependencies(library-monitoring library-lml library-pml library-mml)
endif()

# #--------------
# # installation
# #--------------
# export_headers(
#   manager/MonitoringManager.h
#   manager/MonitoringManagerFactory.h
#   manager/InteractiveMonitoringManager.h
#   manager/NonInteractiveMonitoringManager.h 
#   SUBDIRECTORY manager
#   COMPONENT ${LIB_NAME}
#   GROUP libraries
# )
# 
# export_headers(
#   tools/Chrono.h
#   tools/Tools.h
#   tools/Macros.h
#   tools/AtomIterator.h
#   tools/SurfaceExtractor/Facet.h
#   tools/SurfaceExtractor/SurfaceExtractor.h
#   SUBDIRECTORY tools
#   COMPONENT ${LIB_NAME}
#   GROUP libraries
# )
# 
# export_headers(
#   reference/Reference.h
#   SUBDIRECTORY reference
#   COMPONENT ${LIB_NAME}
#   GROUP libraries
# )
# 
# export_headers(
#   monitor/Monitor.h 
#   monitor/MonitorFactory.h
#   SUBDIRECTORY monitor
#   COMPONENT ${LIB_NAME}
#   GROUP libraries
# )
# 
# export_headers(
#   monitor/monitors/MonitorGeometricDeviation.h
#   monitor/monitors/MonitorPosition.h
#   monitor/monitors/MonitorRen.h
#   monitor/monitors/MonitorForce.h
#   monitor/monitors/MonitorPointSetDistance.h
#   monitor/monitors/MonitorPointFinalSetDistance.h
#   monitor/monitors/MonitorPointToTriangleMeshDistanceFinal.h
#   monitor/monitors/MonitorVolume.h
#   monitor/monitors/MonitorSurface.h
#   monitor/monitors/MonitorDisplacement.h
#   monitor/monitors/MonitorNormDisplacement.h
#   monitor/monitors/MonitorDistanceX.h
#   monitor/monitors/MonitorDistanceY.h
#   monitor/monitors/MonitorDistanceZ.h
#   monitor/monitors/MonitorComputingTime.h
#   
#   SUBDIRECTORY monitor/monitors
#   COMPONENT ${LIB_NAME}
#   GROUP libraries
# )
# 
# if(MML_ANSYS_SUPPORT)
# export_headers(
#   simulator/simulators/Ansys/AnsysBatch.h
#   simulator/simulators/Ansys/AnsysBatchWriter.h
#   simulator/simulators/Ansys/AnsysSimulator.h
#   SUBDIRECTORY simulator/simulators/Ansys
#   COMPONENT ${LIB_NAME}
#   GROUP libraries
# )
# 
# export_headers(
#   simulator/simulators/Ansys/AnsysBatchWriters/PrepWriter.h
#   simulator/simulators/Ansys/AnsysBatchWriters/SoluWriter.h
#   simulator/simulators/Ansys/AnsysBatchWriters/PostWriter.h
#   simulator/simulators/Ansys/AnsysBatchWriters/ParametersWriter.h
#   SUBDIRECTORY simulator/simulators/Ansys/AnsysBatchWriters
#   COMPONENT ${LIB_NAME}
#   GROUP libraries
# )
# endif()
# 
# if(MML_ARTISYNTH_SUPPORT)
# export_headers(
#   simulator/simulators/ArtiSynth/ArtiSynthSimulator.h
#   SUBDIRECTORY simulator/simulators/ArtiSynth
#   COMPONENT ${LIB_NAME}
#   GROUP libraries
# )
# endif()
# 
# if(MML_SOFA_SUPPORT)
# export_headers(
#   ${MML_SOFA_HEADERS}
#   SUBDIRECTORY simulator/simulators/Sofa
#   COMPONENT ${LIB_NAME}
#   GROUP libraries
# )
# endif()
# 
# if(MML_GENERATE_GUI)
# export_headers(
#   simulator/SimulatorWidget.h
#   SUBDIRECTORY simulator
#   COMPONENT ${LIB_NAME}
#   GROUP libraries
# )
# 
# export_headers(
#   tools/Xmlhighlighter.h
#   SUBDIRECTORY tools
#   COMPONENT ${LIB_NAME}
#   GROUP libraries
# )
# endif(MML_GENERATE_GUI)
# 
# export_headers(
#   simulator/Simulator.h
#   simulator/NonInteractiveSimulator.h
#   simulator/InteractiveSimulator.h
#   simulator/SimulatorFactory.h
#   SUBDIRECTORY simulator
#   COMPONENT ${LIB_NAME}
#   GROUP libraries
# )
# 
# export_headers(
#   simulator/simulators/InitSimulators.h
#   SUBDIRECTORY simulator/simulators
#   COMPONENT ${LIB_NAME}
#   GROUP libraries
# )
# 
# export_headers(
#   stoppingCriterion/StoppingCriterion.h
#   stoppingCriterion/StoppingCriterionFactory.h
#   SUBDIRECTORY stoppingCriterion
#   COMPONENT ${LIB_NAME}
#   GROUP libraries
# )
# 
# export_headers(
#   stoppingCriterion/stoppingCriteria/Criterion.h
#   stoppingCriterion/stoppingCriteria/CriterionFactory.h
#   stoppingCriterion/stoppingCriteria/MultipleCriterion.h
#   stoppingCriterion/stoppingCriteria/MultipleCriterionFactory.h
#   stoppingCriterion/stoppingCriteria/Method.h
#   stoppingCriterion/stoppingCriteria/MethodFactory.h
#   SUBDIRECTORY stoppingCriterion/stoppingCriteria
#   COMPONENT ${LIB_NAME}
#   GROUP libraries
# )
# 
# export_headers(
#   stoppingCriterion/stoppingCriteria/criteria/Force.h 
#   stoppingCriterion/stoppingCriteria/criteria/KineticEnergy.h
#   stoppingCriterion/stoppingCriteria/criteria/Position.h
#   stoppingCriterion/stoppingCriteria/criteria/Time.h
#   stoppingCriterion/stoppingCriteria/criteria/Velocity.h
#   SUBDIRECTORY stoppingCriterion/stoppingCriteria/criteria
#   COMPONENT ${LIB_NAME}
#   GROUP libraries
# )
# 
# export_headers(
#   stoppingCriterion/stoppingCriteria/multipleCriteria/AndMultipleCriterion.h
#   stoppingCriterion/stoppingCriteria/multipleCriteria/OrMultipleCriterion.h
#   SUBDIRECTORY stoppingCriterion/stoppingCriteria/multipleCriteria
#   COMPONENT ${LIB_NAME}
#   GROUP libraries
# )
# 
# export_headers(
#   stoppingCriterion/stoppingCriteria/methods/MinThreshold.h
#   stoppingCriterion/stoppingCriteria/methods/Threshold.h
#   SUBDIRECTORY stoppingCriterion/methods
#   COMPONENT ${LIB_NAME}
#   GROUP libraries
# )
# 
# export_headers(
#   MMLAPI.h
#   COMPONENT ${LIB_NAME}
#   GROUP libraries
# )