# -*- 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

# meta-version; bump whenever underlying variants are updated. Needed to
# support portindex (variants can't have different versions.)
version                 5
# Needed for change to meta-versioning
epoch                   1
name                    py-clang
python.versions         27 37 38 39
platforms               darwin
license                 NCSA
maintainers             {eborisch @eborisch} \
                        openmaintainer
description             Python bindings for clang
long_description        ${description}
homepage \
    https://github.com/llvm/llvm-project/tree/main/clang/bindings/python

supported_archs         noarch

livecheck.url           https://github.com/llvm/llvm-project/tags
# Update this to the most recent clang supported
livecheck.version       11.1.0
livecheck.regex         {releases\/tag\/llvmorg-([\d.]+)\"}

if {${name} ne ${subport}} {
    # Share llvm's downloads
    dist_subdir             llvm
    use_xz                  yes

    checksums \
     cfe-3.7.1.src.tar.xz \
      rmd160  185b0f75970bc50682766a21794440578db87b5d \
      sha256  56e2164c7c2a1772d5ed2a3e57485ff73ff06c97dff12edbeea1acc4412b0674 \
     cfe-5.0.2.src.tar.xz \
      rmd160  e4aa04b8aaa39d7c222d33b0e95b8d06c423d229 \
      sha256  fa9ce9724abdb68f166deea0af1f71ca0dfa9af8f7e1261f2cae63c280282800 \
     cfe-6.0.1.src.tar.xz \
      rmd160  c280cd2037b19f9bd733944b765f9ca23b35e0a4 \
      sha256  7c243f1485bddfdfedada3cd402ff4792ea82362ff91fbdac2dae67c6026b667 \
     cfe-7.0.1.src.tar.xz \
      rmd160  914adafed7c97e5ebab15a437670906c404cb8bd \
      sha256  a45b62dde5d7d5fdcdfa876b0af92f164d434b06e9e89b5d0b1cbc65dfe3f418 \
     cfe-8.0.1.src.tar.xz \
      rmd160  8bec1ef0e0e49000886d8caed5ef42fb56a418b2 \
      sha256  70effd69f7a8ab249f66b0a68aba8b08af52aa2ab710dfb8a0fba102685b1646 \
     clang-9.0.1.src.tar.xz \
      rmd160  424b98b3b6252f119fc06c8dfbc8fb1344531e88 \
      sha256  5778512b2e065c204010f88777d44b95250671103e434f9dc7363ab2e3804253 \
     clang-10.0.1.src.tar.xz \
      rmd160  15b8a3b6c6f1a2896146006b30fbcf104be7c2b6 \
      sha256  f99afc382b88e622c689b6d96cadfa6241ef55dca90e87fc170352e12ddb2b24 \
     clang-11.1.0.src.tar.xz \
      rmd160  6da46dc07e6ce8bf33c6342812e3c89498bb2b27 \
      sha256  0a8288f065d1f57cb6d96da4d2965cbea32edc572aa972e466e954d17148558b

    depends_build-append    port:py${python.version}-setuptools

    set clanglist       {37    50    60    70    80    90    10     11}
    set clangvlist      {3.7.1 5.0.2 6.0.1 7.0.1 8.0.1 9.0.1 10.0.1 11.1.0}

    foreach cvnum $clanglist {
        # Explictly use (and depend on) the libclang we select during install
        set cvidx [lsearch $clanglist $cvnum]
        set clang_version [lindex $clangvlist $cvidx]
        set cflist {}
        foreach v [lreplace $clanglist $cvidx $cvidx] {lappend cflist clang$v}
        if {${cvnum} < 90 && ${cvnum} >= 37} {
            set diststub cfe
        } else {
            set diststub clang
        }
        # Once clang reaches version 370, this will need to be revisited...
        if {${cvnum} >= 37} {
            set cvstr [string index $cvnum 0].[string index $cvnum 1]
        } else {
            set cvstr ${cvnum}
        }
        set substr \
          "library_path = '${prefix}/libexec/llvm-${cvstr}/lib'"
        variant clang${cvnum} description {
               Use clang${cvnum}'s libclang
        } conflicts {*}${cflist} "
            master_sites        https://releases.llvm.org/${clang_version} \
                                https://github.com/llvm/llvm-project/releases/download/llvmorg-${clang_version}
            depends_lib-append  port:clang-${cvstr}
            distfiles           ${diststub}-${clang_version}.src.tar.xz
            worksrcdir          ${diststub}-${clang_version}.src/bindings/python
            post-patch {
                reinplace {s^library_path = None^$substr^} clang/cindex.py
                reinplace {s/version=.*/version=\"${clang_version}\",/} setup.py
            }
            livecheck.version   ${clang_version}
            # Yes, I didn't bother escaping the '.'s
            livecheck.regex \
                \" ([string range $clang_version 0 2].\\\[0-9\\\]+): \"
        "
    }

    test.run            yes
    test.cmd            ${python.bin}
    test.target         -m unittest discover -v

    if {![variant_isset clang37] &&
        ![variant_isset clang50] &&
        ![variant_isset clang60] &&
        ![variant_isset clang70] &&
        ![variant_isset clang80] &&
        ![variant_isset clang90] &&
        ![variant_isset clang10] &&
        ![variant_isset clang11]} {
        default_variants +clang11
    }

    pre-extract {
        # Will never hit this when installing from packages, which is OK, as
        # they will have the default variant set above.
        if {![variant_isset clang37] &&
            ![variant_isset clang50] &&
            ![variant_isset clang60] &&
            ![variant_isset clang70] &&
            ![variant_isset clang80] &&
            ![variant_isset clang90] &&
            ![variant_isset clang10] &&
            ![variant_isset clang11]} {
            ui_error "At least one of the clangNN variants must be active."
            return -code error "Unsupported (no) variants selected."
        }
    }

    post-extract {
        file copy ${filespath}/setup.py ${worksrcpath}/
    }

    post-destroot {
        set DOCDIR ${destroot}${prefix}/share/doc/${subport}
        xinstall -d ${DOCDIR}
        file copy ${worksrcpath}/README.txt ${DOCDIR}
    }

    notes {
        The path to the selected libclang variant has been recorded in the\
        installed package. It can be overridden with:\
        cindex.set_library_(path|file)().
    }
}

foreach {old} {36} {
    subport py${old}-${python.rootname} "
        replaced_by py${python.default_version}-${python.rootname}
        PortGroup obsolete 1.0

    "
}
