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:
  # recommended (but none are actually required)
  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

    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:
  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, <v3.7
      if: ^3.7

    # check to see if we can create a venv
    # we can't ensurepip on 3.7 so, this won't work
    - run: python -m venv myvenv
      if: ^3.8

    # Check if some other modules import. Then the linked libs are working.
    - run: |
        python -v -c "import _ctypes"
        # python -c "import _decimal" #FIXME
        python -c "import zlib"
      # FIXME: v2, <=3.6.4
      if: ^3.6.4

    - python -c "import pyexpat"

    # Verify that the selected DBM interface works
    # FIXME: doen't work
    # - run:
    #     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
        exit 1
      fi

    - run: |
        mv $FIXTURE b.c
        cc -c b.c
      fixture: |
        #include <Python.h>
        #include <python{{version.major}}.{{version.minor}}/Python.h>

    - 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)
