# -*- 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 88228 2011-12-22 12:11:45Z ryandesign@macports.org $

PortSystem              1.0

name                    oracle-instantclient
version                 10.2.0.4.0
revision                4
set intel_version       ${version}
set powerpc_version     10.1.0.3
categories              databases
platforms               macosx
maintainers             ryandesign
homepage                http://www.oracle.com/technetwork/database/features/instant-client/
master_sites            http://download.oracle.com/otn/mac/instantclient/:powerpc \
                        http://download.oracle.com/otn/mac/instantclient/[join [lrange [split ${intel_version} .] 0 3] ""]/:intel
use_zip                 yes
use_parallel_build      no

description \
    Oracle database connection libraries

long_description \
    Oracle Instant Client allows you to run your applications without installing the standard Oracle client or having an ORACLE_HOME.

checksums \
    [suffix instantclient-basic-macosx-${powerpc_version}] \
        md5     5b38ab0565d6189d2069a4abe0bf2ab2 \
        sha1    2f3aa35e99228fd08b686b19eba84ec34db8277b \
        rmd160  d1f056f8f1b308c5493f4938b29b55fcb32452cf \
    [suffix instantclient-sdk-macosx-${powerpc_version}] \
        md5     79c7cb3f8afaff076fb20bad75b37cc9 \
        sha1    486fe1c9a6c5cfc32401e72728ff821a50a22cf9 \
        rmd160  c819db7f739b8ca468c8059dfbac31a6a6965938 \
    [suffix instantclient-basic-${intel_version}-macosx-x86] \
        md5     75a7622f6852759294df19878106cd77 \
        sha1    c5ea4ca3e55eb8f2ce83b48c268f51fbb48ff867 \
        rmd160  3ce70104dfb4a53d2adda96e6ea20bb2cf43ee6f \
    [suffix instantclient-sdk-${intel_version}-macosx-x86] \
        md5     e8b5ca3b36a1849c2ca9fa3bf7979311 \
        sha1    2505faea0e24d52d50b96dc0b22081584de714cb \
        rmd160  4eb78290b0b44e1f80edbf5e7a84552cca70ac05 \
    [suffix instantclient-basic-${intel_version}-macosx-x64] \
        md5     b88c9133c61a2e6b5584879641541d68 \
        sha1    1e9cd2d0f77c9d2212beb73cdf5876a538eb7e14 \
        rmd160  05c727d57171381c201f92079074a7d907134c2d \
    [suffix instantclient-sdk-${intel_version}-macosx-x64] \
        md5     fc70b8e5a2f3324f3ab64c0564fd70e3 \
        sha1    05968db004808c43b4cc90cea83b904e6618bc9c \
        rmd160  61b6d7059598444be54e1dd43a2e765c3793554f

#   my_arch     my_tag      my_arch_version     my_distname_format              my_worksrcdir_format    weird_prefix
set my_arch_info "
    ppc         powerpc     ${powerpc_version}  instantclient-%s-macosx-%s      instantclient%s         /b/729
    i386        intel       ${intel_version}    instantclient-%s-%s-macosx-x86  instantclient_%s        /b/32_216
    x86_64      intel       ${intel_version}    instantclient-%s-%s-macosx-x64  instantclient_%s        /b/227
"

if {"powerpc" == ${os.arch}} {
    universal_variant no
} else {
    variant universal {}
}

# merge() requires universal_archs to be set correctly. Since we use merge()
# even when not building universal we must always set universal_archs correctly.
if {[variant_isset universal]} {
    # The only supported universal build is x86_64 i386.
    configure.universal_archs x86_64 i386
} else {
    configure.universal_archs ${configure.build_arch}
}
set my_requested_archs ${configure.universal_archs}

distfiles
foreach my_requested_arch ${my_requested_archs} {
    set found 0
    foreach {my_arch my_tag my_arch_version my_distname_format my_worksrcdir_format weird_prefix} ${my_arch_info} {
        if {${my_arch} == ${my_requested_arch}} {
            set found 1
            foreach my_distfile_type {basic sdk} {
                distfiles-append [suffix [format ${my_distname_format} ${my_distfile_type} ${my_arch_version}]]:${my_tag}
            }
        }
    }
    if {0 == ${found}} {
        return -code error "${name} is not available for ${my_requested_arch}"
    }
}

pre-fetch {
    if {"darwin" != ${os.platform}} {
        ui_error "${name} requires Mac OS X."
        return -code error "incompatible operating system"
    }
    if {"i386" == ${os.arch} && ${os.major} < 9} {
        ui_error "${name} on Intel requires Mac OS X 10.5 or greater."
        return -code error "incompatible Mac OS X version"
    }
    if {"powerpc" == ${os.arch}} {
        ui_msg "Note that although the port says you're getting ${name} ${version},"
        ui_msg "on PowerPC you're actually getting version ${powerpc_version} because no newer version"
        ui_msg "is available."
        ui_msg ""
    }
    ui_warn "MacPorts may not be able to download the necessary distfiles for"
    ui_warn "${name}. If you get a checksum error, please visit this URL:"
    ui_warn ""
    ui_warn "    ${homepage}"
    ui_warn ""
    ui_warn "and download these files manually:"
    ui_warn ""
    foreach distfile ${distfiles} {
        ui_warn "    [strsed ${distfile} {/:.*$//}]"
    }
    ui_warn ""
    ui_warn "and place them in this directory:"
    ui_warn ""
    ui_warn "    ${distpath}"
}

extract {
    set my_build_dir ${extract.dir}/build
    xinstall -d ${my_build_dir}
    foreach my_requested_arch ${my_requested_archs} {
        foreach {my_arch my_tag my_arch_version my_distname_format my_worksrcdir_format weird_prefix} ${my_arch_info} {
            if {${my_arch} == ${my_requested_arch}} {
                foreach my_distfile_type {basic sdk} {
                    system "${extract.cmd} ${extract.pre_args} ${extract.post_args} ${distpath}/[suffix [format ${my_distname_format} ${my_distfile_type} ${my_arch_version}]]"
                }
                move ${extract.dir}/[format ${my_worksrcdir_format} [join [lrange [split ${my_arch_version} .] 0 1] "_"]] ${my_build_dir}/${my_arch}
            }
        }
    }
}

use_configure           no

set lib_dir ${prefix}/lib/oracle

build {
    # The pre-built libraries use weird prefixes and Oracle recommends setting
    # DYLD_LIBRARY_PATH to deal with this. I would rather fix the paths in the
    # libraries at install time.
    foreach my_requested_arch ${my_requested_archs} {
        foreach {my_arch my_tag my_arch_version my_distname_format my_worksrcdir_format weird_prefix} ${my_arch_info} {
            if {${my_arch} == ${my_requested_arch}} {
                # For each dylib in the distribution, change the directory of its own
                # "soname" to ${lib_dir}.
                foreach lib [glob -directory ${workpath}/build/${my_arch} *.dylib*] {
                    system "install_name_tool -id ${lib_dir}/[strsed ${lib} /^.*\\///] ${lib}"
                    
                    # Then for each dependent dylib with a weird path that this dylib
                    # references, fix the reference to use ${lib_dir}.
                    foreach dep [exec otool -L ${lib}] {
                        if [string match "${weird_prefix}/*" ${dep}] {
                            system "install_name_tool -change ${dep} ${lib_dir}/[strsed ${dep} /^.*\\///] ${lib}"
                        }
                    }
                }
            }
        }
    }
}

destroot {
    foreach my_requested_arch ${my_requested_archs} {
        foreach {my_arch my_tag my_arch_version my_distname_format my_worksrcdir_format weird_prefix} ${my_arch_info} {
            if {${my_arch} == ${my_requested_arch}} {
                set my_destroot ${workpath}/pre-dest/${my_arch}
                set my_worksrcpath ${workpath}/build/${my_arch}
                xinstall -d ${my_destroot}${lib_dir}
                eval xinstall \
                    [glob -directory ${my_worksrcpath} *.dylib*] \
                    [glob -directory ${my_worksrcpath} *.jar] \
                    ${my_destroot}${lib_dir}
                
                # You would think the includes should go in ${prefix}/include/oracle, but
                # the "instantclient layout" dictates they must be in ${prefix}/lib/oracle/sdk/include;
                # ports like php5-oracle will expect them there.
                xinstall -d ${my_destroot}${lib_dir}/sdk
                copy ${my_worksrcpath}/sdk/include ${my_destroot}${lib_dir}/sdk
            }
        }
    }
    
    merge ${workpath}/pre-dest
    
    # php5-oracle complains without a libclntsh.dylib symlink.
    ln -s libclntsh.dylib.10.1 ${destroot}${lib_dir}/libclntsh.dylib
    
    # Add a libocci.dylib symlink too for good measure.
    ln -s libocci.dylib.10.1 ${destroot}${lib_dir}/libocci.dylib
}

notes "
To use ${name},
export DYLD_LIBRARY_PATH=${prefix}/lib/oracle
in your environment.
"

livecheck.type          regex
livecheck.url           ${homepage}htdocs/intel_macsoft.html
livecheck.regex         instantclient-basic-(\[0-9.\]+)-macosx-x86\\.zip
