# Quaternion Interface
add_library(vector-3d-intf
    INTERFACE
)

target_include_directories(vector-3d-intf
    INTERFACE
    .
)

target_link_libraries(vector-3d-intf
    INTERFACE
)

# Quaternion
add_library(quaternion 
    STATIC
    Quaternion.cpp
)

target_link_libraries(quaternion
    PUBLIC
    vector-3d-intf
    PRIVATE
)

set_target_properties(quaternion
    PROPERTIES
    LINKER_LANGUAGE CXX
)

# Vector3d
add_library(vector-3d 
    STATIC
    Vector3D.cpp
)

target_link_libraries(vector-3d
    PUBLIC
    vector-3d-intf
    PRIVATE
)

# SVD
add_library(svd 
    STATIC
    SVD.cpp
)

target_link_libraries(svd
    PUBLIC
    vector-3d-intf
    PRIVATE
)

set_target_properties(svd
    PROPERTIES
    LINKER_LANGUAGE CXX
)

# QR (eigenvalues/eigenvectors via implicit shifted QR iteration)
add_library(qr 
    STATIC
    QR.cpp
)

target_link_libraries(qr
    PUBLIC
    vector-3d-intf
    PRIVATE
)

set_target_properties(qr
    PROPERTIES
    LINKER_LANGUAGE CXX
)

# Matrix
add_library(matrix 
    STATIC
    Matrix.cpp
)

target_link_libraries(matrix
    PUBLIC
    vector-3d-intf
    PRIVATE
    svd
    qr
)

set_target_properties(matrix
    PROPERTIES
    LINKER_LANGUAGE CXX
)