compile 15.2 KB
Newer Older
Kenneth Reitz's avatar
v14  
Kenneth Reitz committed
1
#!/usr/bin/env bash
Noah Zoschke's avatar
Noah Zoschke committed
2

3
# The Heroku Python Buildpack. This script accepts parameters for a build
Kenneth Reitz's avatar
Kenneth Reitz committed
4 5
# directory, a cache directory, and a directory for app environment variables.

6 7
# Warning: there are a few hacks in this script to accommodate excellent builds
# on Heroku. No guarantee for external compatibility is made. However,
Kenneth Reitz's avatar
Kenneth Reitz committed
8 9 10
# everything should work fine outside of the Heroku environment, if the
# environment is setup correctly.

11
# Usage:
Kenneth Reitz's avatar
Kenneth Reitz committed
12
#
13
#     $ bin/compile <build-dir> <cache-dir> <env-path>
Kenneth Reitz's avatar
Kenneth Reitz committed
14 15

# Fail fast and fail hard.
Noah Zoschke's avatar
Noah Zoschke committed
16
set -eo pipefail
Noah Zoschke's avatar
Noah Zoschke committed
17

Kenneth Reitz's avatar
Kenneth Reitz committed
18
# Boostrap the Buildpack Standard Library.
Kenneth Reitz's avatar
Kenneth Reitz committed
19 20 21
export BPLOG_PREFIX="buildpack.python"
export BUILDPACK_LOG_FILE=${BUILDPACK_LOG_FILE:-/dev/null}

22 23
[ "$BUILDPACK_XTRACE" ] && set -o xtrace

Kenneth Reitz's avatar
Kenneth Reitz committed
24 25
# Prepend proper path for old-school virtualenv hackery.
# This may not be neccessary.
Kenneth Reitz's avatar
test  
Kenneth Reitz committed
26
export PATH=:/usr/local/bin:$PATH
Kenneth Reitz's avatar
Kenneth Reitz committed
27

Kenneth Reitz's avatar
Kenneth Reitz committed
28
# Setup Path variables, for later use in the Buildpack.
Kenneth Reitz's avatar
Kenneth Reitz committed
29 30
BIN_DIR=$(cd "$(dirname "$0")"; pwd) # absolute path
ROOT_DIR=$(dirname "$BIN_DIR")
Noah Zoschke's avatar
Noah Zoschke committed
31 32
BUILD_DIR=$1
CACHE_DIR=$2
Kenneth Reitz's avatar
Kenneth Reitz committed
33
ENV_DIR=$3
34

Kenneth Reitz's avatar
Kenneth Reitz committed
35
# Export Path variables, for use in sub-scripts.
Kenneth Reitz's avatar
Kenneth Reitz committed
36 37
export BUILD_DIR CACHE_DIR ENV_DIR

Kenneth Reitz's avatar
Kenneth Reitz committed
38 39 40 41
# Set the Buildpack's internet target for downloading Python distributions.
# The user can provide BUILDPACK_VENDOR_URL to specify a custom target.
# Note: this is designed for non-Heroku use, as it does not use the user-provided
# environment variable mechanism (the ENV_DIR).
42 43 44 45 46 47
VENDOR_URL="https://lang-python.s3.amazonaws.com/$STACK"
if [[ -n ${BUILDPACK_VENDOR_URL:-} ]]; then
    VENDOR_URL="$BUILDPACK_VENDOR_URL"
fi
export VENDOR_URL

Casey's avatar
Casey committed
48 49 50
# Default Python Versions
# shellcheck source=bin/default_pythons
source "$BIN_DIR/default_pythons"
Kenneth Reitz's avatar
Kenneth Reitz committed
51

Casey Faist's avatar
Casey Faist committed
52 53 54 55
# Supported Python Branches
PY37="python-3.7"
PY36="python-3.6"
PY35="python-3.5"
Casey Faist's avatar
Casey Faist committed
56
PY34="python-3.4"
Casey Faist's avatar
Casey Faist committed
57 58
PY27="python-2.7"

Kenneth Reitz's avatar
Kenneth Reitz committed
59
# Which stack is used (for binary downloading), if none is provided (e.g. outside of Heroku)?
60
DEFAULT_PYTHON_STACK="cedar-14"
Kenneth Reitz's avatar
Kenneth Reitz committed
61
# If pip doesn't match this version (the version we install), run the installer.
Kenneth Reitz's avatar
9.0.2  
Kenneth Reitz committed
62
PIP_UPDATE="9.0.2"
Kenneth Reitz's avatar
Kenneth Reitz committed
63

Casey's avatar
Casey committed
64
export DEFAULT_PYTHON_STACK PIP_UPDATE
Casey Faist's avatar
Casey Faist committed
65
export PY37 PY36 PY35 PY27 PY34
Noah Zoschke's avatar
Noah Zoschke committed
66

Kenneth Reitz's avatar
Kenneth Reitz committed
67 68 69 70
# Common Problem Warnings:
# This section creates a temporary file in which to stick the output of `pip install`.
# The `warnings` subscript then greps through this for common problems and guides
# the user towards resolution of known issues.
Kenneth Reitz's avatar
Kenneth Reitz committed
71 72
WARNINGS_LOG=$(mktemp)
export WARNINGS_LOG
73
export RECOMMENDED_PYTHON_VERSION=$DEFAULT_PYTHON_VERSION
Kenneth Reitz's avatar
Kenneth Reitz committed
74

Kenneth Reitz's avatar
Kenneth Reitz committed
75 76
# The buildpack ships with a few executable tools (e.g. pip-grep, etc).
# This installs them into the path, so we can execute them directly.
Kenneth Reitz's avatar
Kenneth Reitz committed
77
export PATH=$PATH:$ROOT_DIR/vendor/:$ROOT_DIR/vendor/pip-pop
78

Kenneth Reitz's avatar
Kenneth Reitz committed
79 80 81
# Set environment variables if they weren't set by the platform.
# Note: this is legacy, for a deprecated build system known as Anvil.
# This can likely be removed, with caution.
Pierre Dulac's avatar
Pierre Dulac committed
82
[ ! "$SLUG_ID" ] && SLUG_ID="defaultslug"
Kenneth Reitz's avatar
Kenneth Reitz committed
83
[ ! "$REQUEST_ID" ] && REQUEST_ID=$SLUG_ID
84
[ ! "$STACK" ] && STACK=$DEFAULT_PYTHON_STACK
Kenneth Reitz's avatar
Kenneth Reitz committed
85

Kenneth Reitz's avatar
Kenneth Reitz committed
86 87 88 89
# Sanitize externally-provided environment variables:
# The following environment variables are either problematic or simply unneccessary
# for the buildpack to have knowledge of, so we unset them, to keep the environment
# as clean and pristine as possible.
Tero Vuotila's avatar
Tero Vuotila committed
90
unset GIT_DIR PYTHONHOME PYTHONPATH
91
unset RECEIVE_DATA RUN_KEY BUILD_INFO DEPLOY LOG_TOKEN
92
unset CYTOKINE_LOG_FILE GEM_PATH
93
export PYTHONPATH="$BUILD_DIR"
Kenneth Reitz's avatar
Kenneth Reitz committed
94

Kenneth Reitz's avatar
Kenneth Reitz committed
95
# Import the utils script, which contains helper functions used throughout the buildpack.
Kenneth Reitz's avatar
Kenneth Reitz committed
96 97
# shellcheck source=bin/utils
source "$BIN_DIR/utils"
Kenneth Reitz's avatar
Kenneth Reitz committed
98

Kenneth Reitz's avatar
Kenneth Reitz committed
99 100
# Import the warnings script, which contains the `pip install` user warning mechanisms
# (mentioned and explained above)
Kenneth Reitz's avatar
Kenneth Reitz committed
101 102
# shellcheck source=bin/warnings
source "$BIN_DIR/warnings"
Kenneth Reitz's avatar
Kenneth Reitz committed
103

Kenneth Reitz's avatar
Kenneth Reitz committed
104 105 106 107
# Make the directory in which we will create symlinks from the temporary build directory
# to `/app`.
# Symlinks are required, since Python is not a portable installation.
# More on this topic later.
108
mkdir -p "BUILD_DIR/.heroku"
Kenneth Reitz's avatar
Kenneth Reitz committed
109

Kenneth Reitz's avatar
Kenneth Reitz committed
110 111 112
# This buildpack programatically generates (or simply copies) a number of files for
# buildpack machinery: an export script, and a number of `.profile.d` scripts. This
# section declares the locations of those files and targets.
113
PROFILE_PATH="$BUILD_DIR/.profile.d/python.sh"
Kenneth Reitz's avatar
Kenneth Reitz committed
114
EXPORT_PATH="$BIN_DIR/../export"
115
GUNICORN_PROFILE_PATH="$BUILD_DIR/.profile.d/python.gunicorn.sh"
116
WEB_CONCURRENCY_PROFILE_PATH="$BUILD_DIR/.profile.d/WEB_CONCURRENCY.sh"
117

118
# We'll need to send these statics to other scripts we `source`.
Kenneth Reitz's avatar
Kenneth Reitz committed
119
export BUILD_DIR CACHE_DIR BIN_DIR PROFILE_PATH EXPORT_PATH
120

Kenneth Reitz's avatar
Kenneth Reitz committed
121 122 123 124 125
# Python Environment Variables
# Set Python-specific environment variables, for running Python within the buildpack.
# Notes on each variable included.

# PATH is relatively obvious, we need to be able to execute 'python'.
126
export PATH="$BUILD_DIR/.heroku/python/bin:$BUILD_DIR/.heroku/vendor/bin:$PATH"
Kenneth Reitz's avatar
Kenneth Reitz committed
127
# Tell Python to not buffer it's stdin/stdout.
Kenneth Reitz's avatar
test  
Kenneth Reitz committed
128
export PYTHONUNBUFFERED=1
Kenneth Reitz's avatar
Kenneth Reitz committed
129
# Set the locale to a well-known and expected standard.
130
export LANG=en_US.UTF-8
Kenneth Reitz's avatar
Kenneth Reitz committed
131 132 133
# `~/.heroku/vendor` is an place where the buildpack may stick pre-build binaries for known
# C dependencies (e.g. libmemcached on cedar-14). This section configures Python (GCC, more specifically)
# and pip to automatically include these paths when building binaries.
134 135 136 137 138
export C_INCLUDE_PATH="$BUILD_DIR/.heroku/vendor/include:$BUILD_DIR/.heroku/python/include:$C_INCLUDE_PATH"
export CPLUS_INCLUDE_PATH="$BUILD_DIR/.heroku/vendor/include:$BUILD_DIR/.heroku/python/include:$CPLUS_INCLUDE_PATH"
export LIBRARY_PATH="$BUILD_DIR/.heroku/vendor/lib:$BUILD_DIR/.heroku/python/lib:$LIBRARY_PATH"
export LD_LIBRARY_PATH="$BUILD_DIR/.heroku/vendor/lib:$BUILD_DIR/.heroku/python/lib:$LD_LIBRARY_PATH"
export PKG_CONFIG_PATH="$BUILD_DIR/.heroku/vendor/lib/pkg-config:$BUILD_DIR/.heroku/python/lib/pkg-config:$PKG_CONFIG_PATH"
Kenneth Reitz's avatar
Kenneth Reitz committed
139

Kenneth Reitz's avatar
Kenneth Reitz committed
140 141 142
# The Application Code
# --------------------

Kenneth Reitz's avatar
Kenneth Reitz committed
143
# Switch to the repo's context.
Kenneth Reitz's avatar
Kenneth Reitz committed
144
cd "$BUILD_DIR"
Noah Zoschke's avatar
Noah Zoschke committed
145

Kenneth Reitz's avatar
Kenneth Reitz committed
146 147 148 149 150 151 152 153 154 155
# The Cache
# ---------

# The workflow for the Python Buildpack's cache is as follows:
#
# - `~/.heroku/{known-paths}` are copied from the cache into the slug.
# - The build is executed, modifying `~/.heroku/{known-paths}`.
# - Once the build is complete, `~/.heroku/{known-paths}` is copied back into the cache.

# Create the cache directory, if it doesn't exist.
Kenneth Reitz's avatar
Kenneth Reitz committed
156
mkdir -p "$CACHE_DIR"
157 158 159 160

# Restore old artifacts from the cache.
mkdir -p .heroku

Kenneth Reitz's avatar
Kenneth Reitz committed
161
# The Python installation.
Kenneth Reitz's avatar
Kenneth Reitz committed
162
cp -R "$CACHE_DIR/.heroku/python" .heroku/ &> /dev/null || true
Kenneth Reitz's avatar
Kenneth Reitz committed
163
# A plain text file which contains the current stack being used (used for cache busting).
Kenneth Reitz's avatar
Kenneth Reitz committed
164
cp -R "$CACHE_DIR/.heroku/python-stack" .heroku/ &> /dev/null || true
Kenneth Reitz's avatar
Kenneth Reitz committed
165
# A plain text file which contains the current python version being used (used for cache busting).
Kenneth Reitz's avatar
Kenneth Reitz committed
166
cp -R "$CACHE_DIR/.heroku/python-version" .heroku/ &> /dev/null || true
167 168
# A plain text file which contains the current sqlite3 version being used (used for cache busting).
cp -R "$CACHE_DIR/.heroku/python-sqlite3-version" .heroku/ &> /dev/null || true
Kenneth Reitz's avatar
Kenneth Reitz committed
169
# Any pre-compiled binaries, provided by the buildpack.
Kenneth Reitz's avatar
Kenneth Reitz committed
170
cp -R "$CACHE_DIR/.heroku/vendor" .heroku/ &> /dev/null || true
Kenneth Reitz's avatar
Kenneth Reitz committed
171
# "editable" installations of code repositories, via pip or pipenv.
Kenneth Reitz's avatar
Kenneth Reitz committed
172 173
if [[ -d "$CACHE_DIR/.heroku/src" ]]; then
  cp -R "$CACHE_DIR/.heroku/src" .heroku/ &> /dev/null || true
174 175
fi

Kenneth Reitz's avatar
Kenneth Reitz committed
176 177 178 179 180
# The pre_compile hook. Customers rely on this. Don't remove it.
# This part of the code is used to allow users to customize their build experience
# without forking the buildpack by providing a `bin/pre_compile` script, which gets
# run inline with the buildpack automatically.

Kenneth Reitz's avatar
Kenneth Reitz committed
181 182
# shellcheck source=bin/steps/hooks/pre_compile
source "$BIN_DIR/steps/hooks/pre_compile"
Kenneth Reitz's avatar
hooks  
Kenneth Reitz committed
183

Kenneth Reitz's avatar
Kenneth Reitz committed
184 185 186
# Sticky runtimes. If there was a previous build, and it used a given version of Python,
# continue to use that version of Python in perpituity (warnings will be raised if
# they are out–of–date).
Kenneth Reitz's avatar
Kenneth Reitz committed
187 188
if [ -f "$CACHE_DIR/.heroku/python-version" ]; then
  DEFAULT_PYTHON_VERSION=$(cat "$CACHE_DIR/.heroku/python-version")
Kenneth Reitz's avatar
bpwatch  
Kenneth Reitz committed
189
fi
Kenneth Reitz's avatar
Kenneth Reitz committed
190

Kenneth Reitz's avatar
Kenneth Reitz committed
191
# We didn't always record the stack version. This code is in place because of that.
Kenneth Reitz's avatar
Kenneth Reitz committed
192 193
if [ -f "$CACHE_DIR/.heroku/python-stack" ]; then
  CACHED_PYTHON_STACK=$(cat "$CACHE_DIR/.heroku/python-stack")
194
else
195
  CACHED_PYTHON_STACK=$STACK
196 197
fi

Kenneth Reitz's avatar
Kenneth Reitz committed
198 199
export CACHED_PYTHON_STACK

200
# Pipenv Python version support.
Kenneth Reitz's avatar
Kenneth Reitz committed
201 202 203
# Detect the version of Python requested from a Pipfile (e.g. python_version or python_full_version).
# Convert it to a runtime.txt file.

Kenneth Reitz's avatar
Kenneth Reitz committed
204 205
# shellcheck source=bin/steps/pipenv-python-version
source "$BIN_DIR/steps/pipenv-python-version"
206

Kenneth Reitz's avatar
Kenneth Reitz committed
207
# If no runtime was provided by the user, assume the default Python runtime version.
Kenneth Reitz's avatar
Kenneth Reitz committed
208
if [ ! -f runtime.txt ]; then
Kenneth Reitz's avatar
Kenneth Reitz committed
209
  echo "$DEFAULT_PYTHON_VERSION" > runtime.txt
Kenneth Reitz's avatar
Kenneth Reitz committed
210 211
fi

Kenneth Reitz's avatar
Kenneth Reitz committed
212
# Create the directory for .profile.d, if it doesn't exist.
Kenneth Reitz's avatar
Kenneth Reitz committed
213
mkdir -p "$(dirname "$PROFILE_PATH")"
Kenneth Reitz's avatar
Kenneth Reitz committed
214
# Create the directory for editable source code installation, if it doesn't exist.
215
mkdir -p "$BUILD_DIR/.heroku/src"
Kenneth Reitz's avatar
Kenneth Reitz committed
216

Kenneth Reitz's avatar
Kenneth Reitz committed
217 218 219 220
# On Heroku CI, builds happen in `/app`. Otherwise, on the Heroku platform,
# they occur in a temp directory. Beacuse Python is not portable, we must create
# symlinks to emulate that we are operating in `/app` during the build process.
# This is (hopefully obviously) because apps end up running from `/app` in production.
221
if [[ "$BUILD_DIR" != '/app' ]]; then
222 223
    # python expects to reside in /app, so set up symlinks
    # we will not remove these later so subsequent buildpacks can still invoke it
224
    mkdir -p /app/.heroku
Kenneth Reitz's avatar
Kenneth Reitz committed
225 226
    ln -nsf "$BUILD_DIR/.heroku/python" /app/.heroku/python
    ln -nsf "$BUILD_DIR/.heroku/vendor" /app/.heroku/vendor
227
    # Note: .heroku/src is copied in later.
228 229
fi

Kenneth Reitz's avatar
Kenneth Reitz committed
230 231
# Download / Install Python, from pre-build binaries available on Amazon S3.
# This step also bootstraps pip / setuptools.
232
(( start=$(nowms) ))
Kenneth Reitz's avatar
Kenneth Reitz committed
233 234
# shellcheck source=bin/steps/python
source "$BIN_DIR/steps/python"
Kenneth Reitz's avatar
Kenneth Reitz committed
235
mtime "python.install.time" "${start}"
236

Kenneth Reitz's avatar
Kenneth Reitz committed
237
# Install Pipenv dependencies, if a Pipfile was provided.
Kenneth Reitz's avatar
Kenneth Reitz committed
238
# shellcheck source=bin/steps/pipenv
Kenneth Reitz's avatar
Kenneth Reitz committed
239
source "$BIN_DIR/steps/pipenv"
240 241

# Uninstall removed dependencies with Pip.
Kenneth Reitz's avatar
Kenneth Reitz committed
242 243
# The buildpack will automatically remove any declared dependencies (in requirements.txt)
# that were explicitly removed. This machinery is a bit complex, but it is not complicated.
244
(( start=$(nowms) ))
245 246 247 248
# shellcheck source=bin/steps/pip-uninstall
source "$BIN_DIR/steps/pip-uninstall"
mtime "pip.uninstall.time" "${start}"

249
# If no requirements.txt file given, assume `setup.py develop` is intended.
Kenneth Reitz's avatar
Kenneth Reitz committed
250 251 252
# This allows for people to ship a setup.py application to Heroku
# (which is rare, but I vouch that it should work!)

Kenneth Reitz's avatar
Kenneth Reitz committed
253
if [ ! -f requirements.txt ] && [ ! -f Pipfile ]; then
254 255 256
  echo "-e ." > requirements.txt
fi

Kenneth Reitz's avatar
Kenneth Reitz committed
257
# Fix egg-links.
Kenneth Reitz's avatar
Kenneth Reitz committed
258 259
# Because we're installing things into a different path than we're running them (temp dir vs app dir),
# We must re-write all of Python's eggpath links to target the proper directory.
Kenneth Reitz's avatar
Kenneth Reitz committed
260 261
# shellcheck source=bin/steps/eggpath-fix
source "$BIN_DIR/steps/eggpath-fix"
Kenneth Reitz's avatar
Kenneth Reitz committed
262

263
# Mercurial support.
Kenneth Reitz's avatar
Kenneth Reitz committed
264 265
# If a customer appears to be using mercurial for dependency resolution, we install it first.
# Note: this only applies to pip, not pipenv. This can likely be removed, over time. Measure it first.
Kenneth Reitz's avatar
Kenneth Reitz committed
266 267
# shellcheck source=bin/steps/mercurial
source "$BIN_DIR/steps/mercurial"
268

Kenneth Reitz's avatar
Kenneth Reitz committed
269
# Pylibmc support.
Kenneth Reitz's avatar
Kenneth Reitz committed
270
# On cedar-14, libmemcached was not available. The buildpack provides its own version, instead.
Kenneth Reitz's avatar
Kenneth Reitz committed
271 272
# shellcheck source=bin/steps/pylibmc
source "$BIN_DIR/steps/pylibmc"
273

Kenneth Reitz's avatar
Kenneth Reitz committed
274 275
# Support for Geo libraries. This is deprecated functionality, only functional on cedar-14.
# It is undocumented.
Kenneth Reitz's avatar
Kenneth Reitz committed
276
# shellcheck source=bin/steps/geo-libs
Kenneth Reitz's avatar
Kenneth Reitz committed
277
sub_env "$BIN_DIR/steps/geo-libs"
Kenneth Reitz's avatar
Kenneth Reitz committed
278

Kenneth Reitz's avatar
GDAL  
Kenneth Reitz committed
279
# GDAL support.
Kenneth Reitz's avatar
Kenneth Reitz committed
280
# This is part of the Geo support.
Kenneth Reitz's avatar
Kenneth Reitz committed
281 282
# shellcheck source=bin/steps/gdal
source "$BIN_DIR/steps/gdal"
Kenneth Reitz's avatar
GDAL  
Kenneth Reitz committed
283

284 285 286 287 288 289 290 291 292 293
# SQLite3 support.
# This sets up and installs sqlite3 dev headers and the sqlite3 binary but not the
# libsqlite3-0 library since that exists on the stack image.
# Note: This only applies to Python 2.7.15+ and Python 3.6.6+
(( start=$(nowms) ))
# shellcheck source=bin/steps/sqlite3
source "$BIN_DIR/steps/sqlite3"
buildpack_sqlite3_install
mtime "sqlite3.install.time" "${start}"

Kenneth Reitz's avatar
Kenneth Reitz committed
294 295 296 297
# pip install
# -----------

# Install dependencies with pip (where the magic happens).
298
(( start=$(nowms) ))
Kenneth Reitz's avatar
Kenneth Reitz committed
299 300
# shellcheck source=bin/steps/pip-install
source "$BIN_DIR/steps/pip-install"
301 302
mtime "pip.install.time" "${start}"

Kenneth Reitz's avatar
Kenneth Reitz committed
303
# Support for NLTK corpora.
Kenneth Reitz's avatar
Kenneth Reitz committed
304 305 306
# Note: this may only work on Python 2.7. I don't think many customers use this functionality,
# and it should probably be undocumented.
# (there's an import error on 3.6 that should hopefully be fixed upstream at some point)
307
(( start=$(nowms) ))
Kenneth Reitz's avatar
Kenneth Reitz committed
308
sub_env "$BIN_DIR/steps/nltk"
Kenneth Reitz's avatar
Kenneth Reitz committed
309
mtime "nltk.download.time" "${start}"
Kenneth Reitz's avatar
Kenneth Reitz committed
310

Kenneth Reitz's avatar
Kenneth Reitz committed
311 312
# Support for editable installations. Here, we are copying pip–created src directory,
# and copying it into the proper place (the logical place to do this was early, but it must be done here).
Kenneth Reitz's avatar
Kenneth Reitz committed
313 314
# In CI, $BUILD_DIR is /app.
if [[ ! "$BUILD_DIR" == "/app" ]]; then
315
  ln -nsf "$BUILD_DIR/.heroku/src" /app/.heroku/src
Kenneth Reitz's avatar
Kenneth Reitz committed
316 317
fi

Kenneth Reitz's avatar
Kenneth Reitz committed
318

Kenneth Reitz's avatar
Kenneth Reitz committed
319
# Django collectstatic support.
Kenneth Reitz's avatar
Kenneth Reitz committed
320 321 322 323
# The buildpack automatically runs collectstatic for Django applications.
# This is the cause for the majority of build failures on the Python platform.
# These failures are intentional — if collectstatic (which can be tricky, at times) fails,
# your build fails.
324
(( start=$(nowms) ))
Kenneth Reitz's avatar
Kenneth Reitz committed
325
sub_env "$BIN_DIR/steps/collectstatic"
Kenneth Reitz's avatar
Kenneth Reitz committed
326
mtime "collectstatic.time" "${start}"
327

Kenneth Reitz's avatar
Kenneth Reitz committed
328 329 330 331

# Progamatically create .profile.d script for application runtime environment variables.

# Set the PATH to include Python / pip / pipenv / etc.
Kenneth Reitz's avatar
Kenneth Reitz committed
332
set_env PATH "\$HOME/.heroku/python/bin:\$PATH"
Kenneth Reitz's avatar
Kenneth Reitz committed
333
# Tell Python to run in unbuffered mode.
Kenneth Reitz's avatar
Kenneth Reitz committed
334
set_env PYTHONUNBUFFERED true
Kenneth Reitz's avatar
Kenneth Reitz committed
335
# Tell Python where it lives.
336
set_env PYTHONHOME "\$HOME/.heroku/python"
Kenneth Reitz's avatar
Kenneth Reitz committed
337
# Set variables for C libraries.
338 339
set_env LIBRARY_PATH "\$HOME/.heroku/vendor/lib:\$HOME/.heroku/python/lib:\$LIBRARY_PATH"
set_env LD_LIBRARY_PATH "\$HOME/.heroku/vendor/lib:\$HOME/.heroku/python/lib:\$LD_LIBRARY_PATH"
Kenneth Reitz's avatar
Kenneth Reitz committed
340
# Locale.
Kenneth Reitz's avatar
Kenneth Reitz committed
341
set_default_env LANG en_US.UTF-8
Kenneth Reitz's avatar
Kenneth Reitz committed
342
# The Python hash seed is set to random.
Kenneth Reitz's avatar
Kenneth Reitz committed
343
set_default_env PYTHONHASHSEED random
Kenneth Reitz's avatar
Kenneth Reitz committed
344
# Tell Python to look for Python modules in the /app dir. Don't change this.
345 346
set_default_env PYTHONPATH "\$HOME"

347
# Python expects to be in "$BUILD_DIR," if at runtime, it is not, set
Kenneth Reitz's avatar
Kenneth Reitz committed
348
# up symlinks… this can occur when the subdir buildpack is used.
349
cat <<EOT >> "$PROFILE_PATH"
350 351 352
if [[ \$HOME != "$BUILD_DIR" ]]; then
    ln -nsf "\$HOME/.heroku/python" "$BUILD_DIR/.heroku/python"
    ln -nsf "\$HOME/.heroku/vendor" "$BUILD_DIR/.heroku/vendor"
353 354
fi
EOT
Kenneth Reitz's avatar
Kenneth Reitz committed
355

356
# Install sane-default script for $WEB_CONCURRENCY and $FORWARDED_ALLOW_IPS.
Kenneth Reitz's avatar
Kenneth Reitz committed
357 358
cp "$ROOT_DIR/vendor/WEB_CONCURRENCY.sh" "$WEB_CONCURRENCY_PROFILE_PATH"
cp "$ROOT_DIR/vendor/python.gunicorn.sh" "$GUNICORN_PROFILE_PATH"
Kenneth Reitz's avatar
Kenneth Reitz committed
359

Kenneth Reitz's avatar
Kenneth Reitz committed
360
# Experimental post_compile hook. Don't remove this.
Kenneth Reitz's avatar
Kenneth Reitz committed
361 362
# shellcheck source=bin/steps/hooks/post_compile
source "$BIN_DIR/steps/hooks/post_compile"
Kenneth Reitz's avatar
Kenneth Reitz committed
363

Kenneth Reitz's avatar
Kenneth Reitz committed
364
# Fix egg-links, again.
Kenneth Reitz's avatar
Kenneth Reitz committed
365 366
# shellcheck source=bin/steps/eggpath-fix2
source "$BIN_DIR/steps/eggpath-fix2"
367

Kenneth Reitz's avatar
Kenneth Reitz committed
368
# Store new artifacts in the cache.
Kenneth Reitz's avatar
Kenneth Reitz committed
369 370 371 372 373 374 375 376 377 378 379
rm -rf "$CACHE_DIR/.heroku/python"
rm -rf "$CACHE_DIR/.heroku/python-version"
rm -rf "$CACHE_DIR/.heroku/python-stack"
rm -rf "$CACHE_DIR/.heroku/vendor"
rm -rf "$CACHE_DIR/.heroku/src"

mkdir -p "$CACHE_DIR/.heroku"
cp -R .heroku/python "$CACHE_DIR/.heroku/"
cp -R .heroku/python-version "$CACHE_DIR/.heroku/"
cp -R .heroku/python-stack "$CACHE_DIR/.heroku/" &> /dev/null || true
cp -R .heroku/vendor "$CACHE_DIR/.heroku/" &> /dev/null || true
Kenneth Reitz's avatar
Kenneth Reitz committed
380
if [[ -d .heroku/src ]]; then
Kenneth Reitz's avatar
Kenneth Reitz committed
381
  cp -R .heroku/src "$CACHE_DIR/.heroku/" &> /dev/null || true
Kenneth Reitz's avatar
Kenneth Reitz committed
382
fi
Kenneth Reitz's avatar
Kenneth Reitz committed
383 384

# Measure the size of the Python installation.
Kenneth Reitz's avatar
Kenneth Reitz committed
385
# shellcheck disable=SC2119
Kenneth Reitz's avatar
Kenneth Reitz committed
386
mmeasure 'python.size' "$(measure-size)"