f3c3010ffc
-t/--target is a pip option. Trying to use pip options for different meanings in pip-micropython may lead to big confusion. That's why the original passed any extra parameters using environment variables. "All options belong to pip."
88 lines
3.4 KiB
Bash
Executable File
88 lines
3.4 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# This tool can be used to install a new package into MicroPython
|
|
# library location (for unix port, default behavior), or produce
|
|
# complete library snapshot to be deployed on a device for baremetal
|
|
# ports (if PIP_MICROPY_DEST environment var is set).
|
|
#
|
|
|
|
if [ "$1" != "install" ]; then
|
|
echo "Only install command is supported currently"
|
|
exit 1
|
|
fi
|
|
shift
|
|
|
|
if [ -z "$TMPDIR" ]; then
|
|
TMPDIR=/tmp
|
|
fi
|
|
TMPVENV="$TMPDIR/pip-micropy-venv"
|
|
|
|
if [ -n "$PIP_MICROPY_DEST" ]; then
|
|
dest="$PIP_MICROPY_DEST"
|
|
echo "Destination snapshot directory: $dest"
|
|
elif [ -n "$MICROPYPATH" ]; then
|
|
libdest=$(echo "$MICROPYPATH" | awk -F: ' {print $1}')
|
|
echo "Destination library directory: $libdest"
|
|
else
|
|
echo "Warning: MICROPYPATH is not set, assuming default value"
|
|
libdest=~/.micropython/lib
|
|
echo "Destination library directory: $libdest"
|
|
fi
|
|
|
|
# Due to bugs in pip, installation should happen with active virtualenv
|
|
# The issue (at least with pip 1.0 which is still what's shipped with many
|
|
# distros) is that even if --ignore-installed is used, package is not
|
|
# installed if it's already installed for main python distribution.
|
|
if [ ! -d "$TMPVENV" ]; then
|
|
virtualenv --no-site-packages "$TMPVENV"
|
|
# distutils, setuptools, pip are buggy and allow target packages affect
|
|
# their execution environment. For example, if distribution they install
|
|
# has re.py, they will import that instead of system re. So, we need
|
|
# to remove current dir from sys.path, but that appear to be quite uneasy
|
|
# with CPython, so we hook __import__ and exterminate it persistently.
|
|
# See also https://bitbucket.org/pypa/setuptools/issue/187/
|
|
cat > $(ls -1d "$TMPVENV"/lib/python*/)/sitecustomize.py <<EOF
|
|
import sys
|
|
import __builtin__
|
|
old_imp = __import__
|
|
def new_imp(*a, **kw):
|
|
if not sys.path[0]: sys.path.pop(0)
|
|
return old_imp(*a, **kw)
|
|
__builtin__.__import__ = new_imp
|
|
EOF
|
|
fi
|
|
. "$TMPVENV"/bin/activate
|
|
|
|
# We need to specify --record to override this switch as passed by pip
|
|
# pip will try to parse this file (at the location in specifies), and try to
|
|
# access files as specified in it. But paths there will be relative to --root
|
|
# we pass, so it won't find files and crash. However, if it won't find the
|
|
# file, it will just issue a warning and continue.
|
|
if [ -n "$dest" ]; then
|
|
pip install "$@" \
|
|
--install-option="--install-base=." \
|
|
--install-option="--install-purelib=lib" \
|
|
--install-option="--install-platlib=lib" \
|
|
--install-option="--install-scripts=." \
|
|
--install-option="--install-headers=headers" \
|
|
--install-option="--install-data=lib" \
|
|
--install-option="--record=$TMPDIR/setuptools-record.txt" \
|
|
--install-option="--no-compile" \
|
|
--install-option="--root=$dest"
|
|
else
|
|
# Here we assume that base dir is lib dir, and install scripts a level
|
|
# higher. For default value of ~/.micropython/lib/ , this should give
|
|
# reasonable behavior, though better would make it overridable (or
|
|
# go bold and use ~/bin ?)
|
|
pip install "$@" \
|
|
--install-option="--install-base=." \
|
|
--install-option="--install-purelib=." \
|
|
--install-option="--install-platlib=." \
|
|
--install-option="--install-scripts=.." \
|
|
--install-option="--install-headers=../headers" \
|
|
--install-option="--install-data=." \
|
|
--install-option="--record=$TMPDIR/setuptools-record.txt" \
|
|
--install-option="--no-compile" \
|
|
--install-option="--root=$libdest"
|
|
fi
|