cmake_minimum_required(VERSION 3.1)
project(LinearSubspace)

set(LINEARSUBSPACE_MAJOR_VERSION 0)
set(LINEARSUBSPACE_MINOR_VERSION 1)
set(LINEARSUBSPACE_VERSION ${LINEARSUBSPACE_MAJOR_VERSION}.${LINEARSUBSPACE_MINOR_VERSION})

set(HEADER_FILES
    config.h
)

set(SOURCE_FILES
    initLinearSubspace.cpp
)

list(APPEND HEADER_FILES
    engine/JacobsonEnergyComputationEngine.h
    engine/JacobsonWeightComputationEngine.h
    engine/Hexa2TetraEngine.h
    engine/WeightTranslationEngine.h
    engine/WeightMultiTranslationEngine.h
    engine/WeightApplicationEngine.h
    engine/LinearAttributeComputationEngine.h
    shapeFunction/BaseLSShapeFunction.h
    shapeFunction/JacobsonShapeFunction.h
    shapeFunction/LSJacobsonShapeFunction.h
#    shapeFunction/LSShapeFunctionDiscretizer.h
    mapping/BaseLSMultiMapping.inl
    mapping/BaseLSMultiMapping.h
    mapping/LinearLSMultiMapping.h
    mapping/BaseLSMultiMapping.h
    mapping/LSJacobianBlock.h
    mapping/LSJacobianBlock_point.inl
    mapping/LSJacobianBlock_affine.inl
    mapping/LSMultiMapping.h
    mapping/LSMultiMapping.inl
    utility/EigenStreams.h
    utility/OctaveOutputs.h
    )

list(APPEND SOURCE_FILES
    engine/JacobsonEnergyComputationEngine.cpp
    engine/JacobsonWeightComputationEngine.cpp
    engine/Hexa2TetraEngine.cpp
    engine/WeightTranslationEngine.cpp
    engine/WeightMultiTranslationEngine.cpp
    engine/WeightApplicationEngine.cpp
    engine/LinearAttributeComputationEngine.cpp
    shapeFunction/BaseLSShapeFunction.cpp
    shapeFunction/JacobsonShapeFunction.cpp
    shapeFunction/LSJacobsonShapeFunction.cpp
#    shapeFunction/LSShapeFunctionDiscretizer.cpp
    mapping/BaseLSMultiMapping.cpp
    mapping/LSMultiMapping.cpp
    mapping/LinearLSMultiMapping.cpp
    )

set(PYTHON_FILES
    python/LinearSubspace/__init__.py
    python/LinearSubspace/API.py
)

set(EXAMPLE_FILES
    examples/API.py
    examples/Hexa2TetraEngine.py
    examples/armadillo.py
    examples/test_plate.py
    examples/test_plate_dynamics.py
    examples/test_scene.py
    examples/test_scene_regions.py
    examples/test_shapefunction.py
    examples/test_shapefunction_with_grad.py
    examples/test_shapefunction_with_physics.py
    examples/weight_comparison.py
    examples/test_LSMultiMapping.py
    examples/test_mapping.py
    examples/test_reconstruction.py
    examples/test_reconstruction_regions.py
    examples/LSMultiMapping.py
    examples/test_LSMultiMapping_ShapeFuction.py
    examples/steak_remake.py
    )

set(README_FILES
    README.md
)

find_package(SofaFramework REQUIRED)
find_package(Flexible REQUIRED)

# Config files and install rules for pythons scripts
sofa_set_python_directory(${PROJECT_NAME} "python")

add_library(${PROJECT_NAME} SHARED ${HEADER_FILES} ${SOURCE_FILES} ${PYTHON_FILES} ${EXAMPLE_FILES} ${README_FILES})
set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "-DSOFA_BUILD_LINEARSUBSPACE")
target_link_libraries(${PROJECT_NAME} SofaCore Flexible)

target_include_directories(${PROJECT_NAME} PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>")
target_include_directories(${PROJECT_NAME} PRIVATE "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>")
target_include_directories(${PROJECT_NAME} PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>")
target_include_directories(${PROJECT_NAME} PUBLIC "$<INSTALL_INTERFACE:include>")

set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${LINEARSUBSPACE_VERSION})

#install(TARGETS ${PROJECT_NAME}
#        COMPONENT LinearSubspace_libraries
#        EXPORT LinearSubspaceTargets
#        RUNTIME DESTINATION bin
#        LIBRARY DESTINATION lib
#        ARCHIVE DESTINATION lib)

#if(SOFA_BUILD_TESTS)
#    find_package(SofaTest QUIET)
#    if(SofaTest_FOUND)
#        add_subdirectory(Compliant_test)
#    endif()
#endif()


#SET( CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,defs" )




sofa_create_package(${PROJECT_NAME} ${LINEARSUBSPACE_VERSION} ${PROJECT_NAME} ${PROJECT_NAME})

