# $Id: Portfile 91861 2012-04-12 02:34:17Z blair@macports.org $

PortSystem 1.0

name            ice33-cpp
version         3.3.1
categories      devel
maintainers     blair
description     Fast, object-oriented RPC for C++, Java, Python, Ruby, PHP
conflicts       ice-cpp

long_description \
        The Internet Communications Engine (Ice) is a modern alternative to \
        object middleware such as CORBA or COM/DCOM/COM+, with support for \
        C++, C#, Java, PHP, Python, Ruby and Visual Basic. \
        Ice consists of the following packages. \
        Slice: The Specification Language for Ice.  Slice establishes a \
        contract between clients and servers, and is also used to describe \
        persistent data. \
        Slice Compilers: Slice specifications are compiled into various \
        programming languages. Ice supports C++, Java, C#, Visual Basic, PHP, \
        Python and Ruby.  Ice clients and servers work together, regardless \
        of the programming language. \
        Ice: The Ice core library manages all the communication tasks using a \
        highly efficient protocol (including protocol compression and support \
        for both TCP and UDP), provides a flexible thread pool for \
        multi-threaded servers. \
        This Port provides the C++ runtime libraries, the core Slice files \
        and slice2cpp.  It also includes the slice compilers for all the \
        other languages: slice2cs, slice2java, slice2py, slice2rb and slice2vb.

homepage        http://www.zeroc.com/
master_sites    ${homepage}download/Ice/3.3/

set ice_dist    Ice-${version}${extract.suffix}

dist_subdir     ice-cpp
distname        Ice-${version}
distfiles       ${ice_dist}
patchfiles      patch-ice.cpp.config.Make.rules.diff \
                patch-ice.cpp.config.Make.rules.Darwin.diff \
                patch-ice.cpp.src.IceSSL.Instance.cpp.diff \
                patch-ice.cpp.src.slice2html.Gen.diff \
                patch-ice.cpp.src.Slice.Preprocessor.cpp.diff
checksums       ${ice_dist} \
                        md5 1f37dfcec4662fcde030553fb447d064 \
                        sha1 08d0f32bdb7d909b4a531d45cccfa97bdde649aa \
                        rmd160 d64d52c35640cebe1145e62f57618473d17cbeb5
platforms       darwin

depends_lib     port:libiconv \
                port:db46 \
                port:expat \
                port:openssl \
                port:readline \
                port:mcpp

patch {
        set cmd "cd ${workpath}/Ice-${version} && patch -p0 < ${filespath}/patch-ice.cpp.config.Make.rules.diff"
        ui_debug ${cmd}
        system ${cmd}

        set cmd "cd ${workpath}/Ice-${version} && patch -p0 < ${filespath}/patch-ice.cpp.config.Make.rules.Darwin.diff"
        ui_debug ${cmd}
        system ${cmd}

        set cmd "cd ${workpath}/Ice-${version} && patch -p1 < ${filespath}/patch-ice.cpp.src.IceSSL.Instance.cpp.diff"
        ui_debug ${cmd}
        system ${cmd}

        set cmd "cd ${workpath}/Ice-${version} && patch -p1 < ${filespath}/patch-ice.cpp.src.slice2html.Gen.diff"
        ui_debug ${cmd}
        system ${cmd}

        set cmd "cd ${workpath}/Ice-${version} && patch -p1 < ${filespath}/patch-ice.cpp.src.Slice.Preprocessor.cpp.diff"
        ui_debug ${cmd}
        system ${cmd}

        reinplace "s/-O2/-g -O2/" \
                ${workpath}/Ice-${version}/cpp/config/Make.rules.Darwin

        # It appears that the 10.4 and 10.5 installed versions of
        # ${prefix}/include/iconv.h have different definitions of
        # the inbuf parameter to iconv(), one is 'const char* * inbuf'
        # and the other is 'char* * inbuf'.  The Ice compile will
        # fail if the wrong #define is choosen by Ice.
        set fl [open ${prefix}/include/iconv.h]
        set data [read $fl]
        close $fl
        foreach line [split $data \n] {
                if {[string match "extern size_t iconv*const*" $line]} {
                        reinplace "s/_LIBICONV_VERSION < 0x010B/1/" ${workpath}/Ice-${version}/cpp/include/Ice/IconvStringConverter.h
                        break
                }
        }

        # Prevent name conflicts between libICE.* from xorg-libice and
        # libIce.* from this port by renaming libIce.* to libZeroCIce.*.
        reinplace "s/,Ice/,ZeroCIce/" \
                ${workpath}/Ice-${version}/cpp/src/Ice/Makefile
        reinplace "s/-lIce /-lZeroCIce /" \
                ${workpath}/Ice-${version}/cpp/config/Make.rules.Darwin
        foreach {f} [exec find ${workpath}/Ice-${version}/cpp -name Makefile] {
                reinplace "s/-lIce /-lZeroCIce /" ${f}
        }
}

use_configure   no

# Work around invalid C++ code by compiling with llvm-gcc-4.2 instead
# of clang.  See
# http://www.zeroc.com/forums/bug-reports/4965-slice2cpp-output-does-not-compile-standards-conformant-compiler.html
if {${configure.compiler} == "clang"} {
        configure.compiler llvm-gcc-4.2
}

build {
        set jobsargs ""
        if {${build.jobs} > 1} {
                set jobsargs " -j${build.jobs}"
        }
        set cmd "cd ${workpath}/Ice-${version}/cpp && make${jobsargs} prefix='${prefix}' embedded_runpath_prefix='${prefix}' CC='${configure.cc}' CXX='${configure.cxx}' OPTIMIZE='yes' BZIP2_HOME='${prefix}' DB_HOME='${prefix}' EXPAT_HOME='${prefix}' OPENSSL_HOME='${prefix}' READLINE_HOME='${prefix}' USE_READLINE=yes MCPP_HOME='${prefix}' LDPLATFORMFLAGS= all && cd doc && make${jobsargs}"
        ui_debug ${cmd}
        system ${cmd}
}

test.dir        ${worksrcpath}/cpp
test.run        yes
test.target     test

destroot.dir    ${worksrcpath}/cpp
destroot.target prefix="${destroot}${prefix}" \
                embedded_runpath_prefix="${prefix}" \
                create_runpath_symlink=no \
                OPTIMIZE="yes" \
                BZIP2_HOME="${prefix}" \
                DB_HOME="${prefix}" \
                EXPAT_HOME="${prefix}" \
                OPENSSL_HOME="${prefix}" \
                READLINE_HOME="${prefix}" \
                USE_READLINE=yes \
                MCPP_HOME="${prefix}" \
                install

post-destroot {
        set cppdir ${workpath}/Ice-${version}/cpp
        set sharedir ${destroot}${prefix}/share
        set docdir ${sharedir}/doc/${name}

        xinstall -m 755 -d ${sharedir}/ice
        file rename ${destroot}${prefix}/config ${sharedir}/ice
        file rename ${destroot}${prefix}/slice ${sharedir}/slice

        xinstall -m 755 -d ${docdir}
        file rename ${destroot}${prefix}/ICE_LICENSE ${docdir}
        file rename ${destroot}${prefix}/LICENSE ${docdir}
        file copy ${cppdir}/doc/reference ${docdir}

        foreach f {CHANGES RELEASE_NOTES} {
                file copy ${workpath}/Ice-${version}/${f} ${docdir}
        }

        if {[variant_isset demo_source_code]} {
                system "cd ${cppdir}/demo && make clean"
                file copy ${cppdir}/demo $docdir
        }
}

variant demo_source_code description {Install demonstration C++ code} {
}
