# -*- Mode: Tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:et:sw=4:ts=4:sts=4

PortSystem      1.0
PortGroup       compiler_blacklist_versions 1.0
PortGroup       gnu_info 1.0
PortGroup       legacysupport 1.1
PortGroup       muniversal 1.0

name            libgcrypt
version         1.11.0
revision        1
categories      devel security
# libs are LGPL, executables and docs are GPL
license         {GPL-2+ LGPL-2.1+}
maintainers     {mps @Schamschula} openmaintainer
description     Crypto library
long_description \
    Libgcrypt is a general purpose cryptographic library originally \
    based on code from GnuPG. It provides functions for all \
    cryptographic building blocks: symmetric cipher algorithms and \
    modes, hash algorithms, MACs, public key algorithms, large integer \
    functions, random numbers and a lot of supporting functions.

homepage        https://www.gnupg.org/
master_sites    gnupg
use_bzip2       yes

checksums       rmd160  6f9bd06fa04fdcb397a349a4ecdc6fcc25ac1bb5 \
                sha256  09120c9867ce7f2081d6aaa1775386b98c2f2f246135761aae47d81f58685b9c \
                size    4180345

depends_lib     port:libgpg-error

configure.args  --disable-asm

# libgcrypt detects GNU grep in $prefix/bin/ggrep when it is installed and uses
# it in its libgcrypt-config file; If GNU grep is later uninstalled, building
# against libgcrypt will fail. This can either be fixed by not relying on
# $prefix/bin/ggrep, or by declaring a runtime dependency on the grep port.
# This does the former.
configure.args-append \
                GREP="/usr/bin/grep"

# Build fix for compilers that default to c99 (clang)
configure.cflags-append "-std=gnu89"

# Some versions of gcc fail to build this for i386 including:
#     gcc-4.0 from Xcode 3.1.6 (5493) -- Note that gcc-4.0 from Xcode 2.5 (5370) works
#     gcc-4.2 from Xcode 3.1.6 (5577)
#     gcc-4.2 from Xcode 3.2.6 (5666.3)
# rijndael.c: In function 'do_aesni_ctr':
# rijndael.c:895: error: can't find a register in class 'GENERAL_REGS' while reloading 'asm'
# rijndael.c:895: error: 'asm' operand has impossible constraints
if {${build_arch} eq "i386" || ([variant_isset universal] && [lsearch ${configure.universal_archs} i386] != -1)} {
    if {[vercmp ${xcodeversion} 3.0] >= 0} {
        compiler.blacklist-append gcc-4.0
    }
    compiler.blacklist-append gcc-4.2
}

platform darwin 10 {
    # Rosetta misdetects the arch: warning: `-no-install' is ignored for x86_64-apple-darwin10.8.0
    if {${build_arch} eq "ppc"} {
        configure.args-append --build=powerpc-apple-darwin${os.major}
    }
}

if {[string match "*clang*" ${configure.compiler}]} {
    # libgcrypt-1.5.0 does some ugly stuff with their udiv_qrnnd macro in mpih-div.c
    # error: invalid use of a cast in a inline asm context requiring an l-value: remove the cast
    configure.cflags-append "-fheinous-gnu-extensions"

    compiler.blacklist-append {clang < 900}
}

use_parallel_build  yes

post-patch {
    if {[variant_exists universal] && [variant_isset universal]} {
        reinplace "s/@LIBGCRYPT_CONFIG_HOST@/${os.arch}-apple-darwin${os.major}/" ${worksrcpath}/src/libgcrypt-config.in
    }
}

# strip host= from pkgconfig file https://trac.macports.org/ticket/63635
# could be added to muniversal PG but Ryan asked that it remain in each Port needing it
# so that upstream could be notified and fix it properly
post-build {
    if {[variant_exists universal] && [variant_isset universal]} {
        set dirs {}
        foreach arch ${universal_archs_to_use} {
            lappend dirs ${worksrcpath}-${arch}
        }
    } else {
        set dirs ${worksrcpath}
    }
    foreach dir ${dirs} {
        # Remove architecture-specific differences to allow merging.
        reinplace -E {s|host=[^ ]+||g}               ${dir}/src/libgcrypt.pc
    }
}

post-destroot {
    set docdir ${prefix}/share/doc/${name}
    xinstall -d ${destroot}${docdir}
    xinstall -m 644 -W ${worksrcpath} AUTHORS COPYING COPYING.LIB ChangeLog \
        NEWS README THANKS TODO VERSION ${destroot}${docdir}
}

test.run        yes
test.target     check

gnu_info.files  ${prefix}/share/info/gcrypt.info \
                ${prefix}/share/info/gcrypt.info-1 \
                ${prefix}/share/info/gcrypt.info-2

livecheck.type  regex
livecheck.url   https://gnupg.org/ftp/gcrypt/${name}/
livecheck.regex ${name}-(\\d+\\.\\d+\\.\\d+)