distributable: url: https://www.python.org/ftp/python/{{ version.raw }}/Python-{{ version.raw }}.tar.xz strip-components: 1 versions: github: python/cpython/tags ignore: # FIXME maybe? linux+aarch64 doesn't build before 3.4.2, # except 3.3.0, oddly. - 3.4.[0-1] - 3.3.[1-7] - 3.[0-2].x # We only currently have patches for 2.7.18 (EOL) - 2.7.1[0-7] - 2.7.[0-9] - 2.[0-6].x companions: pip.pypa.io: '*' unpackaged: - version: ^2 platform: darwin arch: aarc64 reason: help-wanted provides: - bin/python - bin/python{{ version.major }} - bin/python{{ version.marketing }} interprets: extensions: py args: python dependencies: zlib.net: 1 sourceware.org/bzip2: 1 openssl.org: ^1.1 sourceware.org/libffi: 3 libexpat.github.io: 2 bytereef.org/mpdecimal: 2 tukaani.org/xz: 5 sqlite.org: 3 gnu.org/readline: 8 invisible-island.net/ncurses: 6 tcl-lang.org: 8 # linux: # oracle.com/berkeley-db: 18 build: dependencies: freedesktop.org/pkg-config: ^0.29 gnu.org/patch: '*' curl.se: '*' script: # MacPorts has a series of patches to keep python2 working - run: | for PATCH in $PYTHON2PATCHES; do curl -sSL $PATCH | patch -p0 done if: ^2 # fixes the build scripts so they use the standard environment variables we set - run: | 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 if: <3.12 # older versions use a different config dir - run: | confdir="$libdir/config" # aarch64 not happy with this ARGS=${ARGS/--with-ensurepip/--without-ensurepip} if: ^2 # 3.7 and older use `3.7m` for config dir - run: | confdir=$(echo $confdir | sed -e 's/\(config-{{ version.marketing }}\)/\1m/') # 3.7 and older use `python3.7m` for include dir SUFFIX=m # 3.7 aborts on linux+aarch64 with this ARGS=${ARGS/--with-ensurepip/--without-ensurepip} if: '>=3<3.8' # 3.5 and older don't append the platform to confdir - run: confdir="$libdir/config-{{version.marketing}}m" if: '>=3<3.6' # Older patches have configure issues that aren't present in newer patches - run: | if test "{{hw.platform}}" = "darwin"; then sed -i.bak \ -e 's/ppc)/arm64)/g' \ -e 's/MACOSX_DEFAULT_ARCH="ppc.*$/MACOSX_DEFAULT_ARCH="arm64"/g' \ configure rm configure.bak fi if: '>=3<3.9.1' - run: | if test "{{hw.platform}}" = "darwin"; then sed -i.bak -e 's/^MULTIARCH=.*$/MULTIARCH=""/' configure rm configure.bak fi if: '>=3<3.10.1' # Some old versions don't support macOS 11 and greater in their configures - run: | if test "{{hw.platform}}" = "darwin"; then curl -L https://github.com/python/cpython/commit/8ea6353.patch | patch -p1 fi if: '>=3.8<3.8.4 || >=3<3.7.8' # Versions older than 3.5.3 have an include issue on darwin - run: patch -p1 < props/patch3.5.diff if: '>=3.5<3.5.3' # Whitespace difference in 3.4... - run: patch -p1 < props/patch3.4.diff if: '~3.4.1' # 3.12.0 needs help with mpdecimal - run: | sed -i.bak 's/libmpdec_machine=universal/libmpdec_machine=x64/' configure rm configure.bak if: darwin/x86-64 - run: | sed -i.bak 's/libmpdec_machine=universal/libmpdec_machine=uint128/' configure rm configure.bak if: darwin/aarch64 - ./configure $ARGS - make --jobs {{ hw.concurrency }} - make install # customize `pip install` locations to tea defaults - cp props/sitecustomize.py {{prefix}}/lib/python{{version.marketing}} # provide unversioned symlinks - run: | for x in python idle pydoc; do ln -sf ${x}{{ version.marketing }} $x done ln -sf python{{ version.marketing }}-config python-config working-directory: ${{prefix}}/bin # we provide the binaries in a separate package # but we don’t use --without-ensurepip because stuff expects python to # come bundled with setuptools - run: find . -mindepth 1 -maxdepth 1 -type f -name 'pip*' -exec rm {} \; working-directory: ${{prefix}}/bin # make relocatable - run: | for binfile in $shebangs $confdir/python-config.py; do if ! test -f $binfile; then binfile=${binfile/{{version.marketing}}/{{version.marketing}}$SUFFIX} fi if ! test -f $binfile; then continue fi binfile=$(readlink -f $binfile) sed -i.bak -e 's|#!{{ prefix }}/bin/|#!/usr/bin/env |g' $binfile rm $binfile.bak done sed -i.bak -e 's|{{ prefix }}|\\$(or $(PKGX_DIR),$(HOME)/.pkgx)/python.org/v{{version.major}}|g' $confdir/Makefile rm $confdir/Makefile.bak working-directory: ${{prefix}} - run: cat $PROP >> _sysconfigdata__*.py working-directory: ${{prefix}}/lib/python{{version.marketing}} prop: | import os import re pkgx_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(pkgx_prefix), build_time_vars[key]) # force pip to user-install mode without sudo - ln -s /dev {{prefix}}/lib/python{{version.marketing}}/site-packages # ^^ probs nuts lol, but the below has repurcussions # chmod -w {{prefix}}/lib/python{{version.marketing}} # ^^ makes rm -rf ~/.tea/python.org on macOS fail # some stuff expects python includes to be accessible without the prefix - run: | mv python{{version.marketing}}$SUFFIX/* . rmdir python{{version.marketing}}$SUFFIX ln -s . python{{version.marketing}} # Keep the suffixed version if we started with one if test -n "$SUFFIX"; then ln -s . python{{version.marketing}}$SUFFIX fi working-directory: ${{prefix}}/include env: ARGS: - --prefix="{{ prefix }}" - --with-ensurepip - --enable-ipv6 - --disable-loadable-sqlite-extensions - --with-system-expat - --with-system-ffi - --with-system-libmpdec # - --enable-optimizations # fails due to clang/llvm pkging bug on Linux # - --with-lto # fails on linux/aarch64 - --enable-shared libdir: lib/python{{version.marketing}} darwin: confdir: $libdir/config-{{version.marketing}}-darwin PYTHON2PATCHES: - https://raw.githubusercontent.com/macports/macports-ports/master/lang/python27/files/patch-getpath.diff linux: # ARGS: # - --with-dbmliborder=bdb ARCH: ${{hw.arch}} confdir: $libdir/config-{{version.marketing}}-${ARCH/-/_}-linux-gnu shebangs: - bin/2to3-{{version.marketing}} - bin/idle{{version.marketing}} - bin/pydoc{{version.marketing}} - bin/python{{version.marketing}}-config CPPFLAGS: ${CPPFLAGS:+$CPPFLAGS }-I{{ deps.zlib.net.prefix }}/include LDFLAGS: ${LDFLAGS:+$LDFLAGS }-L{{ deps.zlib.net.prefix }}/lib OPENSSL_INCLUDES: ${{ deps.openssl.org.prefix }}/include OPENSSL_LDFLAGS: -L{{ deps.openssl.org.prefix }}/lib PYTHON2PATCHES: - https://raw.githubusercontent.com/macports/macports-ports/master/lang/python27/files/patch-Makefile.pre.in.diff - https://raw.githubusercontent.com/macports/macports-ports/master/lang/python27/files/patch-setup.py.diff - https://raw.githubusercontent.com/macports/macports-ports/master/lang/python27/files/patch-Lib-cgi.py.diff - https://raw.githubusercontent.com/macports/macports-ports/master/lang/python27/files/patch-Lib-ctypes-macholib-dyld.py.diff - https://raw.githubusercontent.com/macports/macports-ports/master/lang/python27/files/patch-configure.diff - https://raw.githubusercontent.com/macports/macports-ports/master/lang/python27/files/patch-libedit.diff - https://raw.githubusercontent.com/macports/macports-ports/master/lang/python27/files/enable-loadable-sqlite-extensions.patch - https://raw.githubusercontent.com/macports/macports-ports/master/lang/python27/files/patch-_osx_support.py.diff - https://raw.githubusercontent.com/macports/macports-ports/master/lang/python27/files/darwin20.diff - https://raw.githubusercontent.com/macports/macports-ports/master/lang/python27/files/arm.patch - https://raw.githubusercontent.com/macports/macports-ports/master/lang/python27/files/implicit.patch - https://raw.githubusercontent.com/macports/macports-ports/master/lang/python27/files/openssl_ver.patch test: dependencies: crates.io/semverator: '*' script: # 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. - run: python -c "import sqlite3" # FIXME: v2, #include - run: SUFFIX=m if: '>=3<3.8' - run: test $(python $FIXTURE) = {{prefix}}/include/python{{version.marketing}}$SUFFIX fixture: | import sysconfig include_path = sysconfig.get_paths()['include'] print(include_path)