fix python static conf paths

This commit is contained in:
Max Howell 2023-05-08 14:51:47 -04:00
parent 6eb84d1405
commit 6a6a0330ba
2 changed files with 104 additions and 70 deletions

View file

@ -45,11 +45,14 @@ build:
freedesktop.org/pkg-config: ^0.29 freedesktop.org/pkg-config: ^0.29
crates.io/semverator: '*' crates.io/semverator: '*'
#TODO $libdir/_sysconfigdata__darwin_darwin.py contains non-relocatable paths script:
script: | # fixes the build scripts so they use the standard environment variables we set
- |
sed -i.bak -e 's|system_lib_dirs = .*|system_lib_dirs = os.getenv("LIBRARY_PATH").split(":")|' ./setup.py sed -i.bak -e 's|system_lib_dirs = .*|system_lib_dirs = os.getenv("LIBRARY_PATH").split(":")|' ./setup.py
sed -i.bak -e 's|system_include_dirs = .*|system_include_dirs = os.getenv("CPATH").split(":")|' ./setup.py sed -i.bak -e 's|system_include_dirs = .*|system_include_dirs = os.getenv("CPATH").split(":")|' ./setup.py
# older versions use a different config dir
- |
if semverator satisfies '<3.8' {{ version }}; then if semverator satisfies '<3.8' {{ version }}; then
# older versions use a different config dir # older versions use a different config dir
confdir=$(echo $confdir | sed -e 's/\(config-{{ version.marketing }}\)/\1m/') confdir=$(echo $confdir | sed -e 's/\(config-{{ version.marketing }}\)/\1m/')
@ -61,27 +64,29 @@ build:
ARGS=${ARGS/--with-ensurepip/--without-ensurepip} ARGS=${ARGS/--with-ensurepip/--without-ensurepip}
fi fi
./configure $ARGS - ./configure $ARGS
make --jobs {{ hw.concurrency }} - make --jobs {{ hw.concurrency }}
make install - make install
# customize `pip install` locations to tea defaults # customize `pip install` locations to tea defaults
cp props/sitecustomize.py {{prefix}}/lib/python{{version.marketing}} - cp props/sitecustomize.py {{prefix}}/lib/python{{version.marketing}}
# provide unversioned symlinks # provide unversioned symlinks
cd {{prefix}}/bin - run: |
for x in python idle pydoc; do for x in python idle pydoc; do
ln -sf ${x}{{ version.marketing }} $x ln -sf ${x}{{ version.marketing }} $x
done done
ln -sf python{{ version.marketing }}-config python-config ln -sf python{{ version.marketing }}-config python-config
working-directory: ${{prefix}}/bin
# we provide the binaries in a separate package # we provide the binaries in a separate package
# but we dont use --without-ensurepip because stuff expects python to # but we dont use --without-ensurepip because stuff expects python to
# come bundled with setuptools # come bundled with setuptools
find . -mindepth 1 -maxdepth 1 -type f -name 'pip*' -exec rm {} \; - run: find . -mindepth 1 -maxdepth 1 -type f -name 'pip*' -exec rm {} \;
working-directory: ${{prefix}}/bin
# make relocatable # make relocatable
cd {{prefix}} - run: |
for binfile in $shebangs $confdir/python-config.py; do for binfile in $shebangs $confdir/python-config.py; do
if ! test -f $binfile; then if ! test -f $binfile; then
binfile=${binfile/{{version.marketing}}/{{version.marketing}}$SUFFIX} binfile=${binfile/{{version.marketing}}/{{version.marketing}}$SUFFIX}
@ -96,15 +101,29 @@ build:
sed -i.bak -e 's|{{ prefix }}|\\$(shell tea --prefix)/python.org/v{{version.major}}|g' $confdir/Makefile sed -i.bak -e 's|{{ prefix }}|\\$(shell tea --prefix)/python.org/v{{version.major}}|g' $confdir/Makefile
rm $confdir/Makefile.bak rm $confdir/Makefile.bak
working-directory: ${{prefix}}
- run:
cat $PROP >> _sysconfigdata__*.py
working-directory:
${{prefix}}/lib/python{{version.marketing}}
prop: |
import os
import re
tea_prefix = os.path.normpath(os.path.join(os.path.dirname(__file__), '../../../../'))
for key in build_time_vars:
if isinstance(build_time_vars[key], str):
build_time_vars[key] = re.sub(r'(\s|^)/opt/', r'\g<1>{}/'.format(tea_prefix), build_time_vars[key])
# force pip to user-install mode without sudo # force pip to user-install mode without sudo
ln -s /dev {{prefix}}/lib/python{{version.marketing}}/site-packages - ln -s /dev {{prefix}}/lib/python{{version.marketing}}/site-packages
# ^^ probs nuts lol, but the below has repurcussions # ^^ probs nuts lol, but the below has repurcussions
# chmod -w {{prefix}}/lib/python{{version.marketing}} # chmod -w {{prefix}}/lib/python{{version.marketing}}
# ^^ makes rm -rf ~/.tea/python.org on macOS fail # ^^ makes rm -rf ~/.tea/python.org on macOS fail
# some stuff expects python includes to be accessible without the prefix # some stuff expects python includes to be accessible without the prefix
cd include - run: |
mv python{{version.marketing}}$SUFFIX/* . mv python{{version.marketing}}$SUFFIX/* .
rmdir python{{version.marketing}}$SUFFIX rmdir python{{version.marketing}}$SUFFIX
ln -s . python{{version.marketing}} ln -s . python{{version.marketing}}
@ -112,6 +131,7 @@ build:
if test -n "$SUFFIX"; then if test -n "$SUFFIX"; then
ln -s . python{{version.marketing}}$SUFFIX ln -s . python{{version.marketing}}$SUFFIX
fi fi
working-directory: ${{prefix}}/include
env: env:
ARGS: ARGS:
@ -149,18 +169,20 @@ test:
dependencies: dependencies:
tea.xyz/gx/cc: c99 tea.xyz/gx/cc: c99
crates.io/semverator: '*' crates.io/semverator: '*'
script: | script:
# Check if sqlite is ok, because we build with --enable-loadable-sqlite-extensions # Check if sqlite is ok, because we build with --enable-loadable-sqlite-extensions
# and it can occur that building sqlite silently fails if OSX's sqlite is used. # and it can occur that building sqlite silently fails if OSX's sqlite is used.
python -c "import sqlite3" - python -c "import sqlite3"
# check to see if we can create a venv # check to see if we can create a venv
# we can't ensurepip on 3.7 so, this won't work # we can't ensurepip on 3.7 so, this won't work
- |
if semverator satisfies '^3.8' {{ version }}; then if semverator satisfies '^3.8' {{ version }}; then
python -m venv myvenv python -m venv myvenv
fi fi
# Check if some other modules import. Then the linked libs are working. # Check if some other modules import. Then the linked libs are working.
- |
python -c "import _ctypes" python -c "import _ctypes"
# python -c "import _decimal" #FIXME # python -c "import _decimal" #FIXME
python -c "import pyexpat" python -c "import pyexpat"
@ -168,20 +190,32 @@ test:
# Verify that the selected DBM interface works # Verify that the selected DBM interface works
# FIXME: doen't work # FIXME: doen't work
# - run:
# python $FIXTURE # python $FIXTURE
# fixture: |
# import dbm
# with dbm.ndbm.open("test", "c") as db:
# db[b"foo \\xbd"] = b"bar \\xbd"
# with dbm.ndbm.open("test", "r") as db:
# assert list(db.keys()) == [b"foo \\xbd"]
# assert b"foo \\xbd" in db
# assert db[b"foo \\xbd"] == b"bar \\xbd"
- |
if which -a pip | grep '{{ prefix }}'; then if which -a pip | grep '{{ prefix }}'; then
exit 1 exit 1
fi fi
echo '#include <Python.h>' > fixture.c - run: |
echo '#include <python{{version.major}}.{{version.minor}}/Python.h>' >> fixture.c mv $FIXTURE b.c
cc -c fixture.c cc -c b.c
fixture: | fixture: |
import dbm #include <Python.h>
with dbm.ndbm.open("test", "c") as db: #include <python{{version.major}}.{{version.minor}}/Python.h>
db[b"foo \\xbd"] = b"bar \\xbd"
with dbm.ndbm.open("test", "r") as db: - run:
assert list(db.keys()) == [b"foo \\xbd"] test $(python $FIXTURE) = {{prefix}}/include/python{{version.marketing}}
assert b"foo \\xbd" in db fixture: |
assert db[b"foo \\xbd"] == b"bar \\xbd" import sysconfig
include_path = sysconfig.get_paths()['include']
print(include_path)

View file

@ -1,4 +1,4 @@
dependencies: dependencies:
tea.xyz/brewkit: ^0 tea.xyz/brewkit: '>=0.28.1'
env: env:
TEA_PANTRY_PATH: ${{srcroot}} TEA_PANTRY_PATH: ${{srcroot}}