<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[12295] twext/trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.calendarserver.org//changeset/12295">12295</a></dd>
<dt>Author</dt> <dd>wsanchez@apple.com</dd>
<dt>Date</dt> <dd>2014-01-10 17:09:58 -0800 (Fri, 10 Jan 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Handle C deps</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#twexttrunkdevelop">twext/trunk/develop</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#twexttrunkbin_buildsh">twext/trunk/bin/_build.sh</a></li>
<li><a href="#twexttrunkbin_pysh">twext/trunk/bin/_py.sh</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="twexttrunkbin_buildsh"></a>
<div class="addfile"><h4>Added: twext/trunk/bin/_build.sh (0 => 12295)</h4>
<pre class="diff"><span>
<span class="info">--- twext/trunk/bin/_build.sh                                (rev 0)
+++ twext/trunk/bin/_build.sh        2014-01-11 01:09:58 UTC (rev 12295)
</span><span class="lines">@@ -0,0 +1,501 @@
</span><ins>+# -*- sh-basic-offset: 2 -*-
+##
+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+set -e
+set -u
+
+. &quot;${wd}/bin/_py.sh&quot;;
+
+
+echo_header () {
+  echo &quot;$@&quot;;
+  echo &quot;&quot;;
+}
+
+
+using_system () {
+  local name=&quot;$1&quot;; shift;
+  echo_header &quot;Using system version of ${name}.&quot;;
+}
+
+
+# Provide a default value: if the variable named by the first argument is
+# empty, set it to the default in the second argument.
+conditional_set () {
+  local var=&quot;$1&quot;; shift;
+  local default=&quot;$1&quot;; shift;
+  if [ -z &quot;$(eval echo &quot;\${${var}:-}&quot;)&quot; ]; then
+    eval &quot;${var}=\${default:-}&quot;;
+  fi;
+}
+
+
+# Checks for presence of a C header, optionally with a version comparison.
+# With only a header file name, try to include it, returning nonzero if absent.
+# With 3 params, also attempt a version check, returning nonzero if too old.
+# Param 2 is a minimum acceptable version number
+# Param 3 is a #define from the source that holds the installed version number
+# Examples:
+#   Assert that ldap.h is present
+#     find_header &quot;ldap.h&quot;
+#   Assert that ldap.h is present with a version &gt;= 20344
+#     find_header &quot;ldap.h&quot; 20344 &quot;LDAP_VENDOR_VERSION&quot;
+find_header () {
+  sys_header=&quot;$1&quot;; shift;
+  if [ $# -ge 1 ]; then
+        min_version=&quot;$1&quot;; shift;
+      version_macro=&quot;$1&quot;; shift;
+  fi;
+
+  # No min_version given:
+  # Check for presence of a header. We use the &quot;-c&quot; cc option because we don't
+  # need to emit a file; cc exits nonzero if it can't find the header
+  if [ -z &quot;${min_version:-}&quot; ]; then
+    echo &quot;#include &lt;${sys_header}&gt;&quot; | cc -x c -c - -o /dev/null 2&gt; /dev/null;
+    return &quot;$?&quot;;
+  fi;
+
+  # Check for presence of a header of specified version
+  found_version=&quot;$(printf &quot;#include &lt;${sys_header}&gt;\n${version_macro}\n&quot; | cc -x c -E - | tail -1)&quot;;
+
+  if [ &quot;${found_version}&quot; == &quot;${version_macro}&quot; ]; then
+    # Macro was not replaced
+    return 1;
+  fi;
+
+  if cmp_version &quot;${min_version}&quot; &quot;${found_version}&quot;; then
+    return 0;
+  else
+    return 1;
+  fi;
+};
+
+
+# Initialize all the global state required to use this library.
+init_build () {
+  init_py;
+
+      verbose=&quot;&quot;;
+       do_get=&quot;true&quot;;
+     do_setup=&quot;true&quot;;
+  force_setup=&quot;false&quot;;
+
+      dev_home=&quot;${wd}/.develop&quot;;
+      dev_root=&quot;${dev_home}/root&quot;;
+    dev_libdir=&quot;${dev_root}/lib/python&quot;;
+    dev_bindir=&quot;${dev_root}/bin&quot;;
+  dep_packages=&quot;${dev_home}/pkg&quot;;
+   dep_sources=&quot;${dev_home}/src&quot;;
+
+  mkdir -p &quot;${dep_sources}&quot;;
+
+  # These variables are defaults for things which might be configured by
+  # environment; only set them if they're un-set.
+  conditional_set wd &quot;$(pwd)&quot;;
+
+  # Find some hashing commands
+  # sha1() = sha1 hash, if available
+  # md5()  = md5 hash, if available
+  # hash() = default hash function
+  # $hash  = name of the type of hash used by hash()
+
+  hash=&quot;&quot;;
+
+  if type -ft openssl &gt; /dev/null; then
+    if [ -z &quot;${hash}&quot; ]; then hash=&quot;md5&quot;; fi;
+    md5 () { &quot;$(type -p openssl)&quot; dgst -md5 &quot;$@&quot;; }
+  elif type -ft md5 &gt; /dev/null; then
+    if [ -z &quot;${hash}&quot; ]; then hash=&quot;md5&quot;; fi;
+    md5 () { &quot;$(type -p md5)&quot; &quot;$@&quot;; }
+  elif type -ft md5sum &gt; /dev/null; then
+    if [ -z &quot;${hash}&quot; ]; then hash=&quot;md5&quot;; fi;
+    md5 () { &quot;$(type -p md5sum)&quot; &quot;$@&quot;; }
+  fi;
+
+  if type -ft sha1sum &gt; /dev/null; then
+    if [ -z &quot;${hash}&quot; ]; then hash=&quot;sha1sum&quot;; fi;
+    sha1 () { &quot;$(type -p sha1sum)&quot; &quot;$@&quot;; }
+  fi;
+  if type -ft shasum &gt; /dev/null; then
+    if [ -z &quot;${hash}&quot; ]; then hash=&quot;sha1&quot;; fi;
+    sha1 () { &quot;$(type -p shasum)&quot; &quot;$@&quot;; }
+  fi;
+
+  if [ &quot;${hash}&quot; == &quot;sha1&quot; ]; then
+    hash () { sha1 &quot;$@&quot;; }
+  elif [ &quot;${hash}&quot; == &quot;md5&quot; ]; then
+    hash () { md5 &quot;$@&quot;; }
+  elif type -t cksum &gt; /dev/null; then
+    hash=&quot;hash&quot;;
+    hash () { cksum &quot;$@&quot; | cut -f 1 -d &quot; &quot;; }
+  elif type -t sum &gt; /dev/null; then
+    hash=&quot;hash&quot;;
+    hash () { sum &quot;$@&quot; | cut -f 1 -d &quot; &quot;; }
+  else
+    hash () { echo &quot;INTERNAL ERROR: No hash function.&quot;; exit 1; }
+  fi;
+}
+
+
+# If do_get is turned on, get an archive file containing a dependency via HTTP.
+www_get () {
+  if ! &quot;${do_get}&quot;; then return 0; fi;
+
+  local  md5=&quot;&quot;;
+  local sha1=&quot;&quot;;
+
+  OPTIND=1;
+  while getopts &quot;m:s:&quot; option; do
+    case &quot;${option}&quot; in
+      'm')  md5=&quot;${OPTARG}&quot;; ;;
+      's') sha1=&quot;${OPTARG}&quot;; ;;
+    esac;
+  done;
+  shift $((${OPTIND} - 1));
+
+  local name=&quot;$1&quot;; shift;
+  local path=&quot;$1&quot;; shift;
+  local  url=&quot;$1&quot;; shift;
+
+  if &quot;${force_setup}&quot; || [ ! -d &quot;${path}&quot; ]; then
+    local ext=&quot;$(echo &quot;${url}&quot; | sed 's|^.*\.\([^.]*\)$|\1|')&quot;;
+
+    untar () { tar -xvf -; }
+    unzipstream () { tmp=&quot;$(mktemp -t ccsXXXXX)&quot;; cat &gt; &quot;${tmp}&quot;; unzip &quot;${tmp}&quot;; rm &quot;${tmp}&quot;; }
+    case &quot;${ext}&quot; in
+      gz|tgz) decompress=&quot;gzip -d -c&quot;; unpack=&quot;untar&quot;; ;;
+      bz2)    decompress=&quot;bzip2 -d -c&quot;; unpack=&quot;untar&quot;; ;;
+      tar)    decompress=&quot;untar&quot;; unpack=&quot;untar&quot;; ;;
+      zip)    decompress=&quot;cat&quot;; unpack=&quot;unzipstream&quot;; ;;
+      *)
+        echo &quot;Error in www_get of URL ${url}: Unknown extension ${ext}&quot;;
+        exit 1;
+        ;;
+    esac;
+
+    echo &quot;&quot;;
+
+    if [ -n &quot;${dep_packages}&quot; ] &amp;&amp; [ -n &quot;${hash}&quot; ]; then
+      mkdir -p &quot;${dep_packages}&quot;;
+
+      local cache_basename=&quot;$(echo ${name} | tr '[ ]' '_')-$(echo &quot;${url}&quot; | hash)-$(basename &quot;${url}&quot;)&quot;;
+      local cache_file=&quot;${dep_packages}/${cache_basename}&quot;;
+
+      check_hash () {
+        local file=&quot;$1&quot;; shift;
+
+        local sum=&quot;$(md5 &quot;${file}&quot; | perl -pe 's|^.*([0-9a-f]{32}).*$|\1|')&quot;;
+        if [ -n &quot;${md5}&quot; ]; then
+          echo &quot;Checking MD5 sum for ${name}...&quot;;
+          if [ &quot;${md5}&quot; != &quot;${sum}&quot; ]; then
+            echo &quot;ERROR: MD5 sum for downloaded file is wrong: ${sum} != ${md5}&quot;;
+            return 1;
+          fi;
+        else
+          echo &quot;MD5 sum for ${name} is ${sum}&quot;;
+        fi;
+
+        local sum=&quot;$(sha1 &quot;${file}&quot; | perl -pe 's|^.*([0-9a-f]{40}).*$|\1|')&quot;;
+        if [ -n &quot;${sha1}&quot; ]; then
+          echo &quot;Checking SHA1 sum for ${name}...&quot;;
+          if [ &quot;${sha1}&quot; != &quot;${sum}&quot; ]; then
+            echo &quot;ERROR: SHA1 sum for downloaded file is wrong: ${sum} != ${sha1}&quot;;
+            return 1;
+          fi;
+        else
+          echo &quot;SHA1 sum for ${name} is ${sum}&quot;;
+        fi;
+      }
+
+      if [ ! -f &quot;${cache_file}&quot; ]; then
+        echo &quot;No cache file: ${cache_file}&quot;;
+
+        echo &quot;Downloading ${name}...&quot;;
+
+        local pkg_host=&quot;static.calendarserver.org&quot;;
+        local pkg_path=&quot;/pkg&quot;;
+
+        #
+        # Try getting a copy from calendarserver.org.
+        #
+        local tmp=&quot;$(mktemp &quot;/tmp/${cache_basename}.XXXXXX&quot;)&quot;;
+        curl -L &quot;http://${pkg_host}${pkg_path}/${cache_basename}&quot; -o &quot;${tmp}&quot; || true;
+        echo &quot;&quot;;
+        if [ ! -s &quot;${tmp}&quot; ] || grep '&lt;title&gt;404 Not Found&lt;/title&gt;' &quot;${tmp}&quot; &gt; /dev/null; then
+          rm -f &quot;${tmp}&quot;;
+          echo &quot;${name} is not available from calendarserver.org; trying upstream source.&quot;;
+        elif ! check_hash &quot;${tmp}&quot;; then
+          rm -f &quot;${tmp}&quot;;
+          echo &quot;${name} from calendarserver.org is invalid; trying upstream source.&quot;;
+        fi;
+
+        #
+        # That didn't work. Try getting a copy from the upstream source.
+        #
+        if [ ! -f &quot;${tmp}&quot; ]; then
+          curl -L &quot;${url}&quot; -o &quot;${tmp}&quot;;
+          echo &quot;&quot;;
+
+          if [ ! -s &quot;${tmp}&quot; ] || grep '&lt;title&gt;404 Not Found&lt;/title&gt;' &quot;${tmp}&quot; &gt; /dev/null; then
+            rm -f &quot;${tmp}&quot;;
+            echo &quot;${name} is not available from upstream source: ${url}&quot;;
+            exit 1;
+          elif ! check_hash &quot;${tmp}&quot;; then
+            rm -f &quot;${tmp}&quot;;
+            echo &quot;${name} from upstream source is invalid: ${url}&quot;;
+            exit 1;
+          fi;
+
+          if egrep &quot;^${pkg_host}&quot; &quot;${HOME}/.ssh/known_hosts&quot; &gt; /dev/null 2&gt;&amp;1; then
+            echo &quot;Copying cache file up to ${pkg_host}.&quot;;
+            if ! scp &quot;${tmp}&quot; &quot;${pkg_host}:/var/www/static${pkg_path}/${cache_basename}&quot;; then
+              echo &quot;Failed to copy cache file up to ${pkg_host}.&quot;;
+            fi;
+            echo &quot;&quot;
+          fi;
+        fi;
+
+        #
+        # OK, we should be good
+        #
+        mv &quot;${tmp}&quot; &quot;${cache_file}&quot;;
+      else
+        #
+        # We have the file cached, just verify hash
+        #
+        if ! check_hash &quot;${cache_file}&quot;; then
+          exit 1;
+        fi;
+      fi;
+
+      echo &quot;Unpacking ${name} from cache...&quot;;
+      get () { cat &quot;${cache_file}&quot;; }
+    else
+      echo &quot;Downloading ${name}...&quot;;
+      get () { curl -L &quot;${url}&quot;; }
+    fi;
+
+    rm -rf &quot;${path}&quot;;
+    cd &quot;$(dirname &quot;${path}&quot;)&quot;;
+    get | ${decompress} | ${unpack};
+    cd /;
+  fi;
+}
+
+
+# If do_get is turned on, check a name out from SVN.
+svn_get () {
+  if ! &quot;${do_get}&quot;; then
+    return 0;
+  fi;
+
+  local     name=&quot;$1&quot;; shift;
+  local     path=&quot;$1&quot;; shift;
+  local      uri=&quot;$1&quot;; shift;
+  local revision=&quot;$1&quot;; shift;
+
+  if [ -d &quot;${path}&quot; ]; then
+    local wc_uri=&quot;$(svn info --xml &quot;${path}&quot; 2&gt; /dev/null | sed -n 's|^.*&lt;url&gt;\(.*\)&lt;/url&gt;.*$|\1|p')&quot;;
+
+    if &quot;${force_setup}&quot;; then
+      # Verify that we have a working copy checked out from the correct URI
+      if [ &quot;${wc_uri}&quot; != &quot;${uri}&quot; ]; then
+        echo &quot;Current working copy (${path}) is from the wrong URI: ${wc_uri} != ${uri}&quot;;
+        rm -rf &quot;${path}&quot;;
+        svn_get &quot;${name}&quot; &quot;${path}&quot; &quot;${uri}&quot; &quot;${revision}&quot;;
+        return $?;
+      fi;
+
+      echo &quot;Reverting ${name}...&quot;;
+      svn revert -R &quot;${path}&quot;;
+
+      echo &quot;Updating ${name}...&quot;;
+      svn update -r &quot;${revision}&quot; &quot;${path}&quot;;
+    else
+      # Verify that we have a working copy checked out from the correct URI
+      if [ &quot;${wc_uri}&quot; != &quot;${uri}&quot; ]; then
+        echo &quot;Current working copy (${path}) is from the wrong URI: ${wc_uri} != ${uri}&quot;;
+        echo &quot;Performing repository switch for ${name}...&quot;;
+        svn switch -r &quot;${revision}&quot; &quot;${uri}&quot; &quot;${path}&quot;;
+      else
+        local svnversion=&quot;$(svnversion &quot;${path}&quot;)&quot;;
+        if [ &quot;${svnversion%%[M:]*}&quot; != &quot;${revision}&quot; ]; then
+          echo &quot;Updating ${name}...&quot;;
+          svn update -r &quot;${revision}&quot; &quot;${path}&quot;;
+        fi;
+      fi;
+    fi;
+  else
+    checkout () {
+      echo &quot;Checking out ${name}...&quot;;
+      svn checkout -r &quot;${revision}&quot; &quot;${uri}@${revision}&quot; &quot;${path}&quot;;
+    }
+
+    if [ &quot;${revision}&quot; != &quot;HEAD&quot; ] &amp;&amp; \
+       [ -n &quot;${dep_packages}&quot; ] &amp;&amp; \
+       [ -n &quot;${hash}&quot; ] \
+    ; then
+      local cacheid=&quot;${name}-$(echo &quot;${uri}&quot; | hash)&quot;;
+      local cache_file=&quot;${dep_packages}/${cacheid}@r${revision}.tgz&quot;;
+
+      mkdir -p &quot;${dep_packages}&quot;;
+
+      if [ -f &quot;${cache_file}&quot; ]; then
+        echo &quot;Unpacking ${name} from cache...&quot;;
+        mkdir -p &quot;${path}&quot;;
+        tar -C &quot;${path}&quot; -xvzf &quot;${cache_file}&quot;;
+      else
+        checkout;
+        echo &quot;Caching ${name}...&quot;;
+        tar -C &quot;${path}&quot; -cvzf &quot;${cache_file}&quot; .;
+      fi;
+    else
+      checkout;
+    fi;
+  fi;
+}
+
+
+# Run 'make' with the given command line, prepending a -j option appropriate to
+# the number of CPUs on the current machine, if that can be determined.
+jmake () {
+  case &quot;$(uname -s)&quot; in
+    Darwin|Linux)
+      ncpu=&quot;$(getconf _NPROCESSORS_ONLN)&quot;;
+      ;;
+    FreeBSD)
+      ncpu=&quot;$(sysctl hw.ncpu)&quot;;
+      ncpu=&quot;${ncpu##hw.ncpu: }&quot;;
+      ;;
+  esac;
+
+  if [ -n &quot;${ncpu:-}&quot; ] &amp;&amp; [[ &quot;${ncpu}&quot; =~ ^[0-9]+$ ]]; then
+    make -j &quot;${ncpu}&quot; &quot;$@&quot;;
+  else
+    make &quot;$@&quot;;
+  fi;
+}
+
+# Declare a dependency on a C project built with autotools.
+c_dependency () {
+  local f_hash=&quot;&quot;;
+
+  OPTIND=1;
+  while getopts &quot;m:s:&quot; option; do
+    case &quot;${option}&quot; in
+      'm') f_hash=&quot;-m ${OPTARG}&quot;; ;;
+      's') f_hash=&quot;-s ${OPTARG}&quot;; ;;
+    esac;
+  done;
+  shift $((${OPTIND} - 1));
+
+  local name=&quot;$1&quot;; shift;
+  local path=&quot;$1&quot;; shift;
+  local  uri=&quot;$1&quot;; shift;
+
+  # Extra arguments are processed below, as arguments to './configure'.
+
+  srcdir=&quot;${dep_sources}/${path}&quot;;
+  # local dstroot=&quot;${srcdir}/_root&quot;;
+  local dstroot=&quot;${dev_root}&quot;;
+
+  www_get ${f_hash} &quot;${name}&quot; &quot;${srcdir}&quot; &quot;${uri}&quot;;
+
+  export              PATH=&quot;${dstroot}/bin:${PATH}&quot;;
+  export    C_INCLUDE_PATH=&quot;${dstroot}/include:${C_INCLUDE_PATH:-}&quot;;
+  export   LD_LIBRARY_PATH=&quot;${dstroot}/lib:${dstroot}/lib64:${LD_LIBRARY_PATH:-}&quot;;
+  export          CPPFLAGS=&quot;-I${dstroot}/include ${CPPFLAGS:-} &quot;;
+  export           LDFLAGS=&quot;-L${dstroot}/lib -L${dstroot}/lib64 ${LDFLAGS:-} &quot;;
+  export DYLD_LIBRARY_PATH=&quot;${dstroot}/lib:${dstroot}/lib64:${DYLD_LIBRARY_PATH:-}&quot;;
+  export PKG_CONFIG_PATH=&quot;${dstroot}/lib/pkgconfig:${PKG_CONFIG_PATH:-}&quot;;
+
+  if &quot;${do_setup}&quot;; then
+    if &quot;${force_setup}&quot; || [ ! -d &quot;${dstroot}&quot; ]; then
+      echo &quot;Building ${name}...&quot;;
+      cd &quot;${srcdir}&quot;;
+      ./configure --prefix=&quot;${dstroot}&quot; &quot;$@&quot;;
+      jmake;
+      jmake install;
+    else
+      echo &quot;Using built ${name}.&quot;;
+      echo &quot;&quot;;
+    fi;
+  fi;
+}
+
+
+#
+# Build C dependencies
+#
+c_dependencies () {
+
+  if find_header ldap.h 20428 LDAP_VENDOR_VERSION; then
+    using_system &quot;OpenLDAP&quot;;
+  else
+    local v=&quot;2.4.38&quot;;
+    local n=&quot;openldap&quot;;
+    local p=&quot;${n}-${v}&quot;;
+    c_dependency -m &quot;39831848c731bcaef235a04e0d14412f&quot; \
+      &quot;OpenLDAP&quot; &quot;${p}&quot; \
+      &quot;http://www.openldap.org/software/download/OpenLDAP/${n}-release/${p}.tgz&quot; \
+      --disable-bdb --disable-hdb;
+  fi;
+
+  if find_header sasl.h; then
+    using_system &quot;SASL&quot;;
+  else
+    local v=&quot;2.1.26&quot;;
+    local n=&quot;cyrus-sasl&quot;;
+    local p=&quot;${n}-${v}&quot;;
+    c_dependency -m &quot;a7f4e5e559a0e37b3ffc438c9456e425&quot; \
+      &quot;Cyrus SASL&quot; &quot;${p}&quot; \
+      &quot;ftp://ftp.cyrusimap.org/cyrus-sasl/${p}.tar.gz&quot;;
+  fi;
+
+}
+
+
+#
+# Build Python dependencies
+#
+py_dependencies () {
+  mkdir -p &quot;${dev_root}&quot;;
+  mkdir -p &quot;${dev_libdir}&quot;;
+
+  export PYTHONPATH=&quot;${dev_libdir}:${PYTHONPATH:-}&quot;
+
+  export              PATH=&quot;${dev_root}/bin:${PATH}&quot;;
+  export    C_INCLUDE_PATH=&quot;${dev_root}/include:${C_INCLUDE_PATH:-}&quot;;
+  export   LD_LIBRARY_PATH=&quot;${dev_root}/lib:${dev_root}/lib64:${LD_LIBRARY_PATH:-}&quot;;
+  export          CPPFLAGS=&quot;-I${dev_root}/include ${CPPFLAGS:-} &quot;;
+  export           LDFLAGS=&quot;-L${dev_root}/lib -L${dev_root}/lib64 ${LDFLAGS:-} &quot;;
+  export DYLD_LIBRARY_PATH=&quot;${dev_root}/lib:${dev_root}/lib64:${DYLD_LIBRARY_PATH:-}&quot;;
+  export PKG_CONFIG_PATH=&quot;${dev_root}/lib/pkgconfig:${PKG_CONFIG_PATH:-}&quot;;
+  export CFLAGS=&quot;${CPPFLAGS} ${LDFLAGS}&quot;;
+
+  cd &quot;${wd}&quot;;
+
+  if ! &quot;${python}&quot; ./setup.py develop   \
+      --install-dir &quot;${dev_libdir}&quot;     \
+      --script-dir &quot;${dev_bindir}&quot;      \
+      &gt; &quot;${dev_root}/setup.log&quot; 2&gt;&amp;1; then
+    err=$?;
+    echo &quot;Unable to set up for development:&quot;
+    cat &quot;${dev_root}/setup.log&quot;;
+    exit ${err};
+  fi;
+}
</ins></span></pre></div>
<a id="twexttrunkbin_pysh"></a>
<div class="addfile"><h4>Added: twext/trunk/bin/_py.sh (0 => 12295)</h4>
<pre class="diff"><span>
<span class="info">--- twext/trunk/bin/_py.sh                                (rev 0)
+++ twext/trunk/bin/_py.sh        2014-01-11 01:09:58 UTC (rev 12295)
</span><span class="lines">@@ -0,0 +1,151 @@
</span><ins>+# -*- sh-basic-offset: 2 -*-
+##
+# Copyright (c) 2005-2014 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+set -e
+set -u
+
+# Echo the major.minor version of the given Python interpreter.
+
+py_version () {
+  local python=&quot;$1&quot;; shift;
+  echo &quot;$(&quot;${python}&quot; -c &quot;from distutils.sysconfig import get_python_version; print get_python_version()&quot;)&quot;;
+}
+
+#
+# Test if a particular python interpreter is available, given the full path to
+# that interpreter.
+#
+try_python () {
+  local python=&quot;$1&quot;; shift;
+
+  if [ -z &quot;${python}&quot; ]; then
+    return 1;
+  fi;
+
+  if ! type &quot;${python}&quot; &gt; /dev/null 2&gt;&amp;1; then
+    return 1;
+  fi;
+
+  local py_version=&quot;$(py_version &quot;${python}&quot;)&quot;;
+  if [ &quot;${py_version/./}&quot; -lt &quot;25&quot; ]; then
+    return 1;
+  fi;
+  return 0;
+}
+
+
+#
+# Detect which version of Python to use, then print out which one was detected.
+#
+detect_python_version () {
+  local v;
+  local p;
+  for v in &quot;2.7&quot; &quot;2.6&quot; &quot;&quot;
+  do
+    for p in                                                            \
+      &quot;${PYTHON:=}&quot;                                                     \
+      &quot;python${v}&quot;                                                      \
+      &quot;/usr/local/bin/python${v}&quot;                                       \
+      &quot;/usr/local/python/bin/python${v}&quot;                                \
+      &quot;/usr/local/python${v}/bin/python${v}&quot;                            \
+      &quot;/opt/bin/python${v}&quot;                                             \
+      &quot;/opt/python/bin/python${v}&quot;                                      \
+      &quot;/opt/python${v}/bin/python${v}&quot;                                  \
+      &quot;/Library/Frameworks/Python.framework/Versions/${v}/bin/python&quot;   \
+      &quot;/opt/local/bin/python${v}&quot;                                       \
+      &quot;/sw/bin/python${v}&quot;                                              \
+      ;
+    do
+      if try_python &quot;${p}&quot;; then
+        echo &quot;${p}&quot;;
+        return 0;
+      fi;
+    done;
+  done;
+  return 1;
+}
+
+
+#
+# Compare version numbers
+#
+cmp_version () {
+  local  v=&quot;$1&quot;; shift;
+  local mv=&quot;$1&quot;; shift;
+
+  local result;
+
+  while true; do
+     vh=&quot;${v%%.*}&quot;; # Get highest-order segment
+    mvh=&quot;${mv%%.*}&quot;;
+
+    if [ &quot;${vh}&quot; -gt &quot;${mvh}&quot; ]; then
+      result=1;
+      break;
+    fi;
+
+    if [ &quot;${vh}&quot; -lt &quot;${mvh}&quot; ]; then
+      result=0;
+      break;
+    fi;
+
+    if [ &quot;${v}&quot; == &quot;${v#*.}&quot; ]; then
+      # No dots left, so we're ok
+      result=0;
+      break;
+    fi;
+
+    if [ &quot;${mv}&quot; == &quot;${mv#*.}&quot; ]; then
+      # No dots left, so we're not gonna match
+      result=1;
+      break;
+    fi;
+
+     v=&quot;${v#*.}&quot;;
+    mv=&quot;${mv#*.}&quot;;
+  done;
+
+  return ${result};
+}
+
+
+#
+# Detect which python to use, and store it in the 'python' variable, as well as
+# setting up variables related to version and build configuration.
+#
+init_py () {
+  # First, detect the appropriate version of Python to use, based on our version
+  # requirements and the environment.  Note that all invocations of python in
+  # our build scripts should therefore be '&quot;${python}&quot;', not 'python'; this is
+  # important on systems with older system pythons (2.4 or earlier) with an
+  # alternate install of Python, or alternate python installation mechanisms
+  # like virtualenv.
+  python=&quot;$(detect_python_version)&quot;;
+
+  # Set the $PYTHON environment variable to an absolute path pointing at the
+  # appropriate python executable, a standard-ish mechanism used by certain
+  # non-distutils things that need to find the &quot;right&quot; python.  For instance,
+  # the part of the PostgreSQL build process which builds pl_python.  Note that
+  # detect_python_version, above, already honors $PYTHON, so if this is already
+  # set it won't be stomped on, it will just be re-set to the same value.
+  export PYTHON=&quot;$(type -p ${python})&quot;;
+
+  if [ -z &quot;${python:-}&quot; ]; then
+    echo &quot;No suitable python found. Python 2.6+ is required.&quot;;
+    exit 1;
+  fi
+}
</ins></span></pre></div>
<a id="twexttrunkdevelop"></a>
<div class="modfile"><h4>Modified: twext/trunk/develop (12294 => 12295)</h4>
<pre class="diff"><span>
<span class="info">--- twext/trunk/develop        2014-01-11 00:03:44 UTC (rev 12294)
+++ twext/trunk/develop        2014-01-11 01:09:58 UTC (rev 12295)
</span><span class="lines">@@ -21,33 +21,7 @@
</span><span class="cx"> 
</span><span class="cx"> wd=&quot;$(cd &quot;$(dirname &quot;$0&quot;)&quot; &amp;&amp; pwd)&quot;;
</span><span class="cx"> 
</span><del>-if [ -n &quot;${PYTHON:-}&quot; ]; then
-  python=&quot;${PYTHON}&quot;;
-else
-  python=python;
-fi;
-
-##
-# Enable development mode
-##
-
-dev_root=&quot;${wd}/.develop&quot;;
-dev_libdir=&quot;${dev_root}/lib&quot;;
-dev_bindir=&quot;${dev_root}/bin&quot;;
-
-mkdir -p &quot;${dev_root}&quot;;
-mkdir -p &quot;${dev_libdir}&quot;;
-
-export PYTHONPATH=&quot;${dev_libdir}:${PYTHONPATH:-}&quot;
-
-cd &quot;${wd}&quot;;
-
-if ! ./setup.py develop  \
-  --install-dir &quot;${dev_libdir}&quot;   \
-  --script-dir &quot;${dev_bindir}&quot;    \
-  &gt; &quot;${dev_root}/setup.log&quot; 2&gt;&amp;1; then
-  err=$?;
-  echo &quot;Unable to set up for development:&quot;
-  cat &quot;${dev_root}/setup.log&quot;;
-  exit ${err};
-fi;
</del><ins>+. &quot;${wd}/bin/_build.sh&quot;;
+init_build;
+c_dependencies;
+py_dependencies;
</ins></span></pre>
</div>
</div>

</body>
</html>