project(VegaFEM)

set(VegaFEM_VERSION 4.0)

# Minimum required version of CMake
cmake_minimum_required(VERSION 3.0)

# Add Options
option(VegaFEM_BUILD_UTILITIES "Build utility classes in addition to libraries." ON)

option(VegaFEM_BUILD_MODEL_REDUCTION "Build model-reduction" OFF)

option(VegaFEM_BUILD_RIGID_BODIES "Build Rigid body support" OFF)

option(VegaFEM_ENABLE_OpenGL_SUPPORT "Should modules that require OpenGL be enabled?" ON)

option(VegaFEM_ENABLE_PTHREADS_SUPPORT "Use multithreading (pthread)" ON)

option(VegaFEM_ENABLE_ExpoKit_SUPPORT "Should matrix classes use ExpoKit for exponentiation?" OFF)
# TODO: define USE_EXPOKIT if enabled

option(VegaFEM_ENABLE_OpenGL_SUPPORT "Should modules that require OpenGL be enabled?" ON)

option(VegaFEM_ENABLE_CLOTH_SUPPORT "Should modules that require OpenGL be enabled?" ON)

set(VegaFEM_MODULES
basicAlgorithms
configFile
constrainedDOFs
corotationalLinearFEM
distanceField
elasticForceModel
exactArithmetic
forceModel
getopts
graph
hashTable
imageIO
immersionMesher
integrator
integratorSparse
interpolationCoordinates
isotropicHyperelasticFEM
laplacianMatrix
libiglInterface
listIO
massSpringSystem
matrixIO
mesh
mesher
minivector
objMesh
performanceCounter
polarDecomposition
quaternion
sceneObject
shapeEdit
sparseMatrix
sparseSolver
stencilForceModel
stvk
virtualTets
volumetricMesh
windingNumber
)

if (VegaFEM_BUILD_MODEL_REDUCTION)
  set(VegaFEM_Modules
    ${VegaFEM_Modules}
    integratorDense
    matrix
    modalMatrix
    reducedElasticForceModel
    reducedForceModel
    reducedStvk
  )
endif()
if (VegaFEM_ENABLE_OpenGL_SUPPORT)
  set(VegaFEM_Modules
    ${VegaFEM_Modules}
    camera
    lighting
    sceneObject
    glslPhong
  )
  if (VegaFEM_ENABLE_Cg_SUPPORT)
    set(VegaFEM_Modules
      ${VegaFEM_Modules}
      objMeshGPUDeformer
    )
  endif()
  if (VegaFEM_BUILD_MODEL_REDUCTION)
    set(VegaFEM_Modules
      ${VegaFEM_Modules}
      openGLHelper
      sceneObjectReduced
      renderVolumetricMesh
    )
  endif()
endif()


add_subdirectory(libraries)

include(CMakePackageConfigHelpers)
write_basic_package_version_file(
  "${CMAKE_CURRENT_BINARY_DIR}/VegaFEMConfigVersion.cmake"
  VERSION ${VegaFEM_VERSION}
  COMPATIBILITY AnyNewerVersion
)

export(EXPORT VegaFEMTargets
  FILE "${CMAKE_CURRENT_BINARY_DIR}/VegaFEMTargets.cmake"
  NAMESPACE VegaFEM::
)
configure_file(
  CMake/VegaFEMConfig.cmake.in
  "${CMAKE_CURRENT_BINARY_DIR}/VegaFEMConfig.cmake"
  @ONLY
)

# Install step

set(ConfigPackageLocation lib/cmake/VegaFEM)
install(EXPORT VegaFEMTargets
  FILE VegaFEMTargets.cmake
  NAMESPACE VegaFEM::
  DESTINATION ${ConfigPackageLocation}
)

install(
  FILES
    "${CMAKE_CURRENT_BINARY_DIR}/VegaFEMConfig.cmake"
    "${CMAKE_CURRENT_BINARY_DIR}/VegaFEMConfigVersion.cmake"
  DESTINATION
    ${ConfigPackageLocation}
  COMPONENT
    Devel
)


if(VegaFEM_BUILD_UTILITIES)
  add_subdirectory(utilities)
endif(VegaFEM_BUILD_UTILITIES)