# Build modules
IF( BUILD_MODULES )

  # Prefix added before name of a module
  SET( OMToolkit_MODULE_PREFIX om CACHE INTERNAL "Module name prefix." )

  # System libraries necessary for building MDSTk binaries
  IF ( WIN32 )
    SET( OMToolkit_SYSTEM_LIBS winmm kernel32 )
  ELSE( WIN32 )
    IF( UNIX )
      SET( OMToolkit_SYSTEM_LIBS pthread rt )
    ELSE( UNIX )
      MESSAGE( FATAL_ERROR "Unknown target system!" )
    ENDIF( UNIX )
  ENDIF( WIN32 )

  # OMToolkit libraries
  set( OMToolkit_LIBS OMToolkit )

  # Macro used for declaring a module
  MACRO( OMToolkit_MODULE _MODULE_NAME )
    SET( OMToolkit_MODULE_NAME ${OMToolkit_MODULE_PREFIX}${_MODULE_NAME} )
    SET( OMToolkit_PROJECT_NAME ${OMToolkit_MODULE_PREFIX}${_MODULE_NAME} )
    SET( OMToolkit_MODULE_SOURCES "" )
    SET( OMToolkit_MODULE_HEADERS "" )
    SET( OMToolkit_MODULE_LIBS_PREPEND "" )
    SET( OMToolkit_MODULE_LIBS_APPEND "" )
  ENDMACRO( OMToolkit_MODULE )

  # Macro for adding source file to module build
  MACRO( OMToolkit_MODULE_SOURCE )
    SET( OMToolkit_MODULE_SOURCES ${OMToolkit_MODULE_SOURCES} ${ARGV} )
  ENDMACRO( OMToolkit_MODULE_SOURCE )

  # Macro for adding header file to module
  MACRO( OMToolkit_MODULE_HEADER )
    SET( OMToolkit_MODULE_HEADERS ${OMToolkit_MODULE_HEADERS} ${ARGV} )
  ENDMACRO( OMToolkit_MODULE_HEADER )

  # Macro for adding all header files in a specified directory
  MACRO( OMToolkit_MODULE_INCLUDE_DIR _DIR )
    FILE( GLOB_RECURSE OMToolkit_MODULE_HEADERS ${_DIR}/*.h ${_DIR}/*.hxx )
  ENDMACRO( OMToolkit_MODULE_INCLUDE_DIR )

  # Macro for appending additional library to module build
  MACRO( OMToolkit_MODULE_LIBRARY_APPEND )
    SET( OMToolkit_MODULE_LIBS_APPEND ${OMToolkit_MODULE_LIBS_APPEND} ${ARGV} )
  ENDMACRO( OMToolkit_MODULE_LIBRARY_APPEND )

  # Macro for prepending additional library to module build
  MACRO( OMToolkit_MODULE_LIBRARY_PREPEND )
    SET( OMToolkit_MODULE_LIBS_PREPEND ${ARGV} ${OMToolkit_MODULE_LIBS_PREPEND} )
  ENDMACRO( OMToolkit_MODULE_LIBRARY_PREPEND )

  # Building macro
  MACRO( OMToolkit_MODULE_BUILD )
    ADD_EXECUTABLE( ${OMToolkit_MODULE_NAME}
                    ${OMToolkit_MODULE_SOURCES}
                    ${OMToolkit_MODULE_HEADERS} )
    TARGET_LINK_LIBRARIES( ${OMToolkit_MODULE_NAME}
                           ${OMToolkit_MODULE_LIBS_PREPEND}
                           ${OMToolkit_LIBS}
                           ${OMToolkit_SYSTEM_LIBS}
                           ${OMToolkit_MODULE_LIBS_APPEND} )
    SET_TARGET_PROPERTIES( ${OMToolkit_MODULE_NAME}
                           PROPERTIES LINKER_LANGUAGE CXX
                           DEBUG_POSTFIX d
                           LINK_FLAGS "${OMToolkit_LINK_FLAGS}"
                           )

  ENDMACRO( OMToolkit_MODULE_BUILD )

  # Install macro
  MACRO( OMToolkit_MODULE_INSTALL )
    INSTALL( TARGETS ${OMToolkit_MODULE_NAME}
             RUNTIME DESTINATION bin )
  ENDMACRO( OMToolkit_MODULE_INSTALL )


  # Build all modules
IF(BUILD_MODULES_OSG)
  ADD_SUBDIRECTORY( Viewer)
ENDIF(BUILD_MODULES_OSG)
  ADD_SUBDIRECTORY( LoadFile )
  ADD_SUBDIRECTORY( SaveFile )
  ADD_SUBDIRECTORY( DecimateMesh )
  ADD_SUBDIRECTORY( SubdivideMesh )
  ADD_SUBDIRECTORY( SmoothMesh )
  ADD_SUBDIRECTORY( Curvature )
  ADD_SUBDIRECTORY( ComputeDescriptors )
  ADD_SUBDIRECTORY( ComputeMatrices )
IF(BUILD_MODULES_OpenCL)
  ADD_SUBDIRECTORY( ComputeMatricesHW )
ENDIF(BUILD_MODULES_OpenCL)
  
  ADD_SUBDIRECTORY( FilterMesh )
  ADD_SUBDIRECTORY( GaussianFilter )
  ADD_SUBDIRECTORY( DetectEdges )
ENDIF( BUILD_MODULES )
