mirror of
https://github.com/kennethreitz/heroku-buildpack-python.git
synced 2026-06-05 23:10:16 +00:00
221722fb27
With inspiration from @KevinBrolly, this patch uses the stack image SQLite3 package but also still providing the dev headers and binary that users may still be using today. The benefit is that we won't need to rebuild all the python binaries for this to take affect. We can just stop shipping SQLite3 from future binaries. In addition, we don't need to worry about what version and when to update SQLite3 and maintaining the packages ourselves. This also includes updates to Python 2.7.15 and Python 3.6.6 so they can rebuilt with the stack image dev headers instead of building our own vendored SQLite3.
88 lines
3.2 KiB
Bash
88 lines
3.2 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
# shellcheck source=bin/utils
|
|
source "$BIN_DIR/utils"
|
|
|
|
sqlite3_version() {
|
|
SQLITE3_VERSION=${SQLITE3_VERSION:-$(dpkg -s libsqlite3-0 | grep Version | sed 's/Version: //')}
|
|
|
|
export SQLITE3_VERSION
|
|
}
|
|
|
|
sqlite3_install() {
|
|
HEROKU_PYTHON_DIR="$1"
|
|
SQLITE3_VERSION="$2"
|
|
HEADERS_ONLY="$3"
|
|
|
|
mkdir -p "$HEROKU_PYTHON_DIR"
|
|
|
|
APT_CACHE_DIR="$HEROKU_PYTHON_DIR/apt/cache"
|
|
APT_STATE_DIR="$HEROKU_PYTHON_DIR/apt/state"
|
|
|
|
mkdir -p "$APT_CACHE_DIR/archives/partial"
|
|
mkdir -p "$APT_STATE_DIR/lists/partial"
|
|
|
|
APT_OPTIONS="-o debug::nolocking=true"
|
|
APT_OPTIONS="$APT_OPTIONS -o dir::cache=$APT_CACHE_DIR"
|
|
APT_OPTIONS="$APT_OPTIONS -o dir::state=$APT_STATE_DIR"
|
|
APT_OPTIONS="$APT_OPTIONS -o dir::etc::sourcelist=/etc/apt/sources.list"
|
|
|
|
apt-get $APT_OPTIONS update > /dev/null 2>&1
|
|
if [ -z "$HEADERS_ONLY" ]; then
|
|
apt-get $APT_OPTIONS -y -d --reinstall install libsqlite3-dev="$SQLITE3_VERSION" sqlite3="$SQLITE3_VERSION" > /dev/null 2>&1
|
|
else
|
|
apt-get $APT_OPTIONS -y -d --reinstall install libsqlite3-dev="$SQLITE3_VERSION"
|
|
fi
|
|
|
|
find "$APT_CACHE_DIR/archives/" -name "*.deb" -exec dpkg -x {} "$HEROKU_PYTHON_DIR/sqlite3/" \;
|
|
|
|
mkdir -p "$HEROKU_PYTHON_DIR/include"
|
|
mkdir -p "$HEROKU_PYTHON_DIR/lib"
|
|
|
|
# remove old sqlite3 libraries/binaries
|
|
find "$HEROKU_PYTHON_DIR/include/" -name "sqlite3*.h" -exec rm -f {} \;
|
|
find "$HEROKU_PYTHON_DIR/lib/" -name "libsqlite3.*" -exec rm -f {} \;
|
|
rm -f "$HEROKU_PYTHON_DIR/lib/pkgconfig/sqlite3.pc"
|
|
rm -f "$HEROKU_PYTHON_DIR/bin/sqlite3"
|
|
|
|
# copy over sqlite3 headers & bins and setup linking against the stack image library
|
|
mv "$HEROKU_PYTHON_DIR/sqlite3/usr/include/"* "$HEROKU_PYTHON_DIR/include/"
|
|
mv "$HEROKU_PYTHON_DIR/sqlite3/usr/lib/x86_64-linux-gnu"/libsqlite3.*a "$HEROKU_PYTHON_DIR/lib/"
|
|
mkdir -p "$HEROKU_PYTHON_DIR/lib/pkgconfig"
|
|
# set the right prefix/lib directories
|
|
sed -e 's/prefix=\/usr/prefix=\/app\/.heroku\/python/' -e 's/\/x86_64-linux-gnu//' "$HEROKU_PYTHON_DIR/sqlite3/usr/lib/x86_64-linux-gnu/pkgconfig/sqlite3.pc" > "$HEROKU_PYTHON_DIR/lib/pkgconfig/sqlite3.pc"
|
|
# need to point the libsqlite3.so to the stack image library for /usr/bin/ld -lsqlite3
|
|
SQLITE3_LIBFILE="/usr/lib/x86_64-linux-gnu/$(readlink -n "$HEROKU_PYTHON_DIR/sqlite3/usr/lib/x86_64-linux-gnu/libsqlite3.so")"
|
|
ln -s "$SQLITE3_LIBFILE" "$HEROKU_PYTHON_DIR/lib/libsqlite3.so"
|
|
if [ -z "$HEADERS_ONLY" ]; then
|
|
mv "$HEROKU_PYTHON_DIR/sqlite3/usr/bin"/* "$HEROKU_PYTHON_DIR/bin/"
|
|
fi
|
|
|
|
# cleanup
|
|
rm -rf "$HEROKU_PYTHON_DIR/sqlite3/"
|
|
rm -rf "$HEROKU_PYTHON_DIR/apt/"
|
|
}
|
|
|
|
buildpack_sqlite3_install() {
|
|
sqlite3_version
|
|
HEROKU_PYTHON_DIR="$BUILD_DIR/.heroku/python"
|
|
|
|
SQLITE3_VERSION_FILE="$BUILD_DIR/.heroku/python-sqlite3-version"
|
|
if [ -f "$SQLITE3_VERSION_FILE" ]; then
|
|
INSTALLED_SQLITE3_VERSION=$(cat "$SQLITE3_VERSION_FILE")
|
|
fi
|
|
|
|
# python version check
|
|
if python_sqlite3_check "$PYTHON_VERSION"; then
|
|
# only install if the sqlite3 version has changed
|
|
if [ "$INSTALLED_SQLITE3_VERSION" != "$SQLITE3_VERSION" ]; then
|
|
puts-step "Installing SQLite3"
|
|
sqlite3_install "$BUILD_DIR/.heroku/python" "$SQLITE3_VERSION"
|
|
|
|
# save version installed
|
|
mkdir -p "$CACHE_DIR/.heroku/"
|
|
echo "$SQLITE3_VERSION" > "$CACHE_DIR/.heroku/python-sqlite3-version"
|
|
fi
|
|
fi
|
|
}
|