# -*- 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           compilers 1.0
PortGroup           github 1.0
PortGroup           legacysupport 1.1

# getline
legacysupport.newest_darwin_requires_legacy 10

github.setup        libocca occa 2.0.0 v
name                libocca
revision            0
categories          devel parallel
license             BSD
maintainers         nomaintainer
description         Portable and vendor-neutral framework for parallel programming on heterogeneous platforms
long_description    OCCA is an open source, portable and vendor-neutral framework for parallel programming \
                    on heterogeneous platforms. The OCCA API provides unified models for heterogeneous programming \
                    concepts — such as a device, memory or kernel — while the OCCA Kernel Language (OKL) \
                    enables the creation of portable device kernels using a directive-based extension to the C language.
homepage            htpps://libocca.org
checksums           rmd160  5ef013688aed5e47fec8217d73d07a51472412c3 \
                    sha256  f2521901fed5d199193d54c7db4186479a974bdae92ac97779c47fa2bb68badd \
                    size    1142694
github.tarball_from archive

compiler.c_standard     2011
compiler.cxx_standard   2017
compiler.openmp_version 4.0
compilers.setup         require_fortran

# By default it installs into a weird location:
patchfiles-append   0001-CMakeLists-fix-install-paths.patch

# https://github.com/libocca/occa/commit/c0c601f80eff8f4eb7cc453a6a9db5bdd6554495
patchfiles-append   0002-sys.cpp-fix-macOS-without-breaking-Linux.patch

post-patch {
    reinplace "s,@DESTROOTDIR@,${destroot}${prefix}," ${worksrcpath}/CMakeLists.txt
}

pre-configure {
    # sh: /bin/ps: Operation not permitted
    append portsandbox_profile " (allow process-exec (literal \"/bin/ps\") (with no-profile))"

    configure.args-append \
                    -DOCCA_CC=${configure.cc} \
                    -DOCCA_CXX=${configure.cxx}
}

configure.args-append \
                    -DOCCA_ENABLE_FORTRAN=ON \
                    -DOCCA_ENABLE_OPENMP=ON \
                    -DOCCA_ENABLE_CUDA=OFF \
                    -DOCCA_ENABLE_DPCPP=OFF \
                    -DOCCA_ENABLE_EXAMPLES=OFF \
                    -DOCCA_ENABLE_HIP=OFF \
                    -DOCCA_ENABLE_METAL=OFF \
                    -DOCCA_ENABLE_TESTS=OFF

if {[string match *clang* ${configure.compiler}]} {
    configure.ldflags-append \
                    -L${prefix}/lib/libomp \
                    -lomp
}

# https://github.com/libocca/occa/issues/653
if {${configure.cxx_stdlib} eq "libc++"} {
    configure.ldflags-append -lc++abi -lc++
}

if {${os.platform} eq "darwin" && ${os.major} < 11} {
    configure.args-append \
                    -DOCCA_ENABLE_OPENCL=OFF
}

pre-destroot {
    xinstall -d ${destroot}${prefix}/include/occa
    xinstall -d ${destroot}${prefix}/share/occa/modulefiles
}

# Some tests fail on PPC: https://github.com/libocca/occa/issues/652
variant tests description "Build tests" {
    configure.pre_args-replace \
                    -DCMAKE_BUILD_WITH_INSTALL_RPATH:BOOL=ON \
                    -DCMAKE_BUILD_WITH_INSTALL_RPATH:BOOL=OFF
    configure.args-replace \
                    -DOCCA_ENABLE_TESTS=OFF -DOCCA_ENABLE_TESTS=ON
    test.run        yes
    test.cmd        ctest
    test.env-append OCCA_CC=${configure.cc} \
                    OCCA_CXX=${configure.cxx}
}
