# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4

PortSystem              1.0
PortGroup               cmake 1.1
PortGroup               mpi 1.0
PortGroup               gitlab 1.0
PortGroup               boost 1.0

gitlab.instance         https://gitlab.nektar.info
gitlab.setup            nektar nektar 5.6.0 v

boost.version           1.87

name                    nektarpp
revision                4

categories              science
license                 MIT
homepage                https://www.nektar.info/
maintainers             {xyloid.org:dave @mdave} openmaintainer
description             spectral/hp element framework
long_description        Nektar++ is a spectral/hp element framework which aims to be easy \
                        to use and support a wide range of features, including 1D, 2D and \
                        3D element support, hybrid shaped elements and continuous and \
                        discontinuous implementations. As well as a modern C++ API, it \
                        ships with a range of solvers including CFD, advection-diffusion \
                        equations and cardiac electrophysiology.

# Additional dependencies for Tetgen and Triangle
master_sites            ${master_sites}:main \
                        ${homepage}thirdparty/:thirdparty

set main_distfile       ${distfiles}
distfiles               ${main_distfile}:main

checksums               nektar-5.6.0.tar.bz2 \
                        rmd160  508cebc13a9848180f6a7e49828478cbf1537450 \
                        sha256  797d4b72d0fdd80efd8b8f5e2f4a1205d7f8e3fc2c6bce6dc6fd62a688ec9d50 \
                        size    64546056 \

# Only the full Nektar++ source should be extracted - CMake will extract any
# third-party dependencies.
extract.only            ${main_distfile}

patchfiles              no-homebrew.patch

compiler.cxx_standard   2011
cmake.build_type        Release

mpi.setup

depends_lib-append      port:arpack \
                        port:fftw-3 \
                        port:opencascade \
                        port:scotch \
                        port:tetgen \
                        port:tinyxml \
                        port:triangle \
                        port:vtk \
                        port:zlib

# Don't build demos and tests by default.
configure.args-append   -DNEKTAR_BUILD_DEMOS=OFF \
                        -DNEKTAR_ERROR_ON_WARNINGS=OFF \
                        -DNEKTAR_BUILD_TESTS=OFF \
                        -DNEKTAR_BUILD_UNIT_TESTS=OFF \
                        -DNEKTAR_SOLVER_DIFFUSION=OFF \
                        -DNEKTAR_SOLVER_DUMMY=OFF \
                        -DNEKTAR_SOLVER_ELASTICITY=OFF \
                        -DNEKTAR_SOLVER_MMF=OFF \
                        -DNEKTAR_USE_ARPACK=ON \
                        -DNEKTAR_USE_FFTW=ON \
                        -DNEKTAR_USE_MESHGEN=ON \
                        -DNEKTAR_USE_SCOTCH=ON \
                        -DNEKTAR_USE_VTK=ON

variant petsc description {
    Enable PETSc support for linear algebra solvers.
} {
    depends_lib-append port:petsc

    configure.args-append \
                        -DNEKTAR_USE_PETSC=ON
}

if {[mpi_variant_isset]} {
    distfiles-append    gsmpi-1.2.1_1.tar.bz2:thirdparty
    checksums-append    gsmpi-1.2.1_1.tar.bz2 \
                        rmd160 3a1ad71c552ea9d62bebabd4ed528531f9c0eec6 \
                        sha256 c9bc966c92f45e81f4e9d1887dd7c59808e7a4ef9ec41e1e5f1e6c5c01745211 \
                        size 39737

    depends_lib-append port:hdf5

    require_active_variants hdf5 [mpi_variant_name]
    require_active_variants scotch [mpi_variant_name]

    configure.args-append \
                        -DNEKTAR_USE_HDF5=ON \
                        -DNEKTAR_USE_MPI=ON
}

variant oce description {
    use Community Edition version of OpenCASCADE
} {
    depends_lib-replace port:opencascade port:oce
}

# NOTE: v5.2.0 looking for OCE before OpenCASCADE, disable when it doesn't required
if {![variant_isset oce]} {
    post-patch {
        reinplace "/FIND_PACKAGE\(OCE /s/^/#/g" ${worksrcpath}/cmake/FindOCC.cmake
    }
}

post-extract {
    # Copy additional third-party sources into correct position.
    file mkdir ${worksrcpath}/ThirdParty
    foreach distfile ${distfiles} {
        set distfile [lindex [split ${distfile} :] 0]
        if {${distfile} ne ${main_distfile}} {
            copy ${distpath}/${distfile} ${worksrcpath}/ThirdParty/
        }
    }
}

set pythons_suffixes    {310 311 312 313}

set pythons_ports       {}
foreach s ${pythons_suffixes} {
    lappend pythons_ports python${s}
}

foreach s ${pythons_suffixes} {
    set p python${s}
    set v [string index ${s} 0].[string range ${s} 1 2]
    set pe ${prefix}/bin/python${v}
    set i [lsearch -exact ${pythons_ports} ${p}]
    set c [lreplace ${pythons_ports} ${i} ${i}]
    variant ${p} description "Build the Python ${v} bindings" conflicts {*}${c} "
        depends_lib-append      port:${p} \
                                port:py${s}-numpy \
                                port:boost[boost::version_nodot]-numpy

        configure.args-append   -DNEKTAR_BUILD_PYTHON=ON \
                                -DNEKTAR_PYTHON3_STATUS=ON \
                                -DNEKTAR_USE_PYTHON3=ON \
                                -DPYTHON_EXECUTABLE=${pe}

        # Install Python libraries using setup.py.
        post-destroot {
            system -W ${build.dir}/python \"${pe} setup.py install --root=${destroot}\"
        }

        require_active_variants boost       ${p}
        require_active_variants boost-numpy ${p}
        require_active_variants vtk         ${p}
    "
}
