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

PortSystem 1.0
PortGroup		compiler_blacklist_versions 1.0

name            g95
version         0.93
revision        4
platforms       darwin
categories      lang
license         GPL-2
maintainers     takeshi openmaintainer
description     Another GNU Fortran 95 compiler
long_description \
                G95 is a stable, production Fortran 95 compiler \
                available for multiple cpu architectures and operating systems. \
                Parts of the F2003 standard have been implemented in g95.
homepage        http://g95.org/
dist_subdir     ${name}/${version}

if {${os.major} < 10 || ${build_arch} eq "ppc" || ${build_arch} eq "i386"} {
    default_variants +gcc40
}

set triple ""
if {[variant_isset gcc40]} {
    set version_gcc 4.0.4
    set triple  ${os.arch}-apple-darwin${os.major}
    set dcore   gcc-core-${version_gcc}.tar.bz2
    checksums   ${dcore} md5    193e0a7a471cca70e374974bc5a60137         \
                ${dcore} sha1   55c664b33a4dc6b2130c47da28a1d6daab732ce9 \
                ${dcore} rmd160 af67dc8385942450f6b27ad83a6b9e3d22f779a1
} else {
    license         GPL-3
    set version_gcc 4.2.4
    array set barch {ppc powerpc ppc64 powerpc64 i386 i386 x86_64 x86_64}
    if {[info exists barch(${build_arch})]} {
        set triple  $barch(${build_arch})-apple-darwin${os.major}
    }
    set dcore   gcc-core-${version_gcc}.tar.bz2
    checksums   ${dcore} md5     b7a4c167f6a05301591b139b356e36d0 \
                ${dcore} sha1    540fa6949415ded321a7cbe80bbf8befe85e3566 \
                ${dcore} rmd160  d54581d0a2ecc22718e6be101c6dc524a4a88463
}
master_sites    ftp://gcc.gnu.org/pub/gcc/releases/gcc-${version_gcc}/:gcc \
                http://ftp.g95.org/v${version}/:g95
set buildhost   "--build=${triple} --host=${triple}"

set dg95        ${name}_source.tgz
set gcclib      lib/${name}/${triple}/${version_gcc}
distfiles       ${dcore}:gcc ${dg95}:g95

checksums-append    ${dg95}  md5     f9552aef0975c1dcf70950b6e6b18ff1 \
                    ${dg95}  sha1    b5e503fd6459b65cbda73190685f9490230d9cff \
                    ${dg95}  rmd160  98d03e9a1835f4b3553a72a798bdf1d90a757176

depends_build   port:ld64 port:cctools port:libtool
depends_lib     port:libiconv path:lib/libgcc/libgcc_s.1.dylib:libgcc

patchfiles      patch-Makefile.in.diff \
                patch-darwin.h.diff \
                patch-lang.opt.diff \
                patch-libf95-intrinsics-dot_product10.c.diff \
                patch-libf95-intrinsics-matmul10.c.diff \
                patch-libf95-intrinsics-random.c.diff \
                patch-libf95-io-read.c.diff \
                patch-libf95-math-ff.c.diff \
                patch-libf95-math-x87.S.diff \
                patch-libf95-quad-power16.c.diff

universal_variant no
use_parallel_build  no

extract.only    ${dg95}

post-extract {
    system "tar jxvf ${distpath}/${dcore} -C ${workpath}; \
            cd ${worksrcpath}; tar zxvf libf95.a-${version}.tar.gz"
}

pre-patch {
    ln -s ${workpath}/gcc-${version_gcc} ${worksrcpath}
}

post-patch {
    reinplace "s|gcc-lib|$name|" ${worksrcpath}/configure
    reinplace "s|gcc-lib|$name|" ${worksrcpath}/libf95.a-${version}/configure
    reinplace "s|CFLAGS_FOR_TARGET = -O2 \$(CFLAGS)|CFLAGS_FOR_TARGET = ${configure.cflags}|" ${workpath}/gcc-${version_gcc}/Makefile.in
    reinplace "s|^stage1_cflags=\"|stage1_cflags=\"${configure.cflags} ${configure.cc_archflags} |" ${workpath}/gcc-${version_gcc}/configure
    if {![variant_isset gcc40]} {
        reinplace "s|named_section|get_named_section|" ${worksrcpath}/trans-decl.c
    }
}

compiler.blacklist-append   {clang < 500}

configure.cflags-append -std=gnu89
pre-configure {
    file mkdir ${workpath}/gcc-${version_gcc}/${name}
    reinplace "s|tjmp %%edx|tjmp *%%edx|" ${workpath}/gcc-${version_gcc}/gcc/config/i386/i386.c
    if {${build_arch} eq "i386"} {
        reinplace "s|i686|i386|" ${workpath}/gcc-${version_gcc}/gcc/config/i386/darwin.h
    }
#    set gcc_configargs "--with-as=/usr/bin/as --with-ld=/usr/bin/ld --with-nm=/usr/bin/nm"
#    set gcc_configargs "--with-as=${prefix}/bin/as --with-ld=${prefix}/bin/ld --with-nm=${prefix}/bin/nm"
    system "export CC=\"${configure.cc}\"; \
            export CPPFLAGS=\"${configure.cppflags}\"; \
            export CFLAGS=\"${configure.cflags} ${configure.cc_archflags}\"; \
            export CFLAGS_FOR_BUILD=\"${configure.cflags} ${configure.cc_archflags}\"; \
            export CFLAGS_FOR_TARGET=\"${configure.cflags}\"; \
            export LDFLAGS=\"${configure.ldflags} ${configure.cc_archflags}\"; \
            export MAKEINFO=missing;\
            cd ${workpath}/gcc-${version_gcc}/${name}; \
            ../configure --prefix=${prefix}/${gcclib} \
                         --enable-languages=c \
                         --disable-multilib \
                         --with-included-gettext \
                         --with-libiconv=${prefix} \
                         --libdir=${prefix}/${gcclib} \
                         --with-as=${prefix}/bin/as \
                         --with-ld=${prefix}/bin/ld \
                         --with-nm=${prefix}/bin/nm \
                         ${buildhost}; \
            make"
    if {![variant_isset gcc40]} {
        system "cd ${workpath}/gcc-${version_gcc}/${name}/gcc; \
                ar d libbackend.a options.o; \
                cd ${workpath}/gcc-${version_gcc}/gcc/; \
                patch -p0 < ${portpath}/files/patch-gcc.c.diff" 
    }
}

configure.args  --with-gcc-dir=${workpath}/gcc-${version_gcc} ${buildhost}

post-configure {
    if {![variant_isset gcc40]} {
        reinplace "s|\(f951_LDADD\)|(f951_LDADD) ${workpath}/gcc-${version_gcc}/g95/libdecnumber/*.o|" ${worksrcpath}/Makefile
    }
}

pre-build {
    if {![variant_isset gcc40] && ${os.arch} eq "i386"} {
        reinplace "s|\(g95_LDADD\)|(g95_LDADD) ${workpath}/gcc-${version_gcc}/g95/gcc/driver-i386.o|" ${worksrcpath}/Makefile
    }
}

post-build {
    system "cd ${worksrcpath}/libf95.a-${version}; \
           export CC=\"${configure.cc}\"; \
           export CFLAGS=\"${configure.cflags} ${configure.cc_archflags}\"; \
           ./configure --prefix=${prefix} ${buildhost}; \
           make"
}

post-destroot {
    system "cd ${worksrcpath}/libf95.a-${version}; \
            make install DESTDIR=${destroot}; \
            ranlib ${destroot}${prefix}/${gcclib}/libf95.a; \
            ranlib ${destroot}${prefix}/${gcclib}/libgcc.a; \
            ranlib ${destroot}${prefix}/${gcclib}/libgcc_eh.a"
    xinstall -d ${destroot}${prefix}/share/doc/${name}
    xinstall -m 644 ${worksrcpath}/G95Manual.pdf ${destroot}${prefix}/share/doc/${name}

    ln -s ${prefix}/${gcclib}/libf95.a ${destroot}${prefix}/lib/libf95.a

    if {[variant_isset gcc40]} {
        delete ${destroot}${prefix}/${gcclib}/libgcc_s.1.0.dylib
        ln -s ${prefix}/lib/libgcc/libgcc_s.1.dylib ${destroot}${prefix}/${gcclib}/libgcc_s.1.0.dylib
    } else {
        delete ${destroot}${prefix}/${gcclib}/libgcc_s.1.dylib
        ln -s ${prefix}/lib/libgcc/libgcc_s.1.dylib ${destroot}${prefix}/${gcclib}/libgcc_s.1.dylib
    }
}

variant gcc40 description {build against gcc-4.0.x} {
    patchfiles-delete   patch-lang.opt.diff patch-darwin.h.diff
    patchfiles-append   patch-host-darwin.c.diff patch-darwin-fallback.c.diff
}

livecheck.type      regex
livecheck.url       http://g95.org/downloads.shtml
livecheck.regex     Stable version (\[0-9.\]+)