<!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 "License");
+# 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 "AS IS" 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
+
+. "${wd}/bin/_py.sh";
+
+
+echo_header () {
+ echo "$@";
+ echo "";
+}
+
+
+using_system () {
+ local name="$1"; shift;
+ echo_header "Using system version of ${name}.";
+}
+
+
+# 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="$1"; shift;
+ local default="$1"; shift;
+ if [ -z "$(eval echo "\${${var}:-}")" ]; then
+ eval "${var}=\${default:-}";
+ 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 "ldap.h"
+# Assert that ldap.h is present with a version >= 20344
+# find_header "ldap.h" 20344 "LDAP_VENDOR_VERSION"
+find_header () {
+ sys_header="$1"; shift;
+ if [ $# -ge 1 ]; then
+ min_version="$1"; shift;
+ version_macro="$1"; shift;
+ fi;
+
+ # No min_version given:
+ # Check for presence of a header. We use the "-c" cc option because we don't
+ # need to emit a file; cc exits nonzero if it can't find the header
+ if [ -z "${min_version:-}" ]; then
+ echo "#include <${sys_header}>" | cc -x c -c - -o /dev/null 2> /dev/null;
+ return "$?";
+ fi;
+
+ # Check for presence of a header of specified version
+ found_version="$(printf "#include <${sys_header}>\n${version_macro}\n" | cc -x c -E - | tail -1)";
+
+ if [ "${found_version}" == "${version_macro}" ]; then
+ # Macro was not replaced
+ return 1;
+ fi;
+
+ if cmp_version "${min_version}" "${found_version}"; then
+ return 0;
+ else
+ return 1;
+ fi;
+};
+
+
+# Initialize all the global state required to use this library.
+init_build () {
+ init_py;
+
+ verbose="";
+ do_get="true";
+ do_setup="true";
+ force_setup="false";
+
+ dev_home="${wd}/.develop";
+ dev_root="${dev_home}/root";
+ dev_libdir="${dev_root}/lib/python";
+ dev_bindir="${dev_root}/bin";
+ dep_packages="${dev_home}/pkg";
+ dep_sources="${dev_home}/src";
+
+ mkdir -p "${dep_sources}";
+
+ # These variables are defaults for things which might be configured by
+ # environment; only set them if they're un-set.
+ conditional_set wd "$(pwd)";
+
+ # 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="";
+
+ if type -ft openssl > /dev/null; then
+ if [ -z "${hash}" ]; then hash="md5"; fi;
+ md5 () { "$(type -p openssl)" dgst -md5 "$@"; }
+ elif type -ft md5 > /dev/null; then
+ if [ -z "${hash}" ]; then hash="md5"; fi;
+ md5 () { "$(type -p md5)" "$@"; }
+ elif type -ft md5sum > /dev/null; then
+ if [ -z "${hash}" ]; then hash="md5"; fi;
+ md5 () { "$(type -p md5sum)" "$@"; }
+ fi;
+
+ if type -ft sha1sum > /dev/null; then
+ if [ -z "${hash}" ]; then hash="sha1sum"; fi;
+ sha1 () { "$(type -p sha1sum)" "$@"; }
+ fi;
+ if type -ft shasum > /dev/null; then
+ if [ -z "${hash}" ]; then hash="sha1"; fi;
+ sha1 () { "$(type -p shasum)" "$@"; }
+ fi;
+
+ if [ "${hash}" == "sha1" ]; then
+ hash () { sha1 "$@"; }
+ elif [ "${hash}" == "md5" ]; then
+ hash () { md5 "$@"; }
+ elif type -t cksum > /dev/null; then
+ hash="hash";
+ hash () { cksum "$@" | cut -f 1 -d " "; }
+ elif type -t sum > /dev/null; then
+ hash="hash";
+ hash () { sum "$@" | cut -f 1 -d " "; }
+ else
+ hash () { echo "INTERNAL ERROR: No hash function."; exit 1; }
+ fi;
+}
+
+
+# If do_get is turned on, get an archive file containing a dependency via HTTP.
+www_get () {
+ if ! "${do_get}"; then return 0; fi;
+
+ local md5="";
+ local sha1="";
+
+ OPTIND=1;
+ while getopts "m:s:" option; do
+ case "${option}" in
+ 'm') md5="${OPTARG}"; ;;
+ 's') sha1="${OPTARG}"; ;;
+ esac;
+ done;
+ shift $((${OPTIND} - 1));
+
+ local name="$1"; shift;
+ local path="$1"; shift;
+ local url="$1"; shift;
+
+ if "${force_setup}" || [ ! -d "${path}" ]; then
+ local ext="$(echo "${url}" | sed 's|^.*\.\([^.]*\)$|\1|')";
+
+ untar () { tar -xvf -; }
+ unzipstream () { tmp="$(mktemp -t ccsXXXXX)"; cat > "${tmp}"; unzip "${tmp}"; rm "${tmp}"; }
+ case "${ext}" in
+ gz|tgz) decompress="gzip -d -c"; unpack="untar"; ;;
+ bz2) decompress="bzip2 -d -c"; unpack="untar"; ;;
+ tar) decompress="untar"; unpack="untar"; ;;
+ zip) decompress="cat"; unpack="unzipstream"; ;;
+ *)
+ echo "Error in www_get of URL ${url}: Unknown extension ${ext}";
+ exit 1;
+ ;;
+ esac;
+
+ echo "";
+
+ if [ -n "${dep_packages}" ] && [ -n "${hash}" ]; then
+ mkdir -p "${dep_packages}";
+
+ local cache_basename="$(echo ${name} | tr '[ ]' '_')-$(echo "${url}" | hash)-$(basename "${url}")";
+ local cache_file="${dep_packages}/${cache_basename}";
+
+ check_hash () {
+ local file="$1"; shift;
+
+ local sum="$(md5 "${file}" | perl -pe 's|^.*([0-9a-f]{32}).*$|\1|')";
+ if [ -n "${md5}" ]; then
+ echo "Checking MD5 sum for ${name}...";
+ if [ "${md5}" != "${sum}" ]; then
+ echo "ERROR: MD5 sum for downloaded file is wrong: ${sum} != ${md5}";
+ return 1;
+ fi;
+ else
+ echo "MD5 sum for ${name} is ${sum}";
+ fi;
+
+ local sum="$(sha1 "${file}" | perl -pe 's|^.*([0-9a-f]{40}).*$|\1|')";
+ if [ -n "${sha1}" ]; then
+ echo "Checking SHA1 sum for ${name}...";
+ if [ "${sha1}" != "${sum}" ]; then
+ echo "ERROR: SHA1 sum for downloaded file is wrong: ${sum} != ${sha1}";
+ return 1;
+ fi;
+ else
+ echo "SHA1 sum for ${name} is ${sum}";
+ fi;
+ }
+
+ if [ ! -f "${cache_file}" ]; then
+ echo "No cache file: ${cache_file}";
+
+ echo "Downloading ${name}...";
+
+ local pkg_host="static.calendarserver.org";
+ local pkg_path="/pkg";
+
+ #
+ # Try getting a copy from calendarserver.org.
+ #
+ local tmp="$(mktemp "/tmp/${cache_basename}.XXXXXX")";
+ curl -L "http://${pkg_host}${pkg_path}/${cache_basename}" -o "${tmp}" || true;
+ echo "";
+ if [ ! -s "${tmp}" ] || grep '<title>404 Not Found</title>' "${tmp}" > /dev/null; then
+ rm -f "${tmp}";
+ echo "${name} is not available from calendarserver.org; trying upstream source.";
+ elif ! check_hash "${tmp}"; then
+ rm -f "${tmp}";
+ echo "${name} from calendarserver.org is invalid; trying upstream source.";
+ fi;
+
+ #
+ # That didn't work. Try getting a copy from the upstream source.
+ #
+ if [ ! -f "${tmp}" ]; then
+ curl -L "${url}" -o "${tmp}";
+ echo "";
+
+ if [ ! -s "${tmp}" ] || grep '<title>404 Not Found</title>' "${tmp}" > /dev/null; then
+ rm -f "${tmp}";
+ echo "${name} is not available from upstream source: ${url}";
+ exit 1;
+ elif ! check_hash "${tmp}"; then
+ rm -f "${tmp}";
+ echo "${name} from upstream source is invalid: ${url}";
+ exit 1;
+ fi;
+
+ if egrep "^${pkg_host}" "${HOME}/.ssh/known_hosts" > /dev/null 2>&1; then
+ echo "Copying cache file up to ${pkg_host}.";
+ if ! scp "${tmp}" "${pkg_host}:/var/www/static${pkg_path}/${cache_basename}"; then
+ echo "Failed to copy cache file up to ${pkg_host}.";
+ fi;
+ echo ""
+ fi;
+ fi;
+
+ #
+ # OK, we should be good
+ #
+ mv "${tmp}" "${cache_file}";
+ else
+ #
+ # We have the file cached, just verify hash
+ #
+ if ! check_hash "${cache_file}"; then
+ exit 1;
+ fi;
+ fi;
+
+ echo "Unpacking ${name} from cache...";
+ get () { cat "${cache_file}"; }
+ else
+ echo "Downloading ${name}...";
+ get () { curl -L "${url}"; }
+ fi;
+
+ rm -rf "${path}";
+ cd "$(dirname "${path}")";
+ get | ${decompress} | ${unpack};
+ cd /;
+ fi;
+}
+
+
+# If do_get is turned on, check a name out from SVN.
+svn_get () {
+ if ! "${do_get}"; then
+ return 0;
+ fi;
+
+ local name="$1"; shift;
+ local path="$1"; shift;
+ local uri="$1"; shift;
+ local revision="$1"; shift;
+
+ if [ -d "${path}" ]; then
+ local wc_uri="$(svn info --xml "${path}" 2> /dev/null | sed -n 's|^.*<url>\(.*\)</url>.*$|\1|p')";
+
+ if "${force_setup}"; then
+ # Verify that we have a working copy checked out from the correct URI
+ if [ "${wc_uri}" != "${uri}" ]; then
+ echo "Current working copy (${path}) is from the wrong URI: ${wc_uri} != ${uri}";
+ rm -rf "${path}";
+ svn_get "${name}" "${path}" "${uri}" "${revision}";
+ return $?;
+ fi;
+
+ echo "Reverting ${name}...";
+ svn revert -R "${path}";
+
+ echo "Updating ${name}...";
+ svn update -r "${revision}" "${path}";
+ else
+ # Verify that we have a working copy checked out from the correct URI
+ if [ "${wc_uri}" != "${uri}" ]; then
+ echo "Current working copy (${path}) is from the wrong URI: ${wc_uri} != ${uri}";
+ echo "Performing repository switch for ${name}...";
+ svn switch -r "${revision}" "${uri}" "${path}";
+ else
+ local svnversion="$(svnversion "${path}")";
+ if [ "${svnversion%%[M:]*}" != "${revision}" ]; then
+ echo "Updating ${name}...";
+ svn update -r "${revision}" "${path}";
+ fi;
+ fi;
+ fi;
+ else
+ checkout () {
+ echo "Checking out ${name}...";
+ svn checkout -r "${revision}" "${uri}@${revision}" "${path}";
+ }
+
+ if [ "${revision}" != "HEAD" ] && \
+ [ -n "${dep_packages}" ] && \
+ [ -n "${hash}" ] \
+ ; then
+ local cacheid="${name}-$(echo "${uri}" | hash)";
+ local cache_file="${dep_packages}/${cacheid}@r${revision}.tgz";
+
+ mkdir -p "${dep_packages}";
+
+ if [ -f "${cache_file}" ]; then
+ echo "Unpacking ${name} from cache...";
+ mkdir -p "${path}";
+ tar -C "${path}" -xvzf "${cache_file}";
+ else
+ checkout;
+ echo "Caching ${name}...";
+ tar -C "${path}" -cvzf "${cache_file}" .;
+ 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 "$(uname -s)" in
+ Darwin|Linux)
+ ncpu="$(getconf _NPROCESSORS_ONLN)";
+ ;;
+ FreeBSD)
+ ncpu="$(sysctl hw.ncpu)";
+ ncpu="${ncpu##hw.ncpu: }";
+ ;;
+ esac;
+
+ if [ -n "${ncpu:-}" ] && [[ "${ncpu}" =~ ^[0-9]+$ ]]; then
+ make -j "${ncpu}" "$@";
+ else
+ make "$@";
+ fi;
+}
+
+# Declare a dependency on a C project built with autotools.
+c_dependency () {
+ local f_hash="";
+
+ OPTIND=1;
+ while getopts "m:s:" option; do
+ case "${option}" in
+ 'm') f_hash="-m ${OPTARG}"; ;;
+ 's') f_hash="-s ${OPTARG}"; ;;
+ esac;
+ done;
+ shift $((${OPTIND} - 1));
+
+ local name="$1"; shift;
+ local path="$1"; shift;
+ local uri="$1"; shift;
+
+ # Extra arguments are processed below, as arguments to './configure'.
+
+ srcdir="${dep_sources}/${path}";
+ # local dstroot="${srcdir}/_root";
+ local dstroot="${dev_root}";
+
+ www_get ${f_hash} "${name}" "${srcdir}" "${uri}";
+
+ export PATH="${dstroot}/bin:${PATH}";
+ export C_INCLUDE_PATH="${dstroot}/include:${C_INCLUDE_PATH:-}";
+ export LD_LIBRARY_PATH="${dstroot}/lib:${dstroot}/lib64:${LD_LIBRARY_PATH:-}";
+ export CPPFLAGS="-I${dstroot}/include ${CPPFLAGS:-} ";
+ export LDFLAGS="-L${dstroot}/lib -L${dstroot}/lib64 ${LDFLAGS:-} ";
+ export DYLD_LIBRARY_PATH="${dstroot}/lib:${dstroot}/lib64:${DYLD_LIBRARY_PATH:-}";
+ export PKG_CONFIG_PATH="${dstroot}/lib/pkgconfig:${PKG_CONFIG_PATH:-}";
+
+ if "${do_setup}"; then
+ if "${force_setup}" || [ ! -d "${dstroot}" ]; then
+ echo "Building ${name}...";
+ cd "${srcdir}";
+ ./configure --prefix="${dstroot}" "$@";
+ jmake;
+ jmake install;
+ else
+ echo "Using built ${name}.";
+ echo "";
+ fi;
+ fi;
+}
+
+
+#
+# Build C dependencies
+#
+c_dependencies () {
+
+ if find_header ldap.h 20428 LDAP_VENDOR_VERSION; then
+ using_system "OpenLDAP";
+ else
+ local v="2.4.38";
+ local n="openldap";
+ local p="${n}-${v}";
+ c_dependency -m "39831848c731bcaef235a04e0d14412f" \
+ "OpenLDAP" "${p}" \
+ "http://www.openldap.org/software/download/OpenLDAP/${n}-release/${p}.tgz" \
+ --disable-bdb --disable-hdb;
+ fi;
+
+ if find_header sasl.h; then
+ using_system "SASL";
+ else
+ local v="2.1.26";
+ local n="cyrus-sasl";
+ local p="${n}-${v}";
+ c_dependency -m "a7f4e5e559a0e37b3ffc438c9456e425" \
+ "Cyrus SASL" "${p}" \
+ "ftp://ftp.cyrusimap.org/cyrus-sasl/${p}.tar.gz";
+ fi;
+
+}
+
+
+#
+# Build Python dependencies
+#
+py_dependencies () {
+ mkdir -p "${dev_root}";
+ mkdir -p "${dev_libdir}";
+
+ export PYTHONPATH="${dev_libdir}:${PYTHONPATH:-}"
+
+ export PATH="${dev_root}/bin:${PATH}";
+ export C_INCLUDE_PATH="${dev_root}/include:${C_INCLUDE_PATH:-}";
+ export LD_LIBRARY_PATH="${dev_root}/lib:${dev_root}/lib64:${LD_LIBRARY_PATH:-}";
+ export CPPFLAGS="-I${dev_root}/include ${CPPFLAGS:-} ";
+ export LDFLAGS="-L${dev_root}/lib -L${dev_root}/lib64 ${LDFLAGS:-} ";
+ export DYLD_LIBRARY_PATH="${dev_root}/lib:${dev_root}/lib64:${DYLD_LIBRARY_PATH:-}";
+ export PKG_CONFIG_PATH="${dev_root}/lib/pkgconfig:${PKG_CONFIG_PATH:-}";
+ export CFLAGS="${CPPFLAGS} ${LDFLAGS}";
+
+ cd "${wd}";
+
+ if ! "${python}" ./setup.py develop \
+ --install-dir "${dev_libdir}" \
+ --script-dir "${dev_bindir}" \
+ > "${dev_root}/setup.log" 2>&1; then
+ err=$?;
+ echo "Unable to set up for development:"
+ cat "${dev_root}/setup.log";
+ 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 "License");
+# 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 "AS IS" 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="$1"; shift;
+ echo "$("${python}" -c "from distutils.sysconfig import get_python_version; print get_python_version()")";
+}
+
+#
+# Test if a particular python interpreter is available, given the full path to
+# that interpreter.
+#
+try_python () {
+ local python="$1"; shift;
+
+ if [ -z "${python}" ]; then
+ return 1;
+ fi;
+
+ if ! type "${python}" > /dev/null 2>&1; then
+ return 1;
+ fi;
+
+ local py_version="$(py_version "${python}")";
+ if [ "${py_version/./}" -lt "25" ]; 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 "2.7" "2.6" ""
+ do
+ for p in \
+ "${PYTHON:=}" \
+ "python${v}" \
+ "/usr/local/bin/python${v}" \
+ "/usr/local/python/bin/python${v}" \
+ "/usr/local/python${v}/bin/python${v}" \
+ "/opt/bin/python${v}" \
+ "/opt/python/bin/python${v}" \
+ "/opt/python${v}/bin/python${v}" \
+ "/Library/Frameworks/Python.framework/Versions/${v}/bin/python" \
+ "/opt/local/bin/python${v}" \
+ "/sw/bin/python${v}" \
+ ;
+ do
+ if try_python "${p}"; then
+ echo "${p}";
+ return 0;
+ fi;
+ done;
+ done;
+ return 1;
+}
+
+
+#
+# Compare version numbers
+#
+cmp_version () {
+ local v="$1"; shift;
+ local mv="$1"; shift;
+
+ local result;
+
+ while true; do
+ vh="${v%%.*}"; # Get highest-order segment
+ mvh="${mv%%.*}";
+
+ if [ "${vh}" -gt "${mvh}" ]; then
+ result=1;
+ break;
+ fi;
+
+ if [ "${vh}" -lt "${mvh}" ]; then
+ result=0;
+ break;
+ fi;
+
+ if [ "${v}" == "${v#*.}" ]; then
+ # No dots left, so we're ok
+ result=0;
+ break;
+ fi;
+
+ if [ "${mv}" == "${mv#*.}" ]; then
+ # No dots left, so we're not gonna match
+ result=1;
+ break;
+ fi;
+
+ v="${v#*.}";
+ mv="${mv#*.}";
+ 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 '"${python}"', 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="$(detect_python_version)";
+
+ # 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 "right" 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="$(type -p ${python})";
+
+ if [ -z "${python:-}" ]; then
+ echo "No suitable python found. Python 2.6+ is required.";
+ 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="$(cd "$(dirname "$0")" && pwd)";
</span><span class="cx">
</span><del>-if [ -n "${PYTHON:-}" ]; then
- python="${PYTHON}";
-else
- python=python;
-fi;
-
-##
-# Enable development mode
-##
-
-dev_root="${wd}/.develop";
-dev_libdir="${dev_root}/lib";
-dev_bindir="${dev_root}/bin";
-
-mkdir -p "${dev_root}";
-mkdir -p "${dev_libdir}";
-
-export PYTHONPATH="${dev_libdir}:${PYTHONPATH:-}"
-
-cd "${wd}";
-
-if ! ./setup.py develop \
- --install-dir "${dev_libdir}" \
- --script-dir "${dev_bindir}" \
- > "${dev_root}/setup.log" 2>&1; then
- err=$?;
- echo "Unable to set up for development:"
- cat "${dev_root}/setup.log";
- exit ${err};
-fi;
</del><ins>+. "${wd}/bin/_build.sh";
+init_build;
+c_dependencies;
+py_dependencies;
</ins></span></pre>
</div>
</div>
</body>
</html>