# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:filetype=tcl:et:sw=4:ts=4:sts=4
# $Id: Portfile 55868 2009-08-20 14:26:50Z nox@macports.org $

PortSystem      1.0

name            boost
version         1.39.0
revision        3
categories      devel
platforms       darwin
maintainers     nox openmaintainer
description     Collection of portable C++ source libraries

long_description \
    Boost provides free portable peer-reviewed C++ \
    libraries. The emphasis is on portable libraries \
    which work well with the C++ Standard Library.

homepage        http://www.boost.org
master_sites    sourceforge
distname        ${name}_[join [split ${version} .] _]
use_bzip2       yes

checksums       md5     a17281fd88c48e0d866e1a12deecbcc0 \
                sha1    6af42f74ab24ccc51589a025593bad298c8adde8 \
                rmd160  4962256b48fa8563bf373b8bed97cc8655206a51

patchfiles      patch-libs-random-random_device.cpp.diff \
                patch-layout-tagged.diff

post-extract {
    file mkdir ${worksrcpath}/libs/random/build
    copy ${filespath}/libs-random-build-Jamfile.v2 ${worksrcpath}/libs/random/build/Jamfile.v2
}

depends_build       path:bin/bjam:boost-jam

depends_lib         port:zlib \
                    port:bzip2

configure {
    reinplace -E "s|-install_name \"|&${prefix}/lib/|" \
        ${worksrcpath}/tools/build/v2/tools/darwin.jam
    write_jam "using darwin : : ${configure.cxx} ;"
}

build.cmd       bjam
build.target
build.args      -d2 \
                --layout=tagged \
                --debug-configuration \
                --ignore-site-config \
                --user-config=user-config.jam \
                --without-python \
                --without-mpi \
                -sBZIP2_INCLUDE=${prefix}/include \
                -sBZIP2_LIBPATH=${prefix}/lib \
                -sZLIB_INCLUDE=${prefix}/include \
                -sZLIB_LIBPATH=${prefix}/lib

use_parallel_build  yes

pre-build {
    set jobs ${build.jobs}
    # if set to '0', use the number of cores for the number of jobs
    if {${jobs} == 0} {
        set jobs [exec /usr/sbin/sysctl -n hw.availcpu]
    }
    if {[string is integer -strict ${jobs}] && ${jobs} > 1} {
        build.pre_args-append   -j${jobs}
    }
}

destroot.cmd        bjam
destroot.destdir    --prefix=${destroot}${prefix}

pre-destroot {
    eval destroot.args  ${build.args}
}

set pythons_suffixes {24 25 26}

set pythons_ports {}
foreach s ${pythons_suffixes} {
    lappend pythons_ports python${s}
}

proc python_dir {} {
    global pythons_suffixes
    foreach s ${pythons_suffixes} {
        if {[variant_isset python${s}]} {
            set p python[string index ${s} 0].[string index ${s} 1]
            return [file normalize [exec ${p} -c "import sys; print sys.prefix"]/lib/${p}/site-packages]
        }
    }
    error "Python support not enabled."
}

proc write_jam s {
    global worksrcpath
    set config [open ${worksrcpath}/user-config.jam a]
    puts ${config} ${s}
    close ${config}
}

foreach s ${pythons_suffixes} {
    set p python${s}
    set v [string index ${s} 0].[string index ${s} 1]
    set i [lsearch -exact ${pythons_ports} ${p}]
    set c [lreplace ${pythons_ports} ${i} ${i}]
    eval [subst {
        variant ${p} description "Build Boost.Python for Python ${v}" conflicts ${c} {
            depends_lib-append  port:${p}
            build.args-delete   --without-python

            post-configure {
                write_jam "using python : : ${prefix}/bin/python${v} ;"
            }
        }
    }]
}

variant icu description {Enable Unicode support in Boost.Regex through ICU} {
    depends_lib-append  port:icu
    build.args-append   -sICU_PATH=${prefix}
}

variant graphml description {Enable GraphML support in Boost.Graph} {
    depends_lib-append  port:expat
    build.args-append   -sEXPAT_INCLUDE=${prefix}/include \
                -sEXPAT_LIBPATH=${prefix}/lib
}

variant openmpi description {Build Boost.MPI} {
    depends_lib-append  port:openmpi
    build.args-delete   --without-mpi

    post-configure {
        write_jam "using mpi : ${prefix}/bin/openmpic++ : : ${prefix}/bin/openmpirun ;"
    }

    if {![catch python_dir]} {
        if {[variant_isset st]} {
            patchfiles-append   patch-libs-mpi-build-Jamfile.v2.diff
        }

        post-destroot {
            set site_packages [python_dir]
            xinstall -d ${destroot}${site_packages}/boost
            xinstall -m 644 ${worksrcpath}/libs/mpi/build/__init__.py \
                ${destroot}${site_packages}/boost

            set l ${site_packages}/boost/mpi.so
            move ${destroot}${prefix}/lib/mpi.so ${destroot}${l}
            system "install_name_tool -id ${l} ${destroot}${l}"
        }
    }
}

variant debug description {Build debug libraries} {
    build.args-append   variant=debug,release define=_GLIBCXX_debug
}

variant doc description {Install documentation} {
    post-destroot {
        set docdir ${prefix}/share/doc/${name}-${version}
        xinstall -d ${destroot}${docdir}
        set l [expr [string length ${worksrcpath}] + 1]
        fs-traverse f [glob -directory ${worksrcpath} *] {
            set dest ${destroot}${docdir}/[string range ${f} ${l} end]
            if {[file isdirectory ${f}]} {
                if {[file tail ${f}] eq "example"} {
                    copy ${f} ${dest}
                    continue
                }
                xinstall -d ${dest}
            } elseif {[lsearch -exact {css htm html png svg} [string range [file extension ${f}] 1 end]] != -1} {
                xinstall -m 644 ${f} ${dest}
            }
        }
    }
}

variant st description {Build single-threaded libraries} {
    build.args-append   threading=single,multi
}

variant universal {
    if {[lsearch ${universal_archs} ppc*] != -1} {
        if {[lsearch ${universal_archs} *86*] != -1} {
            build.args-append   architecture=combined
        } else {
            build.args-append   architecture=power
        }

        if {![variant_isset powerpc]} {
            build.args-append   --disable-long-double
        }
    } else {
        build.args-append   architecture=x86
    }

    if {[lsearch ${universal_archs} *64] != -1} {
        if {[lsearch ${universal_archs} i386] != -1 || [lsearch ${universal_archs} ppc] != -1} {
            build.args-append   address-model=32_64
        } else {
            build.args-append   address-model=64
        }
    } else {
        build.args-append   address-model=32
    }
}

platform powerpc {
    build.args-append   --disable-long-double
}

platform darwin 8 powerpc {
    if {[variant_isset universal]} {
        build.args-append   macosx-version=10.4
    }
}

livecheck.regex <title>${name} (\\d+\\.\\d+\\.\\d+) released
