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

name                    py27-numpy
categories-append       math
license                 BSD
maintainers             {michaelld @michaelld} openmaintainer
description             The core utilities for the scientific library scipy for Python
long_description        {*}${description}

github.setup            numpy numpy 1.16.6 v
# Change github.tarball_from to 'releases' or 'archive' next update
github.tarball_from     tarball
checksums               rmd160  cbb34cf0981ea142ff45722d05a9daad20a134ea \
                        sha256  2dce87065d5de1a83485cfb3de5e4e793787890f5c1dcc3536a9cabf2e1620af \
                        size    4691852
revision                4
set PATCH_PY_EXT        ".27"
patchfiles-append       patch-cpu-detection.py.27.patch
livecheck.url           https://numpy.org/doc/stable/release.html
livecheck.regex         {(1\.16(?:\.\d+)+)}

# the python PortGroup puts compiler names in build.env and destroot.env
# for this to be done correctly, the following must be located before python.versions
pre-build    { set_compilers }
pre-destroot { set_compilers }

python.versions         27

# http://trac.macports.org/ticket/34562
python.consistent_destroot yes

# TODO: Fix the +universal variant.  This port is a fairly deep dependency and needs to be able to support +universal.
# https://trac.macports.org/ticket/48263
#universal_variant no

# some older Clang say they support SIMD when they don't
compiler.blacklist-append {clang < 1100}

# require a C/C++11 compliant compiler, to match SciPy and allow some
# older macOS to build this port.
compiler.c_standard   2011
compiler.cxx_standard 2011

# Versions prior to 1.26 don't build with Cython 3
depends_build-append    port:py${python.version}-cython-compat
set compat_path [string replace ${python.pkgd} 0 [string length ${python.prefix}]-1 ${prefix}/lib/py${python.version}-cython-compat]
build.env-append        PYTHONPATH=${compat_path}

patchfiles-append       patch-numpy_core_setup.py${PATCH_PY_EXT}.diff \
                        patch-numpy_tests_test_scripts.py${PATCH_PY_EXT}.diff \
                        patch-fcompiler_g95${PATCH_PY_EXT}.diff \
                        patch-arm64_min${PATCH_PY_EXT}.diff

if {[variant_isset atlas] || [variant_isset openblas]} {
    # force LDFLAGS for correct linking of the modules
    # for non-Apple GCC compilers
    patchfiles-append   patch-numpy_linalg_setup.py${PATCH_PY_EXT}.diff
}

compilers.setup         -clang -gcc44 -gcc45 \
                        -gcc46 -gcc47 -gcc48 -g95

# https://trac.macports.org/ticket/67136
depends_run-append      port:py${python.version}-oldest-supported-numpy

depends_lib-append      port:fftw-3 \
                        path:bin/cython-${python.branch}:py${python.version}-cython

build.env-append    SETUPTOOLS_USE_DISTUTILS=stdlib
destroot.env-append SETUPTOOLS_USE_DISTUTILS=stdlib

pre-build {
    build.env-append        ARCHFLAGS=[get_canonical_archflags ld]
}

pre-destroot {
    destroot.env-append     ARCHFLAGS=[get_canonical_archflags ld]
}

variant atlas conflicts openblas description "Use MacPorts ATLAS Libraries" {
    depends_lib-append      port:atlas
}

variant openblas conflicts atlas description "Use MacPorts OpenBLAS Libraries" {
    depends_lib-append  path:lib/libopenblas.dylib:OpenBLAS

    # See: https://trac.macports.org/ticket/66685
    supported_archs     arm64 ppc ppc64 x86_64
}

# Make +openblas a default variant, at least temporarily, to
# overcome issues with polyfit. see also:
# https://trac.macports.org/ticket/56954
# https://github.com/numpy/numpy/issues/12230
# However, +gfortran+openblas is broken on i386, see above
if {![variant_isset atlas] &&
    ![variant_isset openblas] &&
    ${configure.build_arch} ni {i386 arm64}} {
    default_variants-append +openblas
}

# when using ATLAS (whether by default or specified by the user via
# the +atlas variant) ...
if {[variant_isset atlas]} {

    # when using non-Apple GCC for universal install, it can
    # create binaries only for the native OS architecture, at
    # either 32 or 64 bits.  Restrict the supported archs
    # accordingly.
    if {${os.arch} eq "i386"} {
        supported_archs         i386 x86_64
    } elseif {${os.arch} eq "powerpc"} {
        supported_archs         ppc ppc64
    }

    pre-fetch {
        # numpy needs fortran; so we only need to check if atlas is
        # compiled with +nofortran
        if {![catch {set result [active_variants atlas "" nofortran]}]} {
            if {!$result} {
                return -code error \
                "You have selected the +atlas variant but atlas was built with +nofortran.\
                numpy needs a fortran enabled atlas. Please rebuild atlas without the +nofortran\
                variant."
            }
        }
    }

    # use MacPorts atlas
    build.env-append    OPENBLAS=None \
                        MKLROOT=None \
                        ATLAS=${prefix}/lib \
                        LAPACK=${prefix}/lib \
                        BLAS=${prefix}/lib
    destroot.env-append OPENBLAS=None \
                        MKLROOT=None \
                        ATLAS=${prefix}/lib \
                        LAPACK=${prefix}/lib \
                        BLAS=${prefix}/lib

} elseif {[variant_isset openblas]} {

    # use MacPorts OpenBLAS
    build.env-append    OPENBLAS=${prefix}/lib \
                        MKLROOT=None \
                        ATLAS=None
    destroot.env-append OPENBLAS=${prefix}/lib \
                        MKLROOT=None \
                        ATLAS=None

} else {
    # use Accelerate BLAS
    build.env-append    OPENBLAS=None \
                        ATLAS=None \
                        MKLROOT=None \
                        LAPACK=/usr/lib \
                        BLAS=/usr/lib
    destroot.env-append OPENBLAS=None \
                        ATLAS=None \
                        MKLROOT=None \
                        LAPACK=/usr/lib \
                        BLAS=/usr/lib
}

platform darwin 8 {
    if {${python.version} < 37} {
        patchfiles-append patch-Tiger-without-dflcn-header.diff
    }
}

post-patch {

    # https://trac.macports.org/ticket/46392
    if {${os.arch} eq "powerpc"} {
        reinplace "s,'-O3','-O2'," \
            ${worksrcpath}/numpy/distutils/fcompiler/gnu.py
    }

    if { [use_wrapper] } {
        # Prepare wrappers
        file copy -force ${filespath}/wrapper-template \
            ${worksrcpath}/c-wrapper
        file copy -force ${filespath}/wrapper-template \
            ${worksrcpath}/f-wrapper
        file copy -force ${filespath}/wrapper-template \
            ${worksrcpath}/cxx-wrapper

        reinplace   "s|@@@|${configure.cc}|" ${worksrcpath}/c-wrapper
        reinplace   "s|---|\\\\.c|" ${worksrcpath}/c-wrapper
        reinplace   "s|&&&|${prefix}|" ${worksrcpath}/c-wrapper

        reinplace   "s|@@@|${configure.cxx}|" ${worksrcpath}/cxx-wrapper
        reinplace   "s#---#(\\\\.C|\\\\.cpp|\\\\.cc)#" \
            ${worksrcpath}/cxx-wrapper
        reinplace   "s|&&&|${prefix}|" ${worksrcpath}/cxx-wrapper

        reinplace   "s|@@@|${configure.f90}|" ${worksrcpath}/f-wrapper
        reinplace   "s|---|\\\\.f|" ${worksrcpath}/f-wrapper
        reinplace   "s|&&&|${prefix}|" ${worksrcpath}/f-wrapper
    }

    if {[variant_isset atlas]} {
        # We must link against libSatlas or libTatlas, not libAtlas
        if {[file exists ${prefix}/lib/libtatlas.dylib]} {
            reinplace -E \
                "s|_lib_atlas = \\\['atlas'\\\]|_lib_atlas = \\\['tatlas'\\\]|" \
                ${worksrcpath}/numpy/distutils/system_info.py
        } elseif {[file exists ${prefix}/lib/libsatlas.dylib]} {
            reinplace -E \
                "s|_lib_atlas = \\\['atlas'\\\]|_lib_atlas = \\\['satlas'\\\]|" \
                ${worksrcpath}/numpy/distutils/system_info.py
        } else {
            return -code error "Unable to find Atlas dylibs. Bailing out."
        }
    }
}

if {![fortran_variant_isset]} {
    default_variants-append +gfortran
}

# determine if special wrapper values are needed for compiler names
# a procedure is needed since variants from PortGroup compilers must
# be evaluated before it can be determined if clang is being used
proc use_wrapper {} {
    global configure.cc

    if {[variant_exists universal] && [variant_isset universal]} {
        if {[variant_isset atlas]} {
            # uses fortran as a linker, which does not handle multiple -arch values properly
            return 1
        }
        if {![string match *clang* ${configure.cc}]} {
            # gcc compilers do not handle multiple -arch values properly
            return 1
        }
    }
    return 0
}

# set compiler names
proc set_compilers {} {
    global configure.cc configure.cxx configure.fc worksrcpath

    if {[use_wrapper]} {
        # override values set in compilers PortGroup
        configure.cc  ${worksrcpath}/c-wrapper
        configure.cxx ${worksrcpath}/cxx-wrapper
        configure.fc  ${worksrcpath}/f-wrapper
        configure.f77 ${worksrcpath}/f-wrapper
        configure.f90 ${worksrcpath}/f-wrapper
    }
}
