# -*- 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: Portfile 105081 2013-04-09 08:16:28Z takeshi@macports.org $

PortSystem                  1.0
PortGroup                   conflicts_build 1.0

name                        ncarg
version                     6.1.2
revision                    2
categories                  science
maintainers                 takeshi
license                     {UCAR-Unidata public-domain BSD LGPL-3 GPL-3}
description                 language for scientific data processing and visualization
long_description \
    The NCAR Command Language (NCL), a product of           \
    the Computational & Information Systems Laboratory      \
    at the National Center for Atmospheric Research (NCAR)  \
    and sponsored by the National Science Foundation,       \
    is a free interpreted language designed specifically    \
    for scientific data processing and visualization.

homepage                    http://www.ncl.ucar.edu/
platforms                   darwin
master_sites                http://www.earthsystemgrid.org/:ncl \
                            http://www.ncl.ucar.edu/Download/files/:g2clib

distname                    ncl_${name}-${version}
worksrcdir                  ncl_${name}-${version}
set ncl_src             ${distname}${extract.suffix}
set g2clib_version      1.2.3
set g2clib_src          g2clib-${g2clib_version}-patch${extract.suffix}
set g2clib_worksrcdir   g2clib-${g2clib_version}-patch
distfiles           ${ncl_src}:ncl \
                    ${g2clib_src}:g2clib
checksums           ncl_ncarg-6.1.0.tar.gz \
                    g2clib-1.2.3-patch.tar.gz \

checksums   ${ncl_src} \
                    md5     a13d4a97d1d580a24fe144d127e4ce31 \
                    sha1    c8d3447f97af017a72f7c2222e0fadca913d1c8f \
                    rmd160  9b9f87111914c261d9486f987a12bb5e76bf99ad \
            ${g2clib_src} \
                    md5     43eb24f168300f34e0d4e5a7260aba59 \
                    sha1    5da7cc7319253b80ee0d9693753212d33f32c2b0 \
                    rmd160  e67d9430bb03a255716763f72e31eddb6d1d5516

depends_lib                 path:lib/pkgconfig/cairo.pc:cairo \
                            port:proj       \
                            port:gdal       \
                            port:udunits2   \
                            port:vis5d      \
                            port:hdfeos     \
                            port:hdfeos5    \
                            port:wgrib2     \
                            port:curl       \
                            port:libxml2    \
                            port:xorg-libXaw
depends_build               port:triangle \
                            port:flex

use_parallel_build          no
universal_variant           no

pre-fetch {
    if {![file exists ${distpath}/${distname}${extract.suffix}]} {
        xinstall -d ${distpath}
        ui_error "Download ${distname}${extract.suffix} manually and place it in ${distpath}.\n \
            See instructions on ${homepage}/Download/index.shtml"
    }
}

set usedap y

if {$build_arch eq "x86_64"} {
    patchfiles-append           patch-config-ymake.diff
}

post-patch {
    reinplace "s|hdf/||" ${worksrcpath}/ni/src/ncl/FileSupport.c
    reinplace "s| -lsz||g" ${worksrcpath}/Configure
    reinplace "s| -lsz||g" ${worksrcpath}/config/Project
    reinplace "s|g\\\\+\\\\+|${configure.cc}|" ${worksrcpath}/ni/src/ncl/yMakefile
    reinplace "s|INC=-I/usr/local/include|INC=${configure.cppflags} ${configure.cflags}|" ${workpath}/${g2clib_worksrcdir}/makefile
    reinplace "s|CC=gcc -fPIC|CC=${configure.cc}|" ${workpath}/${g2clib_worksrcdir}/makefile
    if {$build_arch eq "x86_64" || $build_arch eq "ppc64"} {
        reinplace "s|-DUSE_PNG$|-DUSE_PNG -D__64BIT__|" ${workpath}/${g2clib_worksrcdir}/makefile
    }
    if {[variant_isset g95]} {
        set fortranlib -lf95
    } elseif {[variant_isset gcc43]} {
        set fortranlib  "-L${prefix}/lib/gcc43 -lgfortran"
    } elseif {[variant_isset gcc44]} {
        set fortranlib  "-L${prefix}/lib/gcc44 -lgfortran"
    } elseif {[variant_isset gcc45]} {
        set fortranlib  "-L${prefix}/lib/gcc45 -lgfortran"
    } elseif {[variant_isset gcc46]} {
        set fortranlib  "-L${prefix}/lib/gcc46 -lgfortran"
    } elseif {[variant_isset gcc47]} {
        set fortranlib  "-L${prefix}/lib/gcc47 -lgfortran"
    } 
    foreach f {Darwin Darwin_Intel} {
        reinplace "s|-lgfortran|${fortranlib}|" ${worksrcpath}/config/${f}
        reinplace "s| gfortran$| ${configure.fc}|" ${worksrcpath}/config/${f} 
        reinplace "s|gcc$|${configure.cc}|" ${worksrcpath}/config/${f}
        reinplace "/CcOptions/d" ${worksrcpath}/config/${f}
        reinplace "/ArchRecLibSearch/d" ${worksrcpath}/config/${f}
        reinplace "/ArchRecIncSearch/d" ${worksrcpath}/config/${f}
        reinplace "s|-lXext$|-lXext\\
#define ArchRecLibSearch    -L${prefix}/lib\\
#define ArchRecIncSearch    -I${prefix}/include\\
#define CcOptions -fPIC -ansi -D_DARWIN_C_SOURCE \\
#define COptimizeFlag ${configure.cflags}\\
#define FOptimizeFlag ${configure.fflags}\\
#define ManRoot ${destroot}${prefix}/share/man\\
#define NetCDFlib -lnetcdf\\
#define HDFEOS5lib -lhe5_hdfeos -lGctp -lhdf5|" ${worksrcpath}/config/${f}
# A workaround for XQuartz 2.7.3 on Mountain Lion known as ncl.xq.fix
        if {${os.version}>=12} {
            reinplace "s|-D__UNIXOS2__|-D__UNIXOS2__ -D__JIRA1530__|" ${worksrcpath}/config/${f}
        }
    }
    if {[variant_isset g95]} {
        reinplace "s|-fno-range-check||" ${worksrcpath}/config/Darwin_Intel
    }
    foreach f {ni/src/ncl/NclHDF.c \
           ni/src/ncl/NclHDFEOS.c \
           ni/src/ncl/NclHDFEOS5.c \
           ncarview/src/lib/libncarg_ras/hdf.c} {
        reinplace "s|hdf\/||" ${worksrcpath}/${f}
    }
    reinplace "s|\$\(NCARGGKSCAIROLIB\) \$\(NCARGCLIB\)|\$(NCARGGKSCAIROLIB) \$(NCARGGKSLIB) \$(NCARGCLIB)|" ${worksrcpath}/config/Project
    foreach exlib {sphere3.1_dp fftpack5_dp} {
        reinplace "s|-l${exlib}|\$(EXTERNALSRC)/${exlib}/lib${exlib}.a|g" ${worksrcpath}/config/Project
    }
    if {[variant_isset accelerate]} {
        reinplace "s|-llapack_ncl|-framework Accelerate|g" ${worksrcpath}/config/Project
        if {[variant_isset g95] || ([string match *64* $build_arch] && ${os.major} >= 10)} {
            reinplace "s|-lblas_ncl|-ldotwrp -framework Accelerate|g" ${worksrcpath}/config/Project
        } else {
            reinplace "s|-lblas_ncl|-framework Accelerate|g" ${worksrcpath}/config/Project
        }
        foreach f {Darwin Darwin_Intel} {
            reinplace "/LAPACKLIB/d" ${worksrcpath}/config/${f}
            reinplace "/BLASLIB/d" ${worksrcpath}/config/${f}
        }
        reinplace "s|-L\$(LAPACKSRC)||" ${worksrcpath}/config/Project
        reinplace "s|-L\$(BLASSRC)||" ${worksrcpath}/config/Project
        reinplace "s|blas lapack ||" ${worksrcpath}/external/yMakefile
    } else {
        foreach exlib {lapack blas} {
            reinplace "s|-l${exlib}_ncl|\$(EXTERNALSRC)/${exlib}/lib${exlib}_ncl.a|g" ${worksrcpath}/config/Project
        }
    }
}

# clang fails to build ncl
if {${os.major}>=10} {
    configure.compiler  llvm-gcc-4.2
}

pre-configure {
    system "cd ${workpath}/${g2clib_worksrcdir}; make all"
    file copy ${workpath}/${g2clib_worksrcdir}/libgrib2c.a ${worksrcpath}
    system "cd ${worksrcpath}/config; \
        CC=${configure.cc} \
        CFLAGS=${configure.cflags} \
        make -f Makefile.ini; \
        ./ymake -config `pwd`"
    foreach ext "c h" {
      file copy ${prefix}/share/triangle/triangle.${ext} ${worksrcpath}/ni/src/lib/hlu
    }
}
configure {
    system "cd ${worksrcpath}; ./Configure -v << EOF


y
${destroot}${prefix}

y
y
y
y
y
y
y
y
y
y
y
y
y
y
${worksrcpath} ${prefix}/lib ${prefix}/lib/hdfeos5/lib ${prefix}/lib
${prefix}/include/freetype2 ${prefix}/include/udunits2 ${prefix}/lib/hdfeos5/include ${prefix}/include


EOF"
}
post-configure {
#    reinplace "s| -lsz||g" ${worksrcpath}/makefile
#    reinplace "s| -lsz||g" ${worksrcpath}/config/Site.local
    system "cd ${worksrcpath}; make Info"
    system "cat ${worksrcpath}/config/Site.local"
}

build.target                Build
if {${os.major}<10} {
    if {[variant_isset g95]} {
        build.args-append           EXTRA_CCOPTIONS=\"${configure.cc_archflags}\"
    } else {
        if {[string match *64* $build_arch]} {
            build.args-append       EXTRA_CCOPTIONS=-m64
        } else {
            build.args-append       EXTRA_CCOPTIONS=-m32
        }
    }
}

# The build script ignores the build errors.
# Check if ncl is built here.
post-build {
    if {![file exists ${worksrcpath}/ni/src/ncl/ncl]} {
        ui_error "ncl did not built"
    }
}

variant g95 conflicts gcc43 gcc44 gcc45 gcc46 gcc47 description {compile with g95} {
    configure.fc            ${prefix}/bin/g95
    depends_build-append    port:g95
    configure.fflags-append -fno-second-underscore
}

variant gcc43 conflicts gcc44 gcc45 gcc46 gcc47 g95 description {compile with gcc 4.3} {
    configure.compiler      macports-gcc-4.3
    depends_build-append    port:gcc43
}

variant gcc44 conflicts gcc43 gcc45 gcc46 gcc47 g95 description {compile with gcc 4.4} {
    configure.compiler      macports-gcc-4.4
    depends_build-append    port:gcc44
}

variant gcc45 conflicts gcc43 gcc44 gcc46 gcc47 g95 description {compile with gcc 4.5} {
    configure.compiler      macports-gcc-4.5
    depends_build-append    port:gcc45
}

variant gcc46 conflicts gcc43 gcc44 gcc45 gcc47 g95 description {compile with gcc 4.6} {
    configure.compiler      macports-gcc-4.6
    depends_build-append    port:gcc46
}

variant gcc47 conflicts gcc43 gcc44 gcc45 gcc46 g95 description {compile with gcc 4.7} {
    configure.compiler      macports-gcc-4.7
    depends_build-append    port:gcc47
}

if {![variant_isset gcc43] && ![variant_isset gcc44] && ![variant_isset gcc45] && ![variant_isset gcc46] && ![variant_isset g95]} {
    default_variants +gcc47
}

# ncarg fails to build some binaries with xnu-headers installed 
# See #38687
if {[variant_isset g95]} {
    conflicts_build-append xnu-headers
}

variant accelerate description {use Accelerate.framework} {
    if {![variant_isset g95]} {
        configure.fflags-append -ff2c
    }
    if {[variant_isset g95] || ([string match *64* $build_arch] && ${os.major} >= 10)} {
        depends_lib-append      port:dotwrp
    }
}

livecheck.type              regex
livecheck.url               ${homepage}
livecheck.regex             {Current Version:.* .*([0-9]+\.[0-9]+\.[0-9]+)}
