1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
#!/usr/bin/env bash
# GEVENT: Taken from https://raw.githubusercontent.com/DRMacIver/hypothesis/master/scripts/install.sh
# Special license: Take literally anything you want out of this file. I don't
# care. Consider it WTFPL licensed if you like.
# Basically there's a lot of suffering encoded here that I don't want you to
# have to go through and you should feel free to use this to avoid some of
# that suffering in advance.
set -e
set -x
# Where installations go
BASE=${BUILD_RUNTIMES-$PWD/.runtimes}
PYENV=$BASE/pyenv
echo $BASE
mkdir -p $BASE
update_pyenv () {
VERSION="$1"
if [ ! -d "$PYENV/.git" ]; then
rm -rf $PYENV
git clone https://github.com/pyenv/pyenv.git $BASE/pyenv
else
if [ ! -f "$PYENV/plugins/python-build/share/python-build/$VERSION" ]; then
echo "Updating $PYENV for $VERSION"
back=$PWD
cd $PYENV
git fetch || echo "Fetch failed to complete. Ignoring"
git reset --hard origin/master
cd $back
fi
fi
}
SNAKEPIT=$BASE/snakepit
##
# install(exact-version, bin-alias, dir-alias)
#
# Produce a python executable at $SNAKEPIT/bin-alias
# having the exact version given as exact-version.
#
# Also produces a $SNAKEPIT/dir-alias/ pointing to the root
# of the python install.
##
install () {
VERSION="$1"
ALIAS="$2"
DIR_ALIAS="$3"
DESTINATION=$BASE/versions/$VERSION
mkdir -p $BASE/versions
mkdir -p $SNAKEPIT
if [ ! -e "$DESTINATION" ]; then
mkdir -p $SNAKEPIT
mkdir -p $BASE/versions
update_pyenv $VERSION
# -Ofast makes the build take too long and times out Travis. It also affects
# process-wide floating-point flags - see: https://github.com/gevent/gevent/pull/1864
CFLAGS="-O1 -pipe -march=native" $BASE/pyenv/plugins/python-build/bin/python-build $VERSION $DESTINATION
fi
# Travis CI doesn't take symlink changes (or creation!) into
# account on its caching, So we need to write an actual file if we
# actually changed something. For python version upgrades, this is
# usually handled automatically (obviously) because we installed
# python. But if we make changes *just* to symlink locations above,
# nothing happens. So for every symlink, write a file...with identical contents,
# so that we don't get *spurious* caching. (Travis doesn't check for mod times,
# just contents, so echoing each time doesn't cause it to re-cache.)
# Overwrite an existing alias.
# For whatever reason, ln -sf on Travis works fine for the ALIAS,
# but fails for the DIR_ALIAS. No clue why. So we delete an existing one of those
# manually.
if [ -L "$SNAKEPIT/$DIR_ALIAS" ]; then
rm -f $SNAKEPIT/$DIR_ALIAS
fi
ln -sfv $DESTINATION/bin/python $SNAKEPIT/$ALIAS
ln -sfv $DESTINATION $SNAKEPIT/$DIR_ALIAS
echo $VERSION $ALIAS $DIR_ALIAS > $SNAKEPIT/$ALIAS.installed
$SNAKEPIT/$ALIAS --version
$DESTINATION/bin/python --version
# Set the PATH to include the install's bin directory so pip
# doesn't nag.
# Use quiet mode for this; PyPy2 has been seen to output
# an error:
# UnicodeEncodeError: 'ascii' codec can't encode
# character u'\u258f' in position 6: ordinal not in range(128)
# https://travis-ci.org/github/gevent/gevent/jobs/699973435
PATH="$DESTINATION/bin/:$PATH" $SNAKEPIT/$ALIAS -m pip install -q --upgrade pip wheel virtualenv
ls -l $SNAKEPIT
ls -l $BASE/versions
}
for var in "$@"; do
case "${var}" in
2.7)
install 2.7.17 python2.7 2.7.d
;;
3.5)
install 3.5.9 python3.5 3.5.d
;;
3.6)
install 3.6.10 python3.6 3.6.d
;;
3.7)
install 3.7.7 python3.7 3.7.d
;;
3.8)
install 3.8.2 python3.8 3.8.d
;;
3.9)
install 3.9.0 python3.9 3.9.d
;;
pypy2.7)
install pypy2.7-7.3.1 pypy2.7 pypy2.7.d
;;
pypy3.6)
install pypy3.6-7.3.1 pypy3.6 pypy3.6.d
;;
esac
done
|