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

# Keep the versions of pure and pure-docs in sync.
name                    pure
github.setup            agraef pure-lang 0.68 ${name}-
categories              lang
maintainers             {ryandesign @ryandesign} {gmail.com:aggraef @agraef}
license                 LGPL-3+ GPL-3+ BSD
use_parallel_build      yes
homepage                https://agraef.github.io/pure-lang/

description             functional programming language based on term rewriting

long_description        Pure is a functional programming language based on \
                        term rewriting. It has a modern syntax featuring \
                        curried function applications, lexical closures and \
                        equational definitions with pattern matching, and \
                        thus is somewhat similar to languages of the Haskell \
                        and ML variety. But Pure is also a very dynamic and \
                        reflective language, and is more like Lisp in this \
                        respect. The interpreter has an LLVM backend to do \
                        JIT compilation, hence programs run blazingly fast \
                        and interfacing to C modules is easy. The libraries \
                        are licensed under LGPL-3+, the interpreter is GPL-3+, \
                        and the examples are BSD-licensed.

github.tarball_from     releases
distname                ${name}-${version}

checksums               rmd160  80d85df0d3823edbfd2b8671f8f6597751025c6d \
                        sha256  cbc793490cc90e43218e177109e96ccaebf0380b39d8f2afb86b35b663e9a65f \
                        size    1517896

set llvm_version        3.4
set llvm_prefix         ${prefix}/libexec/llvm-${llvm_version}
configure.env           PATH=${llvm_prefix}/bin:$env(PATH)

# llvm-3.4 doesn't support arm64
supported_archs         ppc ppc64 i386 x86_64

if {${name} eq ${subport}} {
    revision                    4
    
    depends_lib                 port:gmp \
                                port:libffi \
                                port:libiconv \
                                port:libtool \
                                port:llvm-${llvm_version} \
                                port:mpfr \
                                port:ncurses \
                                port:readline
    
    depends_run                 port:w3m
    
    patchfiles-append           implicit.patch

    configure.args              --without-elisp \
                                --with-tool-prefix=${llvm_prefix}/bin
    
    # Explicitly disable C++11 support because Pure doesn't need it and the
    # auto-detection in the configure script gets it wrong when using clang
    # 3.3 or later with libstdc++:
    # https://bitbucket.org/purelang/pure-lang/issue/28/pure-fails-to-build-on-os-x-107-and-108
    configure.args-append       --disable-c++11
    
    # Prevent build failure when old llvm port is installed
    configure.cppflags          -I${llvm_prefix}/include ${configure.cppflags}
    configure.ldflags           -L${llvm_prefix}/lib ${configure.ldflags}

    if {[string match *clang* ${configure.cxx}] && ${configure.cxx_stdlib} ne ""} {
        configure.ldflags-append -stdlib=${configure.cxx_stdlib}
    }
    
    platform powerpc {
        configure.args-append   --disable-fastcc
    }
    
    post-destroot {
        set docdir ${destroot}${prefix}/share/doc/${name}
        xinstall -d ${docdir} ${destroot}${prefix}/share/examples
        xinstall -W ${destroot.dir} -m 0644 \
            COPYING \
            COPYING.LESSER \
            ChangeLog \
            NEWS \
            README \
            TODO \
            ${docdir}
        copy ${destroot.dir}/examples ${destroot}${prefix}/share/examples/${name}
    }

    variant pcre description {Replace POSIX regular expression support with PCRE support} {
        depends_lib-append      port:pcre
        configure.args-append   --with-pcre
    }
    
    test.run                    yes
    test.target                 check

    livecheck.url               ${github.raw}/master/pure/configure.ac
    livecheck.regex             ^AC_INIT\\(pure,\\s*[join ${github.livecheck.regex}]\\)$
} else {
    livecheck.type              none
}

subport pure-mode.el {
    revision                    0
    
    categories-append           editors
    license                     GPL-3+
    supported_archs             noarch
    platforms                   any
    homepage                    ${github.homepage}/wiki/UsingPure#pure-and-emacs
    
    description                 Emacs mode for editing Pure files
    
    long_description            ${subport} is an {*}${description}.
    
    depends_lib                 port:emacs
    
    extract.post_args-append    ${worksrcdir}/etc
    
    patchfiles-append           pure-mode.el-emacs-26.1.patch

    build.dir                   ${worksrcpath}/etc
    
    post-extract {
        copy ${build.dir}/pure-mode.el.in ${build.dir}/pure-mode.el
    }
    
    use_configure               no
    
    build {
        reinplace "s|@bindir@|${prefix}/bin|g" ${build.dir}/pure-mode.el
        reinplace "s|@libdir@|${prefix}/lib|g" ${build.dir}/pure-mode.el
        system -W ${build.dir} "${prefix}/bin/emacs -q --no-site-file -batch -eval \"(add-to-list 'load-path \\\".\\\")\" -eval \"(setq byte-compile-warnings '(callargs free-vars noruntime redefine))\" -f batch-byte-compile pure-mode.el"
    }
    
    destroot {
        set lispdir ${destroot}${prefix}/share/emacs/site-lisp
        xinstall -d ${lispdir}
        xinstall -m 0644 -W ${destroot.dir} pure-mode.el pure-mode.elc flycheck-pure.el ${lispdir}
    }
}
