#---------------------------------------------------------------------
PROJECT( elxCore )

#---------------------------------------------------------------------
# Define lists of files in the subdirectories.

SET( KernelFilesForExecutables
  Kernel/elxElastixMain.cxx
  Kernel/elxElastixMain.h
  Kernel/elxTransformixMain.cxx
  Kernel/elxTransformixMain.h
)

SET( KernelFilesForComponents
  Kernel/elxElastixBase.cxx
  Kernel/elxElastixBase.h
  Kernel/elxElastixTemplate.h
  Kernel/elxElastixTemplate.hxx
)

SET( InstallFilesForExecutables
  Install/elxComponentLoader.cxx
  Install/elxComponentLoader.h
)

SET( InstallFilesForComponents
  Install/elxComponentDatabase.cxx
  Install/elxComponentDatabase.h
  Install/elxBaseComponent.h
  Install/elxBaseComponentSE.h
  Install/elxBaseComponentSE.hxx
  Install/elxInstallAllComponents.h
  Install/elxInstallFunctions.h
  Install/elxMacro.h
  Install/elxIncludes.h
)

SET( ConfigurationFiles
  Configuration/elxConfiguration.cxx
  Configuration/elxConfiguration.h
)

SET( ComponentBaseClassFiles
  ComponentBaseClasses/elxFixedImagePyramidBase.h
  ComponentBaseClasses/elxImageSamplerBase.h
  ComponentBaseClasses/elxInterpolatorBase.h
  ComponentBaseClasses/elxMetricBase.h
  ComponentBaseClasses/elxMovingImagePyramidBase.h
  ComponentBaseClasses/elxOptimizerBase.h
  ComponentBaseClasses/elxRegistrationBase.h
  ComponentBaseClasses/elxResampleInterpolatorBase.h
  ComponentBaseClasses/elxResamplerBase.h
  ComponentBaseClasses/elxTransformBase.h
  ComponentBaseClasses/elxFixedImagePyramidBase.hxx
  ComponentBaseClasses/elxImageSamplerBase.hxx
  ComponentBaseClasses/elxInterpolatorBase.hxx
  ComponentBaseClasses/elxMetricBase.hxx
  ComponentBaseClasses/elxMovingImagePyramidBase.hxx
  ComponentBaseClasses/elxOptimizerBase.hxx
  ComponentBaseClasses/elxRegistrationBase.hxx
  ComponentBaseClasses/elxResampleInterpolatorBase.hxx
  ComponentBaseClasses/elxResamplerBase.hxx
  ComponentBaseClasses/elxTransformBase.hxx
)

SET( ProgressCommandFiles
  elxProgressCommand.cxx
  elxProgressCommand.h
)

#---------------------------------------------------------------------
# Construct source groups for nice visualisation in Visual Studio.

SOURCE_GROUP( "Install" FILES
  ${InstallFilesForComponents}
  ${InstallFilesForExecutables}
)

SOURCE_GROUP( "Kernel" FILES
  ${KernelFilesForComponents}
  ${KernelFilesForExecutables}
)

SOURCE_GROUP( "Configuration" FILES ${ConfigurationFiles} )
SOURCE_GROUP( "ComponentBaseClasses" FILES ${ComponentBaseClassFiles} )
SOURCE_GROUP( "ProgressCommand" FILES ${ProgressCommandFiles} )

#---------------------------------------------------------------------
# Create the elxCore library.

ADD_LIBRARY( elxCore
  ${KernelFilesForComponents}
  ${InstallFilesForComponents}
  ${ConfigurationFiles}
  ${ComponentBaseClassFiles}
  ${ProgressCommandFiles}
)

#---------------------------------------------------------------------
# Link against other libraries.

TARGET_LINK_LIBRARIES( elxCore
  elxCommon
  xoutlib
  ITKBasicFilters
  ITKNumerics
  ITKIO
  ITKCommon
  ITKStatistics
)

#---------------------------------------------------------------------
# Add macro if mevisdicomtiff should be used
IF( ELASTIX_USE_MEVISDICOMTIFF )
  ADD_DEFINITIONS( -D_ELASTIX_USE_MEVISDICOMTIFF )
  SET( mevisdcmtifflib mevisdcmtiff )
ELSE()
  SET( mevisdcmtifflib )
ENDIF()


#---------------------------------------------------------------------
# Create the elastix executable.

ADD_EXECUTABLE( elastix
  Main/elastix.cxx
  Main/elastix.h
  Kernel/elxElastixMain.cxx
  Kernel/elxElastixMain.h
  ${InstallFilesForExecutables}
)

#---------------------------------------------------------------------
# Create the transformix executable.

ADD_EXECUTABLE( transformix
  Main/transformix.cxx
  Main/transformix.h
  Kernel/elxElastixMain.cxx
  Kernel/elxElastixMain.h
  Kernel/elxTransformixMain.cxx
  Kernel/elxTransformixMain.h
  ${InstallFilesForExecutables}
)

#---------------------------------------------------------------------
# Link elastix against other libraries.

TARGET_LINK_LIBRARIES( elastix
  elxCommon
  elxCore
  param
  xoutlib
  ${mevisdcmtifflib}
  ITKBasicFilters
  ITKNumerics
  ITKIO
  ITKCommon
  ITKStatistics
  ${AllComponentLibs}
)

#---------------------------------------------------------------------
# Link transformix against other libraries.

TARGET_LINK_LIBRARIES( transformix
  elxCommon
  elxCore
  param
  xoutlib
  ${mevisdcmtifflib}
  ITKBasicFilters
  ITKNumerics
  ITKIO
  ITKCommon
  ITKStatistics
  ${AllComponentLibs}
)

#---------------------------------------------------------------------
# Define the install directory for elastix and transformix.

IF( WIN32 )
  INSTALL( TARGETS elastix transformix
    RUNTIME DESTINATION . )
    #COMPONENT core )
ELSE()
  # Tell the executables where to find the required .so files.
  SET_TARGET_PROPERTIES(elastix transformix
    PROPERTIES INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib:${ITK_DIR}" )  
  # Put executables in bin and libraries in lib.
  INSTALL( TARGETS elastix transformix
    RUNTIME DESTINATION bin )
    #COMPONENT core )
ENDIF()

#---------------------------------------------------------------------
# The Core/Install directory contains a CMakeLists file for
# defining the elastix compilation types.

ADD_SUBDIRECTORY( Install )

