include ../build/Makefile-vars
all: deps wasm
# See https://github.com/pypa/pip/tags
#
VERSION = 22.3.1
URL = https://github.com/pypa/pip/archive/refs/tags/${VERSION}.tar.gz
TARBALL = ${UPSTREAM}/pip-${VERSION}.tar.gz
include ../build/Makefile-rules
SETUPTOOLS = $(shell cowasm-package-path @cowasm/py-setuptools)
${BUILD_WASM}/.patched: ${BUILD_WASM}/.build
# It would be much nicer to implement a better mmap. But for now, let's just patch it out:
cd ${BUILD_WASM} && cat ${SRC}/patches/01-pip-no-mmap.patch | patch -p1
# It would be better to have a better fallback for threads that works in some cases so we
# don't need this. But for now, just remove it:
cd ${BUILD_WASM} && cat ${SRC}/patches/02-pip-no-auto-refresh-progress.patch | patch -p1
touch ${BUILD_WASM}/.patched
${BUILD_WASM}/.built: ${BUILD_WASM}/.patched
cd ${BUILD_WASM} \
&& PYTHONPATH=${SETUPTOOLS} pnpm-exec cpython setup.py build
touch ${BUILD_WASM}/.built
# Trying to use a bundle (e.g., only pyc, etc.,) leads to endless problems, since
# many scripts and components that use pip assume the .py files are there.
${DIST_WASM}/.built: ${BUILD_WASM}/.built
rm -rf ${DIST_WASM}
mkdir -p ${DIST_WASM}
cp -r ${BUILD_WASM}/build/lib/pip ${DIST_WASM}/
# Build tools (e.g., for pandas, etc.) absolute require that setuptools actually be pip installed.
# So we pip install it into site-packages, then copy everything over dist_wasm, so that
# the directory setuptools-65.6.3.dist-info exists. Basically, we used our own setuptools package
# just for bootstrapping. Probably this is very similar to what ensurepip does?
# We do NOT just pip install pip because of the patches above...
PYTHONPATH=${SETUPTOOLS}:${DIST_WASM} pnpm-exec cpython -m pip install setuptools --target=${BUILD_WASM}/site-packages
cp -r ${BUILD_WASM}/site-packages/* ${DIST_WASM}
touch ${DIST_WASM}/.built
test: deps ${DIST_WASM}/.built
# Importing from the bundle works:
PYTHONPATH=${DIST_WASM} pnpm-exec cpython -c 'import pip'
# The command line script works.
PYTHONPATH=${DIST_WASM} pnpm-exec cpython -m pip > /dev/null