From b622f8abd2448a23a43a42ae269807345dad5ac3 Mon Sep 17 00:00:00 2001 From: admin Date: Fri, 22 May 2026 16:45:42 +0800 Subject: [PATCH] pyenv verification source --- .DS_Store | Bin 0 -> 8196 bytes .agignore | 2 + .dockerignore | 4 + .editorconfig | 11 + .github/CODEOWNERS | 1 + .github/FUNDING.yml | 12 + .github/ISSUE_TEMPLATE/bug_report.md | 54 + .github/ISSUE_TEMPLATE/feature_request.md | 24 + .github/PULL_REQUEST_TEMPLATE.md | 16 + .github/dependabot.yml | 10 + .github/workflows/add_version.yml | 58 + .github/workflows/macos_build.yml | 38 + .github/workflows/modified_scripts_build.yml | 306 + .github/workflows/no-response.yml | 30 + .github/workflows/pyenv_tests.yml | 43 + .../scripts/brew-uninstall-cascade.sh | 11 + .github/workflows/ubuntu_build.yml | 40 + .gitignore | 13 + .vimrc | 1 + CHANGELOG.md | 1630 ++++ COMMANDS.md | 407 + CONDUCT.md | 80 + CONTRIBUTING.md | 103 + LICENSE | 21 + MAINTENANCE.md | 17 + Makefile | 119 + README.md | 833 ++ bin/pyenv | 1 + completions/pyenv.bash | 16 + completions/pyenv.fish | 23 + completions/pyenv.pwsh | 17 + completions/pyenv.zsh | 18 + install_local_python.gif | Bin 0 -> 543836 bytes libexec/pyenv | 145 + libexec/pyenv---version | 23 + libexec/pyenv-commands | 48 + libexec/pyenv-completions | 26 + libexec/pyenv-exec | 57 + libexec/pyenv-global | 49 + libexec/pyenv-help | 173 + libexec/pyenv-hooks | 63 + libexec/pyenv-init | 363 + libexec/pyenv-latest | 105 + libexec/pyenv-local | 70 + libexec/pyenv-prefix | 62 + libexec/pyenv-rehash | 201 + libexec/pyenv-root | 3 + libexec/pyenv-sh-rehash | 29 + libexec/pyenv-sh-shell | 137 + libexec/pyenv-shims | 22 + libexec/pyenv-version | 36 + libexec/pyenv-version-file | 28 + libexec/pyenv-version-file-read | 43 + libexec/pyenv-version-file-write | 40 + libexec/pyenv-version-name | 80 + libexec/pyenv-version-origin | 21 + libexec/pyenv-versions | 195 + libexec/pyenv-whence | 38 + libexec/pyenv-which | 122 + man/man1/pyenv.1 | 550 ++ plugins/.gitignore | 5 + plugins/python-build/LICENSE | 20 + plugins/python-build/README.md | 357 + plugins/python-build/bin/pyenv-install | 295 + plugins/python-build/bin/pyenv-uninstall | 98 + plugins/python-build/bin/python-build | 2752 +++++++ plugins/python-build/install.sh | 26 + plugins/python-build/scripts/.gitignore | 1 + plugins/python-build/scripts/README.md | 22 + plugins/python-build/scripts/add_cpython.py | 632 ++ plugins/python-build/scripts/add_miniconda.py | 437 ++ plugins/python-build/scripts/add_miniforge.py | 152 + plugins/python-build/scripts/requirements.txt | 9 + plugins/python-build/share/python-build/2.1.3 | 5 + plugins/python-build/share/python-build/2.2.3 | 5 + plugins/python-build/share/python-build/2.3.7 | 5 + plugins/python-build/share/python-build/2.4.0 | 5 + plugins/python-build/share/python-build/2.4.1 | 5 + plugins/python-build/share/python-build/2.4.2 | 5 + plugins/python-build/share/python-build/2.4.3 | 5 + plugins/python-build/share/python-build/2.4.4 | 5 + plugins/python-build/share/python-build/2.4.5 | 5 + plugins/python-build/share/python-build/2.4.6 | 5 + plugins/python-build/share/python-build/2.5.0 | 4 + plugins/python-build/share/python-build/2.5.1 | 4 + plugins/python-build/share/python-build/2.5.2 | 4 + plugins/python-build/share/python-build/2.5.3 | 4 + plugins/python-build/share/python-build/2.5.4 | 4 + plugins/python-build/share/python-build/2.5.5 | 4 + plugins/python-build/share/python-build/2.5.6 | 4 + plugins/python-build/share/python-build/2.6.0 | 3 + plugins/python-build/share/python-build/2.6.1 | 3 + plugins/python-build/share/python-build/2.6.2 | 3 + plugins/python-build/share/python-build/2.6.3 | 3 + plugins/python-build/share/python-build/2.6.4 | 3 + plugins/python-build/share/python-build/2.6.5 | 3 + plugins/python-build/share/python-build/2.6.6 | 3 + plugins/python-build/share/python-build/2.6.7 | 3 + plugins/python-build/share/python-build/2.6.8 | 3 + plugins/python-build/share/python-build/2.6.9 | 3 + .../python-build/share/python-build/2.7-dev | 4 + plugins/python-build/share/python-build/2.7.0 | 3 + plugins/python-build/share/python-build/2.7.1 | 3 + .../python-build/share/python-build/2.7.10 | 7 + .../python-build/share/python-build/2.7.11 | 7 + .../python-build/share/python-build/2.7.12 | 7 + .../python-build/share/python-build/2.7.13 | 7 + .../python-build/share/python-build/2.7.14 | 8 + .../python-build/share/python-build/2.7.15 | 8 + .../python-build/share/python-build/2.7.16 | 7 + .../python-build/share/python-build/2.7.17 | 7 + .../python-build/share/python-build/2.7.18 | 8 + plugins/python-build/share/python-build/2.7.2 | 3 + plugins/python-build/share/python-build/2.7.3 | 3 + plugins/python-build/share/python-build/2.7.4 | 3 + plugins/python-build/share/python-build/2.7.5 | 3 + plugins/python-build/share/python-build/2.7.6 | 3 + plugins/python-build/share/python-build/2.7.7 | 7 + plugins/python-build/share/python-build/2.7.8 | 7 + plugins/python-build/share/python-build/2.7.9 | 7 + plugins/python-build/share/python-build/3.0.1 | 14 + plugins/python-build/share/python-build/3.1.0 | 5 + plugins/python-build/share/python-build/3.1.1 | 5 + plugins/python-build/share/python-build/3.1.2 | 5 + plugins/python-build/share/python-build/3.1.3 | 5 + plugins/python-build/share/python-build/3.1.4 | 5 + plugins/python-build/share/python-build/3.1.5 | 5 + .../python-build/share/python-build/3.10-dev | 5 + .../python-build/share/python-build/3.10.0 | 9 + .../python-build/share/python-build/3.10.1 | 9 + .../python-build/share/python-build/3.10.10 | 9 + .../python-build/share/python-build/3.10.11 | 9 + .../python-build/share/python-build/3.10.12 | 9 + .../python-build/share/python-build/3.10.13 | 9 + .../python-build/share/python-build/3.10.14 | 9 + .../python-build/share/python-build/3.10.15 | 9 + .../python-build/share/python-build/3.10.16 | 9 + .../python-build/share/python-build/3.10.17 | 9 + .../python-build/share/python-build/3.10.18 | 9 + .../python-build/share/python-build/3.10.19 | 9 + .../python-build/share/python-build/3.10.2 | 9 + .../python-build/share/python-build/3.10.20 | 9 + .../python-build/share/python-build/3.10.3 | 9 + .../python-build/share/python-build/3.10.4 | 9 + .../python-build/share/python-build/3.10.5 | 9 + .../python-build/share/python-build/3.10.6 | 9 + .../python-build/share/python-build/3.10.7 | 9 + .../python-build/share/python-build/3.10.8 | 9 + .../python-build/share/python-build/3.10.9 | 9 + .../python-build/share/python-build/3.11-dev | 6 + .../python-build/share/python-build/3.11.0 | 10 + .../python-build/share/python-build/3.11.1 | 10 + .../python-build/share/python-build/3.11.10 | 10 + .../python-build/share/python-build/3.11.11 | 10 + .../python-build/share/python-build/3.11.12 | 10 + .../python-build/share/python-build/3.11.13 | 10 + .../python-build/share/python-build/3.11.14 | 10 + .../python-build/share/python-build/3.11.15 | 10 + .../python-build/share/python-build/3.11.2 | 10 + .../python-build/share/python-build/3.11.3 | 10 + .../python-build/share/python-build/3.11.4 | 10 + .../python-build/share/python-build/3.11.5 | 10 + .../python-build/share/python-build/3.11.6 | 10 + .../python-build/share/python-build/3.11.7 | 10 + .../python-build/share/python-build/3.11.8 | 10 + .../python-build/share/python-build/3.11.9 | 10 + .../python-build/share/python-build/3.12-dev | 7 + .../python-build/share/python-build/3.12.0 | 10 + .../python-build/share/python-build/3.12.1 | 10 + .../python-build/share/python-build/3.12.10 | 10 + .../python-build/share/python-build/3.12.11 | 10 + .../python-build/share/python-build/3.12.12 | 10 + .../python-build/share/python-build/3.12.13 | 10 + .../python-build/share/python-build/3.12.2 | 10 + .../python-build/share/python-build/3.12.3 | 10 + .../python-build/share/python-build/3.12.4 | 10 + .../python-build/share/python-build/3.12.5 | 10 + .../python-build/share/python-build/3.12.6 | 10 + .../python-build/share/python-build/3.12.7 | 10 + .../python-build/share/python-build/3.12.8 | 10 + .../python-build/share/python-build/3.12.9 | 10 + .../python-build/share/python-build/3.13-dev | 8 + .../python-build/share/python-build/3.13.0 | 10 + .../python-build/share/python-build/3.13.0t | 2 + .../python-build/share/python-build/3.13.1 | 10 + .../python-build/share/python-build/3.13.10 | 10 + .../python-build/share/python-build/3.13.10t | 2 + .../python-build/share/python-build/3.13.11 | 10 + .../python-build/share/python-build/3.13.12 | 10 + .../python-build/share/python-build/3.13.12t | 2 + .../python-build/share/python-build/3.13.13 | 10 + .../python-build/share/python-build/3.13.13t | 2 + .../python-build/share/python-build/3.13.1t | 2 + .../python-build/share/python-build/3.13.2 | 10 + .../python-build/share/python-build/3.13.2t | 2 + .../python-build/share/python-build/3.13.3 | 10 + .../python-build/share/python-build/3.13.3t | 2 + .../python-build/share/python-build/3.13.4 | 10 + .../python-build/share/python-build/3.13.4t | 2 + .../python-build/share/python-build/3.13.5 | 10 + .../python-build/share/python-build/3.13.5t | 2 + .../python-build/share/python-build/3.13.6 | 10 + .../python-build/share/python-build/3.13.6t | 2 + .../python-build/share/python-build/3.13.7 | 10 + .../python-build/share/python-build/3.13.7t | 2 + .../python-build/share/python-build/3.13.8 | 10 + .../python-build/share/python-build/3.13.8t | 2 + .../python-build/share/python-build/3.13.9 | 10 + .../python-build/share/python-build/3.13.9t | 2 + .../python-build/share/python-build/3.13t-dev | 2 + .../python-build/share/python-build/3.14-dev | 8 + .../python-build/share/python-build/3.14.0 | 10 + .../python-build/share/python-build/3.14.0t | 2 + .../python-build/share/python-build/3.14.1 | 10 + .../python-build/share/python-build/3.14.1t | 2 + .../python-build/share/python-build/3.14.2 | 10 + .../python-build/share/python-build/3.14.3 | 10 + .../python-build/share/python-build/3.14.3t | 2 + .../python-build/share/python-build/3.14.4 | 10 + .../python-build/share/python-build/3.14.4t | 2 + .../python-build/share/python-build/3.14.5 | 10 + .../python-build/share/python-build/3.14.5t | 2 + .../python-build/share/python-build/3.14t-dev | 2 + .../python-build/share/python-build/3.15-dev | 8 + .../python-build/share/python-build/3.15.0b1 | 10 + .../python-build/share/python-build/3.15.0b1t | 2 + .../python-build/share/python-build/3.15t-dev | 2 + .../python-build/share/python-build/3.16-dev | 8 + .../python-build/share/python-build/3.16t-dev | 2 + plugins/python-build/share/python-build/3.2.0 | 5 + plugins/python-build/share/python-build/3.2.1 | 5 + plugins/python-build/share/python-build/3.2.2 | 5 + plugins/python-build/share/python-build/3.2.3 | 5 + plugins/python-build/share/python-build/3.2.4 | 5 + plugins/python-build/share/python-build/3.2.5 | 5 + plugins/python-build/share/python-build/3.2.6 | 9 + plugins/python-build/share/python-build/3.3.0 | 3 + plugins/python-build/share/python-build/3.3.1 | 3 + plugins/python-build/share/python-build/3.3.2 | 3 + plugins/python-build/share/python-build/3.3.3 | 3 + plugins/python-build/share/python-build/3.3.4 | 3 + plugins/python-build/share/python-build/3.3.5 | 3 + plugins/python-build/share/python-build/3.3.6 | 7 + plugins/python-build/share/python-build/3.3.7 | 7 + .../python-build/share/python-build/3.4-dev | 4 + plugins/python-build/share/python-build/3.4.0 | 7 + plugins/python-build/share/python-build/3.4.1 | 7 + .../python-build/share/python-build/3.4.10 | 6 + plugins/python-build/share/python-build/3.4.2 | 7 + plugins/python-build/share/python-build/3.4.3 | 7 + plugins/python-build/share/python-build/3.4.4 | 7 + plugins/python-build/share/python-build/3.4.5 | 7 + plugins/python-build/share/python-build/3.4.6 | 7 + plugins/python-build/share/python-build/3.4.7 | 7 + plugins/python-build/share/python-build/3.4.8 | 7 + plugins/python-build/share/python-build/3.4.9 | 7 + .../python-build/share/python-build/3.5-dev | 4 + plugins/python-build/share/python-build/3.5.0 | 7 + plugins/python-build/share/python-build/3.5.1 | 7 + .../python-build/share/python-build/3.5.10 | 8 + plugins/python-build/share/python-build/3.5.2 | 7 + plugins/python-build/share/python-build/3.5.3 | 8 + plugins/python-build/share/python-build/3.5.4 | 8 + plugins/python-build/share/python-build/3.5.5 | 8 + plugins/python-build/share/python-build/3.5.6 | 8 + plugins/python-build/share/python-build/3.5.7 | 8 + plugins/python-build/share/python-build/3.5.8 | 8 + plugins/python-build/share/python-build/3.5.9 | 8 + .../python-build/share/python-build/3.6-dev | 4 + plugins/python-build/share/python-build/3.6.0 | 7 + plugins/python-build/share/python-build/3.6.1 | 7 + .../python-build/share/python-build/3.6.10 | 8 + .../python-build/share/python-build/3.6.11 | 8 + .../python-build/share/python-build/3.6.12 | 8 + .../python-build/share/python-build/3.6.13 | 8 + .../python-build/share/python-build/3.6.14 | 8 + .../python-build/share/python-build/3.6.15 | 8 + plugins/python-build/share/python-build/3.6.2 | 7 + plugins/python-build/share/python-build/3.6.3 | 7 + plugins/python-build/share/python-build/3.6.4 | 7 + plugins/python-build/share/python-build/3.6.5 | 7 + plugins/python-build/share/python-build/3.6.6 | 7 + plugins/python-build/share/python-build/3.6.7 | 8 + plugins/python-build/share/python-build/3.6.8 | 8 + plugins/python-build/share/python-build/3.6.9 | 8 + .../python-build/share/python-build/3.7-dev | 5 + plugins/python-build/share/python-build/3.7.0 | 9 + plugins/python-build/share/python-build/3.7.1 | 9 + .../python-build/share/python-build/3.7.10 | 9 + .../python-build/share/python-build/3.7.11 | 9 + .../python-build/share/python-build/3.7.12 | 9 + .../python-build/share/python-build/3.7.13 | 9 + .../python-build/share/python-build/3.7.14 | 9 + .../python-build/share/python-build/3.7.15 | 9 + .../python-build/share/python-build/3.7.16 | 9 + .../python-build/share/python-build/3.7.17 | 9 + plugins/python-build/share/python-build/3.7.2 | 9 + plugins/python-build/share/python-build/3.7.3 | 9 + plugins/python-build/share/python-build/3.7.4 | 9 + plugins/python-build/share/python-build/3.7.5 | 9 + plugins/python-build/share/python-build/3.7.6 | 9 + plugins/python-build/share/python-build/3.7.7 | 9 + plugins/python-build/share/python-build/3.7.8 | 9 + plugins/python-build/share/python-build/3.7.9 | 9 + .../python-build/share/python-build/3.8-dev | 5 + plugins/python-build/share/python-build/3.8.0 | 9 + plugins/python-build/share/python-build/3.8.1 | 9 + .../python-build/share/python-build/3.8.10 | 12 + .../python-build/share/python-build/3.8.11 | 12 + .../python-build/share/python-build/3.8.12 | 12 + .../python-build/share/python-build/3.8.13 | 12 + .../python-build/share/python-build/3.8.14 | 12 + .../python-build/share/python-build/3.8.15 | 12 + .../python-build/share/python-build/3.8.16 | 12 + .../python-build/share/python-build/3.8.17 | 12 + .../python-build/share/python-build/3.8.18 | 12 + .../python-build/share/python-build/3.8.19 | 12 + plugins/python-build/share/python-build/3.8.2 | 9 + .../python-build/share/python-build/3.8.20 | 12 + plugins/python-build/share/python-build/3.8.3 | 9 + plugins/python-build/share/python-build/3.8.4 | 9 + plugins/python-build/share/python-build/3.8.5 | 9 + plugins/python-build/share/python-build/3.8.6 | 9 + plugins/python-build/share/python-build/3.8.7 | 9 + plugins/python-build/share/python-build/3.8.8 | 9 + plugins/python-build/share/python-build/3.8.9 | 9 + .../python-build/share/python-build/3.9-dev | 5 + plugins/python-build/share/python-build/3.9.0 | 10 + plugins/python-build/share/python-build/3.9.1 | 10 + .../python-build/share/python-build/3.9.10 | 12 + .../python-build/share/python-build/3.9.11 | 12 + .../python-build/share/python-build/3.9.12 | 12 + .../python-build/share/python-build/3.9.13 | 12 + .../python-build/share/python-build/3.9.14 | 12 + .../python-build/share/python-build/3.9.15 | 12 + .../python-build/share/python-build/3.9.16 | 12 + .../python-build/share/python-build/3.9.17 | 12 + .../python-build/share/python-build/3.9.18 | 12 + .../python-build/share/python-build/3.9.19 | 12 + plugins/python-build/share/python-build/3.9.2 | 10 + .../python-build/share/python-build/3.9.20 | 12 + .../python-build/share/python-build/3.9.21 | 12 + .../python-build/share/python-build/3.9.22 | 12 + .../python-build/share/python-build/3.9.23 | 12 + .../python-build/share/python-build/3.9.24 | 12 + .../python-build/share/python-build/3.9.25 | 12 + plugins/python-build/share/python-build/3.9.4 | 9 + plugins/python-build/share/python-build/3.9.5 | 12 + plugins/python-build/share/python-build/3.9.6 | 12 + plugins/python-build/share/python-build/3.9.7 | 12 + plugins/python-build/share/python-build/3.9.8 | 12 + plugins/python-build/share/python-build/3.9.9 | 12 + .../share/python-build/activepython-2.7.14 | 15 + .../share/python-build/activepython-3.5.4 | 15 + .../share/python-build/activepython-3.6.0 | 18 + .../share/python-build/anaconda-1.4.0 | 19 + .../share/python-build/anaconda-1.5.0 | 19 + .../share/python-build/anaconda-1.5.1 | 13 + .../share/python-build/anaconda-1.6.0 | 19 + .../share/python-build/anaconda-1.6.1 | 19 + .../share/python-build/anaconda-1.7.0 | 19 + .../share/python-build/anaconda-1.8.0 | 19 + .../share/python-build/anaconda-1.9.0 | 19 + .../share/python-build/anaconda-1.9.1 | 19 + .../share/python-build/anaconda-1.9.2 | 19 + .../share/python-build/anaconda-2.0.0 | 19 + .../share/python-build/anaconda-2.0.1 | 19 + .../share/python-build/anaconda-2.1.0 | 19 + .../share/python-build/anaconda-2.2.0 | 19 + .../share/python-build/anaconda-2.3.0 | 19 + .../share/python-build/anaconda-2.4.0 | 1 + .../share/python-build/anaconda-4.0.0 | 1 + .../share/python-build/anaconda2-2.4.0 | 19 + .../share/python-build/anaconda2-2.4.1 | 19 + .../share/python-build/anaconda2-2.5.0 | 19 + .../share/python-build/anaconda2-2018.12 | 19 + .../share/python-build/anaconda2-2019.03 | 19 + .../share/python-build/anaconda2-2019.07 | 19 + .../share/python-build/anaconda2-2019.10 | 19 + .../share/python-build/anaconda2-4.0.0 | 19 + .../share/python-build/anaconda2-4.1.0 | 19 + .../share/python-build/anaconda2-4.1.1 | 19 + .../share/python-build/anaconda2-4.2.0 | 19 + .../share/python-build/anaconda2-4.3.0 | 19 + .../share/python-build/anaconda2-4.3.1 | 19 + .../share/python-build/anaconda2-4.4.0 | 19 + .../share/python-build/anaconda2-5.0.0 | 19 + .../share/python-build/anaconda2-5.0.1 | 19 + .../share/python-build/anaconda2-5.1.0 | 19 + .../share/python-build/anaconda2-5.2.0 | 19 + .../share/python-build/anaconda2-5.3.0 | 19 + .../share/python-build/anaconda2-5.3.1 | 19 + .../share/python-build/anaconda3-2.0.0 | 19 + .../share/python-build/anaconda3-2.0.1 | 19 + .../share/python-build/anaconda3-2.1.0 | 19 + .../share/python-build/anaconda3-2.2.0 | 19 + .../share/python-build/anaconda3-2.3.0 | 19 + .../share/python-build/anaconda3-2.4.0 | 19 + .../share/python-build/anaconda3-2.4.1 | 19 + .../share/python-build/anaconda3-2.5.0 | 19 + .../share/python-build/anaconda3-2018.12 | 19 + .../share/python-build/anaconda3-2019.03 | 19 + .../share/python-build/anaconda3-2019.07 | 19 + .../share/python-build/anaconda3-2019.10 | 19 + .../share/python-build/anaconda3-2020.02 | 19 + .../share/python-build/anaconda3-2020.07 | 19 + .../share/python-build/anaconda3-2020.11 | 19 + .../share/python-build/anaconda3-2021.04 | 25 + .../share/python-build/anaconda3-2021.05 | 19 + .../share/python-build/anaconda3-2021.11 | 19 + .../share/python-build/anaconda3-2022.05 | 28 + .../share/python-build/anaconda3-2022.10 | 28 + .../share/python-build/anaconda3-2023.03 | 28 + .../share/python-build/anaconda3-2023.03-0 | 28 + .../share/python-build/anaconda3-2023.03-1 | 28 + .../share/python-build/anaconda3-2023.07-0 | 28 + .../share/python-build/anaconda3-2023.07-1 | 28 + .../share/python-build/anaconda3-2023.07-2 | 28 + .../share/python-build/anaconda3-2023.09-0 | 28 + .../share/python-build/anaconda3-2024.02-1 | 25 + .../share/python-build/anaconda3-2024.06-1 | 25 + .../share/python-build/anaconda3-2024.10-1 | 25 + .../share/python-build/anaconda3-2025.06-0 | 22 + .../share/python-build/anaconda3-2025.06-1 | 22 + .../share/python-build/anaconda3-2025.12-1 | 19 + .../share/python-build/anaconda3-2025.12-2 | 19 + .../share/python-build/anaconda3-4.0.0 | 19 + .../share/python-build/anaconda3-4.1.0 | 19 + .../share/python-build/anaconda3-4.1.1 | 19 + .../share/python-build/anaconda3-4.2.0 | 19 + .../share/python-build/anaconda3-4.3.0 | 19 + .../share/python-build/anaconda3-4.3.1 | 19 + .../share/python-build/anaconda3-4.4.0 | 19 + .../share/python-build/anaconda3-5.0.0 | 19 + .../share/python-build/anaconda3-5.0.1 | 19 + .../share/python-build/anaconda3-5.1.0 | 19 + .../share/python-build/anaconda3-5.2.0 | 19 + .../share/python-build/anaconda3-5.3.0 | 19 + .../share/python-build/anaconda3-5.3.1 | 19 + .../share/python-build/cinder-3.10-dev | 43 + .../share/python-build/cinder-3.8-dev | 43 + .../share/python-build/graalpy-22.3.0 | 54 + .../share/python-build/graalpy-23.0.0 | 54 + .../share/python-build/graalpy-23.1.0 | 63 + .../share/python-build/graalpy-23.1.2 | 64 + .../share/python-build/graalpy-24.0.0 | 64 + .../share/python-build/graalpy-24.1.0 | 64 + .../share/python-build/graalpy-24.1.1 | 64 + .../share/python-build/graalpy-24.1.2 | 64 + .../share/python-build/graalpy-24.2.0 | 64 + .../share/python-build/graalpy-24.2.1 | 64 + .../share/python-build/graalpy-24.2.2 | 64 + .../share/python-build/graalpy-25.0.0 | 64 + .../share/python-build/graalpy-25.0.1 | 64 + .../share/python-build/graalpy-25.0.2 | 61 + .../python-build/graalpy-community-23.1.0 | 54 + .../python-build/graalpy-community-23.1.2 | 54 + .../python-build/graalpy-community-24.0.0 | 54 + .../python-build/graalpy-community-24.1.0 | 54 + .../python-build/graalpy-community-24.1.1 | 54 + .../python-build/graalpy-community-24.1.2 | 54 + .../python-build/graalpy-community-24.2.0 | 54 + .../python-build/graalpy-community-24.2.1 | 54 + .../python-build/graalpy-community-24.2.2 | 54 + .../python-build/graalpy-community-25.0.0 | 54 + .../python-build/graalpy-community-25.0.1 | 54 + .../python-build/graalpy-community-25.0.2 | 51 + .../share/python-build/graalpy-dev | 54 + .../share/python-build/graalpython-20.1.0 | 48 + .../share/python-build/graalpython-20.2.0 | 48 + .../share/python-build/graalpython-20.3.0 | 48 + .../share/python-build/graalpython-21.0.0 | 48 + .../share/python-build/graalpython-21.1.0 | 48 + .../share/python-build/graalpython-21.2.0 | 48 + .../share/python-build/graalpython-21.3.0 | 48 + .../share/python-build/graalpython-22.0.0 | 48 + .../share/python-build/graalpython-22.1.0 | 48 + .../share/python-build/graalpython-22.2.0 | 48 + .../share/python-build/ironpython-2.7.4 | 2 + .../share/python-build/ironpython-2.7.5 | 2 + .../share/python-build/ironpython-2.7.6.3 | 2 + .../share/python-build/ironpython-2.7.7 | 2 + .../share/python-build/ironpython-dev | 2 + .../share/python-build/jython-2.5-dev | 6 + .../share/python-build/jython-2.5.0 | 9 + .../share/python-build/jython-2.5.1 | 9 + .../share/python-build/jython-2.5.2 | 6 + .../share/python-build/jython-2.5.3 | 6 + .../share/python-build/jython-2.5.4-rc1 | 6 + .../share/python-build/jython-2.7.0 | 14 + .../share/python-build/jython-2.7.1 | 14 + .../share/python-build/jython-2.7.2 | 14 + .../share/python-build/jython-2.7.3 | 14 + .../share/python-build/jython-2.7.4 | 14 + .../share/python-build/jython-dev | 6 + .../share/python-build/mambaforge | 25 + .../share/python-build/mambaforge-22.11.1-3 | 25 + .../share/python-build/mambaforge-22.11.1-4 | 25 + .../share/python-build/mambaforge-22.9.0-0 | 25 + .../share/python-build/mambaforge-22.9.0-1 | 25 + .../share/python-build/mambaforge-22.9.0-2 | 25 + .../share/python-build/mambaforge-22.9.0-3 | 25 + .../share/python-build/mambaforge-23.1.0-0 | 25 + .../share/python-build/mambaforge-23.1.0-1 | 25 + .../share/python-build/mambaforge-23.1.0-2 | 25 + .../share/python-build/mambaforge-23.1.0-3 | 25 + .../share/python-build/mambaforge-23.1.0-4 | 25 + .../share/python-build/mambaforge-23.10.0-0 | 25 + .../share/python-build/mambaforge-23.11.0-0 | 25 + .../share/python-build/mambaforge-23.3.0-0 | 25 + .../share/python-build/mambaforge-23.3.1-0 | 25 + .../share/python-build/mambaforge-23.3.1-1 | 25 + .../share/python-build/mambaforge-24.1.2-0 | 25 + .../share/python-build/mambaforge-24.11.0-0 | 25 + .../share/python-build/mambaforge-24.11.0-1 | 25 + .../share/python-build/mambaforge-24.3.0-0 | 25 + .../share/python-build/mambaforge-24.5.0-0 | 25 + .../share/python-build/mambaforge-24.7.1-0 | 25 + .../share/python-build/mambaforge-24.7.1-1 | 25 + .../share/python-build/mambaforge-24.7.1-2 | 25 + .../share/python-build/mambaforge-24.9.0-0 | 25 + .../share/python-build/mambaforge-24.9.2-0 | 25 + .../share/python-build/mambaforge-4.10.1-4 | 22 + .../share/python-build/mambaforge-4.10.1-5 | 22 + .../share/python-build/mambaforge-4.10.2-0 | 25 + .../share/python-build/mambaforge-4.10.3-0 | 25 + .../share/python-build/mambaforge-4.10.3-1 | 25 + .../share/python-build/mambaforge-4.10.3-10 | 22 + .../share/python-build/mambaforge-4.10.3-2 | 25 + .../share/python-build/mambaforge-4.10.3-3 | 25 + .../share/python-build/mambaforge-4.10.3-4 | 25 + .../share/python-build/mambaforge-4.10.3-5 | 25 + .../share/python-build/mambaforge-4.10.3-6 | 25 + .../share/python-build/mambaforge-4.10.3-7 | 25 + .../share/python-build/mambaforge-4.10.3-8 | 16 + .../share/python-build/mambaforge-4.10.3-9 | 25 + .../share/python-build/mambaforge-4.11.0-0 | 25 + .../share/python-build/mambaforge-4.11.0-1 | 25 + .../share/python-build/mambaforge-4.11.0-2 | 25 + .../share/python-build/mambaforge-4.11.0-3 | 16 + .../share/python-build/mambaforge-4.11.0-4 | 25 + .../share/python-build/mambaforge-4.12.0-0 | 25 + .../share/python-build/mambaforge-4.12.0-1 | 25 + .../share/python-build/mambaforge-4.12.0-2 | 25 + .../share/python-build/mambaforge-4.12.0-3 | 25 + .../share/python-build/mambaforge-4.13.0-1 | 25 + .../share/python-build/mambaforge-4.14.0-0 | 25 + .../share/python-build/mambaforge-4.14.0-1 | 25 + .../share/python-build/mambaforge-4.14.0-2 | 25 + .../share/python-build/mambaforge-pypy3 | 22 + .../share/python-build/micropython-1.10 | 4 + .../share/python-build/micropython-1.11 | 4 + .../share/python-build/micropython-1.12 | 4 + .../share/python-build/micropython-1.13 | 4 + .../share/python-build/micropython-1.14 | 4 + .../share/python-build/micropython-1.15 | 4 + .../share/python-build/micropython-1.16 | 4 + .../share/python-build/micropython-1.17 | 4 + .../share/python-build/micropython-1.18 | 4 + .../share/python-build/micropython-1.19.1 | 4 + .../share/python-build/micropython-1.20.0 | 4 + .../share/python-build/micropython-1.21.0 | 4 + .../share/python-build/micropython-1.9.3 | 4 + .../share/python-build/micropython-1.9.4 | 4 + .../share/python-build/micropython-dev | 1 + .../share/python-build/miniconda-2.2.2 | 19 + .../share/python-build/miniconda-3.0.0 | 19 + .../share/python-build/miniconda-3.0.4 | 19 + .../share/python-build/miniconda-3.0.5 | 19 + .../share/python-build/miniconda-3.10.1 | 19 + .../share/python-build/miniconda-3.16.0 | 19 + .../share/python-build/miniconda-3.18.3 | 1 + .../share/python-build/miniconda-3.3.0 | 19 + .../share/python-build/miniconda-3.4.2 | 19 + .../share/python-build/miniconda-3.7.0 | 19 + .../share/python-build/miniconda-3.8.3 | 19 + .../share/python-build/miniconda-3.9.1 | 19 + .../share/python-build/miniconda-latest | 1 + .../share/python-build/miniconda2-2.7-4.8.3 | 19 + .../share/python-build/miniconda2-3.18.3 | 19 + .../share/python-build/miniconda2-3.19.0 | 19 + .../share/python-build/miniconda2-4.0.5 | 19 + .../share/python-build/miniconda2-4.1.11 | 19 + .../share/python-build/miniconda2-4.3.14 | 19 + .../share/python-build/miniconda2-4.3.21 | 19 + .../share/python-build/miniconda2-4.3.27 | 19 + .../share/python-build/miniconda2-4.3.30 | 19 + .../share/python-build/miniconda2-4.3.31 | 19 + .../share/python-build/miniconda2-4.4.10 | 22 + .../share/python-build/miniconda2-4.5.1 | 22 + .../share/python-build/miniconda2-4.5.11 | 22 + .../share/python-build/miniconda2-4.5.12 | 22 + .../share/python-build/miniconda2-4.5.4 | 22 + .../share/python-build/miniconda2-4.6.14 | 19 + .../share/python-build/miniconda2-4.7.10 | 19 + .../share/python-build/miniconda2-4.7.12 | 28 + .../share/python-build/miniconda2-latest | 19 + .../share/python-build/miniconda3-2.2.2 | 19 + .../share/python-build/miniconda3-3.0.0 | 19 + .../share/python-build/miniconda3-3.0.4 | 19 + .../share/python-build/miniconda3-3.0.5 | 19 + .../python-build/miniconda3-3.10-22.11.1-1 | 28 + .../python-build/miniconda3-3.10-23.1.0-1 | 28 + .../python-build/miniconda3-3.10-23.10.0-1 | 28 + .../python-build/miniconda3-3.10-23.11.0-1 | 25 + .../python-build/miniconda3-3.10-23.11.0-2 | 25 + .../python-build/miniconda3-3.10-23.3.1-0 | 28 + .../python-build/miniconda3-3.10-23.5.0-3 | 28 + .../python-build/miniconda3-3.10-23.5.1-0 | 28 + .../python-build/miniconda3-3.10-23.5.2-0 | 28 + .../python-build/miniconda3-3.10-23.9.0-0 | 28 + .../python-build/miniconda3-3.10-24.1.2-0 | 25 + .../python-build/miniconda3-3.10-24.11.1-0 | 25 + .../python-build/miniconda3-3.10-24.3.0-0 | 25 + .../python-build/miniconda3-3.10-24.4.0-0 | 25 + .../python-build/miniconda3-3.10-24.5.0-0 | 25 + .../python-build/miniconda3-3.10-24.7.1-0 | 25 + .../python-build/miniconda3-3.10-24.9.2-0 | 25 + .../python-build/miniconda3-3.10-25.1.1-0 | 26 + .../python-build/miniconda3-3.10-25.1.1-1 | 26 + .../python-build/miniconda3-3.10-25.1.1-2 | 26 + .../python-build/miniconda3-3.10-25.11.1-1 | 20 + .../python-build/miniconda3-3.10-25.3.1-1 | 23 + .../python-build/miniconda3-3.10-25.5.1-0 | 23 + .../python-build/miniconda3-3.10-25.5.1-1 | 23 + .../python-build/miniconda3-3.10-25.7.0-2 | 23 + .../python-build/miniconda3-3.10-25.9.1-1 | 20 + .../python-build/miniconda3-3.10-25.9.1-3 | 20 + .../python-build/miniconda3-3.10-26.1.1-1 | 20 + .../python-build/miniconda3-3.10-26.3.2-2 | 20 + .../share/python-build/miniconda3-3.10.1 | 19 + .../python-build/miniconda3-3.11-23.10.0-1 | 28 + .../python-build/miniconda3-3.11-23.11.0-1 | 25 + .../python-build/miniconda3-3.11-23.11.0-2 | 25 + .../python-build/miniconda3-3.11-23.5.0-3 | 28 + .../python-build/miniconda3-3.11-23.5.1-0 | 28 + .../python-build/miniconda3-3.11-23.5.2-0 | 28 + .../python-build/miniconda3-3.11-23.9.0-0 | 28 + .../python-build/miniconda3-3.11-24.1.2-0 | 25 + .../python-build/miniconda3-3.11-24.11.1-0 | 25 + .../python-build/miniconda3-3.11-24.3.0-0 | 25 + .../python-build/miniconda3-3.11-24.4.0-0 | 25 + .../python-build/miniconda3-3.11-24.5.0-0 | 25 + .../python-build/miniconda3-3.11-24.7.1-0 | 25 + .../python-build/miniconda3-3.11-24.9.2-0 | 25 + .../python-build/miniconda3-3.11-25.1.1-0 | 26 + .../python-build/miniconda3-3.11-25.1.1-1 | 26 + .../python-build/miniconda3-3.11-25.1.1-2 | 26 + .../python-build/miniconda3-3.11-25.11.1-1 | 20 + .../python-build/miniconda3-3.11-25.3.1-1 | 23 + .../python-build/miniconda3-3.11-25.5.1-0 | 23 + .../python-build/miniconda3-3.11-25.5.1-1 | 23 + .../python-build/miniconda3-3.11-25.7.0-2 | 23 + .../python-build/miniconda3-3.11-25.9.1-1 | 20 + .../python-build/miniconda3-3.11-25.9.1-3 | 20 + .../python-build/miniconda3-3.11-26.1.1-1 | 20 + .../python-build/miniconda3-3.11-26.3.2-2 | 20 + .../python-build/miniconda3-3.12-24.1.2-0 | 25 + .../python-build/miniconda3-3.12-24.11.1-0 | 25 + .../python-build/miniconda3-3.12-24.3.0-0 | 25 + .../python-build/miniconda3-3.12-24.4.0-0 | 25 + .../python-build/miniconda3-3.12-24.5.0-0 | 25 + .../python-build/miniconda3-3.12-24.7.1-0 | 25 + .../python-build/miniconda3-3.12-24.9.2-0 | 25 + .../python-build/miniconda3-3.12-25.1.1-0 | 26 + .../python-build/miniconda3-3.12-25.1.1-1 | 26 + .../python-build/miniconda3-3.12-25.1.1-2 | 26 + .../python-build/miniconda3-3.12-25.11.1-1 | 20 + .../python-build/miniconda3-3.12-25.3.1-1 | 23 + .../python-build/miniconda3-3.12-25.5.1-0 | 23 + .../python-build/miniconda3-3.12-25.5.1-1 | 23 + .../python-build/miniconda3-3.12-25.7.0-2 | 23 + .../python-build/miniconda3-3.12-25.9.1-1 | 20 + .../python-build/miniconda3-3.12-25.9.1-3 | 20 + .../python-build/miniconda3-3.12-26.1.1-1 | 20 + .../python-build/miniconda3-3.12-26.3.2-2 | 20 + .../python-build/miniconda3-3.13-25.11.1-1 | 20 + .../python-build/miniconda3-3.13-25.3.1-1 | 23 + .../python-build/miniconda3-3.13-25.5.1-0 | 23 + .../python-build/miniconda3-3.13-25.5.1-1 | 23 + .../python-build/miniconda3-3.13-25.7.0-2 | 23 + .../python-build/miniconda3-3.13-25.9.1-1 | 20 + .../python-build/miniconda3-3.13-25.9.1-3 | 20 + .../python-build/miniconda3-3.13-26.1.1-1 | 20 + .../python-build/miniconda3-3.13-26.3.2-2 | 20 + .../share/python-build/miniconda3-3.16.0 | 19 + .../share/python-build/miniconda3-3.18.3 | 19 + .../share/python-build/miniconda3-3.19.0 | 19 + .../share/python-build/miniconda3-3.3.0 | 19 + .../share/python-build/miniconda3-3.4.2 | 19 + .../python-build/miniconda3-3.7-22.11.1-1 | 25 + .../python-build/miniconda3-3.7-23.1.0-1 | 25 + .../share/python-build/miniconda3-3.7-4.10.1 | 16 + .../share/python-build/miniconda3-3.7-4.10.3 | 25 + .../share/python-build/miniconda3-3.7-4.11.0 | 25 + .../share/python-build/miniconda3-3.7-4.12.0 | 25 + .../share/python-build/miniconda3-3.7-4.8.2 | 19 + .../share/python-build/miniconda3-3.7-4.8.3 | 19 + .../share/python-build/miniconda3-3.7-4.9.2 | 25 + .../share/python-build/miniconda3-3.7.0 | 19 + .../python-build/miniconda3-3.8-22.11.1-1 | 28 + .../python-build/miniconda3-3.8-23.1.0-1 | 28 + .../python-build/miniconda3-3.8-23.10.0-1 | 28 + .../python-build/miniconda3-3.8-23.11.0-1 | 25 + .../python-build/miniconda3-3.8-23.11.0-2 | 25 + .../python-build/miniconda3-3.8-23.3.1-0 | 28 + .../python-build/miniconda3-3.8-23.5.0-3 | 28 + .../python-build/miniconda3-3.8-23.5.1-0 | 28 + .../python-build/miniconda3-3.8-23.5.2-0 | 28 + .../python-build/miniconda3-3.8-23.9.0-0 | 28 + .../share/python-build/miniconda3-3.8-4.10.1 | 19 + .../share/python-build/miniconda3-3.8-4.10.3 | 25 + .../share/python-build/miniconda3-3.8-4.11.0 | 28 + .../share/python-build/miniconda3-3.8-4.12.0 | 28 + .../share/python-build/miniconda3-3.8-4.8.2 | 19 + .../share/python-build/miniconda3-3.8-4.8.3 | 19 + .../share/python-build/miniconda3-3.8-4.9.2 | 25 + .../share/python-build/miniconda3-3.8.3 | 19 + .../python-build/miniconda3-3.9-22.11.1-1 | 28 + .../python-build/miniconda3-3.9-23.1.0-1 | 28 + .../python-build/miniconda3-3.9-23.10.0-1 | 28 + .../python-build/miniconda3-3.9-23.11.0-1 | 25 + .../python-build/miniconda3-3.9-23.11.0-2 | 25 + .../python-build/miniconda3-3.9-23.3.1-0 | 28 + .../python-build/miniconda3-3.9-23.5.0-3 | 28 + .../python-build/miniconda3-3.9-23.5.1-0 | 28 + .../python-build/miniconda3-3.9-23.5.2-0 | 28 + .../python-build/miniconda3-3.9-23.9.0-0 | 28 + .../python-build/miniconda3-3.9-24.1.2-0 | 25 + .../python-build/miniconda3-3.9-24.11.1-0 | 25 + .../python-build/miniconda3-3.9-24.3.0-0 | 25 + .../python-build/miniconda3-3.9-24.4.0-0 | 25 + .../python-build/miniconda3-3.9-24.5.0-0 | 25 + .../python-build/miniconda3-3.9-24.7.1-0 | 25 + .../python-build/miniconda3-3.9-24.9.2-0 | 25 + .../python-build/miniconda3-3.9-25.1.1-0 | 26 + .../python-build/miniconda3-3.9-25.1.1-1 | 26 + .../python-build/miniconda3-3.9-25.1.1-2 | 26 + .../python-build/miniconda3-3.9-25.3.1-1 | 23 + .../python-build/miniconda3-3.9-25.5.1-0 | 23 + .../python-build/miniconda3-3.9-25.5.1-1 | 23 + .../python-build/miniconda3-3.9-25.7.0-2 | 23 + .../python-build/miniconda3-3.9-25.9.1-1 | 20 + .../python-build/miniconda3-3.9-25.9.1-3 | 20 + .../share/python-build/miniconda3-3.9-4.10.1 | 16 + .../share/python-build/miniconda3-3.9-4.10.3 | 25 + .../share/python-build/miniconda3-3.9-4.11.0 | 28 + .../share/python-build/miniconda3-3.9-4.12.0 | 28 + .../share/python-build/miniconda3-3.9-4.9.2 | 25 + .../share/python-build/miniconda3-3.9.1 | 19 + .../share/python-build/miniconda3-4.0.5 | 19 + .../share/python-build/miniconda3-4.1.11 | 19 + .../share/python-build/miniconda3-4.2.12 | 19 + .../share/python-build/miniconda3-4.3.11 | 19 + .../share/python-build/miniconda3-4.3.14 | 19 + .../share/python-build/miniconda3-4.3.21 | 19 + .../share/python-build/miniconda3-4.3.27 | 19 + .../share/python-build/miniconda3-4.3.30 | 19 + .../share/python-build/miniconda3-4.3.31 | 19 + .../share/python-build/miniconda3-4.4.10 | 22 + .../share/python-build/miniconda3-4.5.1 | 22 + .../share/python-build/miniconda3-4.5.11 | 22 + .../share/python-build/miniconda3-4.5.12 | 19 + .../share/python-build/miniconda3-4.5.4 | 22 + .../share/python-build/miniconda3-4.6.14 | 19 + .../share/python-build/miniconda3-4.7.10 | 19 + .../share/python-build/miniconda3-4.7.12 | 28 + .../share/python-build/miniconda3-latest | 26 + .../share/python-build/miniforge-pypy3 | 23 + .../share/python-build/miniforge3-22.11.1-3 | 25 + .../share/python-build/miniforge3-22.11.1-4 | 25 + .../share/python-build/miniforge3-22.9.0-0 | 25 + .../share/python-build/miniforge3-22.9.0-1 | 25 + .../share/python-build/miniforge3-22.9.0-2 | 25 + .../share/python-build/miniforge3-22.9.0-3 | 25 + .../share/python-build/miniforge3-23.1.0-0 | 25 + .../share/python-build/miniforge3-23.1.0-1 | 25 + .../share/python-build/miniforge3-23.1.0-2 | 25 + .../share/python-build/miniforge3-23.1.0-3 | 25 + .../share/python-build/miniforge3-23.1.0-4 | 25 + .../share/python-build/miniforge3-23.10.0-0 | 25 + .../share/python-build/miniforge3-23.11.0-0 | 25 + .../share/python-build/miniforge3-23.3.0-0 | 25 + .../share/python-build/miniforge3-23.3.1-0 | 25 + .../share/python-build/miniforge3-23.3.1-1 | 25 + .../share/python-build/miniforge3-24.1.2-0 | 25 + .../share/python-build/miniforge3-24.11.0-0 | 25 + .../share/python-build/miniforge3-24.11.0-1 | 25 + .../share/python-build/miniforge3-24.11.2-0 | 25 + .../share/python-build/miniforge3-24.11.2-1 | 25 + .../share/python-build/miniforge3-24.11.3-0 | 25 + .../share/python-build/miniforge3-24.11.3-1 | 25 + .../share/python-build/miniforge3-24.11.3-2 | 25 + .../share/python-build/miniforge3-24.3.0-0 | 25 + .../share/python-build/miniforge3-24.5.0-0 | 25 + .../share/python-build/miniforge3-24.7.1-0 | 25 + .../share/python-build/miniforge3-24.7.1-1 | 25 + .../share/python-build/miniforge3-24.7.1-2 | 25 + .../share/python-build/miniforge3-24.9.0-0 | 25 + .../share/python-build/miniforge3-24.9.2-0 | 25 + .../share/python-build/miniforge3-25.1.1-0 | 22 + .../share/python-build/miniforge3-25.1.1-1 | 25 + .../share/python-build/miniforge3-25.1.1-2 | 25 + .../share/python-build/miniforge3-25.11.0-1 | 25 + .../share/python-build/miniforge3-25.3.0-1 | 25 + .../share/python-build/miniforge3-25.3.0-2 | 25 + .../share/python-build/miniforge3-25.3.0-3 | 25 + .../share/python-build/miniforge3-25.3.1-0 | 25 + .../share/python-build/miniforge3-25.9.1-0 | 25 + .../share/python-build/miniforge3-26.1.0-0 | 25 + .../share/python-build/miniforge3-26.1.1-2 | 25 + .../share/python-build/miniforge3-26.1.1-3 | 25 + .../share/python-build/miniforge3-26.3.2-0 | 25 + .../share/python-build/miniforge3-26.3.2-1 | 25 + .../share/python-build/miniforge3-4.10 | 25 + .../share/python-build/miniforge3-4.10.1-1 | 25 + .../share/python-build/miniforge3-4.10.1-3 | 25 + .../share/python-build/miniforge3-4.10.1-5 | 25 + .../share/python-build/miniforge3-4.10.2-0 | 25 + .../share/python-build/miniforge3-4.10.3-0 | 25 + .../share/python-build/miniforge3-4.10.3-1 | 25 + .../share/python-build/miniforge3-4.10.3-10 | 25 + .../share/python-build/miniforge3-4.10.3-2 | 25 + .../share/python-build/miniforge3-4.10.3-3 | 25 + .../share/python-build/miniforge3-4.10.3-4 | 25 + .../share/python-build/miniforge3-4.10.3-5 | 25 + .../share/python-build/miniforge3-4.10.3-6 | 25 + .../share/python-build/miniforge3-4.10.3-7 | 25 + .../share/python-build/miniforge3-4.10.3-8 | 16 + .../share/python-build/miniforge3-4.10.3-9 | 25 + .../share/python-build/miniforge3-4.11.0-0 | 25 + .../share/python-build/miniforge3-4.11.0-1 | 25 + .../share/python-build/miniforge3-4.11.0-2 | 25 + .../share/python-build/miniforge3-4.11.0-3 | 16 + .../share/python-build/miniforge3-4.11.0-4 | 25 + .../share/python-build/miniforge3-4.12.0-0 | 25 + .../share/python-build/miniforge3-4.12.0-1 | 25 + .../share/python-build/miniforge3-4.12.0-2 | 25 + .../share/python-build/miniforge3-4.12.0-3 | 25 + .../share/python-build/miniforge3-4.13.0-0 | 25 + .../share/python-build/miniforge3-4.13.0-1 | 25 + .../share/python-build/miniforge3-4.14.0-0 | 25 + .../share/python-build/miniforge3-4.14.0-1 | 25 + .../share/python-build/miniforge3-4.14.0-2 | 25 + .../share/python-build/miniforge3-4.9.2 | 25 + .../share/python-build/miniforge3-latest | 25 + .../share/python-build/nogil-3.9.10 | 5 + .../share/python-build/nogil-3.9.10-1 | 5 + .../Python-2.1.3/000_patch-setup.py.diff | 58 + .../Python-2.2.3/000_patch-setup.py.diff | 58 + .../Python-2.3.7/000_patch-setup.py.diff | 45 + .../001_fortify_crash_workaround.diff | 51 + .../2.4.0/Python-2.4/000_patch-setup.py.diff | 45 + .../001_fortify_crash_workaround.diff | 51 + .../Python-2.4/002_patch-posixmodule.diff | 20 + .../Python-2.4.1/000_patch-setup.py.diff | 45 + .../001_fortify_crash_workaround.diff | 51 + .../Python-2.4.1/002_patch-posixmodule.diff | 20 + .../Python-2.4.2/000_patch-setup.py.diff | 45 + .../001_fortify_crash_workaround.diff | 51 + .../Python-2.4.2/002_patch-posixmodule.diff | 20 + .../Python-2.4.3/000_patch-setup.py.diff | 45 + .../001_fortify_crash_workaround.diff | 51 + .../Python-2.4.3/002_patch-posixmodule.diff | 20 + .../Python-2.4.4/000_patch-setup.py.diff | 45 + .../Python-2.4.4/001_patch-posixmodule.diff | 20 + .../Python-2.4.5/000_patch-setup.py.diff | 45 + .../Python-2.4.5/001_patch-posixmodule.diff | 20 + .../Python-2.4.6/000_patch-setup.py.diff | 45 + .../Python-2.4.6/001_patch-posixmodule.diff | 20 + .../2.5.0/Python-2.5/000_patch-setup.py.diff | 45 + .../Python-2.5/001_patch-svnversion.patch | 47 + .../Python-2.5/002_darwin_c_source.patch | 166 + .../2.5.0/Python-2.5/003_osx_lp64.patch | 271 + .../2.5.0/Python-2.5/004_osx_libffi.patch | 6881 +++++++++++++++++ .../Python-2.5/005_osx_failed_modules.patch | 124 + .../Python-2.5.1/000_patch-setup.py.diff | 45 + .../Python-2.5.1/001_patch-svnversion.patch | 47 + .../Python-2.5.1/002_darwin_c_source.patch | 166 + .../2.5.1/Python-2.5.1/003_osx_lp64.patch | 271 + .../2.5.1/Python-2.5.1/004_osx_libffi.patch | 6881 +++++++++++++++++ .../Python-2.5.1/005_osx_failed_modules.patch | 124 + .../Python-2.5.2/000_patch-setup.py.diff | 45 + .../Python-2.5.2/001_patch-svnversion.patch | 42 + .../Python-2.5.2/002_darwin_c_source.patch | 166 + .../2.5.2/Python-2.5.2/003_osx_lp64.patch | 271 + .../2.5.2/Python-2.5.2/004_osx_libffi.patch | 6881 +++++++++++++++++ .../Python-2.5.2/005_osx_failed_modules.patch | 124 + .../Python-2.5.3/000_patch-setup.py.diff | 45 + .../Python-2.5.3/001_patch-svnversion.patch | 42 + .../Python-2.5.3/002_darwin_c_source.patch | 166 + .../2.5.3/Python-2.5.3/003_osx_lp64.patch | 271 + .../2.5.3/Python-2.5.3/004_osx_libffi.patch | 6881 +++++++++++++++++ .../Python-2.5.3/005_osx_failed_modules.patch | 124 + .../Python-2.5.4/000_patch-setup.py.diff | 45 + .../Python-2.5.4/001_patch-svnversion.patch | 42 + .../Python-2.5.4/002_darwin_c_source.patch | 166 + .../2.5.4/Python-2.5.4/003_osx_lp64.patch | 271 + .../2.5.4/Python-2.5.4/004_osx_libffi.patch | 6881 +++++++++++++++++ .../Python-2.5.4/005_osx_failed_modules.patch | 124 + .../Python-2.5.5/000_patch-setup.py.diff | 45 + .../Python-2.5.5/001_patch-svnversion.patch | 42 + .../Python-2.5.5/002_darwin_c_source.patch | 166 + .../2.5.5/Python-2.5.5/003_osx_lp64.patch | 271 + .../2.5.5/Python-2.5.5/004_osx_libffi.patch | 6881 +++++++++++++++++ .../Python-2.5.5/005_osx_failed_modules.patch | 124 + .../Python-2.5.6/000_patch-setup.py.diff | 45 + .../Python-2.5.6/001_patch-svnversion.patch | 42 + .../Python-2.5.6/002_darwin_c_source.patch | 166 + .../2.5.6/Python-2.5.6/003_osx_lp64.patch | 271 + .../2.5.6/Python-2.5.6/004_osx_libffi.patch | 6881 +++++++++++++++++ .../Python-2.5.6/005_osx_failed_modules.patch | 124 + .../2.6.0/Python-2.6/000_patch-setup.py.diff | 71 + .../2.6.0/Python-2.6/002_readline63.patch | 61 + .../patches/2.6.0/Python-2.6/003_tk86.patch | 12 + .../Python-2.6/010_ssl_no_ssl2_no_ssl3.patch | 95 + .../Python-2.6.1/000_patch-setup.py.diff | 71 + .../2.6.1/Python-2.6.1/002_readline63.patch | 61 + .../patches/2.6.1/Python-2.6.1/003_tk86.patch | 12 + .../010_ssl_no_ssl2_no_ssl3.patch | 95 + .../Python-2.6.2/000_patch-setup.py.diff | 71 + .../2.6.2/Python-2.6.2/002_readline63.patch | 61 + .../patches/2.6.2/Python-2.6.2/003_tk86.patch | 12 + .../010_ssl_no_ssl2_no_ssl3.patch | 95 + .../Python-2.6.3/000_patch-setup.py.diff | 71 + .../2.6.3/Python-2.6.3/002_readline63.patch | 61 + .../patches/2.6.3/Python-2.6.3/003_tk86.patch | 12 + .../010_ssl_no_ssl2_no_ssl3.patch | 95 + .../Python-2.6.4/000_patch-setup.py.diff | 71 + .../2.6.4/Python-2.6.4/002_readline63.patch | 61 + .../patches/2.6.4/Python-2.6.4/003_tk86.patch | 12 + .../010_ssl_no_ssl2_no_ssl3.patch | 95 + .../Python-2.6.5/000_patch-setup.py.diff | 71 + .../2.6.5/Python-2.6.5/002_readline63.patch | 61 + .../patches/2.6.5/Python-2.6.5/003_tk86.patch | 12 + .../010_ssl_no_ssl2_no_ssl3.patch | 95 + .../Python-2.6.6/000_patch-setup.py.diff | 63 + .../2.6.6/Python-2.6.6/002_readline63.patch | 61 + .../patches/2.6.6/Python-2.6.6/003_tk86.patch | 12 + .../010_ssl_no_ssl2_no_ssl3.patch | 95 + .../Python-2.6.7/000_patch-setup.py.diff | 63 + .../2.6.7/Python-2.6.7/002_readline63.patch | 61 + .../patches/2.6.7/Python-2.6.7/003_tk86.patch | 12 + .../010_ssl_no_ssl2_no_ssl3.patch | 95 + .../Python-2.6.8/000_patch-setup.py.diff | 63 + .../2.6.8/Python-2.6.8/002_readline63.patch | 61 + .../patches/2.6.8/Python-2.6.8/003_tk86.patch | 12 + .../010_ssl_no_ssl2_no_ssl3.patch | 95 + .../Python-2.6.9/000_patch-setup.py.diff | 63 + .../Python-2.6.9/001_remove_systemstubs.patch | 12 + .../2.6.9/Python-2.6.9/002_readline63.patch | 61 + .../patches/2.6.9/Python-2.6.9/003_tk86.patch | 12 + .../010_ssl_no_ssl2_no_ssl3.patch | 91 + .../2.7.0/Python-2.7/000_patch-setup.py.diff | 47 + .../2.7.0/Python-2.7/002_readline63.patch | 61 + .../Python-2.7/010_ssl_no_ssl2_no_ssl3.patch | 100 + .../Python-2.7.1/000_patch-setup.py.diff | 47 + .../2.7.1/Python-2.7.1/002_readline63.patch | 61 + .../010_ssl_no_ssl2_no_ssl3.patch | 100 + .../003_system_library_path_in_sys_path.patch | 13 + .../0001-Detect-arm64-in-configure.patch | 41 + ...er-use-of-Tck-Tk-in-Library-Framewor.patch | 237 + ...3-Support-arm64-in-Mac-Tools-pythonw.patch | 34 + ...ystem-libffi-for-Mac-OS-10.15-and-up.patch | 85 + ...e-correct-ABI-for-variadic-functions.patch | 221 + ...ffi-for-ffi_closure_alloc-and-ffi_pr.patch | 108 + ...0007-Remove-QuickTime-from-link-args.patch | 40 + .../2.7.2/Python-2.7.2/002_readline63.patch | 61 + .../003_system_library_path_in_sys_path.patch | 13 + .../2.7.2/Python-2.7.2/010_ssl_no_ssl3.patch | 98 + .../2.7.3/Python-2.7.3/002_readline63.patch | 61 + .../003_system_library_path_in_sys_path.patch | 13 + .../2.7.3/Python-2.7.3/010_ssl_no_ssl3.patch | 98 + .../2.7.4/Python-2.7.4/002_readline63.patch | 61 + .../003_system_library_path_in_sys_path.patch | 13 + .../2.7.4/Python-2.7.4/010_ssl_no_ssl3.patch | 98 + .../2.7.5/Python-2.7.5/002_readline63.patch | 61 + .../003_system_library_path_in_sys_path.patch | 13 + .../2.7.5/Python-2.7.5/010_ssl_no_ssl3.patch | 98 + .../2.7.6/Python-2.7.6/002_readline63.patch | 61 + .../003_system_library_path_in_sys_path.patch | 13 + .../2.7.6/Python-2.7.6/010_ssl_no_ssl3.patch | 98 + .../012_fix_bundle_loader_for_new_osx.patch | 58 + .../003_system_library_path_in_sys_path.patch | 13 + .../2.7.7/Python-2.7.7/010_ssl_no_ssl3.patch | 98 + .../003_system_library_path_in_sys_path.patch | 13 + .../2.7.8/Python-2.7.8/010_ssl_no_ssl3.patch | 98 + .../003_system_library_path_in_sys_path.patch | 13 + .../2.7.9/Python-2.7.9/010_ssl_no_ssl3.patch | 17 + .../Python-3.0.1/000_patch-setup.py.diff | 44 + .../Python-3.0.1/001_patch-svnversion.patch | 42 + .../010_ssl_no_ssl2_no_ssl3.patch | 96 + .../3.1.0/Python-3.1/000_patch-setup.py.diff | 55 + .../Python-3.1/010_ssl_no_ssl2_no_ssl3.patch | 96 + .../Python-3.1.1/000_patch-setup.py.diff | 55 + .../010_ssl_no_ssl2_no_ssl3.patch | 96 + .../Python-3.1.2/000_patch-setup.py.diff | 55 + .../010_ssl_no_ssl2_no_ssl3.patch | 96 + .../Python-3.1.3/000_patch-setup.py.diff | 56 + .../3.1.3/Python-3.1.3/002_readline63.patch | 70 + .../010_ssl_no_ssl2_no_ssl3.patch | 96 + .../Python-3.1.4/000_patch-setup.py.diff | 12 + .../3.1.4/Python-3.1.4/002_readline63.patch | 70 + .../3.1.4/Python-3.1.4/010_ssl_no_ssl3.patch | 97 + .../Python-3.1.5/000_patch-setup.py.diff | 12 + .../3.1.5/Python-3.1.5/002_readline63.patch | 70 + .../3.1.5/Python-3.1.5/010_ssl_no_ssl3.patch | 97 + ...autoreconf-with-the-pkg-config-macro.patch | 535 ++ ...t-internal-configure-error-when-runn.patch | 80 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + .../openssl_1.1.1q_fix_c_include.patch | 12 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + .../3.2.0/Python-3.2/000_patch-setup.py.diff | 38 + .../3.2.0/Python-3.2/002_readline63.patch | 70 + .../Python-3.2/010_ssl_no_ssl2_no_ssl3.patch | 100 + .../3.2.1/Python-3.2.1/002_readline63.patch | 70 + .../3.2.1/Python-3.2.1/010_ssl_no_ssl3.patch | 101 + .../3.2.2/Python-3.2.2/002_readline63.patch | 70 + .../3.2.2/Python-3.2.2/010_ssl_no_ssl3.patch | 102 + .../3.2.3/Python-3.2.3/002_readline63.patch | 70 + .../3.2.3/Python-3.2.3/010_ssl_no_ssl3.patch | 100 + .../3.2.4/Python-3.2.4/002_readline63.patch | 70 + .../3.2.4/Python-3.2.4/010_ssl_no_ssl3.patch | 100 + .../3.2.5/Python-3.2.5/002_readline63.patch | 70 + .../3.2.5/Python-3.2.5/010_ssl_no_ssl3.patch | 100 + .../3.2.6/Python-3.2.6/002_readline63.patch | 70 + .../3.2.6/Python-3.2.6/010_ssl_no_ssl3.patch | 100 + .../3.3.0/Python-3.3.0/002_readline63.patch | 70 + .../3.3.0/Python-3.3.0/010_ssl_no_ssl3.patch | 102 + .../3.3.1/Python-3.3.1/002_readline63.patch | 70 + .../3.3.1/Python-3.3.1/010_ssl_no_ssl3.patch | 102 + .../3.3.2/Python-3.3.2/002_readline63.patch | 70 + .../3.3.2/Python-3.3.2/010_ssl_no_ssl3.patch | 102 + .../3.3.3/Python-3.3.3/002_readline63.patch | 70 + .../3.3.3/Python-3.3.3/010_ssl_no_ssl3.patch | 102 + .../3.3.4/Python-3.3.4/010_ssl_no_ssl3.patch | 102 + .../3.3.5/Python-3.3.5/010_ssl_no_ssl3.patch | 102 + .../3.3.6/Python-3.3.6/010_ssl_no_ssl3.patch | 102 + .../3.3.7/Python-3.3.7/010_ssl_no_ssl3.patch | 102 + .../3.4.0/Python-3.4.0/010_ssl_no_ssl3.patch | 72 + .../3.4.1/Python-3.4.1/010_ssl_no_ssl3.patch | 72 + .../3.4.2/Python-3.4.2/010_ssl_no_ssl3.patch | 72 + ...oc-align-by-16bytes-on-64bit-platfor.patch | 43 + ...PyGC_Head-to-alignof-long-double-GH-.patch | 40 + ...t-internal-configure-error-when-runn.patch | 86 + .../0004-Detect-arm64-in-configure.patch | 41 + ...port-macOS-11-when-building-GH-21113.patch | 48 + ...x-_decimal-for-arm64-Mac-OS-GH-21228.patch | 37 + ...system-libffi-patch-for-arm64-macOS-.patch | 132 + ...t-building-on-macOS-without-usr-incl.patch | 93 + ...error-when-opening-header-with-non-U.patch | 28 + ...e-sinpi-name-clash-with-libm-IEEE-75.patch | 68 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 29 + .../patches/3.5.2/Python-3.5.2/venv.patch | 23 + .../0001-Detect-arm64-in-configure.patch | 41 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 29 + ...t-building-on-macOS-without-usr-incl.patch | 93 + ...er-use-of-Tck-Tk-in-Library-Framewor.patch | 240 + ...system-libffi-patches-for-arm64-macO.patch | 314 + ...port-macOS-11-when-building-GH-21113.patch | 48 + ...x-_decimal-for-arm64-Mac-OS-GH-21228.patch | 37 + ...error-when-opening-header-with-non-U.patch | 30 + ...t-internal-configure-error-when-runn.patch | 86 + ...oc-align-by-16bytes-on-64bit-platfor.patch | 43 + ...PyGC_Head-to-alignof-long-double-GH-.patch | 40 + ...e-sinpi-name-clash-with-libm-IEEE-75.patch | 68 + ...t-internal-configure-error-when-runn.patch | 80 + ...t-internal-configure-error-when-runn.patch | 80 + ...system-libffi-patches-for-arm64-macO.patch | 310 + ...x-_decimal-for-arm64-Mac-OS-GH-21228.patch | 36 + ...error-when-opening-header-with-non-U.patch | 30 + ...t-internal-configure-error-when-runn.patch | 43 + ...system-libffi-patches-for-arm64-macO.patch | 310 + ...x-_decimal-for-arm64-Mac-OS-GH-21228.patch | 36 + ...error-when-opening-header-with-non-U.patch | 30 + ...system-libffi-patches-for-arm64-macO.patch | 310 + ...x-_decimal-for-arm64-Mac-OS-GH-21228.patch | 37 + ...error-when-opening-header-with-non-U.patch | 30 + ...system-libffi-patches-for-arm64-macO.patch | 310 + ...x-_decimal-for-arm64-Mac-OS-GH-21228.patch | 37 + ...error-when-opening-header-with-non-U.patch | 30 + .../openssl_1.1.1q_fix_c_include.patch | 12 + ...system-libffi-patches-for-arm64-macO.patch | 310 + ...x-_decimal-for-arm64-Mac-OS-GH-21228.patch | 37 + ...error-when-opening-header-with-non-U.patch | 30 + .../openssl_1.1.1q_fix_c_include.patch | 12 + ...system-libffi-patches-for-arm64-macO.patch | 310 + ...x-_decimal-for-arm64-Mac-OS-GH-21228.patch | 37 + ...error-when-opening-header-with-non-U.patch | 30 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 29 + ...t-internal-configure-error-when-runn.patch | 80 + ...t-internal-configure-error-when-runn.patch | 80 + ...t-internal-configure-error-when-runn.patch | 80 + ...t-internal-configure-error-when-runn.patch | 80 + ...t-internal-configure-error-when-runn.patch | 80 + .../openssl_1.1.1q_fix_c_include.patch | 12 + .../openssl_1.1.1q_fix_c_include.patch | 12 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...t-internal-configure-error-when-runn.patch | 80 + ...t-internal-configure-error-when-runn.patch | 80 + ...t-internal-configure-error-when-runn.patch | 80 + ...t-internal-configure-error-when-runn.patch | 80 + ...t-internal-configure-error-when-runn.patch | 80 + ...t-internal-configure-error-when-runn.patch | 80 + ...t-internal-configure-error-when-runn.patch | 80 + ...t-internal-configure-error-when-runn.patch | 80 + .../openssl_1.1.1q_fix_c_include.patch | 12 + .../openssl_1.1.1q_fix_c_include.patch | 12 + ...t-internal-configure-error-when-runn.patch | 80 + ...ognize-an-argument-to-j-in-MAKEFLAGS.patch | 27 + ...t-internal-configure-error-when-runn.patch | 80 + ...t-internal-configure-error-when-runn.patch | 80 + ...t-internal-configure-error-when-runn.patch | 80 + ...t-internal-configure-error-when-runn.patch | 80 + .../Cinder-3.10-dev/001-disable-werror.patch | 30 + .../Cinder-3.8-dev/001-disable-werror.patch | 30 + .../stackless-322-export/002_readline63.patch | 70 + .../010_ssl_no_ssl3.patch | 102 + .../stackless-325-export/002_readline63.patch | 70 + .../010_ssl_no_ssl3.patch | 100 + .../share/python-build/pypy-1.5-src | 3 + .../python-build/share/python-build/pypy-1.6 | 23 + .../python-build/share/python-build/pypy-1.7 | 24 + .../python-build/share/python-build/pypy-1.8 | 24 + .../python-build/share/python-build/pypy-1.9 | 24 + .../python-build/share/python-build/pypy-2.0 | 34 + .../share/python-build/pypy-2.0-src | 3 + .../share/python-build/pypy-2.0.1 | 26 + .../share/python-build/pypy-2.0.1-src | 3 + .../share/python-build/pypy-2.0.2 | 26 + .../share/python-build/pypy-2.0.2-src | 3 + .../python-build/share/python-build/pypy-2.1 | 38 + .../share/python-build/pypy-2.1-src | 3 + .../python-build/share/python-build/pypy-2.2 | 38 + .../share/python-build/pypy-2.2-src | 3 + .../share/python-build/pypy-2.2.1 | 38 + .../share/python-build/pypy-2.2.1-src | 3 + .../python-build/share/python-build/pypy-2.3 | 38 + .../share/python-build/pypy-2.3-src | 3 + .../share/python-build/pypy-2.3.1 | 44 + .../share/python-build/pypy-2.3.1-src | 3 + .../share/python-build/pypy-2.4.0 | 44 + .../share/python-build/pypy-2.4.0-src | 3 + .../share/python-build/pypy-2.5.0 | 44 + .../share/python-build/pypy-2.5.0-src | 3 + .../share/python-build/pypy-2.5.1 | 44 + .../share/python-build/pypy-2.5.1-src | 3 + .../share/python-build/pypy-2.6.0 | 44 + .../share/python-build/pypy-2.6.0-src | 3 + .../share/python-build/pypy-2.6.1 | 47 + .../share/python-build/pypy-2.6.1-src | 3 + .../share/python-build/pypy-4.0.0 | 52 + .../share/python-build/pypy-4.0.0-src | 3 + .../share/python-build/pypy-4.0.1 | 52 + .../share/python-build/pypy-4.0.1-src | 3 + .../share/python-build/pypy-5.0.0 | 52 + .../share/python-build/pypy-5.0.0-src | 3 + .../share/python-build/pypy-5.0.1 | 44 + .../share/python-build/pypy-5.0.1-src | 3 + .../python-build/share/python-build/pypy-5.1 | 52 + .../share/python-build/pypy-5.1-src | 3 + .../share/python-build/pypy-5.1.1 | 44 + .../share/python-build/pypy-5.1.1-src | 3 + .../python-build/share/python-build/pypy-5.3 | 1 + .../share/python-build/pypy-5.3-src | 1 + .../share/python-build/pypy-5.3.1 | 1 + .../share/python-build/pypy-5.3.1-src | 1 + .../python-build/share/python-build/pypy-5.4 | 1 + .../share/python-build/pypy-5.4-src | 1 + .../share/python-build/pypy-5.4.1 | 1 + .../share/python-build/pypy-5.4.1-src | 1 + .../share/python-build/pypy-5.6.0 | 1 + .../share/python-build/pypy-5.6.0-src | 1 + .../share/python-build/pypy-5.7.0 | 1 + .../share/python-build/pypy-5.7.0-src | 1 + .../share/python-build/pypy-5.7.1 | 1 + .../share/python-build/pypy-5.7.1-src | 1 + .../share/python-build/pypy-c-jit-latest | 37 + .../python-build/share/python-build/pypy-dev | 3 + .../share/python-build/pypy-stm-2.3 | 14 + .../share/python-build/pypy-stm-2.5.1 | 14 + .../python-build/share/python-build/pypy2-5.3 | 56 + .../share/python-build/pypy2-5.3-src | 3 + .../share/python-build/pypy2-5.3.1 | 44 + .../share/python-build/pypy2-5.3.1-src | 3 + .../python-build/share/python-build/pypy2-5.4 | 44 + .../share/python-build/pypy2-5.4-src | 3 + .../share/python-build/pypy2-5.4.1 | 44 + .../share/python-build/pypy2-5.4.1-src | 3 + .../share/python-build/pypy2-5.6.0 | 44 + .../share/python-build/pypy2-5.6.0-src | 3 + .../share/python-build/pypy2-5.7.0 | 42 + .../share/python-build/pypy2-5.7.0-src | 3 + .../share/python-build/pypy2-5.7.1 | 42 + .../share/python-build/pypy2-5.7.1-src | 3 + .../share/python-build/pypy2.7-5.10.0 | 47 + .../share/python-build/pypy2.7-5.10.0-src | 3 + .../share/python-build/pypy2.7-5.8.0 | 42 + .../share/python-build/pypy2.7-5.8.0-src | 3 + .../share/python-build/pypy2.7-5.9.0 | 42 + .../share/python-build/pypy2.7-5.9.0-src | 3 + .../share/python-build/pypy2.7-6.0.0 | 55 + .../share/python-build/pypy2.7-6.0.0-src | 3 + .../share/python-build/pypy2.7-7.0.0 | 47 + .../share/python-build/pypy2.7-7.0.0-src | 3 + .../share/python-build/pypy2.7-7.1.0 | 47 + .../share/python-build/pypy2.7-7.1.0-src | 3 + .../share/python-build/pypy2.7-7.1.1 | 47 + .../share/python-build/pypy2.7-7.1.1-src | 3 + .../share/python-build/pypy2.7-7.2.0 | 47 + .../share/python-build/pypy2.7-7.2.0-src | 3 + .../share/python-build/pypy2.7-7.3.0 | 39 + .../share/python-build/pypy2.7-7.3.0-src | 3 + .../share/python-build/pypy2.7-7.3.1 | 39 + .../share/python-build/pypy2.7-7.3.1-src | 3 + .../share/python-build/pypy2.7-7.3.10 | 81 + .../share/python-build/pypy2.7-7.3.10-src | 14 + .../share/python-build/pypy2.7-7.3.11 | 81 + .../share/python-build/pypy2.7-7.3.11-src | 14 + .../share/python-build/pypy2.7-7.3.12 | 81 + .../share/python-build/pypy2.7-7.3.12-src | 14 + .../share/python-build/pypy2.7-7.3.13 | 81 + .../share/python-build/pypy2.7-7.3.13-src | 14 + .../share/python-build/pypy2.7-7.3.14 | 81 + .../share/python-build/pypy2.7-7.3.14-src | 14 + .../share/python-build/pypy2.7-7.3.15 | 81 + .../share/python-build/pypy2.7-7.3.15-src | 14 + .../share/python-build/pypy2.7-7.3.16 | 81 + .../share/python-build/pypy2.7-7.3.16-src | 14 + .../share/python-build/pypy2.7-7.3.17 | 77 + .../share/python-build/pypy2.7-7.3.17-src | 14 + .../share/python-build/pypy2.7-7.3.18 | 77 + .../share/python-build/pypy2.7-7.3.18-src | 14 + .../share/python-build/pypy2.7-7.3.19 | 77 + .../share/python-build/pypy2.7-7.3.19-src | 14 + .../share/python-build/pypy2.7-7.3.2 | 39 + .../share/python-build/pypy2.7-7.3.2-src | 3 + .../share/python-build/pypy2.7-7.3.20 | 77 + .../share/python-build/pypy2.7-7.3.20-src | 14 + .../share/python-build/pypy2.7-7.3.22 | 77 + .../share/python-build/pypy2.7-7.3.22-src | 14 + .../share/python-build/pypy2.7-7.3.3 | 39 + .../share/python-build/pypy2.7-7.3.3-src | 3 + .../share/python-build/pypy2.7-7.3.4 | 39 + .../share/python-build/pypy2.7-7.3.4-src | 3 + .../share/python-build/pypy2.7-7.3.5 | 39 + .../share/python-build/pypy2.7-7.3.5-src | 3 + .../share/python-build/pypy2.7-7.3.6 | 39 + .../share/python-build/pypy2.7-7.3.6-src | 3 + .../share/python-build/pypy2.7-7.3.8 | 81 + .../share/python-build/pypy2.7-7.3.8-src | 14 + .../share/python-build/pypy2.7-7.3.9 | 81 + .../share/python-build/pypy2.7-7.3.9-src | 14 + .../share/python-build/pypy3-2.3.1 | 44 + .../share/python-build/pypy3-2.3.1-src | 3 + .../share/python-build/pypy3-2.4.0 | 44 + .../share/python-build/pypy3-2.4.0-src | 3 + .../share/python-build/pypy3.10-7.3.12 | 81 + .../share/python-build/pypy3.10-7.3.12-src | 14 + .../share/python-build/pypy3.10-7.3.13 | 81 + .../share/python-build/pypy3.10-7.3.13-src | 14 + .../share/python-build/pypy3.10-7.3.14 | 81 + .../share/python-build/pypy3.10-7.3.14-src | 14 + .../share/python-build/pypy3.10-7.3.15 | 81 + .../share/python-build/pypy3.10-7.3.15-src | 14 + .../share/python-build/pypy3.10-7.3.16 | 81 + .../share/python-build/pypy3.10-7.3.16-src | 14 + .../share/python-build/pypy3.10-7.3.17 | 77 + .../share/python-build/pypy3.10-7.3.17-src | 14 + .../share/python-build/pypy3.10-7.3.18 | 77 + .../share/python-build/pypy3.10-7.3.18-src | 14 + .../share/python-build/pypy3.10-7.3.19 | 77 + .../share/python-build/pypy3.10-7.3.19-src | 14 + .../share/python-build/pypy3.11-7.3.18 | 77 + .../share/python-build/pypy3.11-7.3.18-src | 14 + .../share/python-build/pypy3.11-7.3.19 | 77 + .../share/python-build/pypy3.11-7.3.19-src | 14 + .../share/python-build/pypy3.11-7.3.20 | 77 + .../share/python-build/pypy3.11-7.3.20-src | 14 + .../share/python-build/pypy3.11-7.3.22 | 77 + .../share/python-build/pypy3.11-7.3.22-src | 14 + .../share/python-build/pypy3.3-5.2-alpha1 | 40 + .../share/python-build/pypy3.3-5.2-alpha1-src | 3 + .../share/python-build/pypy3.3-5.5-alpha | 45 + .../share/python-build/pypy3.3-5.5-alpha-src | 3 + .../share/python-build/pypy3.5-5.10.0 | 51 + .../share/python-build/pypy3.5-5.10.0-src | 3 + .../share/python-build/pypy3.5-5.10.1 | 58 + .../share/python-build/pypy3.5-5.10.1-src | 3 + .../share/python-build/pypy3.5-5.7-beta | 18 + .../share/python-build/pypy3.5-5.7-beta-src | 3 + .../share/python-build/pypy3.5-5.7.1-beta | 18 + .../share/python-build/pypy3.5-5.7.1-beta-src | 3 + .../share/python-build/pypy3.5-5.8.0 | 18 + .../share/python-build/pypy3.5-5.8.0-src | 3 + .../share/python-build/pypy3.5-5.9.0 | 18 + .../share/python-build/pypy3.5-5.9.0-src | 3 + .../share/python-build/pypy3.5-6.0.0 | 57 + .../share/python-build/pypy3.5-6.0.0-src | 3 + .../share/python-build/pypy3.5-7.0.0 | 47 + .../share/python-build/pypy3.5-7.0.0-src | 3 + .../share/python-build/pypy3.5-c-jit-latest | 49 + .../share/python-build/pypy3.6-7.0.0 | 43 + .../share/python-build/pypy3.6-7.0.0-src | 3 + .../share/python-build/pypy3.6-7.1.0 | 47 + .../share/python-build/pypy3.6-7.1.0-src | 3 + .../share/python-build/pypy3.6-7.1.1 | 47 + .../share/python-build/pypy3.6-7.1.1-src | 3 + .../share/python-build/pypy3.6-7.2.0 | 47 + .../share/python-build/pypy3.6-7.2.0-src | 3 + .../share/python-build/pypy3.6-7.3.0 | 39 + .../share/python-build/pypy3.6-7.3.0-src | 3 + .../share/python-build/pypy3.6-7.3.1 | 39 + .../share/python-build/pypy3.6-7.3.1-src | 3 + .../share/python-build/pypy3.6-7.3.2 | 39 + .../share/python-build/pypy3.6-7.3.2-src | 3 + .../share/python-build/pypy3.6-7.3.3 | 39 + .../share/python-build/pypy3.6-7.3.3-src | 3 + .../share/python-build/pypy3.7-7.3.2 | 39 + .../share/python-build/pypy3.7-7.3.2-src | 3 + .../share/python-build/pypy3.7-7.3.3 | 39 + .../share/python-build/pypy3.7-7.3.3-src | 3 + .../share/python-build/pypy3.7-7.3.4 | 39 + .../share/python-build/pypy3.7-7.3.4-src | 3 + .../share/python-build/pypy3.7-7.3.5 | 40 + .../share/python-build/pypy3.7-7.3.5-src | 3 + .../share/python-build/pypy3.7-7.3.6 | 43 + .../share/python-build/pypy3.7-7.3.6-src | 6 + .../share/python-build/pypy3.7-7.3.7 | 43 + .../share/python-build/pypy3.7-7.3.7-src | 7 + .../share/python-build/pypy3.7-7.3.8 | 81 + .../share/python-build/pypy3.7-7.3.8-src | 14 + .../share/python-build/pypy3.7-7.3.9 | 81 + .../share/python-build/pypy3.7-7.3.9-src | 14 + .../share/python-build/pypy3.7-c-jit-latest | 39 + .../share/python-build/pypy3.8-7.3.10 | 81 + .../share/python-build/pypy3.8-7.3.10-src | 14 + .../share/python-build/pypy3.8-7.3.11 | 81 + .../share/python-build/pypy3.8-7.3.11-src | 14 + .../share/python-build/pypy3.8-7.3.6 | 43 + .../share/python-build/pypy3.8-7.3.6-src | 7 + .../share/python-build/pypy3.8-7.3.7 | 43 + .../share/python-build/pypy3.8-7.3.7-src | 7 + .../share/python-build/pypy3.8-7.3.8 | 81 + .../share/python-build/pypy3.8-7.3.8-src | 14 + .../share/python-build/pypy3.8-7.3.9 | 81 + .../share/python-build/pypy3.8-7.3.9-src | 14 + .../share/python-build/pypy3.9-7.3.10 | 81 + .../share/python-build/pypy3.9-7.3.10-src | 14 + .../share/python-build/pypy3.9-7.3.11 | 81 + .../share/python-build/pypy3.9-7.3.11-src | 14 + .../share/python-build/pypy3.9-7.3.12 | 81 + .../share/python-build/pypy3.9-7.3.12-src | 14 + .../share/python-build/pypy3.9-7.3.13 | 81 + .../share/python-build/pypy3.9-7.3.13-src | 14 + .../share/python-build/pypy3.9-7.3.14 | 81 + .../share/python-build/pypy3.9-7.3.14-src | 14 + .../share/python-build/pypy3.9-7.3.15 | 81 + .../share/python-build/pypy3.9-7.3.15-src | 14 + .../share/python-build/pypy3.9-7.3.16 | 81 + .../share/python-build/pypy3.9-7.3.16-src | 14 + .../share/python-build/pypy3.9-7.3.8 | 81 + .../share/python-build/pypy3.9-7.3.8-src | 14 + .../share/python-build/pypy3.9-7.3.9 | 81 + .../share/python-build/pypy3.9-7.3.9-src | 14 + .../share/python-build/pyston-2.2 | 19 + .../share/python-build/pyston-2.3 | 19 + .../share/python-build/pyston-2.3.1 | 19 + .../share/python-build/pyston-2.3.2 | 19 + .../share/python-build/pyston-2.3.3 | 16 + .../share/python-build/pyston-2.3.4 | 23 + .../share/python-build/pyston-2.3.5 | 23 + .../share/python-build/stackless-2.7-dev | 4 + .../share/python-build/stackless-2.7.10 | 3 + .../share/python-build/stackless-2.7.11 | 3 + .../share/python-build/stackless-2.7.12 | 3 + .../share/python-build/stackless-2.7.14 | 4 + .../share/python-build/stackless-2.7.16 | 3 + .../share/python-build/stackless-2.7.2 | 3 + .../share/python-build/stackless-2.7.3 | 3 + .../share/python-build/stackless-2.7.4 | 3 + .../share/python-build/stackless-2.7.5 | 3 + .../share/python-build/stackless-2.7.6 | 3 + .../share/python-build/stackless-2.7.7 | 3 + .../share/python-build/stackless-2.7.8 | 3 + .../share/python-build/stackless-2.7.9 | 3 + .../share/python-build/stackless-3.2.2 | 5 + .../share/python-build/stackless-3.2.5 | 5 + .../share/python-build/stackless-3.3.5 | 3 + .../share/python-build/stackless-3.3.7 | 3 + .../share/python-build/stackless-3.4-dev | 4 + .../share/python-build/stackless-3.4.2 | 3 + .../share/python-build/stackless-3.4.7 | 3 + .../share/python-build/stackless-3.5.4 | 3 + .../share/python-build/stackless-3.7.5 | 3 + .../share/python-build/stackless-dev | 4 + plugins/python-build/test/arguments.bats | 23 + plugins/python-build/test/build.bats | 1305 ++++ plugins/python-build/test/cache.bats | 88 + plugins/python-build/test/checksum.bats | 157 + plugins/python-build/test/compiler.bats | 127 + plugins/python-build/test/definitions.bats | 110 + plugins/python-build/test/fetch.bats | 67 + .../test/fixtures/definitions/needs-yaml | 2 + .../test/fixtures/definitions/vanilla-python | 1 + .../test/fixtures/definitions/with-checksum | 1 + .../definitions/with-invalid-checksum | 1 + .../fixtures/definitions/with-md5-checksum | 1 + .../fixtures/definitions/without-checksum | 1 + .../test/fixtures/package-1.0.0.tar.gz | Bin 0 -> 210 bytes plugins/python-build/test/hooks.bats | 94 + plugins/python-build/test/installer.bats | 61 + plugins/python-build/test/mirror.bats | 150 + plugins/python-build/test/pyenv.bats | 325 + plugins/python-build/test/pyenv_ext.bats | 469 ++ plugins/python-build/test/stubs/stub | 119 + plugins/python-build/test/test_helper.bash | 164 + plugins/python-build/test/version.bats | 38 + pyenv.d/exec/pip-rehash.bash | 16 + pyenv.d/exec/pip-rehash/conda | 29 + pyenv.d/exec/pip-rehash/easy_install | 27 + pyenv.d/exec/pip-rehash/pip | 31 + pyenv.d/install/latest.bash | 25 + pyenv.d/rehash/conda.bash | 72 + pyenv.d/rehash/conda.d/.gitignore | 3 + pyenv.d/rehash/conda.d/default.list | 195 + pyenv.d/rehash/source.bash | 31 + pyenv.d/rehash/source.d/.gitignore | 3 + pyenv.d/rehash/source.d/default.list | 7 + src/Makefile.in | 25 + src/bash.h | 31 + src/configure | 49 + src/realpath.c | 43 + src/shobj-conf | 594 ++ terminal_output.png | Bin 0 -> 104764 bytes test/--version.bats | 52 + test/Dockerfile | 25 + test/README.md | 76 + test/commands.bats | 39 + test/completions.bats | 51 + test/exec.bats | 141 + test/global.bats | 31 + test/help.bats | 115 + test/hooks.bats | 70 + test/init.bats | 254 + test/latest.bats | 130 + test/libexec/pyenv-echo | 9 + test/local.bats | 71 + test/pip-rehash.bats | 60 + test/prefix.bats | 51 + test/pyenv.bats | 72 + test/pyenv_ext.bats | 14 + test/rehash.bats | 178 + test/run | 9 + test/shell.bats | 119 + test/shims-linked-from-elsewhere.bats | 39 + test/shims.bats | 29 + test/test_helper.bash | 195 + test/version-file-read.bats | 118 + test/version-file-write.bats | 37 + test/version-file.bats | 75 + test/version-name.bats | 141 + test/version-origin.bats | 56 + test/version.bats | 81 + test/versions.bats | 273 + test/whence.bats | 23 + test/which.bats | 221 + 1500 files changed, 110179 insertions(+) create mode 100644 .DS_Store create mode 100644 .agignore create mode 100644 .dockerignore create mode 100644 .editorconfig create mode 100644 .github/CODEOWNERS create mode 100644 .github/FUNDING.yml create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/add_version.yml create mode 100644 .github/workflows/macos_build.yml create mode 100644 .github/workflows/modified_scripts_build.yml create mode 100644 .github/workflows/no-response.yml create mode 100644 .github/workflows/pyenv_tests.yml create mode 100755 .github/workflows/scripts/brew-uninstall-cascade.sh create mode 100644 .github/workflows/ubuntu_build.yml create mode 100644 .gitignore create mode 100644 .vimrc create mode 100644 CHANGELOG.md create mode 100644 COMMANDS.md create mode 100644 CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 MAINTENANCE.md create mode 100644 Makefile create mode 100644 README.md create mode 120000 bin/pyenv create mode 100644 completions/pyenv.bash create mode 100644 completions/pyenv.fish create mode 100644 completions/pyenv.pwsh create mode 100644 completions/pyenv.zsh create mode 100644 install_local_python.gif create mode 100755 libexec/pyenv create mode 100755 libexec/pyenv---version create mode 100755 libexec/pyenv-commands create mode 100755 libexec/pyenv-completions create mode 100755 libexec/pyenv-exec create mode 100755 libexec/pyenv-global create mode 100755 libexec/pyenv-help create mode 100755 libexec/pyenv-hooks create mode 100755 libexec/pyenv-init create mode 100755 libexec/pyenv-latest create mode 100755 libexec/pyenv-local create mode 100755 libexec/pyenv-prefix create mode 100755 libexec/pyenv-rehash create mode 100755 libexec/pyenv-root create mode 100755 libexec/pyenv-sh-rehash create mode 100755 libexec/pyenv-sh-shell create mode 100755 libexec/pyenv-shims create mode 100755 libexec/pyenv-version create mode 100755 libexec/pyenv-version-file create mode 100755 libexec/pyenv-version-file-read create mode 100755 libexec/pyenv-version-file-write create mode 100755 libexec/pyenv-version-name create mode 100755 libexec/pyenv-version-origin create mode 100755 libexec/pyenv-versions create mode 100755 libexec/pyenv-whence create mode 100755 libexec/pyenv-which create mode 100644 man/man1/pyenv.1 create mode 100644 plugins/.gitignore create mode 100644 plugins/python-build/LICENSE create mode 100644 plugins/python-build/README.md create mode 100755 plugins/python-build/bin/pyenv-install create mode 100755 plugins/python-build/bin/pyenv-uninstall create mode 100755 plugins/python-build/bin/python-build create mode 100755 plugins/python-build/install.sh create mode 100644 plugins/python-build/scripts/.gitignore create mode 100644 plugins/python-build/scripts/README.md create mode 100755 plugins/python-build/scripts/add_cpython.py create mode 100755 plugins/python-build/scripts/add_miniconda.py create mode 100755 plugins/python-build/scripts/add_miniforge.py create mode 100644 plugins/python-build/scripts/requirements.txt create mode 100644 plugins/python-build/share/python-build/2.1.3 create mode 100644 plugins/python-build/share/python-build/2.2.3 create mode 100644 plugins/python-build/share/python-build/2.3.7 create mode 100644 plugins/python-build/share/python-build/2.4.0 create mode 100644 plugins/python-build/share/python-build/2.4.1 create mode 100644 plugins/python-build/share/python-build/2.4.2 create mode 100644 plugins/python-build/share/python-build/2.4.3 create mode 100644 plugins/python-build/share/python-build/2.4.4 create mode 100644 plugins/python-build/share/python-build/2.4.5 create mode 100644 plugins/python-build/share/python-build/2.4.6 create mode 100644 plugins/python-build/share/python-build/2.5.0 create mode 100644 plugins/python-build/share/python-build/2.5.1 create mode 100644 plugins/python-build/share/python-build/2.5.2 create mode 100644 plugins/python-build/share/python-build/2.5.3 create mode 100644 plugins/python-build/share/python-build/2.5.4 create mode 100644 plugins/python-build/share/python-build/2.5.5 create mode 100644 plugins/python-build/share/python-build/2.5.6 create mode 100644 plugins/python-build/share/python-build/2.6.0 create mode 100644 plugins/python-build/share/python-build/2.6.1 create mode 100644 plugins/python-build/share/python-build/2.6.2 create mode 100644 plugins/python-build/share/python-build/2.6.3 create mode 100644 plugins/python-build/share/python-build/2.6.4 create mode 100644 plugins/python-build/share/python-build/2.6.5 create mode 100644 plugins/python-build/share/python-build/2.6.6 create mode 100644 plugins/python-build/share/python-build/2.6.7 create mode 100644 plugins/python-build/share/python-build/2.6.8 create mode 100644 plugins/python-build/share/python-build/2.6.9 create mode 100644 plugins/python-build/share/python-build/2.7-dev create mode 100644 plugins/python-build/share/python-build/2.7.0 create mode 100644 plugins/python-build/share/python-build/2.7.1 create mode 100644 plugins/python-build/share/python-build/2.7.10 create mode 100644 plugins/python-build/share/python-build/2.7.11 create mode 100644 plugins/python-build/share/python-build/2.7.12 create mode 100644 plugins/python-build/share/python-build/2.7.13 create mode 100644 plugins/python-build/share/python-build/2.7.14 create mode 100644 plugins/python-build/share/python-build/2.7.15 create mode 100644 plugins/python-build/share/python-build/2.7.16 create mode 100644 plugins/python-build/share/python-build/2.7.17 create mode 100644 plugins/python-build/share/python-build/2.7.18 create mode 100644 plugins/python-build/share/python-build/2.7.2 create mode 100644 plugins/python-build/share/python-build/2.7.3 create mode 100644 plugins/python-build/share/python-build/2.7.4 create mode 100644 plugins/python-build/share/python-build/2.7.5 create mode 100644 plugins/python-build/share/python-build/2.7.6 create mode 100644 plugins/python-build/share/python-build/2.7.7 create mode 100644 plugins/python-build/share/python-build/2.7.8 create mode 100644 plugins/python-build/share/python-build/2.7.9 create mode 100644 plugins/python-build/share/python-build/3.0.1 create mode 100644 plugins/python-build/share/python-build/3.1.0 create mode 100644 plugins/python-build/share/python-build/3.1.1 create mode 100644 plugins/python-build/share/python-build/3.1.2 create mode 100644 plugins/python-build/share/python-build/3.1.3 create mode 100644 plugins/python-build/share/python-build/3.1.4 create mode 100644 plugins/python-build/share/python-build/3.1.5 create mode 100644 plugins/python-build/share/python-build/3.10-dev create mode 100644 plugins/python-build/share/python-build/3.10.0 create mode 100644 plugins/python-build/share/python-build/3.10.1 create mode 100644 plugins/python-build/share/python-build/3.10.10 create mode 100644 plugins/python-build/share/python-build/3.10.11 create mode 100644 plugins/python-build/share/python-build/3.10.12 create mode 100644 plugins/python-build/share/python-build/3.10.13 create mode 100644 plugins/python-build/share/python-build/3.10.14 create mode 100644 plugins/python-build/share/python-build/3.10.15 create mode 100644 plugins/python-build/share/python-build/3.10.16 create mode 100644 plugins/python-build/share/python-build/3.10.17 create mode 100644 plugins/python-build/share/python-build/3.10.18 create mode 100644 plugins/python-build/share/python-build/3.10.19 create mode 100644 plugins/python-build/share/python-build/3.10.2 create mode 100644 plugins/python-build/share/python-build/3.10.20 create mode 100644 plugins/python-build/share/python-build/3.10.3 create mode 100644 plugins/python-build/share/python-build/3.10.4 create mode 100644 plugins/python-build/share/python-build/3.10.5 create mode 100644 plugins/python-build/share/python-build/3.10.6 create mode 100644 plugins/python-build/share/python-build/3.10.7 create mode 100644 plugins/python-build/share/python-build/3.10.8 create mode 100644 plugins/python-build/share/python-build/3.10.9 create mode 100644 plugins/python-build/share/python-build/3.11-dev create mode 100644 plugins/python-build/share/python-build/3.11.0 create mode 100644 plugins/python-build/share/python-build/3.11.1 create mode 100644 plugins/python-build/share/python-build/3.11.10 create mode 100644 plugins/python-build/share/python-build/3.11.11 create mode 100644 plugins/python-build/share/python-build/3.11.12 create mode 100644 plugins/python-build/share/python-build/3.11.13 create mode 100644 plugins/python-build/share/python-build/3.11.14 create mode 100644 plugins/python-build/share/python-build/3.11.15 create mode 100644 plugins/python-build/share/python-build/3.11.2 create mode 100644 plugins/python-build/share/python-build/3.11.3 create mode 100644 plugins/python-build/share/python-build/3.11.4 create mode 100644 plugins/python-build/share/python-build/3.11.5 create mode 100644 plugins/python-build/share/python-build/3.11.6 create mode 100644 plugins/python-build/share/python-build/3.11.7 create mode 100644 plugins/python-build/share/python-build/3.11.8 create mode 100644 plugins/python-build/share/python-build/3.11.9 create mode 100644 plugins/python-build/share/python-build/3.12-dev create mode 100644 plugins/python-build/share/python-build/3.12.0 create mode 100644 plugins/python-build/share/python-build/3.12.1 create mode 100644 plugins/python-build/share/python-build/3.12.10 create mode 100644 plugins/python-build/share/python-build/3.12.11 create mode 100644 plugins/python-build/share/python-build/3.12.12 create mode 100644 plugins/python-build/share/python-build/3.12.13 create mode 100644 plugins/python-build/share/python-build/3.12.2 create mode 100644 plugins/python-build/share/python-build/3.12.3 create mode 100644 plugins/python-build/share/python-build/3.12.4 create mode 100644 plugins/python-build/share/python-build/3.12.5 create mode 100644 plugins/python-build/share/python-build/3.12.6 create mode 100644 plugins/python-build/share/python-build/3.12.7 create mode 100644 plugins/python-build/share/python-build/3.12.8 create mode 100644 plugins/python-build/share/python-build/3.12.9 create mode 100644 plugins/python-build/share/python-build/3.13-dev create mode 100644 plugins/python-build/share/python-build/3.13.0 create mode 100644 plugins/python-build/share/python-build/3.13.0t create mode 100644 plugins/python-build/share/python-build/3.13.1 create mode 100644 plugins/python-build/share/python-build/3.13.10 create mode 100644 plugins/python-build/share/python-build/3.13.10t create mode 100644 plugins/python-build/share/python-build/3.13.11 create mode 100644 plugins/python-build/share/python-build/3.13.12 create mode 100644 plugins/python-build/share/python-build/3.13.12t create mode 100644 plugins/python-build/share/python-build/3.13.13 create mode 100644 plugins/python-build/share/python-build/3.13.13t create mode 100644 plugins/python-build/share/python-build/3.13.1t create mode 100644 plugins/python-build/share/python-build/3.13.2 create mode 100644 plugins/python-build/share/python-build/3.13.2t create mode 100644 plugins/python-build/share/python-build/3.13.3 create mode 100644 plugins/python-build/share/python-build/3.13.3t create mode 100644 plugins/python-build/share/python-build/3.13.4 create mode 100644 plugins/python-build/share/python-build/3.13.4t create mode 100644 plugins/python-build/share/python-build/3.13.5 create mode 100644 plugins/python-build/share/python-build/3.13.5t create mode 100644 plugins/python-build/share/python-build/3.13.6 create mode 100644 plugins/python-build/share/python-build/3.13.6t create mode 100644 plugins/python-build/share/python-build/3.13.7 create mode 100644 plugins/python-build/share/python-build/3.13.7t create mode 100644 plugins/python-build/share/python-build/3.13.8 create mode 100644 plugins/python-build/share/python-build/3.13.8t create mode 100644 plugins/python-build/share/python-build/3.13.9 create mode 100644 plugins/python-build/share/python-build/3.13.9t create mode 100644 plugins/python-build/share/python-build/3.13t-dev create mode 100644 plugins/python-build/share/python-build/3.14-dev create mode 100644 plugins/python-build/share/python-build/3.14.0 create mode 100644 plugins/python-build/share/python-build/3.14.0t create mode 100644 plugins/python-build/share/python-build/3.14.1 create mode 100644 plugins/python-build/share/python-build/3.14.1t create mode 100644 plugins/python-build/share/python-build/3.14.2 create mode 100644 plugins/python-build/share/python-build/3.14.3 create mode 100644 plugins/python-build/share/python-build/3.14.3t create mode 100644 plugins/python-build/share/python-build/3.14.4 create mode 100644 plugins/python-build/share/python-build/3.14.4t create mode 100644 plugins/python-build/share/python-build/3.14.5 create mode 100644 plugins/python-build/share/python-build/3.14.5t create mode 100644 plugins/python-build/share/python-build/3.14t-dev create mode 100644 plugins/python-build/share/python-build/3.15-dev create mode 100644 plugins/python-build/share/python-build/3.15.0b1 create mode 100644 plugins/python-build/share/python-build/3.15.0b1t create mode 100644 plugins/python-build/share/python-build/3.15t-dev create mode 100644 plugins/python-build/share/python-build/3.16-dev create mode 100644 plugins/python-build/share/python-build/3.16t-dev create mode 100644 plugins/python-build/share/python-build/3.2.0 create mode 100644 plugins/python-build/share/python-build/3.2.1 create mode 100644 plugins/python-build/share/python-build/3.2.2 create mode 100644 plugins/python-build/share/python-build/3.2.3 create mode 100644 plugins/python-build/share/python-build/3.2.4 create mode 100644 plugins/python-build/share/python-build/3.2.5 create mode 100644 plugins/python-build/share/python-build/3.2.6 create mode 100644 plugins/python-build/share/python-build/3.3.0 create mode 100644 plugins/python-build/share/python-build/3.3.1 create mode 100644 plugins/python-build/share/python-build/3.3.2 create mode 100644 plugins/python-build/share/python-build/3.3.3 create mode 100644 plugins/python-build/share/python-build/3.3.4 create mode 100644 plugins/python-build/share/python-build/3.3.5 create mode 100644 plugins/python-build/share/python-build/3.3.6 create mode 100644 plugins/python-build/share/python-build/3.3.7 create mode 100644 plugins/python-build/share/python-build/3.4-dev create mode 100644 plugins/python-build/share/python-build/3.4.0 create mode 100644 plugins/python-build/share/python-build/3.4.1 create mode 100644 plugins/python-build/share/python-build/3.4.10 create mode 100644 plugins/python-build/share/python-build/3.4.2 create mode 100644 plugins/python-build/share/python-build/3.4.3 create mode 100644 plugins/python-build/share/python-build/3.4.4 create mode 100644 plugins/python-build/share/python-build/3.4.5 create mode 100644 plugins/python-build/share/python-build/3.4.6 create mode 100644 plugins/python-build/share/python-build/3.4.7 create mode 100644 plugins/python-build/share/python-build/3.4.8 create mode 100644 plugins/python-build/share/python-build/3.4.9 create mode 100644 plugins/python-build/share/python-build/3.5-dev create mode 100644 plugins/python-build/share/python-build/3.5.0 create mode 100644 plugins/python-build/share/python-build/3.5.1 create mode 100644 plugins/python-build/share/python-build/3.5.10 create mode 100644 plugins/python-build/share/python-build/3.5.2 create mode 100644 plugins/python-build/share/python-build/3.5.3 create mode 100644 plugins/python-build/share/python-build/3.5.4 create mode 100644 plugins/python-build/share/python-build/3.5.5 create mode 100644 plugins/python-build/share/python-build/3.5.6 create mode 100644 plugins/python-build/share/python-build/3.5.7 create mode 100644 plugins/python-build/share/python-build/3.5.8 create mode 100644 plugins/python-build/share/python-build/3.5.9 create mode 100644 plugins/python-build/share/python-build/3.6-dev create mode 100644 plugins/python-build/share/python-build/3.6.0 create mode 100644 plugins/python-build/share/python-build/3.6.1 create mode 100644 plugins/python-build/share/python-build/3.6.10 create mode 100644 plugins/python-build/share/python-build/3.6.11 create mode 100644 plugins/python-build/share/python-build/3.6.12 create mode 100644 plugins/python-build/share/python-build/3.6.13 create mode 100644 plugins/python-build/share/python-build/3.6.14 create mode 100644 plugins/python-build/share/python-build/3.6.15 create mode 100644 plugins/python-build/share/python-build/3.6.2 create mode 100644 plugins/python-build/share/python-build/3.6.3 create mode 100644 plugins/python-build/share/python-build/3.6.4 create mode 100644 plugins/python-build/share/python-build/3.6.5 create mode 100644 plugins/python-build/share/python-build/3.6.6 create mode 100644 plugins/python-build/share/python-build/3.6.7 create mode 100644 plugins/python-build/share/python-build/3.6.8 create mode 100644 plugins/python-build/share/python-build/3.6.9 create mode 100644 plugins/python-build/share/python-build/3.7-dev create mode 100644 plugins/python-build/share/python-build/3.7.0 create mode 100644 plugins/python-build/share/python-build/3.7.1 create mode 100644 plugins/python-build/share/python-build/3.7.10 create mode 100644 plugins/python-build/share/python-build/3.7.11 create mode 100644 plugins/python-build/share/python-build/3.7.12 create mode 100644 plugins/python-build/share/python-build/3.7.13 create mode 100644 plugins/python-build/share/python-build/3.7.14 create mode 100644 plugins/python-build/share/python-build/3.7.15 create mode 100644 plugins/python-build/share/python-build/3.7.16 create mode 100644 plugins/python-build/share/python-build/3.7.17 create mode 100644 plugins/python-build/share/python-build/3.7.2 create mode 100644 plugins/python-build/share/python-build/3.7.3 create mode 100644 plugins/python-build/share/python-build/3.7.4 create mode 100644 plugins/python-build/share/python-build/3.7.5 create mode 100644 plugins/python-build/share/python-build/3.7.6 create mode 100644 plugins/python-build/share/python-build/3.7.7 create mode 100644 plugins/python-build/share/python-build/3.7.8 create mode 100644 plugins/python-build/share/python-build/3.7.9 create mode 100644 plugins/python-build/share/python-build/3.8-dev create mode 100644 plugins/python-build/share/python-build/3.8.0 create mode 100644 plugins/python-build/share/python-build/3.8.1 create mode 100644 plugins/python-build/share/python-build/3.8.10 create mode 100644 plugins/python-build/share/python-build/3.8.11 create mode 100644 plugins/python-build/share/python-build/3.8.12 create mode 100644 plugins/python-build/share/python-build/3.8.13 create mode 100644 plugins/python-build/share/python-build/3.8.14 create mode 100644 plugins/python-build/share/python-build/3.8.15 create mode 100644 plugins/python-build/share/python-build/3.8.16 create mode 100644 plugins/python-build/share/python-build/3.8.17 create mode 100644 plugins/python-build/share/python-build/3.8.18 create mode 100644 plugins/python-build/share/python-build/3.8.19 create mode 100644 plugins/python-build/share/python-build/3.8.2 create mode 100644 plugins/python-build/share/python-build/3.8.20 create mode 100644 plugins/python-build/share/python-build/3.8.3 create mode 100644 plugins/python-build/share/python-build/3.8.4 create mode 100644 plugins/python-build/share/python-build/3.8.5 create mode 100644 plugins/python-build/share/python-build/3.8.6 create mode 100644 plugins/python-build/share/python-build/3.8.7 create mode 100644 plugins/python-build/share/python-build/3.8.8 create mode 100644 plugins/python-build/share/python-build/3.8.9 create mode 100644 plugins/python-build/share/python-build/3.9-dev create mode 100644 plugins/python-build/share/python-build/3.9.0 create mode 100644 plugins/python-build/share/python-build/3.9.1 create mode 100644 plugins/python-build/share/python-build/3.9.10 create mode 100644 plugins/python-build/share/python-build/3.9.11 create mode 100644 plugins/python-build/share/python-build/3.9.12 create mode 100644 plugins/python-build/share/python-build/3.9.13 create mode 100644 plugins/python-build/share/python-build/3.9.14 create mode 100644 plugins/python-build/share/python-build/3.9.15 create mode 100644 plugins/python-build/share/python-build/3.9.16 create mode 100644 plugins/python-build/share/python-build/3.9.17 create mode 100644 plugins/python-build/share/python-build/3.9.18 create mode 100644 plugins/python-build/share/python-build/3.9.19 create mode 100644 plugins/python-build/share/python-build/3.9.2 create mode 100644 plugins/python-build/share/python-build/3.9.20 create mode 100644 plugins/python-build/share/python-build/3.9.21 create mode 100644 plugins/python-build/share/python-build/3.9.22 create mode 100644 plugins/python-build/share/python-build/3.9.23 create mode 100644 plugins/python-build/share/python-build/3.9.24 create mode 100644 plugins/python-build/share/python-build/3.9.25 create mode 100644 plugins/python-build/share/python-build/3.9.4 create mode 100644 plugins/python-build/share/python-build/3.9.5 create mode 100644 plugins/python-build/share/python-build/3.9.6 create mode 100644 plugins/python-build/share/python-build/3.9.7 create mode 100644 plugins/python-build/share/python-build/3.9.8 create mode 100644 plugins/python-build/share/python-build/3.9.9 create mode 100644 plugins/python-build/share/python-build/activepython-2.7.14 create mode 100644 plugins/python-build/share/python-build/activepython-3.5.4 create mode 100644 plugins/python-build/share/python-build/activepython-3.6.0 create mode 100644 plugins/python-build/share/python-build/anaconda-1.4.0 create mode 100644 plugins/python-build/share/python-build/anaconda-1.5.0 create mode 100644 plugins/python-build/share/python-build/anaconda-1.5.1 create mode 100644 plugins/python-build/share/python-build/anaconda-1.6.0 create mode 100644 plugins/python-build/share/python-build/anaconda-1.6.1 create mode 100644 plugins/python-build/share/python-build/anaconda-1.7.0 create mode 100644 plugins/python-build/share/python-build/anaconda-1.8.0 create mode 100644 plugins/python-build/share/python-build/anaconda-1.9.0 create mode 100644 plugins/python-build/share/python-build/anaconda-1.9.1 create mode 100644 plugins/python-build/share/python-build/anaconda-1.9.2 create mode 100644 plugins/python-build/share/python-build/anaconda-2.0.0 create mode 100644 plugins/python-build/share/python-build/anaconda-2.0.1 create mode 100644 plugins/python-build/share/python-build/anaconda-2.1.0 create mode 100644 plugins/python-build/share/python-build/anaconda-2.2.0 create mode 100644 plugins/python-build/share/python-build/anaconda-2.3.0 create mode 100644 plugins/python-build/share/python-build/anaconda-2.4.0 create mode 100644 plugins/python-build/share/python-build/anaconda-4.0.0 create mode 100644 plugins/python-build/share/python-build/anaconda2-2.4.0 create mode 100644 plugins/python-build/share/python-build/anaconda2-2.4.1 create mode 100644 plugins/python-build/share/python-build/anaconda2-2.5.0 create mode 100644 plugins/python-build/share/python-build/anaconda2-2018.12 create mode 100644 plugins/python-build/share/python-build/anaconda2-2019.03 create mode 100644 plugins/python-build/share/python-build/anaconda2-2019.07 create mode 100644 plugins/python-build/share/python-build/anaconda2-2019.10 create mode 100644 plugins/python-build/share/python-build/anaconda2-4.0.0 create mode 100644 plugins/python-build/share/python-build/anaconda2-4.1.0 create mode 100644 plugins/python-build/share/python-build/anaconda2-4.1.1 create mode 100644 plugins/python-build/share/python-build/anaconda2-4.2.0 create mode 100644 plugins/python-build/share/python-build/anaconda2-4.3.0 create mode 100644 plugins/python-build/share/python-build/anaconda2-4.3.1 create mode 100644 plugins/python-build/share/python-build/anaconda2-4.4.0 create mode 100644 plugins/python-build/share/python-build/anaconda2-5.0.0 create mode 100644 plugins/python-build/share/python-build/anaconda2-5.0.1 create mode 100644 plugins/python-build/share/python-build/anaconda2-5.1.0 create mode 100644 plugins/python-build/share/python-build/anaconda2-5.2.0 create mode 100644 plugins/python-build/share/python-build/anaconda2-5.3.0 create mode 100644 plugins/python-build/share/python-build/anaconda2-5.3.1 create mode 100644 plugins/python-build/share/python-build/anaconda3-2.0.0 create mode 100644 plugins/python-build/share/python-build/anaconda3-2.0.1 create mode 100644 plugins/python-build/share/python-build/anaconda3-2.1.0 create mode 100644 plugins/python-build/share/python-build/anaconda3-2.2.0 create mode 100644 plugins/python-build/share/python-build/anaconda3-2.3.0 create mode 100644 plugins/python-build/share/python-build/anaconda3-2.4.0 create mode 100644 plugins/python-build/share/python-build/anaconda3-2.4.1 create mode 100644 plugins/python-build/share/python-build/anaconda3-2.5.0 create mode 100644 plugins/python-build/share/python-build/anaconda3-2018.12 create mode 100644 plugins/python-build/share/python-build/anaconda3-2019.03 create mode 100644 plugins/python-build/share/python-build/anaconda3-2019.07 create mode 100644 plugins/python-build/share/python-build/anaconda3-2019.10 create mode 100644 plugins/python-build/share/python-build/anaconda3-2020.02 create mode 100644 plugins/python-build/share/python-build/anaconda3-2020.07 create mode 100644 plugins/python-build/share/python-build/anaconda3-2020.11 create mode 100644 plugins/python-build/share/python-build/anaconda3-2021.04 create mode 100644 plugins/python-build/share/python-build/anaconda3-2021.05 create mode 100644 plugins/python-build/share/python-build/anaconda3-2021.11 create mode 100644 plugins/python-build/share/python-build/anaconda3-2022.05 create mode 100644 plugins/python-build/share/python-build/anaconda3-2022.10 create mode 100644 plugins/python-build/share/python-build/anaconda3-2023.03 create mode 100644 plugins/python-build/share/python-build/anaconda3-2023.03-0 create mode 100644 plugins/python-build/share/python-build/anaconda3-2023.03-1 create mode 100644 plugins/python-build/share/python-build/anaconda3-2023.07-0 create mode 100644 plugins/python-build/share/python-build/anaconda3-2023.07-1 create mode 100644 plugins/python-build/share/python-build/anaconda3-2023.07-2 create mode 100644 plugins/python-build/share/python-build/anaconda3-2023.09-0 create mode 100644 plugins/python-build/share/python-build/anaconda3-2024.02-1 create mode 100644 plugins/python-build/share/python-build/anaconda3-2024.06-1 create mode 100644 plugins/python-build/share/python-build/anaconda3-2024.10-1 create mode 100644 plugins/python-build/share/python-build/anaconda3-2025.06-0 create mode 100644 plugins/python-build/share/python-build/anaconda3-2025.06-1 create mode 100644 plugins/python-build/share/python-build/anaconda3-2025.12-1 create mode 100644 plugins/python-build/share/python-build/anaconda3-2025.12-2 create mode 100644 plugins/python-build/share/python-build/anaconda3-4.0.0 create mode 100644 plugins/python-build/share/python-build/anaconda3-4.1.0 create mode 100644 plugins/python-build/share/python-build/anaconda3-4.1.1 create mode 100644 plugins/python-build/share/python-build/anaconda3-4.2.0 create mode 100644 plugins/python-build/share/python-build/anaconda3-4.3.0 create mode 100644 plugins/python-build/share/python-build/anaconda3-4.3.1 create mode 100644 plugins/python-build/share/python-build/anaconda3-4.4.0 create mode 100644 plugins/python-build/share/python-build/anaconda3-5.0.0 create mode 100644 plugins/python-build/share/python-build/anaconda3-5.0.1 create mode 100644 plugins/python-build/share/python-build/anaconda3-5.1.0 create mode 100644 plugins/python-build/share/python-build/anaconda3-5.2.0 create mode 100644 plugins/python-build/share/python-build/anaconda3-5.3.0 create mode 100644 plugins/python-build/share/python-build/anaconda3-5.3.1 create mode 100644 plugins/python-build/share/python-build/cinder-3.10-dev create mode 100644 plugins/python-build/share/python-build/cinder-3.8-dev create mode 100644 plugins/python-build/share/python-build/graalpy-22.3.0 create mode 100644 plugins/python-build/share/python-build/graalpy-23.0.0 create mode 100644 plugins/python-build/share/python-build/graalpy-23.1.0 create mode 100644 plugins/python-build/share/python-build/graalpy-23.1.2 create mode 100644 plugins/python-build/share/python-build/graalpy-24.0.0 create mode 100644 plugins/python-build/share/python-build/graalpy-24.1.0 create mode 100644 plugins/python-build/share/python-build/graalpy-24.1.1 create mode 100644 plugins/python-build/share/python-build/graalpy-24.1.2 create mode 100644 plugins/python-build/share/python-build/graalpy-24.2.0 create mode 100644 plugins/python-build/share/python-build/graalpy-24.2.1 create mode 100644 plugins/python-build/share/python-build/graalpy-24.2.2 create mode 100644 plugins/python-build/share/python-build/graalpy-25.0.0 create mode 100644 plugins/python-build/share/python-build/graalpy-25.0.1 create mode 100644 plugins/python-build/share/python-build/graalpy-25.0.2 create mode 100644 plugins/python-build/share/python-build/graalpy-community-23.1.0 create mode 100644 plugins/python-build/share/python-build/graalpy-community-23.1.2 create mode 100644 plugins/python-build/share/python-build/graalpy-community-24.0.0 create mode 100644 plugins/python-build/share/python-build/graalpy-community-24.1.0 create mode 100644 plugins/python-build/share/python-build/graalpy-community-24.1.1 create mode 100644 plugins/python-build/share/python-build/graalpy-community-24.1.2 create mode 100644 plugins/python-build/share/python-build/graalpy-community-24.2.0 create mode 100644 plugins/python-build/share/python-build/graalpy-community-24.2.1 create mode 100644 plugins/python-build/share/python-build/graalpy-community-24.2.2 create mode 100644 plugins/python-build/share/python-build/graalpy-community-25.0.0 create mode 100644 plugins/python-build/share/python-build/graalpy-community-25.0.1 create mode 100644 plugins/python-build/share/python-build/graalpy-community-25.0.2 create mode 100644 plugins/python-build/share/python-build/graalpy-dev create mode 100644 plugins/python-build/share/python-build/graalpython-20.1.0 create mode 100644 plugins/python-build/share/python-build/graalpython-20.2.0 create mode 100644 plugins/python-build/share/python-build/graalpython-20.3.0 create mode 100644 plugins/python-build/share/python-build/graalpython-21.0.0 create mode 100644 plugins/python-build/share/python-build/graalpython-21.1.0 create mode 100644 plugins/python-build/share/python-build/graalpython-21.2.0 create mode 100644 plugins/python-build/share/python-build/graalpython-21.3.0 create mode 100644 plugins/python-build/share/python-build/graalpython-22.0.0 create mode 100644 plugins/python-build/share/python-build/graalpython-22.1.0 create mode 100644 plugins/python-build/share/python-build/graalpython-22.2.0 create mode 100644 plugins/python-build/share/python-build/ironpython-2.7.4 create mode 100644 plugins/python-build/share/python-build/ironpython-2.7.5 create mode 100644 plugins/python-build/share/python-build/ironpython-2.7.6.3 create mode 100644 plugins/python-build/share/python-build/ironpython-2.7.7 create mode 100644 plugins/python-build/share/python-build/ironpython-dev create mode 100644 plugins/python-build/share/python-build/jython-2.5-dev create mode 100644 plugins/python-build/share/python-build/jython-2.5.0 create mode 100644 plugins/python-build/share/python-build/jython-2.5.1 create mode 100644 plugins/python-build/share/python-build/jython-2.5.2 create mode 100644 plugins/python-build/share/python-build/jython-2.5.3 create mode 100644 plugins/python-build/share/python-build/jython-2.5.4-rc1 create mode 100644 plugins/python-build/share/python-build/jython-2.7.0 create mode 100644 plugins/python-build/share/python-build/jython-2.7.1 create mode 100644 plugins/python-build/share/python-build/jython-2.7.2 create mode 100644 plugins/python-build/share/python-build/jython-2.7.3 create mode 100644 plugins/python-build/share/python-build/jython-2.7.4 create mode 100644 plugins/python-build/share/python-build/jython-dev create mode 100644 plugins/python-build/share/python-build/mambaforge create mode 100644 plugins/python-build/share/python-build/mambaforge-22.11.1-3 create mode 100644 plugins/python-build/share/python-build/mambaforge-22.11.1-4 create mode 100644 plugins/python-build/share/python-build/mambaforge-22.9.0-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-22.9.0-1 create mode 100644 plugins/python-build/share/python-build/mambaforge-22.9.0-2 create mode 100644 plugins/python-build/share/python-build/mambaforge-22.9.0-3 create mode 100644 plugins/python-build/share/python-build/mambaforge-23.1.0-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-23.1.0-1 create mode 100644 plugins/python-build/share/python-build/mambaforge-23.1.0-2 create mode 100644 plugins/python-build/share/python-build/mambaforge-23.1.0-3 create mode 100644 plugins/python-build/share/python-build/mambaforge-23.1.0-4 create mode 100644 plugins/python-build/share/python-build/mambaforge-23.10.0-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-23.11.0-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-23.3.0-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-23.3.1-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-23.3.1-1 create mode 100644 plugins/python-build/share/python-build/mambaforge-24.1.2-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-24.11.0-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-24.11.0-1 create mode 100644 plugins/python-build/share/python-build/mambaforge-24.3.0-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-24.5.0-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-24.7.1-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-24.7.1-1 create mode 100644 plugins/python-build/share/python-build/mambaforge-24.7.1-2 create mode 100644 plugins/python-build/share/python-build/mambaforge-24.9.0-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-24.9.2-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.10.1-4 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.10.1-5 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.10.2-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.10.3-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.10.3-1 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.10.3-10 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.10.3-2 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.10.3-3 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.10.3-4 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.10.3-5 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.10.3-6 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.10.3-7 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.10.3-8 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.10.3-9 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.11.0-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.11.0-1 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.11.0-2 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.11.0-3 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.11.0-4 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.12.0-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.12.0-1 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.12.0-2 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.12.0-3 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.13.0-1 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.14.0-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.14.0-1 create mode 100644 plugins/python-build/share/python-build/mambaforge-4.14.0-2 create mode 100644 plugins/python-build/share/python-build/mambaforge-pypy3 create mode 100644 plugins/python-build/share/python-build/micropython-1.10 create mode 100644 plugins/python-build/share/python-build/micropython-1.11 create mode 100644 plugins/python-build/share/python-build/micropython-1.12 create mode 100644 plugins/python-build/share/python-build/micropython-1.13 create mode 100644 plugins/python-build/share/python-build/micropython-1.14 create mode 100644 plugins/python-build/share/python-build/micropython-1.15 create mode 100644 plugins/python-build/share/python-build/micropython-1.16 create mode 100644 plugins/python-build/share/python-build/micropython-1.17 create mode 100644 plugins/python-build/share/python-build/micropython-1.18 create mode 100644 plugins/python-build/share/python-build/micropython-1.19.1 create mode 100644 plugins/python-build/share/python-build/micropython-1.20.0 create mode 100644 plugins/python-build/share/python-build/micropython-1.21.0 create mode 100644 plugins/python-build/share/python-build/micropython-1.9.3 create mode 100644 plugins/python-build/share/python-build/micropython-1.9.4 create mode 100644 plugins/python-build/share/python-build/micropython-dev create mode 100644 plugins/python-build/share/python-build/miniconda-2.2.2 create mode 100644 plugins/python-build/share/python-build/miniconda-3.0.0 create mode 100644 plugins/python-build/share/python-build/miniconda-3.0.4 create mode 100644 plugins/python-build/share/python-build/miniconda-3.0.5 create mode 100644 plugins/python-build/share/python-build/miniconda-3.10.1 create mode 100644 plugins/python-build/share/python-build/miniconda-3.16.0 create mode 100644 plugins/python-build/share/python-build/miniconda-3.18.3 create mode 100644 plugins/python-build/share/python-build/miniconda-3.3.0 create mode 100644 plugins/python-build/share/python-build/miniconda-3.4.2 create mode 100644 plugins/python-build/share/python-build/miniconda-3.7.0 create mode 100644 plugins/python-build/share/python-build/miniconda-3.8.3 create mode 100644 plugins/python-build/share/python-build/miniconda-3.9.1 create mode 100644 plugins/python-build/share/python-build/miniconda-latest create mode 100644 plugins/python-build/share/python-build/miniconda2-2.7-4.8.3 create mode 100644 plugins/python-build/share/python-build/miniconda2-3.18.3 create mode 100644 plugins/python-build/share/python-build/miniconda2-3.19.0 create mode 100644 plugins/python-build/share/python-build/miniconda2-4.0.5 create mode 100644 plugins/python-build/share/python-build/miniconda2-4.1.11 create mode 100644 plugins/python-build/share/python-build/miniconda2-4.3.14 create mode 100644 plugins/python-build/share/python-build/miniconda2-4.3.21 create mode 100644 plugins/python-build/share/python-build/miniconda2-4.3.27 create mode 100644 plugins/python-build/share/python-build/miniconda2-4.3.30 create mode 100644 plugins/python-build/share/python-build/miniconda2-4.3.31 create mode 100644 plugins/python-build/share/python-build/miniconda2-4.4.10 create mode 100644 plugins/python-build/share/python-build/miniconda2-4.5.1 create mode 100644 plugins/python-build/share/python-build/miniconda2-4.5.11 create mode 100644 plugins/python-build/share/python-build/miniconda2-4.5.12 create mode 100644 plugins/python-build/share/python-build/miniconda2-4.5.4 create mode 100644 plugins/python-build/share/python-build/miniconda2-4.6.14 create mode 100644 plugins/python-build/share/python-build/miniconda2-4.7.10 create mode 100644 plugins/python-build/share/python-build/miniconda2-4.7.12 create mode 100644 plugins/python-build/share/python-build/miniconda2-latest create mode 100644 plugins/python-build/share/python-build/miniconda3-2.2.2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.0.0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.0.4 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.0.5 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-22.11.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-23.1.0-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-23.10.0-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-23.11.0-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-23.11.0-2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-23.3.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-23.5.0-3 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-23.5.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-23.5.2-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-23.9.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-24.1.2-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-24.11.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-24.3.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-24.4.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-24.5.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-24.7.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-24.9.2-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-25.11.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-25.3.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-25.5.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-25.5.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-25.7.0-2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-25.9.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-25.9.1-3 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-26.1.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-26.3.2-2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10.1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-23.10.0-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-23.11.0-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-23.11.0-2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-23.5.0-3 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-23.5.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-23.5.2-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-23.9.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-24.1.2-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-24.11.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-24.3.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-24.4.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-24.5.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-24.7.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-24.9.2-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-25.11.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-25.3.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-25.5.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-25.5.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-25.7.0-2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-25.9.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-25.9.1-3 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-26.1.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-26.3.2-2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-24.1.2-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-24.11.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-24.3.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-24.4.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-24.5.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-24.7.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-24.9.2-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-25.11.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-25.3.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-25.5.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-25.5.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-25.7.0-2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-25.9.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-25.9.1-3 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-26.1.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-26.3.2-2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.13-25.11.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.13-25.3.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.13-25.5.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.13-25.5.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.13-25.7.0-2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.13-25.9.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.13-25.9.1-3 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.13-26.1.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.13-26.3.2-2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.16.0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.18.3 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.19.0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.3.0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.4.2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.7-22.11.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.7-23.1.0-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.7-4.10.1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.7-4.10.3 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.7-4.11.0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.7-4.12.0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.7-4.8.2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.7-4.8.3 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.7-4.9.2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.7.0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.8-22.11.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.8-23.1.0-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.8-23.10.0-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.8-23.11.0-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.8-23.11.0-2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.8-23.3.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.8-23.5.0-3 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.8-23.5.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.8-23.5.2-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.8-23.9.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.8-4.10.1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.8-4.10.3 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.8-4.11.0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.8-4.12.0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.8-4.8.2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.8-4.8.3 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.8-4.9.2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.8.3 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-22.11.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-23.1.0-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-23.10.0-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-23.11.0-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-23.11.0-2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-23.3.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-23.5.0-3 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-23.5.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-23.5.2-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-23.9.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-24.1.2-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-24.11.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-24.3.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-24.4.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-24.5.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-24.7.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-24.9.2-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-25.3.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-25.5.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-25.5.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-25.7.0-2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-25.9.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-25.9.1-3 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-4.10.1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-4.10.3 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-4.11.0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-4.12.0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-4.9.2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9.1 create mode 100644 plugins/python-build/share/python-build/miniconda3-4.0.5 create mode 100644 plugins/python-build/share/python-build/miniconda3-4.1.11 create mode 100644 plugins/python-build/share/python-build/miniconda3-4.2.12 create mode 100644 plugins/python-build/share/python-build/miniconda3-4.3.11 create mode 100644 plugins/python-build/share/python-build/miniconda3-4.3.14 create mode 100644 plugins/python-build/share/python-build/miniconda3-4.3.21 create mode 100644 plugins/python-build/share/python-build/miniconda3-4.3.27 create mode 100644 plugins/python-build/share/python-build/miniconda3-4.3.30 create mode 100644 plugins/python-build/share/python-build/miniconda3-4.3.31 create mode 100644 plugins/python-build/share/python-build/miniconda3-4.4.10 create mode 100644 plugins/python-build/share/python-build/miniconda3-4.5.1 create mode 100644 plugins/python-build/share/python-build/miniconda3-4.5.11 create mode 100644 plugins/python-build/share/python-build/miniconda3-4.5.12 create mode 100644 plugins/python-build/share/python-build/miniconda3-4.5.4 create mode 100644 plugins/python-build/share/python-build/miniconda3-4.6.14 create mode 100644 plugins/python-build/share/python-build/miniconda3-4.7.10 create mode 100644 plugins/python-build/share/python-build/miniconda3-4.7.12 create mode 100644 plugins/python-build/share/python-build/miniconda3-latest create mode 100644 plugins/python-build/share/python-build/miniforge-pypy3 create mode 100644 plugins/python-build/share/python-build/miniforge3-22.11.1-3 create mode 100644 plugins/python-build/share/python-build/miniforge3-22.11.1-4 create mode 100644 plugins/python-build/share/python-build/miniforge3-22.9.0-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-22.9.0-1 create mode 100644 plugins/python-build/share/python-build/miniforge3-22.9.0-2 create mode 100644 plugins/python-build/share/python-build/miniforge3-22.9.0-3 create mode 100644 plugins/python-build/share/python-build/miniforge3-23.1.0-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-23.1.0-1 create mode 100644 plugins/python-build/share/python-build/miniforge3-23.1.0-2 create mode 100644 plugins/python-build/share/python-build/miniforge3-23.1.0-3 create mode 100644 plugins/python-build/share/python-build/miniforge3-23.1.0-4 create mode 100644 plugins/python-build/share/python-build/miniforge3-23.10.0-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-23.11.0-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-23.3.0-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-23.3.1-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-23.3.1-1 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.1.2-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.11.0-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.11.0-1 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.11.2-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.11.2-1 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.11.3-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.11.3-1 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.11.3-2 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.3.0-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.5.0-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.7.1-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.7.1-1 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.7.1-2 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.9.0-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.9.2-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-25.1.1-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-25.1.1-1 create mode 100644 plugins/python-build/share/python-build/miniforge3-25.1.1-2 create mode 100644 plugins/python-build/share/python-build/miniforge3-25.11.0-1 create mode 100644 plugins/python-build/share/python-build/miniforge3-25.3.0-1 create mode 100644 plugins/python-build/share/python-build/miniforge3-25.3.0-2 create mode 100644 plugins/python-build/share/python-build/miniforge3-25.3.0-3 create mode 100644 plugins/python-build/share/python-build/miniforge3-25.3.1-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-25.9.1-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-26.1.0-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-26.1.1-2 create mode 100644 plugins/python-build/share/python-build/miniforge3-26.1.1-3 create mode 100644 plugins/python-build/share/python-build/miniforge3-26.3.2-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-26.3.2-1 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.10 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.10.1-1 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.10.1-3 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.10.1-5 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.10.2-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.10.3-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.10.3-1 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.10.3-10 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.10.3-2 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.10.3-3 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.10.3-4 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.10.3-5 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.10.3-6 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.10.3-7 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.10.3-8 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.10.3-9 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.11.0-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.11.0-1 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.11.0-2 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.11.0-3 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.11.0-4 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.12.0-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.12.0-1 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.12.0-2 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.12.0-3 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.13.0-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.13.0-1 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.14.0-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.14.0-1 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.14.0-2 create mode 100644 plugins/python-build/share/python-build/miniforge3-4.9.2 create mode 100644 plugins/python-build/share/python-build/miniforge3-latest create mode 100644 plugins/python-build/share/python-build/nogil-3.9.10 create mode 100644 plugins/python-build/share/python-build/nogil-3.9.10-1 create mode 100644 plugins/python-build/share/python-build/patches/2.1.3/Python-2.1.3/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.2.3/Python-2.2.3/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.3.7/Python-2.3.7/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.3.7/Python-2.3.7/001_fortify_crash_workaround.diff create mode 100644 plugins/python-build/share/python-build/patches/2.4.0/Python-2.4/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.4.0/Python-2.4/001_fortify_crash_workaround.diff create mode 100644 plugins/python-build/share/python-build/patches/2.4.0/Python-2.4/002_patch-posixmodule.diff create mode 100644 plugins/python-build/share/python-build/patches/2.4.1/Python-2.4.1/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.4.1/Python-2.4.1/001_fortify_crash_workaround.diff create mode 100644 plugins/python-build/share/python-build/patches/2.4.1/Python-2.4.1/002_patch-posixmodule.diff create mode 100644 plugins/python-build/share/python-build/patches/2.4.2/Python-2.4.2/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.4.2/Python-2.4.2/001_fortify_crash_workaround.diff create mode 100644 plugins/python-build/share/python-build/patches/2.4.2/Python-2.4.2/002_patch-posixmodule.diff create mode 100644 plugins/python-build/share/python-build/patches/2.4.3/Python-2.4.3/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.4.3/Python-2.4.3/001_fortify_crash_workaround.diff create mode 100644 plugins/python-build/share/python-build/patches/2.4.3/Python-2.4.3/002_patch-posixmodule.diff create mode 100644 plugins/python-build/share/python-build/patches/2.4.4/Python-2.4.4/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.4.4/Python-2.4.4/001_patch-posixmodule.diff create mode 100644 plugins/python-build/share/python-build/patches/2.4.5/Python-2.4.5/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.4.5/Python-2.4.5/001_patch-posixmodule.diff create mode 100644 plugins/python-build/share/python-build/patches/2.4.6/Python-2.4.6/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.4.6/Python-2.4.6/001_patch-posixmodule.diff create mode 100644 plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/001_patch-svnversion.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/002_darwin_c_source.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/003_osx_lp64.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/004_osx_libffi.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/005_osx_failed_modules.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/001_patch-svnversion.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/002_darwin_c_source.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/003_osx_lp64.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/004_osx_libffi.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/005_osx_failed_modules.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/001_patch-svnversion.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/002_darwin_c_source.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/003_osx_lp64.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/004_osx_libffi.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/005_osx_failed_modules.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/001_patch-svnversion.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/002_darwin_c_source.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/003_osx_lp64.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/004_osx_libffi.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/005_osx_failed_modules.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/001_patch-svnversion.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/002_darwin_c_source.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/003_osx_lp64.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/004_osx_libffi.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/005_osx_failed_modules.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/001_patch-svnversion.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/002_darwin_c_source.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/003_osx_lp64.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/004_osx_libffi.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/005_osx_failed_modules.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/001_patch-svnversion.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/002_darwin_c_source.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/003_osx_lp64.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/004_osx_libffi.patch create mode 100644 plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/005_osx_failed_modules.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.0/Python-2.6/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.6.0/Python-2.6/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.0/Python-2.6/003_tk86.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.0/Python-2.6/010_ssl_no_ssl2_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.1/Python-2.6.1/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.6.1/Python-2.6.1/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.1/Python-2.6.1/003_tk86.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.1/Python-2.6.1/010_ssl_no_ssl2_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.2/Python-2.6.2/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.6.2/Python-2.6.2/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.2/Python-2.6.2/003_tk86.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.2/Python-2.6.2/010_ssl_no_ssl2_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.3/Python-2.6.3/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.6.3/Python-2.6.3/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.3/Python-2.6.3/003_tk86.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.3/Python-2.6.3/010_ssl_no_ssl2_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.4/Python-2.6.4/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.6.4/Python-2.6.4/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.4/Python-2.6.4/003_tk86.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.4/Python-2.6.4/010_ssl_no_ssl2_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.5/Python-2.6.5/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.6.5/Python-2.6.5/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.5/Python-2.6.5/003_tk86.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.5/Python-2.6.5/010_ssl_no_ssl2_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.6/Python-2.6.6/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.6.6/Python-2.6.6/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.6/Python-2.6.6/003_tk86.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.6/Python-2.6.6/010_ssl_no_ssl2_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.7/Python-2.6.7/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.6.7/Python-2.6.7/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.7/Python-2.6.7/003_tk86.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.7/Python-2.6.7/010_ssl_no_ssl2_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.8/Python-2.6.8/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.6.8/Python-2.6.8/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.8/Python-2.6.8/003_tk86.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.8/Python-2.6.8/010_ssl_no_ssl2_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9/001_remove_systemstubs.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9/003_tk86.patch create mode 100644 plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9/010_ssl_no_ssl2_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.0/Python-2.7/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.7.0/Python-2.7/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.0/Python-2.7/010_ssl_no_ssl2_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.1/Python-2.7.1/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/2.7.1/Python-2.7.1/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.1/Python-2.7.1/010_ssl_no_ssl2_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.10/Python-2.7.10/003_system_library_path_in_sys_path.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0001-Detect-arm64-in-configure.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0002-Fix-macOS-_tkinter-use-of-Tck-Tk-in-Library-Framewor.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0003-Support-arm64-in-Mac-Tools-pythonw.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0004-Use-system-libffi-for-Mac-OS-10.15-and-up.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0005-ctypes-use-the-correct-ABI-for-variadic-functions.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0006-ctypes-probe-libffi-for-ffi_closure_alloc-and-ffi_pr.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0007-Remove-QuickTime-from-link-args.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.2/Python-2.7.2/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.2/Python-2.7.2/003_system_library_path_in_sys_path.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.2/Python-2.7.2/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.3/Python-2.7.3/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.3/Python-2.7.3/003_system_library_path_in_sys_path.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.3/Python-2.7.3/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.4/Python-2.7.4/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.4/Python-2.7.4/003_system_library_path_in_sys_path.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.4/Python-2.7.4/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.5/Python-2.7.5/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.5/Python-2.7.5/003_system_library_path_in_sys_path.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.5/Python-2.7.5/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.6/Python-2.7.6/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.6/Python-2.7.6/003_system_library_path_in_sys_path.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.6/Python-2.7.6/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.6/Python-2.7.6/012_fix_bundle_loader_for_new_osx.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.7/Python-2.7.7/003_system_library_path_in_sys_path.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.7/Python-2.7.7/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.8/Python-2.7.8/003_system_library_path_in_sys_path.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.8/Python-2.7.8/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.9/Python-2.7.9/003_system_library_path_in_sys_path.patch create mode 100644 plugins/python-build/share/python-build/patches/2.7.9/Python-2.7.9/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.0.1/Python-3.0.1/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/3.0.1/Python-3.0.1/001_patch-svnversion.patch create mode 100644 plugins/python-build/share/python-build/patches/3.0.1/Python-3.0.1/010_ssl_no_ssl2_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.1.0/Python-3.1/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/3.1.0/Python-3.1/010_ssl_no_ssl2_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.1.1/Python-3.1.1/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/3.1.1/Python-3.1.1/010_ssl_no_ssl2_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.1.2/Python-3.1.2/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/3.1.2/Python-3.1.2/010_ssl_no_ssl2_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.1.3/Python-3.1.3/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/3.1.3/Python-3.1.3/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/3.1.3/Python-3.1.3/010_ssl_no_ssl2_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.1.4/Python-3.1.4/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/3.1.4/Python-3.1.4/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/3.1.4/Python-3.1.4/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.1.5/Python-3.1.5/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/3.1.5/Python-3.1.5/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/3.1.5/Python-3.1.5/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.10.0/Python-3.10.0/0001-bpo-45350-Rerun-autoreconf-with-the-pkg-config-macro.patch create mode 100644 plugins/python-build/share/python-build/patches/3.10.0/Python-3.10.0/0002-bpo-45405-Prevent-internal-configure-error-when-runn.patch create mode 100644 plugins/python-build/share/python-build/patches/3.10.0/Python-3.10.0/0003-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.10.1/Python-3.10.1/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.10.10/Python-3.10.10/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.10.11/Python-3.10.11/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.10.12/Python-3.10.12/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.10.13/Python-3.10.13/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.10.14/Python-3.10.14/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.10.15/Python-3.10.15/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.10.16/Python-3.10.16/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.10.17/Python-3.10.17/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.10.18/Python-3.10.18/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.10.19/Python-3.10.19/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.10.2/Python-3.10.2/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.10.3/Python-3.10.3/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.10.4/Python-3.10.4/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.10.5/Python-3.10.5/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.10.6/Python-3.10.6/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.10.7/Python-3.10.7/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.10.8/Python-3.10.8/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.10.9/Python-3.10.9/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.11.0/Python-3.11.0/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.11.0/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch create mode 100644 plugins/python-build/share/python-build/patches/3.11.1/Python-3.11.1/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.11.10/Python-3.11.10/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.11.11/Python-3.11.11/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.11.12/Python-3.11.12/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.11.13/Python-3.11.13/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.11.14/Python-3.11.14/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.11.2/Python-3.11.2/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.11.3/Python-3.11.3/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.11.4/Python-3.11.4/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.11.5/Python-3.11.5/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.11.6/Python-3.11.6/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.11.7/Python-3.11.7/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.11.8/Python-3.11.8/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.11.9/Python-3.11.9/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.2.0/Python-3.2/000_patch-setup.py.diff create mode 100644 plugins/python-build/share/python-build/patches/3.2.0/Python-3.2/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/3.2.0/Python-3.2/010_ssl_no_ssl2_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.2.1/Python-3.2.1/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/3.2.1/Python-3.2.1/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.2.2/Python-3.2.2/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/3.2.2/Python-3.2.2/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.2.3/Python-3.2.3/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/3.2.3/Python-3.2.3/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.2.4/Python-3.2.4/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/3.2.4/Python-3.2.4/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.2.5/Python-3.2.5/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/3.2.5/Python-3.2.5/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.2.6/Python-3.2.6/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/3.2.6/Python-3.2.6/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.3.0/Python-3.3.0/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/3.3.0/Python-3.3.0/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.3.1/Python-3.3.1/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/3.3.1/Python-3.3.1/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.3.2/Python-3.3.2/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/3.3.2/Python-3.3.2/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.3.3/Python-3.3.3/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/3.3.3/Python-3.3.3/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.3.4/Python-3.3.4/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.3.5/Python-3.3.5/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.3.6/Python-3.3.6/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.3.7/Python-3.3.7/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.4.0/Python-3.4.0/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.4.1/Python-3.4.1/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.4.2/Python-3.4.2/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0001-bpo-27987-pymalloc-align-by-16bytes-on-64bit-platfor.patch create mode 100644 plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0002-bpo-27987-align-PyGC_Head-to-alignof-long-double-GH-.patch create mode 100644 plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0003-bpo-45405-Prevent-internal-configure-error-when-runn.patch create mode 100644 plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0004-Detect-arm64-in-configure.patch create mode 100644 plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0005-BPO-41100-Support-macOS-11-when-building-GH-21113.patch create mode 100644 plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0006-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch create mode 100644 plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0007-Port-ctypes-and-system-libffi-patch-for-arm64-macOS-.patch create mode 100644 plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0008-bpo-36231-Support-building-on-macOS-without-usr-incl.patch create mode 100644 plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0009-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch create mode 100644 plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0010-bpo-36106-Resolve-sinpi-name-clash-with-libm-IEEE-75.patch create mode 100644 plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0011-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.5.2/Python-3.5.2/venv.patch create mode 100644 plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0001-Detect-arm64-in-configure.patch create mode 100644 plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/00012-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0002-bpo-36231-Support-building-on-macOS-without-usr-incl.patch create mode 100644 plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0003-Fix-macOS-_tkinter-use-of-Tck-Tk-in-Library-Framewor.patch create mode 100644 plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0004-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch create mode 100644 plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0005-BPO-41100-Support-macOS-11-when-building-GH-21113.patch create mode 100644 plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0006-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch create mode 100644 plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0007-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch create mode 100644 plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0008-bpo-45405-Prevent-internal-configure-error-when-runn.patch create mode 100644 plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0009-bpo-27987-pymalloc-align-by-16bytes-on-64bit-platfor.patch create mode 100644 plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0010-bpo-27987-align-PyGC_Head-to-alignof-long-double-GH-.patch create mode 100644 plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0011-bpo-36106-Resolve-sinpi-name-clash-with-libm-IEEE-75.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.10/Python-3.7.10/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.11/Python-3.7.11/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.12/Python-3.7.12/0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.12/Python-3.7.12/0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.12/Python-3.7.12/0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.12/Python-3.7.12/0004-bpo-45405-Prevent-internal-configure-error-when-runn.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.13/Python-3.7.13/0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.13/Python-3.7.13/0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.13/Python-3.7.13/0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.14/Python-3.7.14/0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.14/Python-3.7.14/0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.14/Python-3.7.14/0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.15/Python-3.7.15/0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.15/Python-3.7.15/0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.15/Python-3.7.15/0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.15/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.16/Python-3.7.16/0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.16/Python-3.7.16/0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.16/Python-3.7.16/0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.16/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.17/Python-3.7.17/0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.17/Python-3.7.17/0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.17/Python-3.7.17/0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.17/Python-3.7.17/0004-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.8/Python-3.7.8/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch create mode 100644 plugins/python-build/share/python-build/patches/3.7.9/Python-3.7.9/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch create mode 100644 plugins/python-build/share/python-build/patches/3.8.10/Python-3.8.10/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch create mode 100644 plugins/python-build/share/python-build/patches/3.8.11/Python-3.8.11/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch create mode 100644 plugins/python-build/share/python-build/patches/3.8.12/Python-3.8.12/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch create mode 100644 plugins/python-build/share/python-build/patches/3.8.15/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch create mode 100644 plugins/python-build/share/python-build/patches/3.8.16/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch create mode 100644 plugins/python-build/share/python-build/patches/3.8.20/Python-3.8.20/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.8.4/Python-3.8.4/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch create mode 100644 plugins/python-build/share/python-build/patches/3.8.5/Python-3.8.5/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch create mode 100644 plugins/python-build/share/python-build/patches/3.8.6/Python-3.8.6/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch create mode 100644 plugins/python-build/share/python-build/patches/3.8.7/Python-3.8.7/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch create mode 100644 plugins/python-build/share/python-build/patches/3.8.8/Python-3.8.8/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch create mode 100644 plugins/python-build/share/python-build/patches/3.8.9/Python-3.8.9/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch create mode 100644 plugins/python-build/share/python-build/patches/3.9.0/Python-3.9.0/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch create mode 100644 plugins/python-build/share/python-build/patches/3.9.1/Python-3.9.1/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch create mode 100644 plugins/python-build/share/python-build/patches/3.9.15/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch create mode 100644 plugins/python-build/share/python-build/patches/3.9.16/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch create mode 100644 plugins/python-build/share/python-build/patches/3.9.2/Python-3.9.2/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch create mode 100644 plugins/python-build/share/python-build/patches/3.9.25/Python-3.9.25/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch create mode 100644 plugins/python-build/share/python-build/patches/3.9.4/Python-3.9.4/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch create mode 100644 plugins/python-build/share/python-build/patches/3.9.5/Python-3.9.5/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch create mode 100644 plugins/python-build/share/python-build/patches/3.9.6/Python-3.9.6/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch create mode 100644 plugins/python-build/share/python-build/patches/3.9.7/Python-3.9.7/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch create mode 100644 plugins/python-build/share/python-build/patches/cinder-3.10-dev/Cinder-3.10-dev/001-disable-werror.patch create mode 100644 plugins/python-build/share/python-build/patches/cinder-3.8-dev/Cinder-3.8-dev/001-disable-werror.patch create mode 100644 plugins/python-build/share/python-build/patches/stackless-3.2.2/stackless-322-export/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/stackless-3.2.2/stackless-322-export/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/patches/stackless-3.2.5/stackless-325-export/002_readline63.patch create mode 100644 plugins/python-build/share/python-build/patches/stackless-3.2.5/stackless-325-export/010_ssl_no_ssl3.patch create mode 100644 plugins/python-build/share/python-build/pypy-1.5-src create mode 100644 plugins/python-build/share/python-build/pypy-1.6 create mode 100644 plugins/python-build/share/python-build/pypy-1.7 create mode 100644 plugins/python-build/share/python-build/pypy-1.8 create mode 100644 plugins/python-build/share/python-build/pypy-1.9 create mode 100644 plugins/python-build/share/python-build/pypy-2.0 create mode 100644 plugins/python-build/share/python-build/pypy-2.0-src create mode 100644 plugins/python-build/share/python-build/pypy-2.0.1 create mode 100644 plugins/python-build/share/python-build/pypy-2.0.1-src create mode 100644 plugins/python-build/share/python-build/pypy-2.0.2 create mode 100644 plugins/python-build/share/python-build/pypy-2.0.2-src create mode 100644 plugins/python-build/share/python-build/pypy-2.1 create mode 100644 plugins/python-build/share/python-build/pypy-2.1-src create mode 100644 plugins/python-build/share/python-build/pypy-2.2 create mode 100644 plugins/python-build/share/python-build/pypy-2.2-src create mode 100644 plugins/python-build/share/python-build/pypy-2.2.1 create mode 100644 plugins/python-build/share/python-build/pypy-2.2.1-src create mode 100644 plugins/python-build/share/python-build/pypy-2.3 create mode 100644 plugins/python-build/share/python-build/pypy-2.3-src create mode 100644 plugins/python-build/share/python-build/pypy-2.3.1 create mode 100644 plugins/python-build/share/python-build/pypy-2.3.1-src create mode 100644 plugins/python-build/share/python-build/pypy-2.4.0 create mode 100644 plugins/python-build/share/python-build/pypy-2.4.0-src create mode 100644 plugins/python-build/share/python-build/pypy-2.5.0 create mode 100644 plugins/python-build/share/python-build/pypy-2.5.0-src create mode 100644 plugins/python-build/share/python-build/pypy-2.5.1 create mode 100644 plugins/python-build/share/python-build/pypy-2.5.1-src create mode 100644 plugins/python-build/share/python-build/pypy-2.6.0 create mode 100644 plugins/python-build/share/python-build/pypy-2.6.0-src create mode 100644 plugins/python-build/share/python-build/pypy-2.6.1 create mode 100644 plugins/python-build/share/python-build/pypy-2.6.1-src create mode 100644 plugins/python-build/share/python-build/pypy-4.0.0 create mode 100644 plugins/python-build/share/python-build/pypy-4.0.0-src create mode 100644 plugins/python-build/share/python-build/pypy-4.0.1 create mode 100644 plugins/python-build/share/python-build/pypy-4.0.1-src create mode 100644 plugins/python-build/share/python-build/pypy-5.0.0 create mode 100644 plugins/python-build/share/python-build/pypy-5.0.0-src create mode 100644 plugins/python-build/share/python-build/pypy-5.0.1 create mode 100644 plugins/python-build/share/python-build/pypy-5.0.1-src create mode 100644 plugins/python-build/share/python-build/pypy-5.1 create mode 100644 plugins/python-build/share/python-build/pypy-5.1-src create mode 100644 plugins/python-build/share/python-build/pypy-5.1.1 create mode 100644 plugins/python-build/share/python-build/pypy-5.1.1-src create mode 100644 plugins/python-build/share/python-build/pypy-5.3 create mode 100644 plugins/python-build/share/python-build/pypy-5.3-src create mode 100644 plugins/python-build/share/python-build/pypy-5.3.1 create mode 100644 plugins/python-build/share/python-build/pypy-5.3.1-src create mode 100644 plugins/python-build/share/python-build/pypy-5.4 create mode 100644 plugins/python-build/share/python-build/pypy-5.4-src create mode 100644 plugins/python-build/share/python-build/pypy-5.4.1 create mode 100644 plugins/python-build/share/python-build/pypy-5.4.1-src create mode 100644 plugins/python-build/share/python-build/pypy-5.6.0 create mode 100644 plugins/python-build/share/python-build/pypy-5.6.0-src create mode 100644 plugins/python-build/share/python-build/pypy-5.7.0 create mode 100644 plugins/python-build/share/python-build/pypy-5.7.0-src create mode 100644 plugins/python-build/share/python-build/pypy-5.7.1 create mode 100644 plugins/python-build/share/python-build/pypy-5.7.1-src create mode 100644 plugins/python-build/share/python-build/pypy-c-jit-latest create mode 100644 plugins/python-build/share/python-build/pypy-dev create mode 100644 plugins/python-build/share/python-build/pypy-stm-2.3 create mode 100644 plugins/python-build/share/python-build/pypy-stm-2.5.1 create mode 100644 plugins/python-build/share/python-build/pypy2-5.3 create mode 100644 plugins/python-build/share/python-build/pypy2-5.3-src create mode 100644 plugins/python-build/share/python-build/pypy2-5.3.1 create mode 100644 plugins/python-build/share/python-build/pypy2-5.3.1-src create mode 100644 plugins/python-build/share/python-build/pypy2-5.4 create mode 100644 plugins/python-build/share/python-build/pypy2-5.4-src create mode 100644 plugins/python-build/share/python-build/pypy2-5.4.1 create mode 100644 plugins/python-build/share/python-build/pypy2-5.4.1-src create mode 100644 plugins/python-build/share/python-build/pypy2-5.6.0 create mode 100644 plugins/python-build/share/python-build/pypy2-5.6.0-src create mode 100644 plugins/python-build/share/python-build/pypy2-5.7.0 create mode 100644 plugins/python-build/share/python-build/pypy2-5.7.0-src create mode 100644 plugins/python-build/share/python-build/pypy2-5.7.1 create mode 100644 plugins/python-build/share/python-build/pypy2-5.7.1-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-5.10.0 create mode 100644 plugins/python-build/share/python-build/pypy2.7-5.10.0-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-5.8.0 create mode 100644 plugins/python-build/share/python-build/pypy2.7-5.8.0-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-5.9.0 create mode 100644 plugins/python-build/share/python-build/pypy2.7-5.9.0-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-6.0.0 create mode 100644 plugins/python-build/share/python-build/pypy2.7-6.0.0-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.0.0 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.0.0-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.1.0 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.1.0-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.1.1 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.1.1-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.2.0 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.2.0-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.0 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.0-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.1 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.1-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.10 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.10-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.11 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.11-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.12 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.12-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.13 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.13-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.14 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.14-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.15 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.15-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.16 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.16-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.17 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.17-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.18 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.18-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.19 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.19-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.2 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.2-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.20 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.20-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.22 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.22-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.3 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.3-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.4 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.4-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.5 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.5-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.6 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.6-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.8 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.8-src create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.9 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.9-src create mode 100644 plugins/python-build/share/python-build/pypy3-2.3.1 create mode 100644 plugins/python-build/share/python-build/pypy3-2.3.1-src create mode 100644 plugins/python-build/share/python-build/pypy3-2.4.0 create mode 100644 plugins/python-build/share/python-build/pypy3-2.4.0-src create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.12 create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.12-src create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.13 create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.13-src create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.14 create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.14-src create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.15 create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.15-src create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.16 create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.16-src create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.17 create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.17-src create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.18 create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.18-src create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.19 create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.19-src create mode 100644 plugins/python-build/share/python-build/pypy3.11-7.3.18 create mode 100644 plugins/python-build/share/python-build/pypy3.11-7.3.18-src create mode 100644 plugins/python-build/share/python-build/pypy3.11-7.3.19 create mode 100644 plugins/python-build/share/python-build/pypy3.11-7.3.19-src create mode 100644 plugins/python-build/share/python-build/pypy3.11-7.3.20 create mode 100644 plugins/python-build/share/python-build/pypy3.11-7.3.20-src create mode 100644 plugins/python-build/share/python-build/pypy3.11-7.3.22 create mode 100644 plugins/python-build/share/python-build/pypy3.11-7.3.22-src create mode 100644 plugins/python-build/share/python-build/pypy3.3-5.2-alpha1 create mode 100644 plugins/python-build/share/python-build/pypy3.3-5.2-alpha1-src create mode 100644 plugins/python-build/share/python-build/pypy3.3-5.5-alpha create mode 100644 plugins/python-build/share/python-build/pypy3.3-5.5-alpha-src create mode 100644 plugins/python-build/share/python-build/pypy3.5-5.10.0 create mode 100644 plugins/python-build/share/python-build/pypy3.5-5.10.0-src create mode 100644 plugins/python-build/share/python-build/pypy3.5-5.10.1 create mode 100644 plugins/python-build/share/python-build/pypy3.5-5.10.1-src create mode 100644 plugins/python-build/share/python-build/pypy3.5-5.7-beta create mode 100644 plugins/python-build/share/python-build/pypy3.5-5.7-beta-src create mode 100644 plugins/python-build/share/python-build/pypy3.5-5.7.1-beta create mode 100644 plugins/python-build/share/python-build/pypy3.5-5.7.1-beta-src create mode 100644 plugins/python-build/share/python-build/pypy3.5-5.8.0 create mode 100644 plugins/python-build/share/python-build/pypy3.5-5.8.0-src create mode 100644 plugins/python-build/share/python-build/pypy3.5-5.9.0 create mode 100644 plugins/python-build/share/python-build/pypy3.5-5.9.0-src create mode 100644 plugins/python-build/share/python-build/pypy3.5-6.0.0 create mode 100644 plugins/python-build/share/python-build/pypy3.5-6.0.0-src create mode 100644 plugins/python-build/share/python-build/pypy3.5-7.0.0 create mode 100644 plugins/python-build/share/python-build/pypy3.5-7.0.0-src create mode 100644 plugins/python-build/share/python-build/pypy3.5-c-jit-latest create mode 100644 plugins/python-build/share/python-build/pypy3.6-7.0.0 create mode 100644 plugins/python-build/share/python-build/pypy3.6-7.0.0-src create mode 100644 plugins/python-build/share/python-build/pypy3.6-7.1.0 create mode 100644 plugins/python-build/share/python-build/pypy3.6-7.1.0-src create mode 100644 plugins/python-build/share/python-build/pypy3.6-7.1.1 create mode 100644 plugins/python-build/share/python-build/pypy3.6-7.1.1-src create mode 100644 plugins/python-build/share/python-build/pypy3.6-7.2.0 create mode 100644 plugins/python-build/share/python-build/pypy3.6-7.2.0-src create mode 100644 plugins/python-build/share/python-build/pypy3.6-7.3.0 create mode 100644 plugins/python-build/share/python-build/pypy3.6-7.3.0-src create mode 100644 plugins/python-build/share/python-build/pypy3.6-7.3.1 create mode 100644 plugins/python-build/share/python-build/pypy3.6-7.3.1-src create mode 100644 plugins/python-build/share/python-build/pypy3.6-7.3.2 create mode 100644 plugins/python-build/share/python-build/pypy3.6-7.3.2-src create mode 100644 plugins/python-build/share/python-build/pypy3.6-7.3.3 create mode 100644 plugins/python-build/share/python-build/pypy3.6-7.3.3-src create mode 100644 plugins/python-build/share/python-build/pypy3.7-7.3.2 create mode 100644 plugins/python-build/share/python-build/pypy3.7-7.3.2-src create mode 100644 plugins/python-build/share/python-build/pypy3.7-7.3.3 create mode 100644 plugins/python-build/share/python-build/pypy3.7-7.3.3-src create mode 100644 plugins/python-build/share/python-build/pypy3.7-7.3.4 create mode 100644 plugins/python-build/share/python-build/pypy3.7-7.3.4-src create mode 100644 plugins/python-build/share/python-build/pypy3.7-7.3.5 create mode 100644 plugins/python-build/share/python-build/pypy3.7-7.3.5-src create mode 100644 plugins/python-build/share/python-build/pypy3.7-7.3.6 create mode 100644 plugins/python-build/share/python-build/pypy3.7-7.3.6-src create mode 100644 plugins/python-build/share/python-build/pypy3.7-7.3.7 create mode 100644 plugins/python-build/share/python-build/pypy3.7-7.3.7-src create mode 100644 plugins/python-build/share/python-build/pypy3.7-7.3.8 create mode 100644 plugins/python-build/share/python-build/pypy3.7-7.3.8-src create mode 100644 plugins/python-build/share/python-build/pypy3.7-7.3.9 create mode 100644 plugins/python-build/share/python-build/pypy3.7-7.3.9-src create mode 100644 plugins/python-build/share/python-build/pypy3.7-c-jit-latest create mode 100644 plugins/python-build/share/python-build/pypy3.8-7.3.10 create mode 100644 plugins/python-build/share/python-build/pypy3.8-7.3.10-src create mode 100644 plugins/python-build/share/python-build/pypy3.8-7.3.11 create mode 100644 plugins/python-build/share/python-build/pypy3.8-7.3.11-src create mode 100644 plugins/python-build/share/python-build/pypy3.8-7.3.6 create mode 100644 plugins/python-build/share/python-build/pypy3.8-7.3.6-src create mode 100644 plugins/python-build/share/python-build/pypy3.8-7.3.7 create mode 100644 plugins/python-build/share/python-build/pypy3.8-7.3.7-src create mode 100644 plugins/python-build/share/python-build/pypy3.8-7.3.8 create mode 100644 plugins/python-build/share/python-build/pypy3.8-7.3.8-src create mode 100644 plugins/python-build/share/python-build/pypy3.8-7.3.9 create mode 100644 plugins/python-build/share/python-build/pypy3.8-7.3.9-src create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.10 create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.10-src create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.11 create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.11-src create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.12 create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.12-src create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.13 create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.13-src create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.14 create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.14-src create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.15 create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.15-src create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.16 create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.16-src create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.8 create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.8-src create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.9 create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.9-src create mode 100644 plugins/python-build/share/python-build/pyston-2.2 create mode 100644 plugins/python-build/share/python-build/pyston-2.3 create mode 100644 plugins/python-build/share/python-build/pyston-2.3.1 create mode 100644 plugins/python-build/share/python-build/pyston-2.3.2 create mode 100644 plugins/python-build/share/python-build/pyston-2.3.3 create mode 100644 plugins/python-build/share/python-build/pyston-2.3.4 create mode 100644 plugins/python-build/share/python-build/pyston-2.3.5 create mode 100644 plugins/python-build/share/python-build/stackless-2.7-dev create mode 100644 plugins/python-build/share/python-build/stackless-2.7.10 create mode 100644 plugins/python-build/share/python-build/stackless-2.7.11 create mode 100644 plugins/python-build/share/python-build/stackless-2.7.12 create mode 100644 plugins/python-build/share/python-build/stackless-2.7.14 create mode 100644 plugins/python-build/share/python-build/stackless-2.7.16 create mode 100644 plugins/python-build/share/python-build/stackless-2.7.2 create mode 100644 plugins/python-build/share/python-build/stackless-2.7.3 create mode 100644 plugins/python-build/share/python-build/stackless-2.7.4 create mode 100644 plugins/python-build/share/python-build/stackless-2.7.5 create mode 100644 plugins/python-build/share/python-build/stackless-2.7.6 create mode 100644 plugins/python-build/share/python-build/stackless-2.7.7 create mode 100644 plugins/python-build/share/python-build/stackless-2.7.8 create mode 100644 plugins/python-build/share/python-build/stackless-2.7.9 create mode 100644 plugins/python-build/share/python-build/stackless-3.2.2 create mode 100644 plugins/python-build/share/python-build/stackless-3.2.5 create mode 100644 plugins/python-build/share/python-build/stackless-3.3.5 create mode 100644 plugins/python-build/share/python-build/stackless-3.3.7 create mode 100644 plugins/python-build/share/python-build/stackless-3.4-dev create mode 100644 plugins/python-build/share/python-build/stackless-3.4.2 create mode 100644 plugins/python-build/share/python-build/stackless-3.4.7 create mode 100644 plugins/python-build/share/python-build/stackless-3.5.4 create mode 100644 plugins/python-build/share/python-build/stackless-3.7.5 create mode 100644 plugins/python-build/share/python-build/stackless-dev create mode 100644 plugins/python-build/test/arguments.bats create mode 100644 plugins/python-build/test/build.bats create mode 100644 plugins/python-build/test/cache.bats create mode 100644 plugins/python-build/test/checksum.bats create mode 100644 plugins/python-build/test/compiler.bats create mode 100644 plugins/python-build/test/definitions.bats create mode 100644 plugins/python-build/test/fetch.bats create mode 100644 plugins/python-build/test/fixtures/definitions/needs-yaml create mode 100644 plugins/python-build/test/fixtures/definitions/vanilla-python create mode 100644 plugins/python-build/test/fixtures/definitions/with-checksum create mode 100644 plugins/python-build/test/fixtures/definitions/with-invalid-checksum create mode 100644 plugins/python-build/test/fixtures/definitions/with-md5-checksum create mode 100644 plugins/python-build/test/fixtures/definitions/without-checksum create mode 100644 plugins/python-build/test/fixtures/package-1.0.0.tar.gz create mode 100644 plugins/python-build/test/hooks.bats create mode 100644 plugins/python-build/test/installer.bats create mode 100644 plugins/python-build/test/mirror.bats create mode 100644 plugins/python-build/test/pyenv.bats create mode 100644 plugins/python-build/test/pyenv_ext.bats create mode 100755 plugins/python-build/test/stubs/stub create mode 100644 plugins/python-build/test/test_helper.bash create mode 100644 plugins/python-build/test/version.bats create mode 100644 pyenv.d/exec/pip-rehash.bash create mode 100755 pyenv.d/exec/pip-rehash/conda create mode 100755 pyenv.d/exec/pip-rehash/easy_install create mode 100755 pyenv.d/exec/pip-rehash/pip create mode 100644 pyenv.d/install/latest.bash create mode 100644 pyenv.d/rehash/conda.bash create mode 100644 pyenv.d/rehash/conda.d/.gitignore create mode 100644 pyenv.d/rehash/conda.d/default.list create mode 100644 pyenv.d/rehash/source.bash create mode 100644 pyenv.d/rehash/source.d/.gitignore create mode 100644 pyenv.d/rehash/source.d/default.list create mode 100644 src/Makefile.in create mode 100644 src/bash.h create mode 100755 src/configure create mode 100644 src/realpath.c create mode 100755 src/shobj-conf create mode 100644 terminal_output.png create mode 100644 test/--version.bats create mode 100644 test/Dockerfile create mode 100644 test/README.md create mode 100644 test/commands.bats create mode 100644 test/completions.bats create mode 100644 test/exec.bats create mode 100644 test/global.bats create mode 100644 test/help.bats create mode 100644 test/hooks.bats create mode 100755 test/init.bats create mode 100644 test/latest.bats create mode 100755 test/libexec/pyenv-echo create mode 100644 test/local.bats create mode 100755 test/pip-rehash.bats create mode 100644 test/prefix.bats create mode 100644 test/pyenv.bats create mode 100644 test/pyenv_ext.bats create mode 100755 test/rehash.bats create mode 100755 test/run create mode 100644 test/shell.bats create mode 100644 test/shims-linked-from-elsewhere.bats create mode 100644 test/shims.bats create mode 100644 test/test_helper.bash create mode 100644 test/version-file-read.bats create mode 100644 test/version-file-write.bats create mode 100644 test/version-file.bats create mode 100644 test/version-name.bats create mode 100644 test/version-origin.bats create mode 100644 test/version.bats create mode 100644 test/versions.bats create mode 100644 test/whence.bats create mode 100644 test/which.bats diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..3d980ba1979d6024991d1dba89a78c9b4b05465a GIT binary patch literal 8196 zcmeHMJ#W-N5Pch;Zl5+0+&(& zJ|7b5Y*TLwXYJ8JgDnBbc4*o*x?bZ8vWd5;w}rFhp=MkvS(j>jiD6ti%_lxC^|o-< zrNj8*!+2!lD->hV>Hdighe@5)Q58@HnhJ33-oY)5v4j1fe!qV3P5P#Jmh~rjpXRz- zcYf`@`+j^k^bgPV&$q?5f!+zFB3|NR8w>OUbc|1%5t75>Yd@A8YWJDu6_fU;fR8&= zBJ@dxS;)hlN8Tgx-`^|oOK*kS^agnR>w#4akYkEDCKzF#uyf3?7vjfn+ao2P_(931 z<-Ssvzek6BQ|22J&mGcegcsBYAO;w|b|1;BJu2X1PMA+b+C8nW*TavM zN8*3}RO0(QiQDuBczDEkv0bT!-7EEVx_!XAp%x+W-yD_rji~CmX^#r{?50aTFKH!a zcuqTM7_LWh?D>cY$>-|VpVj`EBZ#W_v_}PeaL9Zj?BQAcxyW8u9*G~FmiRtTu1C`w z;uVb7p*=Gq%<$YYS4Pq&F@N6>=a$cvsAu^D+!gyAFt#>T;G!!KxgXHu`u~3W_y3Fj zGnKz8pbDI$fazqL*#-sp+PV?SwRS@N33YB9S2$}^Xt3otSzC^iE&nj2>x4o%C-t^) XmS(8^^A7>bx<%jrR(~BXrviTfq<>@P literal 0 HcmV?d00001 diff --git a/.agignore b/.agignore new file mode 100644 index 0000000..3a0f784 --- /dev/null +++ b/.agignore @@ -0,0 +1,2 @@ +./versions +./cache diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..dda9459 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +.git/ +.python-version +.vscode/ +.idea/ diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..8fd5e1f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,11 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +end_of_line = lf +charset = utf-8 + +# Makefiles always use tabs for indentation +[Makefile] +indent_style = tab +indent_size = unset # Allow user-defined tab width diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..da2b02f --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @pyenv/pyenv-core-maintainers @pyenv/pyenv-core-committers \ No newline at end of file diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..8914ef4 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: [pyenv] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: pyenv # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..a35d985 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,54 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +### Prerequisites +* [ ] Make sure your problem is not listed in [the common build problems](https://github.com/pyenv/pyenv/wiki/Common-build-problems). +* [ ] Make sure no duplicated issue has already been reported in [the pyenv issues](https://github.com/pyenv/pyenv/issues?q=is%3Aissue). For build errors, a reported issue typically mentions a key error message. This key error message is often not in the 10 last build log lines reported to the console but is rather earlier in the build log -- typically, it's the first error message encountered in the log. +* [ ] Make sure you are reporting a problem in Pyenv and not seeking consultation with Pyenv usage. + * GitHub issues are intended mainly for Pyenv development purposes. If you are seeking help with Pyenv usage, check [Pyenv documentation](https://github.com/pyenv/pyenv?tab=readme-ov-file#simple-python-version-management-pyenv), go to a user community site like [Gitter](https://gitter.im/yyuu/pyenv), [StackOverflow](https://stackoverflow.com/questions/tagged/pyenv), etc, or to [Discussions](https://github.com/orgs/pyenv/discussions). +* [ ] Make sure your problem is not derived from packaging (e.g. [Homebrew](https://brew.sh)). + * Please refer to the package documentation for the installation issues, etc. +* [ ] Make sure your problem is not derived from plugins. + * This repository is maintaining `pyenv` and the default `python-build` plugin only. Please refrain from reporting issues of other plugins here. + +### Describe the bug +A clear and concise description of what the bug is. +Do specify what the expected behaviour is if that's not obvious from the bug's nature. + +#### Reproduction steps +Listing the commands to run in a new console session and their output is usually sufficient. +Please use a Markdown code block (three backticks on a line by themselves before and after the text) to denote a console output excerpt. +Usually not needed for build errors (since the arguments can already be seen in the debug trace) unless you are using an unusual invocation (e.g. setting environment variables that affect the build). + +#### Diagnostic details +- [ ] Platform information (e.g. Ubuntu Linux 24.04): +- [ ] OS architecture (e.g. amd64): +- [ ] pyenv version: +- [ ] Python version: +- [ ] C Compiler information (e.g. gcc 7.3): +- [ ] Please attach the debug trace of the failing command as a [gist](https://gist.github.com/): + * Run `env PYENV_DEBUG=1 2>&1 | tee trace.log` and attach `trace.log`. E.g. if you have a problem with installing Python, run `env PYENV_DEBUG=1 pyenv install -v 2>&1 | tee trace.log` (note the `-v` option to `pyenv install`). +- [ ] If you have a problem with installing Python, please also attach `config.log` from the build directory + * The build directory is reported after the "BUILD FAILED" message and is usually under `/tmp`. +- [ ] If the build succeeds but the problem is still with the build process (e.g. the resulting Python is missing a feature), please attach + * the debug trace from reinstalling the faulty version with `env PYENV_DEBUG=1 pyenv install -f -k -v 2>&1 | tee trace.log` + * `config.log` from the build directory. When using `pyenv install` with `-k` as per above, the build directory will be under `$PYENV_ROOT/sources`. +- [ ] If the problem happens in another Pyenv invocation, turn on debug logging by setting `PYENV_DEBUG=1`, e.g. `env PYENV_DEBUG=1 pyenv local 3.6.4`, and attach the resulting trace as a gist +- [ ] If the problem happens outside of a Pyenv invocation, get the debug trace like this: + ``` + export PYENV_DEBUG=1 + # for Bash + export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }' + # for Zsh + export PS4='+(%x:%I): %N(%i): ' + + set -x + + set +x + ``` diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..00c109d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,24 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Describe the intended use case** +* What your general environment is if it's relevant to the feature request and is not a generic console with a typical Pyenv installation (CI, server with a custom setup, cloud environment, IDE) +* What you are trying to achieve +* What specifically you are doing for that regarding Pyenv +* Where you are stuck + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. +[ ] In particular, did you consider [writing a plugin](https://github.com/pyenv/pyenv/blob/master/README.md#pyenv-plugins)? Note that if your plugin has general applicability, you can publish it in the 3rd-party plugin catalog on the Pyenv Wiki as per the link above. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..820ee62 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,16 @@ +Make sure you have checked all steps below. + +### Prerequisite +* [ ] Please consider implementing the feature as a hook script or plugin as a first step. + * pyenv has some powerful support for plugins and hook scripts. Please refer to [Authoring plugins](https://github.com/pyenv/pyenv/wiki/Authoring-plugins) for details and try to implement it as a plugin if possible. +* [ ] Please consider contributing the patch upstream to [rbenv](https://github.com/rbenv/rbenv), since we have borrowed most of the code from that project. + * We occasionally import the changes from rbenv. In general, you can expect changes made in rbenv will be imported to pyenv too, eventually. + * Generally speaking, we prefer not to make changes in the core in order to keep compatibility with rbenv. +* [ ] My PR addresses the following pyenv issue (if any) + - Closes https://github.com/pyenv/pyenv/issues/XXXX + +### Description +- [ ] Here are some details about my PR + +### Tests +- [ ] My PR adds the following unit tests (if any) diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..2390d8c --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "monthly" + groups: + github-actions: + patterns: + - "*" diff --git a/.github/workflows/add_version.yml b/.github/workflows/add_version.yml new file mode 100644 index 0000000..23c2b6f --- /dev/null +++ b/.github/workflows/add_version.yml @@ -0,0 +1,58 @@ +name: Add versions + +on: + workflow_dispatch: {} + schedule: + # Every N hours + - cron: '25 */4 * * *' + +permissions: + contents: write + pull-requests: write + +jobs: + add_cpython: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-python@v6 + with: + python-version: 3 + cache: 'pip' + cache-dependency-path: plugins/python-build/scripts/requirements.txt + - run: pip install -r plugins/python-build/scripts/requirements.txt + + - name: check for a release + run: | + python plugins/python-build/scripts/add_cpython.py --verbose >added_versions.lst && rc=$? || rc=$? + #0 means new version found, 1 not found, 2 another error + [[ $rc -gt 1 ]] && false + echo "rc=$rc" >> $GITHUB_ENV + - name: set PR properties + if: env.rc == 0 + shell: python + run: | + import os + import sys + versions=[l.rstrip() for l in open("added_versions.lst")] + with open(os.environ['GITHUB_ENV'],'a') as f: + f.write(f'branch_name=auto_add_version/{"_".join(versions)}\n') + f.write(f'pr_name=Add CPython {", ".join(versions)}\n') + os.remove("added_versions.lst") + + # https://github.com/peter-evans/create-pull-request/blob/main/docs/concepts-guidelines.md#authenticating-with-github-app-generated-tokens + - name: Generate Github token + if: env.rc == 0 + uses: actions/create-github-app-token@v3 + id: generate-token + with: + app-id: ${{ vars.PYENV_BOT_APP_ID }} + private-key: ${{ secrets.PYENV_BOT_PRIVATE_KEY }} + - name: Create Pull Request + uses: peter-evans/create-pull-request@v8 + if: env.rc == 0 + with: + branch: ${{ env.branch_name }} + title: ${{ env.pr_name }} + commit-message: ${{ env.pr_name }} + token: ${{ steps.generate-token.outputs.token }} diff --git a/.github/workflows/macos_build.yml b/.github/workflows/macos_build.yml new file mode 100644 index 0000000..7223278 --- /dev/null +++ b/.github/workflows/macos_build.yml @@ -0,0 +1,38 @@ +name: macos_build +on: [pull_request, push] + +permissions: + contents: read # to fetch code (actions/checkout) + +jobs: + macos_build: + strategy: + fail-fast: false + matrix: + python-version: + - "3.10" + - "3.11" + - "3.12" + - "3.13" + - "3.14" + runs-on: macos-latest + steps: + - uses: actions/checkout@v6 + - run: | + brew install openssl readline sqlite3 xz tcl-tk@8 libb2 zstd + # https://github.com/pyenv/pyenv#installation + - run: pwd + - env: + PYENV_ROOT: /Users/runner/work/pyenv/pyenv + run: | + echo $PYENV_ROOT + echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH + bin/pyenv --debug install ${{ matrix.python-version }} + bin/pyenv global ${{ matrix.python-version }} + bin/pyenv rehash + - run: python --version + - run: python -m pip --version + - shell: python # Prove that actual Python == expected Python + env: + EXPECTED_PYTHON: ${{ matrix.python-version }} + run: import os, sys ; assert sys.version.startswith(os.getenv("EXPECTED_PYTHON")) diff --git a/.github/workflows/modified_scripts_build.yml b/.github/workflows/modified_scripts_build.yml new file mode 100644 index 0000000..5faf172 --- /dev/null +++ b/.github/workflows/modified_scripts_build.yml @@ -0,0 +1,306 @@ +name: modified_scripts +on: [pull_request] +jobs: + discover_modified_scripts: + runs-on: ubuntu-latest + outputs: + versions: ${{steps.modified-versions.outputs.versions}} + versions_cpython_only: ${{steps.modified-versions.outputs.versions_cpython_only}} + versions_macos_build_exclude: ${{steps.modified-versions.outputs.versions_macos_build_exclude}} + steps: + - uses: actions/checkout@v6 + - run: git fetch origin "$GITHUB_BASE_REF" + - shell: bash + run: > + versions=$(git diff "origin/$GITHUB_BASE_REF" --name-only -z + | perl -ne 'BEGIN {$\="\n";$/="\0";} chomp; + if (/^plugins\/python-build\/share\/python-build\/(?:([^\/]+)|patches\/([^\/]+)\/.*)$/ and -e $& ) + { print $1.$2; }' \ + | sort -u); + EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64); + echo "versions<<$EOF" >> $GITHUB_ENV; + echo "$versions" >> $GITHUB_ENV; + echo "$EOF" >> $GITHUB_ENV; + + versions_cpython_only=$(grep -Ee '^[[:digit:]]' <<<"$versions") + EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64); + echo "versions_cpython_only<<$EOF" >> $GITHUB_ENV; + echo "$versions_cpython_only" >> $GITHUB_ENV; + echo "$EOF" >> $GITHUB_ENV; + - run: pip install packaging + - name: Build exclusions JSON + shell: python + run: | + import os + import json + import random + import re + import subprocess + + import packaging.version + + result=[] + + for line in os.environ['versions'].splitlines(): + if m:=re.match(r'([^-]+)-(\d+\.\d+)-(\d+\.\d+.\d+)', line): + name, version = m.group(1), packaging.version.Version(m.group(3)) + + # Miniconda dropped MacOS x64 support + if (name == 'miniconda3' and version >= packaging.version.Version('25.9.1')): + result.append({'os':'macos-15-intel','python-version':line}) + + if m:=re.match(r'([^-]+)-(\d+\.\d+)', line): + name, version = m.group(1), packaging.version.Version(m.group(2)) + + # Anaconda dropped MacOS x64 support + if name == 'anaconda3' and version >= packaging.version.Version('2025.12'): + result.append({'os':'macos-15-intel','python-version':line}) + + if m:=re.match(r'graalpy-(community-)?-(\d+\.\d+.\d+)', line): + version = packaging.version.Version(m.group(2)) + + # GraalPy dropped MacOS x64 support + if version >= packaging.version.Version('25.0.2'): + result.append({'os':'macos-15-intel','python-version':line}) + + + EOF = str(random.getrandbits(15*8)) + + with open(os.environ['GITHUB_ENV'],'w') as f: + f.write(f"versions_macos_build_exclude_json<<{EOF}\n") + json.dump(result, f) + f.write(f'\n{EOF}\n') + + - id: modified-versions + run: | + echo "versions=`echo "${{ env.versions }}" | jq -R . | jq -sc .`" >> $GITHUB_OUTPUT + echo "versions_cpython_only=`echo "${{ env.versions_cpython_only }}" | jq -R . | jq -sc .`" >> $GITHUB_OUTPUT + echo 'versions_macos_build_exclude=${{ env.versions_macos_build_exclude_json }}' >> $GITHUB_OUTPUT + macos_build: + needs: discover_modified_scripts + if: needs.discover_modified_scripts.outputs.versions != '[""]' + strategy: + fail-fast: false + matrix: + python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions)}} + os: + - macos-14 + - macos-15 + - macos-15-intel + - macos-26 + exclude: ${{fromJson(needs.discover_modified_scripts.outputs.versions_macos_build_exclude)}} + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v6 + - run: | + #envvars + export PYENV_ROOT="$GITHUB_WORKSPACE" + echo "PYENV_ROOT=$PYENV_ROOT" >> $GITHUB_ENV + echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH + - run: | + #prerequisites + brew install openssl readline sqlite3 xz zlib + if [[ "${{ matrix.python-version }}" =~ pypy.*-(src|dev) ]]; then + export PYENV_BOOTSTRAP_VERSION=pypy2.7-7 + echo "PYENV_BOOTSTRAP_VERSION=$PYENV_BOOTSTRAP_VERSION" >> $GITHUB_ENV + pyenv install $PYENV_BOOTSTRAP_VERSION + fi + - run: | + #build + pyenv --debug install ${{ matrix.python-version }} && rc=$? || rc=$? + if [[ $rc -ne 0 ]]; then echo config.log:; cat $TMPDIR/python-build*/*/config.log; false; fi + pyenv global ${{ matrix.python-version }} + # Micropython doesn't support --version + - run: | + #print version + if [[ "${{ matrix.python-version }}" == "micropython-"* ]]; then + python -c 'import sys; print(sys.version)' + else + python --version + python -m pip --version + fi + # Micropython doesn't support sys.executable, os.path, older versions even os + - env: + EXPECTED_PYTHON: ${{ matrix.python-version }} + run: | + #check + if [[ "${{ matrix.python-version }}" == "micropython-"* ]]; then + [[ $(pyenv which python) == "${{ env.PYENV_ROOT }}/versions/${{ matrix.python-version }}/bin/python" ]] || exit 1 + python -c 'import sys; assert sys.implementation.name == "micropython"' + else + python -c 'if True: + import os, sys, os.path + correct_dir = os.path.join( + os.environ["PYENV_ROOT"], + "versions", + os.environ["EXPECTED_PYTHON"], + "bin") + assert os.path.dirname(sys.executable) == correct_dir' + fi + # bundled executables in some Anaconda releases cause the post-run step to hang in MacOS + - run: | + pyenv global system + rm -f "$(pyenv root)"/shims/* + + + macos_build_bundled_dependencies: + needs: discover_modified_scripts + if: needs.discover_modified_scripts.outputs.versions_cpython_only != '[""]' + strategy: + fail-fast: false + matrix: + python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions_cpython_only)}} + os: ["macos-14", "macos-15", "macos-15-intel"] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v6 + - run: | + #envvars + export PYENV_ROOT="$GITHUB_WORKSPACE" + echo "PYENV_ROOT=$PYENV_ROOT" >> $GITHUB_ENV + echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH + - run: | + #prerequisites + brew install sqlite3 xz zlib + "$GITHUB_WORKSPACE/.github/workflows/scripts/brew-uninstall-cascade.sh" openssl@3 openssl@1.1 readline + if [[ "${{ matrix.python-version }}" =~ pypy.*-(src|dev) ]]; then + export PYENV_BOOTSTRAP_VERSION=pypy2.7-7 + echo "PYENV_BOOTSTRAP_VERSION=$PYENV_BOOTSTRAP_VERSION" >> $GITHUB_ENV + pyenv install $PYENV_BOOTSTRAP_VERSION + fi + - run: | + #build + pyenv --debug install ${{ matrix.python-version }} && rc=$? || rc=$? + if [[ $rc -ne 0 ]]; then echo config.log:; cat $TMPDIR/python-build*/*/config.log; false; fi + pyenv global ${{ matrix.python-version }} + - run: | + #print version + python --version + python -m pip --version + - env: + EXPECTED_PYTHON: ${{ matrix.python-version }} + run: | + #check + python -c ' + import os, sys, os.path + correct_dir = os.path.join( + os.environ["PYENV_ROOT"], + "versions", + os.environ["EXPECTED_PYTHON"], + "bin") + assert os.path.dirname(sys.executable) == correct_dir' + + ubuntu_build: + needs: discover_modified_scripts + if: needs.discover_modified_scripts.outputs.versions != '[""]' + strategy: + fail-fast: false + matrix: + python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions)}} + os: + - ubuntu-22.04 + - ubuntu-24.04 + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v6 + - run: | + #envvars + export PYENV_ROOT="$GITHUB_WORKSPACE" + echo "PYENV_ROOT=$PYENV_ROOT" >> $GITHUB_ENV + echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH + - run: | + #prerequisites + sudo apt-get update -q; sudo apt-get install -yq make build-essential \ + libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev \ + curl llvm libncurses5-dev libncursesw5-dev \ + xz-utils tk-dev libffi-dev liblzma-dev + if [[ "${{ matrix.python-version }}" =~ pypy.*-(src|dev) ]]; then + export PYENV_BOOTSTRAP_VERSION=pypy2.7-7 + echo "PYENV_BOOTSTRAP_VERSION=$PYENV_BOOTSTRAP_VERSION" >> $GITHUB_ENV + pyenv install $PYENV_BOOTSTRAP_VERSION + fi + - run: | + #build + pyenv --debug install ${{ matrix.python-version }} && rc=$? || rc=$? + if [[ $rc -ne 0 ]]; then echo config.log:; cat $TMPDIR/python-build*/*/config.log; false; fi + pyenv global ${{ matrix.python-version }} + # Micropython doesn't support --version + - run: | + #print version + if [[ "${{ matrix.python-version }}" == "micropython-"* ]]; then + python -c 'import sys; print(sys.version)' + else + python --version + python -m pip --version + fi + # Micropython doesn't support sys.executable, os.path, older versions even os + - env: + EXPECTED_PYTHON: ${{ matrix.python-version }} + run: | + #check + if [[ "${{ matrix.python-version }}" == "micropython-"* ]]; then + [[ $(pyenv which python) == "${{ env.PYENV_ROOT }}/versions/${{ matrix.python-version }}/bin/python" ]] || exit 1 + python -c 'import sys; assert sys.implementation.name == "micropython"' + else + python -c 'if True: + import os, sys, os.path + correct_dir = os.path.join( + os.environ["PYENV_ROOT"], + "versions", + os.environ["EXPECTED_PYTHON"], + "bin") + assert os.path.dirname(sys.executable) == correct_dir' + fi + # bundled executables in some Anaconda releases cause the post-run step to break + - run: | + pyenv global system + rm -f "$(pyenv root)"/shims/* + ubuntu_build_tar_gz: + needs: discover_modified_scripts + if: needs.discover_modified_scripts.outputs.versions_cpython_only != '[""]' + strategy: + fail-fast: false + matrix: + python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions_cpython_only)}} + os: ["ubuntu-latest"] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v6 + - run: | + #envvars + export PYENV_ROOT="$GITHUB_WORKSPACE" + echo "PYENV_ROOT=$PYENV_ROOT" >> $GITHUB_ENV + echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH + echo "_PYTHON_BUILD_FORCE_SKIP_XZ=1" >> $GITHUB_PATH + - run: | + #prerequisites + sudo apt-get update -q; sudo apt-get install -yq make build-essential \ + libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev \ + curl llvm libncurses5-dev libncursesw5-dev \ + xz-utils tk-dev libffi-dev liblzma-dev + if [[ "${{ matrix.python-version }}" =~ pypy.*-(src|dev) ]]; then + export PYENV_BOOTSTRAP_VERSION=pypy2.7-7 + echo "PYENV_BOOTSTRAP_VERSION=$PYENV_BOOTSTRAP_VERSION" >> $GITHUB_ENV + pyenv install $PYENV_BOOTSTRAP_VERSION + fi + - run: | + #build + pyenv --debug install ${{ matrix.python-version }} && rc=$? || rc=$? + if [[ $rc -ne 0 ]]; then echo config.log:; cat $TMPDIR/python-build*/*/config.log; false; fi + pyenv global ${{ matrix.python-version }} + - run: | + #print version + python --version + python -m pip --version + - env: + EXPECTED_PYTHON: ${{ matrix.python-version }} + run: | + #check + python -c ' + import os, sys, os.path + correct_dir = os.path.join( + os.environ["PYENV_ROOT"], + "versions", + os.environ["EXPECTED_PYTHON"], + "bin") + assert os.path.dirname(sys.executable) == correct_dir' diff --git a/.github/workflows/no-response.yml b/.github/workflows/no-response.yml new file mode 100644 index 0000000..c66e7b0 --- /dev/null +++ b/.github/workflows/no-response.yml @@ -0,0 +1,30 @@ +name: No Response + +# Both `issue_comment` and `scheduled` event types are required for this Action +# to work properly. +on: + issue_comment: + types: [created] + schedule: + # Schedule for ten minutes after the hour, every 2 hours + - cron: '10 */2 * * *' + +permissions: {} +jobs: + noResponse: + permissions: + issues: write # to update issues (lee-dohm/no-response) + + runs-on: ubuntu-latest + steps: + - uses: lee-dohm/no-response@v0.5.0 + with: + token: ${{ github.token }} + daysUntilClose: 30 + responseRequiredLabel: need-feedback + closeComment: > + This issue has been automatically closed because there has been no response + to our request for more information from the original author. With only the + information that is currently in the issue, we don't have enough information + to take action. Please reach out if you have or find the answers we need so + that we can investigate further. diff --git a/.github/workflows/pyenv_tests.yml b/.github/workflows/pyenv_tests.yml new file mode 100644 index 0000000..f6575f0 --- /dev/null +++ b/.github/workflows/pyenv_tests.yml @@ -0,0 +1,43 @@ +name: pyenv_tests +on: [pull_request, push] + +permissions: + contents: read # to fetch code (actions/checkout) + +jobs: + pyenv_tests: + strategy: + fail-fast: false + matrix: + os: + - ubuntu-22.04 + - ubuntu-24.04 + - macos-14 + - macos-15 + - macos-15-intel + - macos-26 + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v6 + - run: | + if test "$RUNNER_OS" == "macOS"; then + brew install coreutils fish + fi + - run: pwd + - env: + PYENV_ROOT: /home/runner/work/pyenv/pyenv + run: | + echo $PYENV_ROOT + echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH + - name: Run test on the host + run: | + make test + - name: Run test with docker + if: ${{ ! contains(matrix.os, 'macos') }} + run: | + make test-docker + - env: + PYENV_NATIVE_EXT: 1 + run: | + (cd src; ./configure; make) + bats/bin/bats test/{pyenv,hooks,versions}.bats diff --git a/.github/workflows/scripts/brew-uninstall-cascade.sh b/.github/workflows/scripts/brew-uninstall-cascade.sh new file mode 100755 index 0000000..2a6ba33 --- /dev/null +++ b/.github/workflows/scripts/brew-uninstall-cascade.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +declare -a packages rdepends +packages=("$@") + +# have to try one by one, otherwise `brew uses` would only print +# packages that require them all rather than any of them +for package in "${packages[@]}"; do + rdepends+=($(brew uses --installed --include-build --include-test --include-optional --recursive "$package")) +done +brew uninstall "${packages[@]}" "${rdepends[@]}" \ No newline at end of file diff --git a/.github/workflows/ubuntu_build.yml b/.github/workflows/ubuntu_build.yml new file mode 100644 index 0000000..9ba4513 --- /dev/null +++ b/.github/workflows/ubuntu_build.yml @@ -0,0 +1,40 @@ +name: ubuntu_build +on: [pull_request, push] + +permissions: + contents: read # to fetch code (actions/checkout) + +jobs: + ubuntu_build: + strategy: + fail-fast: false + matrix: + python-version: + - "3.10" + - "3.11" + - "3.12" + - "3.13" + - "3.14" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - run: | + sudo apt-get update -q; sudo apt install -yq make build-essential libssl-dev zlib1g-dev \ + libbz2-dev libreadline-dev libsqlite3-dev curl \ + libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev + # https://github.com/pyenv/pyenv#installation + - run: pwd + - env: + PYENV_ROOT: /home/runner/work/pyenv/pyenv + run: | + echo $PYENV_ROOT + echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH + bin/pyenv --debug install ${{ matrix.python-version }} + bin/pyenv global ${{ matrix.python-version }} + bin/pyenv rehash + - run: python --version + - run: python -m pip --version + - shell: python # Prove that actual Python == expected Python + env: + EXPECTED_PYTHON: ${{ matrix.python-version }} + run: import os, sys ; assert sys.version.startswith(os.getenv("EXPECTED_PYTHON")) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1754895 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +/shims +/version +/versions +/sources +/cache +/libexec/*.dylib +/src/Makefile +/src/*.o +/bats +/bats-*/ +/default-packages +.idea +*.un~ diff --git a/.vimrc b/.vimrc new file mode 100644 index 0000000..e12e62f --- /dev/null +++ b/.vimrc @@ -0,0 +1 @@ +set wildignore+=versions/*,cache/* diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..fc3f724 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,1630 @@ +# Version History + +## Release v2.6.31 +* CI: add_cpython: Support prereleases for non-initial CPython releases by @native-api in https://github.com/pyenv/pyenv/pull/3443 +* Add CPython 3.14.5 by @pyenv-bot[bot] in https://github.com/pyenv/pyenv/pull/3444 + +## Release v2.6.30 +* Add CPython 3.16-dev, switch 3.15-dev to maintenance branch by @nedbat in https://github.com/pyenv/pyenv/pull/3442 + +## Release v2.6.29 +* Add PyPy v7.3.22 by @jsirois in https://github.com/pyenv/pyenv/pull/3438 +* CI: Add timeouts to CPython release metadata fetches by @orbisai0security in https://github.com/pyenv/pyenv/pull/3439 +* Add CPython 3.15.0b1 by @jsirois in https://github.com/pyenv/pyenv/pull/3440 +* Add CPython 3.14.5rc1 by @native-api in https://github.com/pyenv/pyenv/pull/3441 + +## Release v2.6.28 +* pyenv-latest: fast path for when there is an exact match by @native-api in https://github.com/pyenv/pyenv/pull/3437 + +## Release v2.6.27 +* commands: fast path for --sh, replace sort|uniq with sort -u by @jakelodwick in https://github.com/pyenv/pyenv/pull/3423 +* which: update the `pyenv help global` tip by @native-api in https://github.com/pyenv/pyenv/pull/3424 +* Bump actions/create-github-app-token from 2 to 3 in the github-actions group by @dependabot[bot] in https://github.com/pyenv/pyenv/pull/3428 +* python-build: advise user with no c compiler by @exurd in https://github.com/pyenv/pyenv/pull/3294 +* Add CPython 3.13.13, 3.14.4, 3.15.0a8 by @pyenv-bot[bot] in https://github.com/pyenv/pyenv/pull/3432 +* Add miniforge3 26.1.1-2, 26.1.1-3 by @native-api in https://github.com/pyenv/pyenv/pull/3433 + +## Release v2.6.26 +* versions: fast path for --bare --skip-aliases by @jakelodwick in https://github.com/pyenv/pyenv/pull/3411 +* Fix MacPorts OpenSSL formula detection by @tekintian in https://github.com/pyenv/pyenv/pull/3417 +* rehash: streamline executables discovery; fix regression by @native-api in https://github.com/pyenv/pyenv/pull/3418 +* rehash: simplify source.bash pipeline by @jakelodwick in https://github.com/pyenv/pyenv/pull/3419 +* Add CPython 3.15.0a7 by @pyenv-bot[bot] in https://github.com/pyenv/pyenv/pull/3421 + +## Release v2.6.25 +* Add miniforge3-26.1.0-0 by @native-api in https://github.com/pyenv/pyenv/pull/3413 +* Add CPython 3.12.13 by @pyenv-bot[bot] in https://github.com/pyenv/pyenv/pull/3414 + +## Release v2.6.24 +* CI: add_version: use Github App token to create PR by @native-api in https://github.com/pyenv/pyenv/pull/3406 +* Add Anaconda3-2025.12-2 by @binbjz in https://github.com/pyenv/pyenv/pull/3408 +* rehash: Drop redundant sort -u from make_shims call by @jakelodwick in https://github.com/pyenv/pyenv/pull/3410 +* Add CPython 3.10.20, 3.11.15 by @pyenv-bot[bot] in https://github.com/pyenv/pyenv/pull/3412 + +## Release v2.6.23 +* Add CPython 3.15.0a6 by @native-api in https://github.com/pyenv/pyenv/pull/3403 + +## Release v2.6.22 +* Add CPython 3.13.12 by @github-actions[bot] in https://github.com/pyenv/pyenv/pull/3401 + +## Release v2.6.21 +* Add GraalPy 25.0.2 by @msimacek in https://github.com/pyenv/pyenv/pull/3395 +* Add CPython 3.14.3 by @github-actions[bot] in https://github.com/pyenv/pyenv/pull/3400 + +## Release v2.6.20 +* CI: adjust CPython PR generation logic by @native-api in https://github.com/pyenv/pyenv/pull/3392 +* Add CPython 3.15.0a5 by @nedbat in https://github.com/pyenv/pyenv/pull/3393 + +## Release v2.6.19 +* Add CPython 3.15.0a4 by @nedbat in https://github.com/pyenv/pyenv/pull/3390 + +## Release v2.6.18 +* Fix an infinite loop if a shim is symlinked to and called from a different location with "system" version active by @native-api in https://github.com/pyenv/pyenv/pull/3375 +* CI: Update and cleanup workflow scripts by @native-api in https://github.com/pyenv/pyenv/pull/3372 +* Add PowerShell support by @fblanchetNaN in https://github.com/pyenv/pyenv/pull/2749 +* rehash: support older BSD `mktemp` by @native-api in https://github.com/pyenv/pyenv/pull/3376 +* rehash: report final lock acquisition error while silencing provisional ones; init: don't silence automatic rehash by @native-api in https://github.com/pyenv/pyenv/pull/3377 +* pyenv launcher: introduce and export _PYENV_INSTALL_PREFIX by @rockandska in https://github.com/pyenv/pyenv/pull/3334 +* README: Document how to change Python version in a shell spawned from a Python-based program (e.g. Jupyter) by @native-api in https://github.com/pyenv/pyenv/pull/3380 +* Recognize an argument to -j in MAKEFLAGS when building extensions in 3.10-3.11 and latest 3.5-3.9 by @native-api in https://github.com/pyenv/pyenv/pull/3379 +* CI: add a script to autogenerate CPython build scripts by @native-api in https://github.com/pyenv/pyenv/pull/3358 +* Add miniconda3-25.11.1-1 by @binbjz in https://github.com/pyenv/pyenv/pull/3382 +* CI: exclude unsupported MacOS-x64 for recent Miniconda versions by @binbjz in https://github.com/pyenv/pyenv/pull/3385 +* Auto-accept TOS for miniconda3-25+ by @native-api in https://github.com/pyenv/pyenv/pull/3386 +* Add anaconda-2025.12-1 by @native-api in https://github.com/pyenv/pyenv/pull/3387 +* CI: automatically check for CPython releases and generate PRs by @native-api in https://github.com/pyenv/pyenv/pull/3388 + +## Release v2.6.17 +* Add miniforge 25.9.1-0, 25.11.0-1 by @13steinj in https://github.com/pyenv/pyenv/pull/3371 +* miniconda3-latest: auto accept TOS by @native-api in https://github.com/pyenv/pyenv/pull/3373 +* Add CPython 3.15.0a3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3374 + +## Release v2.6.16 +* rehash: Fix hanging for 60 seconds when shims directory is not writable due to Linux Landlock by @native-api in https://github.com/pyenv/pyenv/pull/3367 +* Add Miniconda3-25.9.1-3 by @binbjz in https://github.com/pyenv/pyenv/pull/3368 +* sh-rehash: Fix erroneously executing rather than printing a command by @native-api in https://github.com/pyenv/pyenv/pull/3369 +* Add CPython 3.13.11, 3.14.2 by @cesarcoatl in https://github.com/pyenv/pyenv/pull/3370 + +## Release v2.6.15 +* Add CPython 3.13.10 by @jsirois in https://github.com/pyenv/pyenv/pull/3364 + +## Release v2.6.14 +* CI: Bump actions/checkout from 5 to 6 in the github-actions group by @dependabot[bot] in https://github.com/pyenv/pyenv/pull/3360 +* Fix "ld: symbol(s) not found" for C system calls in some MacOS versions if XCode is for a newer major MacOS version by @native-api in https://github.com/pyenv/pyenv/pull/3362 +* Add CPython 3.14.1 by @nedbat in https://github.com/pyenv/pyenv/pull/3363 + +## Release v2.6.13 +* CI: Replace macos-13 with macos-15-intel by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3356 +* Add Miniconda3-25.9.1-1 by @binbjz in https://github.com/pyenv/pyenv/pull/3357 +* Add CPython 3.15.0a2 by @nedbat in https://github.com/pyenv/pyenv/pull/3359 + +## Release v2.6.12 +* Add graalpy-25.0.1 by @msimacek in https://github.com/pyenv/pyenv/pull/3350 +* Add CPython 3.9.25 by @nedbat in https://github.com/pyenv/pyenv/pull/3355 + +## Release v2.6.11 +* Support building against Homebrew Tcl/Tk 9 by @native-api in https://github.com/pyenv/pyenv/pull/3343 +* Add CPython 3.13.9 by @nedbat in https://github.com/pyenv/pyenv/pull/3346 +* Add CPython 3.15.0a1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3347 + +## Release v2.6.10 +* Add CPython 3.12.12, 3.11.14, 3.10.19, 3.9.24 by @nedbat in https://github.com/pyenv/pyenv/pull/3344 + +## Release v2.6.9 +* CI: modified-scripts-build: fix CPython-specific jobs never firing by @tuzi3040 in https://github.com/pyenv/pyenv/pull/3338 +* CI: modified-scripts-build: fix output variable for CPython-specific workflows by @native-api in https://github.com/pyenv/pyenv/pull/3340 +* Add CPython 3.14.0 by @SnoopJ in https://github.com/pyenv/pyenv/pull/3339 +* Add CPython 3.13.8 by @jsirois in https://github.com/pyenv/pyenv/pull/3341 + +## Release v2.6.8 +* Use Zlib from XCode SDK in a way compatible with XCode 16 and CLT by @JarheadStever in https://github.com/pyenv/pyenv/pull/3301 +* Add miniforge 25.3.0-1, 25.3.0-2, 25.3.0-3, 25.3.1-0, skip miniforge 25.3.0-0 by @native-api in https://github.com/pyenv/pyenv/pull/3306 +* Fix Readline and OpenSSL detection for MacPorts without the corresponding package by @native-api in https://github.com/pyenv/pyenv/pull/3317 +* Bump actions/checkout from 4 to 5 in the github-actions group by @dependabot[bot] in https://github.com/pyenv/pyenv/pull/3318 +* Fix rehash hook for pipx/pipx.x/pipx.xx by @rockandska in https://github.com/pyenv/pyenv/pull/3320 +* Add miniconda 25.7.0-2 by @native-api in https://github.com/pyenv/pyenv/pull/3323 +* Support curl from a snap by @native-api in https://github.com/pyenv/pyenv/pull/3329 +* CI: Bats test suite in docker by @rockandska in https://github.com/pyenv/pyenv/pull/3324 +* Add GraalPy 25.0.0 by @msimacek in https://github.com/pyenv/pyenv/pull/3331 +* Upgrade pip detetcion in pip-rehash to accept multiple variations by @rockandska in https://github.com/pyenv/pyenv/pull/3330 +* Add CPython 3.14.0rc3 by @nedbat in https://github.com/pyenv/pyenv/pull/3333 +* Use TCLTK_* and pkg-config for 3.11+ linking with Homebrew Tcl/Tk; add PYTHON_BUILD_TCLTK_FORMULA envvar by @native-api in https://github.com/pyenv/pyenv/pull/3327 + +## Release v2.6.7 +* Skip Zlib from XCode for XCode 16+ by @native-api in https://github.com/pyenv/pyenv/pull/3298 +* Don't fail the build if `xcodebuild` fails by @native-api in https://github.com/pyenv/pyenv/pull/3302 +* Add CPython 3.14.0rc2 and 3.13.7 by @nedbat in https://github.com/pyenv/pyenv/pull/3303 + +## Release v2.6.6 +* Add anaconda3-2025.06-0, anaconda3-2025.06-1, miniconda3-25.3.1-1, miniconda3-25.5.1-0, miniconda3-25.5.1-1 by @native-api in https://github.com/pyenv/pyenv/pull/3295 +* Add CPython 3.13.6 by @cesarcoatl in https://github.com/pyenv/pyenv/pull/3297 + +## Release v2.6.5 +* Bump OpenSSL to 3.5.1 in the latest releases and branch tips in CPython 3.12 - 3.15 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3287 +* Add Jython 2.7.4 by @cesarcoatl in https://github.com/pyenv/pyenv/pull/3290 +* Add CPython 3.14.0rc1 by @nedbat in https://github.com/pyenv/pyenv/pull/3293 +* Add GraalPy 24.2.2 by @msimacek in https://github.com/pyenv/pyenv/pull/3291 + +## Release v2.6.4 +* Backport bpo_36106 to 3.5.10 and 3.6.15 by @native-api in https://github.com/pyenv/pyenv/pull/3280 +* (regression) Use Zlib from XCode SDK in MacOS without Homebrew or Macports by @native-api in https://github.com/pyenv/pyenv/pull/3282 +* Add PyPy v7.3.20 by @jsirois in https://github.com/pyenv/pyenv/pull/3284 +* Add CPython 3.14.0b4 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3285 + +## Release v2.6.3 +* README: Re-promote "Python versions with extended support" to a section by @native-api in https://github.com/pyenv/pyenv/pull/3276 +* Support linking to MacPorts ports installed from binary archives by @0916dhkim in https://github.com/pyenv/pyenv/pull/3272 +* Add CPython 3.14.0b3 by @nedbat in https://github.com/pyenv/pyenv/pull/3278 + +## Release v2.6.2 +* Add CPython 3.13.5 by @nedbat in https://github.com/pyenv/pyenv/pull/3269 + +## Release v2.6.1 +* Add CPython 3.9.23, 3.10.18, 3.11.13, 3.12.11, 3.13.4 by @nedbat in https://github.com/pyenv/pyenv/pull/3266 + +## Release v2.6.0 +* python-build: Support patch paths with spaces/special characters by @native-api in https://github.com/pyenv/pyenv/pull/3251 +* Add CODEOWNERS file by @native-api in https://github.com/pyenv/pyenv/pull/3247 +* README: make fish PATH add conditional on the directory existing by @BooleanCat in https://github.com/pyenv/pyenv/pull/2786 +* Add --bare option to `pyenv version` by @jjwatt in https://github.com/pyenv/pyenv/pull/2783 +* README: Add shell setup instructions for nushell by @jordanst3wart in https://github.com/pyenv/pyenv/pull/2916 +* Add MacPorts support for python-build by @studnitskiy in https://github.com/pyenv/pyenv/pull/3186 +* python-build: fix `has_broken_mac_readline` when Readline is explicitly configured by @fofoni in https://github.com/pyenv/pyenv/pull/3254 +* Add CPython 3.14.0b2 by @nedbat in https://github.com/pyenv/pyenv/pull/3259 + +## Release v2.5.7 +* Point 3.14-dev to `3.14` branch by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3246 + +## Release v2.5.6 +* Add GraalPy 24.2.1 by @msimacek in https://github.com/pyenv/pyenv/pull/3238 +* Fix get-pip URLs for 3.7, 3.8 and Pyston by @dmrlawson in https://github.com/pyenv/pyenv/pull/3242 +* [CI] Cache `uname` and `sw_vers` output in Python-Build for easier mocking in tests by @native-api in https://github.com/pyenv/pyenv/pull/3244 +* Add CPython 3.14.0b1 and 3.15-dev by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3245 + +## Release v2.5.5 +* Add graalpy 24.2 by @msimacek in https://github.com/pyenv/pyenv/pull/3215 +* Switch 3.9+ to OpenSSL 3 by @native-api in https://github.com/pyenv/pyenv/pull/3223 +* Add miniforge3-24.11.3-1, miniforge3-24.11.3-2, miniforge3-25.1.1 by @native-api in https://github.com/pyenv/pyenv/pull/3224 +* Add CPython 3.9.22, 3.10.17, 3.11.12, 3.12.10, 3.13.3, 3.14.0a7 by @native-api in https://github.com/pyenv/pyenv/pull/3233 + +## Release v2.5.4 +* Add anaconda3-2025.1.1-2 by @binbjz in https://github.com/pyenv/pyenv/pull/3198 +* Add PyPy v7.3.19 by @jsirois in https://github.com/pyenv/pyenv/pull/3205 +* Add CPython 3.14.0a6 by @nedbat in https://github.com/pyenv/pyenv/pull/3213 + +## Release v2.5.3 +* Add PyPy v7.3.18 by @dand-oss in https://github.com/pyenv/pyenv/pull/3184 +* Add Miniconda3 25.1.1-0 by @binbjz in https://github.com/pyenv/pyenv/pull/3190 +* Add miniforge3-25.1.1-0, miniforge3-24.11.3-0 by @native-api in https://github.com/pyenv/pyenv/pull/3191 +* Add CPython 3.14.0a5 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3194 +* Add Miniconda3 25.1.1-1 by @binbjz in https://github.com/pyenv/pyenv/pull/3192 +* Update hashes for Python 3.14.0a5 tarballs by @jsirois in https://github.com/pyenv/pyenv/pull/3196 +* rehash: Do not execute conda-specific code if conda is not installed by @ChristianFredrikJohnsen in https://github.com/pyenv/pyenv/pull/3151 + +## Release v2.5.2 +* Fix OpenSSL version parsing in python-build script by @threadflow in https://github.com/pyenv/pyenv/pull/3181 +* Add GraalPy 24.1.2 by @msimacek in https://github.com/pyenv/pyenv/pull/3176 +* Add CPython 3.12.9 and 3.13.2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3183 + +## Release v2.5.1 +* CI: use Ubuntu 24.04; use ubuntu-latest for the ubuntu_build check by @native-api in https://github.com/pyenv/pyenv/pull/3144 +* Fix: mistake in configuration hints in `pyenv init` and manpage by @ChristianFredrikJohnsen in https://github.com/pyenv/pyenv/pull/3145 +* README: Add recommended curl arguments to suggested installer invocation by @JayBazuzi in https://github.com/pyenv/pyenv/pull/3155 +* Add miniforge3-24.11.2-0, miniforge3-24.11.2-1 by @native-api in https://github.com/pyenv/pyenv/pull/3163 +* Fix "Unsupported options" error building bundled OpenSSL <3.2.0 by @native-api in https://github.com/pyenv/pyenv/pull/3164 +* Add CPython 3.14.0a4 by @nedbat in https://github.com/pyenv/pyenv/pull/3168 + +## Release v2.5.0 +* `pyenv init -` performance improvements; recommend using `pyenv init - ` by @ChristianFredrikJohnsen in https://github.com/pyenv/pyenv/pull/3136 +* Add miniconda3-24.11.1-0 by @binbjz in https://github.com/pyenv/pyenv/pull/3138 +* Add miniconda3-24.3.0-0 by @native-api in https://github.com/pyenv/pyenv/pull/3139 +* CI: only run macos_build_bundled_dependencies and ubuntu_build_tar_gz for CPython by @native-api in https://github.com/pyenv/pyenv/pull/3141 +* Add miniforge3 and mambaforge3 24.1.2-0, 24.3.0-0, 24.5.0-0, 24.7.1-0, 24.7.1-1, 24.7.1-2, 24.9.0-0, 24.9.2-0, 24.11.0-0, 24.11.0-1 by @native-api in https://github.com/pyenv/pyenv/pull/3142 +* Skip broken miniforge3/mambaforge3 22.11.0-0, 22.11.0-1, 22.11.0-2 in the generation script by @native-api in https://github.com/pyenv/pyenv/pull/3143 + +## Release v2.4.23 +* README: explain using multiple versions by @Finkregh in https://github.com/pyenv/pyenv/pull/3126 +* Support PACKAGE_CPPFLAGS and PACKAGE_LDFLAGS by @native-api in https://github.com/pyenv/pyenv/pull/3130 +* Adjust suggested shell startup code to support Pyenv with Pyenv-Win in WSL by @native-api in https://github.com/pyenv/pyenv/pull/3132 +* Support nonexistent versions being present and set in a local .python-version by @native-api in https://github.com/pyenv/pyenv/pull/3134 +* Add CPython 3.14.0a3 by @nedbat in https://github.com/pyenv/pyenv/pull/3135 + +## Release v2.4.22 +* Speed up building bundled OpenSSL by @native-api in https://github.com/pyenv/pyenv/pull/3124 +* CI: add building modified scripts with bundled MacOS dependencies by @native-api in https://github.com/pyenv/pyenv/pull/3123 +* CL: + test modified scripts with tar.gz source by @native-api in https://github.com/pyenv/pyenv/pull/3125 +* Fix 404 for openssl-3.4.0 release in build 3.13.1 by @dlamblin in https://github.com/pyenv/pyenv/pull/3122 + +## Release v2.4.21 +* Add CPython 3.13.1t by @makukha in https://github.com/pyenv/pyenv/pull/3120 +* Prefer tcl-tk@8 from Homebrew due to release of Tcl/Tk 9 with which only 3.12+ are compatible by @native-api in https://github.com/pyenv/pyenv/pull/3118 + +## Release v2.4.20 +* README: Fix Markdown in "Notes about python releases" by @noelleleigh in https://github.com/pyenv/pyenv/pull/3112 +* README: correct link to shell setup instructions by @shortcuts in https://github.com/pyenv/pyenv/pull/3113 +* Add CPython 3.9.21, 3.10.16, 3.11.11, 3.12.8 and 3.13.1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3117 + +## Release v2.4.19 +* Add CPython 3.14.0a2 by @nedbat in https://github.com/pyenv/pyenv/pull/3110 +* Add quick start section and gif demo to accompany it. by @madhu-GG in https://github.com/pyenv/pyenv/pull/3044 + +## Release v2.4.18 +* Add miniforge3-24.9.2-0 by @goerz in https://github.com/pyenv/pyenv/pull/3106 + +## Release v2.4.17 +* Add miniconda3-24.9.2-0 by @binbjz in https://github.com/pyenv/pyenv/pull/3096 +* Add Anaconda3-2024.10-1 by @binbjz in https://github.com/pyenv/pyenv/pull/3097 + +## Release v2.4.16 +* Add GraalPy 24.1.1 by @msimacek in https://github.com/pyenv/pyenv/pull/3092 +* Add CPython 3.14.0a1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3093 + +## Release v2.4.15 +* CI: replace set-output with GITHUB_OUTPUT by @tuzi3040 in https://github.com/pyenv/pyenv/pull/3079 +* Make uninstall yes/no prompt consistent with others by @dpoznik in https://github.com/pyenv/pyenv/pull/3080 +* Add CPython 3.13.0 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3081 +* Avoid shadowing of virtualenvs with the name starting with "python-" by @aarbouin in https://github.com/pyenv/pyenv/pull/3086 +* Support free-threaded CPython flavor in prefix resolution by @native-api in https://github.com/pyenv/pyenv/pull/3090 + +## Release v2.4.14 +* Add CPython 3.12.7 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3078 +* Add CPython 3.13.0rc3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3077 + +## Release v2.4.13 +* docs: Use `--verbose` with performance CPython build instructions by @caerulescens in https://github.com/pyenv/pyenv/pull/3053 +* Fix latest version resolution when using `python-` prefix by @edmorley in https://github.com/pyenv/pyenv/pull/3056 +* Fix tgz checksum for 3.9.20; fallback OpenSSL URLs and checksums by @native-api in https://github.com/pyenv/pyenv/pull/3060 +* Fix OpenSSL 3.3.2 download URLs by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3059 +* Add GraalPy 24.1.0 by @msimacek in https://github.com/pyenv/pyenv/pull/3066 + +## Release v2.4.12 +* Add CPython 3.13.0rc2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3049 +* Add CPython 3.8.20, 3.9.20, 3.10.15, 3.11.10 and 3.12.6 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3050 + +## Release v2.4.11 +* Add /usr/etc/pyenv.d to hooks path by @tomschr in https://github.com/pyenv/pyenv/pull/3039 +* Add miniconda3-24.7.1-0 by @binbjz in https://github.com/pyenv/pyenv/pull/3040 +* Add PyPy v7.3.17 by @jsirois in https://github.com/pyenv/pyenv/pull/3045 + +## Release v2.4.10 +* Add CPython 3.12.5 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3030 + +## Release v2.4.9 +* Add miniforge3-24.3.0-0 by @goerz in https://github.com/pyenv/pyenv/pull/3028 +* Add CPython 3.13.0rc1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3029 + +## Release v2.4.8 +* Fix pyenv-uninstall not having the debug tracing invocation by @native-api in https://github.com/pyenv/pyenv/pull/3020 +* Add CPython 3.13.0b4 and 3.13.0b4t by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3019 +* README: Remove reference to Fig by @ThomasHaz in https://github.com/pyenv/pyenv/pull/3018 +* Fix tests failing if plugins are installed by @native-api in https://github.com/pyenv/pyenv/pull/3022 +* pyenv-latest: replace -q with -b and -f, document as internal by @native-api in https://github.com/pyenv/pyenv/pull/3021 + +## Release v2.4.7 +* Add support for anaconda3-2024.06-1 by @binbjz in https://github.com/pyenv/pyenv/pull/3009 +* Fix debug build for X.Yt-dev by @native-api in https://github.com/pyenv/pyenv/pull/ + +## Release v2.4.6 +* CI: push MacOS jobs to MacOS 13 and 14 by @native-api in https://github.com/pyenv/pyenv/pull/3002 +* Add 3.13.0b3t and exclude it from `pyenv latest` by @colesbury in https://github.com/pyenv/pyenv/pull/3001 +* Speed up `pyenv prefix` by not constructing advice text when it would be discarded by @Erotemic in https://github.com/pyenv/pyenv/pull/3005 + +## Release v2.4.5 +* Add CPython 3.13.0b3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2996 + +## Release v2.4.4 +* Add support for miniconda3 24.5.0-0 with py3.12, py3.11, py3.10, py3.9 by @binbjz in https://github.com/pyenv/pyenv/pull/2994 +* Add support for free-threaded Python by @colesbury in https://github.com/pyenv/pyenv/pull/2995 + +## Release v2.4.3 +* Add miniconda3 24.4.0-0 by @binbjz in https://github.com/pyenv/pyenv/pull/2982 + +## Release v2.4.2 +* Add script to install graalpy development builds by @timfel in https://github.com/pyenv/pyenv/pull/2969 +* Correct the Explanation of PATH Variable Lookup by @Y-askour in https://github.com/pyenv/pyenv/pull/2975 +* Document PYTHON_BUILD_CURL_OPTS, PYTHON_BUILD_WGET_OPTS, PYTHON_BUILD_ARIA2_OPTS by @native-api in https://github.com/pyenv/pyenv/pull/2976 +* Add sed and greadlink to shim exceptions by @native-api in https://github.com/pyenv/pyenv/pull/2977 +* Add CPython 3.13.0b2 by @jsirois in https://github.com/pyenv/pyenv/pull/2978 +* Add CPython 3.12.4 by @xxzgc in https://github.com/pyenv/pyenv/pull/2981 + +## Release v2.4.1 +* Add CPython 3.12.3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2941 +* Add CPython 3.13.0a6 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2942 +* Add PyPy v7.3.16 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2948 +* Add CPython 3.14-dev, update 3.13-dev by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2960 +* Add CPython 3.13.0b1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2959 + +## Release v2.4.0 +* Add CPython 3.13.0a4 by @saaketp in https://github.com/pyenv/pyenv/pull/2903 +* Handle the case where `pyenv-commands --sh` returns nothing by @aphedges in https://github.com/pyenv/pyenv/pull/2908 +* Document default build configuration customizations by @native-api in https://github.com/pyenv/pyenv/pull/2911 +* Use Homebrew in Linux if Pyenv is installled with Homebrew by @native-api in https://github.com/pyenv/pyenv/pull/2906 +* Add miniforge and mambaforge 22.11.1-3, 22.11.1-4, 23.1.0-0 to 23.11.0-0 by @aphedges in https://github.com/pyenv/pyenv/pull/2909 +* Add miniconda3-24.1.2 by @binbjz in https://github.com/pyenv/pyenv/pull/2915 +* Minor grammar fix in libffi backport patch in 2.5.x by @cuinix in https://github.com/pyenv/pyenv/pull/2922 +* Add CPython 3.13.0a5 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2924 +* Add CPython 3.8.19 and 3.9.19 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2929 +* Add GraalPy 24.0.0 by @msimacek in https://github.com/pyenv/pyenv/pull/2928 +* Add CPython 3.10.14 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2930 +* Add Jython 2.7.3 by @cesarcoatl in https://github.com/pyenv/pyenv/pull/2936 +* Add CPython 3.11.9 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2938 +* Add anaconda 2024.02 by @native-api in https://github.com/pyenv/pyenv/pull/2939 + +## Release v2.3.36 +* Add a Dependabot config to auto-update GitHub action versions by @kurtmckee in https://github.com/pyenv/pyenv/pull/2863 +* Bump the github-actions group with 1 update by @dependabot in https://github.com/pyenv/pyenv/pull/2864 +* Add installation prefix to `python-config --ldflags` output by @mhaeuser in https://github.com/pyenv/pyenv/pull/2865 +* Add support for miniconda3 23.11.0-1, 23.11.0-2 with py3.11, py3.10, py3.9, py3.8 by @binbjz in https://github.com/pyenv/pyenv/pull/2870 +* Add micropython 1.20.0 and 1.21.0 by @cpzt in https://github.com/pyenv/pyenv/pull/2869 +* Make "Automatic installer" command in the README a copy-able code block by @ryan-williams in https://github.com/pyenv/pyenv/pull/2874 +* Add PyPy 7.3.14 by @dand-oss in https://github.com/pyenv/pyenv/pull/2876 +* Add graalpy-23.1.2 by @msimacek in https://github.com/pyenv/pyenv/pull/2884 +* Add CPython 3.13.0a3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2885 +* Add PyPy v7.3.15 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2886 +* Update pypy3.9-7.3.13 checksums by @ecerulm in https://github.com/pyenv/pyenv/pull/2887 +* Add CPython 3.12.2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2899 +* Add CPython 3.11.8 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2898 + +## Release v2.3.35 +* Add CPython 3.12.1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2861 + +## Release v2.3.34 +* Fix graalpy-community to use a separate package name by @native-api in https://github.com/pyenv/pyenv/pull/2855 +* Move 3.11.5+ to OpenSSL 3 by default by @native-api in https://github.com/pyenv/pyenv/pull/2858 +* Add CPython 3.11.7 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2860 + +## Release v2.3.33 +* Add miniforge3-23.3.1-1 by @goerz in https://github.com/pyenv/pyenv/pull/2839 +* Add support for miniconda3-3.11-23.10.0-1 by @binbjz in https://github.com/pyenv/pyenv/pull/2843 +* Add support for miniconda3 23.10.0-1 with py3.10、py3.9、py3.8 by @binbjz in https://github.com/pyenv/pyenv/pull/2844 +* Add CPython 3.13.0a2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2849 +* python-build: Document PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA and PYTHON_BUILD_HTTP_CLIENT by @native-api in https://github.com/pyenv/pyenv/pull/2853 + +## Release v2.3.32 +* Describe --no-rehash option in the manpage by @fsc-eriker in https://github.com/pyenv/pyenv/pull/2832 +* Make adding $PYENV_ROOT/bin to PATH independent of other software by @native-api in https://github.com/pyenv/pyenv/pull/2837 +* Make `pyenv init` output insertable to startup files by @native-api in https://github.com/pyenv/pyenv/pull/2838 + +## Release v2.3.31 +* Add new anaconda and miniconda definitions by @aphedges in https://github.com/pyenv/pyenv/pull/2824 + +## Release v2.3.30 + +* Fix intermittent "broken pipe" in tests by @native-api in https://github.com/pyenv/pyenv/pull/2817 +* Add CPython 3.13.0a1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2818 +* Add PyPy 7.3.13 by @dand-oss in https://github.com/pyenv/pyenv/pull/2807 +* Fix linking against Homebrew's Tcl/Tk 8.6.13 in MacOS by @startergo in https://github.com/pyenv/pyenv/pull/2820 + +## Release v2.3.29 + +* Add CPython 3.11.6 by @thecesrom in https://github.com/pyenv/pyenv/pull/2806 +* Add GraalPy 23.1.0 definition using the faster Oracle GraalVM distribution by @eregon in https://github.com/pyenv/pyenv/pull/2812 +* Install ncurses from Homebrew, if available by @aphedges in https://github.com/pyenv/pyenv/pull/2813 + +## Release v2.3.28 + +* Prioritize 'zlib from xcode sdk' flag correctly by @native-api in https://github.com/pyenv/pyenv/pull/2791 +* Prefer OpenSSL 3 in Homebrew in 3.13-dev by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2793 +* Add CPython 3.12.0rc3 by @saaketp in https://github.com/pyenv/pyenv/pull/2795 +* Add graalpy-23.1.0 and split between graalpy and graalpy-community by @msimacek in https://github.com/pyenv/pyenv/pull/2796 +* Update the OpenSSL dependency for Python 2.7.18 by @lpapp-foundry in https://github.com/pyenv/pyenv/pull/2797 +* Add CPython 3.12.0 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2804 + +## Release v2.3.27 + +* Prefer OpenSSL 3 in Homebrew since 3.12 by @native-api in https://github.com/pyenv/pyenv/pull/2781 +* Fix get-pip urls for older pypy versions by @TimPansino in https://github.com/pyenv/pyenv/pull/2788 +* Update openssl url for 3.12.0rc2 by @zsol in https://github.com/pyenv/pyenv/pull/2789 + +## Release v2.3.26 + +* Prevent `grep` warning in `conda.bash` by @aphedges in https://github.com/pyenv/pyenv/pull/2768 +* fix a typo in README.md by @xzmeng in https://github.com/pyenv/pyenv/pull/2769 +* use -I with ensurepip by @xaocon in https://github.com/pyenv/pyenv/pull/2764 +* Add CPython 3.12.0rc2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2778 + +## Release v2.3.25 + +* Add CPython 3.8.18, 3.9.18, 3.10.13, 3.11.5 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2763 + +## Release v2.3.24 + +* README update: Added UNIX reference near Automatic installer by @VictorieeMan in https://github.com/pyenv/pyenv/pull/2744 +* Fix FreeBSD tests in MacOS CI by @native-api in https://github.com/pyenv/pyenv/pull/2748 +* Add CPython 3.12.0rc1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2752 +* [Add an updated Anaconda and Miniconda installers](https://github.com/pyenv/pyenv/commit/db871427c7a232e18ee7a6dc0182989a646ccca9) + +## Release v2.3.23 + +* Add CPython 3.12.0b4 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2741 +* Add new anaconda and miniconda definitions by @aphedges in https://github.com/pyenv/pyenv/pull/2742 + +## Release v2.3.22 + +* Add CPython 3.12.0b3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2730 +* Add Cinder 3.10 and Cinder configure patches by @filips123 in https://github.com/pyenv/pyenv/pull/2739 + +## Release v2.3.21 + +* Add graalpy-23.0.0 by @msimacek in https://github.com/pyenv/pyenv/pull/2724 +* Add PyPy 7.3.12 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2726 +* Fix occasional 'libexec/pyenv-latest: line 39: printf: write error: Broken pipe' by @native-api in https://github.com/pyenv/pyenv/pull/2729 + +## Release v2.3.20 + +* Backport bpo-42351 to 3.5.10 by @native-api in https://github.com/pyenv/pyenv/pull/2717 +* Add missing patches for Python 3.7/3.8/3.9 by @tomkins in https://github.com/pyenv/pyenv/pull/2718 + +## Release v2.3.19 + +* Add CPython 3.7.17, 3.8.17 and 3.9.17 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2711 +* Add CPython 3.11.4 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2715 +* Add CPython 3.10.12 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2714 +* Add CPython 3.12.0b2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2713 + +## Release 2.3.18 + +* Fix not showing symlink contents for unselected versions in `pyenv versions` by @native-api in https://github.com/pyenv/pyenv/pull/2675 +* Correct link in has_tar_xz_support else branch of 3.10.11 and 3.11.3 by @mirekdlugosz in https://github.com/pyenv/pyenv/pull/2677 +* Fix #2682: Correct pyenv_user_setup.bash file by @tomschr in https://github.com/pyenv/pyenv/pull/2687 +* fix: updating heredoc delimiter to be random and unique by @aviadhahami in https://github.com/pyenv/pyenv/pull/2691 +* Support ksh alternative names by @kpschoedel in https://github.com/pyenv/pyenv/pull/2697 +* Add CPython 3.12.0b1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2701 +* Update 3.12-dev and add 3.13-dev by @t0b3 in https://github.com/pyenv/pyenv/pull/2703 + +## Release 2.3.17 + +* Try locate `readlink` first in pyenv-hooks, fix #2654 by @Harry-Chen in https://github.com/pyenv/pyenv/pull/2655 +* Add CPython 3.12.0a7 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2668 +* Add CPython 3.11.3 by @mirekdlugosz in https://github.com/pyenv/pyenv/pull/2671 +* Add CPython 3.10.11 by @mirekdlugosz in https://github.com/pyenv/pyenv/pull/2670 + +## Release 2.3.16 + +* Add Miniforge3-22.11.1-4 by @jlec in https://github.com/pyenv/pyenv/pull/2642 +* Add Anaconda3-2023.03 by @anton-petrov in https://github.com/pyenv/pyenv/pull/2648 + +## Release 2.3.15 + +* Add miniconda 23.1.0-1 by @aphedges in https://github.com/pyenv/pyenv/pull/2635 +* Add CPython 3.12.0a6 by @saaketp in https://github.com/pyenv/pyenv/pull/2638 + +## Release 2.3.14 + +* Fix indentation by @rafrafek in https://github.com/pyenv/pyenv/pull/2620 +* Support for "BusyBox version" of "head" by @schuellerf in https://github.com/pyenv/pyenv/pull/2629 +* bpo-27987 for v3.5.10 and v3.6.15: align by 16bytes on 64bit platforms by @chaimleib in https://github.com/pyenv/pyenv/pull/2630 +* bpo-36231 for v3.5.10: fix Unsupported MacOS X CPU type in ffi.h by @chaimleib in https://github.com/pyenv/pyenv/pull/2633 +* README: clarify behavior of `pyenv latest` by @mrienstra in https://github.com/pyenv/pyenv/pull/2634 + +## Release 2.3.13 + +* Fix pyenv-latest to ignore virtualenvs by @native-api in https://github.com/pyenv/pyenv/pull/2608 +* Show symlink contents in non-bare `pyenv versions' by @native-api in https://github.com/pyenv/pyenv/pull/2609 +* Ignore virtualenvs in `pyenv latest' in a clean way by @native-api in https://github.com/pyenv/pyenv/pull/2610 +* Fix link resolving in pyenv-versions by @laggardkernel in https://github.com/pyenv/pyenv/pull/2612 +* Add CPython 3.11.2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2615 +* Add CPython 3.10.10 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2616 +* Add CPython 3.12.0a5 by @Afront in https://github.com/pyenv/pyenv/pull/2614 + +## Release 2.3.12 + +* Undefined name: do not forget self when accessing flavor by @cclauss in https://github.com/pyenv/pyenv/pull/2595 +* Fix wrong libpython being linked to in MacOS by @native-api in https://github.com/pyenv/pyenv/pull/2596 +* Fix `:latest` by @native-api in https://github.com/pyenv/pyenv/pull/2599 +* Fix `pyenv which` to support auto-resolved prefixes by @native-api in https://github.com/pyenv/pyenv/pull/2601 +* Add more recent build of nogil Python. by @colesbury in https://github.com/pyenv/pyenv/pull/2602 + +## Release 2.3.11 + +* Add CPython 3.12.0a4 by @Afront in https://github.com/pyenv/pyenv/pull/2590 +* Add a script to add the latest miniforge and mambaforge versions by @smcgivern in https://github.com/pyenv/pyenv/pull/2560 +* Add missing Miniforge/Mambaforge versions (4.10.2-0 - 22.9.0-3) by @smcgivern in https://github.com/pyenv/pyenv/pull/2591 +* Fix using dependencies from Ports in FreeBSD that are not searched with pkg-config by @native-api in https://github.com/pyenv/pyenv/pull/2593 +* Fix priority for user-supplied configure and make flags by (**_only set --enable-shared if user hasn't supplied --disable-shared_**) @native-api in https://github.com/pyenv/pyenv/pull/2592 +* Fix a compilation error in 3.8.10+ and 3.9.5+ when linking against Op… by @native-api in https://github.com/pyenv/pyenv/pull/2594 + +## Release 2.3.10 + +* Remove stray newline after python-build installation by @tklauser in https://github.com/pyenv/pyenv/pull/2566 +* Allow multiple versions for pyenv-install by @rockandska in https://github.com/pyenv/pyenv/pull/2568 +* --enable-shared by default by @anton-petrov in https://github.com/pyenv/pyenv/pull/2554 +* Fix non-bash output while detecting shell by @ianchen-tw in https://github.com/pyenv/pyenv/pull/2561 +* add pypy 7.3.11 release by @dand-oss in https://github.com/pyenv/pyenv/pull/2576 +* Mention how to build for maximum performance by @hauntsaninja in https://github.com/pyenv/pyenv/pull/2579 +* Add miniconda 22.11.1-1 by @aphedges in https://github.com/pyenv/pyenv/pull/2583 +* Add Fig as autocomplete suggestion by @brendanfalk in https://github.com/pyenv/pyenv/pull/2574 +* Fix using dependencies from Ports in BSD with no pkg-config by @native-api in https://github.com/pyenv/pyenv/pull/2586 + +## Release 2.3.9 + +* Add -latest suffix to miniforge3 by @nwh in https://github.com/pyenv/pyenv/pull/2551 +* Add PyPy 7.3.10 by @dand-oss in https://github.com/pyenv/pyenv/pull/2553 +* Add miniforge3 and mambaforge 22.9.0-2 by @smcgivern in https://github.com/pyenv/pyenv/pull/2559 +* Fix compilation error when building OpenSSL 1.1.1q in MacOS 11+ for 3.9.16 by @lisbethw1130 in https://github.com/pyenv/pyenv/pull/2558 +* Add `openssl` patches for 3.7.15, 3.7.16, and 3.8.16 by @samdoran in https://github.com/pyenv/pyenv/pull/2564 +* Add support for Anaconda3-2022.10 by @huypn12 in https://github.com/pyenv/pyenv/pull/2565 + +## Release 2.3.8 + +* Export detected shell environment in pyenv-init by @ianchen-tw in https://github.com/pyenv/pyenv/pull/2540 +* Add CPython 3.12.0a3 by @saaketp in https://github.com/pyenv/pyenv/pull/2545 +* Add CPython 3.11.1 by @anton-petrov in https://github.com/pyenv/pyenv/pull/2549 +* Add CPython 3.10.9 by @rudisimo in https://github.com/pyenv/pyenv/pull/2544 +* Add 3.7.16, 3.8.16, 3.9.16 by @chadac in https://github.com/pyenv/pyenv/pull/2550 + +## Release 2.3.7 + +* Add Python version 3.11 to the macOS build by @jbkkd in https://github.com/pyenv/pyenv/pull/2510 +* Don't use Zlib from XCode SDK if a custom compiler is used by @native-api in https://github.com/pyenv/pyenv/pull/2516 +* Change line endings from CRLF to LF by @hoang-himself in https://github.com/pyenv/pyenv/pull/2517 +* Fix resolution of a name that's a prefix of another name by @native-api in https://github.com/pyenv/pyenv/pull/2521 +* GitHub Workflows security hardening by @sashashura in https://github.com/pyenv/pyenv/pull/2511 +* Add nushell to activate list by @theref in https://github.com/pyenv/pyenv/pull/2524 +* Fix compilation error when building OpenSSL 1.1.1q in MacOS 11+ for 3.9.15 and 3.8.15 by @twangboy in https://github.com/pyenv/pyenv/pull/2520 +* Add simple `.editorconfig` file by @aphedges in https://github.com/pyenv/pyenv/pull/2518 +* Support `aria2c` being a snap by @native-api in https://github.com/pyenv/pyenv/pull/2528 +* Add CPython 3.12.0a2 by @saaketp in https://github.com/pyenv/pyenv/pull/2527 +* Add --no-push-path option by @isaacl in https://github.com/pyenv/pyenv/pull/2526 +* Fix typo in README.md by @weensy in https://github.com/pyenv/pyenv/pull/2535 +* Copy auto installer oneliner to readme by @spookyuser in https://github.com/pyenv/pyenv/pull/2538 + +## Release 2.3.6 + +* Add CPython 3.10.8 (#2480) +* Add CPython 3.7.15, 3.8.15, and 3.9.15 (#2482) +* Add CPython 3.11.0 (#2493) +* Add CPython 3.12.0a1 (#2495) +* Add graalpy-22.3.0 (#2497) +* Auto-resolve prefixes to the latest version (#2487) + * It must be a full prefix -- the actual searched prefix is `[-.]` + * Other flavors are likely sorted incorrectly atm + * Prereleases and versions with some suffixes (`-dev`, `-src`, `-latest`) are not searched + * `pyenv uninstall` has been excluded from the resolution feature: deleting a dynamically selected installation could be problematic +* Fix OpenSSL 1.1.1q compilation error in MacOS 11+ (#2500) +* Link to Tcl/Tk from Homebrew via pkgconfig for 3.11+ (#2501) +* Fix syntax error in `pyenv init -` if PYENV_ROOT has spaces (#2506) + +## Release 2.3.5 + +* Add CPython 3.10.7 (#2454) +* Docs: update Fish PATH update (#2449) +* Add CPython 3.7.14, 3.8.14 and 3.9.14 (#2456) +* Update miniconda3-3.9-4.12.0 (#2460) +* Add CPython 3.11.0rc2 (#2459) +* Add patches for 3.7.14 to support Apple Silicon (#2463) +* Add ability to skip all use of Homebrew (#2464) +* Drop Travis integration (#2468) +* Build CPython 3.12+ with --with-dsymutil in MacOS (#2471) +* Add Pyston 2.3.5 (#2476) + +## Release 2.3.4 + +* Add CPython 3.11.0rc1 (#2434) +* Add support for multiple versions in `pyenv uninstall` (#2432) +* Add micropython 1.18 and 1.19.1 (#2443) +* CI: support Micropython, deleted scripts; build with -v (#2447) +* Re-allow paths in .python-version while still preventing CVE-2022-35861 (#2442) +* CI: Bump OS versions (#2448) +* Add Cinder 3.8 (#2433) + +## Release 2.3.3 + +* Use version sort in `pyenv versions` (#2405) +* Add CPython 3.11.0b4 (#2411) +* Python-build: Replace deprecated git protocol use with https in docs (#2413) +* Fix relative path traversal due to using version string in path (#2412) +* Allow pypy2 and pypy3 patching (#2421, #2419) +* Add CPython 3.11.0b5 (#2420) +* Add GraalPython 22.2.0 (#2425) +* Add CPython 3.10.6 (#2428) + +## Release 2.3.2 + +* Add CPython 3.11.0b2 (#2380) +* Honor CFLAGS_EXTRA for MicroPython #2006 (#2007) +* Add post-install checks for curses, ctypes, lzma, and tkinter (#2353) +* Add CPython 3.11.0b3 (#2382) +* Add flags for Homebrew into `python-config --ldflags` (#2384) +* Add CPython 3.10.5 (#2386) +* Add Anaconda 2019.10, 2021.04, 2022.05; support Anaconda in add_miniconda.py (#2385) +* Add Pyston-2.3.4 (#2390) +* Update anaconda3-2022.05 MacOSX arm64 md5 (#2391) + +## Release 2.3.1 + +* Version file read improvements (#2269) +* Add CPython 3.11.0b1 (#2358) +* Update 3.11-dev and add 3.12-dev (#2361) +* Add CPython 3.9.13 (#2372) +* Add miniconda 4.12.0 (#2371) +* Fix endless loop in `pyenv init -` under SSH in some shell setups (#2374) +* CI: Add tests for modified Python build scripts (#2286) + +## Release 2.3.0 + +* Bump openssl 1.1 to 1.1.1n for CPython 3.7 3.8 3.9 (#2276) +* Doc Fix: Escape a hash character causing unwanted GitHub Issue linking (#2282) +* Add CPython 3.9.12 (#2296) +* Add CPython 3.10.4 (#2295) +* Add patch for 3.6.15 to support Xcode 13.3 (#2288) +* Add patch for 3.7.12 to support Xcode 13.3 (#2292) +* Add CONTRIBUTING.md (#2287) +* Add PyPy 7.3.9 release 2022-03-30 (#2308) +* Add Pyston 2.3.3 (#2316) +* Add CPython 3.11.0a7 (#2315) +* Add "nogil" Python v3.9.10 (#2342) +* Support XCode 13.3 in all releases that officially support MacOS 11 (#2344) +* Add GraalPython 22.1.0 (#2346) +* Make PYENV_DEBUG imply -v for `pyenv install` (#2347) +* Simplify init scheme (#2310) +* Don't use Homebrew outside of MacOS (#2349) +* Add `:latest` syntax to documentation for the `install` command (#2351) + +## Release 2.2.5 + +* Add CPython 3.10.3 +* Add CPython 3.9.11 +* Add CPython 3.8.13 +* Add CPython 3.7.13 +* Add CPython 3.11.0a6 (#2266) +* Add PyPy 7.3.8 (#2253) +* Add miniconda3-3.7-4.11.0, miniconda3-3.8-4.11.0, miniconda3-3.9-4.11.0 (#2268) +* Add pyston-2.3.2 (#2240) +* Fix UnicodeDecodeError for CPython 3.6.15 and 3.7.12 (#2237) +* python-build: add URL for get-pip for Python 3.6 (#2238) +* Bump openssl to 1.1.1n for CPython 3.10.x + +## Release 2.2.4 + +* Added docstrings to several undocumented functions (#2197) +* Fix incorrect pypy 2.7-7.3.6 sha256 hashes (#2208) +* Fix a regression in include paths when compiling ctypes in 3.6.15/3.7.12 (#2209) +* Revert "Disable coreutils on M1 Apple Silicon with arm64 (#2020)" (#2212) +* CPython 3.11.0a4 (#2217) +* CPython 3.9.10 and 3.10.2 (#2219) +* miniconda3-latest: added Linux-aarch64 (#2221) +* Add GraalPython 22.0.0 (#2226) + + +## Release 2.2.3 + +* Add new pypy versions (pypy2.7-7.3.2~7.3.5) to the version list (#2194) +* Fix Python 3.7.12 compilation on macOS arm64/M1. (#2190) +* Fix Python 3.6.15 compilation on macOS arm64/M1. (#2189) +* Add Anaconda3-2021.11 (#2193) +* CPython 3.11.0a3 (#2187) +* Fix errant "echo" in README install instructions (#2185) +* Add Miniforge and Mambaforge 4.10.3-10 (#2184) +* Add CPython 3.10.1 (#2183) +* Fix 3.6.15 build on macOS (#2182) + +## Release 2.2.2 + +* Add support for macOS Apple M1 (#2164) + +## Release 2.2.1 + +* Add CPython 3.9.9 (#2162) +* Add CPython 3.9.8 (#2152) +* Add Add micropython 1.17 (#2158) +* Add Add micropython 1.16 (#2158) +* Patch 3.10.0 configure, fixes https://bugs.python.org/issue45350 (#2155) +* Use command and type instead of which (#2144) +* Add definition of pyenv help in COMMANDS.md #2139 +* Use OpenSSL 1.0 for CPython 2.7.18 + +## Release 2.2.0 +* Adding PyPy release 7.3.7 (Python 3.7 and 3.8). (#2132) +* Append Homebrew custom prefix to search path (#1957) +* Add documentation for init command (#2125) +* Add setup instructions for the case when one installs Pyenv as part of a batch job (#2127) +* Add documentation for completions command (#2126) +* Default --with-universal-archs to universal2 on Apple Silicon (#2122) +* Update README.md (#2120) +* Add GraalPython 21.3.0 (#2117) +* Pypy ver 7.3.6 - python 3.7 and python 3.8 (#2111) +* Discover Tcl/Tk reliably and use active version (#2106) +* Fish installation instructions (#2104) +* Add CPython 3.11.0a1 (#2099) + +## Release 2.1.0 +* Fix mambaforge-pypy3 build (#2096) +* Add Python 3.10.0 (#2093) +* Add documentation for exec command (#2090) +* Add documentation for shims command (#2091) +* Add documentation for hooks command (#2089) +* Add documentation for root command (#2088) +* Add documentation for prefix command (#2087) +* Update to Pyston's v2 package of the 2.3.1 release (#2078) +* Add pyston-2.3.1 support (#2075) +* Don't update conda when installing pip (#2074) +* Improve `add_miniconda.py` (#2072) +* GitHub actions tests (#2073) +* Fix sed commands (#2071) +* macOS: fix the build of Python 2.7.18 on macOS 11.5.2 (Big Sur) + Apple Silicon (#2061) + +## Release 2.0.7 +* Update setup instructions in the Readme (#2067) +* Allow tcl-tk as argument or try with homebrew by default (#1646) +* Allow system Python in sbin (#2065) +* Prevent addition of duplicate plugin dirs to PATH (#2045) +* Disable coreutils on M1 Apple Silicon with arm64 (#2020) +* Add Python 3.10.0rc2 (#2053) +* Add space after `yes/no` prompt (#2040) +* Add CPython v3.6.15 and v3.7.12 (#2052) +* Add missing Python 2.6.x definitions and patches (#2051) +* Fix build of ossaudiodev in Linux/FreeBSD for Python 2.6 (#2049) +* Fix build of ossaudiodev in Linux/FreeBSD for Python 3.1 (#2047) + +## Release 2.0.6 +* Add CPython 3.9.7 (#2044) +* Add CPython v3.8.12 (#2043) +* Adapt conda.bash for bash associative array (#2037) + +## Release 2.0.5 + +* Move man page to location where it can be automatically found by man (#2032) +* Update checksums for CPython 3.10.0rc1 (#2025) +* Remove 3.9.3 (#2022) +* Add CPython 3.10.0rc1(#2023) + +## Release 2.0.4 + +- Added scripts for rolling releases of Miniforge (#2019) +- Update pyston-2.3 (#2017) +- Add GraalPython 21.2.0 (#2018) +- Add CPython 3.10.0b4 (#2013), (#2005) +- Add Pyston 2.3 (#2012) + +## Release 2.0.3 + +* Remove PATH warning (#2001) +* Add Python 3.6.14, 3.7.11, 3.8.11, and 3.9.6 (#1996) +* Miniforge minor update to 4.10.1-5 (#1992) +* Suggest that fish users init in interactive mode (#1991) + +## Release 2.0.2 + +* Miniforge minor update to 4.10.1-5 (#1992) +* Suggest that fish users init in interactive mode (#1991) +* Add 3.10.0b3 (#1988) +* Revert "Drop inferring version to install from `pyenv local`" (#1984) +* Use system Python3 for tests (#1979) +* Check for shims in path with pure Bash (#1978) +* Update setup instructions for debian, ubuntu etc. (#1977) + +## Release 2.0.1 + +* Drop inferring version to install from `pyenv local` (#1907) +* Create mambaforge-4.10.1-4 (#1971) +* Add 3.10.0b2 recipe (#1966) +* Fix .bashrc `echo` install syntax error (#1965) +* Add explicit Zsh instructions for MacOS (#1964) +* Install pip with pyston (#1955) +* Mention log file if an error happened before building, too (#1537) +* Add pypy3.7-7.3.5 (#1950) + +## Release 2.0.0 + +* Support for CPython 3.9.5 has been added. +* Support for CPython 3.8.10 has been added. +* Support for CPython 3.10.0b1 has been added. +* Support for GraalPython 21.1.0 has been added. +* Support for Anaconda 2021.05 has been added. +* Support for Miniforge3 4.10.1-1 has been added. +* CPython 3.10-dev target branch renamed. +* CPython 3.10-dev and 3.11-dev updated. +* Bump OpenSSL to 1.1.1x for all Pythons that support MacOS 11 +* Update generated configuration files before run ./configure +* Full shell configuration instructions placed into `pyenv init` +* Prevent build from installing MacOS apps globally +* ldflags_dirs is not needed for Python and causes failures +* Report cache filename at download +* Add micropython 1.15 +* Correct URLs for Stackless builds and add Stackless 2.7.16 + +## Breaking changes +* Split startup logic into PATH and everything else (https://github.com/pyenv/pyenv/issues/1649#issuecomment-694388530) + +## 1.2.27 + +* Add GraalPython 21.1.0 (#1882) +* Add CPython 3.10.0a7 (#1880) +* Docs(README): fix info about version-file separator (#1874) +* List versions starting with a dot (#1350) +* Feat: support (skip) commented lines in version-file (#1866) +* pypy3.7-7.3.4 (#1873) +* Create miniforge3-4.10 (#1868) +* Add CPython 3.9.4 (#1865) + +## 1.2.26 + +* Add CPython 3.9.4 (#1865) + +## 1.2.25 + +* bpo-43631: update to openssl 1.1.1k (#1861) +* Add CPython 3.9.3 and 3.8.9 (#1859) +* Add micropython 1.14 (#1858) +* Shell detect improvements (#1835) +* Test(init): remove misleading detect from parent shell case arg (#1856) +* Add GraalPython 21.0.0 (#1855) + +## 1.2.24 + +* GitHub Actions: Add $PYENV_ROOT/shims to $PATH (#1838) +* Add Python 3.10.0a6 (#1839) +* Remove the "Using script's directory as PYENV_DIR if shim is invoked with a script argument" feature (#1814) +* Update GET_PIP_URL (#1844) +* GitHub Action to build Python versions on Ubuntu (#1794) +* Make work in nounset (-u) mode (#1786) +* Update miniforge3-4.9.2 (#1834) +* Added aarch64 for Linux in anaconda_architecture() (#1833) +* Hook script to add latest suffix for install command (#1831) +* Fix error link (#1832) +* Clarify proxy variable names in readme (#1830) +* Travis CI: Add Xcode 12 on macOS 10.15.5 (#1708) +* Added --nosystem argument (#1829) +* Add CPython 3.8.8 (#1825) +* Add CPython 3.9.2 (#1826) +* Add manpage (#1790) + +## 1.2.23 + ++ python-build: Add CPython v3.7.10 (#1818) ++ python-build: Add CPython v3.6.13 (#1817) +* python-build: Add PyPy 3.7-c-jit-latest (#1812) +* python-build: Add PyPy 3.7 (#1718, #1726, #1780) +* python-build: Add miniconda3 4.9.2 (#1763) +* python-build: Add miniconda3 4.8.3 (#1763) +* python-build: Add miniconda3 4.8.2 (#1763) +* python-build: Add Miniforge3-4.9.2 (#1782) +* python-build: Fix download links for some PyPy and Stackless versions (#1692) +* python-build: Add PYENV_DEBUG option (#1806) +* python-build: Fix get-pip which dropped support for legacy Python (#1793) +* pyenv-help: Fix `sed: RE error: illegal byte sequence` (#1714) +* pyenv-versions: Fix not printing asterisk for current version in Bash 3 (#1815) +* pyenv-prefix: "system" python - support cases where python3 is in PATH but not python (#1655) +* pyenv-which: Added fallback to system executable (#1797) +* pyenv-rehash: Use associative arrays for better performance on bash >= 4 (#1749) +* pyenv-rehash: Try to sleep in 0.1 sec steps when acquiring lock (#1798) +* pyenv: Use a better PS4 as recommended by Bash Hackers Wiki (#1810) + +## 1.2.22 + ++ python-build: Add LDFLAGS for zlib on macOS >= 1100 (#1711) ++ python-build: Add the CPython 3.9.1 (#1752) ++ python-build: Change order of LDFLAGS paths (#1754) ++ python-build: Docker config for testing python-build (#1548) ++ python-build: Put prerequisite for installation before install (#1750) ++ python-build: Add GraalPython 20.3 (#1736) ++ python-build: Add CPython 3.8.7 ++ python-build: Added anaconda3-2020.11 (#1774) ++ python-build: Added arm64 architecture support in python-build for macOS (#1775) + +## 1.2.21 + +* python-build: Add CPython 3.9.0 (#1706) +* python-build: Add CPython 3.8.6 (#1698) +* python-build: Add CPython 3.7.9 (#1680) +* python-build: Add CPython 3.6.12 (#1680) +* python-build: Add CPython 3.5.10 (#1690) +* python-build: Add Jython 2.7.2 (#1672) +* python-build: Add Graalpython 20.1.0 (#1594) +* python-build: Add Graalpython 20.2.0 (#1594) +* python-build: Add Anaconda3-2020.07 (#1684) +* python-build: Add micropython-1.13 (#1704) +* python-build: Fix PyPy download links (#1682) +* python-build: Support for `PYTHON_BUILD_MIRROR_URL` when checksums do not exist (#1673) +* pyenv: Search for plugins in `PYENV_DIR` and `PYENV_ROOT` (#1697) +* pyenv-help: Fix 'sed: RE error: illegal byte sequence' (#1670) + +## 1.2.20 + +* python-build: Add CPython 3.8.5 (#1667) +* python-build: Add CPython 3.8.4 (#1658) +* python-build: Add CPython 3.7.8 +* python-build: Add CPython 3.6.11 +* pyenv-install: Make grep detection more robust (#1663) +* python-build: Fix has_tar_xz_support function on FreeBSD. (#1652) + +## 1.2.19 + +* python-build: Add CPython 3.8.3 (#1612) +* python-build: Add CPython 2.7.18 (#1593) +* python-build: Add CPython 3.10-dev (#1619) +* python-build: Add anaconda3-2020.02 (#1584) +* python-build: Add stackless 3.7.5 (#1589) + +## 1.2.18 + +* python-build: Update download URLs for old OpenSSL releases (#1578) +* python-build: Prevent `brew: command not found` messages that are not errors (#1544) + +## 1.2.17 + +* python-build: Add CPython 3.8.2 +* python-build: Add CPython 3.7.7 (#1553) +* python-build: Add Miniconda versions newer than 4.3.30 (#1361) +* python-build: Add Micropython 1.12 (#1542) +* python-build: Add Add CPython 3.9.0a4 +* pyenv: Fix sed illegal byte sequence error (#1521) + +## 1.2.16 + +* python-build: Add CPython 3.8.1 (#1497) +* python-build: Add CPython 3.7.6 (#1498) +* python-build: Add CPython 3.6.10 (#1499) +* python-build: Add CPython 3.5.9 (#1448) +* python-build: Add PyPy 7.3.0 (1502) + +## 1.2.15 + +* python-build: Add CPython 3.7.5 (#1423) +* python-build: Add CPython 2.7.17 (#1433) +* python-build: Add CPython 3.5.8 (#1441) +* python-build: Add PyPy 7.2.0 (#1418) +* python-build: Add anaconda3-2019.10 (#1427) +* pyenv-help: Show text for all pyenv commands in pyenv-help (#1421) + +## 1.2.14 + +* python-build: Add CPython 3.8.0 (#1416) +* python-build: Add Anaconda-2019.07 (#1382) +* python-build: Add Micropython 1.11 (#1395) +* python-build: Fix compatibility issues with Homebrew installed Tcl/Tk (#1397) +* pyenv-exec: Do not use `exec -a`, do not mangle PATH for system Python (#1169) + +## 1.2.13 + +* python-build: Add CPython 3.7.4 +* python-build: Add CPython 3.6.9 + +## 1.2.12 + +* python-build: Find zlib from Xcode or brew on Mojave (#1353) +* python-build: Add PyPy 7.1.1 (#1335) +* python-build: Add CPython 3.8.0b1 + +## 1.2.11 + +* python-build: Fix `posix_close` name collision in 2.4 builds (#1321) +* python-build: Add CPython 3.4.10 (#1322) +* python-build: Add Anaconda 2019.03 +* python-build: Allow overriding the preference of OpenSSL version per definition basis (#1302, #1325, #1326) +* python-build: Imported changes from rbenv/ruby-build 20190401 (#1327) +* python-build: Use GNU Readline 8.0 on macOS if brew's package isn't available (#1329) + +## 1.2.10 + +* python-build: Force y, Y, yes or YES to confirm installation (#1217) +* python-build: Add PyPy 7.0.0, 7.1.0 +* python-build: Add CPython 2.7.16, 3.5.7 and 3.7.3 +* python-build: Install `python-gdb.py` (#1190, #1289) +* python-build: Add micropython 1.10 +* python-build: Prefer Homebrew's OpenSSL 1.1 over 1.0 (#839, #1302) + +## 1.2.9 + +* python-build: Add CPython 3.7.2 and CPython 3.6.8 (#1256) +* python-build: Add anaconda[23]-5.3.1 (#1246) +* python-build: Add Anaconda 2018.12 (#1259) +* python-build: Fix ironpython-dev git repo url (#1260) +* python-build: Add `OPENSSL_NO_SSL3` patch for CPython 3.3.7 (#1263) + +## 1.2.8 + +* python-build: Add CPython 3.7.1 +* python-build: Add CPython 3.6.7 +* python-build: Add anaconda[23]-5.3.0 (#1220) + +## 1.2.7 + +* python-build: Add CPython 3.5.6 (#1199) +* python-build: Add CPython 3.4.9 + +## 1.2.6 + +* python-build: Added CPython 3.6.6 (#1178) +* python-build: Check wget version iff wget is going to be used (#1180) + +## 1.2.5 + +* python-build: Add CPython 3.7.0 (#1177) +* python-build: Add micropython 1.9.4 (#1160) +* python-build: Add anaconda[23]-5.2.0 (#1165) +* pyenv: Fix `seq(1)` is not available on OpenBSD (#1166) + +## 1.2.4 + +* python-build: Add CPython 2.7.15 +* python-build: Add PyPy 6.0.0 +* python-build: Allow overriding HTTP client type based on environment variable `PYTHON_BUILD_HTTP_CLIENT` (#1126) +* python-build: Use version-specific `get-pip.py` when installing 2.6 and 3.2 (#1131) +* pyenv: Merge rbenv master (#1151) +* pyenv: Make `pyenv-rehash` safer for multiple processes (#1092) + +## 1.2.3 + +* python-build: Add CPython 3.6.5 +* python-build: Set openssl PKG_CONFIG_PATH for python 3.7 (#1117) +* python-build: Add ActivePython versions 2.7.14, 3.5.4, 3.6.0 (#1113) +* python-build: Unset `PIP_VERSION` before invoking `get-pip.py` as a workaround for `invalid truth value` error (#1124) + +## 1.2.2 + +* python-build: Add PyPy3 5.10.1 (#1084) +* python-build: Add CPython 3.5.5 (#1090) +* python-build: Add Anaconda[23]-5.1.0 (#1100) +* python-build: Fix checksum issue for CPython 3.4.8 (#1094) +* python-build: Prevent Anaconda from installing a `clear` shim (#1084) +## 1.2.1 + +* python-build: Add CPython 3.6.4 +* python-build: Add PyPy[23] 5.10 + +## 1.2.0 + +* python-build: Import changes from ruby-build v20171031 (#1026) +* python-build: Ignore LibreSSL bundled with macOS 10.13 (#1025) +* python-build: Skip passing `--enable-unicode` to CPython 3.3+ (#912) +* python-build: Add CPython 3.3.7 (#1053) +* python-build: Add micropython 1.9.3 +* python-build: Add PyPy 5.9.0 +* python-build: Add Miniconda[23] 4.3.14, 4.3.21, 4.3.27, 4.3.30 +* python-build: Add Anaconda[23] 5.0.1 +* python-build: Update Anaconda[23] 5.0.0 to 5.0.0.1 bugfix release + +## v1.1.5 + +* python-build: Add CPython 3.6.3 +* python-build: Add CPython 3.7.0a1 +* python-build: Add Anaconda[23] 5.0.0 + +## v1.1.4 + +* pyenv: Workaround for scripts in `$PATH` which needs to be source'd (#100, #688, #953) +* python-build: Add support for PyPy3 executables like `libpypy3-c.so` (#955, #956) +* python-build: Add CPython 2.7.14, 3.4.7, 3.5.4 (#965, #971, #980) +* python-build: Add Jython 2.7.1 (#973) + +## v1.1.3 + +* python-build: Add CPython 3.6.2 (#951) + +## v1.1.2 + +* pyenv: Fix incorrect `pyenv --version` output in v1.1.1 (#947) + +## v1.1.1 + +* python-build: Update links to Portable Pypy 5.8-1 bugfix release, affects pypy2.7-5.8.0 and pypy3.5-5.8.0 definitions (#939) + +## v1.1.0 + +* python-build: Add PyPy 5.7.1 (#888) +* pyenv: Merge rbenv master (#927) +* python-build: Add PyPy 5.8.0 (#932) +* python-build: Anaconda[23] 4.4.0 +* python-build: Add micropython-dev + +## 1.0.10 + +* python-build: Add Anaconda2/Anaconda3 4.3.1 (#876) +* python-build: Make miniconda-latest point to miniconda2-latest (#881) +* python-build: Fix typo in MacOS packages for anaconda2-4.3.0/4.2.0 (#880) + +## 1.0.9 + +* pyenv: Migrate project site from https://github.com/yyuu/pyenv to https://github.com/pyenv/pyenv +* python-build: Add PyPy2 5.7.0 (#872, #868) +* python-build: Add PyPy3 5.7.0-beta (#871, #869) +* python-build: Add CPython 3.6.1 (#873) +* python-build: Add Pyston 0.6.1 (#859) +* python-build: Change default mirror site URL from https://yyuu.github.io/pythons to https://pyenv.github.io/pythons +* python-build: Upgrade OpenSSL from 1.0.2g to 1.0.2k (#850) + +## 1.0.8 + +* pyenv: Fix fish subcommand completion (#831) +* python-build: Add Anaconda2/Anaconda3 4.3.0 (#824) +* python-build: Use CPython on GitHub as the source repository of CPython development versions (#836, #837) +* python-build: Fix checksum verification issue on the platform where OpenSSL isn't available (#840) + +## 1.0.7 + +* python-build: Add CPython 3.5.3 (#811) +* python-build: Add CPython 3.4.6 (#812) +* python-build: Fix tar.gz checksum of CPython 3.6.0 (#793) +* python-build: Jython installer workaround (#800) +* python-build: Disable optimization (`-O0`) when `--debug` was specified (#808) + +## 1.0.6 + +* python-build: Add CPython 3.6.0 (#787) + +## 1.0.5 + +* python-build: Add CPython 2.7.13 (#782) +* python-build: Add CPython 3.6.0rc2 (#781) +* python-build: Add Anaconda 4.2.0 (#774) +* python-build: Add Anaconda3 4.2.0 (#765) +* python-build: Add IronPython 2.7.7 (#755) + +## 1.0.4 + +* python-build: Add PyPy 5.6.0 (#751) +* python-build: Add PyPy3 3.5 nightlies (`pypy3.5-c-jit-latest` #737) +* python-build: Add Stackless 2.7.12 (#753) +* python-build: Add Stackless 2.7.11 +* python-build: Add Stackless 2.7.10 +* python-build: Add Pyston 0.6.0 +* python-build: Add CPython 3.6.0b4 (#762) + +## 1.0.3 + +* python-build: Add CPython 3.6.0b3 (#731, #744) +* python-build: Add PyPy3.3 5.5-alpha (#734, #736) +* python-build: Stop specifying `--enable-unicode=ucs4` on OS X (#257, #726) +* python-build: Fix 3.6-dev and add 3.7-dev (#729, #730) +* python-build: Add a patch for https://bugs.python.org/issue26664 (#725) +* python-build: Add Pyston 0.5.1 (#718) +* python-build: Add Stackless 3.4.2 (#720) +* python-build: Add IronPython 2.7.6.3 (#716) +* python-build: Add Stackless 2.7.9 (#714) + +## 1.0.2 + +* python-build: Add CPython 3.6.0b1 (#699) +* python-build: Add anaconda[23] 4.1.1 (#701, #702) +* python-build: Add miniconda[23] 4.1.11 (#703, #704, #706) +* python-build: Remove `bin.orig` if exists to fix an issue with `--enable-framework` (#687, #700) + +## 1.0.1 + +* python-build: Add CPython 3.6.0a4 (#673) +* python-build: Add PyPy2 5.4, 5.4.1 (#683, #684, #695, #697) +* python-build: Add PyPy Portable 5.4, 5.4.1 (#685, #686, #696) +* python-build: Make all HTTP source URLs to HTTPS (#680) + +## 1.0.0 + +* pyenv: Import latest changes from rbenv as of Aug 15, 2016 (#669) +* pyenv: Add workaround for system python at `/bin/python` (#628) +* python-build: Import changes from ruby-build v20160602 (#668) + +## 20160726 + +* python-build: pypy-5.3.1: Remove stray text (#648) +* python-build: Add CPython 3.6.0a3 (#657) +* python-build: Add anaconda[23]-4.1.0 +* pyenv: Keep using `.tar.gz` archives if tar doesn't support `-J` (especially on BSD) (#654, #663) +* pyenv: Fixed conflict between pyenv-virtualenv's `rehash` hooks of `envs.bash` +* pyenv: Write help message of `sh-*` commands to stdout properly (#650, #651) + +## 20160629 + +* python-build: Added CPython 2.7.12 (#645) +* python-build: Added PyPy 3.5.1 (#646) +* python-build: Added PyPy Portable 5.3.1 + +## 20160628 + +* python-build: Added PyPy3.3 5.2-alpha1 (#631) +* python-build: Added CPython 2.7.12rc1 +* python-build: Added CPython 3.6.0a2 (#630) +* python-build: Added CPython 3.5.2 (#643) +* python-build: Added CPython 3.4.5 (#643) +* python-build: Added PyPy2 5.3 (#626) +* pyenv: Skip creating shims for system executables bundled with Anaconda rather than ignoring them in `pyenv-which` (#594, #595, #599) +* python-build: Configured GCC as a requirement to build CPython prior to 2.4.4 (#613) +* python-build: Use `aria2c` - ultra fast download utility if available (#534) + +## 20160509 + +* python-build: Fixed wrong SHA256 of `pypy-5.1-linux_x86_64-portable.tar.bz2` (#586, #587) +* python-build: Added miniconda[23]-4.0.5 +* python-build: Added PyPy (Portable) 5.1.1 (#591, #592, #593) + +## 20160422 + +* python-build: Added PyPy 5.1 (#579) +* python-build: Added PyPy 5.1 Portable +* python-build: Added PyPy 5.0.1 (#558) +* python-build: Added PyPy 5.0.1 Portable +* python-build: Added PyPy 5.0 Portable +* python-build: Added anaconda[23]-4.0.0 (#572) +* python-build: Added Jython 2.7.1b3 (#557) + +## 20160310 + +* python-build: Add PyPy-5.0.0 (#555) +* pyenv: Import recent changes from rbenv 1.0 (#549) + +## 20160303 + +* python-build: Add anaconda[23]-2.5.0 (#543) +* python-build: Import recent changes from ruby-build 20160130 +* python-build: Compile with `--enable-unicode=ucs4` by default for CPython (#257, #542) +* python-build: Switch download URL of Continuum products from HTTP to HTTPS (#543) +* python-build: Added pypy-dev special case in pyenv-install to use py27 (#547) +* python-build: Upgrade OpenSSL to 1.0.2g (#550) + +## 20160202 + +* pyenv: Run rehash automatically after `conda install` +* python-build: Add CPython 3.4.4 (#511) +* python-build: Add anaconda[23]-2.4.1, miniconda[23]-3.19.0 +* python-build: Fix broken build definitions of CPython/Stackless 3.2.x (#531) + +### 20151222 + +* pyenv: Merge recent changes from rbenv as of 2015-12-14 (#504) +* python-build: Add a `OPENSSL_NO_SSL3` patch for CPython 2.6, 2.7, 3.0, 3.1, 3.2 and 3.3 series (#507, #511) +* python-build: Stopped using mirror at pyenv.github.io for CPython since http://www.python.org is on fast.ly + +### 20151210 + +* pyenv: Add a default hook for Anaconda to look for original `$PATH` (#491) +* pyenv: Skip virtualenv aliases on `pyenv versions --skip-aliases` (pyenv/pyenv-virtualenv#126) +* python-build: Add CPython 2.7.11, 3.5.1 (#494, #498) +* python-build: Update OpenSSL to 1.0.1q (#496) +* python-build: Adding SSL patch to build 2.7.3 on Debian (#495) + +### 20151124 + +* pyenv: Import recent changes from rbenv 5fb9c84e14c8123b2591d22e248f045c7f8d8a2c +* pyenv: List anaconda-style virtual environments as a version in pyenv (#471) +* python-build: Import recent changes from ruby-build v20151028 +* python-build: Add PyPy 4.0.1 (#489) +* python-build: Add `miniconda*-3.18.3` (#477) +* python-build: Add CPython 2.7.11 RC1 + +### 20151105 + +* python-build: Add anaconda2-2.4.0 and anacondaa3-2.4.0 +* python-build: Add Portable PyPy 4.0 (#472) + +### 20151103 + +* python-build: Add PyPy 4.0.0 (#463) +* python-build: Add Jython 2.7.1b2 +* python-build: Add warning about setuptools issues on CPython 3.0.1 on OS X (#456) + +### 20151006 + +* pyenv: Different behaviour when invoking .py script through symlink (#379, #404) +* pyenv: Enabled Gitter on the project (#436, #444) +* python-build: Add Jython 2.7.1b1 +* python-build: Install OpenSSL on OS X if no proper version is available (#429) + +### 20150913 + +* python-build: Add CPython 3.5.0 +* python-build: Remove CPython 3.5.0 release candidates +* python-build: Fixed anaconda3 repo's paths (#439) +* python-build: Add miniconda-3.16.0 and miniconda3-3.16.0 (#435) + +### 20150901 + +* python-build: Add CPython 3.5.0 release candidates; 3.5.0rc1 and 3.5.0rc2 +* python-build: Disabled `_FORTITY_SOURCE` to fix CPython >= 2.4, <= 2.4.3 builds (#422) +* python-build: Removed CPython 3.5.0 betas +* python-build: Add miniconda-3.10.1 and miniconda3-3.10.1 (#414) +* python-build: Add PyPy 2.6.1 (#433) +* python-build: Add PyPy-STM 2.3 and 2.5.1 (#428) +* python-build: Ignore user's site-packages on ensurepip/get-pip (#411) +* pyenv: Import recent changes from ruby-build v20150818 + +#### 20150719 + +* python-build: Add CPython `3.6-dev` (#413) +* python-build: Add Anaconda/Anaconda3 2.3.0 +* python-build: Fix download URL of portable PyPy 2.6 (fixes #389) +* python-build: Use custom `MACOSX_DEPLOYMENT_TARGET` if defined (#312) +* python-build: Use original CPython repository instead of mirror at bitbucket.org as the source of `*-dev` versions (#409) +* python-build: Pin pip version to 1.5.6 for python 3.1.5 (#351) + +#### 20150601 + +* python-build: Add PyPy 2.6.0 +* python-build: Add PyPy 2.5.1 portable +* python-build: Add CPython 3.5.0 beta releases; 3.5.0b1 and 3.5.0b2 +* python-build: Removed CPython 3.5.0 alpha releases +* python-build: Fix inverted condition for `--altinstall` of ensurepip (#255) +* python-build: Skip installing `setuptools` by `ez_setup.py` explicitly (fixes #381) +* python-build: Import changes from ruby-build v20150519 + +#### 20150524 + +* pyenv: Improve `pyenv version`, if there is one missing (#290) +* pyenv: Improve pip-rehash to handle versions in command, like `pip2` and `pip3.4` (#368) +* python-build: Add CPython release; 2.7.10 (#380) +* python-build: Add Miniconda/Miniconda3 3.9.1 and Anaconda/Anaconda3 2.2.0 (#375, #376) + +#### 20150504 + +* python-build: Add Jython 2.7.0 +* python-build: Add CPython alpha release; 3.5.0a4 +* python-build: Add CPython 3.1, 3.1.1, and 3.1.2 +* python-build: Fix pip version to 1.5.6 for CPython 3.1.x (#351) + +#### 20150326 + +* python-build: Add Portable PyPy binaries from https://github.com/squeaky-pl/portable-pypy (#329) +* python-build: Add CPython alpha release; 3.5.0a2 (#328) +* python-build: Add pypy-2.5.1 (fixes #338) +* pyenv: Import recent changes from rbenv 4d72eefffc548081f6eee2e54d3b9116b9f9ee8e + +#### 20150226 + +* python-build: Add CPython release; 3.4.3 (#323) +* python-build: Add CPython alpha release; 3.5.0a1 (#324) +* python-build: Add Miniconda/Miniconda3 3.8.3 (#318) + +#### 20150204 + +* python-build: Add PyPy 2.5.0 release (#311) +* python-build: Add note about `--enable-shared` and RPATH (#217) +* python-build: Fix regression of `PYTHON_MAKE_INSTALL_TARGET` and add test (#255) +* python-build: Symlink `pythonX.Y-config` to `python-config` if `python-config` is missing (#296) +* python-build: Latest `pip` can't be installed into `3.0.1` (#309) + +#### 20150124 + +* python-build: Import recent changes from ruby-build v20150112 +* python-build: Prevent adding `/Library/Python/X.X/site-packages` to `sys.path` when `--enable-framework` is enabled on OS X. Thanks @s1341 (#292) +* python-build: Add new IronPython release; 2.7.5 + +#### 20141211 + +* pyenv: Add built-in `pip-rehash` feature. You don't need to install [pyenv-pip-rehash](https://github.com/pyenv/pyenv-pip-rehash) anymore. +* python-build: Add new CPython release; 2.7.9 (#284) +* python-build: Add new PyPy releases; pypy3-2.4.0, pypy3-2.4.0-src (#277) +* python-build: Add build definitions of PyPy nightly build + +#### 20141127 + +* python-build: Add new CPython release candidates; 2.7.9rc1 (#276) + +#### 20141118 + +* python-build: Fix broken `setup_builtin_patches` (#270) +* python-build: Add a patch to allow building 2.6.9 on OS X 10.9 with `--enable-framework` (#269, #271) + +#### 20141106 + +* pyenv: Optimize pyenv-which. Thanks to @blueyed (#129) +* python-build: Add Miniconda/Miniconda3 3.7.0 and Anaconda/Anaconda3 2.1.0 (#260) +* python-build: Use HTTPS for mirror download URLs (#262) +* python-build: Set `rpath` for `--shared` build of PyPy (#244) +* python-build: Support `make altinstall` when building CPython/Stackless (#255) +* python-build: Import recent changes from ruby-build v20141028 (#265) + +#### 20141012 + +* python-build: Add new CPython releases; 3.2.6, 3.3.6 (#253) + +#### 20141011 + +* python-build: Fix build error of Stackless 3.3.5 on OS X (#250) +* python-build: Add new Stackless releases; stackless-2.7.7, stackless-2.7.8, stackless-3.4.1 (#252) + +#### 20141008 + +* python-build: Add new CPython release; 3.4.2 (#251) +* python-build: Add new CPython release candidates; 3.2.6rc1, 3.3.6rc1 (#248) + +#### 20140924 + +* pyenv: Fix an unintended behavior when user does not have write permission on `$PYENV_ROOT` (#230) +* pyenv: Fix a zsh completion issue (#232) +* python-build: Add new PyPy release; pypy-2.4.0, pypy-2.4.0-src (#241) + +#### 20140825 + +* pyenv: Fix zsh completion with multiple words (#215) +* python-build: Display the package name of `hg` as `mercurial` in message (#212) +* python-build: Unset `PIP_REQUIRE_VENV` during build (#216) +* python-build: Set `MACOSX_DEPLOYMENT_TARGET` from the product version of OS X (#219, #220) +* python-build: Add new Jython release; jython2.7-beta3 (#223) + +#### 20140705 + +* python-build: Add new CPython release; 2.7.8 (#201) +* python-build: Support `SETUPTOOLS_VERSION` and `PIP_VERSION` to allow installing specific version of setuptools/pip (#202) + +#### 20140628 + +* python-build: Add new Anaconda releases; anaconda-2.0.1, anaconda3-2.0.1 (#195) +* python-build: Add new PyPy3 release; pypy3-2.3.1 (#198) +* python-build: Add ancient CPython releases; 2.1.3, 2.2.3, 2.3.7 (#199) +* python-build: Use `ez_setup.py` and `get-pip.py` instead of installing them from tarballs (#194) +* python-build: Add support for command-line options to `ez_setup.py` and `get-pip.py` (#200) + +#### 20140615 + +* python-build: Update default setuptools version (4.0.1 -> 5.0) (#190) + +#### 20140614 + +* pyenv: Change versioning schema (`v0.4.0-YYYYMMDD` -> `vYYYYMMDD`) +* python-build: Add new PyPy release; pypy-2.3.1, pypy-2.3.1-src +* python-build: Create symlinks for executables with version suffix (#182) +* python-build: Use SHA2 as default digest algorithm to verify downloaded archives +* python-build: Update default setuptools version (4.0 -> 4.0.1) (#183) +* python-build: Import recent changes from ruby-build v20140524 (#184) + +#### 0.4.0-20140602 + +* python-build: Add new Anaconda/Anaconda3 releases; anaconda-2.0.0, anaconda3-2.0.0 (#179) +* python-build: Add new CPython release; 2.7.7 (#180) +* python-build: Update default setuptools version (3.6 -> 4.0) (#181) +* python-build: Respect environment variables of `CPPFLAGS` and `LDFLAGS` (#168) +* python-build: Support for xz-compressed Python tarballs (#177) + +#### 0.4.0-20140520 + +* python-build: Add new CPython release; 3.4.1 (#170, #171) +* python-build: Update default pip version (1.5.5 -> 1.5.6) (#169) + +#### 0.4.0-20140516 + +* pyenv: Prefer gawk over awk if both are available. +* python-build: Add new PyPy release; pypy-2.3, pypy-2.3-src (#162) +* python-build: Add new Anaconda release; anaconda-1.9.2 (#155) +* python-build: Add new Miniconda releases; miniconda-3.3.0, minoconda-3.4.2, miniconda3-3.3.0, miniconda3-3.4.2 +* python-build: Add new Stackless releases; stackless-2.7.3, stackless-2.7.4, stackless-2.7.5, stackless-2.7.6, stackless-3.2.5, stackless-3.3.5 (#164) +* python-build: Add IronPython versions (setuptools and pip will work); ironpython-2.7.4, ironpython-dev +* python-build: Add new Jython beta release; jython-2.7-beta2 +* python-build: Update default setuptools version (3.4.1 -> 3.6) +* python-build: Update default pip version (1.5.4 -> 1.5.5) +* python-build: Update GNU Readline (6.2 -> 6.3) +* python-build: Import recent changes from ruby-build v20140420 + +#### 0.4.0-20140404 + +* pyenv: Reads only the first word from version file. This is as same behavior as rbenv. +* python-build: Fix build of Tkinter with Tcl/Tk 8.6 (#131) +* python-build: Fix build problem with Readline 6.3 (#126, #131, #149, #152) +* python-build: Do not exit with errors even if some of modules are absent (#131) +* python-build: MacOSX was misspelled as MaxOSX in `anaconda_architecture` (#136) +* python-build: Use default `cc` as the C Compiler to build CPython (#148, #150) +* python-build: Display value from `pypy_architecture` and `anaconda_architecture` on errors (pyenv/pyenv-virtualenv#18) +* python-build: Remove old development version; 2.6-dev +* python-build: Update default setuptools version (3.3 -> 3.4.1) + +#### 0.4.0-20140317 + +* python-build: Add new CPython releases; 3.4.0 (#133) +* python-build: Add new Anaconda releases; anaconda-1.9.0, anaconda-1.9.1 +* python-build: Add new Miniconda releases; miniconda-3.0.4, miniconda-3.0.5, miniconda3-3.0.4, miniconda3-3.0.5 +* python-build: Update default setuptools version (3.1 -> 3.3) + +#### 0.4.0-20140311 + +* python-build: Add new CPython releases; 3.3.5 (#127) +* python-build: Add new CPython release candidates; 3.4.0rc1, 3.4.0rc2, 3.4.0rc3 +* python-build: Update default setuptools version (2.2 -> 3.1) +* python-build: Update default pip version (1.5.2 -> 1.5.4) +* python-build: Import recent changes from ruby-build v20140225 + +#### 0.4.0-20140211 + +* python-build: Add new CPython release candidates; 3.3.4, 3.4.0b3 +* python-build: Add [Anaconda](https://store.continuum.io/cshop/anaconda/) and [Miniconda](http://repo.continuum.io/miniconda/) binary distributions +* python-build: Display error if the wget does not support Server Name Indication (SNI) to avoid SSL verification error when downloading from https://pypi.python.org. (#60) +* python-build: Update default setuptools version (2.1 -> 2.2) +* python-build: Update default pip version (1.5.1 -> 1.5.2) +* python-build: Import recent changes from ruby-build v20140204 + +#### 0.4.0-20140123 + +* pyenv: Always append the directory at the top of the `$PATH` to return proper value for `sys.executable` (#98) +* pyenv: Unset `GREP_OPTIONS` to avoid issues of conflicting options (#101) +* python-build: Install `pip` with using `ensurepip` if available +* python-build: Add support for framework installation (`--enable-framework`) of CPython (#55, #99) +* python-build: Import recent changes from ruby-build v20140110.1 +* python-build: Import `bats` tests from ruby-build v20140110.1 + +#### 0.4.0-20140110.1 + +* python-build: Fix build error of CPython 2.x on the platform where the `gcc` is llvm-gcc. + +#### 0.4.0-20140110 + +* pyenv: Reliably detect parent shell in `pyenv init` (#93) +* pyenv: Import recent changes from rbenv 0.4.0 +* pyenv: Import `bats` tests from rbenv 0.4.0 +* python-build: Add new CPython releases candidates; 3.4.0b2 +* python-build: Add ruby-build style patching feature (#91) +* python-build: Set `RPATH` if `--enable-shared` was given (#65, #66, 82) +* python-build: Update default setuptools version (2.0 -> 2.1) +* python-build: Update default pip version (1.4.1 -> 1.5) +* python-build: Activate friendly CPython during build if the one is not activated (8fa6b4a1847851919ad7857c6c42ed809a4d277b) +* python-build: Fix broken install.sh +* python-build: Import recent changes from ruby-build v20131225.1 +* version-ext-compat: Removed from default plugin. Please use [pyenv-version-ext](https://github.com/pyenv/pyenv-version-ext) instead. + +#### 0.4.0-20131217 + +* python-build: Fix broken build of CPython 3.3+ on Darwin +* python-build: Not build GNU Readline uselessly on Darwin + +#### 0.4.0-20131216 + +* python-build: Add new CPython releases; 3.3.3 (#80) +* python-build: Add new CPython releases candidates; 3.4.0b1 +* python-build: Add new PyPy releases; pypy-2.2.1, pypy-2.2.1-src +* python-build: Update default setuptools version (1.3.2 -> 2.0) +* python-build: Imported recent changes from ruby-build v20131211 +* pyenv: Fix pyenv-prefix to trim "/bin" in `pyenv prefix system` (#88) + +#### 0.4.0-20131116 + +* python-build: Add new CPython releases; 2.6.9, 2.7.6 (#76) +* python-build: Add new CPython release candidates; 3.3.3-rc1, 3.3.3-rc2 +* python-build: Add new PyPy releases; pypy-2.2, pypy-2.2-src (#77) +* python-build: Update default setuptools version (1.1.6 -> 1.3.2) +* python-build: Imported recent changes from ruby-build v20131030 + +#### 0.4.0-20131023 + +* pyenv: Improved [fish shell](http://fishshell.com/) support +* python-build: Add new PyPy releases; pypy-2.1, pypy-2.1-src, pypy3-2.1-beta1, pypy3-2.1-beta1-src +* python-build: Add ancient versions; 2.4, 2.4.1, 2.4.3, 2.4.4 and 2.4.5 +* python-build: Add alpha releases; 3.4.0a2, 3.4.0a3, 3.4.0a4 +* python-build: Update default pip version (1.4 -> 1.4.1) +* python-build: Update default setuptools version (0.9.7 -> 1.1.6) + +#### 0.4.0-20130726 + +* pyenv: Fix minor issue of variable scope in `pyenv versions` +* python-build: Update base version to ruby-build v20130628 +* python-build: Use brew managed OpenSSL and GNU Readline if they are available +* python-build: Fix build of CPython 3.3+ on OS X (#29) +* python-build: Fix build of native modules of CPython 2.5 on OS X (#33) +* python-build: Fix build of CPython 2.6+ on openSUSE (#36) +* python-build: Add ancient versions; 2.4.2 and 2.4.6. The build might be broken. (#37) +* python-build: Update default pip version (1.3.1 -> 1.4) +* python-build: Update default setuptools version (0.7.2 -> 0.9.7) + +#### 0.4.0-20130613 + +* pyenv: Changed versioning schema. There are two parts; the former is the base rbenv version, and the latter is the date of release. +* python-build: Add `--debug` option to build CPython with debug symbols. (#11) +* python-build: Add new CPython versions: 2.7.4, 2.7.5, 3.2.4, 3.2.5, 3.3.1, 3.3.2 (#12, #17) +* python-build: Add `svnversion` patch for old CPython versions (#14) +* python-build: Enable mirror by default for faster download (#20) +* python-build: Add `OPENSSL_NO_SSL2` patch for old CPython versions (#22) +* python-build: Install GNU Readline on Darwin if the system one is broken (#23) +* python-build: Bundle patches in `${PYTHON_BUILD_ROOT}/share/python-build/patches` and improve patching mechanism (`apply_patches`). +* python-build: Verify native extensions after building. (`build_package_verify_py*`) +* python-build: Add `install_hg` to install package from Mercurial repository +* python-build: Support building Jython and PyPy. +* python-build: Add new CPython development versions: 2.6-dev, 2.7-dev, 3.1-dev, 3.2-dev, 3.3-dev, 3.4-dev +* python-build: Add new Jython development versions: jython-2.5.4-rc1, jython-2.5-dev, jython-2.7-beta1, jython-dev +* python-build: Add new PyPy versions: pypy-1.5{,-src}, pypy-1.6, pypy-1.7, pypy-2.0{,-src}, pypy-2.0.1{,-src}, pypy-2.0.2{,-src} +* python-build: Add new PyPy development versions: pypy-1.7-dev, pypy-1.8-dev, pypy-1.9-dev, pypy-2.0-dev, pypy-dev, pypy-py3k-dev +* python-build: Add new Stackless development versions: stackless-2.7-dev, stackless-3.2-dev, stackless-3.3-dev, stackless-dev +* python-build: Update default pip version (1.2.1 -> 1.3.1) +* python-build: Update default setuptools version (0.6.34 (distribute) -> 0.7.2 ([new setuptools](https://bitbucket.org/pypa/setuptools))) + +#### 0.2.0 (February 18, 2013) + +* Import changes from rbenv 0.4.0. + +#### 0.1.2 (October 23, 2012) + +* Add push/pop for version stack management. +* Support multiple versions via environment variable. +* Now GCC is not a requirement to build CPython and Stackless. + +#### 0.1.1 (September 3, 2012) + +* Support multiple versions of Python at a time. + +#### 0.1.0 (August 31, 2012) + +* Initial public release. diff --git a/COMMANDS.md b/COMMANDS.md new file mode 100644 index 0000000..320baae --- /dev/null +++ b/COMMANDS.md @@ -0,0 +1,407 @@ +# Command Reference + +Like `git`, the `pyenv` command delegates to subcommands based on its +first argument. + +The most common subcommands are: + +* [`pyenv help`](#pyenv-help) +* [`pyenv commands`](#pyenv-commands) +* [`pyenv local`](#pyenv-local) +* [`pyenv global`](#pyenv-global) +* [`pyenv shell`](#pyenv-shell) +* [`pyenv install`](#pyenv-install) +* [`pyenv uninstall`](#pyenv-uninstall) +* [`pyenv rehash`](#pyenv-rehash) +* [`pyenv version`](#pyenv-version) +* [`pyenv versions`](#pyenv-versions) +* [`pyenv which`](#pyenv-which) +* [`pyenv whence`](#pyenv-whence) +* [`pyenv exec`](#pyenv-exec) +* [`pyenv root`](#pyenv-root) +* [`pyenv prefix`](#pyenv-prefix) +* [`pyenv latest`](#pyenv-latest) +* [`pyenv hooks`](#pyenv-hooks) +* [`pyenv shims`](#pyenv-shims) +* [`pyenv init`](#pyenv-init) +* [`pyenv completions`](#pyenv-completions) + +## `pyenv help` + +List all available pyenv commands along with a brief description of what they do. Run `pyenv help ` for information on a specific command. For full documentation, see: https://github.com/pyenv/pyenv#readme + + +## `pyenv commands` + +Lists all available pyenv commands. + + +## `pyenv local` + +Sets a local application-specific Python version by writing the version +name to a `.python-version` file in the current directory. This version +overrides the [global version](#pyenv-global), and can be overridden +itself with the [`pyenv shell`](#pyenv-shell) command. + + $ pyenv local 2.7.6 + +When run without a version number, `pyenv local` reports the currently +configured local version. You can also unset the local version: + + $ pyenv local --unset + +Previous versions of pyenv stored local version specifications in a +file named `.pyenv-version`. For backwards compatibility, pyenv will +read a local version specified in an `.pyenv-version` file, but a +`.python-version` file in the same directory will take precedence. + + +### `pyenv local` (advanced) + +You can specify multiple versions as local Python at once. + +Let's say if you have two versions of 2.7.6 and 3.3.3. If you prefer 2.7.6 over 3.3.3, + + $ pyenv local 2.7.6 3.3.3 + $ pyenv versions + system + * 2.7.6 (set by /Users/yyuu/path/to/project/.python-version) + * 3.3.3 (set by /Users/yyuu/path/to/project/.python-version) + $ python --version + Python 2.7.6 + $ python2.7 --version + Python 2.7.6 + $ python3.3 --version + Python 3.3.3 + +or, if you prefer 3.3.3 over 2.7.6, + + $ pyenv local 3.3.3 2.7.6 + $ pyenv versions + system + * 2.7.6 (set by /Users/yyuu/path/to/project/.python-version) + * 3.3.3 (set by /Users/yyuu/path/to/project/.python-version) + venv27 + $ python --version + Python 3.3.3 + $ python2.7 --version + Python 2.7.6 + $ python3.3 --version + Python 3.3.3 + + +You can use the `-f/--force` flag to force setting versions even if some aren't installed. +This is mainly useful in special cases like provisioning scripts. + + +## `pyenv global` + +Sets the global version of Python to be used in all shells by writing +the version name to the `$PYENV_ROOT/version` file. This version can be +overridden with [`pyenv local`](#pyenv-local) or [`pyenv shell`](#pyenv-shell). + + $ pyenv global 2.7.6 + +The special version name `system` tells pyenv to use the system Python +(detected by searching your `$PATH`). + +When run without a version number, `pyenv global` reports the +currently configured global version. + + +### `pyenv global` (advanced) + +You can specify multiple versions as global Python at once. + +Let's say if you have two versions of 2.7.6 and 3.3.3. If you prefer 2.7.6 over 3.3.3, + + $ pyenv global 2.7.6 3.3.3 + $ pyenv versions + system + * 2.7.6 (set by /Users/yyuu/.pyenv/version) + * 3.3.3 (set by /Users/yyuu/.pyenv/version) + $ python --version + Python 2.7.6 + $ python2.7 --version + Python 2.7.6 + $ python3.3 --version + Python 3.3.3 + +or, if you prefer 3.3.3 over 2.7.6, + + $ pyenv global 3.3.3 2.7.6 + $ pyenv versions + system + * 2.7.6 (set by /Users/yyuu/.pyenv/version) + * 3.3.3 (set by /Users/yyuu/.pyenv/version) + venv27 + $ python --version + Python 3.3.3 + $ python2.7 --version + Python 2.7.6 + $ python3.3 --version + Python 3.3.3 + + +## `pyenv shell` + +Sets a shell-specific Python version by setting the `PYENV_VERSION` +environment variable in your shell. This version overrides +application-specific versions and the global version. + + $ pyenv shell pypy-2.2.1 + +When run without a version number, `pyenv shell` reports the current +value of `PYENV_VERSION`. You can also unset the shell version: + + $ pyenv shell --unset + +Note that you'll need pyenv's shell integration enabled (step 3 of +the installation instructions) in order to use this command. If you +prefer not to use shell integration, you may simply set the +`PYENV_VERSION` variable yourself: + + $ export PYENV_VERSION=pypy-2.2.1 + + +### `pyenv shell` (advanced) + +You can specify multiple versions via `PYENV_VERSION` at once. + +Let's say if you have two versions of 2.7.6 and 3.3.3. If you prefer 2.7.6 over 3.3.3, + + $ pyenv shell 2.7.6 3.3.3 + $ pyenv versions + system + * 2.7.6 (set by PYENV_VERSION environment variable) + * 3.3.3 (set by PYENV_VERSION environment variable) + $ python --version + Python 2.7.6 + $ python2.7 --version + Python 2.7.6 + $ python3.3 --version + Python 3.3.3 + +or, if you prefer 3.3.3 over 2.7.6, + + $ pyenv shell 3.3.3 2.7.6 + $ pyenv versions + system + * 2.7.6 (set by PYENV_VERSION environment variable) + * 3.3.3 (set by PYENV_VERSION environment variable) + venv27 + $ python --version + Python 3.3.3 + $ python2.7 --version + Python 2.7.6 + $ python3.3 --version + Python 3.3.3 + + +## `pyenv install` + +Install a Python version (using [`python-build`](https://github.com/pyenv/pyenv/tree/master/plugins/python-build)). + + Usage: pyenv install [-f] [-kvp] + pyenv install [-f] [-kvp] + pyenv install -l|--list + + -l/--list List all available versions + -f/--force Install even if the version appears to be installed already + -s/--skip-existing Skip the installation if the version appears to be installed already + + python-build options: + + -k/--keep Keep source tree in $PYENV_BUILD_ROOT after installation + (defaults to $PYENV_ROOT/sources) + -v/--verbose Verbose mode: print compilation status to stdout + -p/--patch Apply a patch from stdin before building + -g/--debug Build a debug version + +To list the all available versions of Python, including Anaconda, Jython, pypy, and stackless, use: + + $ pyenv install --list + +Then install the desired versions: + + $ pyenv install 2.7.6 + $ pyenv install 2.6.8 + $ pyenv versions + system + 2.6.8 + * 2.7.6 (set by /home/yyuu/.pyenv/version) + +You can also install the latest version of Python in a specific version line by supplying a prefix instead of a complete name: + + $ pyenv install 3.10 + $ pyenv install 3 + +See the [`pyenv latest` documentation](#pyenv-latest) for details on prefix resolution. + +An older option is to use the `:latest` syntax. For example, to install the latest patch version for Python 3.8 you could do: + + pyenv install 3.8:latest + + +## `pyenv uninstall` + +Uninstall Python versions. + + Usage: pyenv uninstall [-f|--force] ... + + -f Attempt to remove the specified version without prompting + for confirmation. If the version does not exist, do not + display an error message. + + +## `pyenv rehash` + +Installs shims for all Python binaries known to pyenv (i.e., +`~/.pyenv/versions/*/bin/*`). Run this command after you install a new +version of Python, or install a package that provides binaries. + + $ pyenv rehash + + +## `pyenv version` + +Displays the currently active Python version, along with information on +how it was set. + + Usage: pyenv version [--bare] + + --bare show just the version name. An alias to `pyenv version-name' + + + $ pyenv version + 2.7.6 (set by /home/yyuu/.pyenv/version) + $ pyenv version --bare + 2.7.6 + + +## `pyenv versions` + +Lists all Python versions known to pyenv, and shows an asterisk next to +the currently active version. + + $ pyenv versions + 2.5.6 + 2.6.8 + * 2.7.6 (set by /home/yyuu/.pyenv/version) + 3.3.3 + jython-2.5.3 + pypy-2.2.1 + + +## `pyenv which` + +Displays the full path to the executable that pyenv will invoke when +you run the given command. + + $ pyenv which python3.3 + /home/yyuu/.pyenv/versions/3.3.3/bin/python3.3 + +Use --nosystem argument in case when you don't need to search command in the +system environment. + +## `pyenv whence` + +Lists all Python versions with the given command installed. + + $ pyenv whence 2to3 + 2.6.8 + 2.7.6 + 3.3.3 + +## `pyenv exec` + + Usage: pyenv exec [arg1 arg2...] + +Runs an executable by first preparing PATH so that the selected Python +version's `bin` directory is at the front. + +For example, if the currently selected Python version is 3.9.7: + + pyenv exec pip install -r requirements.txt + +is equivalent to: + + PATH="$PYENV_ROOT/versions/3.9.7/bin:$PATH" pip install -r requirements.txt + +## `pyenv root` + +Displays the root directory where versions and shims are kept. + + $ pyenv root + /home/user/.pyenv + +## `pyenv prefix` + +Displays the directories where the given Python versions are installed, +separated by colons. If no version is given, `pyenv prefix` displays the +locations of the currently selected versions. + + $ pyenv prefix 3.9.7 + /home/user/.pyenv/versions/3.9.7 + +## `pyenv latest` + +Displays the latest installed or known version with the given prefix + + Usage: pyenv latest [-k|--known] + + -k/--known Select from all known versions instead of installed + +Only full prefixes are searched: in the actual name, the given prefix must be followed by a dot or a dash. + +Prereleases and versions with specific suffixes (e.g. `-src`) are ignored. + +## `pyenv hooks` + +Lists installed hook scripts for a given pyenv command. + + Usage: pyenv hooks + +## `pyenv shims` + +List existing pyenv shims. + + Usage: pyenv shims [--short] + + $ pyenv shims + /home/user/.pyenv/shims/2to3 + /home/user/.pyenv/shims/2to3-3.9 + /home/user/.pyenv/shims/idle + /home/user/.pyenv/shims/idle3 + /home/user/.pyenv/shims/idle3.9 + /home/user/.pyenv/shims/pip + /home/user/.pyenv/shims/pip3 + /home/user/.pyenv/shims/pip3.9 + /home/user/.pyenv/shims/pydoc + /home/user/.pyenv/shims/pydoc3 + /home/user/.pyenv/shims/pydoc3.9 + /home/user/.pyenv/shims/python + /home/user/.pyenv/shims/python3 + /home/user/.pyenv/shims/python3.9 + /home/user/.pyenv/shims/python3.9-config + /home/user/.pyenv/shims/python3.9-gdb.py + /home/user/.pyenv/shims/python3-config + /home/user/.pyenv/shims/python-config + +## `pyenv init` + +Configure the shell environment for pyenv + + Usage: eval "$(pyenv init [-|--path] [--no-push-path] [--no-rehash] [])" + + - Initialize shims directory, print PYENV_SHELL variable, completions path + and shell function + --path Print shims path + --no-push-path Do not push shim to the start of PATH if they're already there + --no-rehash Add no rehash command to output + +## `pyenv completions` + +Lists available completions for a given pyenv command. + + Usage: pyenv completions [arg1 arg2...] diff --git a/CONDUCT.md b/CONDUCT.md new file mode 100644 index 0000000..59437f0 --- /dev/null +++ b/CONDUCT.md @@ -0,0 +1,80 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting one of the project maintainers listed below. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Project Maintainers + +* Yamashita, Yuu <> +* Daniel Hahler <> +* Josh Friend <> + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..43561e3 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,103 @@ +General guidance +================ + +* The usual principles of respecting existing conventions and making sure that your changes + are in line with the overall product design apply when contributing code to Pyenv. + +* We are limited to Bash 3.2 features + + That's because that's the version shipped with MacOS. + (They didn't upgrade past it and switched to Zsh because later versions + are covered by GPLv3 which has additional restrictions unacceptable for Apple.) + + You can still add performance optimizations etc that take advantage of newer Bash features + as long as there is a fallback execution route for Bash 3. + +Formatting PRs +============== + +We strive to keep commit history one-concern-per-commit to keep it meaningful and easy to follow. +If a pull request (PR) addresses a single concern (the typical case), we usually squash commits +from it together when merging so its commit history doesn't matter. +If however a PR addresses multiple separate concerns, each of them should be presented as a separate commit. +Adding multiple new Python releases of the same flavor is okay with either a single or multiple commits. + + +Authoring installation scripts +============================== + +Adding new Python release support +--------------------------------- + +The easiest way to add support for a new Python release is to copy the script from the previous one +and adjust it as necessary. In many cases, just changing version numbers, URLs and hashes is enough. +Do pay attention to other "magic numbers" that may be present in a script -- +e.g. the set of architectures and OS versions supported by a release -- since those change from time to time, too. + +Make sure to also copy any patches for the previous release that still apply to the new one. +Typically, a patch no longer applies if it addresses a problem that's already fixed in the new release. + +For prereleases, we only create an entry for the latest prerelease in a specific version line. +When submitting a newer prerelease, replace the older one. + + +Adding version-specific fixes/patches +------------------------------------- + +We accept fixes to issues in specific Python releases that prevent users from using them with Pyenv. + +In the default configuration for a Python release, we strive to provide as close to vanilla experience as practical, +to maintain [the principle of the least surprise](https://en.wikipedia.org/wiki/Principle_of_least_astonishment). +As such, any such fixes: + +* Must not break or degrade (e.g. disable features) the build in any of the environments that the release officially supports +* Must not introduce incompatibilities with the vanilla release (including binary incompatibilities) +* Should not patch things unnecessarily, to minimize the risk of the aforementioned undesirable side effects. + * E.g. if the fix is for a specific environment, its logic ought to only fire in this specific environment and not touch execution paths for other environments. + * As such, it's advisable to briefly explain in the PR what each added patch does and why it is necessary to fix the declared problem + +Generally, version-specific fixes belong in the scripts for the affected releases and/or patches for them -- this guarantees that their effect is limited to only those releases. + +

Backporting upstream patches

+ +Usually, this is the easiest way to backport a fix for a problem that is fixed in a newer release. + +* Clone Python, check out the tag for the appropriate release and create a branch +* Apply existing patches if there are any (with either `patch` or `git am`) and commit +* Cherry-pick the upstream commit that fixes the problem in a newer release +* Commit and `git format-patch` +* Commit the generated patch file into Pyenv, test your changes and submit a PR + + +Deprecation policy +------------------ + +We do not provide official support for EOL releases and environments or otherwise provide any kind of extended support for old Python releases. + +We do however accept fixes from interested parties that would allow running older, including EOL, releases in environments that they do not officially support. +In addition to the above requirements for release-specific fixes, + +* Such a fix must not add maintenance burden (e.g. add new logic to `python-build` that has to be kept there indefinitely) + * Unless the added logic is useful for both EOL and non-EOL releases. In this case, it will be considered as being primarily an improvement for non-EOL releases. +* Support is provided on a "best effort" basis: we do not actively maintain these fixes but won't actively break them, either, and will accept any corrections. + Since old releases never change, it's pretty safe to assume that the fixes will continue to work until a later version + of an environment introduces further incompatible changes. + + +Advanced changes / adding new Python flavor support +--------------------------------------------------- + +An installation script is sourced from `python-build`. All installation scripts are based on the same logic: + +1. Select the source to download and other variable parameters as needed. + + This includes showing an error if the user's environment (OS, architecture) is not supported by the release. + Binary releases that only officially support specific distro(s) typically show a warning in other distros instead. + +2. Run one of the `install_*` shell functions + +`install_*` shell functions defined in `python-build` install Python from different kinds of sources -- compressed package (binary or source), upstream installation script, VCS checkout. Pick one that's the most appropriate for your packaging. + +Each of them accepts a couple of function-specific arguments which are followed by arguments that constitute the build sequence. Each `` in the build sequence corresponds to the `install_*_` function in `python-build`. Check what's available and add any functions with logic specific to your flavor if needed. + +We strive to keep out of `python-build` parts of build logic that are release-specific and/or tend to change abruptly between releases -- e.g. sets of supported architectures and other software's versions. This results in logic duplication between installation scripts -- but since old releases never change once released, this doesn't really add to the maintenance burden. As a rule of thumb, `python-build` can host parts of logic that are expected to stay the same for an indefinite amount of time -- for an entire Python flavor or release line. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6bdaf5c --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +Copyright (c) 2013 Yamashita, Yuu +Copyright (c) 2013 Sam Stephenson + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/MAINTENANCE.md b/MAINTENANCE.md new file mode 100644 index 0000000..db53f17 --- /dev/null +++ b/MAINTENANCE.md @@ -0,0 +1,17 @@ +Creating a release +================== + +The release of the new version of Pyenv is done via GitHub Releases. + +Release checklist: +* Start [drafting a new release on GitHub](https://github.com/pyenv/pyenv/releases) to generate a summary of changes. +Type the would-be tag name in the "Choose a tag" field and press "Generate release notes" + * The summary may need editing. E.g. rephrase entries, delete/merge entries that are too minor or irrelevant to the users (e.g. typo fixes, CI) +* Update `CHANGELOG.md` with the new version number and the edited summary (only the changes section) +* Push the version number in `libexec/pyenv---version` and `plugins/python-build/bin/python-build` + * Minor version is pushed if there are significant functional changes (not e.g. bugfixes/formula adaptations/supporting niche use cases). + * Major version is pushed if there are breaking changes +* Commit the changes locally into `master` +* Create a new tag locally with the same name as specified in the new release window +* Push the changes including the tag +* In the still open new release window, press "Publish release". The now-existing tag will be used. \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..08bf494 --- /dev/null +++ b/Makefile @@ -0,0 +1,119 @@ +TEST_BATS_VERSION = v1.10.0 +TEST_BASH_VERSIONS = 3.2.57 4.1.17 +TEST_UNIT_DOCKER_PREFIX = test-unit-docker +TEST_UNIT_DOCKER_TARGETS = $(foreach bash,$(TEST_BASH_VERSIONS),$(addsuffix -$(bash),$(TEST_UNIT_DOCKER_PREFIX)) $(addsuffix -gnu-$(bash),$(TEST_UNIT_DOCKER_PREFIX))) +TEST_PLUGIN_DOCKER_PREFIX = test-plugin-docker +TEST_PLUGIN_DOCKER_TARGETS = $(foreach bash,$(TEST_BASH_VERSIONS),$(addsuffix -$(bash),$(TEST_PLUGIN_DOCKER_PREFIX)) $(addsuffix -gnu-$(bash),$(TEST_PLUGIN_DOCKER_PREFIX))) +TEST_BATS_IMAGE_PREFIX = test-pyenv-docker-image +TEST_BATS_IMAGE_TARGETS = $(foreach bash,$(TEST_BASH_VERSIONS),$(addsuffix -$(bash),$(TEST_BATS_IMAGE_PREFIX)) $(addsuffix -gnu-$(bash),$(TEST_BATS_IMAGE_PREFIX))) + +.PHONY: +test-docker: $(TEST_UNIT_DOCKER_PREFIX) $(TEST_PLUGIN_DOCKER_PREFIX) + +# Run all unit test under bats docker +.PHONY: $(TEST_UNIT_DOCKER_PREFIX) +$(TEST_UNIT_DOCKER_PREFIX): $(TEST_UNIT_DOCKER_TARGETS) + +# Run each unit test under bats docker +.PHONY: $(TEST_UNIT_DOCKER_TARGETS) +$(TEST_UNIT_DOCKER_TARGETS): DOCKER_IMAGE = $(TEST_BATS_IMAGE_PREFIX) +$(TEST_UNIT_DOCKER_TARGETS): GNU = $(if $(findstring -gnu-,$@),True,False) +$(TEST_UNIT_DOCKER_TARGETS): BASH = $(filter $(TEST_BASH_VERSIONS),$(subst -, ,$@)) +$(TEST_UNIT_DOCKER_TARGETS): DOCKER_TAG = bash-$(BASH)-gnu-$(GNU) +$(TEST_UNIT_DOCKER_TARGETS): INTERACTIVE = $(if $(findstring true,$(CI)),,-ti) +$(TEST_UNIT_DOCKER_TARGETS): $(TEST_UNIT_DOCKER_PREFIX)-% : $(TEST_BATS_IMAGE_PREFIX)-% + $(info Running test with docker image '$(DOCKER_IMAGE):$(DOCKER_TAG)') + docker run \ + --init \ + -v $(PWD):/code:ro \ + -v /etc/passwd:/etc/passwd:ro \ + -v /etc/group:/etc/group:ro \ + -u "$$(id -u $$(whoami)):$$(id -g $$(whoami))" \ + $${BATS_TEST_FILTER:+-e BATS_TEST_FILTER="$${BATS_TEST_FILTER}"} \ + $${BATS_FILE_FILTER:+-e BATS_FILE_FILTER="$${BATS_FILE_FILTER}"} \ + $${CI+-e CI="$${CI}"} \ + $(INTERACTIVE) \ + $(DOCKER_IMAGE):$(DOCKER_TAG) \ + test/run + +# Run all plugin test under bats docker +.PHONY: $(TEST_PLUGIN_DOCKER_PREFIX) +$(TEST_PLUGIN_DOCKER_PREFIX): $(TEST_PLUGIN_DOCKER_TARGETS) + +# Run each plugin test under bats docker +.PHONY: $(TEST_PLUGIN_DOCKER_TARGETS) +$(TEST_PLUGIN_DOCKER_TARGETS): DOCKER_IMAGE = $(TEST_BATS_IMAGE_PREFIX) +$(TEST_PLUGIN_DOCKER_TARGETS): GNU = $(if $(findstring -gnu-,$@),True,False) +$(TEST_PLUGIN_DOCKER_TARGETS): BASH = $(filter $(TEST_BASH_VERSIONS),$(subst -, ,$@)) +$(TEST_PLUGIN_DOCKER_TARGETS): DOCKER_TAG = bash-$(BASH)-gnu-$(GNU) +$(TEST_PLUGIN_DOCKER_TARGETS): INTERACTIVE = $(if $(findstring true,$(CI)),,-ti) +$(TEST_PLUGIN_DOCKER_TARGETS): $(TEST_PLUGIN_DOCKER_PREFIX)-% : $(TEST_BATS_IMAGE_PREFIX)-% + $(info Running test with docker image '$(DOCKER_IMAGE):$(DOCKER_TAG)') + docker run \ + --init \ + -v $(PWD):/code:ro \ + -v /etc/passwd:/etc/passwd:ro \ + -v /etc/group:/etc/group:ro \ + -u "$$(id -u $$(whoami)):$$(id -g $$(whoami))" \ + $${CI+-e CI="$${CI}"} \ + $(INTERACTIVE) \ + $(DOCKER_IMAGE):$(DOCKER_TAG) \ + bats $${BATS_TEST_FILTER:+--filter "$${BATS_TEST_FILTER}"} plugins/python-build/test/$${BATS_FILE_FILTER} + +# Build all images needed for bats under docker +.PHONY: $(TEST_BATS_IMAGE_PREFIX) +$(TEST_BATS_IMAGE_PREFIX): $(TEST_BATS_IMAGE_TARGETS) + +# Build each image needed for bats under docker +.PHONY: $(TEST_BATS_IMAGE_TARGETS) +$(TEST_BATS_IMAGE_TARGETS): DOCKER_IMAGE = $(TEST_BATS_IMAGE_PREFIX) +$(TEST_BATS_IMAGE_TARGETS): GNU = $(if $(findstring -gnu-,$@),True,False) +$(TEST_BATS_IMAGE_TARGETS): BASH = $(filter $(TEST_BASH_VERSIONS),$(subst -, ,$@)) +$(TEST_BATS_IMAGE_TARGETS): DOCKER_TAG = bash-$(BASH)-gnu-$(GNU) +$(TEST_BATS_IMAGE_TARGETS): + $(info Building docker image '$(DOCKER_IMAGE):$(DOCKER_TAG)') + docker build \ + --quiet \ + -f "$(PWD)/test/Dockerfile" \ + --build-arg GNU="$(GNU)" \ + --build-arg BASH="$(BASH)" \ + --build-arg BATS_VERSION="$(TEST_BATS_VERSION)" \ + -t $(DOCKER_IMAGE):$(DOCKER_TAG) \ + ./ + +.PHONY: test test-build test-unit test-plugin + +# Do not pass in user flags to build tests. +unexport PYTHON_CFLAGS +unexport PYTHON_CONFIGURE_OPTS + +test: test-unit test-plugin + +test-unit: bats + PATH="./bats/bin:$$PATH" test/run + +test-plugin: bats + cd plugins/python-build && $(PWD)/bats/bin/bats $${CI:+--tap} $${BATS_TEST_FILTER:+--filter "$${BATS_TEST_FILTER}"} test/$${BATS_FILE_FILTER} + +PYTHON_BUILD_ROOT := $(CURDIR)/plugins/python-build +PYTHON_BUILD_OPTS ?= --verbose +PYTHON_BUILD_VERSION ?= 3.8-dev +PYTHON_BUILD_TEST_PREFIX ?= $(PYTHON_BUILD_ROOT)/test/build/tmp/dist + +test-build: + $(RM) -r $(PYTHON_BUILD_TEST_PREFIX) + $(PYTHON_BUILD_ROOT)/bin/python-build $(PYTHON_BUILD_OPTS) $(PYTHON_BUILD_VERSION) $(PYTHON_BUILD_TEST_PREFIX) + [ -e $(PYTHON_BUILD_TEST_PREFIX)/bin/python ] + $(PYTHON_BUILD_TEST_PREFIX)/bin/python -V + [ -e $(PYTHON_BUILD_TEST_PREFIX)/bin/pip ] + $(PYTHON_BUILD_TEST_PREFIX)/bin/pip -V + +.SECONDARY: bats-$(TEST_BATS_VERSION) +bats-$(TEST_BATS_VERSION): + rm -rf bats + ln -sf bats-$(TEST_BATS_VERSION) bats + git clone --depth 1 --branch $(TEST_BATS_VERSION) https://github.com/bats-core/bats-core.git bats-$(TEST_BATS_VERSION) + +.PHONY: bats +bats: bats-$(TEST_BATS_VERSION) + ln -sf bats-$(TEST_BATS_VERSION) bats diff --git a/README.md b/README.md new file mode 100644 index 0000000..f489575 --- /dev/null +++ b/README.md @@ -0,0 +1,833 @@ +# Simple Python Version Management: pyenv + +[![Join the chat at https://gitter.im/yyuu/pyenv](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/yyuu/pyenv?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +pyenv lets you easily switch between multiple versions of Python. It's +simple, unobtrusive, and follows the UNIX tradition of single-purpose +tools that do one thing well. + +This project was forked from [rbenv](https://github.com/rbenv/rbenv) and +[ruby-build](https://github.com/rbenv/ruby-build), and modified for Python. + +### What pyenv _does..._ + +* Lets you **change the global Python version** on a per-user basis. +* Provides support for **per-project Python versions**. +* Allows you to **override the Python version** with an environment + variable. +* Searches for commands from **multiple versions of Python at a time**. + This may be helpful to test across Python versions with [tox](https://pypi.python.org/pypi/tox). + + +### In contrast with pythonbrew and pythonz, pyenv _does not..._ + +* **Depend on Python itself.** pyenv was made from pure shell scripts. + There is no bootstrap problem of Python. +* **Need to be loaded into your shell.** Instead, pyenv's shim + approach works by adding a directory to your `PATH`. +* **Manage virtualenv.** Of course, you can create [virtualenv](https://pypi.python.org/pypi/virtualenv) + yourself, or [pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv) + to automate the process. + + +---- + + +## Table of Contents + +* **[Installation](#installation)** + * [Getting Pyenv](#a-getting-pyenv) + * [Linux/UNIX](#linuxunix) + * [Automatic Installer](#1-automatic-installer-recommended) + * [Basic GitHub Checkout](#2-basic-github-checkout) + * [MacOS](#macos) + * [Homebrew in macOS](#homebrew-in-macos) + * [Windows](#windows) + * [Set up your shell environment for Pyenv](#b-set-up-your-shell-environment-for-pyenv) + * [Restart your shell](#c-restart-your-shell) + * [Install Python build dependencies](#d-install-python-build-dependencies) + * [Upgrade Notes](#e-upgrade-notes) +* **[Usage](#usage)** + * [Install additional Python versions](#install-additional-python-versions) + * [Prefix auto-resolution to the latest version](#prefix-auto-resolution-to-the-latest-version) + * [Python versions with extended support](#python-versions-with-extended-support) + * [Switch between Python versions](#switch-between-python-versions) + * [Making multiple versions available](#making-multiple-versions-available) + * [Uninstall Python versions](#uninstall-python-versions) + * [Other operations](#other-operations) +* [Upgrading](#upgrading) + * [Upgrading with Homebrew](#upgrading-with-homebrew) + * [Upgrading with Installer or Git checkout](#upgrading-with-installer-or-git-checkout) +* [Uninstalling pyenv](#uninstalling-pyenv) +* [Pyenv plugins](#pyenv-plugins) +* **[How It Works](#how-it-works)** + * [Understanding PATH](#understanding-path) + * [Understanding Shims](#understanding-shims) + * [Understanding Python version selection](#understanding-python-version-selection) + * [Locating Pyenv-provided Python Installations](#locating-pyenv-provided-python-installations) +* [Advanced Configuration](#advanced-configuration) + * [Using Pyenv without shims](#using-pyenv-without-shims) + * [Running nested shells from Python-based programs](#running-nested-shells-from-python-based-programs) + * [Environment variables](#environment-variables) +* **[Development](#development)** + * [Contributing](#contributing) + * [Version History](#version-history) + * [License](#license) + + +---- + +## Installation + +### A. Getting Pyenv +---- +#### Linux/Unix +
+ +The Homebrew option from the [MacOS section below](#macos) would also work if you have Homebrew installed. + +##### 1. Automatic installer (Recommended) + +```bash +curl -fsSL https://pyenv.run | bash +``` + +For more details visit our other project: +https://github.com/pyenv/pyenv-installer + + +##### 2. Basic GitHub Checkout + +This will get you going with the latest version of Pyenv and make it +easy to fork and contribute any changes back upstream. + +* **Check out Pyenv where you want it installed.** + A good place to choose is `$HOME/.pyenv` (but you can install it somewhere else): + ``` + git clone https://github.com/pyenv/pyenv.git ~/.pyenv + ``` +* Optionally, try to compile a dynamic Bash extension to speed up Pyenv. Don't + worry if it fails; Pyenv will still work normally: + ``` + cd ~/.pyenv && src/configure && make -C src + ``` +
+ +#### MacOS + +
+ +The options from the [Linux section above](#linuxunix) also work but Homebrew is recommended for basic usage. + +##### [Homebrew](https://brew.sh) in macOS + + 1. Update homebrew and install pyenv: + ```sh + brew update + brew install pyenv + ``` + If you want to install (and update to) the latest development head of Pyenv + rather than the latest release, instead run: + ```sh + brew install pyenv --head + ``` + 3. Then follow the rest of the post-installation steps, starting with + [Set up your shell environment for Pyenv](#b-set-up-your-shell-environment-for-pyenv). + + 4. OPTIONAL. To fix `brew doctor`'s warning _""config" scripts exist outside your system or Homebrew directories"_ + + If you're going to build Homebrew formulae from source that link against Python + like Tkinter or NumPy + _(This is only generally the case if you are a developer of such a formula, + or if you have an EOL version of MacOS for which prebuilt bottles are no longer provided + and you are using such a formula)._ + + To avoid them accidentally linking against a Pyenv-provided Python, + add the following line into your interactive shell's configuration: + + * Bash/Zsh: + + ~~~bash + alias brew='env PATH="${PATH//$(pyenv root)\/shims:/}" brew' + ~~~ + + * Fish: + + ~~~fish + alias brew="env PATH=(string replace (pyenv root)/shims '' \"\$PATH\") brew" + ~~~ +
+ +#### Windows + +
+ +Pyenv does not officially support Windows and does not work in Windows outside +the Windows Subsystem for Linux. +Moreover, even there, the Pythons it installs are not native Windows versions +but rather Linux versions running in a virtual machine -- +so you won't get Windows-specific functionality. + +If you're in Windows, we recommend using @kirankotari's [`pyenv-win`](https://github.com/pyenv-win/pyenv-win) fork -- +which does install native Windows Python versions. + +
+ +### B. Set up your shell environment for Pyenv +---- + +The below setup should work for the vast majority of users for common use cases. +See [Advanced configuration](#advanced-configuration) for details and more configuration options. + +#### Bash +
+ + Stock Bash startup files vary widely between distributions in which of them source + which, under what circumstances, in what order and what additional configuration they perform. + As such, the most reliable way to get Pyenv in all environments is to append Pyenv + configuration commands to both `.bashrc` (for interactive shells) + and the profile file that Bash would use (for login shells). + + 1. First, add the commands to `~/.bashrc` by running the following in your terminal: + + ```bash + echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc + echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc + echo 'eval "$(pyenv init - bash)"' >> ~/.bashrc + ``` + 2. Then, if you have `~/.profile`, `~/.bash_profile` or `~/.bash_login`, add the commands there as well. + If you have none of these, create a `~/.profile` and add the commands there. + + * to add to `~/.profile`: + ``` bash + echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile + echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile + echo 'eval "$(pyenv init - bash)"' >> ~/.profile + ``` + * to add to `~/.bash_profile`: + ```bash + echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile + echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile + echo 'eval "$(pyenv init - bash)"' >> ~/.bash_profile + ``` + + **Bash warning**: There are some systems where the `BASH_ENV` variable is configured + to point to `.bashrc`. On such systems, you should almost certainly put the + `eval "$(pyenv init - bash)"` line into `.bash_profile`, and **not** into `.bashrc`. Otherwise, you + may observe strange behaviour, such as `pyenv` getting into an infinite loop. + See [#264](https://github.com/pyenv/pyenv/issues/264) for details. + +
+ +#### Zsh + +
+ Add Pyenv startup commands to `~/.zshrc` by running the following in your terminal: + + ```zsh + echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc + echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc + echo 'eval "$(pyenv init - zsh)"' >> ~/.zshrc + ``` + + If you wish to get Pyenv in noninteractive login shells as well, also add the commands to `~/.zprofile` or `~/.zlogin`. +
+ +#### Fish + +
+ + 1. If you have Fish 3.2.0 or newer, execute this interactively: + ```fish + set -Ux PYENV_ROOT $HOME/.pyenv + test -d $PYENV_ROOT/bin; and fish_add_path $PYENV_ROOT/bin + ``` + + 2. Otherwise, execute the snippet below: + ```fish + set -Ux PYENV_ROOT $HOME/.pyenv + test -d $PYENV_ROOT/bin; and set -U fish_user_paths $PYENV_ROOT/bin $fish_user_paths + ``` + + 3. Now, add this to `~/.config/fish/config.fish`: + ```fish + pyenv init - fish | source + ``` +
+ +#### Nushell + +
+ + Add the following lines to your `config.nu` to add Pyenv and its shims to your `PATH`. + Shell integration (completions and subcommands changing the shell's state) + isn't currently supported. + + ~~~ nu + $env.PYENV_ROOT = "~/.pyenv" | path expand + if (( $"($env.PYENV_ROOT)/bin" | path type ) == "dir") { + $env.PATH = $env.PATH | prepend $"($env.PYENV_ROOT)/bin" } + $env.PATH = $env.PATH | prepend $"(pyenv root)/shims" + ~~~ + +
+ +#### Microsoft PowerShell + +
+ + Add the commands to `$profile.CurrentUserAllHosts` by running the following in your terminal: + + ~~~ pwsh + echo '$Env:PYENV_ROOT="$Env:HOME/.pyenv"' >> $profile.CurrentUserAllHosts + echo 'if (Test-Path -LP "$Env:PYENV_ROOT/bin" -PathType Container) { + $Env:PATH="$Env:PYENV_ROOT/bin:$Env:PATH" }' >> $profile.CurrentUserAllHosts + echo 'iex ((pyenv init -) -join "`n")' >> $profile.CurrentUserAllHosts + ~~~ + +
+ +### C. Restart your shell +---- + + for the `PATH` changes to take effect. + + ```sh + exec "$SHELL" + ``` + +### D. Install Python build dependencies +---- + + [**Install Python build dependencies**](https://github.com/pyenv/pyenv/wiki#suggested-build-environment) + before attempting to install a new Python version. + + You can now begin using Pyenv. + +### E. Upgrade Notes +---- + +**if you have upgraded from pyenv version 2.0.x-2.2.x** + +
+ +The startup logic and instructions have been updated for simplicity in 2.3.0. +The previous, more complicated configuration scheme for 2.0.0-2.2.5 still works. + +* Define environment variable `PYENV_ROOT` to point to the path where + Pyenv will store its data. `$HOME/.pyenv` is the default. + If you installed Pyenv via Git checkout, we recommend + to set it to the same location as where you cloned it. +* Add the `pyenv` executable to your `PATH` if it's not already there +* run `eval "$(pyenv init -)"` to install `pyenv` into your shell as a shell function, enable shims and autocompletion + * You may run `eval "$(pyenv init --path)"` instead to just enable shims, without shell integration + +
+ +---- + + +## Usage + +![Terminal output example](/install_local_python.gif) + +### Install additional Python versions + +To install additional Python versions, use [`pyenv install`](COMMANDS.md#pyenv-install). + +For example, to download and install Python 3.10.4, run: + +```sh +pyenv install 3.10.4 +``` + +Running `pyenv install -l` gives the list of all available versions. + +---- + +
Notes about python releases + +**NOTE:** Most Pyenv-provided Python releases are source releases and are built +from source as part of installation (that's why you need Python build dependencies preinstalled). +You can pass options to Python's `configure` and compiler flags to customize the build, +see [_Special environment variables_ in Python-Build's README](plugins/python-build/README.md#special-environment-variables) +for details. + +**NOTE:** If you are having trouble installing a Python version, +please visit the wiki page about +[Common Build Problems](https://github.com/pyenv/pyenv/wiki/Common-build-problems). + +**NOTE:** If you want to use proxy for download, please set the `http_proxy` and `https_proxy` +environment variables. + +**NOTE:** If you'd like a faster interpreter at the cost of longer build times, +see [_Building for maximum performance_ in Python-Build's README](plugins/python-build/README.md#building-for-maximum-performance). + +
+ +---- + +#### Prefix auto-resolution to the latest version + +All Pyenv subcommands except `uninstall` automatically resolve full prefixes to the latest version in the corresponding version line. + +`pyenv install` picks the latest known version, while other subcommands pick the latest installed version. + +E.g. to install and then switch to the latest 3.10 release: + +```sh +pyenv install 3.10 +pyenv global 3.10 +``` + +You can run [`pyenv latest -k `](COMMANDS.md#pyenv-latest) to see how `pyenv install` would resolve a specific prefix, or [`pyenv latest `](COMMANDS.md#pyenv-latest) to see how other subcommands would resolve it. + +See the [`pyenv latest` documentation](COMMANDS.md#pyenv-latest) for details. + +---- + +#### Python versions with extended support + +For the following Python releases, Pyenv applies user-provided patches that add support for some newer environments. +Though we don't actively maintain those patches, since existing releases never change, +it's safe to assume that they will continue working until there are further incompatible changes +in a later version of those environments. + +* *3.7.8-3.7.15, 3.8.4-3.8.12, 3.9.0-3.9.7* : XCode 13.3 +* *3.5.10, 3.6.15* : MacOS 11+ and XCode 13.3 +* *2.7.18* : MacOS 10.15+ and Apple Silicon + + +---- + +### Switch between Python versions + +To select a Pyenv-installed Python as the version to use, run one +of the following commands: + +* [`pyenv shell `](COMMANDS.md#pyenv-shell) -- select just for current shell session +* [`pyenv local `](COMMANDS.md#pyenv-local) -- automatically select whenever you are in the current directory (or its subdirectories) +* [`pyenv global `](COMMANDS.md#pyenv-global) -- select globally for your user account + +E.g. to select the above-mentioned newly-installed Python 3.10.4 as your preferred version to use: + +~~~bash +pyenv global 3.10.4 +~~~ + +Now whenever you invoke `python`, `pip` etc., an executable from the Pyenv-provided +3.10.4 installation will be run instead of the system Python. + +Using "`system`" as a version name would reset the selection to your system-provided Python. + +See [Understanding shims](#understanding-shims) and +[Understanding Python version selection](#understanding-python-version-selection) +for more details on how the selection works and more information on its usage. + +---- + +#### Making multiple versions available + +You can select multiple Python versions at the same time by specifying multiple arguments. +E.g. if you wish to use the latest installed CPython 3.11 and 3.12: + +~~~bash +pyenv global 3.11 3.12 +~~~ + +Whenever you run a command provided by a Python installation, these versions will be searched for it in the specified order. +[Due to the shims' fall-through behavior]((#understanding-python-version-selection)), `system` is always implicitly searched afterwards. + +---- + +### Uninstall Python versions + +As time goes on, you will accumulate Python versions in your +`$(pyenv root)/versions` directory. + +To remove old Python versions, use [`pyenv uninstall `](COMMANDS.md#pyenv-uninstall). + +Alternatively, you can simply `rm -rf` the directory of the version you want +to remove. You can find the directory of a particular Python version +with the `pyenv prefix` command, e.g. `pyenv prefix 2.6.8`. +Note however that plugins may run additional operations on uninstall +which you would need to do by hand as well. E.g. Pyenv-Virtualenv also +removes any virtual environments linked to the version being uninstalled. + +---- + +### Other operations + +Run `pyenv commands` to get a list of all available subcommands. +Run a subcommand with `--help` to get help on it, or see the [Commands Reference](COMMANDS.md). + +Note that Pyenv plugins that you install may add their own subcommands. + + +## Upgrading + +### Upgrading with Homebrew + +If you've installed Pyenv using Homebrew, upgrade using: +```sh +brew upgrade pyenv +``` + +To switch from a release to the latest development head of Pyenv, use: + +```sh +brew uninstall pyenv +brew install pyenv --head +``` + +then you can upgrade it with `brew upgrade pyenv` as usual. + + +### Upgrading with Installer or Git checkout + +If you've installed Pyenv with Pyenv-installer, you likely have the +[Pyenv-Update](https://github.com/pyenv/pyenv-update) plugin that would +upgrade Pyenv and all installed plugins: + +```sh +pyenv update +``` + +If you've installed Pyenv using Pyenv-installer or Git checkout, you can also +upgrade your installation at any time using Git. + +To upgrade to the latest development version of pyenv, use `git pull`: + +```sh +cd $(pyenv root) +git pull +``` + +To upgrade to a specific release of Pyenv, check out the corresponding tag: + +```sh +cd $(pyenv root) +git fetch +git tag +git checkout v0.1.0 +``` + +## Uninstalling pyenv + +The simplicity of pyenv makes it easy to temporarily disable it, or +uninstall from the system. + +1. To **disable** Pyenv managing your Python versions, simply remove the + `pyenv init` invocations from your shell startup configuration. This will + remove Pyenv shims directory from `PATH`, and future invocations like + `python` will execute the system Python version, as it was before Pyenv. + + `pyenv` will still be accessible on the command line, but your Python + apps won't be affected by version switching. + +2. To completely **uninstall** Pyenv, remove _all_ Pyenv configuration lines + from your shell startup configuration, and then remove + its root directory. This will **delete all Python versions** that were + installed under the `` $(pyenv root)/versions/ `` directory: + + ```sh + rm -rf $(pyenv root) + ``` + + If you've installed Pyenv using a package manager, as a final step, + perform the Pyenv package removal. For instance, for Homebrew: + + ``` + brew uninstall pyenv + ``` + + +## Pyenv plugins + +Pyenv provides a simple way to extend and customize its functionality with plugins -- +as simple as creating a plugin directory and dropping a shell script on a certain subpath of it +with whatever extra logic you need to be run at certain moments. + +The main idea is that most things that you can put under `$PYENV_ROOT/` you can also put +under `$PYENV_ROOT/plugins/your_plugin_name/`. + +See [_Plugins_ on the wiki](https://github.com/pyenv/pyenv/wiki/Plugins) on how to install and use plugins +as well as a catalog of some useful existing plugins for common needs. + +See [_Authoring plugins_ on the wiki](https://github.com/pyenv/pyenv/wiki/Authoring-plugins) on writing your own plugins. + +---- + +## How It Works + +At a high level, pyenv intercepts Python commands using shim +executables injected into your `PATH`, determines which Python version +has been specified by your application, and passes your commands along +to the correct Python installation. + + +### Understanding PATH + +When you run a command like `python` or `pip`, your shell (bash / zshrc / ...) +searches through a list of directories to find an executable file with +that name. This list of directories lives in an environment variable +called `PATH`, with each directory in the list separated by a colon: + + /usr/local/bin:/usr/bin:/bin + +Directories in `PATH` are searched from left to right, so a matching +executable in a directory at the beginning of the list takes +precedence over another one at the end. In this example, the +`/usr/local/bin` directory will be searched first, then `/usr/bin`, +then `/bin`. + + +### Understanding Shims + +pyenv works by inserting a directory of _shims_ at the front of your +`PATH`: + + $(pyenv root)/shims:/usr/local/bin:/usr/bin:/bin + +Through a process called _rehashing_, pyenv maintains shims in that +directory to match every Python command across every installed version +of Python—`python`, `pip`, and so on. + +Shims are lightweight executables that simply pass your command along +to pyenv. So with pyenv installed, when you run, say, `pip`, your +operating system will do the following: + +* Search your `PATH` for an executable file named `pip` +* Find the pyenv shim named `pip` at the beginning of your `PATH` +* Run the shim named `pip`, which in turn passes the command along to + pyenv + + +### Understanding Python version selection + +When you execute a shim, pyenv determines which Python version to use by +reading it from the following sources, in this order: + +1. The `PYENV_VERSION` environment variable (if specified). You can use + the [`pyenv shell`](https://github.com/pyenv/pyenv/blob/master/COMMANDS.md#pyenv-shell) command to set this environment + variable in your current shell session. + +2. The application-specific `.python-version` file in the current + directory (if present). You can modify the current directory's + `.python-version` file with the [`pyenv local`](https://github.com/pyenv/pyenv/blob/master/COMMANDS.md#pyenv-local) + command. + +3. The first `.python-version` file found (if any) by searching each parent + directory, until reaching the root of your filesystem. + +4. The global `$(pyenv root)/version` file. You can modify this file using + the [`pyenv global`](https://github.com/pyenv/pyenv/blob/master/COMMANDS.md#pyenv-global) command. + If the global version file is not present, pyenv assumes you want to use the "system" + Python (see below). + +A special version name "`system`" means to use whatever Python is found on `PATH` +after the shims `PATH` entry (in other words, whatever would be run if Pyenv +shims weren't on `PATH`). Note that Pyenv considers those installations outside +its control and does not attempt to inspect or distinguish them in any way. +So e.g. if you are on MacOS and have OS-bundled Python 3.8.9 and Homebrew-installed +Python 3.9.12 and 3.10.2 -- for Pyenv, this is still a single "`system`" version, +and whichever of those is first on `PATH` under the executable name you +specified will be run. + +**NOTE:** You can activate multiple versions at the same time, including multiple +versions of Python2 or Python3 simultaneously. This allows for parallel usage of +Python2 and Python3, and is required with tools like `tox`. For example, to instruct +Pyenv to first use your system Python and Python3 (which are e.g. 2.7.9 and 3.4.2) +but also have Python 3.3.6, 3.2.1, and 2.5.2 available, you first `pyenv install` +the missing versions, then set `pyenv global system 3.3.6 3.2.1 2.5.2`. +Then you'll be able to invoke any of those versions with an appropriate `pythonX` or +`pythonX.Y` name. +You can also specify multiple versions in a `.python-version` file by hand, +separated by newlines. Lines starting with a `#` are ignored. + +[`pyenv which `](COMMANDS.md#pyenv-which) displays which real executable would be +run when you invoke `` via a shim. +E.g. if you have 3.3.6, 3.2.1 and 2.5.2 installed of which 3.3.6 and 2.5.2 are selected +and your system Python is 3.2.5, +`pyenv which python2.5` should display `$(pyenv root)/versions/2.5.2/bin/python2.5`, +`pyenv which python3` -- `$(pyenv root)/versions/3.3.6/bin/python3` and +`pyenv which python3.2` -- path to your system Python due to the fall-through (see below). + +Shims also fall through to anything further on `PATH` if the corresponding executable is +not present in any of the selected Python installations. +This allows you to use any programs installed elsewhere on the system as long as +they are not shadowed by a selected Python installation. + + +### Locating Pyenv-provided Python installations + +Once pyenv has determined which version of Python your application has +specified, it passes the command along to the corresponding Python +installation. + +Each Python version is installed into its own directory under +`$(pyenv root)/versions`. + +For example, you might have these versions installed: + +* `$(pyenv root)/versions/2.7.8/` +* `$(pyenv root)/versions/3.4.2/` +* `$(pyenv root)/versions/pypy-2.4.0/` + +As far as Pyenv is concerned, version names are simply directories under +`$(pyenv root)/versions`. + +---- + + +## Advanced Configuration + +Skip this section unless you must know what every line in your shell +profile is doing. + +Also see the [Environment variables](#environment-variables) section +for the environment variables that control Pyenv's behavior. + +`pyenv init` is the only command that crosses the line of loading +extra commands into your shell. Coming from RVM, some of you might be +opposed to this idea. Here's what `eval "$(pyenv init -)"` actually does: + +1. **Finds current shell.** + `pyenv init` figures out what shell you are using, as the exact commands of `eval "$(pyenv init -)"` vary depending on shell. Specifying which shell you are using (e.g. `eval "$(pyenv init - bash)"`) is preferred, because it reduces launch time significantly. + +2. **Sets up the shims path.** This is what allows Pyenv to intercept + and redirect invocations of `python`, `pip` etc. transparently. + It prepends `$(pyenv root)/shims` to your `$PATH`. + It also deletes any other instances of `$(pyenv root)/shims` on `PATH` + which allows to invoke `eval "$(pyenv init -)"` multiple times without + getting duplicate `PATH` entries. + +3. **Installs autocompletion.** This is entirely optional but pretty + useful. Sourcing `/completions/pyenv.bash` will set that + up. There are also completions for Zsh, Fish and PowerShell. + +4. **Rehashes shims.** From time to time you'll need to rebuild your + shim files. Doing this on init makes sure everything is up to + date. You can always run `pyenv rehash` manually. + +5. **Installs `pyenv` into the current shell as a shell function.** + This bit is also optional, but allows + pyenv and plugins to change variables in your current shell. + This is required for some commands like `pyenv shell` to work. + The sh dispatcher doesn't do + anything crazy like override `cd` or hack your shell prompt, but if + for some reason you need `pyenv` to be a real script rather than a + shell function, you can safely skip it. + +`eval "$(pyenv init --path)"` only does items 2 and 4. + +To see exactly what happens under the hood for yourself, run `pyenv init -` +or `pyenv init --path`. + +`eval "$(pyenv init -)"` is supposed to run at any interactive shell's +startup (including nested shells -- e.g. those invoked from editors) +so that you get completion and convenience shell functions. + +`eval "$(pyenv init --path)"` can be used instead of `eval "$(pyenv init -)"` +to just enable shims, without shell integration. It can also be used to bump shims +to the front of `PATH` after some other logic has prepended stuff to `PATH` +that may shadow Pyenv's shims. + +* In particular, in Debian-based distributions, the stock `~/.profile` + prepends per-user `bin` directories to `PATH` after having sourced `~/.bashrc`. + This necessitates appending a `pyenv init` call to `~/.profile` as well as `~/.bashrc` + in these distributions because the system's Pip places executables for + modules installed by a non-root user into those per-user `bin` directories. + + +### Using Pyenv without shims + +If you don't want to use `pyenv init` and shims, you can still benefit +from pyenv's ability to install Python versions for you. Just run +`pyenv install` and you will find versions installed in +`$(pyenv root)/versions`. + +You can manually execute or symlink them as required, +or you can use [`pyenv exec `](COMMANDS.md#pyenv-exec) +whenever you want `` to be affected by Pyenv's version selection +as currently configured. + +`pyenv exec` works by prepending `$(pyenv root)/versions//bin` +to `PATH` in the ``'s environment, the same as what e.g. RVM does. + +### Running nested shells from Python-based programs + +In addition to altering `PATH`, `pyenv exec` sets `PYENV_VERSION` in the +executed program's environment to ensure that it won't spontaneouly switch to +using a different Python version. + +Some Python-based programs (e.g. Jupyter) can spawn nested shell sessions. +`pyenv version` in such a shell would dutily report that the current version was +set by an environment variable. + +Depending on your use case, this version lock may be undesirable. +In this case, you need to change or unset the environment variable, +either directly or via `pyenv shell`. + +To automate this, you can do so in your shell's interactive startup file, +detecting the nested shell session via some characteristic environment variable +that the spawning application sets. + +E.g. in Jupyter's case (as of this writing), it's `JUPYTER_SERVER_ROOT`, +and the corresponding `~/.bashrc` line may look like this: + +```bash +[[ -n $JUPYTER_SERVER_ROOT ]] && unset PYENV_VERSION +``` + + + +### Environment variables + +You can affect how Pyenv operates with the following environment variables: + +name | default | description +-----|---------|------------ +`PYENV_VERSION` | | Specifies the Python version to be used.
Also see [`pyenv shell`](COMMANDS.md#pyenv-shell) +`PYENV_ROOT` | `~/.pyenv` | Defines the directory under which Python versions and shims reside.
Also see [`pyenv root`](COMMANDS.md#pyenv-root) +`PYENV_DEBUG` | | Outputs debug information.
Also as: `pyenv --debug ` +`PYENV_HOOK_PATH` | [_see wiki_][hooks] | Colon-separated list of paths searched for pyenv hooks. +`PYENV_DIR` | `$PWD` | Directory to start searching for `.python-version` files. + +See also [_Special environment variables_ in Python-Build's README](plugins/python-build/README.md#special-environment-variables) +for environment variables that can be used to customize the build. + +---- + +## Development + +The pyenv source code is [hosted on +GitHub](https://github.com/pyenv/pyenv). It's clean, modular, +and easy to understand, even if you're not a shell hacker. + +Tests are executed using [Bats](https://github.com/bats-core/bats-core): + + bats test + bats/test/.bats + + +### Contributing + +Feel free to submit pull requests and file bugs on the [issue +tracker](https://github.com/pyenv/pyenv/issues). + +See [CONTRIBUTING.md](CONTRIBUTING.md) for more details on submitting changes. + + +### Version History + +See [CHANGELOG.md](CHANGELOG.md). + + +### License + +[The MIT License](LICENSE) + + +[pyenv-virtualenv]: https://github.com/pyenv/pyenv-virtualenv#readme +[hooks]: https://github.com/pyenv/pyenv/wiki/Authoring-plugins#pyenv-hooks diff --git a/bin/pyenv b/bin/pyenv new file mode 120000 index 0000000..06bee77 --- /dev/null +++ b/bin/pyenv @@ -0,0 +1 @@ +../libexec/pyenv \ No newline at end of file diff --git a/completions/pyenv.bash b/completions/pyenv.bash new file mode 100644 index 0000000..c8d8aa6 --- /dev/null +++ b/completions/pyenv.bash @@ -0,0 +1,16 @@ +_pyenv() { + COMPREPLY=() + local word="${COMP_WORDS[COMP_CWORD]}" + + if [ "$COMP_CWORD" -eq 1 ]; then + COMPREPLY=( $(compgen -W "$(pyenv commands)" -- "$word") ) + else + local words=("${COMP_WORDS[@]}") + unset words[0] + unset words[$COMP_CWORD] + local completions=$(pyenv completions "${words[@]}") + COMPREPLY=( $(compgen -W "$completions" -- "$word") ) + fi +} + +complete -F _pyenv pyenv diff --git a/completions/pyenv.fish b/completions/pyenv.fish new file mode 100644 index 0000000..4d2d51d --- /dev/null +++ b/completions/pyenv.fish @@ -0,0 +1,23 @@ +function __fish_pyenv_needs_command + set cmd (commandline -opc) + if [ (count $cmd) -eq 1 -a $cmd[1] = 'pyenv' ] + return 0 + end + return 1 +end + +function __fish_pyenv_using_command + set cmd (commandline -opc) + if [ (count $cmd) -gt 1 ] + if [ $argv[1] = $cmd[2] ] + return 0 + end + end + return 1 +end + +complete -f -c pyenv -n '__fish_pyenv_needs_command' -a '(pyenv commands)' +for cmd in (pyenv commands) + complete -f -c pyenv -n "__fish_pyenv_using_command $cmd" -a \ + "(pyenv completions (commandline -opc)[2..-1])" +end diff --git a/completions/pyenv.pwsh b/completions/pyenv.pwsh new file mode 100644 index 0000000..f422f46 --- /dev/null +++ b/completions/pyenv.pwsh @@ -0,0 +1,17 @@ +$scriptblock = { + param($wordToComplete, $commandAst, $cursorPosition) + $words = $commandAst.ToString() + if ( $wordToComplete ) { + $matches = (($words[0..$cursorPosition] -join '') | Select-String -Pattern "\s+" -AllMatches).Matches + if ( $matches ) { + $cursorPosition = $matches[-1].Index - 1 + } + } + $words = $words[0..$cursorPosition] -join '' -split "\s+" + if ( $words.Count -ge 2 ) { + pyenv completions $words[1] | where { $_ -match $wordToComplete } + } else { + pyenv commands | where { $_ -match $wordToComplete } + } +} +Register-ArgumentCompleter -Native -CommandName pyenv -ScriptBlock $scriptblock diff --git a/completions/pyenv.zsh b/completions/pyenv.zsh new file mode 100644 index 0000000..08a4cee --- /dev/null +++ b/completions/pyenv.zsh @@ -0,0 +1,18 @@ +if [[ ! -o interactive ]]; then + return +fi + +compctl -K _pyenv pyenv + +_pyenv() { + local words completions + read -cA words + + if [ "${#words}" -eq 2 ]; then + completions="$(pyenv commands)" + else + completions="$(pyenv completions ${words[2,-2]})" + fi + + reply=(${(ps:\n:)completions}) +} diff --git a/install_local_python.gif b/install_local_python.gif new file mode 100644 index 0000000000000000000000000000000000000000..fefdbd2f80993728231432173a67b2a1d2412f80 GIT binary patch literal 543836 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≫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 z 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≤V+9a&c7HA`ja{vFE3yH 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ġ-5*^{XiBT4iylr8-^ho{c!`q+jalDqxKT}D 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 B<}3gJ literal 0 HcmV?d00001 diff --git a/libexec/pyenv b/libexec/pyenv new file mode 100755 index 0000000..9a7154f --- /dev/null +++ b/libexec/pyenv @@ -0,0 +1,145 @@ +#!/usr/bin/env bash +set -e + +if [ "$1" = "--debug" ]; then + export PYENV_DEBUG=1 + shift +fi + +if [ -n "$PYENV_DEBUG" ]; then + # https://wiki-dev.bash-hackers.org/scripting/debuggingtips#making_xtrace_more_useful + export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }' + set -x +fi + +abort() { + { if [ "$#" -eq 0 ]; then cat - + else echo "pyenv: $*" + fi + } >&2 + exit 1 +} + +if enable -f "${BASH_SOURCE%/*}"/../libexec/pyenv-realpath.dylib realpath 2>/dev/null; then + abs_dirname() { + local path + path="$(realpath "$1")" + echo "${path%/*}" + } +else + [ -z "$PYENV_NATIVE_EXT" ] || abort "failed to load \`realpath' builtin" + + READLINK=$(type -P readlink) + [ -n "$READLINK" ] || abort "cannot find readlink - are you missing GNU coreutils?" + + resolve_link() { + $READLINK "$1" + } + + abs_dirname() { + local path="$1" + + # Use a subshell to avoid changing the current path + ( + while [ -n "$path" ]; do + cd_path="${path%/*}" + if [[ "$cd_path" != "$path" ]]; then + cd "$cd_path" + fi + name="${path##*/}" + path="$(resolve_link "$name" || true)" + done + + echo "$PWD" + ) + } +fi + +if [ -z "${PYENV_ROOT}" ]; then + PYENV_ROOT="${HOME}/.pyenv" +else + PYENV_ROOT="${PYENV_ROOT%/}" +fi +export PYENV_ROOT + +if [ -z "${PYENV_DIR}" ]; then + PYENV_DIR="$PWD" +fi + +if [ ! -d "$PYENV_DIR" ] || [ ! -e "$PYENV_DIR" ]; then + abort "cannot change working directory to \`$PYENV_DIR'" +fi + +PYENV_DIR=$(cd "$PYENV_DIR" && echo "$PWD") +export PYENV_DIR + + +shopt -s nullglob + +_PYENV_INSTALL_PREFIX="$(abs_dirname "$0")" +_PYENV_INSTALL_PREFIX="${_PYENV_INSTALL_PREFIX%/*}" + +export _PYENV_INSTALL_PREFIX + +for plugin_bin in "${_PYENV_INSTALL_PREFIX}"/plugins/*/bin; do + PATH="${plugin_bin}:${PATH}" +done +# PYENV_ROOT can be set to anything, so it may happen to be equal to the base path above, +# resulting in duplicate PATH entries +if [ "${_PYENV_INSTALL_PREFIX}" != "$PYENV_ROOT" ]; then + for plugin_bin in "${PYENV_ROOT}"/plugins/*/bin; do + PATH="${plugin_bin}:${PATH}" + done +fi +export PATH="${_PYENV_INSTALL_PREFIX}/libexec:${PATH}" + +PYENV_HOOK_PATH="${PYENV_HOOK_PATH}:${PYENV_ROOT}/pyenv.d" +if [ "${_PYENV_INSTALL_PREFIX}" != "$PYENV_ROOT" ]; then + # Add pyenv's own `pyenv.d` unless pyenv was cloned to PYENV_ROOT + PYENV_HOOK_PATH="${PYENV_HOOK_PATH}:${_PYENV_INSTALL_PREFIX}/pyenv.d" +fi +PYENV_HOOK_PATH="${PYENV_HOOK_PATH}:/usr/etc/pyenv.d:/usr/local/etc/pyenv.d:/etc/pyenv.d:/usr/lib/pyenv/hooks" +for plugin_hook in "${PYENV_ROOT}/plugins/"*/etc/pyenv.d; do + PYENV_HOOK_PATH="${PYENV_HOOK_PATH}:${plugin_hook}" +done +PYENV_HOOK_PATH="${PYENV_HOOK_PATH#:}" +export PYENV_HOOK_PATH + +shopt -u nullglob + + +command="$1" +case "$command" in +"" ) + { pyenv---version + pyenv-help + } | abort + ;; +-v | --version ) + exec pyenv---version + ;; +-h | --help ) + exec pyenv-help + ;; +* ) + command_path="$(command -v "pyenv-$command" || true)" + if [ -z "$command_path" ]; then + if [ "$command" == "shell" ]; then + abort "shell integration not enabled. Run \`pyenv init' for instructions." + else + abort "no such command \`$command'" + fi + fi + + shift 1 + if [ "$1" = --help ]; then + if [[ "$command" == "sh-"* ]]; then + echo "pyenv help \"$command\"" + else + exec pyenv-help "$command" + fi + else + exec "$command_path" "$@" + fi + ;; +esac diff --git a/libexec/pyenv---version b/libexec/pyenv---version new file mode 100755 index 0000000..f9bd180 --- /dev/null +++ b/libexec/pyenv---version @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +# Summary: Display the version of pyenv +# +# Displays the version number of this pyenv release, including the +# current revision from git, if available. +# +# The format of the git revision is: +# -- +# where `num_commits` is the number of commits since `version` was +# tagged. + +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +version="2.6.31" +git_revision="" + +if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then + git_revision="$(git describe --tags HEAD 2>/dev/null || true)" + git_revision="${git_revision#v}" +fi + +echo "pyenv ${git_revision:-$version}" diff --git a/libexec/pyenv-commands b/libexec/pyenv-commands new file mode 100755 index 0000000..d0012f8 --- /dev/null +++ b/libexec/pyenv-commands @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +# Summary: List all available pyenv commands +# Usage: pyenv commands [--sh|--no-sh] + +set -e +[[ -n $PYENV_DEBUG ]] && set -x + +# Provide pyenv completions +if [[ $1 = "--complete" ]]; then + echo --sh + echo --no-sh + exit +fi + +if [[ $1 = "--sh" ]]; then + sh=1 + shift +elif [[ $1 = "--no-sh" ]]; then + nosh=1 + shift +fi + +IFS=: paths=($PATH) + +shopt -s nullglob + +{ + if [[ -n $sh ]]; then + for path in "${paths[@]}"; do + for command in "${path}"/pyenv-sh-*; do + echo "${command##*/pyenv-sh-}" + done + done + else + for path in "${paths[@]}"; do + for command in "${path}"/pyenv-*; do + command="${command##*/pyenv-}" + if [[ -n $nosh ]]; then + if [[ ${command:0:3} != "sh-" ]]; then + echo "$command" + fi + else + echo "${command##sh-}" + fi + done + done + fi +} | sort -u diff --git a/libexec/pyenv-completions b/libexec/pyenv-completions new file mode 100755 index 0000000..227b932 --- /dev/null +++ b/libexec/pyenv-completions @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +# Usage: pyenv completions [arg1 arg2...] + +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +COMMAND="$1" +if [ -z "$COMMAND" ]; then + pyenv-help --usage completions >&2 + exit 1 +fi + +# Provide pyenv completions +if [ "$COMMAND" = "--complete" ]; then + exec pyenv-commands +fi + +COMMAND_PATH="$(command -v "pyenv-$COMMAND" || command -v "pyenv-sh-$COMMAND")" + +# --help is provided automatically +echo --help + +if grep -iE "^([#%]|--|//) provide pyenv completions" "$COMMAND_PATH" >/dev/null; then + shift + exec "$COMMAND_PATH" --complete "$@" +fi diff --git a/libexec/pyenv-exec b/libexec/pyenv-exec new file mode 100755 index 0000000..d0f6d07 --- /dev/null +++ b/libexec/pyenv-exec @@ -0,0 +1,57 @@ +#!/usr/bin/env bash +# +# Summary: Run an executable with the selected Python version +# +# Usage: pyenv exec [arg1 arg2...] +# +# Runs an executable by first preparing PATH so that the selected Python +# version's `bin' directory is at the front. +# +# For example, if the currently selected Python version is 2.7.6: +# pyenv exec pip install -r requirements.txt +# +# is equivalent to: +# PATH="$PYENV_ROOT/versions/2.7.6/bin:$PATH" pip install -r requirements.txt + +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +# Provide pyenv completions +if [ "$1" = "--complete" ]; then + exec pyenv-shims --short +fi + +PYENV_VERSION="$(pyenv-version-name -f)" +PYENV_COMMAND="$1" + +if [ -z "$PYENV_COMMAND" ]; then + pyenv-help --usage exec >&2 + exit 1 +fi + +if [[ -n $_PYENV_SHIM_PATH ]]; then + PROGRAM="$(echo "$PYENV_COMMAND" | tr a-z- A-Z_ | sed 's/[^A-Z0-9_]/_/g')" + NR_PYENV_SHIM_PATHS_PROGRAM="_PYENV_SHIM_PATHS_${PROGRAM}" + export -- "$NR_PYENV_SHIM_PATHS_PROGRAM=$_PYENV_SHIM_PATH${!NR_PYENV_SHIM_PATHS_PROGRAM:+:${!NR_PYENV_SHIM_PATHS_PROGRAM}}" + unset PROGRAM NR_PYENV_SHIM_PATHS_PROGRAM + unset _PYENV_SHIM_PATH +fi + +PYENV_COMMAND_PATH="$(pyenv-which "$PYENV_COMMAND")" +PYENV_BIN_PATH="${PYENV_COMMAND_PATH%/*}" + +export PYENV_VERSION + +OLDIFS="$IFS" +IFS=$'\n' scripts=(`pyenv-hooks exec`) +IFS="$OLDIFS" +for script in "${scripts[@]}"; do + source "$script" +done + +shift 1 +if [ "${PYENV_BIN_PATH#${PYENV_ROOT}}" != "${PYENV_BIN_PATH}" ]; then + # Only add to $PATH for non-system version. + export PATH="${PYENV_BIN_PATH}:${PATH}" +fi +exec "$PYENV_COMMAND_PATH" "$@" diff --git a/libexec/pyenv-global b/libexec/pyenv-global new file mode 100755 index 0000000..dd9dae9 --- /dev/null +++ b/libexec/pyenv-global @@ -0,0 +1,49 @@ +#!/usr/bin/env bash +# +# Summary: Set or show the global Python version(s) +# +# Usage: pyenv global <..> +# +# Sets the global Python version(s). You can override the global version at +# any time by setting a directory-specific version with `pyenv local' +# or by setting the `PYENV_VERSION' environment variable. +# +# can be specified multiple times and should be a version +# tag known to pyenv. The special version string `system' will use +# your default system Python. Run `pyenv versions' for a list of +# available Python versions. +# +# Example: To enable the python2.7 and python3.7 shims to find their +# respective executables you could set both versions with: +# +# 'pyenv global 3.7.0 2.7.15' +# + + +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +# Provide pyenv completions +if [ "$1" = "--complete" ]; then + echo system + exec pyenv-versions --bare +fi + +versions=("$@") +PYENV_VERSION_FILE="${PYENV_ROOT}/version" + +if [ -n "$versions" ]; then + pyenv-version-file-write "$PYENV_VERSION_FILE" "${versions[@]}" +else + OLDIFS="$IFS" + IFS=: versions=($( + pyenv-version-file-read "$PYENV_VERSION_FILE" || + pyenv-version-file-read "${PYENV_ROOT}/global" || + pyenv-version-file-read "${PYENV_ROOT}/default" || + echo system + )) + IFS="$OLDIFS" + for version in "${versions[@]}"; do + echo "$version" + done +fi diff --git a/libexec/pyenv-help b/libexec/pyenv-help new file mode 100755 index 0000000..d2f793d --- /dev/null +++ b/libexec/pyenv-help @@ -0,0 +1,173 @@ +#!/usr/bin/env bash +# +# Summary: Display help for a command +# +# Usage: pyenv help [--usage] COMMAND +# +# Parses and displays help contents from a command's source file. +# +# A command is considered documented if it starts with a comment block +# that has a `Summary:' or `Usage:' section. Usage instructions can +# span multiple lines as long as subsequent lines are indented. +# The remainder of the comment block is displayed as extended +# documentation. + +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +# Provide pyenv completions +if [ "$1" = "--complete" ]; then + echo --usage + exec pyenv-commands +fi + +command_path() { + local command="$1" + command -v pyenv-"$command" || command -v pyenv-sh-"$command" || true +} + +extract_initial_comment_block() { + LC_ALL= \ + LC_CTYPE=C \ + sed -ne " + /^#/ !{ + q + } + + s/^#$/# / + + /^# / { + s/^# // + p + } + " +} + +collect_documentation() { + # `tail` prevents "broken pipe" errors due to `head` closing the pipe without reading everything + # https://superuser.com/questions/554855/how-can-i-fix-a-broken-pipe-error/642932#642932 + $(type -P gawk awk | tail -n +1 | head -n1) ' + /^Summary:/ { + summary = substr($0, 10) + next + } + + /^Usage:/ { + reading_usage = 1 + usage = usage "\n" $0 + next + } + + /^( *$| )/ && reading_usage { + usage = usage "\n" $0 + next + } + + { + reading_usage = 0 + help = help "\n" $0 + } + + function escape(str) { + gsub(/[`\\$"]/, "\\\\&", str) + return str + } + + function trim(str) { + sub(/^\n*/, "", str) + sub(/\n*$/, "", str) + return str + } + + END { + if (usage || summary) { + print "summary=\"" escape(summary) "\"" + print "usage=\"" escape(trim(usage)) "\"" + print "help=\"" escape(trim(help)) "\"" + } + } + ' +} + +documentation_for() { + local filename + filename="$(command_path "$1")" + if [ -n "$filename" ]; then + extract_initial_comment_block < "$filename" | collect_documentation + fi +} + +print_summary() { + local command="$1" + local summary usage help + eval "$(documentation_for "$command")" + + if [ -n "$summary" ]; then + printf " %-9s %s\n" "$command" "$summary" + fi +} + +print_summaries() { + for command; do + print_summary "$command" + done +} + +print_help() { + local command="$1" + local summary usage help + eval "$(documentation_for "$command")" + [ -n "$help" ] || help="$summary" + + if [ -n "$usage" ] || [ -n "$summary" ]; then + if [ -n "$usage" ]; then + echo "$usage" + else + echo "Usage: pyenv ${command}" + fi + if [ -n "$help" ]; then + echo + echo "$help" + echo + fi + else + echo "Sorry, this command isn't documented yet." >&2 + return 1 + fi +} + +print_usage() { + local command="$1" + local summary usage help + eval "$(documentation_for "$command")" + [ -z "$usage" ] || echo "$usage" +} + +unset usage +if [ "$1" = "--usage" ]; then + usage="1" + shift +fi + +if [ -z "$1" ] || [ "$1" == "pyenv" ]; then + echo "Usage: pyenv []" + [ -z "$usage" ] || exit + echo + echo "Some useful pyenv commands are:" + print_summaries $(exec pyenv-commands | sort -u) + echo + echo "See \`pyenv help ' for information on a specific command." + echo "For full documentation, see: https://github.com/pyenv/pyenv#readme" +else + command="$1" + if [ -n "$(command_path "$command")" ]; then + if [ -n "$usage" ]; then + print_usage "$command" + else + print_help "$command" + fi + else + echo "pyenv: no such command \`$command'" >&2 + exit 1 + fi +fi diff --git a/libexec/pyenv-hooks b/libexec/pyenv-hooks new file mode 100755 index 0000000..8e55b07 --- /dev/null +++ b/libexec/pyenv-hooks @@ -0,0 +1,63 @@ +#!/usr/bin/env bash +# Summary: List hook scripts for a given pyenv command +# Usage: pyenv hooks + +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +# Provide pyenv completions +if [ "$1" = "--complete" ]; then + echo exec + echo rehash + echo version-name + echo version-origin + echo which + exit +fi + +PYENV_COMMAND="$1" +if [ -z "$PYENV_COMMAND" ]; then + pyenv-help --usage hooks >&2 + exit 1 +fi + +if ! enable -f "${BASH_SOURCE%/*}"/pyenv-realpath.dylib realpath 2>/dev/null; then + if [ -n "$PYENV_NATIVE_EXT" ]; then + echo "pyenv: failed to load \`realpath' builtin" >&2 + exit 1 + fi +READLINK=$(type -P readlink) +if [ -z "$READLINK" ]; then + echo "pyenv: cannot find readlink - are you missing GNU coreutils?" >&2 + exit 1 +fi + +resolve_link() { + $READLINK "$1" +} + +realpath() { + local path="$1" + local name + # Use a subshell to avoid changing the current path + ( + while [ -n "$path" ]; do + name="${path##*/}" + [ "$name" = "$path" ] || cd "${path%/*}" + path="$(resolve_link "$name" || true)" + done + + echo "${PWD}/$name" + ) +} +fi + +IFS=: hook_paths=($PYENV_HOOK_PATH) + +shopt -s nullglob +for path in "${hook_paths[@]}"; do + for script in "$path/$PYENV_COMMAND"/*.bash; do + realpath "$script" + done +done +shopt -u nullglob diff --git a/libexec/pyenv-init b/libexec/pyenv-init new file mode 100755 index 0000000..36fbf96 --- /dev/null +++ b/libexec/pyenv-init @@ -0,0 +1,363 @@ +#!/usr/bin/env bash +# Summary: Configure the shell environment for pyenv +# Usage: eval "$(pyenv init [-|--path] [--no-push-path] [--detect-shell] [--no-rehash] [])" + +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +# Provide pyenv completions +if [ "$1" = "--complete" ]; then + echo - + echo --path + echo --no-push-path + echo --no-rehash + echo --detect-shell + echo bash + echo fish + echo ksh + echo pwsh + echo zsh + exit +fi + +mode="help" + +while [ "$#" -gt 0 ]; do + case "$1" in + -) + mode="print" + ;; + --path) + mode="path" + ;; + --detect-shell) + mode="detect-shell" + ;; + --no-push-path) + no_push_path=1 + ;; + --no-rehash) + no_rehash=1 + ;; + *) + shell="$1" + ;; + esac + shift +done + +# If shell is not provided, detect it. +if [ -z "$shell" ]; then + if shell=$(tr '\0' ' ' 2>/dev/null &2 +} + +function init_dirs() { + mkdir -p "${PYENV_ROOT}/"{shims,versions} +} + +function print_path() { + # if no_push_path is set, guard the PATH manipulation with a check on whether + # the shim is already in the PATH. + if [ -n "$no_push_path" ]; then + case "$shell" in + fish ) + echo 'if not contains -- "'"${PYENV_ROOT}/shims"'" $PATH' + print_path_prepend_shims + echo 'end' + ;; + pwsh ) + echo 'if ( $Env:PATH -notmatch "'"${PYENV_ROOT}/shims"'" ) {' + print_path_prepend_shims + echo '}' + ;; + * ) + echo 'if [[ ":$PATH:" != *'\':"${PYENV_ROOT}"/shims:\''* ]]; then' + print_path_prepend_shims + echo 'fi' + ;; + esac + else + case "$shell" in + fish ) + echo 'while set pyenv_index (contains -i -- "'"${PYENV_ROOT}/shims"'" $PATH)' + echo 'set -eg PATH[$pyenv_index]; end; set -e pyenv_index' + print_path_prepend_shims + ;; + pwsh ) + echo '$Env:PATH="$(($Env:PATH -split '"':'"' | where { -not ($_ -match '"'${PYENV_ROOT}/shims'"') }) -join '"':'"')"' + print_path_prepend_shims + ;; + * ) + # Some distros (notably Debian-based) set Bash's SSH_SOURCE_BASHRC compilation option + # that makes it source `bashrc` under SSH even when not interactive. + # This is inhibited by a guard in Debian's stock `bashrc` but some people remove it + # in order to get proper environment for noninteractive remote commands + # (SSH provides /etc/ssh/sshrc and ~/.ssh/rc for that but no-one seems to use them for some reason). + # This has caused an infinite `bashrc` execution loop for those people in the below nested Bash invocation (#2367). + # --norc negates this behavior of such a customized Bash. + echo 'PATH="$(bash --norc -ec '\''IFS=:; paths=($PATH); ' + echo 'for i in ${!paths[@]}; do ' + echo 'if [[ ${paths[i]} == "'\'\'"${PYENV_ROOT}/shims"\'\''" ]]; then unset '\'\\\'\''paths[i]'\'\\\'\''; ' + echo 'fi; done; ' + echo 'echo "${paths[*]}"'\'')"' + print_path_prepend_shims + ;; + esac + fi +} + +function print_path_prepend_shims() { + case "$shell" in + fish ) + echo 'set -gx PATH '\'"${PYENV_ROOT}/shims"\'' $PATH' + ;; + pwsh ) + echo '$Env:PATH="'"${PYENV_ROOT}"'/shims:$Env:PATH"' + ;; + * ) + echo 'export PATH="'"${PYENV_ROOT}"'/shims:${PATH}"' + ;; + esac +} + +function print_env() { + case "$shell" in + fish ) + echo "set -gx PYENV_SHELL $shell" + ;; + pwsh ) + echo '$Env:PYENV_SHELL="'"$shell"'"' + ;; + * ) + echo "export PYENV_SHELL=$shell" + ;; + esac +} + +function print_completion() { + completion="${_PYENV_INSTALL_PREFIX}/completions/pyenv.${shell}" + if [ -r "$completion" ]; then + case "$shell" in + pwsh ) + echo "iex (gc $completion -Raw)" + ;; + * ) + echo "source '$completion'" + ;; + esac + fi +} + +function print_rehash() { + if [ -z "$no_rehash" ]; then + case "$shell" in + pwsh ) + echo '& pyenv rehash' + ;; + * ) + echo 'command pyenv rehash' + ;; + esac + fi +} + +function print_shell_function() { + commands=(`pyenv-commands --sh`) + case "$shell" in + fish ) + echo \ +'function pyenv + set command $argv[1] + set -e argv[1] + + switch "$command" + case '"${commands[*]}"' + source (pyenv "sh-$command" $argv|psub) + case "*" + command pyenv "$command" $argv + end +end' + ;; + pwsh ) + cat < +# +# -k/--known Select from all known versions instead of installed +# -b/--bypass (internal) On a resolution failure, do not print an error message +# but rather print the argument unchanged +# -f/--force (internal) Same as -b but also do not return a failure exit code + +set -e +[ -n "$PYENV_DEBUG" ] && set -x + + +while [[ $# -gt 0 ]] +do + case "$1" in + -k|--known) + FROM_KNOWN=1 + shift + ;; + -b|--bypass) + BYPASS=1 + shift + ;; + -f|--force) + FORCE=1 + BYPASS=1 + shift + ;; + *) + break + ;; + esac +done + +prefix=$1 +exitcode=0 + +IFS=$'\n' + + if [[ -z $FROM_KNOWN ]]; then + if [[ -d $PYENV_ROOT/versions/$prefix ]]; then + echo "$prefix" + exit $exitcode; + fi + DEFINITION_CANDIDATES=( $(pyenv-versions --bare --skip-envs) ) + else + DEFINITION_CANDIDATES=( $(python-build --definitions ) ) + fi + + if printf '%s\n' "${DEFINITION_CANDIDATES[@]}" 2>/dev/null | grep -qxFe "$prefix"; then + echo "$prefix" + exit $exitcode; + fi + + suffix="" + if [[ $prefix =~ ^(.*[0-9])t$ ]]; then + suffix="t" + prefix="${BASH_REMATCH[1]}" + fi + + # https://stackoverflow.com/questions/11856054/is-there-an-easy-way-to-pass-a-raw-string-to-grep/63483807#63483807 + prefix_re="$(sed 's/[^\^]/[&]/g;s/[\^]/\\&/g' <<< "$prefix")" + suffix_re="$(sed 's/[^\^]/[&]/g;s/[\^]/\\&/g' <<< "$suffix")" + # FIXME: more reliable and readable would probably be to loop over them and transform in pure Bash + DEFINITION_CANDIDATES=(\ + $(printf '%s\n' "${DEFINITION_CANDIDATES[@]}" | \ + grep -Ee "^$prefix_re[-.].*$suffix_re\$" || true)) + + DEFINITION_CANDIDATES=(\ + $(printf '%s\n' "${DEFINITION_CANDIDATES[@]}" | \ + sed -E -e '/-dev$/d' -e '/-src$/d' -e '/-latest$/d' -e '/(a|b|rc)[0-9]+$/d' \ + $(if [[ -z $suffix ]]; then echo "-e /[0-9]t\$/d"; fi) + )); + + # Compose a sorting key, followed by | and original value + DEFINITION_CANDIDATES=(\ + $(printf '%s\n' "${DEFINITION_CANDIDATES[@]}" | \ + awk \ + '{ if (match($0,"^[[:alnum:]]+-")) + { print substr($0,0,RLENGTH-1) "." substr($0,RLENGTH+1) "..|" $0; } + else + { print $0 "...|" $0; } + }')) + DEFINITION_CANDIDATES=(\ + $(printf '%s\n' "${DEFINITION_CANDIDATES[@]}" \ + | sort -t. -k1,1r -k 2,2nr -k 3,3nr -k4,4nr \ + | cut -f2 -d $'|' \ + || true)) + DEFINITION="${DEFINITION_CANDIDATES[0]}" + + if [[ -n "$DEFINITION" ]]; then + echo "$DEFINITION" + else + if [[ -z $BYPASS ]]; then + echo "pyenv: no $([[ -z $FROM_KNOWN ]] && echo installed || echo known) versions match the prefix \`$prefix'" >&2 + else + echo "$prefix" + fi + if [[ -z $FORCE ]]; then + exitcode=1 + fi + fi + +exit $exitcode diff --git a/libexec/pyenv-local b/libexec/pyenv-local new file mode 100755 index 0000000..a44576a --- /dev/null +++ b/libexec/pyenv-local @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +# +# Summary: Set or show the local application-specific Python version(s) +# +# Usage: pyenv local [-f|--force] [ [...]] +# pyenv local --unset +# +# -f/--force Do not verify that the versions being set exist +# +# Sets the local application-specific Python version(s) by writing the +# version name to a file named `.python-version'. +# +# When you run a Python command, pyenv will look for a `.python-version' +# file in the current directory and each parent directory. If no such +# file is found in the tree, pyenv will use the global Python version +# specified with `pyenv global'. A version specified with the +# `PYENV_VERSION' environment variable takes precedence over local +# and global versions. +# +# can be specified multiple times and should be a version +# tag known to pyenv. The special version string `system' will use +# your default system Python. Run `pyenv versions' for a list of +# available Python versions. +# +# Example: To enable the python2.7 and python3.7 shims to find their +# respective executables you could set both versions with: +# +# 'pyenv local 3.7.0 2.7.15' + + +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +# Provide pyenv completions +if [ "$1" = "--complete" ]; then + echo --unset + echo system + exec pyenv-versions --bare +fi + +while [[ $# -gt 0 ]] +do + case "$1" in + -f|--force) + FORCE=1 + shift + ;; + *) + break + ;; + esac +done + +versions=("$@") + +if [ "$versions" = "--unset" ]; then + rm -f .python-version +elif [ -n "$versions" ]; then + pyenv-version-file-write ${FORCE:+-f }.python-version "${versions[@]}" +else + if version_file="$(pyenv-version-file "$PWD")"; then + IFS=: versions=($(pyenv-version-file-read "$version_file")) + for version in "${versions[@]}"; do + echo "$version" + done + else + echo "pyenv: no local version configured for this directory" >&2 + exit 1 + fi +fi diff --git a/libexec/pyenv-prefix b/libexec/pyenv-prefix new file mode 100755 index 0000000..65bc542 --- /dev/null +++ b/libexec/pyenv-prefix @@ -0,0 +1,62 @@ +#!/usr/bin/env bash +# Summary: Display prefixes for Python versions +# Usage: pyenv prefix [...] +# +# Displays the directories where the given Python versions are installed, +# separated by colons. If no version is given, `pyenv prefix' displays the +# locations of the currently selected versions. + +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +# Provide pyenv completions +if [ "$1" = "--complete" ]; then + echo system + exec pyenv-versions --bare +fi + +if [ -n "$1" ]; then + OLDIFS="$IFS" + { IFS=: + export PYENV_VERSION="$*" + } + IFS="$OLDIFS" +elif [ -z "$PYENV_VERSION" ]; then + PYENV_VERSION="$(pyenv-version-name)" +fi + +PYENV_PREFIX_PATHS=() +OLDIFS="$IFS" +{ IFS=: + for version in ${PYENV_VERSION}; do + if [ "$version" = "system" ]; then + if PYTHON_PATH="$(PYENV_VERSION="${version}" pyenv-which python --skip-advice 2>/dev/null)" || \ + PYTHON_PATH="$(PYENV_VERSION="${version}" pyenv-which python3 --skip-advice 2>/dev/null)" || \ + PYTHON_PATH="$(PYENV_VERSION="${version}" pyenv-which python2 --skip-advice 2>/dev/null)"; then + shopt -s extglob + # In some distros (Arch), Python can be found in sbin as well as bin + PYENV_PREFIX_PATH="${PYTHON_PATH%/?(s)bin/*}" + PYENV_PREFIX_PATH="${PYENV_PREFIX_PATH:-/}" + else + echo "pyenv: system version not found in PATH" >&2 + exit 1 + fi + else + version="$(pyenv-latest -f "$version")" + PYENV_PREFIX_PATH="${PYENV_ROOT}/versions/${version}" + fi + if [ -d "$PYENV_PREFIX_PATH" ]; then + PYENV_PREFIX_PATHS=("${PYENV_PREFIX_PATHS[@]}" "$PYENV_PREFIX_PATH") + else + echo "pyenv: version \`${version}' not installed" >&2 + exit 1 + fi + done +} +IFS="$OLDIFS" + +OLDIFS="$IFS" +{ IFS=: + echo "${PYENV_PREFIX_PATHS[*]}" +} +IFS="$OLDIFS" diff --git a/libexec/pyenv-rehash b/libexec/pyenv-rehash new file mode 100755 index 0000000..253ab68 --- /dev/null +++ b/libexec/pyenv-rehash @@ -0,0 +1,201 @@ +#!/usr/bin/env bash +# Summary: Rehash pyenv shims (run this after installing executables) + +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +SHIM_PATH="${PYENV_ROOT}/shims" +PROTOTYPE_SHIM_PATH="${SHIM_PATH}/.pyenv-shim" + +# Create the shims directory if it doesn't already exist. +mkdir -p "$SHIM_PATH" + +declare last_acquire_error + +acquire_lock() { + # Ensure only one instance of pyenv-rehash is running at a time by + # setting the shell's `noclobber` option and attempting to write to + # the prototype shim file. If the file already exists, print a warning + # to stderr and exit with a non-zero status. + local ret + set -o noclobber + last_acquire_error="$( { ( echo -n > "$PROTOTYPE_SHIM_PATH"; ) 2>&1 1>&3 3>&1-; } 3>&1)" || ret=1 + set +o noclobber + [ -z "${ret}" ] +} + +remove_prototype_shim() { + rm -f "$PROTOTYPE_SHIM_PATH" +} + +release_lock() { + remove_prototype_shim +} + +if [ ! -w "$SHIM_PATH" ]; then + echo "pyenv: cannot rehash: $SHIM_PATH isn't writable" >&2 + exit 1 +fi + +declare acquired tested_for_other_write_errors +declare start=$SECONDS +PYENV_REHASH_TIMEOUT=${PYENV_REHASH_TIMEOUT:-60} +while (( SECONDS <= start + PYENV_REHASH_TIMEOUT )); do + if acquire_lock; then + acquired=1 + + # If we were able to obtain a lock, register a trap to clean up the + # prototype shim when the process exits. + trap release_lock EXIT + + break + else + #Landlock sandbox subsystem in the Linux kernel returns false information in access() as of 6.14.0, + # making -w "$SHIM_PATH" not catch the fact that the shims dir is not writable in this case. + #Bash doesn't provide access to errno to check for non-EEXIST error code in acquire_lock. + #So check for writablity by trying to write to a different file, + # in a way that taxes the usual use case as little as possible. + if [[ -z $tested_for_other_write_errors ]]; then + ( t="$(TMPDIR="$SHIM_PATH" mktemp)" && rm "$t" ) && tested_for_other_write_errors=1 || + { echo "pyenv: cannot rehash: $SHIM_PATH isn't writable" >&2; break; } + fi + # POSIX sleep(1) doesn't provide subsecond precision, but many others do + sleep 0.1 2>/dev/null || sleep 1 + fi +done + +if [ -z "${acquired}" ]; then + if [[ -n $tested_for_other_write_errors ]]; then + echo "pyenv: cannot rehash: couldn't acquire lock"\ + "$PROTOTYPE_SHIM_PATH for $PYENV_REHASH_TIMEOUT seconds. Last error message:" >&2 + echo "$last_acquire_error" >&2 + fi + exit 1 +fi +unset tested_for_other_write_errors + +# The prototype shim file is a script that re-execs itself, passing +# its filename and any arguments to `pyenv exec`. This file is +# hard-linked for every executable and then removed. The linking +# technique is fast, uses less disk space than unique files, and also +# serves as a locking mechanism. +create_prototype_shim() { + cat > "$PROTOTYPE_SHIM_PATH" </dev/null 2>&1; then + rm -f "$SHIM_PATH"/* + fi + break + done +} + +# The basename of each argument passed to `make_shims` will be +# registered for installation as a shim. In this way, plugins may call +# `make_shims` with a glob to register many shims at once. +make_shims() { + local file shim + for file; do + shim="${file##*/}" + register_shim "$shim" + done +} + +if ((${BASH_VERSINFO[0]} > 3)); then + + declare -A registered_shims + + # Registers the name of a shim to be generated. + register_shim() { + registered_shims["$1"]=1 + } + + # Install all shims registered via `make_shims` or `register_shim` directly. + install_registered_shims() { + local shim file + for shim in "${!registered_shims[@]}"; do + file="${SHIM_PATH}/${shim}" + [ -e "$file" ] || cp "$PROTOTYPE_SHIM_PATH" "$file" + done + } + + # Once the registered shims have been installed, we make a second pass + # over the contents of the shims directory. Any file that is present + # in the directory but has not been registered as a shim should be + # removed. + remove_stale_shims() { + local shim + for shim in "$SHIM_PATH"/*; do + if [[ ! ${registered_shims["${shim##*/}"]} ]]; then + rm -f "$shim" + fi + done + } + +else # Same for bash < 4. + + registered_shims=" " + + register_shim() { + registered_shims="${registered_shims}${1} " + } + + install_registered_shims() { + local shim file + for shim in $registered_shims; do + file="${SHIM_PATH}/${shim}" + [ -e "$file" ] || cp "$PROTOTYPE_SHIM_PATH" "$file" + done + } + + remove_stale_shims() { + local shim + for shim in "$SHIM_PATH"/*; do + if [[ "$registered_shims" != *" ${shim##*/} "* ]]; then + rm -f "$shim" + fi + done + } +fi + +shopt -s nullglob + +# Create the prototype shim, then register shims for all known +# executables. +create_prototype_shim +remove_outdated_shims +# shellcheck disable=SC2046 +make_shims $(pyenv-versions --executables) + + +# Allow plugins to register shims. +OLDIFS="$IFS" +IFS=$'\n' scripts=(`pyenv-hooks rehash`) +IFS="$OLDIFS" + +for script in "${scripts[@]}"; do + source "$script" +done + +install_registered_shims +remove_stale_shims diff --git a/libexec/pyenv-root b/libexec/pyenv-root new file mode 100755 index 0000000..b4a135f --- /dev/null +++ b/libexec/pyenv-root @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +# Summary: Display the root directory where versions and shims are kept +echo "$PYENV_ROOT" diff --git a/libexec/pyenv-sh-rehash b/libexec/pyenv-sh-rehash new file mode 100755 index 0000000..afa5c79 --- /dev/null +++ b/libexec/pyenv-sh-rehash @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +# Provide pyenv completions +if [ "$1" = "--complete" ]; then + exec pyenv-rehash --complete +fi + +shell="$(basename "${PYENV_SHELL:-$SHELL}")" + +# When pyenv shell integration is enabled, delegate to pyenv-rehash, +# then tell the shell to empty its command lookup cache. +case "$shell" in +pwsh) + echo "& (get-command pyenv -commandtype application) rehash" + ;; +*) + echo "command pyenv rehash" +esac + +case "$shell" in +fish | pwsh ) + # no executable cache + ;; +* ) + echo "hash -r 2>/dev/null || true" + ;; +esac diff --git a/libexec/pyenv-sh-shell b/libexec/pyenv-sh-shell new file mode 100755 index 0000000..289ba42 --- /dev/null +++ b/libexec/pyenv-sh-shell @@ -0,0 +1,137 @@ +#!/usr/bin/env bash +# +# Summary: Set or show the shell-specific Python version +# +# Usage: pyenv shell ... +# pyenv shell - +# pyenv shell --unset +# +# Sets a shell-specific Python version by setting the `PYENV_VERSION' +# environment variable in your shell. This version overrides local +# application-specific versions and the global version. +# +# should be a string matching a Python version known to pyenv. +# The special version string `system' will use your default system Python. +# Run `pyenv versions' for a list of available Python versions. +# +# When `-` is passed instead of the version string, the previously set +# version will be restored. With `--unset`, the `PYENV_VERSION` +# environment variable gets unset, restoring the environment to the +# state before the first `pyenv shell` call. + +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +# Provide pyenv completions +if [ "$1" = "--complete" ]; then + echo --unset + echo system + exec pyenv-versions --bare +fi + +versions=("$@") +shell="$(basename "${PYENV_SHELL:-$SHELL}")" + +if [ -z "$versions" ]; then + if [ -z "$PYENV_VERSION" ]; then + echo "pyenv: no shell-specific version configured" >&2 + exit 1 + else + echo 'echo "$PYENV_VERSION"' + exit + fi +fi + +if [ "$versions" = "--unset" ]; then + case "$shell" in + fish ) + echo 'set -gu PYENV_VERSION_OLD "$PYENV_VERSION"' + echo "set -e PYENV_VERSION" + ;; + pwsh ) + echo '$Env:PYENV_VERSION, $Env:PYENV_VERSION_OLD = $null, $Env:PYENV_VERSION' + ;; + * ) + echo 'PYENV_VERSION_OLD="${PYENV_VERSION-}"' + echo "unset PYENV_VERSION" + ;; + esac + exit +fi + +if [ "$versions" = "-" ]; then + case "$shell" in + fish ) + cat <&2 + false +end +EOS + ;; + pwsh ) + cat <&2 + false +fi +EOS + ;; + esac + exit +fi + +# Make sure the specified version is installed. +if pyenv-prefix "${versions[@]}" >/dev/null; then + OLDIFS="$IFS" + IFS=: version="${versions[*]}" + IFS="$OLDIFS" + if [ "$version" != "$PYENV_VERSION" ]; then + case "$shell" in + fish ) + echo 'set -gu PYENV_VERSION_OLD "$PYENV_VERSION"' + echo "set -gx PYENV_VERSION \"$version\"" + ;; + pwsh ) + echo '$Env:PYENV_VERSION, $Env:PYENV_VERSION_OLD = "'"${version}"'", $Env:PYENV_VERSION' + ;; + * ) + echo 'PYENV_VERSION_OLD="${PYENV_VERSION-}"' + echo "export PYENV_VERSION=\"${version}\"" + ;; + esac + fi +else + echo "false" + exit 1 +fi diff --git a/libexec/pyenv-shims b/libexec/pyenv-shims new file mode 100755 index 0000000..43c6308 --- /dev/null +++ b/libexec/pyenv-shims @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +# Summary: List existing pyenv shims +# Usage: pyenv shims [--short] + +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +# Provide pyenv completions +if [ "$1" = "--complete" ]; then + echo --short + exit +fi + +shopt -s nullglob + +for command in "${PYENV_ROOT}/shims/"*; do + if [ "$1" = "--short" ]; then + echo "${command##*/}" + else + echo "$command" + fi +done | sort diff --git a/libexec/pyenv-version b/libexec/pyenv-version new file mode 100755 index 0000000..75e2287 --- /dev/null +++ b/libexec/pyenv-version @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +# Summary: Show the current Python version(s) and its origin +# Usage: pyenv version [--bare] +# +# --bare show just the version name. An alias to `pyenv version-name' + +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +exitcode=0 +OLDIFS="$IFS" +IFS=: PYENV_VERSION_NAMES=($(pyenv-version-name)) || exitcode=$? +IFS="$OLDIFS" + +unset bare +for arg; do + case "$arg" in + --complete ) + echo --bare + exit ;; + --bare ) bare=1 ;; + * ) + pyenv-help --usage version >&2 + exit 1 + ;; + esac +done +for PYENV_VERSION_NAME in "${PYENV_VERSION_NAMES[@]}"; do + if [[ -n $bare ]]; then + echo "$PYENV_VERSION_NAME" + else + echo "$PYENV_VERSION_NAME (set by $(pyenv-version-origin))" + fi +done + +exit $exitcode diff --git a/libexec/pyenv-version-file b/libexec/pyenv-version-file new file mode 100755 index 0000000..91d8b0d --- /dev/null +++ b/libexec/pyenv-version-file @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +# Usage: pyenv version-file [

] +# Summary: Detect the file that sets the current pyenv version +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +target_dir="$1" + +find_local_version_file() { + local root="$1" + while ! [[ "$root" =~ ^//[^/]*$ ]]; do + if [ -f "${root}/.python-version" ]; then + echo "${root}/.python-version" + return 0 + fi + [ -n "$root" ] || break + root="${root%/*}" + done + return 1 +} + +if [ -n "$target_dir" ]; then + find_local_version_file "$target_dir" +else + find_local_version_file "$PYENV_DIR" || { + [ "$PYENV_DIR" != "$PWD" ] && find_local_version_file "$PWD" + } || echo "${PYENV_ROOT}/version" +fi diff --git a/libexec/pyenv-version-file-read b/libexec/pyenv-version-file-read new file mode 100755 index 0000000..7865a73 --- /dev/null +++ b/libexec/pyenv-version-file-read @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +# Usage: pyenv version-file-read +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +VERSION_FILE="$1" + +function is_version_safe() { + # As needed, check that the constructed path exists as a child path of PYENV_ROOT/versions + version="$1" + if [[ "$version" == ".." || "$version" == */* ]]; then + # Sanity check the value of version to prevent malicious path-traversal + ( + cd "$PYENV_ROOT/versions/$version" &>/dev/null || exit 1 + [[ "$PWD" == "$PYENV_ROOT/versions/"* ]] + ) + return $? + else + return 0 + fi +} + +if [ -s "$VERSION_FILE" ]; then + # Read the first non-whitespace word from the specified version file. + # Be careful not to load it whole in case there's something crazy in it. + IFS="$IFS"$'\r' + sep= + while read -n 1024 -r version _ || [[ $version ]]; do + if [[ -z "$version" || "$version" == \#* ]]; then + # Skip empty lines and comments + continue + elif ! is_version_safe "$version"; then + # CVE-2022-35861 allowed arbitrary code execution in some contexts and is mitigated by is_version_safe. + echo "pyenv: invalid version \`$version' ignored in \`$VERSION_FILE'" >&2 + continue + fi + printf "%s%s" "$sep" "$version" + sep=: + done <"$VERSION_FILE" + [[ $sep ]] && { echo; exit; } +fi + +exit 1 diff --git a/libexec/pyenv-version-file-write b/libexec/pyenv-version-file-write new file mode 100755 index 0000000..db9e0f3 --- /dev/null +++ b/libexec/pyenv-version-file-write @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +# Usage: pyenv version-file-write [-f|--force] [...] +# +# -f/--force Don't verify that the versions exist + +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +while [[ $# -gt 0 ]] +do + case "$1" in + -f|--force) + FORCE=1 + shift + ;; + *) + break + ;; + esac +done + + +PYENV_VERSION_FILE="$1" +shift || true +versions=("$@") + +if [ -z "$versions" ] || [ -z "$PYENV_VERSION_FILE" ]; then + pyenv-help --usage version-file-write >&2 + exit 1 +fi + +# Make sure the specified version is installed. +[[ -z $FORCE ]] && pyenv-prefix "${versions[@]}" >/dev/null + +# Write the version out to disk. +# Create an empty file. Using "rm" might cause a permission error. +> "$PYENV_VERSION_FILE" +for version in "${versions[@]}"; do + echo "$version" >> "$PYENV_VERSION_FILE" +done diff --git a/libexec/pyenv-version-name b/libexec/pyenv-version-name new file mode 100755 index 0000000..f7c57ef --- /dev/null +++ b/libexec/pyenv-version-name @@ -0,0 +1,80 @@ +#!/usr/bin/env bash +# Summary: Show the current Python version +# +# -f/--force (Internal) If a version doesn't exist, print it as is rather than produce an error + +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +while [[ $# -gt 0 ]] +do + case "$1" in + -f|--force) + FORCE=1 + shift + ;; + *) + break + ;; + esac +done + + +if [ -z "$PYENV_VERSION" ]; then + PYENV_VERSION_FILE="$(pyenv-version-file)" + PYENV_VERSION="$(pyenv-version-file-read "$PYENV_VERSION_FILE" || true)" +fi + +OLDIFS="$IFS" +IFS=$'\n' scripts=(`pyenv-hooks version-name`) +IFS="$OLDIFS" +for script in "${scripts[@]}"; do + source "$script" +done + +if [ -z "$PYENV_VERSION" ] || [ "$PYENV_VERSION" = "system" ]; then + echo "system" + exit +fi + +version_exists() { + local version="$1" + [ -d "${PYENV_ROOT}/versions/${version}" ] +} + +versions=() +OLDIFS="$IFS" +{ IFS=: + any_not_installed=0 + for version in ${PYENV_VERSION}; do + # Remove the explicit 'python-' prefix from versions like 'python-3.12'. + normalised_version="${version#python-}" + if version_exists "${version}" || [ "$version" = "system" ]; then + versions+=("${version}") + elif version_exists "${normalised_version}"; then + versions+=("${normalised_version}") + elif resolved_version="$(pyenv-latest -b "${version}")"; then + versions+=("${resolved_version}") + elif resolved_version="$(pyenv-latest -b "${normalised_version}")"; then + versions+=("${resolved_version}") + else + if [[ -n $FORCE ]]; then + versions+=("${normalised_version}") + else + echo "pyenv: version \`$version' is not installed (set by $(pyenv-version-origin))" >&2 + any_not_installed=1 + fi + fi + done +} +IFS="$OLDIFS" + +OLDIFS="$IFS" +{ IFS=: + echo "${versions[*]}" +} +IFS="$OLDIFS" + +if [ "$any_not_installed" = 1 ]; then + exit 1 +fi diff --git a/libexec/pyenv-version-origin b/libexec/pyenv-version-origin new file mode 100755 index 0000000..1067a01 --- /dev/null +++ b/libexec/pyenv-version-origin @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +# Summary: Explain how the current Python version is set +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +unset PYENV_VERSION_ORIGIN + +OLDIFS="$IFS" +IFS=$'\n' scripts=(`pyenv-hooks version-origin`) +IFS="$OLDIFS" +for script in "${scripts[@]}"; do + source "$script" +done + +if [ -n "$PYENV_VERSION_ORIGIN" ]; then + echo "$PYENV_VERSION_ORIGIN" +elif [ -n "$PYENV_VERSION" ]; then + echo "PYENV_VERSION environment variable" +else + pyenv-version-file +fi diff --git a/libexec/pyenv-versions b/libexec/pyenv-versions new file mode 100755 index 0000000..bfd67c7 --- /dev/null +++ b/libexec/pyenv-versions @@ -0,0 +1,195 @@ +#!/usr/bin/env bash +# Summary: List all Python versions available to pyenv +# Usage: pyenv versions [--bare] [--skip-aliases] [--skip-envs] [--executables] +# +# Lists all Python versions found in `$PYENV_ROOT/versions/*'. +# +# --bare List just the names, omit `system' +# --skip-aliases Skip symlinks to other versions and to virtual environments +# --skip-envs Skip virtual environments (under /envs) +# --executables Internal. Overrides other options. +# Optimally get a deduplicated list of all executable names in Pyenv-managed +# versions and environments for `pyenv rehash' +# + +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +unset bare skip_aliases skip_envs executables +# Provide pyenv completions +for arg; do + case "$arg" in + --complete ) + echo --bare + echo --skip-aliases + echo --skip-envs + exit ;; + --executables ) executables=1; break ;; + --bare ) bare=1 ;; + --skip-aliases ) skip_aliases=1 ;; + --skip-envs ) skip_envs=1 ;; + * ) + pyenv-help --usage versions >&2 + exit 1 + ;; + esac +done + + +versions_dir="${PYENV_ROOT}/versions" + +# Fast path for rehash: skip filtering and link resolution +if [[ -n "$executables" ]]; then + if [ -d "$versions_dir" ]; then + shopt -s dotglob nullglob + # MacOS 12+ and FreeBSD 15 support `xargs -r -0' and `basename -a' + # `sort -u` is simpler and a bit faster than `awk '!seen[$0]++'`, with the same result for rehash purposes + printf '%s\0' "$versions_dir"/*/bin/* "$versions_dir"/*/envs/*/bin/* | xargs -0 -r basename -a | sort -u + shopt -u dotglob nullglob + fi + exit 0 +fi + +if ! enable -f "${BASH_SOURCE%/*}"/pyenv-realpath.dylib realpath 2>/dev/null; then + if [ -n "$PYENV_NATIVE_EXT" ]; then + echo "pyenv: failed to load \`realpath' builtin" >&2 + exit 1 + fi + + READLINK=$(type -P readlink) + if [ -z "$READLINK" ]; then + echo "pyenv: cannot find readlink - are you missing GNU coreutils?" >&2 + exit 1 + fi + + resolve_link() { + $READLINK "$1" + } + + realpath() { + local path="$1" + local name + + # Use a subshell to avoid changing the current path + ( + while [ -n "$path" ]; do + name="${path##*/}" + [ "$name" = "$path" ] || cd "${path%/*}" + path="$(resolve_link "$name" || true)" + done + + echo "${PWD}/$name" + ) + } +fi + +if [ -d "$versions_dir" ]; then + versions_dir="$(realpath "$versions_dir")" +fi + +if ((${BASH_VERSINFO[0]} > 3)); then + declare -A current_versions +else + current_versions=() +fi +if [ -n "$bare" ]; then + include_system="" +else + hit_prefix="* " + miss_prefix=" " + OLDIFS="$IFS" + IFS=: + if ((${BASH_VERSINFO[0]} > 3)); then + for i in $(pyenv-version-name || true); do + current_versions["$i"]="1" + done + else + current_versions=($(pyenv-version-name || true)) + fi + IFS="$OLDIFS" + include_system="1" +fi + +num_versions=0 + +exists() { + local car="$1" + local cdar + shift + for cdar in "$@"; do + if [ "${car}" == "${cdar}" ]; then + return 0 + fi + done + return 1 +} + +print_version() { + local version="${1:?}" + if [[ -n $bare ]]; then + echo "$version" + return + fi + local path="${2:?}" + if [[ -L "$path" ]]; then + # Only resolve the link itself for printing, do not resolve further. + # Doing otherwise would misinform the user of what the link contains. + version_repr="$version --> $(readlink "$path")" + else + version_repr="$version" + fi + if [[ ${BASH_VERSINFO[0]} -ge 4 && ${current_versions["$1"]} ]]; then + echo "${hit_prefix}${version_repr} (set by $(pyenv-version-origin))" + elif (( ${BASH_VERSINFO[0]} <= 3 )) && exists "$1" "${current_versions[@]}"; then + echo "${hit_prefix}${version_repr} (set by $(pyenv-version-origin))" + else + echo "${miss_prefix}${version_repr}" + fi + num_versions=$((num_versions + 1)) +} + +# Include "system" in the non-bare output, if it exists +if [ -n "$include_system" ] && \ + (PYENV_VERSION=system pyenv-which python --skip-advice >/dev/null 2>&1 || \ + PYENV_VERSION=system pyenv-which python3 --skip-advice >/dev/null 2>&1 || \ + PYENV_VERSION=system pyenv-which python2 --skip-advice >/dev/null 2>&1) ; then + print_version system "/" +fi + +shopt -s dotglob nullglob +versions_dir_entries=("$versions_dir"/*) +if sort --version-sort /dev/null 2>&1; then + # system sort supports version sorting + OLDIFS="$IFS" + IFS=$'\n' + versions_dir_entries=($( + printf "%s\n" "${versions_dir_entries[@]}" | + sort --version-sort + )) + IFS="$OLDIFS" +fi + +for path in "${versions_dir_entries[@]}"; do + if [ -d "$path" ]; then + if [ -n "$skip_aliases" ] && [ -L "$path" ]; then + target="$(realpath "$path")" + [ "${target%/*}" == "$versions_dir" ] && continue + [ "${target%/*/envs/*}" == "$versions_dir" ] && continue + fi + print_version "${path##*/}" "$path" + # virtual environments created by anaconda/miniconda/pyenv-virtualenv + if [[ -z $skip_envs ]]; then + for env_path in "${path}/envs/"*; do + if [ -d "${env_path}" ]; then + print_version "${env_path#${PYENV_ROOT}/versions/}" "${env_path}" + fi + done + fi + fi +done +shopt -u dotglob nullglob + +if [ "$num_versions" -eq 0 ] && [ -n "$include_system" ]; then + echo "Warning: no Python detected on the system" >&2 + exit 1 +fi diff --git a/libexec/pyenv-whence b/libexec/pyenv-whence new file mode 100755 index 0000000..fddcf11 --- /dev/null +++ b/libexec/pyenv-whence @@ -0,0 +1,38 @@ +#!/usr/bin/env bash +# Summary: List all Python versions that contain the given executable +# Usage: pyenv whence [--path] + +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +# Provide pyenv completions +if [ "$1" = "--complete" ]; then + echo --path + exec pyenv-shims --short +fi + +if [ "$1" = "--path" ]; then + print_paths="1" + shift +else + print_paths="" +fi + +whence() { + local command="$1" + pyenv-versions --bare | while read -r version; do + path="$(pyenv-prefix "$version")/bin/${command}" + if [ -x "$path" ]; then + [ "$print_paths" ] && echo "$path" || echo "$version" + fi + done +} + +PYENV_COMMAND="$1" +if [ -z "$PYENV_COMMAND" ]; then + pyenv-help --usage whence >&2 + exit 1 +fi + +result="$(whence "$PYENV_COMMAND")" +[ -n "$result" ] && echo "$result" diff --git a/libexec/pyenv-which b/libexec/pyenv-which new file mode 100755 index 0000000..4cdcfeb --- /dev/null +++ b/libexec/pyenv-which @@ -0,0 +1,122 @@ +#!/usr/bin/env bash +# +# Summary: Display the full path to an executable +# +# Usage: pyenv which [--nosystem] [--skip-advice] +# +# Displays the full path to the executable that pyenv will invoke when +# you run the given command. +# Use --nosystem argument in case when you don't need to search command in the +# system environment. +# Internal switch --skip-advice used to skip printing an error message on a +# failed search. + +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +# Provide pyenv completions +if [ "$1" = "--complete" ]; then + exec pyenv-shims --short +fi + +system="system" +SKIP_ADVICE="" +PYENV_COMMAND="$1" + +while [[ $# -gt 0 ]] +do + case "$1" in + --skip-advice) + SKIP_ADVICE=1 + shift + ;; + --nosystem) + system="" + shift + ;; + *) + shift + ;; + esac +done + + +remove_from_path() { + local -a paths_to_remove + IFS=: paths_to_remove=($1) + local path_to_remove path_before + local result=":${PATH//\~/$HOME}:" + for path_to_remove in "${paths_to_remove[@]}"; do + while true; do + path_before="$result" + result="${result//:$path_to_remove:/:}" + if [[ ${#path_before} == "${#result}" ]]; then break; fi + done + done + result="${result:1:${#result}-2}" + echo "$result" +} + +if [ -z "$PYENV_COMMAND" ]; then + pyenv-help --usage which >&2 + exit 1 +fi + +OLDIFS="$IFS" +IFS=: versions=(${PYENV_VERSION:-$(pyenv-version-name -f)}) +IFS="$OLDIFS" + +declare -a nonexistent_versions + +for version in "${versions[@]}" "$system"; do + if [ "$version" = "system" ]; then + PROGRAM="$(echo "$PYENV_COMMAND" | tr a-z- A-Z_ | sed 's/[^A-Z0-9_]/_/g')" + NR_CUSTOM_SHIM_PATHS="_PYENV_SHIM_PATHS_$PROGRAM" + SEARCH_PATH="$(remove_from_path "${PYENV_ROOT}/shims${!NR_CUSTOM_SHIM_PATHS:+:${!NR_CUSTOM_SHIM_PATHS}}")" + PYENV_COMMAND_PATH="$(PATH="$SEARCH_PATH" command -v "$PYENV_COMMAND" || true)" + else + # $version may be a prefix to be resolved by pyenv-latest + version_path="$(pyenv-prefix "${version}" 2>/dev/null)" || \ + { nonexistent_versions+=("$version"); continue; } + # resolve $version for hooks + version="$(basename "$version_path")" + PYENV_COMMAND_PATH="$version_path/bin/${PYENV_COMMAND}" + unset version_path + fi + if [ -x "$PYENV_COMMAND_PATH" ]; then + break + fi +done + +OLDIFS="$IFS" +IFS=$'\n' scripts=(`pyenv-hooks which`) +IFS="$OLDIFS" +for script in "${scripts[@]}"; do + source "$script" +done + +if [ -x "$PYENV_COMMAND_PATH" ]; then + echo "$PYENV_COMMAND_PATH" +else + if (( ${#nonexistent_versions[@]} )); then + for version in "${nonexistent_versions[@]}"; do + echo "pyenv: version \`$version' is not installed (set by $(pyenv-version-origin))" >&2 + done + fi + + echo "pyenv: $PYENV_COMMAND: command not found" >&2 + if [ -z "$SKIP_ADVICE" ]; then + versions="$(pyenv-whence "$PYENV_COMMAND" || true)" + if [ -n "$versions" ]; then + { echo + echo "The \`$PYENV_COMMAND' command exists in these Python versions:" + echo "$versions" | sed 's/^/ /g' + echo + echo "Note: See 'pyenv help global' for tips on allowing multiple" + echo " Python versions to be found at the same time." + } >&2 + fi + fi + + exit 127 +fi diff --git a/man/man1/pyenv.1 b/man/man1/pyenv.1 new file mode 100644 index 0000000..106c257 --- /dev/null +++ b/man/man1/pyenv.1 @@ -0,0 +1,550 @@ +.TH PYENV 1 "24 Apr 2023" "PYENV" +.SH NAME +pyenv \- Simple Python version management +.SH SYNOPSIS +.B pyenv +\fI\, \/\fR[\fI\,\/\fR] +.SH DESCRIPTION +pyenv lets you easily switch between multiple versions of Python\. It's simple, unobtrusive, and follows the UNIX tradition of single\-purpose tools that do one thing well\. +.P + To start using pyenv +.IP "1." 3 +\fBAppend\fR the following to \fB$HOME/.bashrc\fR +.P +.RS 15 +.nf +if command -v pyenv 1>/dev/null 2>&1; then\n + eval "$(pyenv init - bash)" \n +fi +.fi +.RE +.RS 3 +.P +.nh +Appending this line enables shims. Please make sure this line is placed toward the end of the shell configuration file since it manipulates \fBPATH\fR during the initialization\. +.hy +.TP 13 +.B Debian note: +Modify only your \fB~/\.bashrc\fR file instead of creating +.br +\fB~/\.bash_profile\fR +.P +.RS 0 +\fBZsh note\fR: Modify your \fB~/\.zshrc\fR file instead of \fB~/\.bashrc\fR +.P +\fBWarning\fR: If you configured your system so that \fBBASH_ENV\fR variable points to \fB\.bashrc\fR\. You should almost certainly put the above mentioned line into \fB\.bash_profile\fR, and \fBnot\fR into \fB\.bashrc\fR. Otherwise you may observe strange behaviour, such as \fBpyenv\fR getting into an infinite loop. See #264 +.UR https://github\.com/pyenv/pyenv/issues/264 +.UE +for details. +.RE +.RE +.IP "2." 3 +\fBRestart your shell so the path changes take effect\.\fR You can now begin using pyenv\. +.P +.RS 15 +exec "$SHELL"\fR +.RE +.IP "3." 3 +\fBInstall Python versions into \fB$(pyenv root)/versions\fR\.\fR For example, to download and install Python 3\.6\.12, run: +.P +.RS 15 +.B pyenv install 3.6.12\fR +.RE +.P +\fBNOTE:\fR If you need to pass configure option to build, please use \fBCONFIGURE_OPTS\fR environment variable. If you are having trouble installing a python version, please visit the wiki page about Common Build Problems +.UR https://github\.com/pyenv/pyenv/wiki/Common\-build\-problems +.UE +.P +\fBProxy note\fR: If you use a proxy, export \fBHTTP_PROXY\fR and \fBHTTPS_PROXY\fR environment variables. +.P +.SS "Stop using pyenv" +The simplicity of pyenv makes it easy to temporarily disable it, or uninstall from the system\. +To \fBdisable\fR pyenv managing your Python versions, simply remove the \fBpyenv init\fR line from your shell startup configuration\. This will remove pyenv shims directory from PATH, and future invocations like \fBpython\fR will execute the system Python version, as before pyenv\. +.IP "" 0 +.P +\fBpyenv\fR will still be accessible on the command line, but your Python apps won't be affected by version switching\. +.IP "" 0 +.SH COMMAND LINE OPTIONS +Like \fBgit\fR, the \fBpyenv\fR command delegates to subcommands based on its first argument\. +.SS "Some useful pyenv commands are:" +.TP 5 +.B commands +List all available pyenv commands +.TP +.B exec +Run an executable with the selected Python version +.TP +.B global +Set or show the global Python version(s) +.TP +.B help +Display help for a command +.TP +.B hooks +List hook scripts for a given pyenv command +.TP +.B init +Configure the shell environment for pyenv +.TP +.B install +Install a Python version using python\-build +.TP +.B local +Set or show the local application\-specific Python version(s) +.TP +.B prefix +Display prefix for a Python version +.TP +.B rehash +Rehash pyenv shims (run this after installing executables) +.TP +.B root +Display the root directory where versions and shims are kept +.TP +.B shell +Set or show the shell\-specific Python version +.TP +.B shims +List existing pyenv shims +.TP +.B uninstall +Uninstall Python versions +.TP +.B version +Show the current Python version(s) and its origin +.TP +.B version\-file +Detect the file that sets the current pyenv version +.TP +.B version\-name +Show the current Python version +.TP +.B version\-origin +Explain how the current Python version is set +.TP +.B versions +List all Python versions available to pyenv +.TP +.B whence +List all Python versions that contain the given executable +.TP +.B which +Display the full path to an executable +.PP +See `pyenv help ' for information on a specific command. +For full documentation, see \fBCOMMAND REFERENCE\fR section +.SH OPTIONS +.TP +.B \-h, \-\-help +Show summary of options. +.TP +.B \-v, \-\-version +Show version of program. +.SH COMPARISON +.P +.B "pyenv does\|\.\|\.\|\. +.P +.IP \(bu 4 +Let you \fBchange the global Python version\fR on a per\-user basis\. +.IP \(bu 4 +Provide support for \fBper\-project Python versions\fR\. +.IP \(bu 4 +Allow you to \fBoverride the Python version\fR with an environment variable\. +.IP \(bu 4 +Search commands from \fBmultiple versions of Python at a time\fR\. This may be helpful to test across Python versions with tox +.IP "" 0 +.P +.B "In contrast with pythonbrew and pythonz, pyenv does not\|\.\|\.\|\." +.IP \(bu 4 +\fBDepend on Python itself\.\fR pyenv was made from pure shell scripts\. There is no bootstrap problem of Python\. +.IP \(bu 4 +\fBNeed to be loaded into your shell\.\fR Instead, pyenv's shim approach works by adding a directory to your \fB$PATH\fR\. +.IP \(bu 4 +\fBManage virtualenv\.\fR Of course, you can create virtualenv yourself, or pyenv\-virtualenv to automate the process\. +.SH "How It Works" +At a high level, pyenv intercepts Python commands using shim executables injected into your \fBPATH\fR, determines which Python version has been specified by your application, and passes your commands along to the correct Python installation\. +.SS "Understanding PATH" +When you run a command like \fBpython\fR or \fBpip\fR, your operating system searches through a list of directories to find an executable file with that name\. This list of directories lives in an environment variable called \fBPATH\fR, with each directory in the list separated by a colon: +.IP "" 4 +.nf +/usr/local/bin:/usr/bin:/bin +.fi +.IP "" 0 +.P +Directories in \fBPATH\fR are searched from left to right, so a matching executable in a directory at the beginning of the list takes precedence over another one at the end\. In this example, the \fB/usr/local/bin\fR directory will be searched first, then \fB/usr/bin\fR, then \fB/bin\fR\. +.SS "Understanding Shims" +pyenv works by inserting a directory of \fIshims\fR at the front of your \fBPATH\fR: +.IP "" 4 +.nf +$(pyenv root)/shims:/usr/local/bin:/usr/bin:/bin +.fi +.IP "" 0 +.P +Through a process called \fIrehashing\fR, pyenv maintains shims in that directory to match every Python command (\fBpython\fR,\fBpip\fR,etc...) across every installed version of Python +.P +Shims are lightweight executables that simply pass your command along to pyenv\. So with pyenv installed, when you run, say, \fBpip\fR, your operating system will do the following: +.IP \(bu 4 +Search your \fBPATH\fR for an executable file named \fBpip\fR +.IP \(bu 4 +Find the pyenv shim named \fBpip\fR at the beginning of your \fBPATH\fR +.IP \(bu 4 +Run the shim named \fBpip\fR, which in turn passes the command along to pyenv +.IP "" 0 +.SS "Choosing the Python Version" +When you execute a shim, pyenv determines which Python version to use by reading it from the following sources, in this order: +.IP "1." 4 +The \fBPYENV_VERSION\fR environment variable (if specified)\. You can use the \fBpyenv shell\fR command to set this environment variable in your current shell session\. +.IP "2." 4 +The application\-specific \fB\.python\-version\fR file in the current directory (if present)\. You can modify the current directory's \fB\.python\-version\fR file with the \fBpyenv local\fR command\. +.IP "3." 4 +The first \fB\.python\-version\fR file found (if any) by searching each parent directory, until reaching the root of your filesystem\. +.IP "4." 4 +The global \fB$(pyenv root)/version\fR file\. You can modify this file using the \fBpyenv global\fR command\. If the global version file is not present, pyenv assumes you want to use the "system" Python\. (In other words, whatever version would run if pyenv weren't in your \fBPATH\fR\.) +.IP "" 0 +.P +.nh +\fBNOTE:\fR You can activate multiple versions at the same time, including multiple versions of Python2 or Python3 simultaneously\. This allows for parallel usage of Python2 and Python3, and is required with tools like \fBtox\fR\. For example, to set your path to first use your \fBsystem\fR Python and Python3 (set to 2\.7\.9 and 3\.4\.2 in this example), but also have Python 3\.3\.6, 3\.2, and 2\.5 available on your \fBPATH\fR, one would first \fBpyenv install\fR the missing versions, then set \fBpyenv global system 3\.3\.6 3\.2 2\.5\fR\. At this point, one should be able to find the full executable path to each of these using \fBpyenv which\fR, e\.g\. \fBpyenv which python2\.5\fR (should display \fB$(pyenv root)/versions/2\.5/bin/python2\.5\fR), or \fBpyenv which python3\.4\fR (should display path to system Python3)\. You can also specify multiple versions in a \fB\.python\-version\fR file, separated by newlines or any whitespace\. +hy +.SS "Locating the Python Installation" +Once pyenv has determined which version of Python your application has specified, it passes the command along to the corresponding Python installation\. +.P +Each Python version is installed into its own directory under +.nf +\fB$(pyenv root)/versions\fR\. +.fi +.P +For example, you might have these versions installed: +.IP \(bu 4 +\fB$(pyenv root)/versions/2\.7\.8/\fR +.IP \(bu 4 +\fB$(pyenv root)/versions/3\.4\.2/\fR +.IP \(bu 4 +\fB$(pyenv root)/versions/pypy\-2\.4\.0/\fR +.IP "" 0 +.P +As far as pyenv is concerned, version names are simply the directories in \fB$(pyenv root)/versions\fR\. +.SS "Managing Virtual Environments" +There is a pyenv plugin named pyenv\-virtualenv which comes with various features to help pyenv users to manage virtual environments created by virtualenv or Anaconda\. Because the \fBactivate\fR script of those virtual environments are relying on mutating \fB$PATH\fR variable of user's interactive shell, it will intercept pyenv's shim style command execution hooks\. We'd recommend to install pyenv\-virtualenv as well if you have some plan to play with those virtual environments\. + +.SH "Advanced Configuration" +Skip this section unless you must know what every line in your shell profile is doing\. +.P +\fBpyenv init\fR is the only command that crosses the line of loading extra commands into your shell\. Coming from rvm, some of you might be opposed to this idea\. Here's what \fBpyenv init\fR actually does: +.IP "1." 4 +\fBSets up your shims path\.\fR This is the only requirement for pyenv to function properly\. You can do this by hand by prepending \fB$(pyenv root)/shims\fR to your \fB$PATH\fR\. +.IP "2." 4 +\fBRehashes shims\.\fR From time to time you'll need to rebuild your shim files\. Doing this on init makes sure everything is up to date\. You can always run \fBpyenv rehash\fR manually\. +You can disable this functionality by adding \fB--no-rehash\fR to the end of your \fBpyenv init\fR command line. +.IP "3." 4 +\fBInstalls the sh dispatcher\.\fR This bit is also optional, but allows pyenv and plugins to change variables in your current shell, making commands like \fBpyenv shell\fR possible\. The sh dispatcher doesn't do anything crazy like override \fBcd\fR or hack your shell prompt, but if for some reason you need \fBpyenv\fR to be a real script rather than a shell function, you can safely skip it\. +.IP "" 0 +.P +To see exactly what happens under the hood for yourself, run \fB"pyenv init \-"\fR\. +.SH "Uninstalling Python Versions" +As time goes on, you will accumulate Python versions in your \fB$(pyenv root)/versions\fR directory\. +.P +To remove old Python versions, \fBpyenv uninstall\fR command to automate the removal process\. +.P +Alternatively, simply \fBrm \-rf\fR the directory of the version you want to remove\. You can find the directory of a particular Python version with the \fBpyenv prefix\fR command, +.P +e\.g\. \fBpyenv prefix 2\.6\.8\fR\. +.SH "Command Reference" +.P +The most common subcommands are: +.SS "pyenv commands" +Lists all available pyenv commands\. +.SS "pyenv local" +Sets a local application\-specific Python version by writing the version name to a \fB\.python\-version\fR file in the current directory\. This version overrides the global version, and can be overridden itself by setting the \fBPYENV_VERSION\fR environment variable or with the \fBpyenv shell\fR command\. +.IP "" 4 +.nf +$ pyenv local 2\.7\.6 +.fi +.IP "" 0 +.P +When run without a version number, \fBpyenv local\fR reports the currently configured local version\. You can also unset the local version: +.IP "" 4 +.nf +$ pyenv local \-\-unset +.fi +.IP "" 0 +.P +Previous versions of pyenv stored local version specifications in a file named \fB\.pyenv\-version\fR\. For backwards compatibility, pyenv will read a local version specified in an \fB\.pyenv\-version\fR file, but a \fB\.python\-version\fR file in the same directory will take precedence\. +.P +You can specify multiple versions as local Python at once\. +.P +Let's say if you have two versions of 2\.7\.6 and 3\.3\.3\. If you prefer 2\.7\.6 over 3\.3\.3, +.IP "" 4 +.nf +$ pyenv local 2\.7\.6 3\.3\.3 +$ pyenv versions + system +* 2\.7\.6 (set by /Users/yyuu/path/to/project/\.python\-version) +* 3\.3\.3 (set by /Users/yyuu/path/to/project/\.python\-version) +$ python \-\-version +Python 2\.7\.6 +$ python2\.7 \-\-version +Python 2\.7\.6 +$ python3\.3 \-\-version +Python 3\.3\.3 +.fi +.IP "" 0 +.P +or, if you prefer 3\.3\.3 over 2\.7\.6, +.IP "" 4 +.nf +$ pyenv local 3\.3\.3 2\.7\.6 +$ pyenv versions + system +* 2\.7\.6 (set by /Users/yyuu/path/to/project/\.python\-version) +* 3\.3\.3 (set by /Users/yyuu/path/to/project/\.python\-version) + venv27 +$ python \-\-version +Python 3\.3\.3 +$ python2\.7 \-\-version +Python 2\.7\.6 +$ python3\.3 \-\-version +Python 3\.3\.3 +.fi +.IP "" 0 +.SS "pyenv global" +Sets the global version of Python to be used in all shells by writing the version name to the \fB~/\.pyenv/version\fR file\. This version can be overridden by an application\-specific \fB\.python\-version\fR file, or by setting the \fBPYENV_VERSION\fR environment variable\. +.IP "" 4 +.nf +$ pyenv global 2\.7\.6 +.fi +.IP "" 0 +.P +The special version name \fBsystem\fR tells pyenv to use the system Python (detected by searching your \fB$PATH\fR)\. +.P +When run without a version number, \fBpyenv global\fR reports the currently configured global version\. +.P +You can specify multiple versions as global Python at once\. +.P +Let's say if you have two versions of 2\.7\.6 and 3\.3\.3\. If you prefer 2\.7\.6 over 3\.3\.3, +.IP "" 4 +.nf +$ pyenv global 2\.7\.6 3\.3\.3 +$ pyenv versions + system +* 2\.7\.6 (set by /Users/yyuu/\.pyenv/version) +* 3\.3\.3 (set by /Users/yyuu/\.pyenv/version) +$ python \-\-version +Python 2\.7\.6 +$ python2\.7 \-\-version +Python 2\.7\.6 +$ python3\.3 \-\-version +Python 3\.3\.3 +.fi +.IP "" 0 +.P +or, if you prefer 3\.3\.3 over 2\.7\.6, +.IP "" 4 +.nf +$ pyenv global 3\.3\.3 2\.7\.6 +$ pyenv versions + system +* 2\.7\.6 (set by /Users/yyuu/\.pyenv/version) +* 3\.3\.3 (set by /Users/yyuu/\.pyenv/version) + venv27 +$ python \-\-version +Python 3\.3\.3 +$ python2\.7 \-\-version +Python 2\.7\.6 +$ python3\.3 \-\-version +Python 3\.3\.3 +.fi +.IP "" 0 +.SS "pyenv shell" +Sets a shell\-specific Python version by setting the \fBPYENV_VERSION\fR environment variable in your shell\. This version overrides application\-specific versions and the global version\. +.IP "" 4 +.nf +$ pyenv shell pypy\-2\.2\.1 +.fi +.IP "" 0 +.P +When run without a version number, \fBpyenv shell\fR reports the current value of \fBPYENV_VERSION\fR\. You can also unset the shell version: +.IP "" 4 +.nf +$ pyenv shell \-\-unset +.fi +.IP "" 0 +.P +Note that you'll need pyenv's shell integration enabled (step 3 of the installation instructions) in order to use this command\. If you prefer not to use shell integration, you may simply set the \fBPYENV_VERSION\fR variable yourself: +.IP "" 4 +.nf +$ export PYENV_VERSION=pypy\-2\.2\.1 +.fi +.IP "" 0 +.P +You can specify multiple versions via \fBPYENV_VERSION\fR at once\. +.P +Let's say if you have two versions of 2\.7\.6 and 3\.3\.3\. If you prefer 2\.7\.6 over 3\.3\.3, +.IP "" 4 +.nf +$ pyenv shell 2\.7\.6 3\.3\.3 +$ pyenv versions + system +* 2\.7\.6 (set by PYENV_VERSION environment variable) +* 3\.3\.3 (set by PYENV_VERSION environment variable) +$ python \-\-version +Python 2\.7\.6 +$ python2\.7 \-\-version +Python 2\.7\.6 +$ python3\.3 \-\-version +Python 3\.3\.3 +.fi +.IP "" 0 +.P +or, if you prefer 3\.3\.3 over 2\.7\.6, +.IP "" 4 +.nf +$ pyenv shell 3\.3\.3 2\.7\.6 +$ pyenv versions + system +* 2\.7\.6 (set by PYENV_VERSION environment variable) +* 3\.3\.3 (set by PYENV_VERSION environment variable) + venv27 +$ python \-\-version +Python 3\.3\.3 +$ python2\.7 \-\-version +Python 2\.7\.6 +$ python3\.3 \-\-version +Python 3\.3\.3 +.fi +.IP "" 0 +.SS "pyenv install" +Install a Python version +.IP "" 4 +.nf +Usage: pyenv install [\-f] [\-kvp] + pyenv install [\-f] [\-kvp] + pyenv install \-l|\-\-list + + \-l, \-\-list List all available versions + \-f, \-\-force Install even if the version appears to be installed + already + \-s, \-\-skip\-existing Skip the installation if the version appears to be + installed already + + python\-build options: + + \-k, \-\-keep Keep source tree in $PYENV_BUILD_ROOT after installation + (defaults to $PYENV_ROOT/sources) + \-v, \-\-verbose Verbose mode: print compilation status to stdout + \-p, \-\-patch Apply a patch from stdin before building + \-g, \-\-debug Build a debug version +.fi +.IP "" 0 +.P +To list the all available versions of Python, including Anaconda, Jython, pypy, and stackless, use: +.IP "" 4 +.nf +$ pyenv install \-\-list +.fi +.IP "" 0 +.P +Then install the desired versions: +.IP "" 4 +.nf +$ pyenv install 2\.7\.6 +$ pyenv install 2\.6\.8 +$ pyenv versions + system + 2\.6\.8 +* 2\.7\.6 (set by /home/yyuu/\.pyenv/version) +.fi +.IP "" 0 +.SS "pyenv uninstall" +Uninstall Python versions\. +.IP "" 4 +.nf +Usage: pyenv uninstall [\-f|\-\-force] ... + + \-f Attempt to remove the specified version without prompting + for confirmation\. If the version does not exist, do not + display an error message\. +.fi +.IP "" 0 +.SS "pyenv rehash" +Installs shims for all Python binaries known to pyenv (i\.e\., \fB~/\.pyenv/versions/*/bin/*\fR)\. Run this command after you install a new version of Python, or install a package that provides binaries\. +.IP "" 4 +.nf +$ pyenv rehash +.fi +.IP "" 0 +.SS "pyenv version" +Displays the currently active Python version, along with information on how it was set\. +.IP "" 4 +.nf +$ pyenv version +2\.7\.6 (set by /home/yyuu/\.pyenv/version) +.fi +.IP "" 0 +.SS "pyenv versions" +Lists all Python versions known to pyenv, and shows an asterisk next to the currently active version\. +.IP "" 4 +.nf +$ pyenv versions + 2\.5\.6 + 2\.6\.8 +* 2\.7\.6 (set by /home/yyuu/\.pyenv/version) + 3\.3\.3 + jython\-2\.5\.3 + pypy\-2\.2\.1 +.fi +.IP "" 0 +.SS "pyenv which" +Displays the full path to the executable that pyenv will invoke when you run the given command\. +.IP "" 4 +.nf +$ pyenv which python3\.3 +/home/yyuu/\.pyenv/versions/3\.3\.3/bin/python3\.3 +.fi +.IP "" 0 +.SS "pyenv whence" +Lists all Python versions with the given command installed\. +.IP "" 4 +.nf +$ pyenv whence 2to3 +2\.6\.8 +2\.7\.6 +3\.3\.3 +.fi +.IP "" 0 +.SH "Environment variables" +You can affect how pyenv operates with the following settings: +.TP 28 +.B name (default) +.B description +.TP 28 +.B PYENV_VERSION +Specifies the Python version to be used. Also see \fBpyenv shell\fR +.TP +.B PYENV_ROOT (\fB~/.pyenv\fR) +Defines the directory under which Python versions and shims reside. Also see \fBpyenv root\fR +.TP +.B PYENV_DEBUG +Outputs debug information. +.br +Also as: \fBpyenv --debug \fR +.TP +.B PYENV_HOOK_PATH +Colon\-separated list of paths searched for pyenv hooks\. +.TP +.B PYENV_DIR (\fB$PWD\fR) +Directory to start searching for \fB\.python\-version\fR files\. +.TP +.B HTTP_PROXY,HTTPS_PROXY +Proxy Variables +.TP +.B CONFIGURE_OPTS +Pass configure options to build. +.TP +.B PYTHON_BUILD_ARIA2_OPTS +Used to pass additional parameters to \fBaria2\fR +.UR https://aria2\.github\.io/ +.UE +If the \fBaria2c\fR binary is available on PATH, pyenv uses \fBaria2c\fR instead of \fBcurl\fR or \fBwget\fR to download the Python Source code\. If you have an unstable internet connection, you can use this variable to instruct \fBaria2\fR to accelerate the download\. +In most cases, you will only need to use \fB\-x 10 \-k 1M\fR as value to \fBPYTHON_BUILD_ARIA2_OPTS\fR environment variable +.SH "License" +The \fBMIT\fR License diff --git a/plugins/.gitignore b/plugins/.gitignore new file mode 100644 index 0000000..acd0fcc --- /dev/null +++ b/plugins/.gitignore @@ -0,0 +1,5 @@ +/* +!/.gitignore +!/version-ext-compat +!/python-build +/python-build/test/build diff --git a/plugins/python-build/LICENSE b/plugins/python-build/LICENSE new file mode 100644 index 0000000..ca98612 --- /dev/null +++ b/plugins/python-build/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2013 Yamashita, Yuu +Copyright (c) 2012-2013 Sam Stephenson + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugins/python-build/README.md b/plugins/python-build/README.md new file mode 100644 index 0000000..93e6612 --- /dev/null +++ b/plugins/python-build/README.md @@ -0,0 +1,357 @@ +# python-build + +python-build is a [pyenv](https://github.com/pyenv/pyenv) plugin that +provides a `pyenv install` command to compile and install different versions +of Python on UNIX-like systems. + +You can also use python-build without pyenv in environments where you need +precise control over Python version installation. + +See the [list of releases](https://github.com/pyenv/pyenv/releases) +for changes in each version. + + +## Installation + +### Installing as a pyenv plugin (recommended) + +Since python-build is bundled with pyenv by +default, you do not need to do anything. + +### Installing as a standalone program (advanced) + +Installing python-build as a standalone program will give you access to the +`python-build` command for precise control over Python version installation. If you +have pyenv installed, you will also be able to use the `pyenv install` command. + + git clone https://github.com/pyenv/pyenv.git + cd pyenv/plugins/python-build + ./install.sh + +This will install python-build into `/usr/local`. If you do not have write +permission to `/usr/local`, you will need to run `sudo ./install.sh` instead. +You can install to a different prefix by setting the `PREFIX` environment +variable. + +To update python-build after it has been installed, run `git pull` in your cloned +copy of the repository, then re-run the install script. + +### Installing with Homebrew (for OS X users) + +Mac OS X users can install python-build with the [Homebrew](http://brew.sh) +package manager. This will give you access to the `python-build` command. If you +have pyenv installed, you will also be able to use the `pyenv install` command. + +*This is the recommended method of installation if you installed pyenv with +Homebrew.* + + brew install pyenv + +Or, if you would like to install the latest development release: + + brew install --HEAD pyenv + + +## Usage + +Before you begin, you should ensure that your build environment has the proper +system dependencies for compiling the wanted Python Version (see our [recommendations](https://github.com/pyenv/pyenv/wiki#suggested-build-environment)). + +### Using `pyenv install` with pyenv + +To install a Python version for use with pyenv, run `pyenv install` with +exact name of the version you want to install. For example, + + pyenv install 2.7.4 + +Python versions will be installed into a directory of the same name under +`~/.pyenv/versions`. + +To see a list of all available Python versions, run `pyenv install --list`. You +may also tab-complete available Python versions if your pyenv installation is +properly configured. + +### Using `python-build` standalone + +If you have installed python-build as a standalone program, you can use the +`python-build` command to compile and install Python versions into specific +locations. + +Run the `python-build` command with the exact name of the version you want to +install and the full path where you want to install it. For example, + + python-build 2.7.4 ~/local/python-2.7.4 + +To see a list of all available Python versions, run `python-build --definitions`. + +Pass the `-v` or `--verbose` flag to `python-build` as the first argument to see +what's happening under the hood. + +### Custom definitions + +Both `pyenv install` and `python-build` accept a path to a custom definition file +in place of a version name. Custom definitions let you develop and install +versions of Python that are not yet supported by python-build. + +See the [python-build built-in definitions](https://github.com/pyenv/pyenv/tree/master/plugins/python-build/share/python-build) as a starting point for +custom definition files. + +#### Adding definitions with a Pyenv plugin + +You can add your own definitions with a [Pyenv plugin](https://github.com/pyenv/pyenv?tab=readme-ov-file#pyenv-plugins) by placing them under +`$PYENV_ROOT/plugins/your_plugin_name/share/python-build`. + +### Default build configuration + +Without the user customizing the build with environment variables (see below), +`python-build` builds Python with mostly default Configure options +to maintain the principle of the least surprise. + +The exceptions -- non-default options that are set by default -- are listed below: + +| Option/Behavior | Rationale | +|-----------------|-----------| +| `--enable-shared` is on by default. Pass `--disable-shared` to Configure options to override | The official CPython Docker image uses it. It's required to embed CPython. | +| argument to `--enable-universalsdk` is ignored and set to `/` | +| `--with-universal-archs` defaults to `universal2` on ARM64 architecture | the only dual-architecture Macs in use today are Apple Silicon which can only build that one | +| argument to `--enable-framework` is ignored and set to a specific value | CPython's build logic requires a very specific argument to avoid installing the `Applications` part globally | +| argument to `--enable-unicode` in non-MacOS is overridden to `ucs4` for 2.x-3.3 | +| `MACOSX_DEPLOYMENT_TARGET` defaults to the running MacOS version | + + +#### Integration with 3rd-party package ecosystems + +##### Homebrew + +Homebrew is used to find dependency packages if `brew` is found on `PATH`: +* In MacOS, or +* If the running Pyenv itself is installed with Homebrew + +Set `PYTHON_BUILD_USE_HOMEBREW` or `PYTHON_BUILD_SKIP_HOMEBREW` to override this default. + +When Homebrew is used, its `include` and `lib` paths are added to compiler search path (the latter is also set as `rpath`), +and also Python dependencies that are typically keg-only are searched for in the Homebrew installation and added individually. + +**NOTE:** Homebrew is not used in Linux by default because it's rolling-release which causes a problem. +Upgrading a Python dependency in Homebrew to a new major version (that `brew` does without warning) +would break all Pyenv-managed installations that depend on it. +You can use a [community plugin `fix-version`](https://github.com/pyenv/pyenv/wiki/Plugins#community-plugins) +to fix installations in such a case. + +##### MacPorts + +MacPorts Homebrew is used to find dependency packages if `port` is found on `PATH` in MacOS. + +Set `PYTHON_BUILD_USE_MACPORTS` or `PYTHON_BUILD_SKIP_MACPORTS` to override this default. + +###### Interaction with Homebrew + +If both Homebrew and MacPorts are installed and allowed to be used, Homebrew takes preference. +There first ecosystem where any of the required dependency packages is found is used. + +##### Portage + +In FreeBSD, if `pkg` is on PATH, Ports are searched for some dependencies that Configure is known to not search for via `pkg-config`. +(Later versions of CPython search for more packages via `pkg-config` so this may eventually become redundant.) + + +### Special environment variables + +You can set certain environment variables to control the build process. + +* `TMPDIR` sets the location where python-build stores temporary files. +* `PYTHON_BUILD_BUILD_PATH` sets the location in which sources are downloaded and + built. By default, this is a subdirectory of `TMPDIR`. +* `PYTHON_BUILD_CACHE_PATH`, if set, specifies a directory to use for caching + downloaded package files. +* `PYTHON_BUILD_MIRROR_URL` overrides the default mirror URL root to one of your + choosing. +* `PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM`, if set, does not append the SHA2 + checksum of the file to the mirror URL. +* `PYTHON_BUILD_SKIP_MIRROR`, if set, forces python-build to download packages from + their original source URLs instead of using a mirror. +* `PYTHON_BUILD_HTTP_CLIENT`, explicitly specify the HTTP client type to use. `aria2`, `curl` and `wget` are the supported values and by default, are searched in that order. +* `PYTHON_BUILD_CURL_OPTS`, `PYTHON_BUILD_WGET_OPTS`, `PYTHON_BUILD_ARIA2_OPTS` pass additional parameters to the corresponding HTTP client. +* `PYTHON_BUILD_SKIP_HOMEBREW`, if set, will not search for libraries installed by Homebrew when it would normally will. +* `PYTHON_BUILD_USE_HOMEBREW`, if set, will search for libraries installed by Homebrew when it would normally not. +* `PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA`, override the Homebrew OpenSSL formula to use. +* `PYTHON_BUILD_MACPORTS_OPENSSL_FORMULA`, override the MacPorts OpenSSL formula to use. The default is `openssl3 openssl`. +* `PYTHON_BUILD_TCLTK_FORMULA`, override the Homebrew Tcl/Tk formula to use. +* `PYTHON_BUILD_SKIP_MACPORTS`, if set, will not search for libraries installed by MacPorts when it would normally will. +* `PYTHON_BUILD_USE_MACPORTS`, if set, will search for libraries installed by MacPorts when it would normally not. +* `PYTHON_BUILD_ROOT` overrides the default location from where build definitions + in `share/python-build/` are looked up. +* `PYTHON_BUILD_DEFINITIONS` can be a list of colon-separated paths that get + additionally searched when looking up build definitions. +* `CC` sets the path to the C compiler. +* `CONFIGURE_OPTS` lets you pass additional options to `./configure`. +* `MAKE` lets you override the command to use for `make`. Useful for specifying + GNU make (`gmake`) on some systems. +* `MAKE_OPTS` (or `MAKEOPTS`) lets you pass additional options to `make`. +* `MAKE_INSTALL_OPTS` lets you pass additional options to `make install`. +* `_CFLAGS`, `_CPPFLAGS`, `_LDFLAGS` let you pass additional options to `CFLAGS`/`CPPFLAGS`/`LDFLAGS` specifically for building `` (Python itself or a dependency library) from source as part of the build script. `` should be a capitalized name of the package without version (technically, capitalized first argument to `install_package` without version). E.g. for CPython, it's "`PYTHON`", for Readline, "`READLINE`", for PyPy (only applies when building it from source), "`PYPY`". Check the source of the build script you're using if unsure. +* `_CONFIGURE_OPTS`, `_MAKE_OPTS`, `_MAKE_INSTALL_OPTS`, `_MAKE_INSTALL_TARGET` allow + you to specify configure and make options for building `` (same as above). "Make install target" would replace "`install`" in the `make install` invocation. + +### Applying patches to Python before compiling + +Both `pyenv install` and `python-build` support the `--patch` (`-p`) flag that +signals that a patch from stdin should be applied to Python, Jython or PyPy +source code before the `./configure` and compilation steps. + +Example usage: + +```sh +# applying a single patch +$ pyenv install --patch 2.7.10 < /path/to/python.patch + +# applying a patch from HTTP +$ pyenv install --patch 2.7.10 < <(curl -sSL http://git.io/python.patch) + +# applying multiple patches +$ cat fix1.patch fix2.patch | pyenv install --patch 2.7.10 +``` + + +### Building for maximum performance + +Building CPython with `--enable-optimizations` will result in a faster +interpreter at the cost of significantly longer build times. Most notably, this +enables PGO (profile guided optimization). While your mileage may vary, it is +common for performance improvement from this to be in the ballpark of 30%. + +```sh +env PYTHON_CONFIGURE_OPTS='--enable-optimizations --with-lto' PYTHON_CFLAGS='-march=native -mtune=native' pyenv install --verbose 3.6.0 +``` + +You can also customize the task used for profile guided optimization by setting +the `PROFILE_TASK` environment variable, for instance, `PROFILE_TASK='-m +test.regrtest --pgo -j0'` will run much faster than the default task. + +### Checksum verification + +If you have the `shasum`, `openssl`, or `sha256sum` tool installed, python-build will +automatically verify the SHA2 checksum of each downloaded package before +installing it. + +Checksums are optional and specified as anchors on the package URL in each +definition. (All bundled definitions include checksums.) + +### Package download mirrors + +python-build will first attempt to download package files from a mirror hosted on +GitHub Pages. If this fails, it will fall back to the +official URL specified in the definition file. + +You can point python-build to another mirror by specifying the +`PYTHON_BUILD_MIRROR_URL` environment variable. + +Package mirror URLs are constructed by joining +`$PYTHON_BUILD_MIRROR_URL` with the SHA2 checksum of the package file as specified in the URL +in the installation script (the part after the hash sign). E.g.: + +``` +https://mycache.example.com/0419e9085bf51b7a672009b3f50dbf1859acdf18ba725d0ec19aa5c8503f0ea3 +``` + +If you have replicated the directory structure of an official site, the easiest way to adapt +would be to make symlinks at the mirror's root: + +``` +0419e9085bf51b7a672009b3f50dbf1859acdf18ba725d0ec19aa5c8503f0ea3 -> 3.10.10/Python-3.10.10.tar.xz +``` + +The rationale is to abstract away difference between directory structures of sites +of various Python flavors and their occasional changes as well as to accomodate +people who only wish to cache some select downloads. This also allows to mirror multiple sites at once. + +If the mirror being used does not have the same checksum (*e.g.* with a +pull-through cache like Artifactory), you can set the +`PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM` environment variable. + +If you don't have an SHA2 program installed, python-build will skip the download +mirror and use official URLs instead. You can force python-build to bypass the +mirror by setting the `PYTHON_BUILD_SKIP_MIRROR` environment variable. + +The official python-build download mirror is provided by +[GitHub Pages](http://yyuu.github.io/pythons/). + +### Package download cache + +Python-build will keep a cache of downloaded package files +at the location specified by the `PYTHON_BUILD_CACHE_PATH` environment variable +if it exists. The default is `~/.pyenv/cache`, so you can +enable caching by just creating that directory. + +The name of the would-be cached file is reported by Pyenv in the "Downloading <filename>..." message. +It's possible to warm up the cache by manually putting the file there under an appropriate name. + +### Keeping the build directory after installation + +Both `python-build` and `pyenv install` accept the `-k` or `--keep` flag, which +tells python-build to keep the downloaded source after installation. This can be +useful if you need to use `gdb` and `memprof` with Python. + +Source code will be kept in a parallel directory tree `~/.pyenv/sources` when +using `--keep` with the `pyenv install` command. You should specify the +location of the source code with the `PYTHON_BUILD_BUILD_PATH` environment +variable when using `--keep` with `python-build`. + + +## Getting Help + +Please see the [pyenv wiki](https://github.com/pyenv/pyenv/wiki) for solutions to common problems. + +[wiki]: https://github.com/pyenv/pyenv/wiki + +If you can't find an answer on the wiki, open an issue on the [issue +tracker](https://github.com/pyenv/pyenv/issues). Be sure to include +the full build log for build failures. + +## Contributing + +### Testing new python versions + +If you are contributing a new python version for python-build, +you can test the build in a [docker](https://www.docker.com/) container based on Ubuntu 18.04. + +With docker installed: + +```sh +docker build -t my_container . +docker run my_container pyenv install +``` + +To enter a shell which will allow you to build and then test a python version, +replace the second line with + +```sh +docker run -it my_container +``` + +The container will need to be rebuilt whenever you change the repo, +but after the first build, this will be very fast, +as the layer including the build dependencies will be cached. + +Changes made inside the container will not be persisted. + +To test *all* new versions since a particular revision (e.g. `master`), `cd` to the root of your `pyenv` repo, and run this script: + +```sh +set -e +set -x + +docker build -t pyenv-test-container . + +git diff --name-only master \ + | grep '^plugins/python-build/share/python-build/' \ + | awk -F '/' '{print $NF}' \ + | xargs -I _ docker run pyenv-test-container pyenv install _ +``` + +- Build the docker image with the **t**ag pyenv-test-container +- Look for the names files changed since revision `master` +- Filter out any which don't live where python-build keeps its build scripts +- Look only at the file name (i.e. the python version name) +- Run a new docker container for each, building that version + diff --git a/plugins/python-build/bin/pyenv-install b/plugins/python-build/bin/pyenv-install new file mode 100755 index 0000000..508e8a2 --- /dev/null +++ b/plugins/python-build/bin/pyenv-install @@ -0,0 +1,295 @@ +#!/usr/bin/env bash +# +# Summary: Install a Python version using python-build +# +# Usage: pyenv install [-f] [-kvp] ... +# pyenv install [-f] [-kvp] +# pyenv install -l|--list +# pyenv install --version +# +# -l/--list List all available versions +# -f/--force Install even if the version appears to be installed already +# -s/--skip-existing Skip if the version appears to be installed already +# +# python-build options: +# +# -k/--keep Keep source tree in $PYENV_BUILD_ROOT after installation +# (defaults to $PYENV_ROOT/sources) +# -p/--patch Apply a patch from stdin before building +# -v/--verbose Verbose mode: print compilation status to stdout +# --version Show version of python-build +# -g/--debug Build a debug version +# +# For detailed information on installing Python versions with +# python-build, including a list of environment variables for adjusting +# compilation, see: https://github.com/pyenv/pyenv#readme +# +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +# Add `share/python-build/` directory from each pyenv plugin to the list of +# paths where build definitions are looked up. +shopt -s nullglob +for plugin_path in "$PYENV_ROOT"/plugins/*/share/python-build; do + PYTHON_BUILD_DEFINITIONS="${PYTHON_BUILD_DEFINITIONS}:${plugin_path}" +done +export PYTHON_BUILD_DEFINITIONS +shopt -u nullglob + +# Provide pyenv completions +if [ "$1" = "--complete" ]; then + echo --list + echo --force + echo --skip-existing + echo --keep + echo --patch + echo --verbose + echo --version + echo --debug + exec python-build --definitions +fi + +# Load shared library functions +eval "$(python-build --lib)" + +usage() { + pyenv-help install 2>/dev/null + [ -z "$1" ] || exit "$1" +} + +definitions() { + local query="$1" + python-build --definitions | $(type -P ggrep grep | head -n1) -F "$query" || true +} + +indent() { + sed 's/^/ /' +} + +unset FORCE +unset SKIP_EXISTING +unset KEEP +unset VERBOSE +unset HAS_PATCH +unset DEBUG + +[ -n "$PYENV_DEBUG" ] && VERBOSE="-v" + +parse_options "$@" +for option in "${OPTIONS[@]}"; do + case "$option" in + "h" | "help" ) + usage 0 + ;; + "l" | "list" ) + echo "Available versions:" + definitions | indent + exit + ;; + "f" | "force" ) + FORCE=true + ;; + "s" | "skip-existing" ) + SKIP_EXISTING=true + ;; + "k" | "keep" ) + [ -n "${PYENV_BUILD_ROOT}" ] || PYENV_BUILD_ROOT="${PYENV_ROOT}/sources" + ;; + "v" | "verbose" ) + VERBOSE="-v" + ;; + "p" | "patch" ) + HAS_PATCH="-p" + ;; + "g" | "debug" ) + DEBUG="-g" + ;; + "version" ) + exec python-build --version + ;; + * ) + usage 1 >&2 + ;; + esac +done + +unset VERSION_NAME + +# The first argument contains the definition to install. If the +# argument is missing, try to install whatever local app-specific +# version is specified by pyenv. Show usage instructions if a local +# version is not specified. +DEFINITIONS=("${ARGUMENTS[@]}") +[[ "${#DEFINITIONS[*]}" -eq 0 ]] && DEFINITIONS=($(pyenv-local 2>/dev/null || true)) +[[ "${#DEFINITIONS[*]}" -eq 0 ]] && usage 1 >&2 + +# Define `before_install` and `after_install` functions that allow +# plugin hooks to register a string of code for execution before or +# after the installation process. +declare -a before_hooks after_hooks + +before_install() { + local hook="$1" + before_hooks["${#before_hooks[@]}"]="$hook" +} + +after_install() { + local hook="$1" + after_hooks["${#after_hooks[@]}"]="$hook" +} + +# Plan cleanup on unsuccessful installation. +cleanup() { + [ -z "${PREFIX_EXISTS}" ] && rm -rf "$PREFIX" +} + +trap cleanup SIGINT + + +OLDIFS="$IFS" +IFS=$'\n' scripts=(`pyenv-hooks install`) +IFS="$OLDIFS" +for script in "${scripts[@]}"; do source "$script"; done + +COMBINED_STATUS=0 +for DEFINITION in "${DEFINITIONS[@]}"; do + STATUS=0 + + # Try to resolve a prefix if user indeed gave a prefix. + # We install the version under the resolved name + # and hooks also see the resolved name + DEFINITION="$(pyenv-latest -f -k "$DEFINITION")" + + # Set VERSION_NAME from $DEFINITION. Then compute the installation prefix. + VERSION_NAME="${DEFINITION##*/}" + [ -n "$DEBUG" ] && VERSION_NAME="${VERSION_NAME}-debug" + PREFIX="${PYENV_ROOT}/versions/${VERSION_NAME}" + + [ -d "${PREFIX}" ] && PREFIX_EXISTS=1 + + # If the installation prefix exists, prompt for confirmation unless + # the --force option was specified. + if [ -d "${PREFIX}/bin" ]; then + if [ -z "$FORCE" ] && [ -z "$SKIP_EXISTING" ]; then + echo "pyenv: $PREFIX already exists" >&2 + read -p "continue with installation? (y/N) " + + case "$REPLY" in + y | Y | yes | YES ) ;; + * ) { STATUS=1; [[ $STATUS -gt $COMBINED_STATUS ]] && COMBINED_STATUS=$STATUS; }; continue ;; + esac + elif [ -n "$SKIP_EXISTING" ]; then + # Since we know the python version is already installed, and are opting to + # not force installation of existing versions, we just `exit 0` here to + # leave things happy + continue + fi + fi + + # If PYENV_BUILD_ROOT is set, always pass keep options to python-build. + if [ -n "${PYENV_BUILD_ROOT}" ]; then + export PYTHON_BUILD_BUILD_PATH="${PYENV_BUILD_ROOT}/${VERSION_NAME}" + KEEP="-k" + fi + + # Set PYTHON_BUILD_CACHE_PATH to $PYENV_ROOT/cache, if the directory + # exists and the variable is not already set. + if [ -z "${PYTHON_BUILD_CACHE_PATH}" ] && [ -d "${PYENV_ROOT}/cache" ]; then + export PYTHON_BUILD_CACHE_PATH="${PYENV_ROOT}/cache" + fi + + if [ -z "${PYENV_BOOTSTRAP_VERSION}" ]; then + case "${VERSION_NAME}" in + [23]"."* ) + # Default PYENV_VERSION to the friendly Python version. (The + # CPython installer requires an existing Python installation to run. An + # unsatisfied local .python-version file can cause the installer to + # fail.) + for version_info in "${VERSION_NAME%-dev}" "${VERSION_NAME%.*}" "${VERSION_NAME%%.*}"; do + # Anaconda's `curl` doesn't work on platform where `/etc/pki/tls/certs/ca-bundle.crt` isn't available (e.g. Debian) + for version in $(pyenv-whence "python${version_info}" 2>/dev/null || true); do + if [[ "${version}" != "anaconda"* ]] && [[ "${version}" != "miniconda"* ]]; then + PYENV_BOOTSTRAP_VERSION="${version}" + break 2 + fi + done + done + ;; + "pypy"*"-dev" | "pypy"*"-src" ) + # PyPy/PyPy3 requires existing Python 2.7 to build + if [ -n "${PYENV_RPYTHON_VERSION}" ]; then + PYENV_BOOTSTRAP_VERSION="${PYENV_RPYTHON_VERSION}" + else + for version in $(pyenv-versions --bare | sort -r); do + if [[ "${version}" == "2.7"* ]]; then + PYENV_BOOTSTRAP_VERSION="$version" + break + fi + done + fi + if [ -n "$PYENV_BOOTSTRAP_VERSION" ]; then + for dep in pycparser; do + if ! PYENV_VERSION="$PYENV_BOOTSTRAP_VERSION" pyenv-exec python -c "import ${dep}" 1>/dev/null 2>&1; then + echo "pyenv-install: $VERSION_NAME: PyPy requires \`${dep}' in $PYENV_BOOTSTRAP_VERSION to build from source." >&2 + exit 1 + fi + done + else + echo "pyenv-install: $VERSION_NAME: PyPy requires Python 2.7 to build from source." >&2 + exit 1 + fi + ;; + esac + fi + + if [ -n "${PYENV_BOOTSTRAP_VERSION}" ]; then + export PYENV_VERSION="${PYENV_BOOTSTRAP_VERSION}" + fi + + # Execute `before_install` hooks. + for hook in "${before_hooks[@]}"; do eval "$hook"; done + + # Invoke `python-build` and record the exit status in $STATUS. + python-build $KEEP $VERBOSE $HAS_PATCH $DEBUG "$DEFINITION" "$PREFIX" || \ + { STATUS=$?; [[ $STATUS -gt $COMBINED_STATUS ]] && COMBINED_STATUS=$STATUS; } + + # Display a more helpful message if the definition wasn't found. + if [ "$STATUS" == "2" ]; then + { candidates="$(definitions "$DEFINITION")" + if [ -n "$candidates" ]; then + echo + echo "The following versions contain \`$DEFINITION' in the name:" + echo "$candidates" | indent + fi + echo + echo "See all available versions with \`pyenv install --list'." + echo + echo -n "If the version you need is missing, try upgrading pyenv" + declare brew_prefix + if brew_prefix="$(brew --prefix 2>/dev/null)" && [[ $_PYENV_INSTALL_PREFIX/ == "$brew_prefix/"* ]]; then + printf ":\n\n" + echo " brew update && brew upgrade pyenv" + elif [ -d "${_PYENV_INSTALL_PREFIX}/.git" ]; then + printf ":\n\n" + echo " cd ${_PYENV_INSTALL_PREFIX} && git pull && cd -" + else + printf ".\n" + fi + } >&2 + fi + + # Execute `after_install` hooks. + for hook in "${after_hooks[@]}"; do eval "$hook"; done + + # Run `pyenv-rehash` after a successful installation. + if [[ $STATUS -eq 0 ]]; then + pyenv-rehash + else + cleanup + break + fi + +done + + +exit "${COMBINED_STATUS}" diff --git a/plugins/python-build/bin/pyenv-uninstall b/plugins/python-build/bin/pyenv-uninstall new file mode 100755 index 0000000..f95cd36 --- /dev/null +++ b/plugins/python-build/bin/pyenv-uninstall @@ -0,0 +1,98 @@ +#!/usr/bin/env bash +# +# Summary: Uninstall Python versions +# +# Usage: pyenv uninstall [-f|--force] ... +# +# -f Attempt to remove the specified version without prompting +# for confirmation. If the version does not exist, do not +# display an error message. +# +# See `pyenv versions` for a complete list of installed versions. +# +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +# Provide pyenv completions +if [ "$1" = "--complete" ]; then + echo --force + exec pyenv versions --bare +fi + +usage() { + pyenv-help uninstall 2>/dev/null + [ -z "$1" ] || exit "$1" +} + +if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then + usage 0 +fi + +unset FORCE +if [ "$1" = "-f" ] || [ "$1" = "--force" ]; then + FORCE=true + shift +fi + +[ "$#" -gt 0 ] || usage 1 >&2 + +versions=("$@") + +for version in "${versions[@]}"; do + case "$version" in + "" | -* ) + usage 1 >&2 + ;; + esac +done + +declare -a before_hooks after_hooks + +before_uninstall() { + local hook="$1" + before_hooks["${#before_hooks[@]}"]="$hook" +} + +after_uninstall() { + local hook="$1" + after_hooks["${#after_hooks[@]}"]="$hook" +} + +OLDIFS="$IFS" +IFS=$'\n' scripts=(`pyenv-hooks uninstall`) +IFS="$OLDIFS" +for script in "${scripts[@]}"; do source "$script"; done + +uninstall-python() { + local DEFINITION="$1" + + local VERSION_NAME="${DEFINITION##*/}" + local PREFIX="${PYENV_ROOT}/versions/${VERSION_NAME}" + + if [ -z "$FORCE" ]; then + if [ ! -d "$PREFIX" ]; then + echo "pyenv: version \`$VERSION_NAME' not installed" >&2 + exit 1 + fi + + read -p "pyenv: remove $PREFIX? (y/N) " + case "$REPLY" in + y | Y | yes | YES ) ;; + * ) exit 1 ;; + esac + fi + + for hook in "${before_hooks[@]}"; do eval "$hook"; done + + if [ -d "$PREFIX" ]; then + rm -rf "$PREFIX" + pyenv-rehash + echo "pyenv: $VERSION_NAME uninstalled" + fi + + for hook in "${after_hooks[@]}"; do eval "$hook"; done +} + +for version in "${versions[@]}"; do + uninstall-python "$version" +done diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build new file mode 100755 index 0000000..caa3e76 --- /dev/null +++ b/plugins/python-build/bin/python-build @@ -0,0 +1,2752 @@ +#!/usr/bin/env bash +# +# Usage: python-build [-kpv] +# python-build --definitions +# python-build --version +# +# -k/--keep Do not remove source tree after installation +# -p/--patch Apply a patch from stdin before building +# -v/--verbose Verbose mode: print compilation status to stdout +# -4/--ipv4 Resolve names to IPv4 addresses only +# -6/--ipv6 Resolve names to IPv6 addresses only +# --definitions List all built-in definitions +# --version Show version of python-build +# -g/--debug Build a debug version +# + +PYTHON_BUILD_VERSION="2.6.31" + +OLDIFS="$IFS" + +set -E +shopt -s extglob +[ -n "$PYENV_DEBUG" ] && { + export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }' + set -x +} + +exec 3<&2 # preserve original stderr at fd 3 + +lib() { + parse_options() { + OPTIONS=() + ARGUMENTS=() + local arg option index + + for arg in "$@"; do + if [ "${arg:0:1}" = "-" ]; then + if [ "${arg:1:1}" = "-" ]; then + OPTIONS[${#OPTIONS[*]}]="${arg:2}" + else + index=1 + while option="${arg:$index:1}"; do + [ -n "$option" ] || break + OPTIONS[${#OPTIONS[*]}]="$option" + index=$(($index+1)) + done + fi + else + ARGUMENTS[${#ARGUMENTS[*]}]="$arg" + fi + done + } + + if [ "$1" == "--$FUNCNAME" ]; then + declare -f "$FUNCNAME" + echo "$FUNCNAME \"\$1\";" + exit + fi +} +lib "$1" + +READLINK=$(type -P readlink) +if [ -z "$READLINK" ]; then + echo "pyenv: cannot find readlink - are you missing GNU coreutils?" >&2 + exit 1 +fi + +resolve_link() { + $READLINK "$1" +} + +abs_dirname() { + local path="$1" + + # Use a subshell to avoid changing the current path + ( + while [ -n "$path" ]; do + cd_path="${path%/*}" + if [[ "$cd_path" != "$path" ]]; then + cd "$cd_path" + fi + name="${path##*/}" + if [[ $name == ".." ]]; then + cd .. + path="$PWD" + else + path="$(resolve_link "$name" || true)" + fi + done + + echo "$PWD" + ) +} + +capitalize() { + printf "%s" "$1" | tr a-z A-Z +} + +sanitize() { + printf "%s" "$1" | sed "s/[^A-Za-z0-9.-]/_/g; s/__*/_/g" +} + +colorize() { + if [ -t 1 ]; then printf "\e[%sm%s\e[m" "$1" "$2" + else echo -n "$2" + fi +} + +os_information() { + if type -p lsb_release >/dev/null; then + lsb_release -sir | xargs echo + elif type -p sw_vers >/dev/null; then + echo "OS X ${_PYTHON_BUILD_CACHE_SW_VERS:=$(sw_vers -productVersion)}" + elif [ -r /etc/os-release ]; then + source /etc/os-release + echo "$NAME" $VERSION_ID + else + local os="$(cat /etc/{centos,redhat,fedora,system}-release /etc/debian_version 2>/dev/null | head -n1)" + echo "${os:-$(uname -sr)}" + fi +} + +is_mac() { + [ "${_PYTHON_BUILD_CACHE_UNAME_S:=$(uname -s)}" = "Darwin" ] || return 1 + [ $# -eq 0 ] || [ "$(osx_version)" "$@" ] +} + +can_use_homebrew() { + if locked_in; then + locked_in homebrew && rc=$? || rc=$?; return $rc + fi + [[ -n "$PYTHON_BUILD_USE_HOMEBREW" && -n "$PYTHON_BUILD_SKIP_HOMEBREW" ]] && { + echo "error: mutually exclusive environment variables PYTHON_BUILD_USE_HOMEBREW and PYTHON_BUILD_SKIP_HOMEBREW are set" >&3 + exit 1 + } + [[ -n "$PYTHON_BUILD_USE_HOMEBREW" ]] && return 0 + [[ -n "$PYTHON_BUILD_SKIP_HOMEBREW" ]] && return 1 + is_mac && command -v brew &>/dev/null && return 0 + # In Linux, if Pyenv itself is installed with Homebrew, + # we assume the user wants to take dependencies from there as well by default + local brew_prefix + command -v brew &>/dev/null && \ + # tests can have non-functional `brew' stub aliased to `false' + # in Bash 3.2, var="$(cmd)" errexits on failure even if part of a conditional chain + brew_prefix="$(brew --prefix || true)" && [[ -n "$brew_prefix" ]] && \ + [[ $(abs_dirname "${BASH_SOURCE}") == "$(abs_dirname "${brew_prefix}")"/* ]] && \ + { lock_in homebrew; return 0; } + + # do not check the same stuff multiple times + PYTHON_BUILD_SKIP_HOMEBREW=1; return 1 +} + +can_use_macports() { + if locked_in; then + locked_in macports && rc=$? || rc=$?; return $rc + fi + [[ -n "$PYTHON_BUILD_USE_MACPORTS" && -n "$PYTHON_BUILD_SKIP_MACPORTS" ]] && { + echo "error: mutually exclusive environment variables PYTHON_BUILD_USE_MACPORTS and PYTHON_BUILD_SKIP_MACPORTS are set" >&3 + exit 1 + } + [[ -n "$PYTHON_BUILD_USE_MACPORTS" ]] && return 0 + [[ -n "$PYTHON_BUILD_SKIP_MACPORTS" ]] && return 1 + is_mac && command -v port &>/dev/null && return 0 + + # do not check the same stuff multiple times + PYTHON_BUILD_SKIP_MACPORTS=1; return 1 +} + +locked_in() { + if [[ -z "$1" ]]; then + [[ -n $_PYTHON_BUILD_ECOSYSTEM_LOCKED_IN ]] + else + [[ $_PYTHON_BUILD_ECOSYSTEM_LOCKED_IN == "$1" ]] + fi +} + +lock_in() { + _PYTHON_BUILD_ECOSYSTEM_LOCKED_IN=${1:?} +} + +# 9.1 -> 901 +# 10.9 -> 1009 +# 10.10 -> 1010 +osx_version() { + local -a ver + IFS=. ver=( ${_PYTHON_BUILD_CACHE_SW_VERS:=$(sw_vers -productVersion)} ) + IFS="$OLDIFS" + echo $(( ${ver[0]}*100 + ${ver[1]} )) +} + +build_failed() { + { echo + colorize 1 "BUILD FAILED" + echo " ($(os_information) using $(version))" + echo + + if ! rmdir "${BUILD_PATH}" 2>/dev/null; then + echo "Inspect or clean up the working tree at ${BUILD_PATH}" + fi + + if file_is_not_empty "$LOG_PATH"; then + colorize 33 "Results logged to ${LOG_PATH}" + printf "\n\n" + echo "Last 10 log lines:" + TAIL=`tail -n 10 "$LOG_PATH"` + echo "$TAIL" + if echo "$TAIL" | grep -q "no acceptable C compiler found"; then + printf "\n" + echo "Are the build dependencies for Python correctly installed?" + echo "Please consult to the Wiki page for more info." + echo "https://github.com/pyenv/pyenv/wiki#suggested-build-environment" + fi + fi + } >&3 + exit 1 +} + +file_is_not_empty() { + local filename="$1" + local line_count="$(wc -l "$filename" 2>/dev/null || true)" + + if [ -n "$line_count" ]; then + words=( $line_count ) + [ "${words[0]}" -gt 0 ] + else + return 1 + fi +} + +num_cpu_cores() { + local num + case "${_PYTHON_BUILD_CACHE_UNAME_S:=$(uname -s)}" in + Darwin | *BSD ) + num="$(sysctl -n hw.ncpu 2>/dev/null || true)" + ;; + SunOS ) + num="$(getconf NPROCESSORS_ONLN 2>/dev/null || true)" + ;; + * ) + num="$({ getconf _NPROCESSORS_ONLN || + grep -c ^processor /proc/cpuinfo; } 2>/dev/null)" + num="${num#0}" + ;; + esac + echo "${num:-2}" +} + +install_package() { + install_package_using "tarball" 1 "$@" +} + +install_nightly_package() { + install_package_using "nightly_tarball" 2 "$@" +} + +install_git() { + install_package_using "git" 2 "$@" +} + +install_hg() { + install_package_using "hg" 2 "$@" +} + +install_svn() { + install_package_using "svn" 2 "$@" +} + +install_jar() { + install_package_using "jar" 1 "$@" +} + +install_zip() { + install_package_using "zip" 1 "$@" +} + +install_script() { + install_package_using "script" 1 "$@" +} + +install_package_using() { + local package_type="$1" + local package_type_nargs="$2" + local package_name="$3" + shift 3 + + local fetch_args=( "$package_name" "${@:1:$package_type_nargs}" ) + local make_args=( "$package_name" ) + local arg last_arg + + for arg in "${@:$(( $package_type_nargs + 1 ))}"; do + if [ "$last_arg" = "--if" ]; then + "$arg" || return 0 + elif [ "$arg" != "--if" ]; then + make_args["${#make_args[@]}"]="$arg" + fi + last_arg="$arg" + done + + pushd "$BUILD_PATH" >&4 + "fetch_${package_type}" "${fetch_args[@]}" + make_package "${make_args[@]}" + popd >&4 + + echo "Installed ${package_name} to ${PREFIX_PATH}" >&2 +} + +make_package() { + local package_name="$1" + shift + + pushd "$package_name" >&4 + setup_builtin_patches "$package_name" + before_install_package "$package_name" + build_package "$package_name" $* + after_install_package "$package_name" + cleanup_builtin_patches "$package_name" + fix_directory_permissions + popd >&4 +} + +compute_sha2() { + local output + if type shasum &>/dev/null; then + output="$(shasum -a 256 -b)" || return 1 + echo "${output% *}" + elif type openssl &>/dev/null; then + local openssl="$(command -v "$(brew --prefix openssl 2>/dev/null || true)"/bin/openssl openssl | head -n1)" + output="$("$openssl" dgst -sha256 2>/dev/null)" || return 1 + echo "${output##* }" + elif type sha256sum &>/dev/null; then + output="$(sha256sum -b)" || return 1 + echo "${output%% *}" + else + return 1 + fi +} + +compute_md5() { + local output + if type md5 &>/dev/null; then + md5 -q + elif type openssl &>/dev/null; then + output="$(openssl md5)" || return 1 + echo "${output##* }" + elif type md5sum &>/dev/null; then + output="$(md5sum -b)" || return 1 + echo "${output%% *}" + else + return 1 + fi +} + +has_checksum_support() { + local checksum_command="$1" + local has_checksum_var="HAS_CHECKSUM_SUPPORT_${checksum_command}" + + if [ -z "${!has_checksum_var+defined}" ]; then + printf -v "$has_checksum_var" "$(echo test | "$checksum_command" >/dev/null; echo $?)" + fi + return "${!has_checksum_var}" +} + +verify_checksum() { + local checksum_command + local filename="$1" + local expected_checksum="$(echo "$2" | tr [A-Z] [a-z])" + + # If the specified filename doesn't exist, return success + [ -e "$filename" ] || return 0 + + case "${#expected_checksum}" in + 0) return 0 ;; # empty checksum; return success + 32) checksum_command="compute_md5" ;; + 64) checksum_command="compute_sha2" ;; + *) + { echo + echo "unexpected checksum length: ${#expected_checksum} (${expected_checksum})" + echo "expected 0 (no checksum), 32 (MD5), or 64 (SHA2-256)" + echo + } >&4 + return 1 ;; + esac + + # If chosen provided checksum algorithm isn't supported, return success + has_checksum_support "$checksum_command" || return 0 + + # If the computed checksum is empty, return failure + local computed_checksum=`echo "$($checksum_command < "$filename")" | tr [A-Z] [a-z]` + [ -n "$computed_checksum" ] || return 1 + + if [ "$expected_checksum" != "$computed_checksum" ]; then + { echo + echo "checksum mismatch: ${filename} (file is corrupt)" + echo "expected $expected_checksum, got $computed_checksum" + echo + } >&4 + return 1 + fi +} + +http() { + local method="$1" + [ -n "$2" ] || return 1 + shift 1 + + PYTHON_BUILD_HTTP_CLIENT="${PYTHON_BUILD_HTTP_CLIENT:-$(detect_http_client)}" + [ -n "$PYTHON_BUILD_HTTP_CLIENT" ] || return 1 + + "http_${method}_${PYTHON_BUILD_HTTP_CLIENT}" "$@" +} + +detect_http_client() { + local client + for client in aria2c curl wget; do + if type "$client" &>/dev/null; then + echo "$client" + return + fi + done + echo "error: please install \`aria2c\`, \`curl\`, or \`wget\` and try again" >&2 + return 1 +} + +http_head_aria2c() { + aria2c --dry-run --no-conf=true ${ARIA2_OPTS} "$1" >&4 2>&1 +} + +http_get_aria2c() { + # aria2c always treats -o argument as a relative path + local out dir_out; + if [[ -n "$2" ]]; then + out="$(basename $2)"; + dir_out="$(dirname $2)"; + else + out="$(mktemp "out.XXXXXX")"; + dir_out="$TMPDIR"; + fi + + # In Ubuntu, aria2c is only available as a snap. Snaps cannot read or write /tmp + # (files cannot be found, any write result is silently discarded). + local aria2c_is_snap; + if [[ $(command -v aria2c) == "/snap/"* ]]; then aria2c_is_snap=1; fi + + if [[ -n $aria2c_is_snap ]]; then + local real_dir_out="$dir_out" + # presumably, snaps can always write to under $HOME + dir_out="$HOME" + fi + + if aria2c --allow-overwrite=true --no-conf=true -d "${dir_out}" -o "${out}" ${ARIA2_OPTS} "$1" >&4; then + [ -n "$2" ] || cat "${dir_out:-.}/${out}" + else + false + fi + ret=$? + + if [[ -n "$2" && -n $aria2c_is_snap ]]; then + mv "$dir_out/$out" "$real_dir_out/$out" + fi + return "$ret" +} + +http_head_curl() { + curl -qsILf ${CURL_OPTS} "$1" >&4 2>&1 +} + +http_get_curl() { + local out; + # Curl is also available as a snap. Snaps cannot read or write /tmp + # (files cannot be found, any write result is silently discarded). + local curl_is_snap; + if [[ $(command -v curl) == "/snap/"* ]]; then curl_is_snap=1; fi + if [[ -n $2 && -n $curl_is_snap ]]; then out="$HOME/$(basename "$2")"; else out="$2"; fi + curl -q -o "${out:--}" -sSLf ${CURL_OPTS} "$1" || return $? + if [[ -n $out && -n $curl_is_snap ]]; then mv "$out" "$2"; fi +} + +http_head_wget() { + wget -q --spider ${WGET_OPTS} "$1" >&4 2>&1 +} + +http_get_wget() { + wget -nv ${WGET_OPTS} -O "${2:--}" "$1" +} + +fetch_tarball() { + local package_name="$1" + local package_url="$2" + local mirror_url + local checksum + local extracted_dir + + if [ "$package_url" != "${package_url/\#}" ]; then + checksum="${package_url#*#}" + package_url="${package_url%%#*}" + + if [ -n "$PYTHON_BUILD_MIRROR_URL" ]; then + if [[ -z "$PYTHON_BUILD_DEFAULT_MIRROR" || $package_url != */www.python.org/* ]]; then + mirror_url="${PYTHON_BUILD_MIRROR_URL}/$checksum" + fi + fi + fi + + local tar_args="xzf" + local package_filename="${package_name}.tar.gz" + + if [ "$package_url" != "${package_url%bz2}" ]; then + if ! type -p bzip2 >/dev/null; then + echo "warning: bzip2 not found; consider installing \`bzip2\` package" >&4 + fi + package_filename="${package_filename%.gz}.bz2" + tar_args="${tar_args/z/j}" + fi + + if [ "$package_url" != "${package_url%xz}" ]; then + if ! type -p xz >/dev/null; then + echo "warning: xz not found; consider installing \`xz\` package" >&4 + fi + package_filename="${package_filename%.gz}.xz" + tar_args="${tar_args/z/J}" + fi + + if ! reuse_existing_tarball "$package_filename" "$checksum"; then + # Report the cached file name -- sometimes, it's useful to know (#1743) + echo "Downloading ${package_filename}..." >&2 + http head "$mirror_url" && + download_tarball "$mirror_url" "$package_filename" "$checksum" || + download_tarball "$package_url" "$package_filename" "$checksum" + fi + + { if tar $tar_args "$package_filename"; then + if [ ! -d "$package_name" ]; then + extracted_dir="$(find_extracted_directory)" + mv "$extracted_dir" "$package_name" + fi + + if [ -z "$KEEP_BUILD_PATH" ]; then + rm -f "$package_filename" + else + true + fi + fi + } >&4 2>&1 +} + +find_extracted_directory() { + for f in *; do + if [ -d "$f" ]; then + echo "$f" + return + fi + done + echo "Extracted directory not found" >&2 + return 1 +} + +fetch_nightly_tarball() { + local package_name="$1" + local package_url="$2" + local package_pattern="$3" + fetch_tarball "$1" "$2" + if [ ! -e "${package_name}" ]; then + local nightly_package_name="$(echo ${package_pattern})" + if [ -e "${nightly_package_name}" ]; then + ln -fs "${nightly_package_name}" "${package_name}" + fi + fi +} + +reuse_existing_tarball() { + local package_filename="$1" + local checksum="$2" + + # Reuse existing file in build location + if [ -e "$package_filename" ] && verify_checksum "$package_filename" "$checksum"; then + return 0 + fi + + # Reuse previously downloaded file in cache location + [ -n "$PYTHON_BUILD_CACHE_PATH" ] || return 1 + local cached_package_filename="${PYTHON_BUILD_CACHE_PATH}/$package_filename" + + [ -e "$cached_package_filename" ] || return 1 + verify_checksum "$cached_package_filename" "$checksum" >&4 2>&1 || return 1 + ln -s "$cached_package_filename" "$package_filename" >&4 2>&1 || return 1 +} + +download_tarball() { + local official_source="www.python.org/ftp/python" + if [ -n "$PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM" ]; then + local package_url="$(echo "$1" | sed -e "s|.*//${URL_BASE:-$official_source}|$PYTHON_BUILD_MIRROR_URL|g")" + else + local package_url="$1" + fi + [ -n "$package_url" ] || return 1 + + local package_filename="$2" + local checksum="$3" + + echo "-> $package_url" >&2 + + if http get "$package_url" "$package_filename" >&4 2>&1; then + verify_checksum "$package_filename" "$checksum" >&4 2>&1 || return 1 + else + echo "error: failed to download $package_filename" >&2 + return 1 + fi + + if [ -n "$PYTHON_BUILD_CACHE_PATH" ]; then + local cached_package_filename="${PYTHON_BUILD_CACHE_PATH}/$package_filename" + { mv "$package_filename" "$cached_package_filename" + ln -s "$cached_package_filename" "$package_filename" + } >&4 2>&1 || return 1 + fi +} + +has_tar_xz_support() { + [[ -z $_PYTHON_BUILD_FORCE_SKIP_XZ ]] && tar Jcf - /dev/null 1>/dev/null 2>&1 +} + +fetch_git() { + local package_name="$1" + local git_url="$2" + local git_ref="$3" + + echo "Cloning ${git_url}..." >&2 + + if type git &>/dev/null; then + if [ -n "$PYTHON_BUILD_CACHE_PATH" ]; then + pushd "$PYTHON_BUILD_CACHE_PATH" >&4 + local clone_name="$(sanitize "$git_url")" + if [ -e "${clone_name}" ]; then + { cd "${clone_name}" + git fetch --force "$git_url" "+${git_ref}:${git_ref}" + } >&4 2>&1 + else + git clone --bare --branch "$git_ref" "$git_url" "${clone_name}" >&4 2>&1 + fi + git_url="$PYTHON_BUILD_CACHE_PATH/${clone_name}" + popd >&4 + fi + + if [ -e "${package_name}" ]; then + ( cd "${package_name}" + git fetch --depth 1 origin "+${git_ref}" + git checkout -q -B "$git_ref" "origin/${git_ref}" + ) >&4 2>&1 + else + git clone --depth 1 --branch "$git_ref" "$git_url" "${package_name}" >&4 2>&1 + fi + else + echo "error: please install \`git\` and try again" >&2 + exit 1 + fi +} + +fetch_hg() { + local package_name="$1" + local hg_url="$2" + local hg_ref="$3" + + echo "Cloning ${hg_url}..." >&2 + + if type hg &>/dev/null; then + if [ -n "$PYTHON_BUILD_CACHE_PATH" ]; then + pushd "$PYTHON_BUILD_CACHE_PATH" >&4 + local clone_name="$(sanitize "$hg_url")" + if [ -e "${clone_name}" ]; then + { cd "${clone_name}" + hg pull --force "$hg_url" + } >&4 2>&1 + else + { hg clone --branch "$hg_ref" "$hg_url" "${clone_name}" + cd "${clone_name}" + hg update null + } >&4 2>&1 + fi + hg_url="$PYTHON_BUILD_CACHE_PATH/${clone_name}" + popd >&4 + fi + + hg clone --branch "$hg_ref" "$hg_url" "${package_name}" >&4 2>&1 + else + echo "error: please install \`mercurial\` and try again" >&2 + exit 1 + fi +} + +fetch_svn() { + local package_name="$1" + local svn_url="$2" + local svn_rev="$3" + + echo "Checking out ${svn_url}..." >&2 + + if type svn &>/dev/null; then + svn co -r "$svn_rev" "$svn_url" "${package_name}" >&4 2>&1 + elif type svnlite &>/dev/null; then + svnlite co -r "$svn_rev" "$svn_url" "${package_name}" >&4 2>&1 + else + echo "error: please install Subversion and try again" >&2 + exit 1 + fi +} + +fetch_jar() { + local package_name="$1" + local package_url="$2" + local mirror_url + local checksum + + if [ "$package_url" != "${package_url/\#}" ]; then + checksum="${package_url#*#}" + package_url="${package_url%%#*}" + + if [ -n "$PYTHON_BUILD_MIRROR_URL" ]; then + mirror_url="${PYTHON_BUILD_MIRROR_URL}/$checksum" + fi + fi + + local package_filename="${package_name}.jar" + + if ! reuse_existing_tarball "$package_filename" "$checksum"; then + echo "Downloading ${package_filename}..." >&2 + http head "$mirror_url" && + download_tarball "$mirror_url" "$package_filename" "$checksum" || + download_tarball "$package_url" "$package_filename" "$checksum" + fi + + # Must use full path to jar and destination directory: + # http://bugs.jython.org/issue2350 + { if $JAVA -jar "$PWD/${package_name}.jar" -s -d "$PWD/${package_name}"; then + if [ -z "$KEEP_BUILD_PATH" ]; then + rm -f "$package_filename" + else + true + fi + fi + } >&4 2>&1 +} + +fetch_zip() { + local package_name="$1" + local package_url="$2" + local mirror_url + local checksum + + if [ "$package_url" != "${package_url/\#}" ]; then + checksum="${package_url#*#}" + package_url="${package_url%%#*}" + + if [ -n "$PYTHON_BUILD_MIRROR_URL" ]; then + mirror_url="${PYTHON_BUILD_MIRROR_URL}/$checksum" + fi + fi + + local package_filename="${package_name}.zip" + + if ! reuse_existing_tarball "$package_filename" "$checksum"; then + echo "Downloading ${package_filename}..." >&2 + http head "$mirror_url" && + download_tarball "$mirror_url" "$package_filename" "$checksum" || + download_tarball "$package_url" "$package_filename" "$checksum" + fi + + { if unzip "$package_filename"; then + if [ -z "$KEEP_BUILD_PATH" ]; then + rm -f "$package_filename" + else + true + fi + fi + } >&4 2>&1 +} + +fetch_script() { + local package_name="$1" + local package_url="$2" + local mirror_url + local checksum + + if [ "$package_url" != "${package_url/\#}" ]; then + checksum="${package_url#*#}" + package_url="${package_url%%#*}" + + if [ -n "$PYTHON_BUILD_MIRROR_URL" ]; then + mirror_url="${PYTHON_BUILD_MIRROR_URL}/$checksum" + fi + fi + + local package_filename="${package_name}.sh" # TODO: extract suffix from ${package_url} + + if ! reuse_existing_tarball "$package_filename" "$checksum"; then + echo "Downloading ${package_filename}..." >&2 + http head "$mirror_url" && + download_tarball "$mirror_url" "$package_filename" "$checksum" || + download_tarball "$package_url" "$package_filename" "$checksum" + fi + + mkdir -p "$(dirname "${package_name}/${package_filename}")" + mv -f "${package_filename}" "${package_name}/${package_filename}" +} + +build_package() { + local package_name="$1" + shift + + if [ "$#" -eq 0 ]; then + local commands="standard" + else + local commands="$*" + fi + + echo "Installing ${package_name}..." >&2 + + [ -n "$HAS_PATCH" ] && apply_patch "$package_name" <(cat "${package_name}.patch") + + for command in $commands; do + "build_package_${command}" "$package_name" + done +} + +package_option() { + local package_name="$1" + local command_name="$2" + local variable="$(capitalize "${package_name}_${command_name}")_OPTS_ARRAY" + local array="$variable[@]" + shift 2 + local value=( "${!array}" "$@" ) + eval "$variable=( \"\${value[@]}\" )" +} + +build_package_warn_eol() { + local package_name="$1" + + { echo + echo "WARNING: $package_name is past its end of life and is now unsupported." + echo "It no longer receives bug fixes or critical security updates." + echo + } >&3 +} + +build_package_warn_unsupported() { + local package_name="$1" + + { echo + echo "WARNING: $package_name is nearing its end of life." + echo "It only receives critical security updates, no bug fixes." + echo + } >&3 +} + +build_package_standard_build() { + local package_name="$1" + + if [ "${MAKEOPTS+defined}" ]; then + MAKE_OPTS="$MAKEOPTS" + elif [ -z "${MAKE_OPTS+defined}" ]; then + MAKE_OPTS="-j $(num_cpu_cores)" + fi + + # Support YAML_CONFIGURE_OPTS, PYTHON_CONFIGURE_OPTS, etc. + local package_var_name="$(capitalize "${package_name%%-*}")" + local PACKAGE_CONFIGURE="${package_var_name}_CONFIGURE" + local PACKAGE_PREFIX_PATH="${package_var_name}_PREFIX_PATH" + local PACKAGE_CONFIGURE_OPTS="${package_var_name}_CONFIGURE_OPTS" + local PACKAGE_CONFIGURE_OPTS_ARRAY="${package_var_name}_CONFIGURE_OPTS_ARRAY[@]" + local PACKAGE_MAKE_OPTS="${package_var_name}_MAKE_OPTS" + local PACKAGE_MAKE_OPTS_ARRAY="${package_var_name}_MAKE_OPTS_ARRAY[@]" + local PACKAGE_CFLAGS="${package_var_name}_CFLAGS" + local PACKAGE_CPPFLAGS="${package_var_name}_CPPFLAGS" + local PACKAGE_LDFLAGS="${package_var_name}_LDFLAGS" + + if [ "$package_var_name" = "PYTHON" ]; then + if can_use_homebrew; then + use_custom_tcltk || use_homebrew_tcltk || true + use_homebrew_readline || true + use_homebrew_ncurses || true + if is_mac -ge 1014; then + # While XCode SDK is "always available", + # still need a fallback in case we are using an alternate compiler + use_xcode_sdk_zlib || use_homebrew_zlib || true + else + use_homebrew_zlib || true + fi + fi + if can_use_macports; then + use_custom_tcltk || true + use_macports_readline || true + use_macports_ncurses || true + if is_mac -ge 1014; then + # While XCode SDK is "always available", + # still need a fallback in case we are using an alternate compiler + use_xcode_sdk_zlib || use_homebrew_zlib || true + else + use_macports_zlib || true + fi + fi + if can_use_homebrew; then + use_homebrew || true + fi + if can_use_macports; then + use_macports || true + fi + if is_mac -ge 1014 && ! can_use_homebrew && ! can_use_macports; then + use_xcode_sdk_zlib || true + fi + + use_freebsd_pkg || true + + use_dsymutil || true + use_free_threading || true + fi + + ( if [[ -n "${!PACKAGE_CFLAGS}" ]]; then + export CFLAGS="${CFLAGS:+$CFLAGS }${!PACKAGE_CFLAGS}" + fi + if [[ -n "${!PACKAGE_CPPFLAGS}" ]]; then + export CPPFLAGS="${CPPFLAGS:+$CPPFLAGS }${!PACKAGE_CPPFLAGS}" + fi + if [[ -n "${!PACKAGE_LDFLAGS}" ]]; then + export LDFLAGS="${LDFLAGS:+$LDFLAGS }${!PACKAGE_LDFLAGS}" + fi + if [ -z "$CC" ] && is_mac -ge 1010; then + export CC=clang + fi + ${!PACKAGE_CONFIGURE:-./configure} --prefix="${!PACKAGE_PREFIX_PATH:-$PREFIX_PATH}" \ + "${!PACKAGE_CONFIGURE_OPTS_ARRAY}" $CONFIGURE_OPTS ${!PACKAGE_CONFIGURE_OPTS} || return 1 + ) >&4 2>&1 + + { "$MAKE" "${!PACKAGE_MAKE_OPTS_ARRAY}" $MAKE_OPTS ${!PACKAGE_MAKE_OPTS} + } >&4 2>&1 +} + +build_package_standard_install() { + local package_name="$1" + local package_var_name="$(capitalize "${package_name%%-*}")" + + local PACKAGE_MAKE_INSTALL_OPTS="${package_var_name}_MAKE_INSTALL_OPTS" + local PACKAGE_MAKE_INSTALL_OPTS_ARRAY="${package_var_name}_MAKE_INSTALL_OPTS_ARRAY[@]" + local PACKAGE_MAKE_INSTALL_TARGET="${package_var_name}_MAKE_INSTALL_TARGET" + + { "$MAKE" "${!PACKAGE_MAKE_INSTALL_TARGET:-install}" $MAKE_INSTALL_OPTS ${!PACKAGE_MAKE_INSTALL_OPTS} "${!PACKAGE_MAKE_INSTALL_OPTS_ARRAY}" + } >&4 2>&1 +} + +# Backward Compatibility for standard function +build_package_standard() { + build_package_standard_build "$@" + build_package_standard_install "$@" +} + +build_package_autoconf() { + { autoreconf + } >&4 2>&1 +} + +build_package_python() { + local package_name="$1" + + { "$PYTHON_BIN" setup.py install + } >&4 2>&1 +} + +remove_windows_files() { + cd "$PREFIX_PATH" + rm -f bin/*.exe bin/*.dll bin/*.bat +} + +build_package_jython() { + build_package_copy + { if [ -x "${PREFIX_PATH}/bin/jython" ] && [ ! -x "${PREFIX_PATH}/bin/python" ]; then + ( cd "${PREFIX_PATH}/bin" && ln -fs jython python ) + fi + } >&4 2>&1 + fix_jython_shebangs +} + +fix_jython_shebangs() { + # Workaround for Jython 2.7+ (#458) + for file in "${PREFIX_PATH}/bin"/*; do + case "$(head -n1 "${file}")" in + "#!"*"/bin/jython" ) + sed -i.bak "1 s:.*:#\!${PREFIX_PATH}\/bin\/jython:" "${file}" + ;; + "#!"*"/bin/python2.7"* ) + sed -i.bak "1 s:.*:#\!\/usr\/bin\/env python:" "${file}" + ;; + esac + rm -f "${file}.bak" + done +} + +build_package_jython_builder() { + ant >&4 2>&1 + ( cd "dist" && build_package_jython ) +} + +build_package_pyston2_2() { + # currently supported version 2.2 and 2.3 + build_package_copy + mkdir -p "${PREFIX_PATH}/bin" "${PREFIX_PATH}/lib" + local bin + shopt -s nullglob + for bin in "bin/"*; do + if [ -f "${bin}" ] && [ -x "${bin}" ] && [ ! -L "${bin}" ]; then + case "${bin##*/}" in + "pyston"* ) + ( cd "${PREFIX_PATH}/bin" && ln -fs "${bin##*/}" "python" ) + ;; + esac + fi + done + shopt -u nullglob +} + +build_package_pyston() { + # currently supported version 2.3.1v2 and higher + build_package_copy +} + +build_package_ironpython() { + mkdir -p "${PREFIX_PATH}/bin" + cp -fR . "${PREFIX_PATH}/bin" + chmod +x "${PREFIX_PATH}/bin/"*.exe + ( cd "${PREFIX_PATH}/bin" && ln -fs ipy.exe python ) +} + +build_package_ironpython_builder() { + xbuild Build.proj /t:Stage "/p:Mono=true;BaseConfiguration=Release" >&4 2>&1 + ( cd "Stage/Release/IronPython-"* && build_package_ironpython ) +} + +build_package_micropython_1_9() { + # supported version 1.9.3 and 1.9.4 + build_package_micropython "with_axtls" +} + +build_package_micropython() { + # supported version 1.10 and higher + if [ "${MAKEOPTS+defined}" ]; then + MAKE_OPTS="$MAKEOPTS" + elif [ -z "${MAKE_OPTS+defined}" ]; then + MAKE_OPTS="-j $(num_cpu_cores)" + fi + { cd mpy-cross + "$MAKE" $MAKE_OPTS + cd ../ports/unix + [ "$1" = "with_axtls" ] && "$MAKE" $MAKE_OPTS axtls + "$MAKE" $MAKE_OPTS CFLAGS_EXTRA="-DMICROPY_PY_SYS_PATH_DEFAULT='\".frozen:${PREFIX_PATH}/lib/micropython\"' $CFLAGS_EXTRA" + "$MAKE" install $MAKE_INSTALL_OPTS PREFIX="${PREFIX_PATH}" + ln -fs micropython "${PREFIX_PATH}/bin/python" + mkdir -p "${PREFIX_PATH}/lib/micropython" + }>&4 2>&1 +} + +pypy_architecture() { + case "${_PYTHON_BUILD_CACHE_UNAME_S:=$(uname -s)}" in + "Darwin" ) + case "$(uname -m)" in + "arm64" ) echo "osarm64" ;; + "x86_64" ) echo "osx64" ;; + * ) return 1 ;; + esac + ;; + "Linux" ) + case "$(uname -m)" in + "armel" ) echo "linux-armel" ;; + "armhf" | "armv6l" | "armv7l" ) echo "linux-armhf" ;; + "i386" | "i486" | "i586" | "i686" | "i786" ) echo "linux" ;; + "ppc64" ) echo "linux-ppc64" ;; + "ppc64le" ) echo "linux-ppc64le" ;; + "x86_64" ) echo "linux64" ;; + "aarch64" ) echo "linux-aarch64" ;; + * ) return 1 ;; + esac + ;; + "CYGWIN"* | "MINGW"* ) echo "win32" ;; + "FreeBSD" ) + case "$(uname -m)" in + "x86_64" ) echo "freebsd64" ;; + * ) return 1 ;; + esac + ;; + * ) return 1 ;; + esac +} + +graalpy_architecture() { + case "${_PYTHON_BUILD_CACHE_UNAME_S:=$(uname -s)}" in + "Darwin" ) + case "$(uname -m)" in + "x86_64" ) echo "macos-amd64" ;; + "arm64" ) echo "macos-aarch64" ;; + * ) return 1 ;; + esac + ;; + "Linux" ) + case "$(uname -m)" in + "x86_64" ) echo "linux-amd64" ;; + "aarch64" ) echo "linux-aarch64" ;; + * ) return 1 ;; + esac + ;; + esac +} + +pyston_architecture() { + pypy_architecture +} + +# Note: not used by graalpy >= 23.3.0 anymore +build_package_graalpython() { + build_package_copy + ln -fs "${PREFIX_PATH}/bin/graalpython" "${PREFIX_PATH}/bin/python" +} + +build_package_pypy() { + build_package_copy + mkdir -p "${PREFIX_PATH}/bin" "${PREFIX_PATH}/lib" + local bin + shopt -s nullglob + for bin in "bin/"*; do + if [ -f "${bin}" ] && [ -x "${bin}" ] && [ ! -L "${bin}" ]; then + case "${bin##*/}" in + "libpypy"* ) + ( cd "${PREFIX_PATH}/lib" && ln -fs "../bin/${bin##*/}" "${bin##*/}" ) + ;; + "pypy"* ) + ( cd "${PREFIX_PATH}/bin" && ln -fs "${bin##*/}" "python" ) + ;; + esac + fi + done + shopt -u nullglob +} + +build_package_pypy_builder() { + if [ -f "rpython/bin/rpython" ]; then # pypy 2.x + if [ -z "${PYPY_OPTS}" ]; then + local PYPY_OPTS="--opt=jit --batch --make-jobs=$(num_cpu_cores)" + fi + python "rpython/bin/rpython" ${PYPY_OPTS} "pypy/goal/targetpypystandalone.py" >&4 2>&1 + elif [ -f "pypy/translator/goal/translate.py" ]; then # pypy 1.x + if [ -z "${PYPY_OPTS}" ]; then + local PYPY_OPTS="--opt=jit" + fi + ( cd "pypy/translator/goal" && python "translate.py" ${PYPY_OPTS} "targetpypystandalone.py" ) 1>&4 2>&1 + else + echo "not a pypy source tree" 1>&3 + return 1 + fi + { mkdir -p "bin" "lib" + local pypy + for pypy in "pypy"*; do + if [ -f "${pypy}" ] && [ -x "${pypy}" ] && [ ! -L "${pypy}" ]; then + mv -f "${pypy}" "bin/${pypy##*/}" + fi + done + local libpypy + for libpypy in "libpypy"*; do + if [ -f "${libpypy}" ] && [ -x "${libpypy}" ] && [ ! -L "${libpypy}" ]; then + mv -f "${libpypy}" "bin/${libpypy##*/}" + fi + done + } >&4 2>&1 + build_package_pypy +} + +activepython_architecture() { + case "${_PYTHON_BUILD_CACHE_UNAME_S:=$(uname -s)}" in + "Darwin" ) echo "macosx10.9-i386-x86_64" ;; + "Linux" ) + case "$(uname -m)" in + "i386" | "i486" | "i586" | "i686" | "i786" ) echo "linux-x86" ;; + "x86_64" ) echo "linux-x86_64" ;; + * ) return 1 ;; + esac + ;; + * ) return 1 ;; + esac +} + +build_package_activepython() { + local package_name="$1" + { bash "install.sh" --install-dir "${PREFIX_PATH}" + } >&4 2>&1 +} + +anaconda_architecture() { + case "${_PYTHON_BUILD_CACHE_UNAME_S:=$(uname -s)}" in + "Darwin" ) + case "$(uname -m)" in + "arm64" ) echo "MacOSX-arm64" ;; + * ) echo "MacOSX-x86_64" ;; + esac + ;; + "Linux" ) + case "$(uname -m)" in + "armv7l" ) echo "Linux-armv7l" ;; + "aarch64" ) echo "Linux-aarch64" ;; + "i386" | "i486" | "i586" | "i686" | "i786" ) echo "Linux-x86" ;; + "ppc64le" ) echo "Linux-ppc64le" ;; + "x86_64" ) echo "Linux-x86_64" ;; + * ) return 1 ;; + esac + ;; + * ) return 1 ;; + esac +} + +build_package_anaconda() { + local package_name="$1" + { bash "${package_name}.sh" -f -b -p "${PREFIX_PATH}" + } >&4 2>&1 +} + +build_package_miniconda() { + build_package_anaconda "$@" + # Workaround to not upgrade conda when installing pip + # see https://github.com/pyenv/pyenv/issues/2070 + "${PREFIX_PATH}/bin/conda" install --yes "pip" "conda=$(${PREFIX_PATH}/bin/conda --version | cut -d ' ' -f 2)" +} + +build_package_copy() { + mkdir -p "$PREFIX_PATH" + cp -fR . "$PREFIX_PATH" +} + +before_install_package() { + local stub=1 +} + +after_install_package() { + local stub=1 +} + +setup_builtin_patches() { + local package_name="$1" + local package_patch_path="${DEFINITION_PATH%/*}/patches/${DEFINITION_PATH##*/}/${package_name}" + +# Apply built-in patches if patch was not given from stdin + if [[ -n "$HAS_STDIN_PATCH" ]] && package_is_python "${package_name}"; then + cat >"${package_name}.patch" + HAS_PATCH=true + elif [[ -d "${package_patch_path}" ]]; then + { find "${package_patch_path}" -maxdepth 1 -type f -print0 + } 2>/dev/null | sort -z | xargs -0 cat 1>"${package_name}.patch" + HAS_PATCH=true + fi +} + +cleanup_builtin_patches() { + local package_name="$1" + rm -f "${package_name}.patch" + unset HAS_PATCH +} + +fix_directory_permissions() { + # Ensure installed directories are not world-writable + find "$PREFIX_PATH" -type d \( -perm -020 -o -perm -002 \) -exec chmod go-w {} \; +} + +require_java7() { + local version="$(java -version 2>&1 | grep '\(java\|openjdk\) version' | head -n1)" + if [[ $version != *[789]* ]]; then + colorize 1 "ERROR" >&3 + echo ": Java 7 required. Please install a 1.7-compatible JRE." >&3 + return 1 + fi +} + +require_gcc() { + local gcc="$(locate_gcc || true)" + + if [ -z "$gcc" ]; then + { echo + colorize 1 "ERROR" + echo ": This package must be compiled with GCC, but python-build couldn't" + echo "find a suitable \`gcc\` executable on your system. Please install GCC" + echo "and try again." + echo + + if is_mac; then + colorize 1 "DETAILS" + echo ": Apple no longer includes the official GCC compiler with Xcode" + echo "as of version 4.2. Instead, the \`gcc\` executable is a symlink to" + echo "\`llvm-gcc\`, a modified version of GCC which outputs LLVM bytecode." + echo + echo "For most programs the \`llvm-gcc\` compiler works fine. However," + echo "versions of CPython newer than 3.3.0 are incompatible with" + echo "\`llvm-gcc\`. To build newer versions of CPython you must have the official" + echo "GCC compiler installed on your system." + echo + + colorize 1 "TO FIX THE PROBLEM" + if type brew &>/dev/null; then + echo ": Install Homebrew's GCC package with this" + echo -n "command: " + colorize 4 "brew install gcc@4.9" + else + echo ": Install the official GCC compiler using these" + echo -n "packages: " + colorize 4 "https://github.com/kennethreitz/osx-gcc-installer/downloads" + fi + + echo + echo + echo "You will need to install the official GCC compiler to build newer" + echo "versions of CPython even if you have installed Apple's Command Line Tools" + echo "for Xcode package. The Command Line Tools for Xcode package only" + echo "includes \`llvm-gcc\`." + fi + } >&3 + return 1 + fi + + export CC="$gcc" + if is_mac -ge 1010; then + export MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET:-10.9} + fi +} + +locate_gcc() { + local gcc gccs + IFS=: gccs=($(gccs_in_path)) + IFS="$OLDIFS" + + verify_gcc "$CC" || + verify_gcc "$(command -v gcc || true)" || { + for gcc in "${gccs[@]}"; do + verify_gcc "$gcc" && break || true + done + } + + return 1 +} + +gccs_in_path() { + local gcc path paths + local gccs=() + IFS=: paths=($PATH) + IFS="$OLDIFS" + + shopt -s nullglob + for path in "${paths[@]}"; do + for gcc in "$path"/gcc-*; do + gccs["${#gccs[@]}"]="$gcc" + done + done + shopt -u nullglob + + printf :%s "${gccs[@]}" +} + +verify_gcc() { + local gcc="$1" + if [ -z "$gcc" ]; then + return 1 + fi + + local version="$("$gcc" --version 2>/dev/null || true)" + if [ -z "$version" ]; then + return 1 + fi + + if echo "$version" | grep LLVM >/dev/null; then + return 1 + fi + + echo "$gcc" +} + +require_llvm() { + local llvm_version="$1" + if is_mac -ge 1010; then + if [[ "$PYTHON_CONFIGURE_OPTS" != *--llvm-* ]]; then + case "$llvm_version" in + 3.2 ) + package_option python configure --prebuilt-name="llvm-3.2-x86_64-apple-darwin13.tar.bz2" + ;; + 3.[56] ) + local llvm_config="$(locate_llvm "$llvm_version")" + if [ -n "$llvm_config" ]; then + package_option python configure --llvm-config="$llvm_config" + else + local homebrew_package="llvm@$llvm_version" + { echo + colorize 1 "ERROR" + echo ": Rubinius will not be able to compile using Apple's LLVM-based " + echo "build tools on OS X. You will need to install LLVM $llvm_version first." + echo + colorize 1 "TO FIX THE PROBLEM" + echo ": Install Homebrew's llvm package with this" + echo -n "command: " + colorize 4 "brew install $homebrew_package" + echo + } >&3 + return 1 + fi + ;; + esac + fi + fi +} + +locate_llvm() { + local llvm_version="$1" + local package llvm_config + shopt -s nullglob + for package in `brew list 2>/dev/null | grep "^llvm"`; do + llvm_config="$(echo "$(brew --prefix "$package")/bin/llvm-config"*)" + if [ -n "$llvm_config" ] && [[ "$("$llvm_config" --version)" = "$llvm_version"* ]]; then + echo "$llvm_config" + break + fi + done + shopt -u nullglob +} + +require_java() { + local java="$(command -v java || true)" + + if [ -z "$java" ]; then + { echo + colorize 1 "ERROR" + echo ": This package must be installed with java, but python-build couldn't" + echo "find a suitable \`java\` executable on your system. Please install Java" + echo "and try again." + echo + } >&3 + return 1 + fi + + export JAVA="$java" +} + +# Let Jython installer to generate shell script instead of python script even if there's `python2.7` available in `$PATH` (#800) +# FIXME: better function naming +unrequire_python27() { + export PATH="${BUILD_PATH}/bin:${PATH}" + mkdir -p "${BUILD_PATH}/bin" + if command -v python2.7 1>/dev/null 2>&1; then + echo false > "${BUILD_PATH}/bin/python2.7" + chmod +x "${BUILD_PATH}/bin/python2.7" + fi +} + +require_distro() { + for arg; do + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "$arg"* ]]; then + return 0 + fi + done + { echo + colorize 1 "WARNING" + echo ": This binary distribution is built for the following distro(s): $@." + echo "installed binary may not run expectedly on other platforms." + echo + } >&2 + return 1 +} + +require_osx_version() { + function version { echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\n", $1,$2,$3,$4); }'; } + + local required_version="$@" + local osx_version="${_PYTHON_BUILD_CACHE_SW_VERS:=$(sw_vers -productVersion)}" + if [[ $(version $osx_version) -ge $(version $required_version) ]]; then + return 0 + fi + return 1 +} + +configured_with_package_dir() { + local package_var_name="$(capitalize "$1")" + shift 1 + local PACKAGE_CONFIGURE_OPTS="${package_var_name}_CONFIGURE_OPTS" + local PACKAGE_CONFIGURE_OPTS_ARRAY="${package_var_name}_MAKE_OPTS_ARRAY[@]" + local arg flag + for arg in ${CONFIGURE_OPTS} ${!PACKAGE_CONFIGURE_OPTS} "${!PACKAGE_CONFIGURE_OPTS_ARRAY}"; do + if [[ "$arg" == "CPPFLAGS="* ]]; then + for flag in ${CPPFLAGS} ${arg##CPPFLAGS=}; do + if [[ "$flag" == "-I"* ]]; then + local header + for header in "$@"; do + if [ -e "${flag##-I}/${header#/}" ]; then + return 0 + fi + done + fi + done + fi + done + return 1 +} + +# `python-config` ignores LDFLAGS envvar. Adding to LIBS is the only way to add extra stuff +# to `python-config --ldflags` output +append_ldflags_libs() { + local args="$1" + export LDFLAGS="${LDFLAGS:+$LDFLAGS }$args" + export LIBS="${LIBS:+${LIBS% } }$args" +} +prepend_ldflags_libs() { + local args="$1" + export LDFLAGS="$args${LDFLAGS:+ $LDFLAGS}" + export LIBS="$args${LIBS:+ $LIBS}" +} + +use_homebrew() { + can_use_homebrew || return 1 + # unless Homebrew is at the default /usr/local, need to add its paths to + # compiler search to be able to use non-keg-only deps from there + if command -v brew &>/dev/null; then + local brew_prefix="$(brew --prefix 2>/dev/null || true)" + # /usr/local/lib:/usr/lib is the default library search path + if [[ -n $brew_prefix && ( ( $brew_prefix != "/usr" && $brew_prefix != "/usr/local" ) + #when -isysroot is passed to Apple CLang, /usr/(local) are excluded from the default search path + || ( is_mac && osx_using_default_compiler && $CFLAGS =~ (^|\ )-isysroot\ ) ) ]]; then + export CPPFLAGS="${CPPFLAGS:+$CPPFLAGS }-I${brew_prefix}/include" + append_ldflags_libs "-L${brew_prefix}/lib -Wl,-rpath,${brew_prefix}/lib" + lock_in homebrew + fi + fi +} + +use_macports() { + can_use_macports || return 1 + local port_location="$(command -v port)" + if [ -n "$port_location" ]; then + local prefix="${port_location%/bin/port}" + export CPPFLAGS="-I${prefix}/include${CPPFLAGS:+ $CPPFLAGS}" + prepend_ldflags_libs "-L${prefix}/lib -Wl,-rpath,${prefix}/lib" + export PKG_CONFIG_PATH="$prefix/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" + lock_in macports + fi +} + +needs_yaml() { + if ! configured_with_package_dir "python" "yaml.h"; then + if can_use_homebrew; then + use_homebrew_yaml && return 1 + elif can_use_macports; then + use_macports_yaml && return 1 + fi + fi +} + +use_homebrew_yaml() { + can_use_homebrew || return 1 + local libdir="$(brew --prefix libyaml 2>/dev/null || true)" + if [ -d "$libdir" ]; then + echo "python-build: use libyaml from homebrew" + export CPPFLAGS="-I$libdir/include${CPPFLAGS:+ $CPPFLAGS}" + export LDFLAGS="-L$libdir/lib${LDFLAGS:+ ${LDFLAGS% }}" + lock_in homebrew + else + return 1 + fi +} + +use_macports_yaml() { + can_use_macports || return 1 + if [[ $(port -q installed libyaml | awk '{print $3}') == "(active)" ]]; then + echo "python-build: use libyaml from MacPorts" + lock_in macports + else + return 1 + fi +} + +use_freebsd_pkg() { + # check if FreeBSD + if [ "FreeBSD" = "${_PYTHON_BUILD_CACHE_UNAME_S:=$(uname -s)}" ]; then + # use openssl if installed from Ports Collection + if pkg info -e openssl; then + package_option python configure --with-openssl="/usr/local" + fi + + # check if 11-R or later + release="${_PYTHON_BUILD_CACHE_UNAME_R:=$(uname -r)}" + if [ "${release%%.*}" -ge 11 ]; then + # Use packages from Ports Collection. + # + # Unlike Linux, BSD's cc does not look in /usr/local by default + # where Ports-installed packages are, but they are available via pkg-config. + # Surprisingly, CPython's Configure only uses pkg-config + # to locate some of the dependencies and not others. + # Here we detect those that are (as of this writing) known + # to not be searched via pkg-config. + # + # XXX: As a side effect, this would pick up any other libs from Ports + # that are searched via compiler + if pkg info -e readline || pkg info -e sqlite3; then + export CPPFLAGS="${CPPFLAGS:+$CPPFLAGS }-I/usr/local/include" + export LDFLAGS="${LDFLAGS:+$LDFLAGS }-L/usr/local/lib -Wl,-rpath,/usr/local/lib" + fi + fi + fi +} + +has_broken_mac_readline() { + # Mac OS X 10.4 has broken readline. + # https://github.com/pyenv/pyenv/issues/23 + if ! is_mac || configured_with_package_dir "python" "readline/rlconf.h"; then + # Not applicable. + return 1 + fi + if can_use_homebrew; then + use_homebrew_readline && return 1 + fi + if can_use_macports; then + use_macports_readline && return 1 + fi + return 0 +} + +use_homebrew_readline() { + can_use_homebrew || return 1 + if ! configured_with_package_dir "python" "readline/rlconf.h"; then + local libdir="$(brew --prefix readline 2>/dev/null || true)" + if [ -d "$libdir" ]; then + echo "python-build: use readline from homebrew" + export CPPFLAGS="-I$libdir/include${CPPFLAGS:+ $CPPFLAGS}" + export LDFLAGS="-L$libdir/lib${LDFLAGS:+ $LDFLAGS}" + lock_in homebrew + else + return 1 + fi + fi +} + +use_macports_readline() { + can_use_macports || return 1 + if ! configured_with_package_dir "python" "readline/rlconf.h"; then + if [[ $(port -q installed readline | awk '{print $3}') == "(active)" ]]; then + echo "python-build: use readline from MacPorts" + lock_in macports + else + return 1 + fi + fi +} + +use_homebrew_ncurses() { + can_use_homebrew || return 1 + local libdir="$(brew --prefix ncurses 2>/dev/null || true)" + if [ -d "$libdir" ]; then + echo "python-build: use ncurses from homebrew" + export CPPFLAGS="-I$libdir/include${CPPFLAGS:+ $CPPFLAGS}" + export LDFLAGS="-L$libdir/lib${LDFLAGS:+ $LDFLAGS}" + lock_in homebrew + else + return 1 + fi +} + +use_macports_ncurses() { + can_use_macports || return 1 + if [[ $(port -q installed ncurses | awk '{print $3}') == "(active)" ]]; then + echo "python-build: use ncurses from MacPorts" + lock_in macports + else + return 1 + fi +} + +prefer_openssl11() { + # Allow overriding the preference of OpenSSL version per definition basis (#1302, #1325, #1326) + PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA="${PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA:-openssl@1.1 openssl}" + export PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA + + PYTHON_BUILD_MACPORTS_OPENSSL_FORMULA="${PYTHON_BUILD_MACPORTS_OPENSSL_FORMULA:-openssl11 openssl3 openssl}" + export PYTHON_BUILD_MACPORTS_OPENSSL_FORMULA + +} + +prefer_openssl3() { + # Allow overriding the preference of OpenSSL version per definition basis (#1302, #1325, #1326) + PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA="${PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA:-openssl@3 openssl@1.1 openssl}" + export PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA + + # Set MacPorts OpenSSL formula names for MacPorts environment + PYTHON_BUILD_MACPORTS_OPENSSL_FORMULA="${PYTHON_BUILD_MACPORTS_OPENSSL_FORMULA:-openssl3 openssl openssl11}" + export PYTHON_BUILD_MACPORTS_OPENSSL_FORMULA +} + +build_package_mac_readline() { + # Install to a subdirectory since we don't want shims for bin/readline. + READLINE_PREFIX_PATH="${PREFIX_PATH}/readline" + + # Tell Python to use this readline for its extension. + export CPPFLAGS="-I${READLINE_PREFIX_PATH}/include${CPPFLAGS:+ $CPPFLAGS}" + export LDFLAGS="-L${READLINE_PREFIX_PATH}/lib${LDFLAGS:+ $LDFLAGS}" + + # Make sure pkg-config finds our build first. + export PKG_CONFIG_PATH="${READLINE_PREFIX_PATH}/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" + + build_package_standard "$@" +} + +has_broken_mac_openssl() { + is_mac || return 1 + local openssl_version="$(/usr/bin/openssl version 2>/dev/null || true)" + if [[ $openssl_version = "OpenSSL 0.9.8"?* || $openssl_version = "LibreSSL"* ]]; then + if can_use_homebrew; then + use_homebrew_openssl && return 1 + fi + if can_use_macports; then + use_macports_openssl && return 1 + fi + fi + return 0 +} + +use_homebrew_openssl() { + can_use_homebrew || return 1 + command -v brew >/dev/null || return 1 + for openssl in ${PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA:-openssl}; do + local ssldir="$(brew --prefix "${openssl}" || true)" + if [ -d "$ssldir" ]; then + echo "python-build: use ${openssl} from homebrew" + if [[ -n "${PYTHON_BUILD_CONFIGURE_WITH_OPENSSL:-}" ]]; then + # configure script of newer CPython versions support `--with-openssl` + # https://bugs.python.org/issue21541 + package_option python configure --with-openssl="${ssldir}" + else + export CPPFLAGS="-I$ssldir/include ${CPPFLAGS:+ $CPPFLAGS}" + export LDFLAGS="-L$ssldir/lib${LDFLAGS:+ $LDFLAGS}" + fi + export PKG_CONFIG_PATH="$ssldir/lib/pkgconfig/:${PKG_CONFIG_PATH}" + lock_in homebrew + return 0 + fi + done + return 1 +} + +use_macports_openssl() { + can_use_macports || return 1 + command -v port >/dev/null || return 1 + local port_location="$(command -v port)" + local prefix="${port_location%/bin/port}" + # MacPorts uses a different package naming convention and does not use the @ symbol. + for openssl in ${PYTHON_BUILD_MACPORTS_OPENSSL_FORMULA:-openssl3 openssl}; do + if [[ $(port -q installed ${openssl} | awk '{print $3}') == "(active)" ]]; then + echo "python-build: use ${openssl} from MacPorts" + if [[ -n "${PYTHON_BUILD_CONFIGURE_WITH_OPENSSL:-}" ]]; then + # configure script of newer CPython versions support `--with-openssl` + # https://bugs.python.org/issue21541 + package_option python configure --with-openssl="${prefix}" + fi + lock_in macports + return 0 + fi + done + return 1 +} + +build_package_mac_openssl() { + # Install to a subdirectory since we don't want shims for bin/openssl. + OPENSSL_PREFIX_PATH="${PREFIX_PATH}/openssl" + + # Put openssl.conf, certs, etc in ~/.pyenv/versions/*/openssl/ssl + OPENSSLDIR="${OPENSSLDIR:-$OPENSSL_PREFIX_PATH/ssl}" + + # Tell Python to use this openssl for its extension. + if [[ -n "${PYTHON_BUILD_CONFIGURE_WITH_OPENSSL:-}" ]]; then + # configure script of newer CPython versions support `--with-openssl` + # https://bugs.python.org/issue21541 + package_option python configure --with-openssl="${OPENSSL_PREFIX_PATH}" + else + export CPPFLAGS="-I${OPENSSL_PREFIX_PATH}/include ${CPPFLAGS:+ $CPPFLAGS}" + export LDFLAGS="-L${OPENSSL_PREFIX_PATH}/lib${LDFLAGS:+ $LDFLAGS}" + fi + + # Make sure pkg-config finds our build first. + export PKG_CONFIG_PATH="${OPENSSL_PREFIX_PATH}/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" + + # Hint OpenSSL that we prefer a 64-bit build. + export KERNEL_BITS="64" + OPENSSL_CONFIGURE="${OPENSSL_CONFIGURE:-./config}" + + local nokerberos + [[ "$1" != openssl-1.0.* ]] || nokerberos=1 + + # switches introduced in OpenSSL 1.1.1 + local notests + [[ $(openssl_version $1) -ge 10101 ]] && notests=1 + + # switches introduced in OpenSSL 3.2 + local extra_no_features + [[ $(openssl_version $1) -ge 30200 ]] && extra_no_features=1 + + # Compile a shared lib with zlib dynamically linked. + package_option openssl configure --openssldir="$OPENSSLDIR" zlib-dynamic no-ssl3 shared ${nokerberos:+no-ssl2 no-krb5} ${extra_no_features:+no-docs no-apps} ${notests:+no-tests} + + build_package_standard "$@" + + # Extract root certs from the system keychain in .pem format and rehash. + local pem_file="$OPENSSLDIR/cert.pem" + security find-certificate -a -p /Library/Keychains/System.keychain > "$pem_file" + security find-certificate -a -p /System/Library/Keychains/SystemRootCertificates.keychain >> "$pem_file" +} + +# openssl-1.0.1k -> 10001 +# openssl-3.2.1 -> 30201 +openssl_version() { + local -a ver + IFS=- ver=( ${1:?} ) + IFS=. ver=( ${ver[1]} ) + [[ ${ver[2]} =~ ^([[:digit:]]+)[[:alpha:]]$ ]] && ver[2]="${BASH_REMATCH[1]}" + echo $(( ${ver[0]}*10000 + ${ver[1]}*100 + ${ver[2]} )) +} + +# Post-install check that the openssl extension was built. +build_package_verify_openssl() { + "$RUBY_BIN" -e ' + manager = ARGV[0] + packages = { + "apt-get" => Hash.new {|h,k| "lib#{k}-dev" }.update( + "openssl" => "libssl-dev", + "zlib" => "zlib1g-dev" + ), + "yum" => Hash.new {|h,k| "#{k}-devel" }.update( + "yaml" => "libyaml-devel" + ) + } + + failed = %w[openssl readline zlib yaml].reject do |lib| + begin + require lib + rescue LoadError + $stderr.puts "The Ruby #{lib} extension was not compiled." + end + end + + if failed.size > 0 + $stderr.puts "ERROR: Ruby install aborted due to missing extensions" + $stderr.print "Try running `%s install -y %s` to fetch missing dependencies.\n\n" % [ + manager, + failed.map { |lib| packages.fetch(manager)[lib] }.join(" ") + ] unless manager.empty? + $stderr.puts "Configure options used:" + require "rbconfig"; require "shellwords" + RbConfig::CONFIG.fetch("configure_args").shellsplit.each { |arg| $stderr.puts " #{arg}" } + exit 1 + end + ' "$(basename "$(type -P yum apt-get | head -n1)")" >&4 2>&1 +} + +use_homebrew_zlib() { + can_use_homebrew || return 1 + local brew_zlib="$(brew --prefix zlib 2>/dev/null || true)" + if [ -d "$brew_zlib" ]; then + echo "python-build: use zlib from homebrew" + export CPPFLAGS="-I${brew_zlib}/include${CPPFLAGS:+ ${CPPFLAGS}}" + export LDFLAGS="-L${brew_zlib}/lib${LDFLAGS:+ ${LDFLAGS}}" + lock_in homebrew + rc=0 + fi +} + +use_xcode_sdk_zlib() { + # If a custom compiler is used, including XCode SDK will likely break it + osx_using_default_compiler || return 1 + + local sdkroot="$(xcrun --sdk macosx --show-sdk-path 2>/dev/null || true)" + [[ -z ${sdkroot} || ! -d ${sdkroot} ]] && return 1 + + # Since Xcode 16 / macOS SDK 15, Apple tightened how the linker uses SDK content: + # forcing -L "$SDK/usr/lib" now leads to odd link failures. + echo "python-build: use zlib from xcode sdk" + # Since 3.9.1 (bpo-41116), CPython's setup.py logic can search default SDK's sysroot itself + # so we don't need to do anything + # Since 2.7.12 and 3.5.2 (Issue #25136), distutils knows to look for Apple XCode 7+ stub libraries (.tbd) + # when searching in the SDK + # Since 2.7.4 and 3.2.1 (issue #7724), setup.py and distutils can search in the MacOS SDK when + # it's explicitly specified with -isysroot + + #distutils.unixcompiler and setup.py specifically search CFLAGS for "-isysroot" + export CFLAGS="${CFLAGS:+$CFLAGS }-isysroot ${sdkroot}" + #while one can get away with adding it just to CFLAGS, this may cause linker failures + #if XCode is for a different major MacOS version (e.g. reported for XCode 12.4 on MacOS 10.15) + export LDFLAGS="${LDFLAGS:+$LDFLAGS }-isysroot ${sdkroot}" + return 0 +} + +osx_using_default_compiler() { + [[ "${CC:-clang}" == "clang" && "$(command -v clang 2>/dev/null || true)" == "/usr/bin/clang" ]] +} + +use_macports_zlib() { + can_use_macports || return 1 + if [[ $(port -q installed zlib | awk '{print $3}') == "(active)" ]]; then + echo "python-build: use zlib from MacPorts" + lock_in macports + else + return 1 + fi +} + +use_homebrew_tcltk() { + can_use_homebrew || return 1 + local tcltk_formula + # Since https://github.com/Homebrew/homebrew-core/commit/f10e88617b41555193c22fdcba6109fe82155ee2 (10.11.2024), + # tcl-tk is 9.0. It's supported in CPython since 3.14.0a1 (gh-124111) but is not officially supported as of 3.14.0 + # so we prefer 8 + for tcltk_formula in ${PYTHON_BUILD_TCLTK_FORMULA:-tcl-tk@8 tcl-tk}; do + local tcltk_prefix="$(brew --prefix "${tcltk_formula}" 2>/dev/null || true)" + if [ -d "$tcltk_prefix" ]; then + echo "python-build: use ${tcltk_formula} from homebrew" + # In Homebrew Tcl/Tk 8.6.13, headers have been moved to the 'tcl-tk' subdir. + local tcltk_includes="$(sh -c 'cd '"$tcltk_prefix"'/lib; . ./tclConfig.sh; . ./tkConfig.sh; echo "$TCL_INCLUDE_SPEC $TK_INCLUDE_SPEC"')" + # Homebrew Tcl/Tk 9 is built with external libtommath. CPython's build as of 3.14.0 does not detect that and fails to link to tommath symbols + local tcltk_cflags + if sh -c '. '"$tcltk_prefix"'/lib/tclConfig.sh; echo "$TCL_DEFS"' | grep -qwFe '-DTCL_WITH_EXTERNAL_TOMMATH=1'; then + tcltk_cflags="-DTCL_WITH_EXTERNAL_TOMMATH=1" + fi + # For some reason, keg-only tcl-tk@8 successfully links with Tkinter without specifying rpath, with `/opt' rpath + # so no need to translate /Cellar path to /opt path + local tcltk_libs="$(sh -c 'cd '"$tcltk_prefix"'/lib; . ./tclConfig.sh; . ./tkConfig.sh; echo "$TCL_LIB_SPEC $TK_LIB_SPEC"')" + # Since 2.7.6, 3.3.3, 3.4.0 (Issue #1584): --with-tcltk-includes + --with-tcltk-libs Configure options + # Since 3.11.0 (bpo-45847): `pkg-config` call, TCLTK_CFLAGS + TCLTK_LIBS override + if [[ -n "$PYTHON_BUILD_TCLTK_USE_PKGCONFIG" ]]; then + # pkg-config is not present out of the box in MacOS. + # There's no way to provide a fallback only if it's is not present + # and Configure's logic of detecting if it's present is complicated. + # So we just override it always + export TCLTK_CFLAGS="$tcltk_includes${tcltk_cflags:+ $tcltk_cflags}" + export TCLTK_LIBS="$tcltk_libs" + else + package_option python configure --with-tcltk-includes="$tcltk_includes" + package_option python configure --with-tcltk-libs="$tcltk_libs" + [[ -n $tcltk_cflags ]] && export CFLAGS="${tcltk_cflags}${CFLAGS:+ $CFLAGS}" + fi + #set in either case as a failsafe + export PKG_CONFIG_PATH="${tcltk_prefix}/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" + + lock_in homebrew + return 0 + fi + done + return 1 +} + +# FIXME: this function is a workaround for #1125 +# once fixed, it should be removed. +# if tcltk_ops_flag is in PYTHON_CONFIGURE_OPTS, use user provided tcltk +use_custom_tcltk() { + local tcltk_ops="$(get_tcltk_flag_from "$PYTHON_CONFIGURE_OPTS")" + + if [[ -z "$tcltk_ops" ]]; then + return 1 + fi + local tcltk_ops_flag="--with-tcltk-libs=" + # get tcltk libs + local tcltk_libs="${tcltk_ops//$tcltk_ops_flag/}" + # remove tcltk-flag from configure_opts + # this allows for weird input such as + # --with-tcltk-libs=' -L/custom-tcl-tk/lib -ltcl8.6 -ltk8.4 ' + PYTHON_CONFIGURE_OPTS="${PYTHON_CONFIGURE_OPTS//"$tcltk_ops_flag"/}" + PYTHON_CONFIGURE_OPTS="${PYTHON_CONFIGURE_OPTS//$tcltk_libs/}" + + # remove quotes, because there mess up compilations + PYTHON_CONFIGURE_OPTS="${PYTHON_CONFIGURE_OPTS//"''"/}" + PYTHON_CONFIGURE_OPTS="${PYTHON_CONFIGURE_OPTS//'""'/}" + + echo "python-build: use tcl-tk from \$PYTHON_CONFIGURE_OPTS" + # echo "PYTHON_CONFIGURE_OPTS=${PYTHON_CONFIGURE_OPTS}" + package_option python configure --with-tcltk-libs="${tcltk_libs}" + # IFS="$OLDIFS" +} + +# FIXME: this function is a workaround for #1125 +# once fixed, it should be removed. +# Get tcltk-flag and options from `$1` +# expects one argument containing a string of configure opts, eg. `PYTHON_CONFIGURE_OPTS` +# returns tcl_tk flag or an empty string if nothing was found. +get_tcltk_flag_from() { + IFS=$'\n' + # parse input string into array + local opts_arr=( $(xargs -n1 <<<"$1") ) + + # iterate through `opts_arr`, break if `--with-tcltk-libs=` was found. + for opts in ${opts_arr[@]}; do + # `--with-tcltk-libs=` must be the prefix. + if [[ "$opts" == "--with-tcltk-libs="* ]]; then + # return + echo "$opts" + break + fi + done + + IFS="$OLDIFS" +} + +# Since 3.12, CPython can add DWARF debug information in MacOS +# using Apple's nonstandard way, `dsymutil', that creates a "dSYM bundle" +# that's supposed to be installed alongside executables +# (https://github.com/python/cpython/issues/95973). +use_dsymutil() { + if [[ -n "$PYTHON_BUILD_CONFIGURE_WITH_DSYMUTIL" ]] && is_mac; then + package_option python configure --with-dsymutil + fi +} + +use_free_threading() { + if [[ -n "$PYTHON_BUILD_FREE_THREADING" ]]; then + package_option python configure --disable-gil + fi +} + +build_package_enable_shared() { + package_option python configure --enable-shared +} + +build_package_auto_tcltk() { + if is_mac && [ ! -d /usr/include/X11 ]; then + if [ -d /opt/X11/include ]; then + if [[ "$CPPFLAGS" != *-I/opt/X11/include* ]]; then + export CPPFLAGS="-I/opt/X11/include${CPPFLAGS:+ $CPPFLAGS}" + fi + else + package_option python configure --without-tk + fi + fi +} + +package_is_python() { + case "$1" in + Python-* | jython-* | pypy-* | pypy[0-9].+([0-9])-* | stackless-* ) + return 0 + ;; + esac + return 1 +} + +apply_patch() { + local package_name="$1" + local patchfile + patchfile="$(mktemp "${TMP}/python-patch.XXXXXX")" + cat "${2:--}" >"$patchfile" + + local striplevel=0 + grep -q '^diff --git a/' "$patchfile" && striplevel=1 + patch -p$striplevel --force -i "$patchfile" +} + + +build_package_symlink_version_suffix() { + if [[ "${PYTHON_CONFIGURE_OPTS_ARRAY[*]} $CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" == *"--enable-framework"* ]]; then + if [ -e "${PREFIX_PATH}/bin" ]; then + # Always create `bin` as symlink to framework path if the version was built with `--enable-framework` (#590) + rm -rf "${PREFIX_PATH}/bin.orig" + mv -f "${PREFIX_PATH}/bin" "${PREFIX_PATH}/bin.orig" + fi + # Only symlinks are installed in ${PREFIX_PATH}/bin + ln -fs "${PREFIX_PATH}/Library/Frameworks/Python.framework/Versions/Current/bin" "${PREFIX_PATH}/bin" + fi + + # Not create symlinks on `altinstall` (#255) + if [[ "$PYTHON_MAKE_INSTALL_TARGET" != *"altinstall"* ]]; then + shopt -s nullglob + local version_bin="$(ls -1 "${PREFIX_PATH}/bin/python"* | grep '[0-9]$' | sort | tail -1)" + suffix="$(basename "${version_bin}" | sed -e 's/^python//')" + if [ -n "${suffix}" ]; then + local file link + for file in "${PREFIX_PATH}/bin"/*; do + unset link + case "${file}" in + */"python${suffix}-config" ) + # Symlink `pythonX.Y-config` to `python-config` if `python-config` is missing (#296) + link="${file%/*}/python-config" + ;; + */*"-${suffix}" ) + link="${file%%-${suffix}}" + ;; + */*"${suffix}" ) + link="${file%%${suffix}}" + ;; + esac + if [ -n "$link" ] && [ ! -e "$link" ]; then + ( cd "${file%/*}" && ln -fs "${file##*/}" "${link##*/}" ) + fi + done + fi + shopt -u nullglob + fi +} + +verify_python() { + build_package_symlink_version_suffix + + if [ ! -x "${PYTHON_BIN}" ]; then + { colorize 1 "ERROR" + echo ": invalid Python executable: ${PYTHON_BIN}" + echo + echo "The python-build could not find proper executable of Python after successful build." + echo "Please open an issue for future improvements." + echo "https://github.com/pyenv/pyenv/issues" + return 1 + } >&3 + fi +} + +try_python_module() { + if ! "$PYTHON_BIN" -c "import $1"; then + { colorize 1 "WARNING" + echo ": The Python $1 extension was not compiled${3:+ $3}. Missing the ${2:-$1}?" + return 0 + } >&3 + fi +} + +verify_python_module() { + if ! "$PYTHON_BIN" -c "import $1"; then + { colorize 1 "ERROR" + echo ": The Python $1 extension was not compiled. Missing the ${2:-$1}?" + echo + echo "Please consult to the Wiki page to fix the problem." + echo "https://github.com/pyenv/pyenv/wiki/Common-build-problems" + echo + return 1 + } >&3 + fi +} + +# Post-install check for Python 2.1.x +build_package_verify_py21() { + verify_python "${2:-python2.1}" + try_python_module "readline" "GNU readline lib" + verify_python_module "binascii" "binascii" + # fixme: zlib doesn't link correctly on 64-bit Linux, due to being in + # /usr/x86_64-linux-gnu instead of /usr/lib + try_python_module "zlib" "zlib" + try_python_module "bz2" "bzip2 lib" +} + +# Post-install check for Python 2.2.x +build_package_verify_py22() { + verify_python "${2:-python2.2}" + try_python_module "readline" "GNU readline lib" + verify_python_module "binascii" "binascii" + # fixme: zlib doesn't link correctly on 64-bit Linux, due to being in + # /usr/x86_64-linux-gnu instead of /usr/lib + try_python_module "zlib" "zlib" + try_python_module "bz2" "bzip2 lib" +} + +# Post-install check for Python 2.3.x +build_package_verify_py23() { + verify_python "${2:-python2.3}" + try_python_module "readline" "GNU readline lib" + verify_python_module "binascii" "binascii" + # fixme: zlib doesn't link correctly on 64-bit Linux, due to being in + # /usr/x86_64-linux-gnu instead of /usr/lib + try_python_module "zlib" "zlib" + try_python_module "bz2" "bzip2 lib" +} + +# Post-install check for Python 2.4.x +build_package_verify_py24() { + verify_python "${2:-2.4}" + try_python_module "readline" "GNU readline lib" + verify_python_module "zlib" "zlib" + try_python_module "bz2" "bzip2 lib" +} + +# Post-install check for Python 2.5.x +build_package_verify_py25() { + build_package_verify_py24 "$1" "${2:-2.5}" + try_python_module "sqlite3" "SQLite3 lib" +} + +# Post-install check for Python 2.6.x +build_package_verify_py26() { + build_package_verify_py25 "$1" "${2:-2.6}" + verify_python_module "ssl" "OpenSSL lib" +} + +# Post-install check for Python 2.7.x +build_package_verify_py27() { + build_package_verify_py26 "$1" "${2:-2.7}" +} + +# Post-install check for Python 3.0.x +build_package_verify_py30() { + verify_python "${2:-3.0}" + try_python_module "bz2" "bzip2 lib" + try_python_module "curses" "ncurses lib" + try_python_module "ctypes" "libffi lib" + try_python_module "readline" "GNU readline lib" + verify_python_module "ssl" "OpenSSL lib" + try_python_module "sqlite3" "SQLite3 lib" + if [[ -n $DISPLAY ]]; then + try_python_module "tkinter" "Tk toolkit" "and GUI subsystem has been detected" + fi + verify_python_module "zlib" "zlib" +} + +# Post-install check for Python 3.1.x +build_package_verify_py31() { + build_package_verify_py30 "$1" "${2:-3.1}" +} + +# Post-install check for Python 3.2.x +build_package_verify_py32() { + build_package_verify_py31 "$1" "${2:-3.2}" +} + +# Post-install check for Python 3.3.x +build_package_verify_py33() { + build_package_verify_py32 "$1" "${2:-3.3}" + try_python_module "lzma" "lzma lib" +} + +# Post-install check for Python 3.4.x +build_package_verify_py34() { + build_package_verify_py33 "$1" "${2:-3.4}" +} + +# Post-install check for Python 3.5.x +build_package_verify_py35() { + build_package_verify_py34 "$1" "${2:-3.5}" +} + +# Post-install check for Python 3.6.x +build_package_verify_py36() { + build_package_verify_py35 "$1" "${2:-3.6}" +} + +# Post-install check for Python 3.7.x +build_package_verify_py37() { + build_package_verify_py36 "$1" "${2:-3.7}" +} + +# Post-install check for Python 3.8.x +build_package_verify_py38() { + build_package_verify_py37 "$1" "${2:-3.8}" +} + +# Post-install check for Python 3.9.x +build_package_verify_py39() { + build_package_verify_py38 "$1" "${2:-3.9}" +} + +# Post-install check for Python 3.10.x +build_package_verify_py310() { + build_package_verify_py39 "$1" "${2:-3.10}" +} + +# Post-install check for Python 3.11.x +build_package_verify_py311() { + build_package_verify_py310 "$1" "${2:-3.11}" +} + +# Post-install check for Python 3.12.x +build_package_verify_py312() { + build_package_verify_py311 "$1" "${2:-3.12}" +} + +# Post-install check for Python 3.13.x +build_package_verify_py313() { + build_package_verify_py312 "$1" "${2:-3.13}" +} + +# Post-install check for Python 3.14.x +build_package_verify_py314() { + build_package_verify_py313 "$1" "${2:-3.14}" +} + +# Post-install check for Python 3.15.x +build_package_verify_py315() { + build_package_verify_py314 "$1" "${2:-3.15}" +} + +# Post-install check for Python 3.16.x +build_package_verify_py316() { + build_package_verify_py315 "$1" "${2:-3.16}" +} + +# Post-install check for Python 3.x rolling release scripts +# XXX: Will need splitting into project-specific ones if there emerge +# multiple rolling-release scripts with different checks needed +build_package_verify_py3_latest() { + build_package_verify_py311 "$1" "3" +} + +# Copy Tools/gdb/libpython.py to pythonX.Y-gdb.py (#1190) +build_package_copy_python_gdb() { + if [ -e "$BUILD_PATH/$1/Tools/gdb/libpython.py" ]; then + local version_re='-([0-9]\.[0-9]+)' + [[ "$1" =~ $version_re ]] + local python_bin="$PREFIX_PATH/bin/python${BASH_REMATCH[1]}" + cp "$BUILD_PATH/$1/Tools/gdb/libpython.py" "$python_bin-gdb.py" + fi +} + +build_package_ez_setup() { + local ez_setup="ez_setup.py" + rm -f "${ez_setup}" + { if [ "${EZ_SETUP+defined}" ] && [ -f "${EZ_SETUP}" ]; then + echo "Installing setuptools from ${EZ_SETUP}..." 1>&2 + cat "${EZ_SETUP}" + else + [ -n "${EZ_SETUP_URL}" ] + echo "Installing setuptools from ${EZ_SETUP_URL}..." 1>&2 + http get "${EZ_SETUP_URL}" + fi + } 1> "${ez_setup}" + "${PYTHON_BIN}" "${ez_setup}" ${EZ_SETUP_OPTS} 1>&4 2>&1 || { + echo "error: failed to install setuptools via ez_setup.py" >&2 + return 1 + } + build_package_symlink_version_suffix +} + +build_package_get_pip() { + local get_pip="get-pip.py" + rm -f "${get_pip}" + { if [ "${GET_PIP+defined}" ] && [ -f "${GET_PIP}" ]; then + echo "Installing pip from ${GET_PIP}..." 1>&2 + cat "${GET_PIP}" + else + [ -n "${GET_PIP_URL}" ] + echo "Installing pip from ${GET_PIP_URL}..." 1>&2 + http get "${GET_PIP_URL}" + fi + } 1> "${get_pip}" + "${PYTHON_BIN}" -s "${get_pip}" ${GET_PIP_OPTS} 1>&4 2>&1 || { + echo "error: failed to install pip via get-pip.py" >&2 + return 1 + } + build_package_symlink_version_suffix +} + +# Pip <21 (in 2.7 and derivatives like PyPy-2.7) doesn't support -I +build_package_ensurepip_lt21() { + build_package_ensurepip lt21 +} + +build_package_ensurepip() { + local mode="$1" + local ensurepip_opts + # Install as `--altinstall` if the Python is installed as `altinstall` (#255) + if [[ "$PYTHON_MAKE_INSTALL_TARGET" == *"altinstall"* ]]; then + ensurepip_opts="--altinstall" + fi + local python_opts="-I" + if [[ $mode == "lt21" ]]; then python_opts="-s"; fi + + # FIXME: `--altinstall` with `get-pip.py` + "$PYTHON_BIN" $python_opts -m ensurepip ${ensurepip_opts} 1>/dev/null 2>&1 || build_package_get_pip "$@" || return 1 + build_package_symlink_version_suffix +} + +version() { + local git_revision + # Read the revision from git if the remote points to "python-build" repository + if GIT_DIR="$PYTHON_BUILD_INSTALL_PREFIX/../../.git" git remote -v 2>/dev/null | grep -q /pyenv; then + git_revision="$(GIT_DIR="$PYTHON_BUILD_INSTALL_PREFIX/../../.git" git describe --tags HEAD 2>/dev/null || true)" + git_revision="${git_revision#v}" + fi + echo "python-build ${git_revision:-$PYTHON_BUILD_VERSION}" +} + +usage() { + sed -ne '/^#/!q;s/.\{1,2\}//;1,2d;p' < "$0" + [ -z "$1" ] || exit "$1" +} + +list_definitions() { + { for DEFINITION_DIR in "${PYTHON_BUILD_DEFINITIONS[@]}"; do + [ -d "$DEFINITION_DIR" ] && ls "$DEFINITION_DIR" | grep -xv patches + done + } | sort_versions | uniq +} + +sort_versions() { + sed 'h; s/[+-]/./g; s/.p\([[:digit:]]\)/.z.\1/; s/$/.z/; G; s/\n/ /' | \ + LC_ALL=C sort -t. -k 1,1 -k 2,2n -k 3,3n -k 4,4n -k 5,5n | awk '{print $2}' +} + + +unset VERBOSE +unset KEEP_BUILD_PATH +unset HAS_PATCH +unset DEBUG +unset IPV4 +unset IPV6 + +PYTHON_BUILD_INSTALL_PREFIX="$(abs_dirname "$0")/.." + +IFS=: PYTHON_BUILD_DEFINITIONS=($PYTHON_BUILD_DEFINITIONS ${PYTHON_BUILD_ROOT:-$PYTHON_BUILD_INSTALL_PREFIX}/share/python-build) +IFS="$OLDIFS" + +parse_options "$@" + +for option in "${OPTIONS[@]}"; do + case "$option" in + "h" | "help" ) + version + echo + usage 0 + ;; + "definitions" ) + list_definitions + exit 0 + ;; + "k" | "keep" ) + KEEP_BUILD_PATH=true + ;; + "v" | "verbose" ) + VERBOSE=true + ;; + "p" | "patch" ) + HAS_STDIN_PATCH=true + ;; + "g" | "debug" ) + DEBUG=true + # Disable optimization (#808) + PYTHON_CFLAGS="-O0 ${PYTHON_CFLAGS}" + ;; + "4" | "ipv4") + IPV4=true + ;; + "6" | "ipv6") + IPV6=true + ;; + "version" ) + version + exit 0 + ;; + esac +done + +[ "${#ARGUMENTS[@]}" -eq 2 ] || usage 1 >&2 + +DEFINITION_PATH="${ARGUMENTS[0]}" +if [ -z "$DEFINITION_PATH" ]; then + usage 1 >&2 +elif [ ! -f "$DEFINITION_PATH" ]; then + for DEFINITION_DIR in "${PYTHON_BUILD_DEFINITIONS[@]}"; do + if [ -f "${DEFINITION_DIR}/${DEFINITION_PATH}" ]; then + DEFINITION_PATH="${DEFINITION_DIR}/${DEFINITION_PATH}" + break + fi + done + + if [ ! -f "$DEFINITION_PATH" ]; then + echo "python-build: definition not found: ${DEFINITION_PATH}" >&2 + exit 2 + fi +fi + +PREFIX_PATH="${ARGUMENTS[1]}" +if [ -z "$PREFIX_PATH" ]; then + usage 1 >&2 +elif [ "${PREFIX_PATH#/}" = "$PREFIX_PATH" ]; then + PREFIX_PATH="${PWD}/${PREFIX_PATH}" +fi + +if [ -z "$TMPDIR" ]; then + TMP="/tmp" +else + TMP="${TMPDIR%/}" +fi + +# Check if TMPDIR is accessible and can hold executables. +tmp_executable="${TMP}/python-build-test.$$" +noexec="" +if mkdir -p "$TMP" && touch "$tmp_executable" 2>/dev/null; then + cat > "$tmp_executable" <<-EOF + #!${BASH} + exit 0 + EOF + chmod +x "$tmp_executable" +else + echo "python-build: TMPDIR=$TMP is set to a non-accessible location" >&2 + exit 1 +fi +"$tmp_executable" 2>/dev/null || noexec=1 +rm -f "$tmp_executable" +if [ -n "$noexec" ]; then + echo "python-build: TMPDIR=$TMP cannot hold executables (partition possibly mounted with \`noexec\`)" >&2 + exit 1 +fi + +if [ -z "$MAKE" ]; then + if [ "FreeBSD" = "${_PYTHON_BUILD_CACHE_UNAME_S:=$(uname -s)}" ]; then + if [ "$(echo $1 | sed 's/-.*$//')" = "jruby" ]; then + export MAKE="gmake" + else + # var assignment inside $() does not propagate due to being in subshell + : "${_PYTHON_BUILD_CACHE_UNAME_R:=$(uname -r)}" + if [ "$(echo "$_PYTHON_BUILD_CACHE_UNAME_R" | sed 's/[^[:digit:]].*//')" -lt 10 ]; then + export MAKE="gmake" + else + export MAKE="make" + fi + fi + else + export MAKE="make" + fi +fi + +if [ -n "$PYTHON_BUILD_CACHE_PATH" ] && [ -d "$PYTHON_BUILD_CACHE_PATH" ]; then + PYTHON_BUILD_CACHE_PATH="${PYTHON_BUILD_CACHE_PATH%/}" +else + unset PYTHON_BUILD_CACHE_PATH +fi + +if [ -z "$PYTHON_BUILD_MIRROR_URL" ]; then + PYTHON_BUILD_MIRROR_URL="https://pyenv.github.io/pythons" + PYTHON_BUILD_DEFAULT_MIRROR=1 +else + PYTHON_BUILD_MIRROR_URL="${PYTHON_BUILD_MIRROR_URL%/}" + PYTHON_BUILD_DEFAULT_MIRROR= +fi + +if [ -n "$PYTHON_BUILD_SKIP_MIRROR" ]; then + unset PYTHON_BUILD_MIRROR_URL +fi + +if ! has_checksum_support compute_sha2 && ! [ -n "$PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM" ] ; then + unset PYTHON_BUILD_MIRROR_URL +fi + +ARIA2_OPTS="${PYTHON_BUILD_ARIA2_OPTS} ${IPV4+--disable-ipv6=true} ${IPV6+--disable-ipv6=false}" +CURL_OPTS="${PYTHON_BUILD_CURL_OPTS} ${IPV4+--ipv4} ${IPV6+--ipv6}" +WGET_OPTS="${PYTHON_BUILD_WGET_OPTS} ${IPV4+--inet4-only} ${IPV6+--inet6-only}" + +# Add an option to build a debug version of Python (#11) +if [ -n "$DEBUG" ]; then + package_option python configure --with-pydebug +fi + +if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" != *"--enable-framework"* && "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" != *"--disable-shared"* ]]; then + package_option python configure --enable-shared +fi + +# python-build: Specify `--libdir` on configure to fix build on openSUSE (#36) +package_option python configure --libdir="${PREFIX_PATH}/lib" + +# python-build: Set `RPATH` if `--enable-shared` was given (#65, #66, #82) +if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS ${PYTHON_CONFIGURE_OPTS_ARRAY[@]}" == *"--enable-shared"* ]]; then + # The ld on Darwin embeds the full paths to each dylib by default + if [[ "$LDFLAGS" != *"-rpath="* ]] ; then + prepend_ldflags_libs "-Wl,-rpath,${PREFIX_PATH}/lib" + fi +fi + +# python-build: Set `RPATH` if --shared` was given for PyPy (#244) +if [[ "$PYPY_OPTS" == *"--shared"* ]]; then + prepend_ldflags_libs "-Wl,-rpath=${PREFIX_PATH}/lib" +fi + +# Add support for framework installation (`--enable-framework`) of CPython (#55, #99) +if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" == *"--enable-framework"* ]]; then + if ! is_mac; then + echo "python-build: framework installation is not supported outside of MacOS." >&2 + exit 1 + fi + create_framework_dirs() { + local version="$(echo "$1" | sed -E 's/^[^0-9]*([0-9]+\.[0-9]+).*$/\1/')" + mkdir -p "${PREFIX_PATH}/Library/Frameworks/Python.framework/Versions/${version}" + ( cd "${PREFIX_PATH}/Library/Frameworks/Python.framework/Versions" && ln -fs "${version}" "Current") + local path + for path in include lib share; do + mkdir -p "${PREFIX_PATH}/Library/Frameworks/Python.framework/Versions/Current/${path}" + ln -fs "${PREFIX_PATH}/Library/Frameworks/Python.framework/Versions/Current/${path}" "${PREFIX_PATH}/${path}" + done + } + create_framework_dirs "${DEFINITION_PATH##*/}" + # the `/Library/Frameworks` suffix makes CPython build install apps under prefix rather than into /Applications (#1003) + package_option python configure --enable-framework="${PREFIX_PATH}/Library/Frameworks" + + #FIXME: doesn't properly handle paths with spaces. Fix by parsing *OPTS into arrays. + CONFIGURE_OPTS="${CONFIGURE_OPTS//--enable-framework?(=*([^ ]))?( )/}"; + CONFIGURE_OPTS="${CONFIGURE_OPTS% }" + PYTHON_CONFIGURE_OPTS="${PYTHON_CONFIGURE_OPTS//--enable-framework?(=*([^ ]))?( )/}"; + PYTHON_CONFIGURE_OPTS="${PYTHON_CONFIGURE_OPTS% }" +fi + +# Build against universal SDK +if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" == *"--enable-universalsdk"* ]]; then + if ! is_mac; then + echo "python-build: universal installation is not supported outside of MacOS." >&2 + exit 1 + fi + package_option python configure --enable-universalsdk=/ + #FIXME: doesn't properly handle paths with spaces. Fix by parsing *OPTS into arrays. + CONFIGURE_OPTS="${CONFIGURE_OPTS//--enable-universalsdk?(=*([^ ]))?( )/}" + CONFIGURE_OPTS="${CONFIGURE_OPTS% }" + PYTHON_CONFIGURE_OPTS="${PYTHON_CONFIGURE_OPTS//--enable-universalsdk?(=*([^ ]))?( )/}" + PYTHON_CONFIGURE_OPTS="${PYTHON_CONFIGURE_OPTS% }" + + if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" != *"--with-universal-archs"* ]]; then + # in CPython's configure.ac, --with-universal-archs defaults to 'intel' which means i386 + x86_64 + # since 2.7.5 and 3.3.0 -- i.e. in all non-EOL versions + # Apple Silicon cannot build these, in it, it rather makes sense to default to Universal2 binaries + if [[ $(arch) == "arm64" ]]; then + package_option python configure --with-universal-archs=universal2 + fi + fi +fi + +# Compile with `--enable-unicode=ucs4` by default (#257) +if [[ "$PYTHON_CONFIGURE_OPTS" != *"--enable-unicode="* ]]; then + if ! is_mac; then + # Skip specifying `--enable-unicode` for CPython 3.3+ (#912) + case "${DEFINITION_PATH##*/}" in + "2."* | \ + "3.0" | "3.0."* | "3.0-"* | \ + "3.1" | "3.1."* | "3.1-"* | \ + "3.2" | "3.2."* | "3.2-"* ) + package_option python configure --enable-unicode=ucs4 + ;; + esac + fi +fi + +# Unset `PIP_REQUIRE_VENV` during build (#216) +unset PIP_REQUIRE_VENV +unset PIP_REQUIRE_VIRTUALENV + +# pydistutils.cfg may corrupt install location of Python libraries (#35, #111) +if [ -e "$HOME/.pydistutils.cfg" ]; then + { colorize 1 "WARNING" + echo ": Please make sure you remove any previous custom paths from your $HOME/.pydistutils.cfg file." + } >&2 +fi + +# Download specified version of ez_setup.py/get-pip.py (#202) +if [ -z "${EZ_SETUP_URL}" ]; then + if [ -n "${SETUPTOOLS_VERSION}" ]; then + EZ_SETUP_URL="https://bitbucket.org/pypa/setuptools/raw/${SETUPTOOLS_VERSION}/ez_setup.py" + unset SETUPTOOLS_VERSION + else + EZ_SETUP_URL="https://bootstrap.pypa.io/ez_setup.py" + fi +fi +if [ -z "${GET_PIP_URL}" ]; then + if [ -n "${PIP_VERSION}" ]; then + { colorize 1 "WARNING" + echo ": Setting PIP_VERSION=${PIP_VERSION} is no longer supported and may cause failures during the install process." + } 1>&2 + GET_PIP_URL="https://raw.githubusercontent.com/pypa/pip/${PIP_VERSION}/contrib/get-pip.py" + # Unset `PIP_VERSION` from environment before invoking `get-pip.py` to deal with "ValueError: invalid truth value" (pypa/pip#4528) + unset PIP_VERSION + else + # Use custom get-pip URL based on the target version (#1127) + case "${DEFINITION_PATH##*/}" in + 2.6 | 2.6.* ) + GET_PIP_URL="https://bootstrap.pypa.io/pip/2.6/get-pip.py" + ;; + 2.7 | 2.7.* | pypy2.7 | pypy2.7-* ) + GET_PIP_URL="https://bootstrap.pypa.io/pip/2.7/get-pip.py" + ;; + 3.2 | 3.2.* ) + GET_PIP_URL="https://bootstrap.pypa.io/pip/3.2/get-pip.py" + ;; + 3.3 | 3.3.* ) + GET_PIP_URL="https://bootstrap.pypa.io/pip/3.3/get-pip.py" + ;; + 3.4 | 3.4.* ) + GET_PIP_URL="https://bootstrap.pypa.io/pip/3.4/get-pip.py" + ;; + 3.5 | 3.5.* | pypy3.5 | pypy3.5-* ) + GET_PIP_URL="https://bootstrap.pypa.io/pip/3.5/get-pip.py" + ;; + 3.6 | 3.6.* | pypy3.6 | pypy3.6-* ) + GET_PIP_URL="https://bootstrap.pypa.io/pip/3.6/get-pip.py" + ;; + 3.7 | 3.7.* | pypy3.7 | pypy3.7-* ) + GET_PIP_URL="https://bootstrap.pypa.io/pip/3.7/get-pip.py" + ;; + 3.8 | 3.8.* | pypy3.8 | pypy3.8-* | pyston* ) + GET_PIP_URL="https://bootstrap.pypa.io/pip/3.8/get-pip.py" + ;; + * ) + GET_PIP_URL="https://bootstrap.pypa.io/get-pip.py" + ;; + esac + fi +fi + +# Set MACOSX_DEPLOYMENT_TARGET from the product version of OS X (#219, #220) +if is_mac; then + if [ -z "${MACOSX_DEPLOYMENT_TARGET}" ]; then + MACOS_VERSION="${_PYTHON_BUILD_CACHE_SW_VERS:=$(sw_vers -productVersion)}" + MACOS_VERSION_ARRAY=(${MACOS_VERSION//\./ }) + if [ "${#MACOS_VERSION_ARRAY[@]}" -ge 2 ]; then + export MACOSX_DEPLOYMENT_TARGET="${MACOS_VERSION_ARRAY[0]}.${MACOS_VERSION_ARRAY[1]}" + fi + fi +fi + +python_bin_suffix() { + local version_name version_info + case "$1" in + 2.* | 3.* ) + version_name="$1" + version_name="${version_name%-dev}" + version_name="${version_name%-rc*}" + version_name="${version_name%rc*}" + version_name="${version_name%%*([^0-9])}" + version_info=(${version_name//./ }) + echo "${version_info[0]}.${version_info[1]}" + ;; + stackless-2.* | stackless-3.* ) + version_name="${1#stackless-}" + version_name="${version_name%-dev}" + version_name="${version_name%-rc*}" + version_name="${version_name%rc*}" + version_info=(${version_name//./ }) + echo "${version_info[0]}.${version_info[1]}" + ;; + esac +} + +SEED="$(date "+%Y%m%d%H%M%S").$$" +LOG_PATH="${TMP}/python-build.${SEED}.log" +PYTHON_BIN="${PREFIX_PATH}/bin/python$(python_bin_suffix "${DEFINITION_PATH##*/}")" +CWD="$(pwd)" + +if [ -z "$PYTHON_BUILD_BUILD_PATH" ]; then + BUILD_PATH="${TMP}/python-build.${SEED}" +else + BUILD_PATH="$PYTHON_BUILD_BUILD_PATH" +fi + +exec 4<> "$LOG_PATH" # open the log file at fd 4 +if [ -n "$VERBOSE" ]; then + tail -f "$LOG_PATH" & + TAIL_PID=$! + trap "kill $TAIL_PID" SIGINT SIGTERM EXIT +fi + +prepend_ldflags_libs "-L${PREFIX_PATH}/lib" +export CPPFLAGS="-I${PREFIX_PATH}/include${CPPFLAGS:+ $CPPFLAGS}" + +unset PYTHONHOME +unset PYTHONPATH + +trap build_failed ERR +mkdir -p "$BUILD_PATH" +source "$DEFINITION_PATH" +[ -z "${KEEP_BUILD_PATH}" ] && rm -fr "$BUILD_PATH" +trap - ERR diff --git a/plugins/python-build/install.sh b/plugins/python-build/install.sh new file mode 100755 index 0000000..e6a977c --- /dev/null +++ b/plugins/python-build/install.sh @@ -0,0 +1,26 @@ +#!/bin/sh +# Usage: PREFIX=/usr/local ./install.sh +# +# Installs python-build under $PREFIX. + +set -e + +cd "$(dirname "$0")" + +if [ -z "${PREFIX}" ]; then + PREFIX="/usr/local" +fi + +BIN_PATH="${PREFIX}/bin" +SHARE_PATH="${PREFIX}/share/python-build" + +mkdir -p "$BIN_PATH" "$SHARE_PATH" + +install -p bin/* "$BIN_PATH" +for share in share/python-build/*; do + if [ -d "$share" ]; then + cp -RPp "$share" "$SHARE_PATH" + else + install -p -m 0644 "$share" "$SHARE_PATH" + fi +done diff --git a/plugins/python-build/scripts/.gitignore b/plugins/python-build/scripts/.gitignore new file mode 100644 index 0000000..f9606a3 --- /dev/null +++ b/plugins/python-build/scripts/.gitignore @@ -0,0 +1 @@ +/venv diff --git a/plugins/python-build/scripts/README.md b/plugins/python-build/scripts/README.md new file mode 100644 index 0000000..d8bbd24 --- /dev/null +++ b/plugins/python-build/scripts/README.md @@ -0,0 +1,22 @@ +# Scripts for updating python-build + +Install dependencies with `pip install -r requirements.txt`. + +## add_miniconda.py + +```_add_miniconda +usage: add_miniconda.py [-h] [-d] [-v] + +Script to add non-"latest" miniconda releases. Written for python 3.7. Checks +the miniconda download archives for new versions, then writes a build script +for any which do not exist locally, saving it to plugins/python- +build/share/python-build. Ignores releases below 4.3.30. Also ignores sub- +patch releases if that major.minor.patch already exists, but otherwise, takes +the latest sub-patch release for given OS/arch. Assumes all miniconda3 +releases < 4.7 default to python 3.6, and anything else 3.7. + +optional arguments: + -h, --help show this help message and exit + -d, --dry-run Do not write scripts, just report them to stdout + -v, --verbose Increase verbosity of logging +``` diff --git a/plugins/python-build/scripts/add_cpython.py b/plugins/python-build/scripts/add_cpython.py new file mode 100755 index 0000000..0742dd7 --- /dev/null +++ b/plugins/python-build/scripts/add_cpython.py @@ -0,0 +1,632 @@ +#!/usr/bin/env python3 +"""Script to add CPython releases. + +Checks the CPython download archives for new versions, +then writes a build script for any which do not exist locally, +saving it to plugins/python-build/share/python-build. + +""" +import argparse +import dataclasses +import hashlib +import io +import itertools +import logging +import operator +import os.path +import pathlib +import pprint +import re +import subprocess +import sys +import typing +import urllib.parse + +import jc +import more_itertools +import packaging.version +import requests +import requests_html +import sortedcontainers +import tqdm + +#CI uses exit code 1 as a signal that no new version is found +#so have to produce a different exit code on an exception +def _excepthook(type,value,traceback): + logging.error("Unhandled exception occured",exc_info=(type,value,traceback)) + sys.exit(2) +sys.excepthook = _excepthook + +logger = logging.getLogger(__name__) + +CUTOFF_VERSION=packaging.version.Version('3.10') +EXCLUDED_VERSIONS= { +} + +here = pathlib.Path(__file__).resolve() +OUT_DIR: pathlib.Path = here.parent.parent / "share" / "python-build" + +T_THUNK=\ +'''export PYTHON_BUILD_FREE_THREADING=1 +source "${BASH_SOURCE[0]%t}" +''' + + +def adapt_script(version: packaging.version.Version, + previous_version: packaging.version.Version) -> typing.Union[pathlib.Path, None]: + + previous_version_path = OUT_DIR.joinpath(str(previous_version)) + + with previous_version_path.open("r", encoding='utf-8') as f: + script = f.readlines() + result = io.StringIO() + for line in script: + if m:=re.match(r'\s*install_package\s+"(?PPython-\S+)"\s+' + r'"(?P\S+)"\s+.*\s+verify_py(?P\d+)\s+.*$', + line): + existing_url_path = urllib.parse.urlparse(m.group('url')).path + try: + matched_download = more_itertools.one( + item for item in VersionDirectory.available[version].downloads + if existing_url_path.endswith(item.extension)) + except ValueError: + logger.error(f'Cannot match existing URL path\'s {existing_url_path} extension ' + f'to available downloads {VersionDirectory.available[version].downloads}') + return + new_package_name, new_package_url = matched_download.package_name, matched_download.url + new_package_hash = Url.sha256_url(new_package_url, VersionDirectory.session) + + verify_py_suffix = str(version.major)+str(version.minor) + + line = Re.sub_groups(m, + package=new_package_name, + url=new_package_url+'#'+new_package_hash, + verify_py_suffix=verify_py_suffix) + + elif m:=re.match(r'\s*install_package\s+"(?Popenssl-\S+)"\s+' + r'"(?P\S+)"\s.*$', + line): + item = VersionDirectory.openssl.get_store_latest_release() + + line = Re.sub_groups(m, + package=item.package_name, + url=item.url + '#' + item.hash) + + elif m:=re.match(r'\s*install_package\s+"(?Preadline-\S+)"\s+' + r'"(?P\S+)"\s.*$', + line): + item = VersionDirectory.readline.get_store_latest_release() + + line = Re.sub_groups(m, + package=item.package_name, + url=item.url + '#' + item.hash) + + result.write(line) + + result_path = OUT_DIR.joinpath(str(version)) + logger.info(f"Writing {result_path}") + result_path.write_text(result.getvalue(), encoding='utf-8') + result.close() + + return result_path + +def add_version(version: packaging.version.Version): + + previous_version = VersionDirectory.existing.pick_previous_version(version).version + + is_prerelease_upgrade = previous_version.major==version.major\ + and previous_version.minor==version.minor\ + and previous_version.micro==version.micro + + logger.info(f"Adding {version} based on {previous_version}" + + (" (prerelease upgrade)" if is_prerelease_upgrade else "")) + + VersionDirectory.available.get_store_available_source_downloads(version) + + new_path = adapt_script(version, + previous_version) + if not new_path: + return False + VersionDirectory.existing.append(_CPythonExistingScriptInfo(version,str(new_path))) + + cleanup_prerelease_upgrade(is_prerelease_upgrade, previous_version, version) + + handle_t_thunks(version, previous_version, is_prerelease_upgrade) + + print(version) + return True + + +def cleanup_prerelease_upgrade( + is_prerelease_upgrade: bool, + previous_version: packaging.version.Version, + new_version: packaging.version.Version)\ + -> None: + if not is_prerelease_upgrade: + return + + previous_version_filename = str(previous_version) + new_version_filename = str(new_version) + new_version_path = OUT_DIR / new_version_filename + + logger.info(f'Git moving {previous_version_filename} ' + f'to {new_version_filename} (preserving new data)') + + data = new_version_path.read_text() + new_version_path.unlink() + + subprocess.check_call(("git","-C",OUT_DIR, + "mv", + previous_version_filename, + new_version_filename)) + + new_version_path.write_text(data) + + del VersionDirectory.existing[previous_version] + + +def handle_t_thunks(version, previous_version, is_prerelease_upgrade): + if (version.major, version.minor) < (3, 13): + return + + # an old thunk may have older version-specific code + # so it's safer to write a known version-independent template + thunk_name = (str(version) + "t") + thunk_path = OUT_DIR / thunk_name + previous_thunk_name = str(previous_version) + "t" + if is_prerelease_upgrade: + logger.info(f"Git moving {previous_thunk_name} to {thunk_name}") + subprocess.check_call(("git","-C",OUT_DIR, + "mv", + previous_thunk_name, + thunk_name)) + + logger.info(f"Writing {thunk_path}") + thunk_path.write_text(T_THUNK, encoding='utf-8') + + +Arguments: argparse.Namespace + +def main(): + global Arguments + Arguments = parse_args() + logging.basicConfig(level=logging.DEBUG if Arguments.verbose else logging.INFO) + + cached_session=requests_html.HTMLSession() + global VersionDirectory + VersionDirectory = _VersionDirectory(cached_session) + + VersionDirectory.existing.populate() + VersionDirectory.available.populate() + + # Prereleases are placed under the same directory as the corresponding release. + # So until we know the release is out, its directory is a potential prerelease directory. + # Normally, prereleases are only made for initial releases (x.y.0) -- + # but rarely, they may make them for other releases (e.g. 3.14.5). + for release in (v for v in frozenset(VersionDirectory.available.keys()) #refining changes the + #corresponding directory key + #which breaks iteration + #so have to iterate over a copy + if v not in VersionDirectory.existing): + VersionDirectory.available.get_store_available_source_downloads(release, True) + del release + + versions_to_add = sorted(VersionDirectory.available.keys() - VersionDirectory.existing.keys()) + + logger.info("Versions to add:\n"+pprint.pformat(versions_to_add)) + result = False + for version_to_add in versions_to_add: + result = add_version(version_to_add) or result + return int(not result) + +def parse_args(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "-d", "--dry-run", action="store_true", + help="Do not write scripts, just report them to stdout", + ) + parser.add_argument( + "-v", "--verbose", action="store_true", default=0, + help="Increase verbosity of logging", + ) + parsed = parser.parse_args() + return parsed + + +T = typing.TypeVar('T', bound=object) + +K = typing.TypeVar('K', bound=typing.Hashable) + +class KeyedList(typing.List[T], typing.Mapping[K, T]): + key_field: str + item_init: typing.Callable[..., T] = None + + def __init__(self, seq: typing.Union[typing.Iterable[T], None] = None): + super().__init__() + self._map = {} + if seq is not None: + self.__iadd__(seq) + + # read + + def __getitem__(self, key: K) -> T: + return self._map[key] + + def __contains__(self, key: K): + return key in self._map + + def keys(self) -> typing.AbstractSet[K]: + return self._map.keys() + + # write + + def append(self, item: T) -> None: + key = self._getkey(item) + if key in self: + raise ValueError(f"Key '{key:r}' already present") + super().append(item) + self._map[key] = item + + def __iadd__(self, other: typing.Iterable[T]): + for item in other: + self.append(item) + return self + + def __delitem__(self, key: K): + super().remove(self[key]) + del self._map[key] + + def clear(self): + super().__delitem__(slice(None,None)) + self._map.clear() + + # read-write + + def get_or_create(self, key: K, **kwargs): + try: + return self[key] + except KeyError as e: + if self.item_init is None: + raise AttributeError("'item_init' must be set to use automatic item creation") from e + kwargs[self.key_field] = key + item = self.item_init(**kwargs) + self.append(item) + return item + + # info + + def __repr__(self): + return self.__class__.__name__ + "([" + ", ".join(repr(i) for i in self) + "])" + + # private + + def _getkey(self, item: T) -> K: + return getattr(item, self.key_field) + +del T, K + +@dataclasses.dataclass(frozen=True) +class _CPythonAvailableVersionDownloadInfo: + extension: str + package_name: str + url: str + +class _CPythonAvailableVersionDownloadsDirectory(KeyedList[_CPythonAvailableVersionDownloadInfo, str]): + key_field = "extension" + + +@dataclasses.dataclass(frozen=True) +class _CPythonAvailableVersionInfo: + version: packaging.version.Version + download_page_url: str + downloads: _CPythonAvailableVersionDownloadsDirectory = dataclasses.field( + default_factory=lambda:_CPythonAvailableVersionDownloadsDirectory() + ) + + +class CPythonAvailableVersionsDirectory(KeyedList[_CPythonAvailableVersionInfo, packaging.version.Version]): + key_field = "version" + _session: requests.Session + item_init = _CPythonAvailableVersionInfo + + def __init__(self, session: requests.Session, seq=None): + super().__init__(seq) + self._session = session + + def populate(self): + """ + Fetch remote versions + """ + logger.info("Fetching available CPython versions") + for name, url in DownloadPage.enum_download_entries( + "https://www.python.org/ftp/python/", + r'^(\d+.*)/$', self._session, + make_name= lambda m: m.group(1) + ): + v = packaging.version.Version(name) + if v < CUTOFF_VERSION or v in EXCLUDED_VERSIONS: + continue + logger.debug(f'Available version: {name} ({v}), {url}') + self.append(_CPythonAvailableVersionInfo( + v, + url + )) + + def get_store_available_source_downloads(self, version, refine_mode=False): + entry = self[version] + if entry.downloads: + #already retrieved + return + additional_versions_found =\ + CPythonAvailableVersionsDirectory(self._session) if refine_mode else None + exact_download_found = False + for name, url in DownloadPage.enum_download_entries( + entry.download_page_url, + r'Python-.*\.(tar\.xz|tgz)$', + self._session): + m = re.match(r'(?PPython-(?P.*))\.(?Ptar\.xz|tgz)$', name) + + download_version = packaging.version.Version(m.group("version")) + if download_version != version: + if not refine_mode: + raise ValueError(f"Unexpectedly found a download {name} ({download_version}) " + f"for {version} at page {entry.download_page_url}") + entry_to_fill = additional_versions_found.get_or_create( + download_version, + download_page_url=entry.download_page_url + ) + else: + exact_download_found = True + entry_to_fill = entry + + entry_to_fill.downloads.append(_CPythonAvailableVersionDownloadInfo( + m.group("extension"), m.group('package'), url + )) + + if not exact_download_found: + actual_version = max(additional_versions_found.keys()) + logger.debug(f"Refining available version {version} to {actual_version}") + del self[version] + + self.append( + additional_versions_found[ + actual_version + ]) + + +class _CPythonExistingScriptInfo(typing.NamedTuple): + version: packaging.version.Version + filename: str + +class CPythonExistingScriptsDirectory(KeyedList[_CPythonExistingScriptInfo, packaging.version.Version]): + key_field = "version" + _filename_pattern = r'^\d+\.\d+(?:(t?)(-\w+)|(.\d+((?:a|b|rc)\d)?(t?)))$' + + def populate(self): + """ + Enumerate existing installation scripts in share/python-build/ by pattern + """ + logger.info(f"Enumerating existing versions in {OUT_DIR}") + for entry_name in (p.name for p in OUT_DIR.iterdir() if p.is_file()): + if (not (m := re.match(self._filename_pattern, entry_name)) + or m.group(1) == 't' or m.group(5) == 't'): + continue + try: + v = packaging.version.Version(entry_name) + if v < CUTOFF_VERSION: + continue + # branch tip scrpts are different from release scripts and thus unusable as a pattern + if v.dev is not None: + continue + logger.debug(f"Existing version {v}") + + self.append(_CPythonExistingScriptInfo(v, entry_name)) + + except ValueError as e: + logger.error(f"Unable to parse existing version {entry_name}: {e}") + + def pick_previous_version(self, + version: packaging.version.Version) \ + -> _CPythonExistingScriptInfo: + return max(v for v in self if v.version < version) + + +class _OpenSSLVersionInfo(typing.NamedTuple): + version: packaging.version.Version + package_name: str + url: str + hash: str + +class OpenSSLVersionsDirectory(KeyedList[_OpenSSLVersionInfo, packaging.version.Version]): + key_field = "version" + + def get_store_latest_release(self) \ + -> _OpenSSLVersionInfo: + if self: + #already retrieved + return self[max(self.keys())] + + j = requests.get("https://api.github.com/repos/openssl/openssl/releases/latest", timeout=30).json() + # noinspection PyTypeChecker + # urlparse can parse str as well as bytes + shasum_url = more_itertools.one( + asset['browser_download_url'] + for asset in j['assets'] + if urllib.parse.urlparse(asset['browser_download_url']).path.split('/')[-1].endswith('.sha256') + ) + shasum_text = requests.get(shasum_url, timeout=30).text + shasum_data = jc.parse("hashsum", shasum_text, quiet=True)[0] + package_hash, package_filename = shasum_data["hash"], shasum_data["filename"] + del shasum_data, shasum_text, shasum_url + + # OpenSSL Github repo has tag names "openssl-" as of this writing like we need + # but let's not rely on that + # splitext doesn't work with a chained extension, it only splits off the last one + package_name, package_version_str = re.match(r"([^-]+-(.*?))\.\D", package_filename).groups() + package_version = packaging.version.Version(package_version_str) + + package_url = more_itertools.one( + asset['browser_download_url'] + for asset in j['assets'] + if urllib.parse.urlparse(asset['browser_download_url']).path.split('/')[-1] == package_filename + ) + + result = _OpenSSLVersionInfo(package_version, package_name, package_url, package_hash) + self.append(result) + + return result + + +class _ReadlineVersionInfo(typing.NamedTuple): + version : packaging.version.Version + package_name : str + url : str + hash : str + +class ReadlineVersionsDirectory(KeyedList[_ReadlineVersionInfo, packaging.version.Version]): + key_field = "version" + + def get_store_latest_release(self): + if not self: + self._store_latest_release() + return self._latest_release() + + def _store_latest_release(self): + candidates = ReadlineVersionsDirectory() + + pattern = r'(?Preadline-(?P\d+(?:\.\d+)+)).tar\.gz$' + for name, url in DownloadPage.enum_download_entries( + 'https://ftpmirror.gnu.org/readline/', pattern, VersionDirectory.session): + m = re.match(pattern, name) + version = packaging.version.Version(m.group('version')) + candidates.append(_ReadlineVersionInfo( + version, + m.group('package_name'), + url, + "" + )) + max_item = candidates._latest_release() + hash_ = Url.sha256_url(max_item.url, VersionDirectory.session) + + permalink = 'https://ftpmirror.gnu.org/readline/' +\ + os.path.basename(urllib.parse.urlparse(max_item.url).path) + + result = _ReadlineVersionInfo( + max_item.version, + max_item.package_name, + permalink, + hash_) + self.append(result) + + return result + + def _latest_release(self): + return self[max(self.keys())] + +class _VersionDirectory: + def __init__(self, session): + self.existing = CPythonExistingScriptsDirectory() + self.available = CPythonAvailableVersionsDirectory(session) + self.openssl = OpenSSLVersionsDirectory() + self.readline = ReadlineVersionsDirectory() + self.session = session +VersionDirectory : _VersionDirectory + +class DownloadPage: + class _DownloadPageEntry(typing.NamedTuple): + name: str + url: str + + @classmethod + def enum_download_entries(cls, url, pattern, session=None, + make_name = lambda m: m.string ) \ + -> typing.Generator[_DownloadPageEntry, None, None]: + """ + Enum download entries in a standard Apache directory page + (incl. CPython download page https://www.python.org/ftp/python/) + or a GNU mirror directory page + (https://ftpmirror.gnu.org// destinations) + """ + if session is None: + session = requests_html.HTMLSession() + response = session.get(url, timeout=30) + page = response.html + table = page.find("pre", first=True) + # some GNU mirrors format entries as a table + # (e.g. https://mirrors.ibiblio.org/gnu/readline/) + if table is None: + table = page.find("table", first=True) + links = table.find("a") + for link in links: + href = link.attrs['href'] + # CPython entries are directories + name = link.text + # skip directory entries + if not (m:=re.match(pattern, name)): + continue + name = make_name(m) + yield cls._DownloadPageEntry(name, urllib.parse.urljoin(response.url, href)) + + +class Re: + @dataclasses.dataclass + class _interval: + group: typing.Union[int, str, None] + start: int + end: int + @staticmethod + def sub_groups(match: re.Match, + /, *args: [typing.AnyStr], + **kwargs: [typing.AnyStr])\ + -> typing.AnyStr: + repls={i:repl for i,repl in enumerate(args) if repl is not None} + repls.update({n:repl for n,repl in kwargs.items() if repl is not None}) + + intervals: sortedcontainers.SortedList[Re._interval]=\ + sortedcontainers.SortedKeyList(key=operator.attrgetter("start","end")) + + for group_id in itertools.chain(range(1,len(match.groups())), match.groupdict().keys()): + if group_id not in repls: + continue + if match.start(group_id) == -1: + continue + intervals.add(Re._interval(group_id,match.start(group_id),match.end(group_id))) + del group_id + + last_interval=Re._interval(None,0,0) + result="" + for interval in intervals: + if interval.start < last_interval.end: + raise ValueError(f"Cannot replace intersecting matches " + f"for groups {last_interval.group} and {interval.group} " + f"(position {interval.start})") + if interval.end == interval.start and \ + last_interval.start == last_interval.end == interval.start: + raise ValueError(f"Cannot replace consecutive zero-length matches " + f"for groups {last_interval.group} and {interval.group} " + f"(position {interval.start})") + + result+=match.string[last_interval.end:interval.start]+repls[interval.group] + last_interval = interval + result+=match.string[last_interval.end:] + + return result + +class Url: + @staticmethod + def sha256_url(url, session=None): + if session is None: + session = requests_html.HTMLSession() + logger.info(f"Downloading and computing hash of {url}") + h=hashlib.sha256() + r=session.get(url,stream=True,timeout=30) + total_bytes=int(r.headers.get('content-length',0)) or float('inf') + with tqdm.tqdm(total=total_bytes, unit='B', unit_scale=True, unit_divisor=1024) as t: + for c in r.iter_content(1024): + t.update(len(c)) + h.update(c) + return h.hexdigest() + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/plugins/python-build/scripts/add_miniconda.py b/plugins/python-build/scripts/add_miniconda.py new file mode 100755 index 0000000..ddea065 --- /dev/null +++ b/plugins/python-build/scripts/add_miniconda.py @@ -0,0 +1,437 @@ +#!/usr/bin/env python3 +"""Script to add non-"latest" miniconda releases. +Written for python 3.7. + +Checks the miniconda download archives for new versions, +then writes a build script for any which do not exist locally, +saving it to plugins/python-build/share/python-build. + +Ignores releases below 4.3.30. +Also ignores sub-patch releases if that major.minor.patch already exists, +but otherwise, takes the latest sub-patch release for given OS/arch. +Assumes all miniconda3 releases < 4.7 default to python 3.6, and anything else 3.7. +""" +import logging +import re +import string +import sys +import textwrap +from argparse import ArgumentParser +from collections import defaultdict +from dataclasses import dataclass +from enum import Enum +from functools import total_ordering +from pathlib import Path +from typing import NamedTuple, List, Optional, DefaultDict, Dict + +import requests_html + +logger = logging.getLogger(__name__) + +CONDA_REPO = "https://repo.anaconda.com" +MINICONDA_REPO = CONDA_REPO + "/miniconda" +ANACONDA_REPO = CONDA_REPO + "/archive" + +auto_accept_tos_fmt="""export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +""".strip() + +install_script_fmt = """ +{auto_accept_tos} +case "$(anaconda_architecture 2>/dev/null || true)" in +{install_lines} +* ) + {{ echo + colorize 1 "ERROR" + echo ": The binary distribution of {tflavor} is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + }} >&2 + exit 1 + ;; +esac +""".lstrip() + +install_line_fmt = """ +"{os}-{arch}" ) + install_script "{tflavor}{suffix}-{version_py_version}{version_str}-{os}-{arch}" "{repo}/{tflavor}{suffix}-{version_py_version}{version_str}-{os}-{arch}.sh#{md5}" "{flavor}" verify_{py_version} + ;; +""".strip() + +here = Path(__file__).resolve() +out_dir: Path = here.parent.parent / "share" / "python-build" + + +class StrEnum(str, Enum): + """Enum subclass whose members are also instances of str + and directly comparable to strings. str type is forced at declaration. + + Adapted from https://github.com/kissgyorgy/enum34-custom/blob/dbc89596761c970398701d26c6a5bbcfcf70f548/enum_custom.py#L100 + (MIT license) + """ + + def __new__(cls, *args): + for arg in args: + if not isinstance(arg, str): + raise TypeError("Not text %s:" % arg) + + return super(StrEnum, cls).__new__(cls, *args) + + def __str__(self): + return str(self.value) + + +class SupportedOS(StrEnum): + LINUX = "Linux" + MACOSX = "MacOSX" + + +class SupportedArch(StrEnum): + AARCH64 = "aarch64" + ARM64 = "arm64" + PPC64LE = "ppc64le" + S390X = "s390x" + X86_64 = "x86_64" + X86 = "x86" + + +class Flavor(StrEnum): + ANACONDA = "anaconda" + MINICONDA = "miniconda" + + +class TFlavor(StrEnum): + ANACONDA = "Anaconda" + MINICONDA = "Miniconda" + + +class Suffix(StrEnum): + TWO = "2" + THREE = "3" + NONE = "" + + +PyVersion = None +class PyVersionMeta(type): + def __getattr__(self, name): + """Generate PyVersion.PYXXX on demand to future-proof it""" + if PyVersion is not None: + return PyVersion(name.lower()) + return super(PyVersionMeta,self).__getattr__(self, name) + + +@dataclass(frozen=True) +class PyVersion(metaclass=PyVersionMeta): + major: str + minor: str + + def __init__(self, value): + (major, minor) = re.match(r"py(\d)(\d+)", value).groups() + object.__setattr__(self, "major", major) + object.__setattr__(self, "minor", minor) + + @property + def value(self): + return f"py{self.major}{self.minor}" + + def version(self): + return f"{self.major}.{self.minor}" + + def version_info(self): + return (self.major, self.minor) + + def __str__(self): + return self.value + + +@total_ordering +class VersionStr(str): + def info(self): + return tuple(int(n) for n in self.replace("-", ".").split(".")) + + def __eq__(self, other): + return str(self) == str(other) + + def __lt__(self, other): + if isinstance(other, VersionStr): + return self.info() < other.info() + raise ValueError("VersionStr can only be compared to other VersionStr") + + @classmethod + def from_info(cls, version_info): + return VersionStr(".".join(str(n) for n in version_info)) + + def __hash__(self): + return hash(str(self)) + + +class CondaVersion(NamedTuple): + flavor: Flavor + suffix: Suffix + version_str: VersionStr + py_version: Optional[PyVersion] + + @classmethod + def from_str(cls, s): + """ + Convert a string of the form "miniconda_n-ver" or "miniconda_n-py_ver-ver" to a :class:`CondaVersion` object. + """ + miniconda_n, _, remainder = s.partition("-") + suffix = miniconda_n[-1] + if suffix in string.digits: + flavor = miniconda_n[:-1] + else: + flavor = miniconda_n + suffix = "" + + components = remainder.split("-") + if flavor == Flavor.MINICONDA and len(components) >= 2: + py_ver, *ver_parts = components + py_ver = PyVersion(f"py{py_ver.replace('.', '')}") + ver = "-".join(ver_parts) + else: + ver = "-".join(components) + py_ver = None + + return CondaVersion(Flavor(flavor), Suffix(suffix), VersionStr(ver), py_ver) + + def to_filename(self): + if self.py_version: + return f"{self.flavor}{self.suffix}-{self.py_version.version()}-{self.version_str}" + else: + return f"{self.flavor}{self.suffix}-{self.version_str}" + + def default_py_version(self): + """ + :class:`PyVersion` of Python used with this Miniconda version + """ + if self.py_version: + return self.py_version + elif self.suffix == Suffix.TWO: + return PyVersion.PY27 + + v = self.version_str.info() + if self.flavor == "miniconda": + # https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-python.html + if v < (4, 7): + return PyVersion.PY36 + if v < (4, 8): + return PyVersion.PY37 + else: + # since 4.8, Miniconda specifies versions explicitly in the file name + raise ValueError("Miniconda 4.8+ is supposed to specify a Python version explicitly") + if self.flavor == "anaconda": + # https://www.anaconda.com/docs/tools/anaconda-org/release-notes + if v >= (2025,6): + return PyVersion.PY313 + if v >= (2024,6): + return PyVersion.PY312 + if v >= (2023,7): + return PyVersion.PY311 + if v >= (2023,3): + return PyVersion.PY310 + if v >= (2021,11): + return PyVersion.PY39 + if v >= (2020,7): + return PyVersion.PY38 + if v >= (2020,2): + return PyVersion.PY37 + if v >= (5,3,0): + return PyVersion.PY37 + return PyVersion.PY36 + + raise ValueError(self.flavor) + + def requires_tos_accept(self): + """ + requires to accept TOS for installation + """ + return self.flavor == Flavor.MINICONDA \ + and self.version_str.info() >= (25,) + + +class CondaSpec(NamedTuple): + tflavor: TFlavor + version: CondaVersion + os: SupportedOS + arch: SupportedArch + md5: str + repo: str + py_version: Optional[PyVersion] = None + + @classmethod + def from_filestem(cls, stem, md5, repo, py_version=None): + # The `*vers` captures the new trailing `-1` in some file names (a build number?) + # so they can be processed properly. + miniconda_n, *vers, os, arch = stem.split("-") + ver = "-".join(vers) + suffix = miniconda_n[-1] + if suffix in string.digits: + tflavor = miniconda_n[:-1] + else: + tflavor = miniconda_n + suffix = "" + flavor = tflavor.lower() + + if ver.startswith("py"): + py_ver, ver = ver.split("_", maxsplit=1) + py_ver = PyVersion(py_ver) + else: + py_ver = None + spec = CondaSpec( + TFlavor(tflavor), + CondaVersion(Flavor(flavor), Suffix(suffix), VersionStr(ver), py_ver), + SupportedOS(os), + SupportedArch(arch), + md5, + repo, + py_ver + ) + if py_version is None and py_ver is None and ver != "latest": + spec = spec.with_py_version(spec.version.default_py_version()) + return spec + + def to_install_lines(self): + """ + Installation command for this version of Miniconda for use in a Pyenv installation script + """ + return install_line_fmt.format( + tflavor=self.tflavor, + flavor=self.version.flavor, + repo=self.repo, + suffix=self.version.suffix, + version_str=self.version.version_str, + version_py_version=f"{self.version.py_version}_" if self.version.py_version else "", + os=self.os, + arch=self.arch, + md5=self.md5, + py_version=self.py_version, + ) + + def with_py_version(self, py_version: PyVersion): + return CondaSpec(*self[:-1], py_version=py_version) + + +def make_script(specs: List[CondaSpec]): + install_lines = [s.to_install_lines() for s in specs] + return install_script_fmt.format( + install_lines="\n".join(install_lines), + tflavor=specs[0].tflavor, + auto_accept_tos = auto_accept_tos_fmt if specs[0].version.requires_tos_accept() else "" + ).lstrip() + + +def get_existing_condas(name): + """ + Enumerate existing Miniconda installation scripts in share/python-build/ except rolling releases. + + :returns: A generator of :class:`CondaVersion` objects. + """ + logger.info("Getting known %(name)s versions",locals()) + for p in out_dir.iterdir(): + entry_name = p.name + if not p.is_file() or not entry_name.startswith(name): + continue + try: + v = CondaVersion.from_str(entry_name) + if v.version_str != "latest": + logger.debug("Found existing %(name)s version %(v)s", locals()) + yield v + except ValueError as e: + logger.error("Unable to parse existing version %s: %s", entry_name, e) + + +def get_available_condas(name, repo): + """ + Fetch remote miniconda versions. + + :returns: A generator of :class:`CondaSpec` objects for each release available for download + except rolling releases. + """ + logger.info("Fetching remote %(name)s versions",locals()) + session = requests_html.HTMLSession() + response = session.get(repo) + page: requests_html.HTML = response.html + table = page.find("table", first=True) + rows = table.find("tr")[1:] + for row in rows: + f, size, date, md5 = row.find("td") + fname = f.text + md5 = md5.text + + if not fname.endswith(".sh"): + continue + stem = fname[:-3] + + try: + s = CondaSpec.from_filestem(stem, md5, repo) + if s.version.version_str != "latest": + logger.debug("Found remote %(name)s version %(s)s", locals()) + yield s + except ValueError: + pass + + +def key_fn(spec: CondaSpec): + return ( + spec.tflavor, + spec.version.version_str.info(), + spec.version.suffix.value, + spec.os.value, + spec.arch.value, + ) + + +if __name__ == "__main__": + parser = ArgumentParser(description=__doc__) + parser.add_argument( + "-d", "--dry-run", action="store_true", + help="Do not write scripts, just report them to stdout", + ) + parser.add_argument( + "-v", "--verbose", action="store_true", default=0, + help="Increase verbosity of logging", + ) + parsed = parser.parse_args() + + logging.basicConfig(level=logging.DEBUG if parsed.verbose else logging.INFO) + + existing_versions = set() + available_specs = set() + for name,repo in ("miniconda",MINICONDA_REPO),("anaconda",ANACONDA_REPO): + existing_versions |= set(get_existing_condas(name)) + available_specs |= set(get_available_condas(name, repo)) + + # version triple to triple-ified spec to raw spec + to_add: DefaultDict[ + CondaVersion, Dict[CondaSpec, CondaSpec] + ] = defaultdict(dict) + + logger.info("Checking for new versions") + for s in sorted(available_specs, key=key_fn): + key = s.version + vv = key.version_str.info() + + reason = None + if key in existing_versions: + reason = "already exists" + elif key.version_str.info() <= (4, 3, 30): + reason = "too old" + elif len(key.version_str.info()) >= 4 and "-" not in key.version_str: + reason = "ignoring hotfix releases" + + if reason: + logger.debug("Ignoring version %(s)s (%(reason)s)", locals()) + continue + + to_add[key][s] = s + + logger.info("Writing %s scripts", len(to_add)) + for ver, d in to_add.items(): + specs = list(d.values()) + fpath = out_dir / ver.to_filename() + script_str = make_script(specs) + logger.info("Writing script for %s", ver) + if parsed.dry_run: + print(f"Would write spec to {fpath}:\n" + textwrap.indent(script_str, " ")) + else: + with open(fpath, "w") as f: + f.write(script_str) diff --git a/plugins/python-build/scripts/add_miniforge.py b/plugins/python-build/scripts/add_miniforge.py new file mode 100755 index 0000000..41ecfce --- /dev/null +++ b/plugins/python-build/scripts/add_miniforge.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python3 +'Adds the latest miniforge and mambaforge releases.' +from pathlib import Path +import logging +import os +import string + +import requests + +logger = logging.getLogger(__name__) +logging.basicConfig(level=os.environ.get('LOGLEVEL', 'INFO')) + +MINIFORGE_REPO = 'conda-forge/miniforge' +DISTRIBUTIONS = ['miniforge'] +DISTRIBUTIONS_PRE25 = ['miniforge', 'mambaforge'] + +SKIPPED_RELEASES = [ + '4.13.0-0', #has no Mambaforge. We already generated scripts for Miniforge + '22.11.1-0', #MacOS packages are broken (have broken dep tarballs, downloading them fails with 403) + '22.11.1-1', #MacOS packages are broken (have broken dep tarballs, downloading them fails with 403) + '22.11.1-2', #MacOS packages are broken (have broken dep tarballs, downloading them fails with 403) + '25.3.0-0', #marked as prerelease, no Linux version + '25.11.0-0', #regression reported in constructor, re-released as 25.11.0-1 with hotfix bumping to constructor>=3.14 (was >=3.12, 3.13 implicit) +] + +install_script_fmt = """ +case "$(anaconda_architecture 2>/dev/null || true)" in +{install_lines} +* ) + {{ echo + colorize 1 "ERROR" + echo ": The binary distribution of {flavor} is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + }} >&2 + exit 1 + ;; +esac +""".lstrip() + +install_line_fmt = """ +"{os}-{arch}" ) + install_script "{filename}" "{url}#{sha}" "miniconda" verify_py{py_version} + ;; +""".strip() + +here = Path(__file__).resolve() +out_dir: Path = here.parent.parent / "share" / "python-build" + +def download_sha(url): + logger.info(f'Downloading SHA file {url}') + tup = tuple(reversed(requests.get(url).text.replace('./', '').rstrip().split())) + logger.debug(f'Got {tup}') + return tup + +def create_spec(filename, sha, url): + flavor_with_suffix, version, subversion, os, arch = filename.replace('.sh', '').split('-') + suffix = flavor_with_suffix[-1] + + if suffix in string.digits: + flavor = flavor_with_suffix[:-1] + else: + flavor = flavor_with_suffix + + spec = { + 'filename': filename, + 'sha': sha, + 'url': url, + 'py_version': py_version(version), + 'flavor': flavor, + 'os': os, + 'arch': arch, + 'installer_filename': f'{flavor_with_suffix.lower()}-{version}-{subversion}', + } + + logger.debug(f'Created spec {spec}') + + return spec + +def version_tuple(version): + return tuple(int(part) for part in version.split('-')[0].split(".")) + +def py_version(version): + """Suffix for `verify_pyXXX` to call in the generated build script""" + version_tuple_ = version_tuple(version) + # current version: mentioned under https://github.com/conda-forge/miniforge?tab=readme-ov-file#requirements-and-installers + # transition points: + # https://github.com/conda-forge/miniforge/blame/main/Miniforge3/construct.yaml + # look for "- python " in non-pypy branch and which tag the commit is first in + if version_tuple_ >= (26,1): + # https://github.com/conda-forge/miniforge/commit/0016367731e52c67234d6d0e7e6a24c6bf7673e4 + return "313" + if version_tuple_ >= (24,5): + # yes, they jumped from 3.10 directly to 3.12 + # https://github.com/conda-forge/miniforge/commit/bddad0baf22b37cfe079e47fd1680fdfb2183590 + return "312" + if version_tuple_ >= (4,14): + return "310" + raise ValueError("Bundled Python version unknown for release `%s'"%version) + +def supported(filename): + return ('pypy' not in filename) and ('Windows' not in filename) and (not filename.endswith('.pkg')) + +def add_version(release, distributions): + tag_name = release['tag_name'] + download_urls = { f['name']: f['browser_download_url'] for f in release['assets'] } + # can assume that sha files are named similar to release files so can also check supported(on their names) + shas = dict([download_sha(url) for (name, url) in download_urls.items() + if name.endswith('.sha256') and supported(os.path.splitext(name)[0]) and tag_name in name]) + specs = [create_spec(filename, sha, download_urls[filename]) for (filename, sha) in shas.items() if supported(filename)] + + + for distribution in distributions: + distribution_specs = [spec for spec in specs if distribution in spec['flavor'].lower()] + count = len(distribution_specs) + + if count > 0: + output_file = out_dir / distribution_specs[0]['installer_filename'] + + logger.info(f'Writing {count} specs for {distribution} to {output_file}') + + script_str = install_script_fmt.format( + install_lines="\n".join([install_line_fmt.format_map(s) for s in distribution_specs]), + flavor=distribution_specs[0]['flavor'], + ) + + with open(output_file, 'w') as f: + f.write(script_str) + else: + logger.info(f'Did not find specs for {distribution}') + + +def main(): + for release in requests.get(f'https://api.github.com/repos/{MINIFORGE_REPO}/releases').json(): + version = release['tag_name'] + + if version in SKIPPED_RELEASES: + continue + + logger.info(f'Looking for {version} in {out_dir}') + + # mambaforge is retired https://github.com/conda-forge/miniforge/releases/tag/24.11.2-0 + if version_tuple(version) >= (24, 11, 2): + distributions = DISTRIBUTIONS + else: + distributions = DISTRIBUTIONS_PRE25 + + if any(not list(out_dir.glob(f'{distribution}*-{version}')) for distribution in distributions): + logger.info(f'Downloading {version}') + add_version(release, distributions) + +if __name__ == '__main__': + main() diff --git a/plugins/python-build/scripts/requirements.txt b/plugins/python-build/scripts/requirements.txt new file mode 100644 index 0000000..c79b3e2 --- /dev/null +++ b/plugins/python-build/scripts/requirements.txt @@ -0,0 +1,9 @@ +more_itertools +requests-html +fake_useragent<2 +lxml[html_clean] +packaging +requests +sortedcontainers +tqdm +jc @ git+https://github.com/native-api/jc@haslib_mode diff --git a/plugins/python-build/share/python-build/2.1.3 b/plugins/python-build/share/python-build/2.1.3 new file mode 100644 index 0000000..c965118 --- /dev/null +++ b/plugins/python-build/share/python-build/2.1.3 @@ -0,0 +1,5 @@ +require_gcc +install_package "readline-6.2" "https://ftpmirror.gnu.org/readline/readline-6.2.tar.gz#79a696070a058c233c72dd6ac697021cc64abd5ed51e59db867d66d196a89381" mac_readline --if has_broken_mac_readline +install_package "Python-2.1.3" "https://www.python.org/ftp/python/2.1.3/Python-2.1.3.tgz#1bcb5bb587948bc38f36db60e15c376009c56c66570e563a08a82bf7f227afb9" standard verify_py21 +#install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python +#install_package "pip-1.1" "https://pypi.python.org/packages/source/p/pip/pip-1.1.tar.gz#993804bb947d18508acee02141281c77d27677f8c14eaa64d6287a1c53ef01c8" python diff --git a/plugins/python-build/share/python-build/2.2.3 b/plugins/python-build/share/python-build/2.2.3 new file mode 100644 index 0000000..cd7cf83 --- /dev/null +++ b/plugins/python-build/share/python-build/2.2.3 @@ -0,0 +1,5 @@ +require_gcc +install_package "readline-6.2" "https://ftpmirror.gnu.org/readline/readline-6.2.tar.gz#79a696070a058c233c72dd6ac697021cc64abd5ed51e59db867d66d196a89381" mac_readline --if has_broken_mac_readline +install_package "Python-2.2.3" "https://www.python.org/ftp/python/2.2.3/Python-2.2.3.tgz#a8f92e6b89d47359fff0d1fbfe47f104afc77fd1cd5143e7332758b7bc100188" standard verify_py22 +#install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python +#install_package "pip-1.1" "https://pypi.python.org/packages/source/p/pip/pip-1.1.tar.gz#993804bb947d18508acee02141281c77d27677f8c14eaa64d6287a1c53ef01c8" python diff --git a/plugins/python-build/share/python-build/2.3.7 b/plugins/python-build/share/python-build/2.3.7 new file mode 100644 index 0000000..dd53186 --- /dev/null +++ b/plugins/python-build/share/python-build/2.3.7 @@ -0,0 +1,5 @@ +require_gcc +install_package "readline-6.2" "https://ftpmirror.gnu.org/readline/readline-6.2.tar.gz#79a696070a058c233c72dd6ac697021cc64abd5ed51e59db867d66d196a89381" mac_readline --if has_broken_mac_readline +install_package "Python-2.3.7" "https://www.python.org/ftp/python/2.3.7/Python-2.3.7.tgz#969a9891dce9f50b13e54f9890acaf2be66715a5895bf9b11111f320c205b90e" standard verify_py23 +#install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python +#install_package "pip-1.1" "https://pypi.python.org/packages/source/p/pip/pip-1.1.tar.gz#993804bb947d18508acee02141281c77d27677f8c14eaa64d6287a1c53ef01c8" python diff --git a/plugins/python-build/share/python-build/2.4.0 b/plugins/python-build/share/python-build/2.4.0 new file mode 100644 index 0000000..563c8cb --- /dev/null +++ b/plugins/python-build/share/python-build/2.4.0 @@ -0,0 +1,5 @@ +require_gcc +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.4" "https://www.python.org/ftp/python/2.4/Python-2.4.tgz#ff746de0fae8691c082414b42a2bb172da8797e6e8ff66c9a39d2e452f7034e9" standard verify_py24 +install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python +install_package "pip-1.1" "https://pypi.python.org/packages/source/p/pip/pip-1.1.tar.gz#993804bb947d18508acee02141281c77d27677f8c14eaa64d6287a1c53ef01c8" python diff --git a/plugins/python-build/share/python-build/2.4.1 b/plugins/python-build/share/python-build/2.4.1 new file mode 100644 index 0000000..60c202d --- /dev/null +++ b/plugins/python-build/share/python-build/2.4.1 @@ -0,0 +1,5 @@ +require_gcc +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.4.1" "https://www.python.org/ftp/python/2.4.1/Python-2.4.1.tgz#f449c3b167389324c525ad99d02376c518ac11e163dbbbc13bc88a5c7101fd00" standard verify_py24 +install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python +install_package "pip-1.1" "https://pypi.python.org/packages/source/p/pip/pip-1.1.tar.gz#993804bb947d18508acee02141281c77d27677f8c14eaa64d6287a1c53ef01c8" python diff --git a/plugins/python-build/share/python-build/2.4.2 b/plugins/python-build/share/python-build/2.4.2 new file mode 100644 index 0000000..7c0fe6c --- /dev/null +++ b/plugins/python-build/share/python-build/2.4.2 @@ -0,0 +1,5 @@ +require_gcc +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.4.2" "https://www.python.org/ftp/python/2.4.2/Python-2.4.2.tgz#2653e1846e87fd9b3ee287fefc965c80c54646548b4913a22265b0dd54493adf" standard verify_py24 +install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python +install_package "pip-1.1" "https://pypi.python.org/packages/source/p/pip/pip-1.1.tar.gz#993804bb947d18508acee02141281c77d27677f8c14eaa64d6287a1c53ef01c8" python diff --git a/plugins/python-build/share/python-build/2.4.3 b/plugins/python-build/share/python-build/2.4.3 new file mode 100644 index 0000000..59651b1 --- /dev/null +++ b/plugins/python-build/share/python-build/2.4.3 @@ -0,0 +1,5 @@ +require_gcc +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.4.3" "https://www.python.org/ftp/python/2.4.3/Python-2.4.3.tgz#985a413932f5e31e6280b37da6b285a3a0b2748c6786643989ed9b23de97e2d5" standard verify_py24 +install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python +install_package "pip-1.1" "https://pypi.python.org/packages/source/p/pip/pip-1.1.tar.gz#993804bb947d18508acee02141281c77d27677f8c14eaa64d6287a1c53ef01c8" python diff --git a/plugins/python-build/share/python-build/2.4.4 b/plugins/python-build/share/python-build/2.4.4 new file mode 100644 index 0000000..bfec070 --- /dev/null +++ b/plugins/python-build/share/python-build/2.4.4 @@ -0,0 +1,5 @@ +require_gcc +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.4.4" "https://www.python.org/ftp/python/2.4.4/Python-2.4.4.tgz#92be6e20cbc3111d9dd0c016d72ef7914c23b879dc52df7ba28df97afbf12e2e" standard verify_py24 +install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python +install_package "pip-1.1" "https://pypi.python.org/packages/source/p/pip/pip-1.1.tar.gz#993804bb947d18508acee02141281c77d27677f8c14eaa64d6287a1c53ef01c8" python diff --git a/plugins/python-build/share/python-build/2.4.5 b/plugins/python-build/share/python-build/2.4.5 new file mode 100644 index 0000000..15c2572 --- /dev/null +++ b/plugins/python-build/share/python-build/2.4.5 @@ -0,0 +1,5 @@ +require_gcc +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.4.5" "https://www.python.org/ftp/python/2.4.5/Python-2.4.5.tgz#6ae6f67a388a7f70ed3a20eebab5aae995ee433089d1f1724095c62f4b7389a1" standard verify_py24 +install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python +install_package "pip-1.1" "https://pypi.python.org/packages/source/p/pip/pip-1.1.tar.gz#993804bb947d18508acee02141281c77d27677f8c14eaa64d6287a1c53ef01c8" python diff --git a/plugins/python-build/share/python-build/2.4.6 b/plugins/python-build/share/python-build/2.4.6 new file mode 100644 index 0000000..534559a --- /dev/null +++ b/plugins/python-build/share/python-build/2.4.6 @@ -0,0 +1,5 @@ +require_gcc +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.4.6" "https://www.python.org/ftp/python/2.4.6/Python-2.4.6.tgz#b03f269e826927f05c966cf4f4414f3c93ee2314960859e7f8375e24e82f8b02" standard verify_py24 +install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python +install_package "pip-1.1" "https://pypi.python.org/packages/source/p/pip/pip-1.1.tar.gz#993804bb947d18508acee02141281c77d27677f8c14eaa64d6287a1c53ef01c8" python diff --git a/plugins/python-build/share/python-build/2.5.0 b/plugins/python-build/share/python-build/2.5.0 new file mode 100644 index 0000000..b011bc1 --- /dev/null +++ b/plugins/python-build/share/python-build/2.5.0 @@ -0,0 +1,4 @@ +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.5" "https://www.python.org/ftp/python/2.5/Python-2.5.tgz#d7bbf42e36003c6065cd19f3e67d283521858515ee923220f654131cebe1d8f2" standard verify_py25 +install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python +install_package "pip-1.3.1" "https://pypi.python.org/packages/source/p/pip/pip-1.3.1.tar.gz#145eaa5d1ea1b062663da1f3a97780d7edea4c63c68a37c463b1deedf7bb4957" python diff --git a/plugins/python-build/share/python-build/2.5.1 b/plugins/python-build/share/python-build/2.5.1 new file mode 100644 index 0000000..37d5f94 --- /dev/null +++ b/plugins/python-build/share/python-build/2.5.1 @@ -0,0 +1,4 @@ +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.5.1" "https://www.python.org/ftp/python/2.5.1/Python-2.5.1.tgz#1f5caee846049ca30d996f9403eefdb996295c4af664867e35dcc5eb36e4e7e8" standard verify_py25 +install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python +install_package "pip-1.3.1" "https://pypi.python.org/packages/source/p/pip/pip-1.3.1.tar.gz#145eaa5d1ea1b062663da1f3a97780d7edea4c63c68a37c463b1deedf7bb4957" python diff --git a/plugins/python-build/share/python-build/2.5.2 b/plugins/python-build/share/python-build/2.5.2 new file mode 100644 index 0000000..f69c6d5 --- /dev/null +++ b/plugins/python-build/share/python-build/2.5.2 @@ -0,0 +1,4 @@ +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.5.2" "https://www.python.org/ftp/python/2.5.2/Python-2.5.2.tgz#834afe8a88adaf623b05ac5dd6700dd5bb5d0d5553fc74ad529359a3496e4ae3" standard verify_py25 +install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python +install_package "pip-1.3.1" "https://pypi.python.org/packages/source/p/pip/pip-1.3.1.tar.gz#145eaa5d1ea1b062663da1f3a97780d7edea4c63c68a37c463b1deedf7bb4957" python diff --git a/plugins/python-build/share/python-build/2.5.3 b/plugins/python-build/share/python-build/2.5.3 new file mode 100644 index 0000000..23a148b --- /dev/null +++ b/plugins/python-build/share/python-build/2.5.3 @@ -0,0 +1,4 @@ +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.5.3" "https://www.python.org/ftp/python/2.5.3/Python-2.5.3.tgz#c3fee607d20a77dfb72ea2e627eb4d95d25c735603435abde62c57015a0445bd" standard verify_py25 +install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python +install_package "pip-1.3.1" "https://pypi.python.org/packages/source/p/pip/pip-1.3.1.tar.gz#145eaa5d1ea1b062663da1f3a97780d7edea4c63c68a37c463b1deedf7bb4957" python diff --git a/plugins/python-build/share/python-build/2.5.4 b/plugins/python-build/share/python-build/2.5.4 new file mode 100644 index 0000000..982d07b --- /dev/null +++ b/plugins/python-build/share/python-build/2.5.4 @@ -0,0 +1,4 @@ +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.5.4" "https://www.python.org/ftp/python/2.5.4/Python-2.5.4.tgz#3d3b205611ee503a38a9433d5645a571668420bb219242c7f51af85f05664da6" standard verify_py25 +install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python +install_package "pip-1.3.1" "https://pypi.python.org/packages/source/p/pip/pip-1.3.1.tar.gz#145eaa5d1ea1b062663da1f3a97780d7edea4c63c68a37c463b1deedf7bb4957" python diff --git a/plugins/python-build/share/python-build/2.5.5 b/plugins/python-build/share/python-build/2.5.5 new file mode 100644 index 0000000..1aaaf84 --- /dev/null +++ b/plugins/python-build/share/python-build/2.5.5 @@ -0,0 +1,4 @@ +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.5.5" "https://www.python.org/ftp/python/2.5.5/Python-2.5.5.tgz#03be1019c4fe93daeb53ba9e4294bf22a8ed4cb854cbd57e24e16f6bf63e2392" standard verify_py25 +install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python +install_package "pip-1.3.1" "https://pypi.python.org/packages/source/p/pip/pip-1.3.1.tar.gz#145eaa5d1ea1b062663da1f3a97780d7edea4c63c68a37c463b1deedf7bb4957" python diff --git a/plugins/python-build/share/python-build/2.5.6 b/plugins/python-build/share/python-build/2.5.6 new file mode 100644 index 0000000..de372bd --- /dev/null +++ b/plugins/python-build/share/python-build/2.5.6 @@ -0,0 +1,4 @@ +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.5.6" "https://www.python.org/ftp/python/2.5.6/Python-2.5.6.tgz#c2e4377597241b1065677d23327c04d0f41945d370c61a491cc88be367234c5d" standard verify_py25 +install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python +install_package "pip-1.3.1" "https://pypi.python.org/packages/source/p/pip/pip-1.3.1.tar.gz#145eaa5d1ea1b062663da1f3a97780d7edea4c63c68a37c463b1deedf7bb4957" python diff --git a/plugins/python-build/share/python-build/2.6.0 b/plugins/python-build/share/python-build/2.6.0 new file mode 100644 index 0000000..1093404 --- /dev/null +++ b/plugins/python-build/share/python-build/2.6.0 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.6" "https://www.python.org/ftp/python/2.6/Python-2.6.tgz#7c2f21a968a737a59ed0729f4b1dc154dc3aa183c20be96055186fe43c6742d0" standard verify_py26 ensurepip diff --git a/plugins/python-build/share/python-build/2.6.1 b/plugins/python-build/share/python-build/2.6.1 new file mode 100644 index 0000000..4718a5e --- /dev/null +++ b/plugins/python-build/share/python-build/2.6.1 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.6.1" "https://www.python.org/ftp/python/2.6.1/Python-2.6.1.tgz#fb65e93678e1327e3e8559cc56e1e00ed8c07162b21287a3502677892c5c515c" standard verify_py26 ensurepip diff --git a/plugins/python-build/share/python-build/2.6.2 b/plugins/python-build/share/python-build/2.6.2 new file mode 100644 index 0000000..0f8b061 --- /dev/null +++ b/plugins/python-build/share/python-build/2.6.2 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.6.2" "https://www.python.org/ftp/python/2.6.2/Python-2.6.2.tgz#e37ecdf249f248f4fea227adbca09c778670b64fcb5e45947ec3e093cbc12c86" standard verify_py26 ensurepip diff --git a/plugins/python-build/share/python-build/2.6.3 b/plugins/python-build/share/python-build/2.6.3 new file mode 100644 index 0000000..82f9d91 --- /dev/null +++ b/plugins/python-build/share/python-build/2.6.3 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.6.3" "https://www.python.org/ftp/python/2.6.3/Python-2.6.3.tgz#a71b55540690425fd82ab00819aeb92c1b23cbb4730a0ccd2e25c833b22a812e" standard verify_py26 ensurepip diff --git a/plugins/python-build/share/python-build/2.6.4 b/plugins/python-build/share/python-build/2.6.4 new file mode 100644 index 0000000..70cc836 --- /dev/null +++ b/plugins/python-build/share/python-build/2.6.4 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.6.4" "https://www.python.org/ftp/python/2.6.4/Python-2.6.4.tgz#1a25a47506e4165704cfe2b07c0a064b0b5762a2d18b8fbdad5af688aeacd252" standard verify_py26 ensurepip diff --git a/plugins/python-build/share/python-build/2.6.5 b/plugins/python-build/share/python-build/2.6.5 new file mode 100644 index 0000000..1d711b5 --- /dev/null +++ b/plugins/python-build/share/python-build/2.6.5 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.6.5" "https://www.python.org/ftp/python/2.6.5/Python-2.6.5.tgz#b331dafdce3361834fee783795d4f68ae7cf7d379e9137c2d8e8531cea615ede" standard verify_py26 ensurepip diff --git a/plugins/python-build/share/python-build/2.6.6 b/plugins/python-build/share/python-build/2.6.6 new file mode 100644 index 0000000..2e3d6a1 --- /dev/null +++ b/plugins/python-build/share/python-build/2.6.6 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.6.6" "https://www.python.org/ftp/python/2.6.6/Python-2.6.6.tgz#372f66db46d773214e4619df1794a26449158f626138d4d2141a64c2f017fae1" standard verify_py26 ensurepip diff --git a/plugins/python-build/share/python-build/2.6.7 b/plugins/python-build/share/python-build/2.6.7 new file mode 100644 index 0000000..fd85925 --- /dev/null +++ b/plugins/python-build/share/python-build/2.6.7 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.6.7" "https://www.python.org/ftp/python/2.6.7/Python-2.6.7.tgz#a8093eace4cfd3e06b05f0deb5d765e3c6cec65908048640a8cadd7a948b3826" standard verify_py26 ensurepip diff --git a/plugins/python-build/share/python-build/2.6.8 b/plugins/python-build/share/python-build/2.6.8 new file mode 100644 index 0000000..41bb8c6 --- /dev/null +++ b/plugins/python-build/share/python-build/2.6.8 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.6.8" "https://www.python.org/ftp/python/2.6.8/Python-2.6.8.tgz#5bf02a75ffa2fcaa5a3cabb8201998519b045541975622316888ea468d9512f7" standard verify_py26 ensurepip diff --git a/plugins/python-build/share/python-build/2.6.9 b/plugins/python-build/share/python-build/2.6.9 new file mode 100644 index 0000000..16b1a6f --- /dev/null +++ b/plugins/python-build/share/python-build/2.6.9 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.6.9" "https://www.python.org/ftp/python/2.6.9/Python-2.6.9.tgz#7277b1285d8a82f374ef6ebaac85b003266f7939b3f2a24a3af52f9523ac94db" standard verify_py26 ensurepip diff --git a/plugins/python-build/share/python-build/2.7-dev b/plugins/python-build/share/python-build/2.7-dev new file mode 100644 index 0000000..a97818e --- /dev/null +++ b/plugins/python-build/share/python-build/2.7-dev @@ -0,0 +1,4 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_git "Python-2.7-dev" "https://github.com/python/cpython" "2.7" standard verify_py27 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/2.7.0 b/plugins/python-build/share/python-build/2.7.0 new file mode 100644 index 0000000..a7ca805 --- /dev/null +++ b/plugins/python-build/share/python-build/2.7.0 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.7" "https://www.python.org/ftp/python/2.7/Python-2.7.tgz#5670dd6c0c93b0b529781d070852f7b51ce6855615b16afcd318341af2910fb5" standard verify_py27 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/2.7.1 b/plugins/python-build/share/python-build/2.7.1 new file mode 100644 index 0000000..aa1de98 --- /dev/null +++ b/plugins/python-build/share/python-build/2.7.1 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.7.1" "https://www.python.org/ftp/python/2.7.1/Python-2.7.1.tgz#ca13e7b1860821494f70de017202283ad73b1fb7bd88586401c54ef958226ec8" standard verify_py27 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/2.7.10 b/plugins/python-build/share/python-build/2.7.10 new file mode 100644 index 0000000..c6eb3de --- /dev/null +++ b/plugins/python-build/share/python-build/2.7.10 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-2.7.10" "https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tar.xz#1cd3730781b91caf0fa1c4d472dc29274186480161a150294c42ce9b5c5effc0" standard verify_py27 copy_python_gdb ensurepip +else + install_package "Python-2.7.10" "https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz#eda8ce6eec03e74991abb5384170e7c65fcd7522e409b8e83d7e6372add0f12a" standard verify_py27 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/2.7.11 b/plugins/python-build/share/python-build/2.7.11 new file mode 100644 index 0000000..f07099b --- /dev/null +++ b/plugins/python-build/share/python-build/2.7.11 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-2.7.11" "https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tar.xz#962b4c45af50124ea61f11a30deb4342fc0bc21126790fa1d7f6c79809413f46" standard verify_py27 copy_python_gdb ensurepip +else + install_package "Python-2.7.11" "https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz#82929b96fd6afc8da838b149107078c02fa1744b7e60999a8babbc0d3fa86fc6" standard verify_py27 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/2.7.12 b/plugins/python-build/share/python-build/2.7.12 new file mode 100644 index 0000000..8fc9aed --- /dev/null +++ b/plugins/python-build/share/python-build/2.7.12 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-2.7.12" "https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tar.xz#d7837121dd5652a05fef807c361909d255d173280c4e1a4ded94d73d80a1f978" standard verify_py27 copy_python_gdb ensurepip +else + install_package "Python-2.7.12" "https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tgz#3cb522d17463dfa69a155ab18cffa399b358c966c0363d6c8b5b3bf1384da4b6" standard verify_py27 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/2.7.13 b/plugins/python-build/share/python-build/2.7.13 new file mode 100644 index 0000000..fb45543 --- /dev/null +++ b/plugins/python-build/share/python-build/2.7.13 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-2.7.13" "https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tar.xz#35d543986882f78261f97787fd3e06274bfa6df29fac9b4a94f73930ff98f731" standard verify_py27 copy_python_gdb ensurepip +else + install_package "Python-2.7.13" "https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tgz#a4f05a0720ce0fd92626f0278b6b433eee9a6173ddf2bced7957dfb599a5ece1" standard verify_py27 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/2.7.14 b/plugins/python-build/share/python-build/2.7.14 new file mode 100644 index 0000000..52e85da --- /dev/null +++ b/plugins/python-build/share/python-build/2.7.14 @@ -0,0 +1,8 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-2.7.14" "https://www.python.org/ftp/python/2.7.14/Python-2.7.14.tar.xz#71ffb26e09e78650e424929b2b457b9c912ac216576e6bd9e7d204ed03296a66" standard verify_py27 copy_python_gdb ensurepip +else + install_package "Python-2.7.14" "https://www.python.org/ftp/python/2.7.14/Python-2.7.14.tgz#304c9b202ea6fbd0a4a8e0ad3733715fbd4749f2204a9173a58ec53c32ea73e8" standard verify_py27 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/2.7.15 b/plugins/python-build/share/python-build/2.7.15 new file mode 100644 index 0000000..1cd5e5e --- /dev/null +++ b/plugins/python-build/share/python-build/2.7.15 @@ -0,0 +1,8 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-2.7.15" "https://www.python.org/ftp/python/2.7.15/Python-2.7.15.tar.xz#22d9b1ac5b26135ad2b8c2901a9413537e08749a753356ee913c84dbd2df5574" standard verify_py27 copy_python_gdb ensurepip +else + install_package "Python-2.7.15" "https://www.python.org/ftp/python/2.7.15/Python-2.7.15.tgz#18617d1f15a380a919d517630a9cd85ce17ea602f9bbdc58ddc672df4b0239db" standard verify_py27 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/2.7.16 b/plugins/python-build/share/python-build/2.7.16 new file mode 100644 index 0000000..78c4785 --- /dev/null +++ b/plugins/python-build/share/python-build/2.7.16 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2q" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2q.tar.gz#5744cfcbcec2b1b48629f7354203bc1e5e9b5466998bbccc5b5fcde3b18eb684" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-2.7.16" "https://www.python.org/ftp/python/2.7.16/Python-2.7.16.tar.xz#f222ef602647eecb6853681156d32de4450a2c39f4de93bd5b20235f2e660ed7" standard verify_py27 copy_python_gdb ensurepip +else + install_package "Python-2.7.16" "https://www.python.org/ftp/python/2.7.16/Python-2.7.16.tgz#01da813a3600876f03f46db11cc5c408175e99f03af2ba942ef324389a83bad5" standard verify_py27 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/2.7.17 b/plugins/python-build/share/python-build/2.7.17 new file mode 100644 index 0000000..f8b0641 --- /dev/null +++ b/plugins/python-build/share/python-build/2.7.17 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2q" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2q.tar.gz#5744cfcbcec2b1b48629f7354203bc1e5e9b5466998bbccc5b5fcde3b18eb684" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-2.7.17" "https://www.python.org/ftp/python/2.7.17/Python-2.7.17.tar.xz#4d43f033cdbd0aa7b7023c81b0e986fd11e653b5248dac9144d508f11812ba41" standard verify_py27 copy_python_gdb ensurepip +else + install_package "Python-2.7.17" "https://www.python.org/ftp/python/2.7.17/Python-2.7.17.tgz#f22059d09cdf9625e0a7284d24a13062044f5bf59d93a7f3382190dfa94cecde" standard verify_py27 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/2.7.18 b/plugins/python-build/share/python-build/2.7.18 new file mode 100644 index 0000000..6576ca6 --- /dev/null +++ b/plugins/python-build/share/python-build/2.7.18 @@ -0,0 +1,8 @@ +export PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA="openssl@1.1 openssl@1.0 openssl" +install_package "openssl-1.1.1v" "https://www.openssl.org/source/openssl-1.1.1v.tar.gz" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-2.7.18" "https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tar.xz#b62c0e7937551d0cc02b8fd5cb0f544f9405bafc9a54d3808ed4594812edef43" standard verify_py27 copy_python_gdb ensurepip_lt21 +else + install_package "Python-2.7.18" "https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tgz#da3080e3b488f648a3d7a4560ddee895284c3380b11d6de75edb986526b9a814" standard verify_py27 copy_python_gdb ensurepip_lt21 +fi diff --git a/plugins/python-build/share/python-build/2.7.2 b/plugins/python-build/share/python-build/2.7.2 new file mode 100644 index 0000000..5620d4d --- /dev/null +++ b/plugins/python-build/share/python-build/2.7.2 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.7.2" "https://www.python.org/ftp/python/2.7.2/Python-2.7.2.tgz#1d54b7096c17902c3f40ffce7e5b84e0072d0144024184fff184a84d563abbb3" standard verify_py27 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/2.7.3 b/plugins/python-build/share/python-build/2.7.3 new file mode 100644 index 0000000..c158ee6 --- /dev/null +++ b/plugins/python-build/share/python-build/2.7.3 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.7.3" "https://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz#d4c20f2b5faf95999fd5fecb3f7d32071b0820516224a6d2b72932ab47a1cb8e" standard verify_py27 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/2.7.4 b/plugins/python-build/share/python-build/2.7.4 new file mode 100644 index 0000000..698898d --- /dev/null +++ b/plugins/python-build/share/python-build/2.7.4 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.7.4" "https://www.python.org/ftp/python/2.7.4/Python-2.7.4.tgz#98c5eb9c8e65effcc0122112ba17a0bce880aa23ecb560af56b55eb55632b81a" standard verify_py27 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/2.7.5 b/plugins/python-build/share/python-build/2.7.5 new file mode 100644 index 0000000..4c19547 --- /dev/null +++ b/plugins/python-build/share/python-build/2.7.5 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.7.5" "https://www.python.org/ftp/python/2.7.5/Python-2.7.5.tgz#8e1b5fa87b91835afb376a9c0d319d41feca07ffebc0288d97ab08d64f48afbf" standard verify_py27 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/2.7.6 b/plugins/python-build/share/python-build/2.7.6 new file mode 100644 index 0000000..76bb573 --- /dev/null +++ b/plugins/python-build/share/python-build/2.7.6 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-2.7.6" "https://www.python.org/ftp/python/2.7.6/Python-2.7.6.tgz#99c6860b70977befa1590029fae092ddb18db1d69ae67e8b9385b66ed104ba58" standard verify_py27 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/2.7.7 b/plugins/python-build/share/python-build/2.7.7 new file mode 100644 index 0000000..337ba8d --- /dev/null +++ b/plugins/python-build/share/python-build/2.7.7 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-2.7.7" "https://www.python.org/ftp/python/2.7.7/Python-2.7.7.tar.xz#2983e3cd089b30c50e2b2234f07c2ac4fb8a5df230ab8f2e1133a1d8b208da78" standard verify_py27 copy_python_gdb ensurepip +else + install_package "Python-2.7.7" "https://www.python.org/ftp/python/2.7.7/Python-2.7.7.tgz#7f49c0a6705ad89d925181e27d0aaa025ee4731ce0de64776c722216c3e66c42" standard verify_py27 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/2.7.8 b/plugins/python-build/share/python-build/2.7.8 new file mode 100644 index 0000000..7d75980 --- /dev/null +++ b/plugins/python-build/share/python-build/2.7.8 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-2.7.8" "https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tar.xz#edde10a0cb7d14e2735e682882d5b287028d1485c456758154c19573db68075a" standard verify_py27 copy_python_gdb ensurepip +else + install_package "Python-2.7.8" "https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz#74d70b914da4487aa1d97222b29e9554d042f825f26cb2b93abd20fdda56b557" standard verify_py27 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/2.7.9 b/plugins/python-build/share/python-build/2.7.9 new file mode 100644 index 0000000..2ba752f --- /dev/null +++ b/plugins/python-build/share/python-build/2.7.9 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-2.7.9" "https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tar.xz#90d27e14ea7e03570026850e2e50ba71ad20b7eb31035aada1cf3def8f8d4916" standard verify_py27 copy_python_gdb ensurepip +else + install_package "Python-2.7.9" "https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz#c8bba33e66ac3201dabdc556f0ea7cfe6ac11946ec32d357c4c6f9b018c12c5b" standard verify_py27 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.0.1 b/plugins/python-build/share/python-build/3.0.1 new file mode 100644 index 0000000..f7e1632 --- /dev/null +++ b/plugins/python-build/share/python-build/3.0.1 @@ -0,0 +1,14 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-3.0.1" "https://www.python.org/ftp/python/3.0.1/Python-3.0.1.tgz#7d5f2feae9035f1d3d9e6bb7f092dbf374d6bb4b25abd0d2d11f13bba1cb04de" standard verify_py30 +if [[ "Darwin" == "$(uname -s)" ]]; then + # https://github.com/pyenv/pyenv/issues/456 + { echo + colorize 1 "WARNING" + echo ": pyenv cannot install setuptools-1.4.2 to CPython 3.0.1 on OS X." + echo "setuptools and pip will not be available until you install them manually." + } >&2 +else + install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python + install_package "pip-1.3.1" "https://pypi.python.org/packages/source/p/pip/pip-1.3.1.tar.gz#145eaa5d1ea1b062663da1f3a97780d7edea4c63c68a37c463b1deedf7bb4957" python +fi diff --git a/plugins/python-build/share/python-build/3.1.0 b/plugins/python-build/share/python-build/3.1.0 new file mode 100644 index 0000000..2ada28d --- /dev/null +++ b/plugins/python-build/share/python-build/3.1.0 @@ -0,0 +1,5 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-3.1" "https://www.python.org/ftp/python/3.1/Python-3.1.tgz#99a034cf574ea3c26412b0a0728126d7fd6ea9593d099d807a25d216ed031e6a" standard verify_py31 +install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python +install_package "pip-1.5.6" "https://pypi.python.org/packages/source/p/pip/pip-1.5.6.tar.gz#b1a4ae66baf21b7eb05a5e4f37c50c2706fa28ea1f8780ce8efe14dcd9f1726c" python diff --git a/plugins/python-build/share/python-build/3.1.1 b/plugins/python-build/share/python-build/3.1.1 new file mode 100644 index 0000000..c118470 --- /dev/null +++ b/plugins/python-build/share/python-build/3.1.1 @@ -0,0 +1,5 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-3.1.1" "https://www.python.org/ftp/python/3.1.1/Python-3.1.1.tgz#5d85d7bff11c4db44920af99f64f4227c816f897f6bfa9dd8a2611165ca5f0a1" standard verify_py31 +install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python +install_package "pip-1.5.6" "https://pypi.python.org/packages/source/p/pip/pip-1.5.6.tar.gz#b1a4ae66baf21b7eb05a5e4f37c50c2706fa28ea1f8780ce8efe14dcd9f1726c" python diff --git a/plugins/python-build/share/python-build/3.1.2 b/plugins/python-build/share/python-build/3.1.2 new file mode 100644 index 0000000..8575ec6 --- /dev/null +++ b/plugins/python-build/share/python-build/3.1.2 @@ -0,0 +1,5 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-3.1.2" "https://www.python.org/ftp/python/3.1.2/Python-3.1.2.tgz#dffbc0561a161a4a576c6059e6990a9859a0be16ba9b5736eabe4abbb2700d1c" standard verify_py31 +install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python +install_package "pip-1.5.6" "https://pypi.python.org/packages/source/p/pip/pip-1.5.6.tar.gz#b1a4ae66baf21b7eb05a5e4f37c50c2706fa28ea1f8780ce8efe14dcd9f1726c" python diff --git a/plugins/python-build/share/python-build/3.1.3 b/plugins/python-build/share/python-build/3.1.3 new file mode 100644 index 0000000..ab23c85 --- /dev/null +++ b/plugins/python-build/share/python-build/3.1.3 @@ -0,0 +1,5 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-3.1.3" "https://www.python.org/ftp/python/3.1.3/Python-3.1.3.tgz#6311823aeda8be6a7a2b67caaeff48abce6626c9940ba7ed81f9c978666a36bd" standard verify_py31 +install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python +install_package "pip-1.5.6" "https://pypi.python.org/packages/source/p/pip/pip-1.5.6.tar.gz#b1a4ae66baf21b7eb05a5e4f37c50c2706fa28ea1f8780ce8efe14dcd9f1726c" python diff --git a/plugins/python-build/share/python-build/3.1.4 b/plugins/python-build/share/python-build/3.1.4 new file mode 100644 index 0000000..d6a8f20 --- /dev/null +++ b/plugins/python-build/share/python-build/3.1.4 @@ -0,0 +1,5 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-3.1.4" "https://www.python.org/ftp/python/3.1.4/Python-3.1.4.tgz#fadc05ea6d05360cff189944a85ecd2180bbc308784d168b350450e70bbdd846" standard verify_py31 +install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python +install_package "pip-1.5.6" "https://pypi.python.org/packages/source/p/pip/pip-1.5.6.tar.gz#b1a4ae66baf21b7eb05a5e4f37c50c2706fa28ea1f8780ce8efe14dcd9f1726c" python diff --git a/plugins/python-build/share/python-build/3.1.5 b/plugins/python-build/share/python-build/3.1.5 new file mode 100644 index 0000000..7419128 --- /dev/null +++ b/plugins/python-build/share/python-build/3.1.5 @@ -0,0 +1,5 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-3.1.5" "https://www.python.org/ftp/python/3.1.5/Python-3.1.5.tgz#d12dae6d06f52ef6bf1271db4d5b4d14b5dd39813e324314e72b648ef1bc0103" standard verify_py31 +install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python +install_package "pip-1.5.6" "https://pypi.python.org/packages/source/p/pip/pip-1.5.6.tar.gz#b1a4ae66baf21b7eb05a5e4f37c50c2706fa28ea1f8780ce8efe14dcd9f1726c" python diff --git a/plugins/python-build/share/python-build/3.10-dev b/plugins/python-build/share/python-build/3.10-dev new file mode 100644 index 0000000..daa21f3 --- /dev/null +++ b/plugins/python-build/share/python-build/3.10-dev @@ -0,0 +1,5 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_git "Python-3.10-dev" "https://github.com/python/cpython" 3.10 standard verify_py310 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/3.10.0 b/plugins/python-build/share/python-build/3.10.0 new file mode 100644 index 0000000..9eec8f5 --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.0 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.0" "https://www.python.org/ftp/python/3.10.0/Python-3.10.0.tar.xz#5a99f8e7a6a11a7b98b4e75e0d1303d3832cada5534068f69c7b6222a7b1b002" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.0" "https://www.python.org/ftp/python/3.10.0/Python-3.10.0.tgz#c4e0cbad57c90690cb813fb4663ef670b4d0f587d8171e2c42bd4c9245bd2758" standard verify_py310 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.10.1 b/plugins/python-build/share/python-build/3.10.1 new file mode 100644 index 0000000..74568c1 --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.1 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.1" "https://www.python.org/ftp/python/3.10.1/Python-3.10.1.tar.xz#a7f1265b6e1a5de1ec5c3ec7019ab53413469934758311e9d240c46e5ae6e177" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.1" "https://www.python.org/ftp/python/3.10.1/Python-3.10.1.tgz#b76117670e7c5064344b9c138e141a377e686b9063f3a8a620ff674fa8ec90d3" standard verify_py310 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.10.10 b/plugins/python-build/share/python-build/3.10.10 new file mode 100644 index 0000000..b30b38f --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.10 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.10" "https://www.python.org/ftp/python/3.10.10/Python-3.10.10.tar.xz#0419e9085bf51b7a672009b3f50dbf1859acdf18ba725d0ec19aa5c8503f0ea3" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.10" "https://www.python.org/ftp/python/3.10.10/Python-3.10.10.tgz#fba64559dde21ebdc953e4565e731573bb61159de8e4d4cedee70fb1196f610d" standard verify_py310 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.10.11 b/plugins/python-build/share/python-build/3.10.11 new file mode 100644 index 0000000..3376dea --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.11 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.11" "https://www.python.org/ftp/python/3.10.11/Python-3.10.11.tar.xz#3c3bc3048303721c904a03eb8326b631e921f11cc3be2988456a42f115daf04c" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.11" "https://www.python.org/ftp/python/3.10.11/Python-3.10.11.tgz#f3db31b668efa983508bd67b5712898aa4247899a346f2eb745734699ccd3859" standard verify_py310 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.10.12 b/plugins/python-build/share/python-build/3.10.12 new file mode 100644 index 0000000..01aeace --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.12 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.12" "https://www.python.org/ftp/python/3.10.12/Python-3.10.12.tar.xz#afb74bf19130e7a47d10312c8f5e784f24e0527981eab68e20546cfb865830b8" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.12" "https://www.python.org/ftp/python/3.10.12/Python-3.10.12.tgz#a43cd383f3999a6f4a7db2062b2fc9594fefa73e175b3aedafa295a51a7bb65c" standard verify_py310 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.10.13 b/plugins/python-build/share/python-build/3.10.13 new file mode 100644 index 0000000..af2f2a0 --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.13 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.13" "https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tar.xz#5c88848668640d3e152b35b4536ef1c23b2ca4bd2c957ef1ecbb053f571dd3f6" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.13" "https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tgz#698ec55234c1363bd813b460ed53b0f108877c7a133d48bde9a50a1eb57b7e65" standard verify_py310 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.10.14 b/plugins/python-build/share/python-build/3.10.14 new file mode 100644 index 0000000..6bbe017 --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.14 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.14" "https://www.python.org/ftp/python/3.10.14/Python-3.10.14.tar.xz#9c50481faa8c2832329ba0fc8868d0a606a680fc4f60ec48d26ce8e076751fda" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.14" "https://www.python.org/ftp/python/3.10.14/Python-3.10.14.tgz#cefea32d3be89c02436711c95a45c7f8e880105514b78680c14fe76f5709a0f6" standard verify_py310 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.10.15 b/plugins/python-build/share/python-build/3.10.15 new file mode 100644 index 0000000..b161333 --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.15 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.15" "https://www.python.org/ftp/python/3.10.15/Python-3.10.15.tar.xz#aab0950817735172601879872d937c1e4928a57c409ae02369ec3d91dccebe79" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.15" "https://www.python.org/ftp/python/3.10.15/Python-3.10.15.tgz#a27864e5ba2a4474f8f6c58ab92ff52767ac8b66f1646923355a53fe3ef15074" standard verify_py310 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.10.16 b/plugins/python-build/share/python-build/3.10.16 new file mode 100644 index 0000000..6a1d62b --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.16 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.16" "https://www.python.org/ftp/python/3.10.16/Python-3.10.16.tar.xz#bfb249609990220491a1b92850a07135ed0831e41738cf681d63cf01b2a8fbd1" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.16" "https://www.python.org/ftp/python/3.10.16/Python-3.10.16.tgz#f2e22ed965a93cfeb642378ed6e6cdbc127682664b24123679f3d013fafe9cd0" standard verify_py310 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.10.17 b/plugins/python-build/share/python-build/3.10.17 new file mode 100644 index 0000000..26e4817 --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.17 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.2.4" "https://github.com/openssl/openssl/releases/download/openssl-3.2.4/openssl-3.2.4.tar.gz#b23ad7fd9f73e43ad1767e636040e88ba7c9e5775bfa5618436a0dd2c17c3716" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.17" "https://www.python.org/ftp/python/3.10.17/Python-3.10.17.tar.xz#4c68050f049d1b4ac5aadd0df5f27941c0350d2a9e7ab0907ee5eb5225d9d6b0" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.17" "https://www.python.org/ftp/python/3.10.17/Python-3.10.17.tgz#8fcda0fbdc131859a4a4223abb925fd522a77e3fb3b52c46cea5f3bc2ae0cd9f" standard verify_py310 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.10.18 b/plugins/python-build/share/python-build/3.10.18 new file mode 100644 index 0000000..8e44e54 --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.18 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.2.4" "https://github.com/openssl/openssl/releases/download/openssl-3.2.4/openssl-3.2.4.tar.gz#b23ad7fd9f73e43ad1767e636040e88ba7c9e5775bfa5618436a0dd2c17c3716" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.18" "https://www.python.org/ftp/python/3.10.18/Python-3.10.18.tar.xz#ae665bc678abd9ab6a6e1573d2481625a53719bc517e9a634ed2b9fefae3817f" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.18" "https://www.python.org/ftp/python/3.10.18/Python-3.10.18.tgz#1b19ab802518eb36a851f5ddef571862c7a31ece533109a99df6d5af0a1ceb99" standard verify_py310 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.10.19 b/plugins/python-build/share/python-build/3.10.19 new file mode 100644 index 0000000..dd8466f --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.19 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.2.4" "https://github.com/openssl/openssl/releases/download/openssl-3.2.4/openssl-3.2.4.tar.gz#b23ad7fd9f73e43ad1767e636040e88ba7c9e5775bfa5618436a0dd2c17c3716" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.19" "https://www.python.org/ftp/python/3.10.19/Python-3.10.19.tar.xz#c8f4a596572201d81dd7df91f70e177e19a70f1d489968b54b5fbbf29a97c076" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.19" "https://www.python.org/ftp/python/3.10.19/Python-3.10.19.tgz#a078fb2d7a216071ebbe2e34b5f5355dd6b6e9b0cd1bacc4a41c63990c5a0eec" standard verify_py310 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.10.2 b/plugins/python-build/share/python-build/3.10.2 new file mode 100644 index 0000000..e0bd418 --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.2 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.2" "https://www.python.org/ftp/python/3.10.2/Python-3.10.2.tar.xz#17de3ac7da9f2519aa9d64378c603a73a0e9ad58dffa8812e45160c086de64c7" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.2" "https://www.python.org/ftp/python/3.10.2/Python-3.10.2.tgz#3c0ede893011319f9b0a56b44953a3d52c7abf9657c23fb4bc9ced93b86e9c97" standard verify_py310 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.10.20 b/plugins/python-build/share/python-build/3.10.20 new file mode 100644 index 0000000..7807d80 --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.20 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.6.1" "https://github.com/openssl/openssl/releases/download/openssl-3.6.1/openssl-3.6.1.tar.gz#b1bfedcd5b289ff22aee87c9d600f515767ebf45f77168cb6d64f231f518a82e" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.3" "https://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.20" "https://www.python.org/ftp/python/3.10.20/Python-3.10.20.tar.xz#de6517421601e39a9a3bc3e1bc4c7b2f239297423ee05e282598c83ec0647505" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.20" "https://www.python.org/ftp/python/3.10.20/Python-3.10.20.tgz#4ff5fd4c5bab803b935019f3e31d7219cebd6f870d00389cea53b88bbe935d1a" standard verify_py310 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.10.3 b/plugins/python-build/share/python-build/3.10.3 new file mode 100644 index 0000000..306a770 --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.3 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.3" "https://www.python.org/ftp/python/3.10.3/Python-3.10.3.tar.xz#596c72de998dc39205bc4f70ef0dbf7edec740a306d09b49a9bd0a77806730dc" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.3" "https://www.python.org/ftp/python/3.10.3/Python-3.10.3.tgz#5a3b029bad70ba2a019ebff08a65060a8b9b542ffc1a83c697f1449ecca9813b" standard verify_py310 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.10.4 b/plugins/python-build/share/python-build/3.10.4 new file mode 100644 index 0000000..58ccc89 --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.4 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.4" "https://www.python.org/ftp/python/3.10.4/Python-3.10.4.tar.xz#80bf925f571da436b35210886cf79f6eb5fa5d6c571316b73568343451f77a19" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.4" "https://www.python.org/ftp/python/3.10.4/Python-3.10.4.tgz#f3bcc65b1d5f1dc78675c746c98fcee823c038168fc629c5935b044d0911ad28" standard verify_py310 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.10.5 b/plugins/python-build/share/python-build/3.10.5 new file mode 100644 index 0000000..ecaa508 --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.5 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.5" "https://www.python.org/ftp/python/3.10.5/Python-3.10.5.tar.xz#8437efd5b106ef0a75aabfbf23d880625120a73a86a22ade4d2e2e68d7b74486" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.5" "https://www.python.org/ftp/python/3.10.5/Python-3.10.5.tgz#18f57182a2de3b0be76dfc39fdcfd28156bb6dd23e5f08696f7492e9e3d0bf2d" standard verify_py310 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.10.6 b/plugins/python-build/share/python-build/3.10.6 new file mode 100644 index 0000000..8f19a0d --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.6 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.6" "https://www.python.org/ftp/python/3.10.6/Python-3.10.6.tar.xz#f795ff87d11d4b0c7c33bc8851b0c28648d8a4583aa2100a98c22b4326b6d3f3" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.6" "https://www.python.org/ftp/python/3.10.6/Python-3.10.6.tgz#848cb06a5caa85da5c45bd7a9221bb821e33fc2bdcba088c127c58fad44e6343" standard verify_py310 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.10.7 b/plugins/python-build/share/python-build/3.10.7 new file mode 100644 index 0000000..9d5eb3f --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.7 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.7" "https://www.python.org/ftp/python/3.10.7/Python-3.10.7.tar.xz#6eed8415b7516fb2f260906db5d48dd4c06acc0cb24a7d6cc15296a604dcdc48" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.7" "https://www.python.org/ftp/python/3.10.7/Python-3.10.7.tgz#1b2e4e2df697c52d36731666979e648beeda5941d0f95740aafbf4163e5cc126" standard verify_py310 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.10.8 b/plugins/python-build/share/python-build/3.10.8 new file mode 100644 index 0000000..02d9162 --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.8 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.8" "https://www.python.org/ftp/python/3.10.8/Python-3.10.8.tar.xz#6a30ecde59c47048013eb5a658c9b5dec277203d2793667f578df7671f7f03f3" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.8" "https://www.python.org/ftp/python/3.10.8/Python-3.10.8.tgz#f400c3fb394b8bef1292f6dc1292c5fadc3533039a5bc0c3e885f3e16738029a" standard verify_py310 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.10.9 b/plugins/python-build/share/python-build/3.10.9 new file mode 100644 index 0000000..a18d67c --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.9 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.9" "https://www.python.org/ftp/python/3.10.9/Python-3.10.9.tar.xz#5ae03e308260164baba39921fdb4dbf8e6d03d8235a939d4582b33f0b5e46a83" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.9" "https://www.python.org/ftp/python/3.10.9/Python-3.10.9.tgz#4ccd7e46c8898f4c7862910a1703aa0e63525913a519abb2f55e26220a914d88" standard verify_py310 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.11-dev b/plugins/python-build/share/python-build/3.11-dev new file mode 100644 index 0000000..9aa935b --- /dev/null +++ b/plugins/python-build/share/python-build/3.11-dev @@ -0,0 +1,6 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_git "Python-3.11-dev" "https://github.com/python/cpython" 3.11 standard verify_py311 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/3.11.0 b/plugins/python-build/share/python-build/3.11.0 new file mode 100644 index 0000000..1dc73d5 --- /dev/null +++ b/plugins/python-build/share/python-build/3.11.0 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-1.1.1q" "https://www.openssl.org/source/openssl-1.1.1q.tar.gz#d7939ce614029cdff0b6c20f0e2e5703158a489a72b2507b8bd51bf8c8fd10ca" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.11.0" "https://www.python.org/ftp/python/3.11.0/Python-3.11.0.tar.xz#a57dc82d77358617ba65b9841cee1e3b441f386c3789ddc0676eca077f2951c3" standard verify_py311 copy_python_gdb ensurepip +else + install_package "Python-3.11.0" "https://www.python.org/ftp/python/3.11.0/Python-3.11.0.tgz#64424e96e2457abbac899b90f9530985b51eef2905951febd935f0e73414caeb" standard verify_py311 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.11.1 b/plugins/python-build/share/python-build/3.11.1 new file mode 100644 index 0000000..2ff9413 --- /dev/null +++ b/plugins/python-build/share/python-build/3.11.1 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-1.1.1s" "https://www.openssl.org/source/openssl-1.1.1s.tar.gz#c5ac01e760ee6ff0dab61d6b2bbd30146724d063eb322180c6f18a6f74e4b6aa" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.11.1" "https://www.python.org/ftp/python/3.11.1/Python-3.11.1.tar.xz#85879192f2cffd56cb16c092905949ebf3e5e394b7f764723529637901dfb58f" standard verify_py311 copy_python_gdb ensurepip +else + install_package "Python-3.11.1" "https://www.python.org/ftp/python/3.11.1/Python-3.11.1.tgz#baed518e26b337d4d8105679caf68c5c32630d702614fc174e98cb95c46bdfa4" standard verify_py311 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.11.10 b/plugins/python-build/share/python-build/3.11.10 new file mode 100644 index 0000000..ae40b14 --- /dev/null +++ b/plugins/python-build/share/python-build/3.11.10 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.2.2" "https://openssl.org/source/old/3.2/openssl-3.2.2.tar.gz#197149c18d9e9f292c43f0400acaba12e5f52cacfe050f3d199277ea738ec2e7" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.11.10" "https://www.python.org/ftp/python/3.11.10/Python-3.11.10.tar.xz#07a4356e912900e61a15cb0949a06c4a05012e213ecd6b4e84d0f67aabbee372" standard verify_py311 copy_python_gdb ensurepip +else + install_package "Python-3.11.10" "https://www.python.org/ftp/python/3.11.10/Python-3.11.10.tgz#92f2faf242681bfa406d53a51e17d42c5373affe23a130cd9697e132ef574706" standard verify_py311 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.11.11 b/plugins/python-build/share/python-build/3.11.11 new file mode 100644 index 0000000..e736fe5 --- /dev/null +++ b/plugins/python-build/share/python-build/3.11.11 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.2.2" "https://openssl.org/source/old/3.2/openssl-3.2.2.tar.gz#197149c18d9e9f292c43f0400acaba12e5f52cacfe050f3d199277ea738ec2e7" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.11.11" "https://www.python.org/ftp/python/3.11.11/Python-3.11.11.tar.xz#2a9920c7a0cd236de33644ed980a13cbbc21058bfdc528febb6081575ed73be3" standard verify_py311 copy_python_gdb ensurepip +else + install_package "Python-3.11.11" "https://www.python.org/ftp/python/3.11.11/Python-3.11.11.tgz#883bddee3c92fcb91cf9c09c5343196953cbb9ced826213545849693970868ed" standard verify_py311 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.11.12 b/plugins/python-build/share/python-build/3.11.12 new file mode 100644 index 0000000..ca860cc --- /dev/null +++ b/plugins/python-build/share/python-build/3.11.12 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.2.4" "https://github.com/openssl/openssl/releases/download/openssl-3.2.4/openssl-3.2.4.tar.gz#b23ad7fd9f73e43ad1767e636040e88ba7c9e5775bfa5618436a0dd2c17c3716" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.11.12" "https://www.python.org/ftp/python/3.11.12/Python-3.11.12.tar.xz#849da87af4df137710c1796e276a955f7a85c9f971081067c8f565d15c352a09" standard verify_py311 copy_python_gdb ensurepip +else + install_package "Python-3.11.12" "https://www.python.org/ftp/python/3.11.12/Python-3.11.12.tgz#379c9929a989a9d65a1f5d854e011f4872b142259f4fc0a8c4062d2815ed7fba" standard verify_py311 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.11.13 b/plugins/python-build/share/python-build/3.11.13 new file mode 100644 index 0000000..f3c344b --- /dev/null +++ b/plugins/python-build/share/python-build/3.11.13 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.2.4" "https://github.com/openssl/openssl/releases/download/openssl-3.2.4/openssl-3.2.4.tar.gz#b23ad7fd9f73e43ad1767e636040e88ba7c9e5775bfa5618436a0dd2c17c3716" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.11.13" "https://www.python.org/ftp/python/3.11.13/Python-3.11.13.tar.xz#8fb5f9fbc7609fa822cb31549884575db7fd9657cbffb89510b5d7975963a83a" standard verify_py311 copy_python_gdb ensurepip +else + install_package "Python-3.11.13" "https://www.python.org/ftp/python/3.11.13/Python-3.11.13.tgz#0f1a22f4dfd34595a29cf69ee7ea73b9eff8b1cc89d7ab29b3ab0ec04179dad8" standard verify_py311 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.11.14 b/plugins/python-build/share/python-build/3.11.14 new file mode 100644 index 0000000..9f86213 --- /dev/null +++ b/plugins/python-build/share/python-build/3.11.14 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.2.4" "https://github.com/openssl/openssl/releases/download/openssl-3.2.4/openssl-3.2.4.tar.gz#b23ad7fd9f73e43ad1767e636040e88ba7c9e5775bfa5618436a0dd2c17c3716" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.11.14" "https://www.python.org/ftp/python/3.11.14/Python-3.11.14.tar.xz#8d3ed8ec5c88c1c95f5e558612a725450d2452813ddad5e58fdb1a53b1209b78" standard verify_py311 copy_python_gdb ensurepip +else + install_package "Python-3.11.14" "https://www.python.org/ftp/python/3.11.14/Python-3.11.14.tgz#563d2a1b2a5ba5d5409b5ecd05a0e1bf9b028cf3e6a6f0c87a5dc8dc3f2d9182" standard verify_py311 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.11.15 b/plugins/python-build/share/python-build/3.11.15 new file mode 100644 index 0000000..9fd16e5 --- /dev/null +++ b/plugins/python-build/share/python-build/3.11.15 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.6.1" "https://github.com/openssl/openssl/releases/download/openssl-3.6.1/openssl-3.6.1.tar.gz#b1bfedcd5b289ff22aee87c9d600f515767ebf45f77168cb6d64f231f518a82e" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.3" "https://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.11.15" "https://www.python.org/ftp/python/3.11.15/Python-3.11.15.tar.xz#272179ddd9a2e41a0fc8e42e33dfbdca0b3711aa5abf372d3f2d51543d09b625" standard verify_py311 copy_python_gdb ensurepip +else + install_package "Python-3.11.15" "https://www.python.org/ftp/python/3.11.15/Python-3.11.15.tgz#f4de1b10bd6c70cbb9fa1cd71fc5038b832747a74ee59d599c69ce4846defb50" standard verify_py311 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.11.2 b/plugins/python-build/share/python-build/3.11.2 new file mode 100644 index 0000000..20122d1 --- /dev/null +++ b/plugins/python-build/share/python-build/3.11.2 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-1.1.1s" "https://www.openssl.org/source/openssl-1.1.1s.tar.gz#c5ac01e760ee6ff0dab61d6b2bbd30146724d063eb322180c6f18a6f74e4b6aa" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.11.2" "https://www.python.org/ftp/python/3.11.2/Python-3.11.2.tar.xz#29e4b8f5f1658542a8c13e2dd277358c9c48f2b2f7318652ef1675e402b9d2af" standard verify_py311 copy_python_gdb ensurepip +else + install_package "Python-3.11.2" "https://www.python.org/ftp/python/3.11.2/Python-3.11.2.tgz#2411c74bda5bbcfcddaf4531f66d1adc73f247f529aee981b029513aefdbf849" standard verify_py311 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.11.3 b/plugins/python-build/share/python-build/3.11.3 new file mode 100644 index 0000000..4b1ab6f --- /dev/null +++ b/plugins/python-build/share/python-build/3.11.3 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-1.1.1s" "https://www.openssl.org/source/openssl-1.1.1s.tar.gz#c5ac01e760ee6ff0dab61d6b2bbd30146724d063eb322180c6f18a6f74e4b6aa" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.11.3" "https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tar.xz#8a5db99c961a7ecf27c75956189c9602c968751f11dbeae2b900dbff1c085b5e" standard verify_py311 copy_python_gdb ensurepip +else + install_package "Python-3.11.3" "https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tgz#1a79f3df32265d9e6625f1a0b31c28eb1594df911403d11f3320ee1da1b3e048" standard verify_py311 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.11.4 b/plugins/python-build/share/python-build/3.11.4 new file mode 100644 index 0000000..b6819e9 --- /dev/null +++ b/plugins/python-build/share/python-build/3.11.4 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-1.1.1s" "https://www.openssl.org/source/openssl-1.1.1s.tar.gz#c5ac01e760ee6ff0dab61d6b2bbd30146724d063eb322180c6f18a6f74e4b6aa" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.11.4" "https://www.python.org/ftp/python/3.11.4/Python-3.11.4.tar.xz#2f0e409df2ab57aa9fc4cbddfb976af44e4e55bf6f619eee6bc5c2297264a7f6" standard verify_py311 copy_python_gdb ensurepip +else + install_package "Python-3.11.4" "https://www.python.org/ftp/python/3.11.4/Python-3.11.4.tgz#85c37a265e5c9dd9f75b35f954e31fbfc10383162417285e30ad25cc073a0d63" standard verify_py311 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.11.5 b/plugins/python-build/share/python-build/3.11.5 new file mode 100644 index 0000000..5e822df --- /dev/null +++ b/plugins/python-build/share/python-build/3.11.5 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.2.0" "https://www.openssl.org/source/openssl-3.2.0.tar.gz#14c826f07c7e433706fb5c69fa9e25dab95684844b4c962a2cf1bf183eb4690e" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.11.5" "https://www.python.org/ftp/python/3.11.5/Python-3.11.5.tar.xz#85cd12e9cf1d6d5a45f17f7afe1cebe7ee628d3282281c492e86adf636defa3f" standard verify_py311 copy_python_gdb ensurepip +else + install_package "Python-3.11.5" "https://www.python.org/ftp/python/3.11.5/Python-3.11.5.tgz#a12a0a013a30b846c786c010f2c19dd36b7298d888f7c4bd1581d90ce18b5e58" standard verify_py311 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.11.6 b/plugins/python-build/share/python-build/3.11.6 new file mode 100644 index 0000000..efcaeec --- /dev/null +++ b/plugins/python-build/share/python-build/3.11.6 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.2.0" "https://www.openssl.org/source/openssl-3.2.0.tar.gz#14c826f07c7e433706fb5c69fa9e25dab95684844b4c962a2cf1bf183eb4690e" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.11.6" "https://www.python.org/ftp/python/3.11.6/Python-3.11.6.tar.xz#0fab78fa7f133f4f38210c6260d90d7c0d5c7198446419ce057ec7ac2e6f5f38" standard verify_py311 copy_python_gdb ensurepip +else + install_package "Python-3.11.6" "https://www.python.org/ftp/python/3.11.6/Python-3.11.6.tgz#c049bf317e877cbf9fce8c3af902436774ecef5249a29d10984ca3a37f7f4736" standard verify_py311 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.11.7 b/plugins/python-build/share/python-build/3.11.7 new file mode 100644 index 0000000..2f19ba8 --- /dev/null +++ b/plugins/python-build/share/python-build/3.11.7 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.2.0" "https://www.openssl.org/source/openssl-3.2.0.tar.gz#14c826f07c7e433706fb5c69fa9e25dab95684844b4c962a2cf1bf183eb4690e" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.11.7" "https://www.python.org/ftp/python/3.11.7/Python-3.11.7.tar.xz#18e1aa7e66ff3a58423d59ed22815a6954e53342122c45df20c96877c062b9b7" standard verify_py311 copy_python_gdb ensurepip +else + install_package "Python-3.11.7" "https://www.python.org/ftp/python/3.11.7/Python-3.11.7.tgz#068c05f82262e57641bd93458dfa883128858f5f4997aad7a36fd25b13b29209" standard verify_py311 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.11.8 b/plugins/python-build/share/python-build/3.11.8 new file mode 100644 index 0000000..b8ce8de --- /dev/null +++ b/plugins/python-build/share/python-build/3.11.8 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.2.1" "https://www.openssl.org/source/openssl-3.2.1.tar.gz#83c7329fe52c850677d75e5d0b0ca245309b97e8ecbcfdc1dfdc4ab9fac35b39" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.11.8" "https://www.python.org/ftp/python/3.11.8/Python-3.11.8.tar.xz#9e06008c8901924395bc1da303eac567a729ae012baa182ab39269f650383bb3" standard verify_py311 copy_python_gdb ensurepip +else + install_package "Python-3.11.8" "https://www.python.org/ftp/python/3.11.8/Python-3.11.8.tgz#d3019a613b9e8761d260d9ebe3bd4df63976de30464e5c0189566e1ae3f61889" standard verify_py311 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.11.9 b/plugins/python-build/share/python-build/3.11.9 new file mode 100644 index 0000000..96f734c --- /dev/null +++ b/plugins/python-build/share/python-build/3.11.9 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.2.1" "https://www.openssl.org/source/openssl-3.2.1.tar.gz#83c7329fe52c850677d75e5d0b0ca245309b97e8ecbcfdc1dfdc4ab9fac35b39" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.11.9" "https://www.python.org/ftp/python/3.11.9/Python-3.11.9.tar.xz#9b1e896523fc510691126c864406d9360a3d1e986acbda59cda57b5abda45b87" standard verify_py311 copy_python_gdb ensurepip +else + install_package "Python-3.11.9" "https://www.python.org/ftp/python/3.11.9/Python-3.11.9.tgz#e7de3240a8bc2b1e1ba5c81bf943f06861ff494b69fda990ce2722a504c6153d" standard verify_py311 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.12-dev b/plugins/python-build/share/python-build/3.12-dev new file mode 100644 index 0000000..69ca817 --- /dev/null +++ b/plugins/python-build/share/python-build/3.12-dev @@ -0,0 +1,7 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +export PYTHON_BUILD_CONFIGURE_WITH_DSYMUTIL=1 +install_package "openssl-3.1.2" "https://www.openssl.org/source/openssl-3.1.2.tar.gz#a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_git "Python-3.12-dev" "https://github.com/python/cpython" 3.12 standard verify_py312 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/3.12.0 b/plugins/python-build/share/python-build/3.12.0 new file mode 100644 index 0000000..12ed163 --- /dev/null +++ b/plugins/python-build/share/python-build/3.12.0 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.1.2" "https://www.openssl.org/source/openssl-3.1.2.tar.gz#a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.12.0" "https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tar.xz#795c34f44df45a0e9b9710c8c71c15c671871524cd412ca14def212e8ccb155d" standard verify_py312 copy_python_gdb ensurepip +else + install_package "Python-3.12.0" "https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz#51412956d24a1ef7c97f1cb5f70e185c13e3de1f50d131c0aac6338080687afb" standard verify_py312 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.12.1 b/plugins/python-build/share/python-build/3.12.1 new file mode 100644 index 0000000..907bfaf --- /dev/null +++ b/plugins/python-build/share/python-build/3.12.1 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.1.2" "https://www.openssl.org/source/openssl-3.1.2.tar.gz#a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.12.1" "https://www.python.org/ftp/python/3.12.1/Python-3.12.1.tar.xz#8dfb8f426fcd226657f9e2bd5f1e96e53264965176fa17d32658e873591aeb21" standard verify_py312 copy_python_gdb ensurepip +else + install_package "Python-3.12.1" "https://www.python.org/ftp/python/3.12.1/Python-3.12.1.tgz#d01ec6a33bc10009b09c17da95cc2759af5a580a7316b3a446eb4190e13f97b2" standard verify_py312 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.12.10 b/plugins/python-build/share/python-build/3.12.10 new file mode 100644 index 0000000..00ed1e9 --- /dev/null +++ b/plugins/python-build/share/python-build/3.12.10 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.3.3" "https://github.com/openssl/openssl/releases/download/openssl-3.3.3/openssl-3.3.3.tar.gz#712590fd20aaa60ec75d778fe5b810d6b829ca7fb1e530577917a131f9105539" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.12.10" "https://www.python.org/ftp/python/3.12.10/Python-3.12.10.tar.xz#07ab697474595e06f06647417d3c7fa97ded07afc1a7e4454c5639919b46eaea" standard verify_py312 copy_python_gdb ensurepip +else + install_package "Python-3.12.10" "https://www.python.org/ftp/python/3.12.10/Python-3.12.10.tgz#15d9c623abfd2165fe816ea1fb385d6ed8cf3c664661ab357f1782e3036a6dac" standard verify_py312 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.12.11 b/plugins/python-build/share/python-build/3.12.11 new file mode 100644 index 0000000..ee1c266 --- /dev/null +++ b/plugins/python-build/share/python-build/3.12.11 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.5.1" "https://github.com/openssl/openssl/releases/download/openssl-3.5.1/openssl-3.5.1.tar.gz#529043b15cffa5f36077a4d0af83f3de399807181d607441d734196d889b641f" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.12.11" "https://www.python.org/ftp/python/3.12.11/Python-3.12.11.tar.xz#c30bb24b7f1e9a19b11b55a546434f74e739bb4c271a3e3a80ff4380d49f7adb" standard verify_py312 copy_python_gdb ensurepip +else + install_package "Python-3.12.11" "https://www.python.org/ftp/python/3.12.11/Python-3.12.11.tgz#7b8d59af8216044d2313de8120bfc2cc00a9bd2e542f15795e1d616c51faf3d6" standard verify_py312 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.12.12 b/plugins/python-build/share/python-build/3.12.12 new file mode 100644 index 0000000..bdc66a1 --- /dev/null +++ b/plugins/python-build/share/python-build/3.12.12 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.5.1" "https://github.com/openssl/openssl/releases/download/openssl-3.5.1/openssl-3.5.1.tar.gz#529043b15cffa5f36077a4d0af83f3de399807181d607441d734196d889b641f" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.12.12" "https://www.python.org/ftp/python/3.12.12/Python-3.12.12.tar.xz#fb85a13414b028c49ba18bbd523c2d055a30b56b18b92ce454ea2c51edc656c4" standard verify_py312 copy_python_gdb ensurepip +else + install_package "Python-3.12.12" "https://www.python.org/ftp/python/3.12.12/Python-3.12.12.tgz#487c908ddf4097a1b9ba859f25fe46d22ccaabfb335880faac305ac62bffb79b" standard verify_py312 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.12.13 b/plugins/python-build/share/python-build/3.12.13 new file mode 100644 index 0000000..c3f37cb --- /dev/null +++ b/plugins/python-build/share/python-build/3.12.13 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.6.1" "https://github.com/openssl/openssl/releases/download/openssl-3.6.1/openssl-3.6.1.tar.gz#b1bfedcd5b289ff22aee87c9d600f515767ebf45f77168cb6d64f231f518a82e" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.3" "https://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.12.13" "https://www.python.org/ftp/python/3.12.13/Python-3.12.13.tar.xz#c08bc65a81971c1dd5783182826503369466c7e67374d1646519adf05207b684" standard verify_py312 copy_python_gdb ensurepip +else + install_package "Python-3.12.13" "https://www.python.org/ftp/python/3.12.13/Python-3.12.13.tgz#0816c4761c97ecdb3f50a3924de0a93fd78cb63ee8e6c04201ddfaedca500b0b" standard verify_py312 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.12.2 b/plugins/python-build/share/python-build/3.12.2 new file mode 100644 index 0000000..cd7fbe7 --- /dev/null +++ b/plugins/python-build/share/python-build/3.12.2 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.2.1" "https://www.openssl.org/source/openssl-3.2.1.tar.gz#83c7329fe52c850677d75e5d0b0ca245309b97e8ecbcfdc1dfdc4ab9fac35b39" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.12.2" "https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tar.xz#be28112dac813d2053545c14bf13a16401a21877f1a69eb6ea5d84c4a0f3d870" standard verify_py312 copy_python_gdb ensurepip +else + install_package "Python-3.12.2" "https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tgz#a7c4f6a9dc423d8c328003254ab0c9338b83037bd787d680826a5bf84308116e" standard verify_py312 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.12.3 b/plugins/python-build/share/python-build/3.12.3 new file mode 100644 index 0000000..484d8b4 --- /dev/null +++ b/plugins/python-build/share/python-build/3.12.3 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.2.1" "https://www.openssl.org/source/openssl-3.2.1.tar.gz#83c7329fe52c850677d75e5d0b0ca245309b97e8ecbcfdc1dfdc4ab9fac35b39" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.12.3" "https://www.python.org/ftp/python/3.12.3/Python-3.12.3.tar.xz#56bfef1fdfc1221ce6720e43a661e3eb41785dd914ce99698d8c7896af4bdaa1" standard verify_py312 copy_python_gdb ensurepip +else + install_package "Python-3.12.3" "https://www.python.org/ftp/python/3.12.3/Python-3.12.3.tgz#a6b9459f45a6ebbbc1af44f5762623fa355a0c87208ed417628b379d762dddb0" standard verify_py312 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.12.4 b/plugins/python-build/share/python-build/3.12.4 new file mode 100644 index 0000000..def8ffb --- /dev/null +++ b/plugins/python-build/share/python-build/3.12.4 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.2.2" "https://www.openssl.org/source/openssl-3.2.2.tar.gz#197149c18d9e9f292c43f0400acaba12e5f52cacfe050f3d199277ea738ec2e7" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.12.4" "https://www.python.org/ftp/python/3.12.4/Python-3.12.4.tar.xz#f6d419a6d8743ab26700801b4908d26d97e8b986e14f95de31b32de2b0e79554" standard verify_py312 copy_python_gdb ensurepip +else + install_package "Python-3.12.4" "https://www.python.org/ftp/python/3.12.4/Python-3.12.4.tgz#01b3c1c082196f3b33168d344a9c85fb07bfe0e7ecfe77fee4443420d1ce2ad9" standard verify_py312 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.12.5 b/plugins/python-build/share/python-build/3.12.5 new file mode 100644 index 0000000..4bc86ad --- /dev/null +++ b/plugins/python-build/share/python-build/3.12.5 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.3.1" "https://www.openssl.org/source/openssl-3.3.1.tar.gz#777cd596284c883375a2a7a11bf5d2786fc5413255efab20c50d6ffe6d020b7e" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.12.5" "https://www.python.org/ftp/python/3.12.5/Python-3.12.5.tar.xz#fa8a2e12c5e620b09f53e65bcd87550d2e5a1e2e04bf8ba991dcc55113876397" standard verify_py312 copy_python_gdb ensurepip +else + install_package "Python-3.12.5" "https://www.python.org/ftp/python/3.12.5/Python-3.12.5.tgz#38dc4e2c261d49c661196066edbfb70fdb16be4a79cc8220c224dfeb5636d405" standard verify_py312 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.12.6 b/plugins/python-build/share/python-build/3.12.6 new file mode 100644 index 0000000..2874201 --- /dev/null +++ b/plugins/python-build/share/python-build/3.12.6 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.12.6" "https://www.python.org/ftp/python/3.12.6/Python-3.12.6.tar.xz#1999658298cf2fb837dffed8ff3c033ef0c98ef20cf73c5d5f66bed5ab89697c" standard verify_py312 copy_python_gdb ensurepip +else + install_package "Python-3.12.6" "https://www.python.org/ftp/python/3.12.6/Python-3.12.6.tgz#85a4c1be906d20e5c5a69f2466b00da769c221d6a684acfd3a514dbf5bf10a66" standard verify_py312 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.12.7 b/plugins/python-build/share/python-build/3.12.7 new file mode 100644 index 0000000..49d5e7d --- /dev/null +++ b/plugins/python-build/share/python-build/3.12.7 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.12.7" "https://www.python.org/ftp/python/3.12.7/Python-3.12.7.tar.xz#24887b92e2afd4a2ac602419ad4b596372f67ac9b077190f459aba390faf5550" standard verify_py312 copy_python_gdb ensurepip +else + install_package "Python-3.12.7" "https://www.python.org/ftp/python/3.12.7/Python-3.12.7.tgz#73ac8fe780227bf371add8373c3079f42a0dc62deff8d612cd15a618082ab623" standard verify_py312 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.12.8 b/plugins/python-build/share/python-build/3.12.8 new file mode 100644 index 0000000..42634f1 --- /dev/null +++ b/plugins/python-build/share/python-build/3.12.8 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.12.8" "https://www.python.org/ftp/python/3.12.8/Python-3.12.8.tar.xz#c909157bb25ec114e5869124cc2a9c4a4d4c1e957ca4ff553f1edc692101154e" standard verify_py312 copy_python_gdb ensurepip +else + install_package "Python-3.12.8" "https://www.python.org/ftp/python/3.12.8/Python-3.12.8.tgz#5978435c479a376648cb02854df3b892ace9ed7d32b1fead652712bee9d03a45" standard verify_py312 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.12.9 b/plugins/python-build/share/python-build/3.12.9 new file mode 100644 index 0000000..c03fe91 --- /dev/null +++ b/plugins/python-build/share/python-build/3.12.9 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.12.9" "https://www.python.org/ftp/python/3.12.9/Python-3.12.9.tar.xz#7220835d9f90b37c006e9842a8dff4580aaca4318674f947302b8d28f3f81112" standard verify_py312 copy_python_gdb ensurepip +else + install_package "Python-3.12.9" "https://www.python.org/ftp/python/3.12.9/Python-3.12.9.tgz#45313e4c5f0e8acdec9580161d565cf5fea578e3eabf25df7cc6355bf4afa1ee" standard verify_py312 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.13-dev b/plugins/python-build/share/python-build/3.13-dev new file mode 100644 index 0000000..4beb508 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13-dev @@ -0,0 +1,8 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +export PYTHON_BUILD_CONFIGURE_WITH_DSYMUTIL=1 +install_package "openssl-3.5.1" "https://www.openssl.org/source/openssl-3.5.1.tar.gz#529043b15cffa5f36077a4d0af83f3de399807181d607441d734196d889b641f" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_git "Python-3.13-dev" "https://github.com/python/cpython" 3.13 standard verify_py313 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/3.13.0 b/plugins/python-build/share/python-build/3.13.0 new file mode 100644 index 0000000..e79fafa --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.0 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.13.0" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0.tar.xz#086de5882e3cb310d4dca48457522e2e48018ecd43da9cdf827f6a0759efb07d" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.13.0" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0.tgz#12445c7b3db3126c41190bfdc1c8239c39c719404e844babbd015a1bc3fafcd4" standard verify_py313 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.13.0t b/plugins/python-build/share/python-build/3.13.0t new file mode 100644 index 0000000..ecb9485 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.0t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.13.0 diff --git a/plugins/python-build/share/python-build/3.13.1 b/plugins/python-build/share/python-build/3.13.1 new file mode 100644 index 0000000..a002add --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.1 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.4.0" "https://github.com/openssl/openssl/releases/download/openssl-3.4.0/openssl-3.4.0.tar.gz#e15dda82fe2fe8139dc2ac21a36d4ca01d5313c75f99f46c4e8a27709b7294bf" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.13.1" "https://www.python.org/ftp/python/3.13.1/Python-3.13.1.tar.xz#9cf9427bee9e2242e3877dd0f6b641c1853ca461f39d6503ce260a59c80bf0d9" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.13.1" "https://www.python.org/ftp/python/3.13.1/Python-3.13.1.tgz#1513925a9f255ef0793dbf2f78bb4533c9f184bdd0ad19763fd7f47a400a7c55" standard verify_py313 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.13.10 b/plugins/python-build/share/python-build/3.13.10 new file mode 100644 index 0000000..7630601 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.10 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.6.0" "https://github.com/openssl/openssl/releases/download/openssl-3.6.0/openssl-3.6.0.tar.gz#b6a5f44b7eb69e3fa35dbf15524405b44837a481d43d81daddde3ff21fcbb8e9" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.3" "http://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.13.10" "https://www.python.org/ftp/python/3.13.10/Python-3.13.10.tar.xz#bc673c04375a1a3f0808c27ba8f0411ab811ad390a8740318ccb9c60fad8fd77" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.13.10" "https://www.python.org/ftp/python/3.13.10/Python-3.13.10.tgz#de5930852e95ba8c17b56548e04648470356ac47f7506014664f8f510d7bd61b" standard verify_py313 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.13.10t b/plugins/python-build/share/python-build/3.13.10t new file mode 100644 index 0000000..518be93 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.10t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "${BASH_SOURCE[0]%t}" diff --git a/plugins/python-build/share/python-build/3.13.11 b/plugins/python-build/share/python-build/3.13.11 new file mode 100644 index 0000000..debfba0 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.11 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.6.0" "https://github.com/openssl/openssl/releases/download/openssl-3.6.0/openssl-3.6.0.tar.gz#b6a5f44b7eb69e3fa35dbf15524405b44837a481d43d81daddde3ff21fcbb8e9" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.3" "http://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.13.11" "https://www.python.org/ftp/python/3.13.11/Python-3.13.11.tar.xz#16ede7bb7cdbfa895d11b0642fa0e523f291e6487194d53cf6d3b338c3a17ea2" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.13.11" "https://www.python.org/ftp/python/3.13.11/Python-3.13.11.tgz#03cfedbe06ce21bc44ce09245e091a77f2fee9ec9be5c52069048a181300b202" standard verify_py313 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.13.12 b/plugins/python-build/share/python-build/3.13.12 new file mode 100644 index 0000000..7b4723c --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.12 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.6.1" "https://github.com/openssl/openssl/releases/download/openssl-3.6.1/openssl-3.6.1.tar.gz#b1bfedcd5b289ff22aee87c9d600f515767ebf45f77168cb6d64f231f518a82e" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.3" "https://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.13.12" "https://www.python.org/ftp/python/3.13.12/Python-3.13.12.tar.xz#2a84cd31dd8d8ea8aaff75de66fc1b4b0127dd5799aa50a64ae9a313885b4593" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.13.12" "https://www.python.org/ftp/python/3.13.12/Python-3.13.12.tgz#12e7cb170ad2d1a69aee96a1cc7fc8de5b1e97a2bdac51683a3db016ec9a2996" standard verify_py313 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.13.12t b/plugins/python-build/share/python-build/3.13.12t new file mode 100644 index 0000000..518be93 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.12t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "${BASH_SOURCE[0]%t}" diff --git a/plugins/python-build/share/python-build/3.13.13 b/plugins/python-build/share/python-build/3.13.13 new file mode 100644 index 0000000..7e4a931 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.13 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.6.2" "https://github.com/openssl/openssl/releases/download/openssl-3.6.2/openssl-3.6.2.tar.gz#aaf51a1fe064384f811daeaeb4ec4dce7340ec8bd893027eee676af31e83a04f" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.3" "https://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.13.13" "https://www.python.org/ftp/python/3.13.13/Python-3.13.13.tar.xz#2ab91ff401783ccca64f75d10c882e957bdfd60e2bf5a72f8421793729b78a71" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.13.13" "https://www.python.org/ftp/python/3.13.13/Python-3.13.13.tgz#f9cde7b0e2ec8165d7326e2a0f59ea2686ce9d0c617dbbb3d66a7e54d31b74b9" standard verify_py313 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.13.13t b/plugins/python-build/share/python-build/3.13.13t new file mode 100644 index 0000000..518be93 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.13t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "${BASH_SOURCE[0]%t}" diff --git a/plugins/python-build/share/python-build/3.13.1t b/plugins/python-build/share/python-build/3.13.1t new file mode 100644 index 0000000..005d3c5 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.1t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.13.1 diff --git a/plugins/python-build/share/python-build/3.13.2 b/plugins/python-build/share/python-build/3.13.2 new file mode 100644 index 0000000..9d8d205 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.2 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.4.0" "https://github.com/openssl/openssl/releases/download/openssl-3.4.0/openssl-3.4.0.tar.gz#e15dda82fe2fe8139dc2ac21a36d4ca01d5313c75f99f46c4e8a27709b7294bf" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.13.2" "https://www.python.org/ftp/python/3.13.2/Python-3.13.2.tar.xz#d984bcc57cd67caab26f7def42e523b1c015bbc5dc07836cf4f0b63fa159eb56" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.13.2" "https://www.python.org/ftp/python/3.13.2/Python-3.13.2.tgz#b8d79530e3b7c96a5cb2d40d431ddb512af4a563e863728d8713039aa50203f9" standard verify_py313 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.13.2t b/plugins/python-build/share/python-build/3.13.2t new file mode 100644 index 0000000..af5456b --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.2t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.13.2 diff --git a/plugins/python-build/share/python-build/3.13.3 b/plugins/python-build/share/python-build/3.13.3 new file mode 100644 index 0000000..d37c1ff --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.3 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.4.1" "https://github.com/openssl/openssl/releases/download/openssl-3.4.1/openssl-3.4.1.tar.gz#002a2d6b30b58bf4bea46c43bdd96365aaf8daa6c428782aa4feee06da197df3" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.13.3" "https://www.python.org/ftp/python/3.13.3/Python-3.13.3.tar.xz#40f868bcbdeb8149a3149580bb9bfd407b3321cd48f0be631af955ac92c0e041" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.13.3" "https://www.python.org/ftp/python/3.13.3/Python-3.13.3.tgz#988d735a6d33568cbaff1384a65cb22a1fb18a9ecb73d43ef868000193ce23ed" standard verify_py313 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.13.3t b/plugins/python-build/share/python-build/3.13.3t new file mode 100644 index 0000000..a3bb97b --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.3t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.13.3 diff --git a/plugins/python-build/share/python-build/3.13.4 b/plugins/python-build/share/python-build/3.13.4 new file mode 100644 index 0000000..58aecf3 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.4 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.4.1" "https://github.com/openssl/openssl/releases/download/openssl-3.4.1/openssl-3.4.1.tar.gz#002a2d6b30b58bf4bea46c43bdd96365aaf8daa6c428782aa4feee06da197df3" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.13.4" "https://www.python.org/ftp/python/3.13.4/Python-3.13.4.tar.xz#27b15a797562a2971dce3ffe31bb216042ce0b995b39d768cf15f784cc757365" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.13.4" "https://www.python.org/ftp/python/3.13.4/Python-3.13.4.tgz#2666038f1521b7a8ec34bf2997b363778118d6f3979282c93723e872bcd464e0" standard verify_py313 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.13.4t b/plugins/python-build/share/python-build/3.13.4t new file mode 100644 index 0000000..dc361f8 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.4t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.13.4 diff --git a/plugins/python-build/share/python-build/3.13.5 b/plugins/python-build/share/python-build/3.13.5 new file mode 100644 index 0000000..1eba07f --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.5 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.5.1" "https://github.com/openssl/openssl/releases/download/openssl-3.5.1/openssl-3.5.1.tar.gz#529043b15cffa5f36077a4d0af83f3de399807181d607441d734196d889b641f" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.13.5" "https://www.python.org/ftp/python/3.13.5/Python-3.13.5.tar.xz#93e583f243454e6e9e4588ca2c2662206ad961659863277afcdb96801647d640" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.13.5" "https://www.python.org/ftp/python/3.13.5/Python-3.13.5.tgz#e6190f52699b534ee203d9f417bdbca05a92f23e35c19c691a50ed2942835385" standard verify_py313 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.13.5t b/plugins/python-build/share/python-build/3.13.5t new file mode 100644 index 0000000..19a26d5 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.5t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.13.5 diff --git a/plugins/python-build/share/python-build/3.13.6 b/plugins/python-build/share/python-build/3.13.6 new file mode 100644 index 0000000..580cda5 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.6 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.5.2" "https://github.com/openssl/openssl/releases/download/openssl-3.5.2/openssl-3.5.2.tar.gz#c53a47e5e441c930c3928cf7bf6fb00e5d129b630e0aa873b08258656e7345ec" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.3" "http://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.13.6" "https://www.python.org/ftp/python/3.13.6/Python-3.13.6.tar.xz#17ba5508819d8736a14fbfc47d36e184946a877851b2e9c4b6c43acb44a3b104" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.13.6" "https://www.python.org/ftp/python/3.13.6/Python-3.13.6.tgz#6cf50672cc03928488817d45af24bc927a48f910fe7893d6f388130e59ba98d7" standard verify_py313 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.13.6t b/plugins/python-build/share/python-build/3.13.6t new file mode 100644 index 0000000..ebd946f --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.6t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.13.6 diff --git a/plugins/python-build/share/python-build/3.13.7 b/plugins/python-build/share/python-build/3.13.7 new file mode 100644 index 0000000..38165c1 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.7 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.5.2" "https://github.com/openssl/openssl/releases/download/openssl-3.5.2/openssl-3.5.2.tar.gz#c53a47e5e441c930c3928cf7bf6fb00e5d129b630e0aa873b08258656e7345ec" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.3" "http://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.13.7" "https://www.python.org/ftp/python/3.13.7/Python-3.13.7.tar.xz#5462f9099dfd30e238def83c71d91897d8caa5ff6ebc7a50f14d4802cdaaa79a" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.13.7" "https://www.python.org/ftp/python/3.13.7/Python-3.13.7.tgz#6c9d80839cfa20024f34d9a6dd31ae2a9cd97ff5e980e969209746037a5153b2" standard verify_py313 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.13.7t b/plugins/python-build/share/python-build/3.13.7t new file mode 100644 index 0000000..42c67b0 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.7t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.13.7 diff --git a/plugins/python-build/share/python-build/3.13.8 b/plugins/python-build/share/python-build/3.13.8 new file mode 100644 index 0000000..f0cdd44 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.8 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.6.0" "https://github.com/openssl/openssl/releases/download/openssl-3.6.0/openssl-3.6.0.tar.gz#b6a5f44b7eb69e3fa35dbf15524405b44837a481d43d81daddde3ff21fcbb8e9" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.3" "http://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.13.8" "https://www.python.org/ftp/python/3.13.8/Python-3.13.8.tar.xz#b9910730526b298299b46b35595ced9055722df60c06ad6301f6a4e2c728a252" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.13.8" "https://www.python.org/ftp/python/3.13.8/Python-3.13.8.tgz#06108fe96f4089b7d9e0096cb4ca9c81ddcd5135f779a7de94cf59abcaa4b53f" standard verify_py313 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.13.8t b/plugins/python-build/share/python-build/3.13.8t new file mode 100644 index 0000000..518be93 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.8t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "${BASH_SOURCE[0]%t}" diff --git a/plugins/python-build/share/python-build/3.13.9 b/plugins/python-build/share/python-build/3.13.9 new file mode 100644 index 0000000..f9b3436 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.9 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.6.0" "https://github.com/openssl/openssl/releases/download/openssl-3.6.0/openssl-3.6.0.tar.gz#b6a5f44b7eb69e3fa35dbf15524405b44837a481d43d81daddde3ff21fcbb8e9" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.3" "http://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.13.9" "https://www.python.org/ftp/python/3.13.9/Python-3.13.9.tar.xz#ed5ef34cda36cfa2f3a340f07cac7e7814f91c7f3c411f6d3562323a866c5c66" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.13.9" "https://www.python.org/ftp/python/3.13.9/Python-3.13.9.tgz#c4c066af19c98fb7835d473bebd7e23be84f6e9874d47db9e39a68ee5d0ce35c" standard verify_py313 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.13.9t b/plugins/python-build/share/python-build/3.13.9t new file mode 100644 index 0000000..518be93 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.9t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "${BASH_SOURCE[0]%t}" diff --git a/plugins/python-build/share/python-build/3.13t-dev b/plugins/python-build/share/python-build/3.13t-dev new file mode 100644 index 0000000..cd9d2f0 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13t-dev @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.13-dev diff --git a/plugins/python-build/share/python-build/3.14-dev b/plugins/python-build/share/python-build/3.14-dev new file mode 100644 index 0000000..6fbd840 --- /dev/null +++ b/plugins/python-build/share/python-build/3.14-dev @@ -0,0 +1,8 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +export PYTHON_BUILD_CONFIGURE_WITH_DSYMUTIL=1 +install_package "openssl-3.5.1" "https://www.openssl.org/source/openssl-3.5.1.tar.gz#529043b15cffa5f36077a4d0af83f3de399807181d607441d734196d889b641f" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_git "Python-3.14-dev" "https://github.com/python/cpython" 3.14 standard verify_py314 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/3.14.0 b/plugins/python-build/share/python-build/3.14.0 new file mode 100644 index 0000000..8780899 --- /dev/null +++ b/plugins/python-build/share/python-build/3.14.0 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.6.0" "https://github.com/openssl/openssl/releases/download/openssl-3.6.0/openssl-3.6.0.tar.gz#b6a5f44b7eb69e3fa35dbf15524405b44837a481d43d81daddde3ff21fcbb8e9" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.3" "http://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.14.0" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0.tar.xz#2299dae542d395ce3883aca00d3c910307cd68e0b2f7336098c8e7b7eee9f3e9" standard verify_py314 copy_python_gdb ensurepip +else + install_package "Python-3.14.0" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0.tgz#88d2da4eed42fa9a5f42ff58a8bc8988881bd6c547e297e46682c2687638a851" standard verify_py314 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.14.0t b/plugins/python-build/share/python-build/3.14.0t new file mode 100644 index 0000000..518be93 --- /dev/null +++ b/plugins/python-build/share/python-build/3.14.0t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "${BASH_SOURCE[0]%t}" diff --git a/plugins/python-build/share/python-build/3.14.1 b/plugins/python-build/share/python-build/3.14.1 new file mode 100644 index 0000000..37f2e8c --- /dev/null +++ b/plugins/python-build/share/python-build/3.14.1 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.6.0" "https://github.com/openssl/openssl/releases/download/openssl-3.6.0/openssl-3.6.0.tar.gz#b6a5f44b7eb69e3fa35dbf15524405b44837a481d43d81daddde3ff21fcbb8e9" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.3" "http://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.14.1" "https://www.python.org/ftp/python/3.14.1/Python-3.14.1.tar.xz#8dfa08b1959d9d15838a1c2dab77dc8d8ff4a553a1ed046dfacbc8095c6d42fc" standard verify_py314 copy_python_gdb ensurepip +else + install_package "Python-3.14.1" "https://www.python.org/ftp/python/3.14.1/Python-3.14.1.tgz#8343f001dede23812c7e9c6064f776bade2ef5813f46f0ae4b5a4c10c9069e9a" standard verify_py314 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.14.1t b/plugins/python-build/share/python-build/3.14.1t new file mode 100644 index 0000000..518be93 --- /dev/null +++ b/plugins/python-build/share/python-build/3.14.1t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "${BASH_SOURCE[0]%t}" diff --git a/plugins/python-build/share/python-build/3.14.2 b/plugins/python-build/share/python-build/3.14.2 new file mode 100644 index 0000000..39a6379 --- /dev/null +++ b/plugins/python-build/share/python-build/3.14.2 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.6.0" "https://github.com/openssl/openssl/releases/download/openssl-3.6.0/openssl-3.6.0.tar.gz#b6a5f44b7eb69e3fa35dbf15524405b44837a481d43d81daddde3ff21fcbb8e9" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.3" "http://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.14.2" "https://www.python.org/ftp/python/3.14.2/Python-3.14.2.tar.xz#ce543ab854bc256b61b71e9b27f831ffd1bfd60a479d639f8be7f9757cf573e9" standard verify_py314 copy_python_gdb ensurepip +else + install_package "Python-3.14.2" "https://www.python.org/ftp/python/3.14.2/Python-3.14.2.tgz#c609e078adab90e2c6bacb6afafacd5eaf60cd94cf670f1e159565725fcd448d" standard verify_py314 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.14.3 b/plugins/python-build/share/python-build/3.14.3 new file mode 100644 index 0000000..b62e224 --- /dev/null +++ b/plugins/python-build/share/python-build/3.14.3 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.6.1" "https://github.com/openssl/openssl/releases/download/openssl-3.6.1/openssl-3.6.1.tar.gz#b1bfedcd5b289ff22aee87c9d600f515767ebf45f77168cb6d64f231f518a82e" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.3" "https://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.14.3" "https://www.python.org/ftp/python/3.14.3/Python-3.14.3.tar.xz#a97d5549e9ad81fe17159ed02c68774ad5d266c72f8d9a0b5a9c371fe85d902b" standard verify_py314 copy_python_gdb ensurepip +else + install_package "Python-3.14.3" "https://www.python.org/ftp/python/3.14.3/Python-3.14.3.tgz#d7fe130d0501ae047ca318fa92aa642603ab6f217901015a1df6ce650d5470cd" standard verify_py314 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.14.3t b/plugins/python-build/share/python-build/3.14.3t new file mode 100644 index 0000000..518be93 --- /dev/null +++ b/plugins/python-build/share/python-build/3.14.3t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "${BASH_SOURCE[0]%t}" diff --git a/plugins/python-build/share/python-build/3.14.4 b/plugins/python-build/share/python-build/3.14.4 new file mode 100644 index 0000000..b0f1e59 --- /dev/null +++ b/plugins/python-build/share/python-build/3.14.4 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.6.2" "https://github.com/openssl/openssl/releases/download/openssl-3.6.2/openssl-3.6.2.tar.gz#aaf51a1fe064384f811daeaeb4ec4dce7340ec8bd893027eee676af31e83a04f" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.3" "https://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.14.4" "https://www.python.org/ftp/python/3.14.4/Python-3.14.4.tar.xz#d923c51303e38e249136fc1bdf3568d56ecb03214efdef48516176d3d7faaef8" standard verify_py314 copy_python_gdb ensurepip +else + install_package "Python-3.14.4" "https://www.python.org/ftp/python/3.14.4/Python-3.14.4.tgz#b4c059d5895f030e7df9663894ce3732bfa1b32cd3ab2883980266a45ce3cb3b" standard verify_py314 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.14.4t b/plugins/python-build/share/python-build/3.14.4t new file mode 100644 index 0000000..518be93 --- /dev/null +++ b/plugins/python-build/share/python-build/3.14.4t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "${BASH_SOURCE[0]%t}" diff --git a/plugins/python-build/share/python-build/3.14.5 b/plugins/python-build/share/python-build/3.14.5 new file mode 100644 index 0000000..7d93423 --- /dev/null +++ b/plugins/python-build/share/python-build/3.14.5 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.6.2" "https://github.com/openssl/openssl/releases/download/openssl-3.6.2/openssl-3.6.2.tar.gz#aaf51a1fe064384f811daeaeb4ec4dce7340ec8bd893027eee676af31e83a04f" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.3" "https://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.14.5" "https://www.python.org/ftp/python/3.14.5/Python-3.14.5.tar.xz#7e32597b99e5d9a39abed35de4693fa169df3e5850d4c334337ffd6a19a36db6" standard verify_py314 copy_python_gdb ensurepip +else + install_package "Python-3.14.5" "https://www.python.org/ftp/python/3.14.5/Python-3.14.5.tgz#9c22bfe9939a6c5418fc74b289a5f1cc41859ae82ac6b163016b5844bd0a86bc" standard verify_py314 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.14.5t b/plugins/python-build/share/python-build/3.14.5t new file mode 100644 index 0000000..518be93 --- /dev/null +++ b/plugins/python-build/share/python-build/3.14.5t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "${BASH_SOURCE[0]%t}" diff --git a/plugins/python-build/share/python-build/3.14t-dev b/plugins/python-build/share/python-build/3.14t-dev new file mode 100644 index 0000000..7c6180f --- /dev/null +++ b/plugins/python-build/share/python-build/3.14t-dev @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.14-dev diff --git a/plugins/python-build/share/python-build/3.15-dev b/plugins/python-build/share/python-build/3.15-dev new file mode 100644 index 0000000..5891391 --- /dev/null +++ b/plugins/python-build/share/python-build/3.15-dev @@ -0,0 +1,8 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +export PYTHON_BUILD_CONFIGURE_WITH_DSYMUTIL=1 +install_package "openssl-3.6.0" "https://github.com/openssl/openssl/releases/download/openssl-3.6.0/openssl-3.6.0.tar.gz#b6a5f44b7eb69e3fa35dbf15524405b44837a481d43d81daddde3ff21fcbb8e9" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.3" "https://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline +install_git "Python-3.15-dev" "https://github.com/python/cpython" 3.15 standard verify_py315 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/3.15.0b1 b/plugins/python-build/share/python-build/3.15.0b1 new file mode 100644 index 0000000..24ab70c --- /dev/null +++ b/plugins/python-build/share/python-build/3.15.0b1 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.6.2" "https://github.com/openssl/openssl/releases/download/openssl-3.6.2/openssl-3.6.2.tar.gz#aaf51a1fe064384f811daeaeb4ec4dce7340ec8bd893027eee676af31e83a04f" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.3" "https://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.15.0b1" "https://www.python.org/ftp/python/3.15.0/Python-3.15.0b1.tar.xz#d4d52ccfa1d727ef5235fbb7d70fa1dbacf10b8b3760db622875da05acbe437c" standard verify_py315 copy_python_gdb ensurepip +else + install_package "Python-3.15.0b1" "https://www.python.org/ftp/python/3.15.0/Python-3.15.0b1.tgz#9b41271890067875db7f0f5cb2fdcb944b90c473f272a18a13b93c059d84c68e" standard verify_py315 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.15.0b1t b/plugins/python-build/share/python-build/3.15.0b1t new file mode 100644 index 0000000..518be93 --- /dev/null +++ b/plugins/python-build/share/python-build/3.15.0b1t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "${BASH_SOURCE[0]%t}" diff --git a/plugins/python-build/share/python-build/3.15t-dev b/plugins/python-build/share/python-build/3.15t-dev new file mode 100644 index 0000000..f86423c --- /dev/null +++ b/plugins/python-build/share/python-build/3.15t-dev @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.15-dev diff --git a/plugins/python-build/share/python-build/3.16-dev b/plugins/python-build/share/python-build/3.16-dev new file mode 100644 index 0000000..a7c6cc7 --- /dev/null +++ b/plugins/python-build/share/python-build/3.16-dev @@ -0,0 +1,8 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +export PYTHON_BUILD_CONFIGURE_WITH_DSYMUTIL=1 +install_package "openssl-3.6.0" "https://github.com/openssl/openssl/releases/download/openssl-3.6.0/openssl-3.6.0.tar.gz#b6a5f44b7eb69e3fa35dbf15524405b44837a481d43d81daddde3ff21fcbb8e9" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.3" "https://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline +install_git "Python-3.16-dev" "https://github.com/python/cpython" main standard verify_py316 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/3.16t-dev b/plugins/python-build/share/python-build/3.16t-dev new file mode 100644 index 0000000..0e5159d --- /dev/null +++ b/plugins/python-build/share/python-build/3.16t-dev @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.16-dev diff --git a/plugins/python-build/share/python-build/3.2.0 b/plugins/python-build/share/python-build/3.2.0 new file mode 100644 index 0000000..b3877d3 --- /dev/null +++ b/plugins/python-build/share/python-build/3.2.0 @@ -0,0 +1,5 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-3.2" "https://www.python.org/ftp/python/3.2/Python-3.2.tgz#27b35bfcbbf01de9564c0265d72b58ba3ff3d56df0615765372f2aa09dc20da9" standard verify_py32 +install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python +install_package "pip-7.1.2" "https://pypi.python.org/packages/source/p/pip/pip-7.1.2.tar.gz#ca047986f0528cfa975a14fb9f7f106271d4e0c3fe1ddced6c1db2e7ae57a477" python diff --git a/plugins/python-build/share/python-build/3.2.1 b/plugins/python-build/share/python-build/3.2.1 new file mode 100644 index 0000000..9296b98 --- /dev/null +++ b/plugins/python-build/share/python-build/3.2.1 @@ -0,0 +1,5 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-3.2.1" "https://www.python.org/ftp/python/3.2.1/Python-3.2.1.tgz#7cff29d984696d9fe8c7bea54da5b9ad36acef33ff5cf0d3e37e4d12fb21c572" standard verify_py32 +install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python +install_package "pip-7.1.2" "https://pypi.python.org/packages/source/p/pip/pip-7.1.2.tar.gz#ca047986f0528cfa975a14fb9f7f106271d4e0c3fe1ddced6c1db2e7ae57a477" python diff --git a/plugins/python-build/share/python-build/3.2.2 b/plugins/python-build/share/python-build/3.2.2 new file mode 100644 index 0000000..554eb47 --- /dev/null +++ b/plugins/python-build/share/python-build/3.2.2 @@ -0,0 +1,5 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-3.2.2" "https://www.python.org/ftp/python/3.2.2/Python-3.2.2.tgz#acc6a13cb4fed0b7e86716324a8437e326645b8076177eede5a0cad99ec0313c" standard verify_py32 +install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python +install_package "pip-7.1.2" "https://pypi.python.org/packages/source/p/pip/pip-7.1.2.tar.gz#ca047986f0528cfa975a14fb9f7f106271d4e0c3fe1ddced6c1db2e7ae57a477" python diff --git a/plugins/python-build/share/python-build/3.2.3 b/plugins/python-build/share/python-build/3.2.3 new file mode 100644 index 0000000..9b5e4e0 --- /dev/null +++ b/plugins/python-build/share/python-build/3.2.3 @@ -0,0 +1,5 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-3.2.3" "https://www.python.org/ftp/python/3.2.3/Python-3.2.3.tgz#74c33e165edef7532cef95fd9a325a06878b5bfc8a5d038161573f283eaf9809" standard verify_py32 +install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python +install_package "pip-7.1.2" "https://pypi.python.org/packages/source/p/pip/pip-7.1.2.tar.gz#ca047986f0528cfa975a14fb9f7f106271d4e0c3fe1ddced6c1db2e7ae57a477" python diff --git a/plugins/python-build/share/python-build/3.2.4 b/plugins/python-build/share/python-build/3.2.4 new file mode 100644 index 0000000..12d76bb --- /dev/null +++ b/plugins/python-build/share/python-build/3.2.4 @@ -0,0 +1,5 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-3.2.4" "https://www.python.org/ftp/python/3.2.4/Python-3.2.4.tgz#71c3139908ccc1c544ba1e331a3c22b3f1c09f562438a054fd6f4e2628de8b9a" standard verify_py32 +install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python +install_package "pip-7.1.2" "https://pypi.python.org/packages/source/p/pip/pip-7.1.2.tar.gz#ca047986f0528cfa975a14fb9f7f106271d4e0c3fe1ddced6c1db2e7ae57a477" python diff --git a/plugins/python-build/share/python-build/3.2.5 b/plugins/python-build/share/python-build/3.2.5 new file mode 100644 index 0000000..aad4f68 --- /dev/null +++ b/plugins/python-build/share/python-build/3.2.5 @@ -0,0 +1,5 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-3.2.5" "https://www.python.org/ftp/python/3.2.5/Python-3.2.5.tgz#5eae0ab92a0bb9e3a1bf9c7cd046bc3de58996b049bd894d095978b6b085099f" standard verify_py32 +install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python +install_package "pip-7.1.2" "https://pypi.python.org/packages/source/p/pip/pip-7.1.2.tar.gz#ca047986f0528cfa975a14fb9f7f106271d4e0c3fe1ddced6c1db2e7ae57a477" python diff --git a/plugins/python-build/share/python-build/3.2.6 b/plugins/python-build/share/python-build/3.2.6 new file mode 100644 index 0000000..b396084 --- /dev/null +++ b/plugins/python-build/share/python-build/3.2.6 @@ -0,0 +1,9 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.2.6" "https://www.python.org/ftp/python/3.2.6/Python-3.2.6.tar.xz#1d12b501819fd26afafbf8459be1aa279b56f032b4c15412de0a713ce0de7bdc" standard verify_py32 +else + install_package "Python-3.2.6" "https://www.python.org/ftp/python/3.2.6/Python-3.2.6.tgz#fc1e41296e29d476f696303acae293ae7a2310f0f9d0d637905e722a3f16163e" standard verify_py32 +fi +install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python +install_package "pip-7.1.2" "https://pypi.python.org/packages/source/p/pip/pip-7.1.2.tar.gz#ca047986f0528cfa975a14fb9f7f106271d4e0c3fe1ddced6c1db2e7ae57a477" python diff --git a/plugins/python-build/share/python-build/3.3.0 b/plugins/python-build/share/python-build/3.3.0 new file mode 100644 index 0000000..544d841 --- /dev/null +++ b/plugins/python-build/share/python-build/3.3.0 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-3.3.0" "https://www.python.org/ftp/python/3.3.0/Python-3.3.0.tgz#cfe531eaace2503e13a74addc7f4a89482e99f8b8fca51b469ae5c83f450604e" standard verify_py33 ensurepip diff --git a/plugins/python-build/share/python-build/3.3.1 b/plugins/python-build/share/python-build/3.3.1 new file mode 100644 index 0000000..177f7c1 --- /dev/null +++ b/plugins/python-build/share/python-build/3.3.1 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-3.3.1" "https://www.python.org/ftp/python/3.3.1/Python-3.3.1.tgz#671dc3632f311e63c6733703aa0a1ad90c99277ddc8299d39e487718a50319bd" standard verify_py33 ensurepip diff --git a/plugins/python-build/share/python-build/3.3.2 b/plugins/python-build/share/python-build/3.3.2 new file mode 100644 index 0000000..bce9394 --- /dev/null +++ b/plugins/python-build/share/python-build/3.3.2 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-3.3.2" "https://www.python.org/ftp/python/3.3.2/Python-3.3.2.tgz#de664fca3b8e0ab20fb42bfed1a36e26f116f1853e88ada12dbc938761036172" standard verify_py33 ensurepip diff --git a/plugins/python-build/share/python-build/3.3.3 b/plugins/python-build/share/python-build/3.3.3 new file mode 100644 index 0000000..6b7010d --- /dev/null +++ b/plugins/python-build/share/python-build/3.3.3 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-3.3.3" "https://www.python.org/ftp/python/3.3.3/Python-3.3.3.tgz#30b60839bfe0ae8a2dba11e909328459bb8ee4a258afe7494b06b2ceda080efc" standard verify_py33 ensurepip diff --git a/plugins/python-build/share/python-build/3.3.4 b/plugins/python-build/share/python-build/3.3.4 new file mode 100644 index 0000000..966a808 --- /dev/null +++ b/plugins/python-build/share/python-build/3.3.4 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-3.3.4" "https://www.python.org/ftp/python/3.3.4/Python-3.3.4.tgz#ea055db9dd004a6ecd7690abc9734573763686dd768122316bae2dfd026412af" standard verify_py33 ensurepip diff --git a/plugins/python-build/share/python-build/3.3.5 b/plugins/python-build/share/python-build/3.3.5 new file mode 100644 index 0000000..9505669 --- /dev/null +++ b/plugins/python-build/share/python-build/3.3.5 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "Python-3.3.5" "https://www.python.org/ftp/python/3.3.5/Python-3.3.5.tgz#916bc57dd8524dc27429bebae7b39d6942742cf9699b875b2b496a3d960c7168" standard verify_py33 ensurepip diff --git a/plugins/python-build/share/python-build/3.3.6 b/plugins/python-build/share/python-build/3.3.6 new file mode 100644 index 0000000..9e0ebb1 --- /dev/null +++ b/plugins/python-build/share/python-build/3.3.6 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.3.6" "https://www.python.org/ftp/python/3.3.6/Python-3.3.6.tar.xz#5226e4bf7a530c3ff2bcde0c94e0e09e59a8bcde0114fe0268bc925bdabb5d3f" standard verify_py33 ensurepip +else + install_package "Python-3.3.6" "https://www.python.org/ftp/python/3.3.6/Python-3.3.6.tgz#0a58ad1f1def4ecc90b18b0c410a3a0e1a48cf7692c75d1f83d0af080e5d2034" standard verify_py33 ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.3.7 b/plugins/python-build/share/python-build/3.3.7 new file mode 100644 index 0000000..7ed1477 --- /dev/null +++ b/plugins/python-build/share/python-build/3.3.7 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.3.7" "https://www.python.org/ftp/python/3.3.7/Python-3.3.7.tar.xz#85f60c327501c36bc18c33370c14d472801e6af2f901dafbba056f61685429fe" standard verify_py33 ensurepip +else + install_package "Python-3.3.7" "https://www.python.org/ftp/python/3.3.7/Python-3.3.7.tgz#992461a9598e85a45323512d4e60fa6c1d5aaef0956bf9db98733cc5aa9b05e1" standard verify_py33 ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.4-dev b/plugins/python-build/share/python-build/3.4-dev new file mode 100644 index 0000000..1965cc2 --- /dev/null +++ b/plugins/python-build/share/python-build/3.4-dev @@ -0,0 +1,4 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_git "Python-3.4-dev" "https://github.com/python/cpython" "3.4" standard verify_py34 ensurepip diff --git a/plugins/python-build/share/python-build/3.4.0 b/plugins/python-build/share/python-build/3.4.0 new file mode 100644 index 0000000..64efa3e --- /dev/null +++ b/plugins/python-build/share/python-build/3.4.0 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.4.0" "https://www.python.org/ftp/python/3.4.0/Python-3.4.0.tar.xz#f13686c0a2d45e7146759e9d5d1cbd8097a0606483c0cf7730e1e13f58b14cbe" standard verify_py34 ensurepip +else + install_package "Python-3.4.0" "https://www.python.org/ftp/python/3.4.0/Python-3.4.0.tgz#d2c83ea0217769a73e8b1ee33ffbca814903f8568e30f8d13e68e3d1f743449c" standard verify_py34 ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.4.1 b/plugins/python-build/share/python-build/3.4.1 new file mode 100644 index 0000000..e69c40a --- /dev/null +++ b/plugins/python-build/share/python-build/3.4.1 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.4.1" "https://www.python.org/ftp/python/3.4.1/Python-3.4.1.tar.xz#c595a163104399041fcbe1c5c04db4c1da94f917b82ce89e8944c8edff7aedc4" standard verify_py34 ensurepip +else + install_package "Python-3.4.1" "https://www.python.org/ftp/python/3.4.1/Python-3.4.1.tgz#8d007e3ef80b128a292be101201e75dec5480e5632e994771e7c231d17720b66" standard verify_py34 ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.4.10 b/plugins/python-build/share/python-build/3.4.10 new file mode 100644 index 0000000..4ee2a25 --- /dev/null +++ b/plugins/python-build/share/python-build/3.4.10 @@ -0,0 +1,6 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +has_tar_xz_support \ + && src="https://www.python.org/ftp/python/3.4.10/Python-3.4.10.tar.xz#d46a8f6fe91679e199c671b1b0a30aaf172d2acb5bcab25beb35f16c3d195b4e" \ + || src="https://www.python.org/ftp/python/3.4.10/Python-3.4.10.tgz#217757699249ab432571b381386d441e12b433100ab5f908051fcb7cced2539d" +install_package "Python-3.4.10" "$src" standard verify_py34 ensurepip diff --git a/plugins/python-build/share/python-build/3.4.2 b/plugins/python-build/share/python-build/3.4.2 new file mode 100644 index 0000000..c02ce30 --- /dev/null +++ b/plugins/python-build/share/python-build/3.4.2 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.4.2" "https://www.python.org/ftp/python/3.4.2/Python-3.4.2.tar.xz#1c6d9682d145c056537e477bbfa060ce727f9edd38df1827e0f970dcf04b2def" standard verify_py34 ensurepip +else + install_package "Python-3.4.2" "https://www.python.org/ftp/python/3.4.2/Python-3.4.2.tgz#44a3c1ef1c7ca3e4fd25242af80ed72da941203cb4ed1a8c1b724d9078965dd8" standard verify_py34 ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.4.3 b/plugins/python-build/share/python-build/3.4.3 new file mode 100644 index 0000000..138b052 --- /dev/null +++ b/plugins/python-build/share/python-build/3.4.3 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.4.3" "https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tar.xz#b5b3963533768d5fc325a4d7a6bd6f666726002d696f1d399ec06b043ea996b8" standard verify_py34 ensurepip +else + install_package "Python-3.4.3" "https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz#8b743f56e9e50bf0923b9e9c45dd927c071d7aa56cd46569d8818add8cf01147" standard verify_py34 ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.4.4 b/plugins/python-build/share/python-build/3.4.4 new file mode 100644 index 0000000..2a814ce --- /dev/null +++ b/plugins/python-build/share/python-build/3.4.4 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.4.4" "https://www.python.org/ftp/python/3.4.4/Python-3.4.4.tar.xz#a797d3820155ec6cb654a652b9acfb11792d4e7d568eef1f9199009e042b6ba2" standard verify_py34 ensurepip +else + install_package "Python-3.4.4" "https://www.python.org/ftp/python/3.4.4/Python-3.4.4.tgz#bc93e944025816ec360712b4c42d8d5f729eaed2b26585e9bc8844f93f0c382e" standard verify_py34 ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.4.5 b/plugins/python-build/share/python-build/3.4.5 new file mode 100644 index 0000000..8d887ad --- /dev/null +++ b/plugins/python-build/share/python-build/3.4.5 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.4.5" "https://www.python.org/ftp/python/3.4.5/Python-3.4.5.tar.xz#ee64b1c8a47461009abf25252332d29a4e587cb4f0c1c96aa793a3732e9d898a" standard verify_py34 ensurepip +else + install_package "Python-3.4.5" "https://www.python.org/ftp/python/3.4.5/Python-3.4.5.tgz#997aca4dd8692f3c954658a3db11c1d0862bcbf8eadd6a164746eb33d317c034" standard verify_py34 ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.4.6 b/plugins/python-build/share/python-build/3.4.6 new file mode 100644 index 0000000..5c5c337 --- /dev/null +++ b/plugins/python-build/share/python-build/3.4.6 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.4.6" "https://www.python.org/ftp/python/3.4.6/Python-3.4.6.tar.xz#f13428bbe6aa9e3b9b6499502dc488c26096349ed7a21f7a0c1db90911115f40" standard verify_py34 ensurepip +else + install_package "Python-3.4.6" "https://www.python.org/ftp/python/3.4.6/Python-3.4.6.tgz#fe59daced99549d1d452727c050ae486169e9716a890cffb0d468b376d916b48" standard verify_py34 ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.4.7 b/plugins/python-build/share/python-build/3.4.7 new file mode 100644 index 0000000..42032cc --- /dev/null +++ b/plugins/python-build/share/python-build/3.4.7 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.4.7" "https://www.python.org/ftp/python/3.4.7/Python-3.4.7.tar.xz#8714cf2b56dd36922dec8fa184d4936e1001c22fb439798cb73dda069e129d1b" standard verify_py34 ensurepip +else + install_package "Python-3.4.7" "https://www.python.org/ftp/python/3.4.7/Python-3.4.7.tgz#1614734847fd07e2a1ab1c65ae841db2433f8b845f49b34b7b5cabcb1c3f491f" standard verify_py34 ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.4.8 b/plugins/python-build/share/python-build/3.4.8 new file mode 100644 index 0000000..69b69c3 --- /dev/null +++ b/plugins/python-build/share/python-build/3.4.8 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.4.8" "https://www.python.org/ftp/python/3.4.8/Python-3.4.8.tar.xz#29a472fa902c7b2add152f5e1e82e0885a8d360645689c1db5d1949a7e8ac3ea" standard verify_py34 ensurepip +else + install_package "Python-3.4.8" "https://www.python.org/ftp/python/3.4.8/Python-3.4.8.tgz#8b1a1ce043e132082d29a5d09f2841f193c77b631282a82f98895a5dbaba1639" standard verify_py34 ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.4.9 b/plugins/python-build/share/python-build/3.4.9 new file mode 100644 index 0000000..1718c73 --- /dev/null +++ b/plugins/python-build/share/python-build/3.4.9 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.4.9" "https://www.python.org/ftp/python/3.4.9/Python-3.4.9.tar.xz#59629676ba2b01a798f5211d8f63c26ee52f1d5133cf37583e0bf1bad50c2bd9" standard verify_py34 ensurepip +else + install_package "Python-3.4.9" "https://www.python.org/ftp/python/3.4.9/Python-3.4.9.tgz#e02e565372750a6678efe35ddecbe5ccd5330a8a2e8bbe38d3060713492e3dab" standard verify_py34 ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.5-dev b/plugins/python-build/share/python-build/3.5-dev new file mode 100644 index 0000000..212f0f4 --- /dev/null +++ b/plugins/python-build/share/python-build/3.5-dev @@ -0,0 +1,4 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_git "Python-3.5-dev" "https://github.com/python/cpython" "3.5" standard verify_py35 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/3.5.0 b/plugins/python-build/share/python-build/3.5.0 new file mode 100644 index 0000000..3eda1df --- /dev/null +++ b/plugins/python-build/share/python-build/3.5.0 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.5.0" "https://www.python.org/ftp/python/3.5.0/Python-3.5.0.tar.xz#d6d7aa1634a5eeeca6ed4fca266982a04f84bd8f3945a9179e20b24ad2e2be91" standard verify_py35 copy_python_gdb ensurepip +else + install_package "Python-3.5.0" "https://www.python.org/ftp/python/3.5.0/Python-3.5.0.tgz#584e3d5a02692ca52fce505e68ecd77248a6f2c99adf9db144a39087336b0fe0" standard verify_py35 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.5.1 b/plugins/python-build/share/python-build/3.5.1 new file mode 100644 index 0000000..ef4817a --- /dev/null +++ b/plugins/python-build/share/python-build/3.5.1 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.5.1" "https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tar.xz#c6d57c0c366d9060ab6c0cdf889ebf3d92711d466cc0119c441dbf2746f725c9" standard verify_py35 copy_python_gdb ensurepip +else + install_package "Python-3.5.1" "https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz#687e067d9f391da645423c7eda8205bae9d35edc0c76ef5218dcbe4cc770d0d7" standard verify_py35 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.5.10 b/plugins/python-build/share/python-build/3.5.10 new file mode 100644 index 0000000..1c6c8e3 --- /dev/null +++ b/plugins/python-build/share/python-build/3.5.10 @@ -0,0 +1,8 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.5.10" "https://www.python.org/ftp/python/3.5.10/Python-3.5.10.tar.xz#0f0fa8685c1dc1f1dacb0b4e7779796b90aef99dc1fa4967a71b9da7b57d4a28" standard verify_py35 ensurepip +else + install_package "Python-3.5.10" "https://www.python.org/ftp/python/3.5.10/Python-3.5.10.tgz#3496a0daf51913718a6f10e3eda51fa43634cb6151cb096f312d48bdbeff7d3a" standard verify_py35 ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.5.2 b/plugins/python-build/share/python-build/3.5.2 new file mode 100644 index 0000000..b0f47c7 --- /dev/null +++ b/plugins/python-build/share/python-build/3.5.2 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.5.2" "https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tar.xz#0010f56100b9b74259ebcd5d4b295a32324b58b517403a10d1a2aa7cb22bca40" standard verify_py35 copy_python_gdb ensurepip +else + install_package "Python-3.5.2" "https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz#1524b840e42cf3b909e8f8df67c1724012c7dc7f9d076d4feef2d3eff031e8a0" standard verify_py35 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.5.3 b/plugins/python-build/share/python-build/3.5.3 new file mode 100644 index 0000000..a255469 --- /dev/null +++ b/plugins/python-build/share/python-build/3.5.3 @@ -0,0 +1,8 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.5.3" "https://www.python.org/ftp/python/3.5.3/Python-3.5.3.tar.xz#eefe2ad6575855423ab630f5b51a8ef6e5556f774584c06beab4926f930ddbb0" standard verify_py35 copy_python_gdb ensurepip +else + install_package "Python-3.5.3" "https://www.python.org/ftp/python/3.5.3/Python-3.5.3.tgz#d8890b84d773cd7059e597dbefa510340de8336ec9b9e9032bf030f19291565a" standard verify_py35 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.5.4 b/plugins/python-build/share/python-build/3.5.4 new file mode 100644 index 0000000..5b88188 --- /dev/null +++ b/plugins/python-build/share/python-build/3.5.4 @@ -0,0 +1,8 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.5.4" "https://www.python.org/ftp/python/3.5.4/Python-3.5.4.tar.xz#94d93bfabb3b109f8a10365a325f920f9ec98c6e2380bf228f9700a14054c84c" standard verify_py35 copy_python_gdb ensurepip +else + install_package "Python-3.5.4" "https://www.python.org/ftp/python/3.5.4/Python-3.5.4.tgz#6ed87a8b6c758cc3299a8b433e8a9a9122054ad5bc8aad43299cff3a53d8ca44" standard verify_py35 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.5.5 b/plugins/python-build/share/python-build/3.5.5 new file mode 100644 index 0000000..22dbb3d --- /dev/null +++ b/plugins/python-build/share/python-build/3.5.5 @@ -0,0 +1,8 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.5.5" "https://www.python.org/ftp/python/3.5.5/Python-3.5.5.tar.xz#063d2c3b0402d6191b90731e0f735c64830e7522348aeb7ed382a83165d45009" standard verify_py35 copy_python_gdb ensurepip +else + install_package "Python-3.5.5" "https://www.python.org/ftp/python/3.5.5/Python-3.5.5.tgz#2f988db33913dcef17552fd1447b41afb89dbc26e3cdfc068ea6c62013a3a2a5" standard verify_py35 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.5.6 b/plugins/python-build/share/python-build/3.5.6 new file mode 100644 index 0000000..0d4c15f --- /dev/null +++ b/plugins/python-build/share/python-build/3.5.6 @@ -0,0 +1,8 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.5.6" "https://www.python.org/ftp/python/3.5.6/Python-3.5.6.tar.xz#f55cde04f521f273c7cba08912921cc5642cfc15ca7b22d5829f0aff4371155f" standard verify_py35 copy_python_gdb ensurepip +else + install_package "Python-3.5.6" "https://www.python.org/ftp/python/3.5.6/Python-3.5.6.tgz#30d2ff093988e74283e1abfee823292c6b59590796b9827e95ba4940b27d26f8" standard verify_py35 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.5.7 b/plugins/python-build/share/python-build/3.5.7 new file mode 100644 index 0000000..6bfb0fe --- /dev/null +++ b/plugins/python-build/share/python-build/3.5.7 @@ -0,0 +1,8 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.5.7" "https://www.python.org/ftp/python/3.5.7/Python-3.5.7.tar.xz#285892899bf4d5737fd08482aa6171c6b2564a45b9102dfacfb72826aebdc7dc" standard verify_py35 ensurepip +else + install_package "Python-3.5.7" "https://www.python.org/ftp/python/3.5.7/Python-3.5.7.tgz#542d94920a2a06a471a73b51614805ad65366af98145b0369bc374cf248b521b" standard verify_py35 ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.5.8 b/plugins/python-build/share/python-build/3.5.8 new file mode 100644 index 0000000..4a4ce51 --- /dev/null +++ b/plugins/python-build/share/python-build/3.5.8 @@ -0,0 +1,8 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.5.8" "https://www.python.org/ftp/python/3.5.8/Python-3.5.8.tar.xz#55a345c78ee3afbc2e60678442aad7bcc384ddea5bb95f8d66edc4868d4847d4" standard verify_py35 ensurepip +else + install_package "Python-3.5.8" "https://www.python.org/ftp/python/3.5.8/Python-3.5.8.tgz#18c88dfd260147bc7247e6356010e5d4916dfbfc480f6434917f88e61228177a" standard verify_py35 ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.5.9 b/plugins/python-build/share/python-build/3.5.9 new file mode 100644 index 0000000..a9d8858 --- /dev/null +++ b/plugins/python-build/share/python-build/3.5.9 @@ -0,0 +1,8 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.5.9" "https://www.python.org/ftp/python/3.5.9/Python-3.5.9.tar.xz#c24a37c63a67f53bdd09c5f287b5cff8e8b98f857bf348c577d454d3f74db049" standard verify_py35 ensurepip +else + install_package "Python-3.5.9" "https://www.python.org/ftp/python/3.5.9/Python-3.5.9.tgz#67a1d4fc6e4540d6a092cadc488e533afa961b3c9becc74dc3d6b55cb56e0cc1" standard verify_py35 ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.6-dev b/plugins/python-build/share/python-build/3.6-dev new file mode 100644 index 0000000..cc56e47 --- /dev/null +++ b/plugins/python-build/share/python-build/3.6-dev @@ -0,0 +1,4 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_git "Python-3.6-dev" "https://github.com/python/cpython" "3.6" standard verify_py36 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/3.6.0 b/plugins/python-build/share/python-build/3.6.0 new file mode 100644 index 0000000..d267359 --- /dev/null +++ b/plugins/python-build/share/python-build/3.6.0 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.6.0" "https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz#b0c5f904f685e32d9232f7bdcbece9819a892929063b6e385414ad2dd6a23622" standard verify_py36 copy_python_gdb ensurepip +else + install_package "Python-3.6.0" "https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz#aa472515800d25a3739833f76ca3735d9f4b2fe77c3cb21f69275e0cce30cb2b" standard verify_py36 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.6.1 b/plugins/python-build/share/python-build/3.6.1 new file mode 100644 index 0000000..577de98 --- /dev/null +++ b/plugins/python-build/share/python-build/3.6.1 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.6.1" "https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz#a01810ddfcec216bcdb357a84bfaafdfaa0ca42bbdaa4cb7ff74f5a9961e4041" standard verify_py36 copy_python_gdb ensurepip +else + install_package "Python-3.6.1" "https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz#aa50b0143df7c89ce91be020fe41382613a817354b33acdc6641b44f8ced3828" standard verify_py36 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.6.10 b/plugins/python-build/share/python-build/3.6.10 new file mode 100644 index 0000000..b391eb0 --- /dev/null +++ b/plugins/python-build/share/python-build/3.6.10 @@ -0,0 +1,8 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.6.10" "https://www.python.org/ftp/python/3.6.10/Python-3.6.10.tar.xz#0a833c398ac8cd7c5538f7232d8531afef943c60495c504484f308dac3af40de" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.6.10" "https://www.python.org/ftp/python/3.6.10/Python-3.6.10.tgz#7034dd7cba98d4f94c74f9edd7345bac71c8814c41672c64d9044fa2f96f334d" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.6.11 b/plugins/python-build/share/python-build/3.6.11 new file mode 100644 index 0000000..1aa47f8 --- /dev/null +++ b/plugins/python-build/share/python-build/3.6.11 @@ -0,0 +1,8 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.6.11" "https://www.python.org/ftp/python/3.6.11/Python-3.6.11.tar.xz#741ebdcbc4e3937a5ff23517dd455ebf7d543ea9fef6f5cf6f46e575d6c4fda4" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.6.11" "https://www.python.org/ftp/python/3.6.11/Python-3.6.11.tgz#96621902f89746fffc22f39749c07da7c2917b232e72352e6837d41850f7b90c" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.6.12 b/plugins/python-build/share/python-build/3.6.12 new file mode 100644 index 0000000..d8c8894 --- /dev/null +++ b/plugins/python-build/share/python-build/3.6.12 @@ -0,0 +1,8 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.6.12" "https://www.python.org/ftp/python/3.6.12/Python-3.6.12.tar.xz#70953a9b5d6891d92e65d184c3512126a15814bee15e1eff2ddcce04334e9a99" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.6.12" "https://www.python.org/ftp/python/3.6.12/Python-3.6.12.tgz#12dddbe52385a0f702fb8071e12dcc6b3cb2dde07cd8db3ed60e90d90ab78693" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.6.13 b/plugins/python-build/share/python-build/3.6.13 new file mode 100644 index 0000000..660c180 --- /dev/null +++ b/plugins/python-build/share/python-build/3.6.13 @@ -0,0 +1,8 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.6.13" "https://www.python.org/ftp/python/3.6.13/Python-3.6.13.tar.xz#a47a43a53abb42286a2c11965343ff56711b9e64e8d11bf2c6701a4fb8ce1a0f" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.6.13" "https://www.python.org/ftp/python/3.6.13/Python-3.6.13.tgz#614950d3d54f6e78dac651b49c64cfe2ceefea5af3aff3371a9e4b27a53b2669" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.6.14 b/plugins/python-build/share/python-build/3.6.14 new file mode 100644 index 0000000..8e04a67 --- /dev/null +++ b/plugins/python-build/share/python-build/3.6.14 @@ -0,0 +1,8 @@ +prefer_openssl11 +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.6.14" "https://www.python.org/ftp/python/3.6.14/Python-3.6.14.tar.xz#2663a7a0cfbd00fc76269dce4317db0b54be53c0f4d705aabb32b87efa02d5ae" standard verify_py36 copy_python_gdb ensurepip +else + install_package "Python-3.6.14" "https://www.python.org/ftp/python/3.6.14/Python-3.6.14.tgz#70064897bc434d6eae8bcc3e5678f282b5ea776d60e695da548a1219ccfd27a5" standard verify_py36 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.6.15 b/plugins/python-build/share/python-build/3.6.15 new file mode 100644 index 0000000..7e5421a --- /dev/null +++ b/plugins/python-build/share/python-build/3.6.15 @@ -0,0 +1,8 @@ +prefer_openssl11 +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.6.15" "https://www.python.org/ftp/python/3.6.15/Python-3.6.15.tar.xz#6e28d7cdd6dd513dd190e49bca3972e20fcf455090ccf2ef3f1a227614135d91" standard verify_py36 copy_python_gdb ensurepip +else + install_package "Python-3.6.15" "https://www.python.org/ftp/python/3.6.15/Python-3.6.15.tgz#54570b7e339e2cfd72b29c7e2fdb47c0b7b18b7412e61de5b463fc087c13b043" standard verify_py36 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.6.2 b/plugins/python-build/share/python-build/3.6.2 new file mode 100644 index 0000000..2b350da --- /dev/null +++ b/plugins/python-build/share/python-build/3.6.2 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.6.2" "https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tar.xz#9229773be41ed144370f47f0f626a1579931f5a390f1e8e3853174d52edd64a9" standard verify_py36 copy_python_gdb ensurepip +else + install_package "Python-3.6.2" "https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz#7919489310a5f17f7acbab64d731e46dca0702874840dadce8bd4b2b3b8e7a82" standard verify_py36 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.6.3 b/plugins/python-build/share/python-build/3.6.3 new file mode 100644 index 0000000..ed421dc --- /dev/null +++ b/plugins/python-build/share/python-build/3.6.3 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.6.3" "https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tar.xz#cda7d967c9a4bfa52337cdf551bcc5cff026b6ac50a8834e568ce4a794ca81da" standard verify_py36 copy_python_gdb ensurepip +else + install_package "Python-3.6.3" "https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz#ab6193af1921b30f587b302fe385268510e80187ca83ca82d2bfe7ab544c6f91" standard verify_py36 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.6.4 b/plugins/python-build/share/python-build/3.6.4 new file mode 100644 index 0000000..a3838e9 --- /dev/null +++ b/plugins/python-build/share/python-build/3.6.4 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.6.4" "https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tar.xz#159b932bf56aeaa76fd66e7420522d8c8853d486b8567c459b84fe2ed13bcaba" standard verify_py36 copy_python_gdb ensurepip +else + install_package "Python-3.6.4" "https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz#7dc453e1a93c083388eb1a23a256862407f8234a96dc4fae0fc7682020227486" standard verify_py36 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.6.5 b/plugins/python-build/share/python-build/3.6.5 new file mode 100644 index 0000000..c50e868 --- /dev/null +++ b/plugins/python-build/share/python-build/3.6.5 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.6.5" "https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz#f434053ba1b5c8a5cc597e966ead3c5143012af827fd3f0697d21450bb8d87a6" standard verify_py36 copy_python_gdb ensurepip +else + install_package "Python-3.6.5" "https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz#53a3e17d77cd15c5230192b6a8c1e031c07cd9f34a2f089a731c6f6bd343d5c6" standard verify_py36 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.6.6 b/plugins/python-build/share/python-build/3.6.6 new file mode 100644 index 0000000..a801eae --- /dev/null +++ b/plugins/python-build/share/python-build/3.6.6 @@ -0,0 +1,7 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.6.6" "https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tar.xz#d79bc15d456e73a3173a2938f18a17e5149c850ebdedf84a78067f501ee6e16f" standard verify_py36 copy_python_gdb ensurepip +else + install_package "Python-3.6.6" "https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz#7d56dadf6c7d92a238702389e80cfe66fbfae73e584189ed6f89c75bbf3eda58" standard verify_py36 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.6.7 b/plugins/python-build/share/python-build/3.6.7 new file mode 100644 index 0000000..97a655e --- /dev/null +++ b/plugins/python-build/share/python-build/3.6.7 @@ -0,0 +1,8 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.6.7" "https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tar.xz#81fd1401a9d66533b0a3e9e3f4ea1c7c6702d57d5b90d659f971e6f1b745f77d" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.6.7" "https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tgz#b7c36f7ed8f7143b2c46153b7332db2227669f583ea0cce753facf549d1a4239" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.6.8 b/plugins/python-build/share/python-build/3.6.8 new file mode 100644 index 0000000..f0c3036 --- /dev/null +++ b/plugins/python-build/share/python-build/3.6.8 @@ -0,0 +1,8 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.6.8" "https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz#35446241e995773b1bed7d196f4b624dadcadc8429f26282e756b2fb8a351193" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.6.8" "https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz#7f5b1f08b3b0a595387ef6c64c85b1b13b38abef0dd871835ee923262e4f32f0" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.6.9 b/plugins/python-build/share/python-build/3.6.9 new file mode 100644 index 0000000..14954dc --- /dev/null +++ b/plugins/python-build/share/python-build/3.6.9 @@ -0,0 +1,8 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.6.9" "https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tar.xz#5e2f5f554e3f8f7f0296f7e73d8600c4e9acbaee6b2555b83206edf5153870da" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.6.9" "https://www.python.org/ftp/python/3.6.9/Python-3.6.9.tgz#47fc92a1dcb946b9ed0abc311d3767b7215c54e655b17fd1d3f9b538195525aa" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.7-dev b/plugins/python-build/share/python-build/3.7-dev new file mode 100644 index 0000000..e414cfe --- /dev/null +++ b/plugins/python-build/share/python-build/3.7-dev @@ -0,0 +1,5 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_git "Python-3.7-dev" "https://github.com/python/cpython" "3.7" standard verify_py37 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/3.7.0 b/plugins/python-build/share/python-build/3.7.0 new file mode 100644 index 0000000..fcc533e --- /dev/null +++ b/plugins/python-build/share/python-build/3.7.0 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.7.0" "https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz#0382996d1ee6aafe59763426cf0139ffebe36984474d0ec4126dd1c40a8b3549" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.7.0" "https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz#85bb9feb6863e04fb1700b018d9d42d1caac178559ffa453d7e6a436e259fd0d" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.7.1 b/plugins/python-build/share/python-build/3.7.1 new file mode 100644 index 0000000..de51729 --- /dev/null +++ b/plugins/python-build/share/python-build/3.7.1 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.7.1" "https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tar.xz#fa7e2b8e8c9402f192ad56dc4f814089d1c4466c97d780f5e5acc02c04243d6d" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.7.1" "https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz#36c1b81ac29d0f8341f727ef40864d99d8206897be96be73dc34d4739c9c9f06" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.7.10 b/plugins/python-build/share/python-build/3.7.10 new file mode 100644 index 0000000..1d670e3 --- /dev/null +++ b/plugins/python-build/share/python-build/3.7.10 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.7.10" "https://www.python.org/ftp/python/3.7.10/Python-3.7.10.tar.xz#f8d82e7572c86ec9d55c8627aae5040124fd2203af400c383c821b980306ee6b" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.7.10" "https://www.python.org/ftp/python/3.7.10/Python-3.7.10.tgz#c9649ad84dc3a434c8637df6963100b2e5608697f9ba56d82e3809e4148e0975" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.7.11 b/plugins/python-build/share/python-build/3.7.11 new file mode 100644 index 0000000..56efbe8 --- /dev/null +++ b/plugins/python-build/share/python-build/3.7.11 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.7.11" "https://www.python.org/ftp/python/3.7.11/Python-3.7.11.tar.xz#ddb4196ab5c4f69e895920a422cb60d42b46e2de2b173ce7fd57f1435459a734" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.7.11" "https://www.python.org/ftp/python/3.7.11/Python-3.7.11.tgz#b4fba32182e16485d0a6022ba83c9251e6a1c14676ec243a9a07d3722cd4661a" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.7.12 b/plugins/python-build/share/python-build/3.7.12 new file mode 100644 index 0000000..84ac796 --- /dev/null +++ b/plugins/python-build/share/python-build/3.7.12 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.7.12" "https://www.python.org/ftp/python/3.7.12/Python-3.7.12.tar.xz#f77bf7fb47839f213e5cbf7827281078ea90de7e72b44f10d7ef385ea8c43210" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.7.12" "https://www.python.org/ftp/python/3.7.12/Python-3.7.12.tgz#33b4daaf831be19219659466d12645f87ecec6eb21d4d9f9711018a7b66cce46" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.7.13 b/plugins/python-build/share/python-build/3.7.13 new file mode 100644 index 0000000..3ea7995 --- /dev/null +++ b/plugins/python-build/share/python-build/3.7.13 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.7.13" "https://www.python.org/ftp/python/3.7.13/Python-3.7.13.tar.xz#99f106275df8899c3e8cb9d7c01ce686c202ef275953301427194693de5bef84" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.7.13" "https://www.python.org/ftp/python/3.7.13/Python-3.7.13.tgz#e405417f50984bc5870c7e7a9f9aeb93e9d270f5ac67f667a0cd3a09439682b5" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.7.14 b/plugins/python-build/share/python-build/3.7.14 new file mode 100644 index 0000000..0cac798 --- /dev/null +++ b/plugins/python-build/share/python-build/3.7.14 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.7.14" "https://www.python.org/ftp/python/3.7.14/Python-3.7.14.tar.xz#4157ae31eb81af19e81c36882610491b0fb8f50e00fa8a17b095c88908b9c45c" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.7.14" "https://www.python.org/ftp/python/3.7.14/Python-3.7.14.tgz#82b2abf8978caa61a9011d166eede831b32de9cbebc0db8162900fa23437b709" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.7.15 b/plugins/python-build/share/python-build/3.7.15 new file mode 100644 index 0000000..3aab86c --- /dev/null +++ b/plugins/python-build/share/python-build/3.7.15 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1q" "https://www.openssl.org/source/openssl-1.1.1q.tar.gz#d7939ce614029cdff0b6c20f0e2e5703158a489a72b2507b8bd51bf8c8fd10ca" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.7.15" "https://www.python.org/ftp/python/3.7.15/Python-3.7.15.tar.xz#5911475a07ac2b53d746e88a0716af6d2b4734941919136ea0d33fb9c75b9714" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.7.15" "https://www.python.org/ftp/python/3.7.15/Python-3.7.15.tgz#cf2993798ae8430f3af3a00d96d9fdf320719f4042f039380dca79967c25e436" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.7.16 b/plugins/python-build/share/python-build/3.7.16 new file mode 100644 index 0000000..d3df2bc --- /dev/null +++ b/plugins/python-build/share/python-build/3.7.16 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1q" "https://www.openssl.org/source/openssl-1.1.1q.tar.gz#d7939ce614029cdff0b6c20f0e2e5703158a489a72b2507b8bd51bf8c8fd10ca" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.7.16" "https://www.python.org/ftp/python/3.7.16/Python-3.7.16.tar.xz#8338f0c2222d847e904c955369155dc1beeeed806e8d5ef04b00ef4787238bfd" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.7.16" "https://www.python.org/ftp/python/3.7.16/Python-3.7.16.tgz#0cf2da07fa464636755215415909e22eb1d058817af4824bc15af8390d05fb38" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.7.17 b/plugins/python-build/share/python-build/3.7.17 new file mode 100644 index 0000000..4d70090 --- /dev/null +++ b/plugins/python-build/share/python-build/3.7.17 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.7.17" "https://www.python.org/ftp/python/3.7.17/Python-3.7.17.tar.xz#7911051ed0422fd54b8f59ffc030f7cf2ae30e0f61bda191800bb040dce4f9d2" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.7.17" "https://www.python.org/ftp/python/3.7.17/Python-3.7.17.tgz#fd50161bc2a04f4c22a0971ff0f3856d98b4bf294f89740a9f06b520aae63b49" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.7.2 b/plugins/python-build/share/python-build/3.7.2 new file mode 100644 index 0000000..93a68ee --- /dev/null +++ b/plugins/python-build/share/python-build/3.7.2 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.7.2" "https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tar.xz#d83fe8ce51b1bb48bbcf0550fd265b9a75cdfdfa93f916f9e700aef8444bf1bb" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.7.2" "https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz#f09d83c773b9cc72421abba2c317e4e6e05d919f9bcf34468e192b6a6c8e328d" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.7.3 b/plugins/python-build/share/python-build/3.7.3 new file mode 100644 index 0000000..4aabb82 --- /dev/null +++ b/plugins/python-build/share/python-build/3.7.3 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.7.3" "https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz#da60b54064d4cfcd9c26576f6df2690e62085123826cff2e667e72a91952d318" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.7.3" "https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz#d62e3015f2f89c970ac52343976b406694931742fbde2fed8d1ce8ebb4e1f8ff" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.7.4 b/plugins/python-build/share/python-build/3.7.4 new file mode 100644 index 0000000..bd74855 --- /dev/null +++ b/plugins/python-build/share/python-build/3.7.4 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.7.4" "https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tar.xz#fb799134b868199930b75f26678f18932214042639cd52b16da7fd134cd9b13f" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.7.4" "https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz#d63e63e14e6d29e17490abbe6f7d17afb3db182dbd801229f14e55f4157c4ba3" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.7.5 b/plugins/python-build/share/python-build/3.7.5 new file mode 100644 index 0000000..1ff1c5e --- /dev/null +++ b/plugins/python-build/share/python-build/3.7.5 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.7.5" "https://www.python.org/ftp/python/3.7.5/Python-3.7.5.tar.xz#e85a76ea9f3d6c485ec1780fca4e500725a4a7bbc63c78ebc44170de9b619d94" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.7.5" "https://www.python.org/ftp/python/3.7.5/Python-3.7.5.tgz#8ecc681ea0600bbfb366f2b173f727b205bb825d93d2f0b286bc4e58d37693da" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.7.6 b/plugins/python-build/share/python-build/3.7.6 new file mode 100644 index 0000000..a8c8dfa --- /dev/null +++ b/plugins/python-build/share/python-build/3.7.6 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.7.6" "https://www.python.org/ftp/python/3.7.6/Python-3.7.6.tar.xz#55a2cce72049f0794e9a11a84862e9039af9183603b78bc60d89539f82cf533f" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.7.6" "https://www.python.org/ftp/python/3.7.6/Python-3.7.6.tgz#aeee681c235ad336af116f08ab6563361a0c81c537072c1b309d6e4050aa2114" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.7.7 b/plugins/python-build/share/python-build/3.7.7 new file mode 100644 index 0000000..d6246a0 --- /dev/null +++ b/plugins/python-build/share/python-build/3.7.7 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.7.7" "https://www.python.org/ftp/python/3.7.7/Python-3.7.7.tar.xz#06a0a9f1bf0d8cd1e4121194d666c4e28ddae4dd54346de6c343206599f02136" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.7.7" "https://www.python.org/ftp/python/3.7.7/Python-3.7.7.tgz#8c8be91cd2648a1a0c251f04ea0bb4c2a5570feb9c45eaaa2241c785585b475a" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.7.8 b/plugins/python-build/share/python-build/3.7.8 new file mode 100644 index 0000000..4be84f1 --- /dev/null +++ b/plugins/python-build/share/python-build/3.7.8 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1j" "https://www.openssl.org/source/old/1.1.1/openssl-1.1.1j.tar.gz#aaf2fcb575cdf6491b98ab4829abf78a3dec8402b8b81efc8f23c00d443981bf" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.7.8" "https://www.python.org/ftp/python/3.7.8/Python-3.7.8.tar.xz#43a543404b363f0037f89df8478f19db2dbc0d6f3ffee310bc2997fa71854a63" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.7.8" "https://www.python.org/ftp/python/3.7.8/Python-3.7.8.tgz#0e25835614dc221e3ecea5831b38fa90788b5389b99b675a751414c858789ab0" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.7.9 b/plugins/python-build/share/python-build/3.7.9 new file mode 100644 index 0000000..0935b2c --- /dev/null +++ b/plugins/python-build/share/python-build/3.7.9 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.7.9" "https://www.python.org/ftp/python/3.7.9/Python-3.7.9.tar.xz#91923007b05005b5f9bd46f3b9172248aea5abc1543e8a636d59e629c3331b01" standard verify_py37 copy_python_gdb ensurepip +else + install_package "Python-3.7.9" "https://www.python.org/ftp/python/3.7.9/Python-3.7.9.tgz#39b018bc7d8a165e59aa827d9ae45c45901739b0bbb13721e4f973f3521c166a" standard verify_py37 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.8-dev b/plugins/python-build/share/python-build/3.8-dev new file mode 100644 index 0000000..d51d1cd --- /dev/null +++ b/plugins/python-build/share/python-build/3.8-dev @@ -0,0 +1,5 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_git "Python-3.8-dev" "https://github.com/python/cpython" "3.8" standard verify_py38 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/3.8.0 b/plugins/python-build/share/python-build/3.8.0 new file mode 100644 index 0000000..080e014 --- /dev/null +++ b/plugins/python-build/share/python-build/3.8.0 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.8.0" "https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tar.xz#b356244e13fb5491da890b35b13b2118c3122977c2cd825e3eb6e7d462030d84" standard verify_py38 copy_python_gdb ensurepip +else + install_package "Python-3.8.0" "https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tgz#f1069ad3cae8e7ec467aa98a6565a62a48ef196cb8f1455a245a08db5e1792df" standard verify_py38 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.8.1 b/plugins/python-build/share/python-build/3.8.1 new file mode 100644 index 0000000..d6a862b --- /dev/null +++ b/plugins/python-build/share/python-build/3.8.1 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.8.1" "https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tar.xz#75894117f6db7051c1b34f37410168844bbb357c139a8a10a352e9bf8be594e8" standard verify_py38 copy_python_gdb ensurepip +else + install_package "Python-3.8.1" "https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tgz#c7cfa39a43b994621b245e029769e9126caa2a93571cee2e743b213cceac35fb" standard verify_py38 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.8.10 b/plugins/python-build/share/python-build/3.8.10 new file mode 100644 index 0000000..506b67c --- /dev/null +++ b/plugins/python-build/share/python-build/3.8.10 @@ -0,0 +1,12 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.8.10" "https://www.python.org/ftp/python/3.8.10/Python-3.8.10.tar.xz#6af24a66093dd840bcccf371d4044a3027e655cf24591ce26e48022bc79219d9" standard verify_py38 copy_python_gdb ensurepip +else + install_package "Python-3.8.10" "https://www.python.org/ftp/python/3.8.10/Python-3.8.10.tgz#b37ac74d2cbad2590e7cd0dd2b3826c29afe89a734090a87bf8c03c45066cb65" standard verify_py38 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.8.11 b/plugins/python-build/share/python-build/3.8.11 new file mode 100644 index 0000000..0b2e4f9 --- /dev/null +++ b/plugins/python-build/share/python-build/3.8.11 @@ -0,0 +1,12 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.8.11" "https://www.python.org/ftp/python/3.8.11/Python-3.8.11.tar.xz#fb1a1114ebfe9e97199603c6083e20b236a0e007a2c51f29283ffb50c1420fb2" standard verify_py38 copy_python_gdb ensurepip +else + install_package "Python-3.8.11" "https://www.python.org/ftp/python/3.8.11/Python-3.8.11.tgz#b77464ea80cec14581b86aeb7fb2ff02830e0abc7bcdc752b7b4bdfcd8f3e393" standard verify_py38 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.8.12 b/plugins/python-build/share/python-build/3.8.12 new file mode 100644 index 0000000..e831bb3 --- /dev/null +++ b/plugins/python-build/share/python-build/3.8.12 @@ -0,0 +1,12 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.8.12" "https://www.python.org/ftp/python/3.8.12/Python-3.8.12.tar.xz#b1d3a76420375343b5e8a22fceb1ac65b77193e9ed27146524f0a9db058728ea" standard verify_py38 copy_python_gdb ensurepip +else + install_package "Python-3.8.12" "https://www.python.org/ftp/python/3.8.12/Python-3.8.12.tgz#316aa33f3b7707d041e73f246efedb297a70898c4b91f127f66dc8d80c596f1a" standard verify_py38 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.8.13 b/plugins/python-build/share/python-build/3.8.13 new file mode 100644 index 0000000..e2cb190 --- /dev/null +++ b/plugins/python-build/share/python-build/3.8.13 @@ -0,0 +1,12 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.8.13" "https://www.python.org/ftp/python/3.8.13/Python-3.8.13.tar.xz#6f309077012040aa39fe8f0c61db8c0fa1c45136763299d375c9e5756f09cf57" standard verify_py38 copy_python_gdb ensurepip +else + install_package "Python-3.8.13" "https://www.python.org/ftp/python/3.8.13/Python-3.8.13.tgz#903b92d76354366b1d9c4434d0c81643345cef87c1600adfa36095d7b00eede4" standard verify_py38 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.8.14 b/plugins/python-build/share/python-build/3.8.14 new file mode 100644 index 0000000..83fcd0c --- /dev/null +++ b/plugins/python-build/share/python-build/3.8.14 @@ -0,0 +1,12 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.8.14" "https://www.python.org/ftp/python/3.8.14/Python-3.8.14.tar.xz#5d77e278271ba803e9909a41a4f3baca006181c93ada682a5e5fe8dc4a24c5f3" standard verify_py38 copy_python_gdb ensurepip +else + install_package "Python-3.8.14" "https://www.python.org/ftp/python/3.8.14/Python-3.8.14.tgz#41f959c480c59211feb55d5a28851a56c7e22d02ef91035606ebb21011723c31" standard verify_py38 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.8.15 b/plugins/python-build/share/python-build/3.8.15 new file mode 100644 index 0000000..0dde62c --- /dev/null +++ b/plugins/python-build/share/python-build/3.8.15 @@ -0,0 +1,12 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1q" "https://www.openssl.org/source/openssl-1.1.1q.tar.gz#d7939ce614029cdff0b6c20f0e2e5703158a489a72b2507b8bd51bf8c8fd10ca" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.8.15" "https://www.python.org/ftp/python/3.8.15/Python-3.8.15.tar.xz#5114fc7918a2a5e20eb5aac696b30c36f412c6ef24b13f5c9eb9e056982d9550" standard verify_py38 copy_python_gdb ensurepip +else + install_package "Python-3.8.15" "https://www.python.org/ftp/python/3.8.15/Python-3.8.15.tgz#924d46999df82aa2eaa1de5ca51d6800ffb56b4bf52486a28f40634e3362abc4" standard verify_py38 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.8.16 b/plugins/python-build/share/python-build/3.8.16 new file mode 100644 index 0000000..ee61052 --- /dev/null +++ b/plugins/python-build/share/python-build/3.8.16 @@ -0,0 +1,12 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1q" "https://www.openssl.org/source/openssl-1.1.1q.tar.gz#d7939ce614029cdff0b6c20f0e2e5703158a489a72b2507b8bd51bf8c8fd10ca" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.8.16" "https://www.python.org/ftp/python/3.8.16/Python-3.8.16.tar.xz#d85dbb3774132473d8081dcb158f34a10ccad7a90b96c7e50ea4bb61f5ce4562" standard verify_py38 copy_python_gdb ensurepip +else + install_package "Python-3.8.16" "https://www.python.org/ftp/python/3.8.16/Python-3.8.16.tgz#71ca9d935637ed2feb59e90a368361dc91eca472a90acb1d344a2e8178ccaf10" standard verify_py38 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.8.17 b/plugins/python-build/share/python-build/3.8.17 new file mode 100644 index 0000000..5313c55 --- /dev/null +++ b/plugins/python-build/share/python-build/3.8.17 @@ -0,0 +1,12 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.8.17" "https://www.python.org/ftp/python/3.8.17/Python-3.8.17.tar.xz#2e54b0c68191f16552f6de2e97a2396540572a219f6bbb28591a137cecc490a9" standard verify_py38 copy_python_gdb ensurepip +else + install_package "Python-3.8.17" "https://www.python.org/ftp/python/3.8.17/Python-3.8.17.tgz#def428fa6cf61b66bcde72e3d9f7d07d33b2e4226f04f9d6fce8384c055113ae" standard verify_py38 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.8.18 b/plugins/python-build/share/python-build/3.8.18 new file mode 100644 index 0000000..8527e17 --- /dev/null +++ b/plugins/python-build/share/python-build/3.8.18 @@ -0,0 +1,12 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.8.18" "https://www.python.org/ftp/python/3.8.18/Python-3.8.18.tar.xz#3ffb71cd349a326ba7b2fadc7e7df86ba577dd9c4917e52a8401adbda7405e3f" standard verify_py38 copy_python_gdb ensurepip +else + install_package "Python-3.8.18" "https://www.python.org/ftp/python/3.8.18/Python-3.8.18.tgz#7c5df68bab1be81a52dea0cc2e2705ea00553b67107a301188383d7b57320b16" standard verify_py38 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.8.19 b/plugins/python-build/share/python-build/3.8.19 new file mode 100644 index 0000000..5e29edb --- /dev/null +++ b/plugins/python-build/share/python-build/3.8.19 @@ -0,0 +1,12 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.8.19" "https://www.python.org/ftp/python/3.8.19/Python-3.8.19.tar.xz#d2807ac69f69b84fd46a0b93bbd02a4fa48d3e70f4b2835ff0f72a2885040076" standard verify_py38 copy_python_gdb ensurepip +else + install_package "Python-3.8.19" "https://www.python.org/ftp/python/3.8.19/Python-3.8.19.tgz#c7fa55a36e5c7a19ec37d8f90f60a2197548908c9ac8b31e7c0dbffdd470eeac" standard verify_py38 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.8.2 b/plugins/python-build/share/python-build/3.8.2 new file mode 100644 index 0000000..1afc7e2 --- /dev/null +++ b/plugins/python-build/share/python-build/3.8.2 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.8.2" "https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tar.xz#2646e7dc233362f59714c6193017bb2d6f7b38d6ab4a0cb5fbac5c36c4d845df" standard verify_py38 copy_python_gdb ensurepip +else + install_package "Python-3.8.2" "https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz#e634a7a74776c2b89516b2e013dda1728c89c8149b9863b8cea21946daf9d561" standard verify_py38 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.8.20 b/plugins/python-build/share/python-build/3.8.20 new file mode 100644 index 0000000..a01e7b5 --- /dev/null +++ b/plugins/python-build/share/python-build/3.8.20 @@ -0,0 +1,12 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.8.20" "https://www.python.org/ftp/python/3.8.20/Python-3.8.20.tar.xz#6fb89a7124201c61125c0ab4cf7f6894df339a40c02833bfd28ab4d7691fafb4" standard verify_py38 copy_python_gdb ensurepip +else + install_package "Python-3.8.20" "https://www.python.org/ftp/python/3.8.20/Python-3.8.20.tgz#9f2d5962c2583e67ef75924cd56d0c1af78bf45ec57035cf8a2cc09f74f4bf78" standard verify_py38 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.8.3 b/plugins/python-build/share/python-build/3.8.3 new file mode 100644 index 0000000..9d1641d --- /dev/null +++ b/plugins/python-build/share/python-build/3.8.3 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.8.3" "https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tar.xz#dfab5ec723c218082fe3d5d7ae17ecbdebffa9a1aea4d64aa3a2ecdd2e795864" standard verify_py38 copy_python_gdb ensurepip +else + install_package "Python-3.8.3" "https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz#6af6d4d2e010f9655518d0fc6738c7ff7069f10a4d2fbd55509e467f092a8b90" standard verify_py38 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.8.4 b/plugins/python-build/share/python-build/3.8.4 new file mode 100644 index 0000000..a0bb08e --- /dev/null +++ b/plugins/python-build/share/python-build/3.8.4 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.8.4" "https://www.python.org/ftp/python/3.8.4/Python-3.8.4.tar.xz#5f41968a95afe9bc12192d7e6861aab31e80a46c46fa59d3d837def6a4cd4d37" standard verify_py38 copy_python_gdb ensurepip +else + install_package "Python-3.8.4" "https://www.python.org/ftp/python/3.8.4/Python-3.8.4.tgz#32c4d9817ef11793da4d0d95b3191c4db81d2e45544614e8449255ca9ae3cc18" standard verify_py38 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.8.5 b/plugins/python-build/share/python-build/3.8.5 new file mode 100644 index 0000000..f311b4b --- /dev/null +++ b/plugins/python-build/share/python-build/3.8.5 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.8.5" "https://www.python.org/ftp/python/3.8.5/Python-3.8.5.tar.xz#e3003ed57db17e617acb382b0cade29a248c6026b1bd8aad1f976e9af66a83b0" standard verify_py38 copy_python_gdb ensurepip +else + install_package "Python-3.8.5" "https://www.python.org/ftp/python/3.8.5/Python-3.8.5.tgz#015115023c382eb6ab83d512762fe3c5502fa0c6c52ffebc4831c4e1a06ffc49" standard verify_py38 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.8.6 b/plugins/python-build/share/python-build/3.8.6 new file mode 100644 index 0000000..9fdb052 --- /dev/null +++ b/plugins/python-build/share/python-build/3.8.6 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.8.6" "https://www.python.org/ftp/python/3.8.6/Python-3.8.6.tar.xz#a9e0b79d27aa056eb9cce8d63a427b5f9bab1465dee3f942dcfdb25a82f4ab8a" standard verify_py38 copy_python_gdb ensurepip +else + install_package "Python-3.8.6" "https://www.python.org/ftp/python/3.8.6/Python-3.8.6.tgz#313562ee9986dc369cd678011bdfd9800ef62fbf7b1496228a18f86b36428c21" standard verify_py38 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.8.7 b/plugins/python-build/share/python-build/3.8.7 new file mode 100644 index 0000000..66f1294 --- /dev/null +++ b/plugins/python-build/share/python-build/3.8.7 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.8.7" "https://www.python.org/ftp/python/3.8.7/Python-3.8.7.tar.xz#ddcc1df16bb5b87aa42ec5d20a5b902f2d088caa269b28e01590f97a798ec50a" standard verify_py38 copy_python_gdb ensurepip +else + install_package "Python-3.8.7" "https://www.python.org/ftp/python/3.8.7/Python-3.8.7.tgz#20e5a04262f0af2eb9c19240d7ec368f385788bba2d8dfba7e74b20bab4d2bac" standard verify_py38 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.8.8 b/plugins/python-build/share/python-build/3.8.8 new file mode 100644 index 0000000..124d834 --- /dev/null +++ b/plugins/python-build/share/python-build/3.8.8 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1i" "https://www.openssl.org/source/old/1.1.1/openssl-1.1.1i.tar.gz#e8be6a35fe41d10603c3cc635e93289ed00bf34b79671a3a4de64fcee00d5242" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.8.8" "https://www.python.org/ftp/python/3.8.8/Python-3.8.8.tar.xz#7c664249ff77e443d6ea0e4cf0e587eae918ca3c48d081d1915fe2a1f1bcc5cc" standard verify_py38 copy_python_gdb ensurepip +else + install_package "Python-3.8.8" "https://www.python.org/ftp/python/3.8.8/Python-3.8.8.tgz#76c0763f048e4f9b861d24da76b7dd5c7a3ba7ec086f40caedeea359263276f7" standard verify_py38 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.8.9 b/plugins/python-build/share/python-build/3.8.9 new file mode 100644 index 0000000..5f4677d --- /dev/null +++ b/plugins/python-build/share/python-build/3.8.9 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.8.9" "https://www.python.org/ftp/python/3.8.9/Python-3.8.9.tar.xz#5e391f3ec45da2954419cab0beaefd8be38895ea5ce33577c3ec14940c4b9572" standard verify_py38 copy_python_gdb ensurepip +else + install_package "Python-3.8.9" "https://www.python.org/ftp/python/3.8.9/Python-3.8.9.tgz#9779ec1df000bf86914cdd40860b88da56c1e61db59d37784beca14a259ac9e9" standard verify_py38 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9-dev b/plugins/python-build/share/python-build/3.9-dev new file mode 100644 index 0000000..d42b3bd --- /dev/null +++ b/plugins/python-build/share/python-build/3.9-dev @@ -0,0 +1,5 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_git "Python-3.9-dev" "https://github.com/python/cpython" 3.9 standard verify_py39 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/3.9.0 b/plugins/python-build/share/python-build/3.9.0 new file mode 100644 index 0000000..91e79e1 --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.0 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.0" "https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tar.xz#9c73e63c99855709b9be0b3cc9e5b072cb60f37311e8c4e50f15576a0bf82854" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.0" "https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tgz#df796b2dc8ef085edae2597a41c1c0a63625ebd92487adaef2fed22b567873e8" standard verify_py39 copy_python_gdb ensurepip +fi + diff --git a/plugins/python-build/share/python-build/3.9.1 b/plugins/python-build/share/python-build/3.9.1 new file mode 100644 index 0000000..18cfb47 --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.1 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.1" "https://www.python.org/ftp/python/3.9.1/Python-3.9.1.tar.xz#991c3f8ac97992f3d308fefeb03a64db462574eadbff34ce8bc5bb583d9903ff" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.1" "https://www.python.org/ftp/python/3.9.1/Python-3.9.1.tgz#29cb91ba038346da0bd9ab84a0a55a845d872c341a4da6879f462e94c741f117" standard verify_py39 copy_python_gdb ensurepip +fi + diff --git a/plugins/python-build/share/python-build/3.9.10 b/plugins/python-build/share/python-build/3.9.10 new file mode 100644 index 0000000..5191c8f --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.10 @@ -0,0 +1,12 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1l" "https://www.openssl.org/source/openssl-1.1.1l.tar.gz#0b7a3e5e59c34827fe0c3a74b7ec8baef302b98fa80088d7f9153aa16fa76bd1" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.10" "https://www.python.org/ftp/python/3.9.10/Python-3.9.10.tar.xz#0a8fbfb5287ebc3a13e9baf3d54e08fa06778ffeccf6311aef821bb3a6586cc8" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.10" "https://www.python.org/ftp/python/3.9.10/Python-3.9.10.tgz#1aa9c0702edbae8f6a2c95f70a49da8420aaa76b7889d3419c186bfc8c0e571e" standard verify_py39 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9.11 b/plugins/python-build/share/python-build/3.9.11 new file mode 100644 index 0000000..7dfbc80 --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.11 @@ -0,0 +1,12 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.11" "https://www.python.org/ftp/python/3.9.11/Python-3.9.11.tar.xz#66767a35309d724f370df9e503c172b4ee444f49d62b98bc4eca725123e26c49" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.11" "https://www.python.org/ftp/python/3.9.11/Python-3.9.11.tgz#3442400072f582ac2f0df30895558f08883b416c8c7877ea55d40d00d8a93112" standard verify_py39 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9.12 b/plugins/python-build/share/python-build/3.9.12 new file mode 100644 index 0000000..eed5c91 --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.12 @@ -0,0 +1,12 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.12" "https://www.python.org/ftp/python/3.9.12/Python-3.9.12.tar.xz#2cd94b20670e4159c6d9ab57f91dbf255b97d8c1a1451d1c35f4ec1968adf971" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.12" "https://www.python.org/ftp/python/3.9.12/Python-3.9.12.tgz#70e08462ebf265012bd2be88a63d2149d880c73e53f1712b7bbbe93750560ae8" standard verify_py39 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9.13 b/plugins/python-build/share/python-build/3.9.13 new file mode 100644 index 0000000..bae2446 --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.13 @@ -0,0 +1,12 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.13" "https://www.python.org/ftp/python/3.9.13/Python-3.9.13.tar.xz#125b0c598f1e15d2aa65406e83f792df7d171cdf38c16803b149994316a3080f" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.13" "https://www.python.org/ftp/python/3.9.13/Python-3.9.13.tgz#829b0d26072a44689a6b0810f5b4a3933ee2a0b8a4bfc99d7c5893ffd4f97c44" standard verify_py39 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9.14 b/plugins/python-build/share/python-build/3.9.14 new file mode 100644 index 0000000..a347e96 --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.14 @@ -0,0 +1,12 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.14" "https://www.python.org/ftp/python/3.9.14/Python-3.9.14.tar.xz#651304d216c8203fe0adf1a80af472d8e92c3b0e0a7892222ae4d9f3ae4debcf" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.14" "https://www.python.org/ftp/python/3.9.14/Python-3.9.14.tgz#9201836e2c16361b2b7408680502393737d44f227333fe2e5729c7d5f6041675" standard verify_py39 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9.15 b/plugins/python-build/share/python-build/3.9.15 new file mode 100644 index 0000000..8fb1309 --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.15 @@ -0,0 +1,12 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1q" "https://www.openssl.org/source/openssl-1.1.1q.tar.gz#d7939ce614029cdff0b6c20f0e2e5703158a489a72b2507b8bd51bf8c8fd10ca" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.15" "https://www.python.org/ftp/python/3.9.15/Python-3.9.15.tar.xz#12daff6809528d9f6154216950423c9e30f0e47336cb57c6aa0b4387dd5eb4b2" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.15" "https://www.python.org/ftp/python/3.9.15/Python-3.9.15.tgz#48d1ccb29d5fbaf1fb8f912271d09f7450e426d4dfe95978ef6aaada70ece4d8" standard verify_py39 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9.16 b/plugins/python-build/share/python-build/3.9.16 new file mode 100644 index 0000000..5a18452 --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.16 @@ -0,0 +1,12 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1q" "https://www.openssl.org/source/openssl-1.1.1q.tar.gz#d7939ce614029cdff0b6c20f0e2e5703158a489a72b2507b8bd51bf8c8fd10ca" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.16" "https://www.python.org/ftp/python/3.9.16/Python-3.9.16.tar.xz#22dddc099246dd2760665561e8adb7394ea0cc43a72684c6480f9380f7786439" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.16" "https://www.python.org/ftp/python/3.9.16/Python-3.9.16.tgz#1ad539e9dbd2b42df714b69726e0693bc6b9d2d2c8e91c2e43204026605140c5" standard verify_py39 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9.17 b/plugins/python-build/share/python-build/3.9.17 new file mode 100644 index 0000000..3964ce5 --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.17 @@ -0,0 +1,12 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.17" "https://www.python.org/ftp/python/3.9.17/Python-3.9.17.tar.xz#30ce057c44f283f8ed93606ccbdb8d51dd526bdc4c62cce5e0dc217bfa3e8cee" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.17" "https://www.python.org/ftp/python/3.9.17/Python-3.9.17.tgz#8ead58f669f7e19d777c3556b62fae29a81d7f06a7122ff9bc57f7dd82d7e014" standard verify_py39 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9.18 b/plugins/python-build/share/python-build/3.9.18 new file mode 100644 index 0000000..57cacd3 --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.18 @@ -0,0 +1,12 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.18" "https://www.python.org/ftp/python/3.9.18/Python-3.9.18.tar.xz#01597db0132c1cf7b331eff68ae09b5a235a3c3caa9c944c29cac7d1c4c4c00a" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.18" "https://www.python.org/ftp/python/3.9.18/Python-3.9.18.tgz#504ce8cfd59addc04c22f590377c6be454ae7406cb1ebf6f5a350149225a9354" standard verify_py39 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9.19 b/plugins/python-build/share/python-build/3.9.19 new file mode 100644 index 0000000..a30911d --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.19 @@ -0,0 +1,12 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.19" "https://www.python.org/ftp/python/3.9.19/Python-3.9.19.tar.xz#d4892cd1618f6458cb851208c030df1482779609d0f3939991bd38184f8c679e" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.19" "https://www.python.org/ftp/python/3.9.19/Python-3.9.19.tgz#f5f9ec8088abca9e399c3b62fd8ef31dbd2e1472c0ccb35070d4d136821aaf71" standard verify_py39 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9.2 b/plugins/python-build/share/python-build/3.9.2 new file mode 100644 index 0000000..d72cba6 --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.2 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1i" "https://www.openssl.org/source/old/1.1.1/openssl-1.1.1i.tar.gz#e8be6a35fe41d10603c3cc635e93289ed00bf34b79671a3a4de64fcee00d5242" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.2" "https://www.python.org/ftp/python/3.9.2/Python-3.9.2.tar.xz#3c2034c54f811448f516668dce09d24008a0716c3a794dd8639b5388cbde247d" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.2" "https://www.python.org/ftp/python/3.9.2/Python-3.9.2.tgz#7899e8a6f7946748830d66739f2d8f2b30214dad956e56b9ba216b3de5581519" standard verify_py39 copy_python_gdb ensurepip +fi + diff --git a/plugins/python-build/share/python-build/3.9.20 b/plugins/python-build/share/python-build/3.9.20 new file mode 100644 index 0000000..e405f82 --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.20 @@ -0,0 +1,12 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.20" "https://www.python.org/ftp/python/3.9.20/Python-3.9.20.tar.xz#6b281279efd85294d2d6993e173983a57464c0133956fbbb5536ec9646beaf0c" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.20" "https://www.python.org/ftp/python/3.9.20/Python-3.9.20.tgz#1e71f006222666e0a39f5a47be8221415c22c4dd8f25334cc41aee260b3d379e" standard verify_py39 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9.21 b/plugins/python-build/share/python-build/3.9.21 new file mode 100644 index 0000000..021f9dd --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.21 @@ -0,0 +1,12 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.21" "https://www.python.org/ftp/python/3.9.21/Python-3.9.21.tar.xz#3126f59592c9b0d798584755f2bf7b081fa1ca35ce7a6fea980108d752a05bb1" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.21" "https://www.python.org/ftp/python/3.9.21/Python-3.9.21.tgz#667c3ba2ca98d39ead1162f6548c3475768582e2ff89e0821d25eb956ac09944" standard verify_py39 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9.22 b/plugins/python-build/share/python-build/3.9.22 new file mode 100644 index 0000000..0e03b4b --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.22 @@ -0,0 +1,12 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-3.0.16" "https://github.com/openssl/openssl/releases/download/openssl-3.0.16/openssl-3.0.16.tar.gz#57e03c50feab5d31b152af2b764f10379aecd8ee92f16c985983ce4a99f7ef86" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.22" "https://www.python.org/ftp/python/3.9.22/Python-3.9.22.tar.xz#8c136d199d3637a1fce98a16adc809c1d83c922d02d41f3614b34f8b6e7d38ec" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.22" "https://www.python.org/ftp/python/3.9.22/Python-3.9.22.tgz#76f4daef4ffce6fd107280a0db8d108b1f896c1c22f09d8300efd90a69c4298b" standard verify_py39 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9.23 b/plugins/python-build/share/python-build/3.9.23 new file mode 100644 index 0000000..b50064d --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.23 @@ -0,0 +1,12 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-3.0.16" "https://github.com/openssl/openssl/releases/download/openssl-3.0.16/openssl-3.0.16.tar.gz#57e03c50feab5d31b152af2b764f10379aecd8ee92f16c985983ce4a99f7ef86" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.23" "https://www.python.org/ftp/python/3.9.23/Python-3.9.23.tar.xz#61a42919e13d539f7673cf11d1c404380e28e540510860b9d242196e165709c9" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.23" "https://www.python.org/ftp/python/3.9.23/Python-3.9.23.tgz#9a69aad184dc1d06f6819930741da3a328d34875a41f8ba33875774dbfc51b51" standard verify_py39 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9.24 b/plugins/python-build/share/python-build/3.9.24 new file mode 100644 index 0000000..42290d0 --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.24 @@ -0,0 +1,12 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-3.0.16" "https://github.com/openssl/openssl/releases/download/openssl-3.0.16/openssl-3.0.16.tar.gz#57e03c50feab5d31b152af2b764f10379aecd8ee92f16c985983ce4a99f7ef86" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.24" "https://www.python.org/ftp/python/3.9.24/Python-3.9.24.tar.xz#668391afabd5083faafa4543753d190f82f33ce6ba22d6e9ac728b43644b278a" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.24" "https://www.python.org/ftp/python/3.9.24/Python-3.9.24.tgz#9a32cfc683aecaadbd9ed891ac2af9451ff37f48a00a2d8e1f4ecd9c2a1ffdcb" standard verify_py39 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9.25 b/plugins/python-build/share/python-build/3.9.25 new file mode 100644 index 0000000..367381b --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.25 @@ -0,0 +1,12 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-3.0.16" "https://github.com/openssl/openssl/releases/download/openssl-3.0.16/openssl-3.0.16.tar.gz#57e03c50feab5d31b152af2b764f10379aecd8ee92f16c985983ce4a99f7ef86" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.25" "https://www.python.org/ftp/python/3.9.25/Python-3.9.25.tar.xz#00e07d7c0f2f0cc002432d1ee84d2a40dae404a99303e3f97701c10966c91834" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.25" "https://www.python.org/ftp/python/3.9.25/Python-3.9.25.tgz#a7438eabd3a48139f42d4e058096af8d880b0bb6e8fb8c78838892e4ce5583f2" standard verify_py39 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9.4 b/plugins/python-build/share/python-build/3.9.4 new file mode 100644 index 0000000..f4440e6 --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.4 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.4" "https://www.python.org/ftp/python/3.9.4/Python-3.9.4.tar.xz#4b0e6644a76f8df864ae24ac500a51bbf68bd098f6a173e27d3b61cdca9aa134" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.4" "https://www.python.org/ftp/python/3.9.4/Python-3.9.4.tgz#66c4de16daa74a825cf9da9ddae1fe020b72c3854b73b1762011cc33f9e4592f" standard verify_py39 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9.5 b/plugins/python-build/share/python-build/3.9.5 new file mode 100644 index 0000000..bcebf5a --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.5 @@ -0,0 +1,12 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.5" "https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tar.xz#0c5a140665436ec3dbfbb79e2dfb6d192655f26ef4a29aeffcb6d1820d716d83" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.5" "https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tgz#e0fbd5b6e1ee242524430dee3c91baf4cbbaba4a72dd1674b90fda87b713c7ab" standard verify_py39 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9.6 b/plugins/python-build/share/python-build/3.9.6 new file mode 100644 index 0000000..e7eb862 --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.6 @@ -0,0 +1,12 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.6" "https://www.python.org/ftp/python/3.9.6/Python-3.9.6.tar.xz#397920af33efc5b97f2e0b57e91923512ef89fc5b3c1d21dbfc8c4828ce0108a" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.6" "https://www.python.org/ftp/python/3.9.6/Python-3.9.6.tgz#d0a35182e19e416fc8eae25a3dcd4d02d4997333e4ad1f2eee6010aadc3fe866" standard verify_py39 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9.7 b/plugins/python-build/share/python-build/3.9.7 new file mode 100644 index 0000000..dcdec7f --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.7 @@ -0,0 +1,12 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.7" "https://www.python.org/ftp/python/3.9.7/Python-3.9.7.tar.xz#f8145616e68c00041d1a6399b76387390388f8359581abc24432bb969b5e3c57" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.7" "https://www.python.org/ftp/python/3.9.7/Python-3.9.7.tgz#a838d3f9360d157040142b715db34f0218e535333696a5569dc6f854604eb9d1" standard verify_py39 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9.8 b/plugins/python-build/share/python-build/3.9.8 new file mode 100644 index 0000000..3d90c3b --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.8 @@ -0,0 +1,12 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1l" "https://www.openssl.org/source/openssl-1.1.1l.tar.gz#0b7a3e5e59c34827fe0c3a74b7ec8baef302b98fa80088d7f9153aa16fa76bd1" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.8" "https://www.python.org/ftp/python/3.9.8/Python-3.9.8.tar.xz#675ce09bf23c09836bf1969b744b1ea4c1a18c32788626632525f08444ebad5c" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.8" "https://www.python.org/ftp/python/3.9.8/Python-3.9.8.tgz#7447fb8bb270942d620dd24faa7814b1383b61fa99029a240025fd81c1db8283" standard verify_py39 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9.9 b/plugins/python-build/share/python-build/3.9.9 new file mode 100644 index 0000000..d6445a3 --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.9 @@ -0,0 +1,12 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1l" "https://www.openssl.org/source/openssl-1.1.1l.tar.gz#0b7a3e5e59c34827fe0c3a74b7ec8baef302b98fa80088d7f9153aa16fa76bd1" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.9" "https://www.python.org/ftp/python/3.9.9/Python-3.9.9.tar.xz#06828c04a573c073a4e51c4292a27c1be4ae26621c3edc7cf9318418ce3b6d27" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.9" "https://www.python.org/ftp/python/3.9.9/Python-3.9.9.tgz#2cc7b67c1f3f66c571acc42479cdf691d8ed6b47bee12c9b68430413a17a44ea" standard verify_py39 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/activepython-2.7.14 b/plugins/python-build/share/python-build/activepython-2.7.14 new file mode 100644 index 0000000..7067873 --- /dev/null +++ b/plugins/python-build/share/python-build/activepython-2.7.14 @@ -0,0 +1,15 @@ +# Download source: http://downloads.activestate.com/ActivePython/releases/2.7.14.2717/ + +case "$(activepython_architecture 2>/dev/null || true)" in +"linux-x86_64" ) + install_package "ActivePython-2.7.14.2717-linux-x86_64-glibc-2.12-404899" "http://downloads.activestate.com/ActivePython/releases/2.7.14.2717/ActivePython-2.7.14.2717-linux-x86_64-glibc-2.12-404899.tar.gz#0b514b0edb6b847524d44637f56fdebcedb007864c61f8500e68bc2015dad937" "activepython" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Active Python is not available for $(activepython_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/activepython-3.5.4 b/plugins/python-build/share/python-build/activepython-3.5.4 new file mode 100644 index 0000000..9faf14a --- /dev/null +++ b/plugins/python-build/share/python-build/activepython-3.5.4 @@ -0,0 +1,15 @@ +# Location source: http://downloads.activestate.com/ActivePython/releases/3.5.4.3504/ + +case "$(activepython_architecture 2>/dev/null || true)" in +"linux-x86_64" ) + install_package "ActivePython-3.5.4.3504-linux-x86_64-glibc-2.12-404899" "http://downloads.activestate.com/ActivePython/releases/3.5.4.3504/ActivePython-3.5.4.3504-linux-x86_64-glibc-2.12-404899.tar.gz#c65e7384bcff715399ef077aea5a17a9f60c3f5de3532a3767497af1d555f092" "activepython" verify_py35 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Active Python is not available for $(activepython_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/activepython-3.6.0 b/plugins/python-build/share/python-build/activepython-3.6.0 new file mode 100644 index 0000000..e1dadb6 --- /dev/null +++ b/plugins/python-build/share/python-build/activepython-3.6.0 @@ -0,0 +1,18 @@ +# Download source: http://downloads.activestate.com/ActivePython/releases/3.6.0.3600/ + +case "$(activepython_architecture 2>/dev/null || true)" in +"linux-x86_64" ) + install_package "ActivePython-3.6.0.3600-linux-x86_64-glibc-2.3.6-401834" "http://downloads.activestate.com/ActivePython/releases/3.6.0.3600/ActivePython-3.6.0.3600-linux-x86_64-glibc-2.3.6-401834.tar.gz#edd17d3221d9744fe27d37842b325f55d0261e69073de3be54e29c1806fe57ae" "activepython" verify_py36 + ;; +"linux-x86" ) + install_package "ActivePython-3.6.0.3600-linux-x86-glibc-2.3.6-401834" "http://downloads.activestate.com/ActivePython/releases/3.6.0.3600/ActivePython-3.6.0.3600-linux-x86-glibc-2.3.6-401834.tar.gz#fafa22ad3346532384866ad009da0c9f23323167dff9de5995f94e827a5eba32" "activepython" verify_py36 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Active Python is not available for $(activepython_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda-1.4.0 b/plugins/python-build/share/python-build/anaconda-1.4.0 new file mode 100644 index 0000000..f6d7cd2 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda-1.4.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda-1.4.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda-1.4.0-Linux-x86.sh#065284c5de369c9b89dcae79e7169ce9b734dc3bbe6c409a67a5ec6480cc0f40" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda-1.4.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-1.4.0-Linux-x86_64.sh#85ae8a0a6e3a41cf7845be3def36ed40582d3dc6e6a50e99063eaf6f1abee24e" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda-1.4.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-1.4.0-MacOSX-x86_64.sh#e5d5dae6e93bb7df528abc19f5ed3a69cc4bc867836bdc56886c5a3768fccde7" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda-1.5.0 b/plugins/python-build/share/python-build/anaconda-1.5.0 new file mode 100644 index 0000000..39c90fd --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda-1.5.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda-1.5.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda-1.5.0-Linux-x86.sh#ca7e356dc1b8c8ef27dfb74b32c77563df704c6ddb39e69cac65ec416ebfe8e5" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda-1.5.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-1.5.0-Linux-x86_64.sh#f4cdc194f076e1b438c8a34e7e5f53e70c2200b411b2d0af719e23fe35c6411e" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda-1.5.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-1.5.0-MacOSX-x86_64.sh#c69609f0f48f33ca5a12d425a9e4d0fc91b2c09d0345a590e1d77726446727aa" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda-1.5.1 b/plugins/python-build/share/python-build/anaconda-1.5.1 new file mode 100644 index 0000000..d911501 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda-1.5.1 @@ -0,0 +1,13 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"MacOSX-x86_64" ) + install_script "Anaconda-1.5.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-1.5.1-MacOSX-x86_64.sh#6d3c86a2fdbaeeec2a6c251d5c9034a32b7c68a0437f2fac0b8f25125fe6866f" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda-1.6.0 b/plugins/python-build/share/python-build/anaconda-1.6.0 new file mode 100644 index 0000000..8dde33e --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda-1.6.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda-1.6.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda-1.6.0-Linux-x86.sh#d6aeedfcb39d648fdfb5bd72c4d0b3063a9d4f4866baf5052aa0645bf5d2c07a" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda-1.6.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-1.6.0-Linux-x86_64.sh#20f5b70193af4b0b8f10aa0e66aabca552846ec8f4958757ff3f4b79ef7b3160" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda-1.6.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-1.6.0-MacOSX-x86_64.sh#e03317888c36c07451a349577b426f435a75075d1ee71e204eb9d5dd23936f5e" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda-1.6.1 b/plugins/python-build/share/python-build/anaconda-1.6.1 new file mode 100644 index 0000000..6027020 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda-1.6.1 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda-1.6.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda-1.6.1-Linux-x86.sh#745b9452fd18720deefb465a6687c0d66df8f11edceadcee758082dea1b8e812" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda-1.6.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-1.6.1-Linux-x86_64.sh#81d1819ba08069343f228b9c819cdba0e4d15f2142c0c033657599808c3960fb" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda-1.6.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-1.6.1-MacOSX-x86_64.sh#bbc15de34208ce8af5aceedeea1334636fe94c578b9890896729f1a61ace5e4f" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda-1.7.0 b/plugins/python-build/share/python-build/anaconda-1.7.0 new file mode 100644 index 0000000..352a662 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda-1.7.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda-1.7.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda-1.7.0-Linux-x86.sh#af372a27a1887e11061485e2a854c535775fd519713e028c38901f90c869cd83" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda-1.7.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-1.7.0-Linux-x86_64.sh#6115cfae55a0746b4ae4128be839c99db39d02124160d9c531ca086c4d606582" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda-1.7.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-1.7.0-MacOSX-x86_64.sh#046b592245bc2c11e733acb9700dc50947f2eff0f30fec4a4a5bf79368dfa14b" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda-1.8.0 b/plugins/python-build/share/python-build/anaconda-1.8.0 new file mode 100644 index 0000000..d8863ea --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda-1.8.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda-1.8.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda-1.8.0-Linux-x86.sh#2c08a5cd6ccaa9dc84063b0ee9b007aa82e35a75c340fb272b394896de853608" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda-1.8.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-1.8.0-Linux-x86_64.sh#69f42966d918f4197040e4dd126d2e3cc3c267bb49869dbf2d6ef277ed5de8b7" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda-1.8.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-1.8.0-MacOSX-x86_64.sh#5844ca595b5930399a1213db64ab53e9b7e2fc1c26d8f11769c161fe4f5661e6" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda-1.9.0 b/plugins/python-build/share/python-build/anaconda-1.9.0 new file mode 100644 index 0000000..9cc5b37 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda-1.9.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda-1.9.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda-1.9.0-Linux-x86.sh#16471e90b3deb7be1b3d449d8883983d81f035dfaa1a3391497de20577de6f66" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda-1.9.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-1.9.0-Linux-x86_64.sh#855f1265e4c0b40d50f5a3a0fe7bae05b1cccb0a5301b378a19e0a8f7262913a" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda-1.9.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-1.9.0-MacOSX-x86_64.sh#722fe4d4406e88c5023e7ee21dc1401bb2a540d6c031d303f0330a95e60131fd" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda-1.9.1 b/plugins/python-build/share/python-build/anaconda-1.9.1 new file mode 100644 index 0000000..47c6739 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda-1.9.1 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda-1.9.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda-1.9.1-Linux-x86.sh#9aa39c05f723fee18c54a9cc1729986193216affedbae125ca5faa067403030a" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda-1.9.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-1.9.1-Linux-x86_64.sh#f6455e06a72b8cc11c8a96fb88a85518a2f7b2a1d6f1065f777d7ab4386f022d" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda-1.9.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-1.9.1-MacOSX-x86_64.sh#7e4358adbaae2db9e17d1e0e4263b9a0174394c8f115c89d285c3f0f9206f75b" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda-1.9.2 b/plugins/python-build/share/python-build/anaconda-1.9.2 new file mode 100644 index 0000000..b17ba85 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda-1.9.2 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda-1.9.2-Linux-x86" "https://repo.continuum.io/archive/Anaconda-1.9.2-Linux-x86.sh#1f7c850d0b98c011a717b3b757d82077accf0704dd7627f6962267bfb4476aad" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda-1.9.2-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-1.9.2-Linux-x86_64.sh#7181d399833a2549a9584255bb477487f2fde1fda4c7f7215d6034ea2fcfa21e" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda-1.9.2-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-1.9.2-MacOSX-x86_64.sh#be4611ca671f80b984fa330d4ecf82244c388abbdb5c7679a4e6e806b4dca52f" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda-2.0.0 b/plugins/python-build/share/python-build/anaconda-2.0.0 new file mode 100644 index 0000000..4ba5059 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda-2.0.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda-2.0.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda-2.0.0-Linux-x86.sh#efb9d3987134d484d88a9d915437b1bd568d065b4fefbd538e0281694bd90888" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda-2.0.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-2.0.0-Linux-x86_64.sh#3aa27ddf4a0ba5046ba52b97da99e20eb0614273d905bd73e016852451908917" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda-2.0.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-2.0.0-MacOSX-x86_64.sh#ad6271ad21403166bf54d0734ba8c7f7eb65bb78a70d67c58c15b6874cddc81e" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda-2.0.1 b/plugins/python-build/share/python-build/anaconda-2.0.1 new file mode 100644 index 0000000..1d342a1 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda-2.0.1 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda-2.0.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda-2.0.1-Linux-x86.sh#e8ffc63f31673b5ce41a95796a1f729ddcf4c7db19d6dbe29bedaeaaf8478505" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda-2.0.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-2.0.1-Linux-x86_64.sh#074204fa26872b4a946123071d15b8390c0e5441352c6b65b2abd32511bff240" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda-2.0.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-2.0.1-MacOSX-x86_64.sh#4ecda163c6f46e70cc6a1fe62dece4c6ecd6474845129cc95a1d4e18c42f8015" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda-2.1.0 b/plugins/python-build/share/python-build/anaconda-2.1.0 new file mode 100644 index 0000000..87e532f --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda-2.1.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda-2.1.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda-2.1.0-Linux-x86.sh#fd70c08719e6b5caae45b7c8402c6975a8cbc0e3e2a9c4c977554d1784f28b72" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda-2.1.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-2.1.0-Linux-x86_64.sh#191fbf290747614929d0bdd576e330c944b22a67585d1c185e0d2b3a3e65e1c0" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda-2.1.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-2.1.0-MacOSX-x86_64.sh#128fd4f53e0895e0d23f33e924ae32e01171c2914b044d2b157a9497108109cf" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda-2.2.0 b/plugins/python-build/share/python-build/anaconda-2.2.0 new file mode 100644 index 0000000..6d39b0b --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda-2.2.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda-2.2.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda-2.2.0-Linux-x86.sh#6437d5b08a19c3501f2f5dc3ae1ae16f91adf6bed0f067ef0806a9911b1bef15" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda-2.2.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-2.2.0-Linux-x86_64.sh#ca2582cb2188073b0f348ad42207211a2b85c10b244265b5b27bab04481b88a2" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda-2.2.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-2.2.0-MacOSX-x86_64.sh#20570e2f3911e38a78d8f888f3ff445d6c0cf97a2fca40d6956b48d12aaef339" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda-2.3.0 b/plugins/python-build/share/python-build/anaconda-2.3.0 new file mode 100644 index 0000000..5ed3515 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda-2.3.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda-2.3.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda-2.3.0-Linux-x86.sh#73fdbbb3e38207ed18e5059f71676d18d48fdccbc455a1272eb45a60376cd818" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda-2.3.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda-2.3.0-Linux-x86_64.sh#7c02499e9511c127d225992cfe1cd815e88fd46cd8a5b3cdf764f3fb4d8d4576" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda-2.3.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda-2.3.0-MacOSX-x86_64.sh#c4bb59a57bf44dde80612041bbbcfd2e5cab8534842209ef456da7a46f919c33" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda-2.4.0 b/plugins/python-build/share/python-build/anaconda-2.4.0 new file mode 100644 index 0000000..a01f3d5 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda-2.4.0 @@ -0,0 +1 @@ +source "${BASH_SOURCE%/*}/anaconda2-2.4.0" diff --git a/plugins/python-build/share/python-build/anaconda-4.0.0 b/plugins/python-build/share/python-build/anaconda-4.0.0 new file mode 100644 index 0000000..41241bb --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda-4.0.0 @@ -0,0 +1 @@ +source "${BASH_SOURCE%/*}/anaconda2-4.0.0" diff --git a/plugins/python-build/share/python-build/anaconda2-2.4.0 b/plugins/python-build/share/python-build/anaconda2-2.4.0 new file mode 100644 index 0000000..c9b7473 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda2-2.4.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda2-2.4.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-2.4.0-Linux-x86.sh#478a8fdde3a6e4040a68c57d7bdd6fab1a4f7f6e813948d46dad54867014c124" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda2-2.4.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-2.4.0-Linux-x86_64.sh#49d19834da06b1b82b6fa85bc647d2e78fa5957d0cbae3ccd6c695a541befa6b" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda2-2.4.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-2.4.0-MacOSX-x86_64.sh#53c9123c9d508555100805fdb44d9845511c937e7a34f237beb19168d655e070" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda2-2.4.1 b/plugins/python-build/share/python-build/anaconda2-2.4.1 new file mode 100644 index 0000000..4b8cdb6 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda2-2.4.1 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda2-2.4.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-2.4.1-Linux-x86.sh#2388cc714567afe7697bf43b4063ff0ea2150a71b9beb17f75bc7e4879d9bf28" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda2-2.4.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-2.4.1-Linux-x86_64.sh#2de682c96edf8cca2852071a84ff860025fbe8c502218e1995acd5ab47e8c9ac" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda2-2.4.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-2.4.1-MacOSX-x86_64.sh#f4bd45a21e0dff106e36d11cfd532f2b5050d3b792cc0627ab231089341d2040" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda2-2.5.0 b/plugins/python-build/share/python-build/anaconda2-2.5.0 new file mode 100644 index 0000000..8367c6b --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda2-2.5.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda2-2.5.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-2.5.0-Linux-x86.sh#4911047df51c46661f551d6022aee21a7e5d31df051d3433b8ff3ea3c2e771bb" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda2-2.5.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-2.5.0-Linux-x86_64.sh#e10abf459cde4a838bd6fc5ca03023c3401b81ad470627acde5a298d56715321" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda2-2.5.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-2.5.0-MacOSX-x86_64.sh#e7aa3b41210ee7ccf3c12e5b5ea43190d1811b58eaeca8584ccffa468ac8a346" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda2-2018.12 b/plugins/python-build/share/python-build/anaconda2-2018.12 new file mode 100644 index 0000000..04ac4e6 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda2-2018.12 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda2-2018.12-Linux-x86.sh" "https://repo.anaconda.com/archive/Anaconda2-2018.12-Linux-x86.sh#e086c041695c0e50642aee8f4e7adad3185c6ce1d11737665653497d2edd78fd" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda2-2018.12-Linux-x86_64.sh" "https://repo.anaconda.com/archive/Anaconda2-2018.12-Linux-x86_64.sh#1821d4b623ed449e0acb6df3ecbabd3944cffa98f96a5234b7a102a7c0853dc6" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda2-2018.12-MacOSX-x86_64.sh" "https://repo.anaconda.com/archive/Anaconda2-2018.12-MacOSX-x86_64.sh#5c590b1b3cdc2eedd52edce0caabbce6665d84084d31b913e789e8c46a94859d" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda2-2019.03 b/plugins/python-build/share/python-build/anaconda2-2019.03 new file mode 100644 index 0000000..6c2785b --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda2-2019.03 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Anaconda2-2019.03-Linux-ppc64le" "https://repo.continuum.io/archive/Anaconda2-2019.03-Linux-ppc64le.sh#3ab35c11b50ff26965266655d7dc76cf229336ee11b8b0c364ec1ba596ba9e07" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda2-2019.03-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-2019.03-Linux-x86_64.sh#cedfee5b5a3f62fcdac0a1d2d12396d0f232d2213d24d6dc893df5d8e64b8773" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda2-2019.03-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-2019.03-MacOSX-x86_64.sh#414917d00deaeefa38719992e6437470f54793718ef4bedcd66b0e5a30dbe4b6" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda2-2019.07 b/plugins/python-build/share/python-build/anaconda2-2019.07 new file mode 100644 index 0000000..5dc12ed --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda2-2019.07 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Anaconda2-2019.07-Linux-ppc64le" "https://repo.continuum.io/archive/Anaconda2-2019.07-Linux-ppc64le.sh#ee7f61dab233cdd0acb376ad55e977b16fdc03602f87a98dafb10d5fe9f5a190" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda2-2019.07-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-2019.07-Linux-x86_64.sh#189e16e7adf9ba4b7b7d06ecdc10ce4ad4153e5e3505b9331f3d142243e18e97" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda2-2019.07-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-2019.07-MacOSX-x86_64.sh#3e63919eed116826e683ed7d480d06517de79564788fbc27cb8d8879697eb654" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda2-2019.10 b/plugins/python-build/share/python-build/anaconda2-2019.10 new file mode 100644 index 0000000..96c0c82 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda2-2019.10 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Anaconda2-2019.10-Linux-ppc64le" "https://repo.anaconda.com/archive/Anaconda2-2019.10-Linux-ppc64le.sh#6b9809bf5d36782bfa1e35b791d983a0" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda2-2019.10-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda2-2019.10-Linux-x86_64.sh#69c64167b8cf3a8fc6b50d12d8476337" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda2-2019.10-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda2-2019.10-MacOSX-x86_64.sh#311aeb49cbe6d296f499efcd01a73f5e" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda2-4.0.0 b/plugins/python-build/share/python-build/anaconda2-4.0.0 new file mode 100644 index 0000000..f3ae09c --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda2-4.0.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda2-4.0.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-4.0.0-Linux-x86.sh#41341c840cea4185ef5bd82520c1de72b42e7dc43c703fb13b032f04dc0e3573" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda2-4.0.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.0.0-Linux-x86_64.sh#ae312143952ca00e061a656c2080e0e4fd3532721282ba8e2978177cad71a5f0" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda2-4.0.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.0.0-MacOSX-x86_64.sh#aa7ba6e1a40e08e672660c00c3151f0124faa61b598d75bdd07ebe1d24873ef6" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda2-4.1.0 b/plugins/python-build/share/python-build/anaconda2-4.1.0 new file mode 100644 index 0000000..9802928 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda2-4.1.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda2-4.1.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-4.1.0-Linux-x86.sh#54c06cd1b11cb687db6ba3613df443c057f769cdb87693e11674d956d8e5d081" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda2-4.1.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.1.0-Linux-x86_64.sh#3b7e504ca0132fb555d1f10e174cae07007f1bc6898cad0f7d416a68aca01f45" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda2-4.1.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.1.0-MacOSX-x86_64.sh#8b2c2a32f5e0da75cf8c81c568124cc1ea701a58cd46b7816133573a7f5b7b45" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda2-4.1.1 b/plugins/python-build/share/python-build/anaconda2-4.1.1 new file mode 100644 index 0000000..b135383 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda2-4.1.1 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda2-4.1.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-4.1.1-Linux-x86.sh#1ab001c7a469345a90d549ebf4afa3376f0f3a57a0df5f042cac7d773b0e0b0d" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda2-4.1.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.1.1-Linux-x86_64.sh#9413b1d3ca9498ba6f53913df9c43d685dd973440ff10b7fe0c45b1cbdcb582e" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda2-4.1.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.1.1-MacOSX-x86_64.sh#3b2fb323eb26c1c58788f63c41e164c20c417f7f24e30b8057e92ab4d6102b70" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda2-4.2.0 b/plugins/python-build/share/python-build/anaconda2-4.2.0 new file mode 100644 index 0000000..52a6578 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda2-4.2.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda2-4.2.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-4.2.0-Linux-x86.sh#618b720f309fe8da4f235415f11b6ce3db0a16d702ca67fdceeecf6bec78c32a" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda2-4.2.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.2.0-Linux-x86_64.sh#beee286d24fb37dd6555281bba39b3deb5804baec509a9dc5c69185098cf661a" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda2-4.2.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.2.0-MacOSX-x86_64.sh#a8b3ef86233635d9dcc3499dc384980762a0b42d354a318f8307029c399db452" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda2-4.3.0 b/plugins/python-build/share/python-build/anaconda2-4.3.0 new file mode 100644 index 0000000..6968157 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda2-4.3.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda2-4.3.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-4.3.0-Linux-x86.sh#b80d471839e8cf7b100e59308720cc13c141deb1ba903a4776c9a05f613e5078" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda2-4.3.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.3.0-Linux-x86_64.sh#7c52e6e99aabb24a49880130615a48e685da444c3c14eb48d6a65f3313bf745c" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda2-4.3.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.3.0-MacOSX-x86_64.sh#834ac0287062929ab5930661735ee617fd379bdfe79f3e0a20aebd614835b6c5" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda2-4.3.1 b/plugins/python-build/share/python-build/anaconda2-4.3.1 new file mode 100644 index 0000000..5cc3be2 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda2-4.3.1 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda2-4.3.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-4.3.1-Linux-x86.sh#4519ac724d5120d21bb80289c5509c0d1fd9f99c6e9b9a4c6fb352d8bda4aede" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda2-4.3.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.3.1-Linux-x86_64.sh#e9b8f2645df6b1527ba56d61343162e0794acc3ee8dde2a6bba353719e2d878d" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda2-4.3.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.3.1-MacOSX-x86_64.sh#35261360f2b01793f441b29715a94052dceaef1137866b7323c76be83c5bcc1a" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda2-4.4.0 b/plugins/python-build/share/python-build/anaconda2-4.4.0 new file mode 100644 index 0000000..a8d724e --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda2-4.4.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda2-4.4.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-4.4.0-Linux-x86.sh#452aa91ac83d3b6a68b79cea3042170ec591d468d6966307ff9af18fdbce9fbf" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda2-4.4.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.4.0-Linux-x86_64.sh#2d30b91ed4d215b6b4a15162a3389e9057b15445a0c02da71bd7bd272e7b824e" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda2-4.4.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-4.4.0-MacOSX-x86_64.sh#ab95aef1110c2a385fd39a17e5f11dfbaabce25c1a5944598de164d7a2772969" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda2-5.0.0 b/plugins/python-build/share/python-build/anaconda2-5.0.0 new file mode 100644 index 0000000..8b276c3 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda2-5.0.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda2-5.0.0.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-5.0.0.1-Linux-x86.sh#00fbd979c815ede0bbad48fb4ef62cda333c7ad6330184962862a3072479267b" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda2-5.0.0.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-5.0.0.1-Linux-x86_64.sh#18730808d863a5c194ab3f59dd395c1a63cbd769c9bfb1df65efe61ee62fc6d6" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda2-5.0.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-5.0.0-MacOSX-x86_64.sh#d85198c63657924fae11b6ea5961f50d81d09a1185d6f0a9a9d5bc69eb788ccc" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda2-5.0.1 b/plugins/python-build/share/python-build/anaconda2-5.0.1 new file mode 100644 index 0000000..65bdd33 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda2-5.0.1 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda2-5.0.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-5.0.1-Linux-x86.sh#88c8d698fff16af15862daca10e94a0a46380dcffda45f8d89f5fe03f6bd2528" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda2-5.0.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-5.0.1-Linux-x86_64.sh#23c676510bc87c95184ecaeb327c0b2c88007278e0d698622e2dd8fb14d9faa4" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda2-5.0.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-5.0.1-MacOSX-x86_64.sh#e3a9a5c84cb89ff079b0781ba773a3433d490fe0cfc24042c613a5674748d87b" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda2-5.1.0 b/plugins/python-build/share/python-build/anaconda2-5.1.0 new file mode 100644 index 0000000..2a2e46b --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda2-5.1.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda2-5.1.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-5.1.0-Linux-x86.sh#5af0c7a09a5f3aaf3666c0b362246d342d80e782128ef043998c9ead5ad41df7" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda2-5.1.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-5.1.0-Linux-x86_64.sh#5f26ee92860d1dffdcd20910ff2cf75572c39d2892d365f4e867a611cca2af5b" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda2-5.1.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-5.1.0-MacOSX-x86_64.sh#b686e01aeadb33526d9c154a0ac6f691dfad135080df96fb44d3ae1e4b128521" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda2-5.2.0 b/plugins/python-build/share/python-build/anaconda2-5.2.0 new file mode 100644 index 0000000..fe67777 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda2-5.2.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda2-5.2.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-5.2.0-Linux-x86.sh#402758c24767e9eb3b77312c388725a058f76e03316464797c3ca404e6eebc2c" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda2-5.2.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-5.2.0-Linux-x86_64.sh#cb0d7a08b0e2cec4372033d3269979b4e72e2353ffd1444f57cb38bc9621219f" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda2-5.2.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-5.2.0-MacOSX-x86_64.sh#d7d46e566306da5979cd5632079497fe6103b980e3a089ccf27a9f30cbee84dc" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda2-5.3.0 b/plugins/python-build/share/python-build/anaconda2-5.3.0 new file mode 100644 index 0000000..0f22491 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda2-5.3.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda2-5.3.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-5.3.0-Linux-x86.sh#58d4229ad7097e1f3387d7f6582dcf2bbc684bffea284cd25096bd87530ba590" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda2-5.3.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-5.3.0-Linux-x86_64.sh#50eeaab24bfa2472bc6485fe8f0e612ed67e561eda1ff9fbf07b62c96443c1be" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda2-5.3.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-5.3.0-MacOSX-x86_64.sh#bea3eb7667d265c8fe678ddde8432ac1f8286224baae498d092bb068b8185e88" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda2-5.3.1 b/plugins/python-build/share/python-build/anaconda2-5.3.1 new file mode 100644 index 0000000..4b78862 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda2-5.3.1 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda2-5.3.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda2-5.3.1-Linux-x86.sh#a38017dfa59141c63ec9882a15bd35e7ce63810ae0d1bcf47c79b7fb9f83e969" "anaconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Anaconda2-5.3.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda2-5.3.1-Linux-x86_64.sh#f0650ad2f9ca4ae3f3162d7204a32950bc794f37f322eb47b5ad9412454f998c" "anaconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda2-5.3.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda2-5.3.1-MacOSX-x86_64.sh#df81e9d5d7d4c6595609a8d353eab80102a83b49cf8c19e5c1e5ad4ac0f39328" "anaconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2.0.0 b/plugins/python-build/share/python-build/anaconda3-2.0.0 new file mode 100644 index 0000000..1707e25 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2.0.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda3-2.0.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-2.0.0-Linux-x86.sh#439761159d5604e182951650a478dd53caff52e9dccf17c20ae66689b7b289dd" "anaconda" verify_py34 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2.0.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.0.0-Linux-x86_64.sh#57ce4f97e300cf94c5724f72d992e9eecef708fdaa13bc672ae9779773056540" "anaconda" verify_py34 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2.0.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.0.0-MacOSX-x86_64.sh#776a1cf8a8e898b41bb6558c093632cc922698dc48486fee35d1e8eae3f604fa" "anaconda" verify_py34 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2.0.1 b/plugins/python-build/share/python-build/anaconda3-2.0.1 new file mode 100644 index 0000000..c9e0a3d --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2.0.1 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda3-2.0.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-2.0.1-Linux-x86.sh#21293fabbd3d5cfbb1afe0c9a8b39e0bc4d283cd7dbe3c84a60b335481a41ef3" "anaconda" verify_py34 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2.0.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.0.1-Linux-x86_64.sh#3c3b834793e461f3316ad1d9a9178c67859a9d74aaf7bcade076f04134dd1e26" "anaconda" verify_py34 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2.0.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.0.1-MacOSX-x86_64.sh#7a08509d4e45efcc7055a6d06d8406a773716500bd869a4e85312ff131155bd6" "anaconda" verify_py34 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2.1.0 b/plugins/python-build/share/python-build/anaconda3-2.1.0 new file mode 100644 index 0000000..f93deff --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2.1.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda3-2.1.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-2.1.0-Linux-x86.sh#657cb599004c21e37ce693515ea33922e0084fd7c159ef1b96b57c86eed8385f" "anaconda" verify_py34 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2.1.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.1.0-Linux-x86_64.sh#af3225ccbe8df0ffb918939e009aa57740e35058ebf9dfcf5fec794a77556c3c" "anaconda" verify_py34 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2.1.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.1.0-MacOSX-x86_64.sh#efdb7e9d1e539cbed62dc3874b0de6a141f36684e6fbc05018e072b217e24077" "anaconda" verify_py34 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2.2.0 b/plugins/python-build/share/python-build/anaconda3-2.2.0 new file mode 100644 index 0000000..f60765d --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2.2.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda3-2.2.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-2.2.0-Linux-x86.sh#223655cd256aa912dfc83ab24570e47bb3808bc3b0c6bd21b5db0fcf2750883e" "anaconda" verify_py34 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2.2.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.2.0-Linux-x86_64.sh#4aac68743e7706adb93f042f970373a6e7e087dbf4b02ac467c94ca4ce33d2d1" "anaconda" verify_py34 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2.2.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.2.0-MacOSX-x86_64.sh#81a2089ea6127717f146454e99ea0be2bd595193e4151bb05b4c15749b1d8124" "anaconda" verify_py34 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2.3.0 b/plugins/python-build/share/python-build/anaconda3-2.3.0 new file mode 100644 index 0000000..1828bde --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2.3.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda3-2.3.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-2.3.0-Linux-x86.sh#4cc10d65c303191004ada2b6d75562c8ed84e42bf9871af06440dd956077b555" "anaconda" verify_py34 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2.3.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.3.0-Linux-x86_64.sh#3be5410b2d9db45882c7de07c554cf4f1034becc274ec9074b23fd37a5c87a6f" "anaconda" verify_py34 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2.3.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.3.0-MacOSX-x86_64.sh#6a0c94a49f41f9fda0138c8e966bd7b0a8965d6648fd21ffbd645d1453848ba5" "anaconda" verify_py34 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2.4.0 b/plugins/python-build/share/python-build/anaconda3-2.4.0 new file mode 100644 index 0000000..a9441b5 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2.4.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda3-2.4.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-2.4.0-Linux-x86.sh#f6080c6493cefc603cfeb67aaf6c3c4c6b80a66788f03db48ffd3cfa52017c0a" "anaconda" verify_py34 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2.4.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.4.0-Linux-x86_64.sh#fb4e480059e991f2fa632b5a9bcdd284c7f0677814cd719c11d524453f96a40d" "anaconda" verify_py34 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2.4.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.4.0-MacOSX-x86_64.sh#f0cd785dbed0bab28dfc08a391c9de1b01633422fa317cb8365513a1ae5ae074" "anaconda" verify_py34 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2.4.1 b/plugins/python-build/share/python-build/anaconda3-2.4.1 new file mode 100644 index 0000000..001e343 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2.4.1 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda3-2.4.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-2.4.1-Linux-x86.sh#00d13413f5b8129e863dabcc2296a181c697056c5ed210739a0aa06454ab7038" "anaconda" verify_py34 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2.4.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.4.1-Linux-x86_64.sh#0735e69199fc37135930ea2fd4fb6ad0adef215a2a7ba9fd6b0a0a4daaadb1cf" "anaconda" verify_py34 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2.4.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.4.1-MacOSX-x86_64.sh#22a3267638da9b7d64210d7da90d8762da7948234c21c0010a74f2621ee0ef68" "anaconda" verify_py34 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2.5.0 b/plugins/python-build/share/python-build/anaconda3-2.5.0 new file mode 100644 index 0000000..394ff8b --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2.5.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda3-2.5.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-2.5.0-Linux-x86.sh#22ac26c8bde7c4153ea859f6f6d8aca93bbf1e213d800167ad5ea530c62959af" "anaconda" verify_py35 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2.5.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.5.0-Linux-x86_64.sh#addadcb927f15cb0b5b6e36890563d3352a8ff6a901ea753d389047d274a29a9" "anaconda" verify_py35 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2.5.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2.5.0-MacOSX-x86_64.sh#9bb0f926927db210f8c2a8de881213d1a44c7b3d6dbcb93dfa6b99ed4bbd3e61" "anaconda" verify_py35 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2018.12 b/plugins/python-build/share/python-build/anaconda3-2018.12 new file mode 100644 index 0000000..6aa8dc8 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2018.12 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda3-2018.12-Linux-x86.sh" "https://repo.anaconda.com/archive/Anaconda3-2018.12-Linux-x86.sh#7895052814921d45ed0585d1fb19f8edd6fbd02b61639310f770e2ebe85cd975" "anaconda" verify_py37 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2018.12-Linux-x86_64.sh" "https://repo.anaconda.com/archive/Anaconda3-2018.12-Linux-x86_64.sh#1019d0857e5865f8a6861eaf15bfe535b87e92b72ce4f531000dc672be7fce00" "anaconda" verify_py37 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2018.12-MacOSX-x86_64.sh" "https://repo.anaconda.com/archive/Anaconda3-2018.12-MacOSX-x86_64.sh#4ccd3944d994fd47e5701c341725a63e984f8c042bf4dc19c9dfc7c135e7d8e4" "anaconda" verify_py37 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2019.03 b/plugins/python-build/share/python-build/anaconda3-2019.03 new file mode 100644 index 0000000..268de56 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2019.03 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Anaconda3-2019.03-Linux-ppc64le" "https://repo.continuum.io/archive/Anaconda3-2019.03-Linux-ppc64le.sh#b4ecfca3b6d6c284a3f9370f6a5ccfac1b6be7fa75af9f6750a98fb315601ebb" "anaconda" verify_py37 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2019.03-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2019.03-Linux-x86_64.sh#45c851b7497cc14d5ca060064394569f724b67d9b5f98a926ed49b834a6bb73a" "anaconda" verify_py37 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2019.03-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2019.03-MacOSX-x86_64.sh#b232f0b16181f48667d2ca89c04a4ee4b3932475282b41c52acb87b4cdafcaaf" "anaconda" verify_py37 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2019.07 b/plugins/python-build/share/python-build/anaconda3-2019.07 new file mode 100644 index 0000000..6957e61 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2019.07 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Anaconda3-2019.07-Linux-ppc64le" "https://repo.continuum.io/archive/Anaconda3-2019.07-Linux-ppc64le.sh#e788094f7a18bfe14038accb26c8809a81291ed97f1fce29425f366aa8105548" "anaconda" verify_py37 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2019.07-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2019.07-Linux-x86_64.sh#69581cf739365ec7fb95608eef694ba959d7d33b36eb961953f2b82cb25bdf5a" "anaconda" verify_py37 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2019.07-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2019.07-MacOSX-x86_64.sh#dcbddbab37c5b5f3873fe24d2617a4325bc7da28c0cd1d23a2edc7f0ebe08b7d" "anaconda" verify_py37 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2019.10 b/plugins/python-build/share/python-build/anaconda3-2019.10 new file mode 100644 index 0000000..5f201aa --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2019.10 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Anaconda3-2019.10-Linux-ppc64le" "https://repo.continuum.io/archive/Anaconda3-2019.10-Linux-ppc64le.sh#118c579f625555e1b116f0c3fd3842772e8fa0254cb2262c1c94e9eb40ba5160" "anaconda" verify_py37 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2019.10-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2019.10-Linux-x86_64.sh#46d762284d252e51cd58a8ca6c8adc9da2eadc82c342927b2f66ed011d1d8b53" "anaconda" verify_py37 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2019.10-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2019.10-MacOSX-x86_64.sh#4f77299ff4170cda64fdfcc27ac609a37d654c158f36c9ff25048793fe8a3a49" "anaconda" verify_py37 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2020.02 b/plugins/python-build/share/python-build/anaconda3-2020.02 new file mode 100644 index 0000000..b4befdd --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2020.02 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Anaconda3-2020.02-Linux-ppc64le" "https://repo.continuum.io/archive/Anaconda3-2020.02-Linux-ppc64le.sh#d6d1827a38b988cbbe714d6e0357c9e251c84641a0c70cda51861ed9abb38804" "anaconda" verify_py37 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2020.02-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2020.02-Linux-x86_64.sh#2b9f088b2022edb474915d9f69a803d6449d5fdb4c303041f60ac4aefcc208bb" "anaconda" verify_py37 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2020.02-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2020.02-MacOSX-x86_64.sh#d237e6c976eb9c58368ca156a51bd913d63a3b5fea32689342733c99d14b6f2e" "anaconda" verify_py37 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2020.07 b/plugins/python-build/share/python-build/anaconda3-2020.07 new file mode 100644 index 0000000..f4b018d --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2020.07 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Anaconda3-2020.07-Linux-ppc64le" "https://repo.continuum.io/archive/Anaconda3-2020.07-Linux-ppc64le.sh#0df7c3784973ab46a9ef9848aced01311d08a71d79a18d5ed79dccdae8c8dea7" "anaconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2020.07-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2020.07-Linux-x86_64.sh#38ce717758b95b3bd0b1797cc6ccfb76f29a90c25bdfa50ee45f11e583edfdbf" "anaconda" verify_py38 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2020.07-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2020.07-MacOSX-x86_64.sh#3980c2a57fde5de2ccfdf0d7973f95ac1a3fa63351642e6735c50fc3791ef0f1" "anaconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2020.11 b/plugins/python-build/share/python-build/anaconda3-2020.11 new file mode 100644 index 0000000..158af56 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2020.11 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Anaconda3-2020.11-Linux-ppc64le" "https://repo.continuum.io/archive/Anaconda3-2020.11-Linux-ppc64le.sh#870535ada0a8ae75eeda8cd2bf7dde853ac9f4949b20e1b5641f1843a655f3b8" "anaconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2020.11-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2020.11-Linux-x86_64.sh#cf2ff493f11eaad5d09ce2b4feaa5ea90db5174303d5b3fe030e16d29aeef7de" "anaconda" verify_py38 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2020.11-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2020.11-MacOSX-x86_64.sh#ec11e325c792a6f49dbdbe5e641991d0a29788689176d7e54da97def9532c762" "anaconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2021.04 b/plugins/python-build/share/python-build/anaconda3-2021.04 new file mode 100644 index 0000000..5a59a84 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2021.04 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Anaconda3-2021.04-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2021.04-Linux-aarch64.sh#14f48f5d1310478b11940a3b96eec7b6" "anaconda" verify_py38 + ;; +"Linux-ppc64le" ) + install_script "Anaconda3-2021.04-Linux-ppc64le" "https://repo.anaconda.com/archive/Anaconda3-2021.04-Linux-ppc64le.sh#e5c8220526b95293e669734f91194acc" "anaconda" verify_py38 + ;; +"Linux-s390x" ) + install_script "Anaconda3-2021.04-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2021.04-Linux-s390x.sh#e61fac26bf61bc5c3e3c1a93abc4d8e2" "anaconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2021.04-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2021.04-Linux-x86_64.sh#230f2c3c343ee58073bf41bd896dd76c" "anaconda" verify_py38 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2021.04-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2021.04-MacOSX-x86_64.sh#3caed29ad5564b3567676504669342dc" "anaconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2021.05 b/plugins/python-build/share/python-build/anaconda3-2021.05 new file mode 100644 index 0000000..6387d15 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2021.05 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Anaconda3-2021.05-Linux-ppc64le" "https://repo.continuum.io/archive/Anaconda3-2021.05-Linux-ppc64le.sh#097064807a9adae3f91fc4c5852cd90df2b77fc96505929bb25bf558f1eef76f" "anaconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2021.05-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2021.05-Linux-x86_64.sh#2751ab3d678ff0277ae80f9e8a74f218cfc70fe9a9cdc7bb1c137d7e47e33d53" "anaconda" verify_py38 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2021.05-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2021.05-MacOSX-x86_64.sh#0407bee87eeecad521f1e38eb607b0a85babef4c1b47516dc5c090e152eba5d5" "anaconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2021.11 b/plugins/python-build/share/python-build/anaconda3-2021.11 new file mode 100644 index 0000000..b9ffb62 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2021.11 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Anaconda3-2021.11-Linux-ppc64le" "https://repo.continuum.io/archive/Anaconda3-2021.11-Linux-ppc64le.sh#7eb6a95925ee756240818599f8dcbba7a155adfb05ef6cd5336aa3c083de65f3" "anaconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2021.11-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-2021.11-Linux-x86_64.sh#fedf9e340039557f7b5e8a8a86affa9d299f5e9820144bd7b92ae9f7ee08ac60" "anaconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2021.11-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-2021.11-MacOSX-x86_64.sh#6a9217d1a08c599f860045d56ef64fc6c3e3112b55cc97f3d07c573d7bbcdb58" "anaconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2022.05 b/plugins/python-build/share/python-build/anaconda3-2022.05 new file mode 100644 index 0000000..791a408 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2022.05 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Anaconda3-2022.05-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2022.05-Linux-aarch64.sh#7e822f5622fa306c0aa42430ba884454" "anaconda" verify_py39 + ;; +"Linux-ppc64le" ) + install_script "Anaconda3-2022.05-Linux-ppc64le" "https://repo.anaconda.com/archive/Anaconda3-2022.05-Linux-ppc64le.sh#166b576c7e9d438b0a80840f94b44827" "anaconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Anaconda3-2022.05-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2022.05-Linux-s390x.sh#00ba3bf29ac51db5e0954b6f217fa468" "anaconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2022.05-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2022.05-Linux-x86_64.sh#a01150aff48fcb6fcd6472381652de04" "anaconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Anaconda3-2022.05-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2022.05-MacOSX-arm64.sh#24d985d2d380c51364d4793eb1840d29" "anaconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2022.05-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2022.05-MacOSX-x86_64.sh#5319de6536212892dd2da8b70d602ee1" "anaconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2022.10 b/plugins/python-build/share/python-build/anaconda3-2022.10 new file mode 100644 index 0000000..8a147f8 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2022.10 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Anaconda3-2022.10-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-aarch64.sh#dac187c9fa6cae4ad663937f0ef79c8f" "anaconda" verify_py39 + ;; +"Linux-ppc64le" ) + install_script "Anaconda3-2022.10-Linux-ppc64le" "https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-ppc64le.sh#8dee159ac42f80eca8ce99ddbfd94099" "anaconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Anaconda3-2022.10-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-s390x.sh#ef2a6accc4d0d77756130198cb481358" "anaconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2022.10-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh#80256bd7a55509665c4179fd61516745" "anaconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Anaconda3-2022.10-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2022.10-MacOSX-arm64.sh#3a5d726f90e11270990e520905cf8466" "anaconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2022.10-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2022.10-MacOSX-x86_64.sh#83fe2cbd4b32eeb63e99c3e15d72be85" "anaconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2023.03 b/plugins/python-build/share/python-build/anaconda3-2023.03 new file mode 100644 index 0000000..7fc6f2b --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2023.03 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Anaconda3-2023.03-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2023.03-Linux-aarch64.sh#613797154d9383355677f7dfee10db32b2c327cbedabddcb303598f242c79883" "anaconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Anaconda3-2023.03-Linux-ppc64le" "https://repo.anaconda.com/archive/Anaconda3-2023.03-Linux-ppc64le.sh#eafeaccca96f60ebb0aa0052d9baac8eaa2ee422358ee35b12f60f37e8a3ebb2" "anaconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Anaconda3-2023.03-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2023.03-Linux-s390x.sh#2648337081c3ce4b760457c5f00fb768ecd7d1d0957051ef5252ab380bb78233" "anaconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2023.03-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.03-Linux-x86_64.sh#19737d5c27b23a1d8740c5cb2414bf6253184ce745d0a912bb235a212a15e075" "anaconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Anaconda3-2023.03-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2023.03-MacOSX-arm64.sh#d27ee5432438972e90548e3dfa89490c5dc38a723f4dcd53061f0bd9d53b1bd0" "anaconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2023.03-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.03-MacOSX-x86_64.sh#cc37b1eb85bdc2ade3f95201a746cdc63ee4fbfae48ee9d0c7a3cf319562452d" "anaconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2023.03-0 b/plugins/python-build/share/python-build/anaconda3-2023.03-0 new file mode 100644 index 0000000..9669d74 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2023.03-0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Anaconda3-2023.03-0-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2023.03-0-Linux-aarch64.sh#613797154d9383355677f7dfee10db32b2c327cbedabddcb303598f242c79883" "anaconda" verify_py39 + ;; +"Linux-ppc64le" ) + install_script "Anaconda3-2023.03-0-Linux-ppc64le" "https://repo.anaconda.com/archive/Anaconda3-2023.03-0-Linux-ppc64le.sh#eafeaccca96f60ebb0aa0052d9baac8eaa2ee422358ee35b12f60f37e8a3ebb2" "anaconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Anaconda3-2023.03-0-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2023.03-0-Linux-s390x.sh#2648337081c3ce4b760457c5f00fb768ecd7d1d0957051ef5252ab380bb78233" "anaconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2023.03-0-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.03-0-Linux-x86_64.sh#19737d5c27b23a1d8740c5cb2414bf6253184ce745d0a912bb235a212a15e075" "anaconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Anaconda3-2023.03-0-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2023.03-0-MacOSX-arm64.sh#d27ee5432438972e90548e3dfa89490c5dc38a723f4dcd53061f0bd9d53b1bd0" "anaconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2023.03-0-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.03-0-MacOSX-x86_64.sh#cc37b1eb85bdc2ade3f95201a746cdc63ee4fbfae48ee9d0c7a3cf319562452d" "anaconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2023.03-1 b/plugins/python-build/share/python-build/anaconda3-2023.03-1 new file mode 100644 index 0000000..8569d3e --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2023.03-1 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Anaconda3-2023.03-1-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-aarch64.sh#54e600faa2af63a25717af30ecaddf1ee428cdfebd3721a70f41462e232e8153" "anaconda" verify_py39 + ;; +"Linux-ppc64le" ) + install_script "Anaconda3-2023.03-1-Linux-ppc64le" "https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-ppc64le.sh#a31f2d6da83534cff7c994403cc11fa634b31fcd10eb4153d00233345ee084b2" "anaconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Anaconda3-2023.03-1-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-s390x.sh#5af1406c6350b4ba6839c49faa32a3c90f2b9845a03c35843f118dd9dd013421" "anaconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2023.03-1-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh#95102d7c732411f1458a20bdf47e4c1b0b6c8a21a2edfe4052ca370aaae57bab" "anaconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Anaconda3-2023.03-1-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2023.03-1-MacOSX-arm64.sh#85152324c423fedbeed2e7491cb32e597eaeb1b86ae7a61ff7597b401fd053ce" "anaconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2023.03-1-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.03-1-MacOSX-x86_64.sh#3593921c8a5516db82f0d7dd1c691f7ee7794236852e7da614e9ad6e93eeb342" "anaconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2023.07-0 b/plugins/python-build/share/python-build/anaconda3-2023.07-0 new file mode 100644 index 0000000..3d433ad --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2023.07-0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Anaconda3-2023.07-0-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2023.07-0-Linux-aarch64.sh#5f4865448c1111fb80cb49abff0f9b38b2970857dba7a4627c499ba102b82af5" "anaconda" verify_py39 + ;; +"Linux-ppc64le" ) + install_script "Anaconda3-2023.07-0-Linux-ppc64le" "https://repo.anaconda.com/archive/Anaconda3-2023.07-0-Linux-ppc64le.sh#98efb73758680b84f890d818b5748d7a08e82c4b825d597f7e3c4467125da278" "anaconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Anaconda3-2023.07-0-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2023.07-0-Linux-s390x.sh#f6933a8b70d346d423e089843fc151c46bdaee4e3e4e4fd0fb81ca06b8766892" "anaconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2023.07-0-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.07-0-Linux-x86_64.sh#ac738639aba0b676a618911600d0a0e7825ee7fd10efb6b3d95cc2e570d9ee7b" "anaconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Anaconda3-2023.07-0-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2023.07-0-MacOSX-arm64.sh#23a9deb80acb145c65375bd73cbaa8793be81447278c4db7be50ef7c32a58635" "anaconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2023.07-0-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.07-0-MacOSX-x86_64.sh#b6ea24fe16544d5b2d5adf6c913c1fc89a6dbdef12a4caff76ff574b33d0f3cb" "anaconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2023.07-1 b/plugins/python-build/share/python-build/anaconda3-2023.07-1 new file mode 100644 index 0000000..b76a493 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2023.07-1 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Anaconda3-2023.07-1-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2023.07-1-Linux-aarch64.sh#2ebe549375f3f5ffec9558a8a8405ebd697e69c8133b8f9c1c5cd4ff69d1cc74" "anaconda" verify_py311 + ;; +"Linux-ppc64le" ) + install_script "Anaconda3-2023.07-1-Linux-ppc64le" "https://repo.anaconda.com/archive/Anaconda3-2023.07-1-Linux-ppc64le.sh#ee149f55ebdd3f15fc1db4e9cddb5126da62e7a193fa15026c9fa009a2575d0a" "anaconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Anaconda3-2023.07-1-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2023.07-1-Linux-s390x.sh#49aad1bc077334f30177443c234f3c982f1c9751fc78c4c29fb4cf736e4f61ef" "anaconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2023.07-1-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.07-1-Linux-x86_64.sh#111ce0a7f26e606863008a9519fd608b1493e483b6f487aea71d82b13fe0967e" "anaconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Anaconda3-2023.07-1-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2023.07-1-MacOSX-arm64.sh#322045ad100dcc380decde5812db58c617901c6a8ac46dd7818080fe3ae19f8e" "anaconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2023.07-1-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.07-1-MacOSX-x86_64.sh#803b2d0c5a142af3de14b410517c2c8889eaceb1b784d4c121512ebda13af6f8" "anaconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2023.07-2 b/plugins/python-build/share/python-build/anaconda3-2023.07-2 new file mode 100644 index 0000000..3c46a49 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2023.07-2 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Anaconda3-2023.07-2-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2023.07-2-Linux-aarch64.sh#75967bc2113d9e336e670e1e557c9198d8b98e59fb9adb82cbe0e71ce5f7c2db" "anaconda" verify_py311 + ;; +"Linux-ppc64le" ) + install_script "Anaconda3-2023.07-2-Linux-ppc64le" "https://repo.anaconda.com/archive/Anaconda3-2023.07-2-Linux-ppc64le.sh#7a72e301fb3b8e175a96b6457fc84654dd2eb98942528d9988760779b92847e4" "anaconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Anaconda3-2023.07-2-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2023.07-2-Linux-s390x.sh#121743a62210249dd9fb9d6527d545d08f6bf6d2624d51ad4b5d168cb3e860d6" "anaconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2023.07-2-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.07-2-Linux-x86_64.sh#589fb34fe73bc303379abbceba50f3131254e85ce4e7cd819ba4276ba29cad16" "anaconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Anaconda3-2023.07-2-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2023.07-2-MacOSX-arm64.sh#8b08ca8a94dd5fda20d134fea13fa6c55c70d20d4b5a7a1c80d311aeb0cd7a88" "anaconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2023.07-2-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.07-2-MacOSX-x86_64.sh#a2f7d0c19f60d00742154db21bfb3976d82215ff58396353f4dc729828bd2f49" "anaconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2023.09-0 b/plugins/python-build/share/python-build/anaconda3-2023.09-0 new file mode 100644 index 0000000..5814121 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2023.09-0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Anaconda3-2023.09-0-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-aarch64.sh#69ee26361c1ec974199bce5c0369e3e9a71541de7979d2b9cfa4af556d1ae0ea" "anaconda" verify_py311 + ;; +"Linux-ppc64le" ) + install_script "Anaconda3-2023.09-0-Linux-ppc64le" "https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-ppc64le.sh#5ea1ed9808af95eb2655fe6a4ffdb66bea66ecd1d053fc2ee69eacc7685ef665" "anaconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Anaconda3-2023.09-0-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-s390x.sh#ee817071a2ad94e044fb48061a721bc86606b2f4906b705e4f42177eeb3ca7c5" "anaconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2023.09-0-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh#6c8a4abb36fbb711dc055b7049a23bbfd61d356de9468b41c5140f8a11abd851" "anaconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Anaconda3-2023.09-0-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2023.09-0-MacOSX-arm64.sh#34121775d9e30a6ea12af0a462e1881670b0c175b426e06fd7b1581625ebd69b" "anaconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2023.09-0-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.09-0-MacOSX-x86_64.sh#0c64a2c634fe31335079d97340c277c81b3f0c9dfe862a06599570640ac897a4" "anaconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2024.02-1 b/plugins/python-build/share/python-build/anaconda3-2024.02-1 new file mode 100644 index 0000000..498c79e --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2024.02-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Anaconda3-2024.02-1-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2024.02-1-Linux-aarch64.sh#28c5bed6fba84f418516e41640c7937514aabd55e929a8f66937c737303c7bba" "anaconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Anaconda3-2024.02-1-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2024.02-1-Linux-s390x.sh#3e2e8b17ea9a5caafd448f52e01435998b2e1ce102040a924d5bd6e05a1d735b" "anaconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2024.02-1-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2024.02-1-Linux-x86_64.sh#c536ddb7b4ba738bddbd4e581b29308cb332fa12ae3fa2cd66814bd735dff231" "anaconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Anaconda3-2024.02-1-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2024.02-1-MacOSX-arm64.sh#14a1c80af18c2c2e743e63cdb41228cd554a3fdb250563b6978348c80b6860f6" "anaconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2024.02-1-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2024.02-1-MacOSX-x86_64.sh#944aee9b90f7d8a2a997d0337cb37219757f22e76c10de38c7c68191c6b5b226" "anaconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2024.06-1 b/plugins/python-build/share/python-build/anaconda3-2024.06-1 new file mode 100644 index 0000000..2b85196 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2024.06-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Anaconda3-2024.06-1-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-aarch64.sh#b4be0ad2052236882402902a31d32cd37635d3db194a42f977be0d68a8ff1a31" "anaconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Anaconda3-2024.06-1-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-s390x.sh#1b3f4ef4147137fb1861f8251679ea96e651a7c405993c61e39441e43ee2dd11" "anaconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2024.06-1-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.sh#539bb43d9a52d758d0fdfa1b1b049920ec6f8c6d15ee9fe4a423355fe551a8f7" "anaconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Anaconda3-2024.06-1-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2024.06-1-MacOSX-arm64.sh#f9e0795431910ee4ac341c0cc2a0b62e6c497440789b4117c20736db45b34204" "anaconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2024.06-1-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2024.06-1-MacOSX-x86_64.sh#9b2aa48bfc58e337176d8b5f3776692815807e1346ec12ebcc46a01801bb4ee0" "anaconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2024.10-1 b/plugins/python-build/share/python-build/anaconda3-2024.10-1 new file mode 100644 index 0000000..cdc5d05 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2024.10-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Anaconda3-2024.10-1-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-aarch64.sh#489c608e8bddd2cf29dfbdd811cf99087cd6b6a0615d41c6f9058ce340594b65" "anaconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Anaconda3-2024.10-1-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-s390x.sh#e00bd5e6c275695e8050a45aa85790315f504c95243dfe3632f505284310f3c4" "anaconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2024.10-1-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh#3ba0a298155c32fbfd80cbc238298560bf69a2df511783054adfc151b76d80d8" "anaconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Anaconda3-2024.10-1-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2024.10-1-MacOSX-arm64.sh#f64ed797ce23ae1d07ead949bfb6ff630b9fa8269ca8aef8ea2efa82172ece47" "anaconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2024.10-1-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2024.10-1-MacOSX-x86_64.sh#ad3eea1cc969e9dfd4d571fc266aae06ec119f651d7cb19c0dc187b73e2bfab1" "anaconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2025.06-0 b/plugins/python-build/share/python-build/anaconda3-2025.06-0 new file mode 100644 index 0000000..f95f512 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2025.06-0 @@ -0,0 +1,22 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Anaconda3-2025.06-0-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2025.06-0-Linux-aarch64.sh#e6177f844f6156f07978c85b1f18ca3b7724d5ab5dba44b88a7f6b2452ba6271" "anaconda" verify_py313 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2025.06-0-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2025.06-0-Linux-x86_64.sh#08db13f6db5dd4f99b3a6db96c68d064d50ea23742013b70f588e3a27a5204da" "anaconda" verify_py313 + ;; +"MacOSX-arm64" ) + install_script "Anaconda3-2025.06-0-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2025.06-0-MacOSX-arm64.sh#195f234204e2f18803cea38bbebefcaac5a3d8d95e2e4ee106d1b87b23b9fc4a" "anaconda" verify_py313 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2025.06-0-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2025.06-0-MacOSX-x86_64.sh#8625a155ff1d2848afa360e70357e14c25f0ac7ac21e4e4bf15015bc58b08d06" "anaconda" verify_py313 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2025.06-1 b/plugins/python-build/share/python-build/anaconda3-2025.06-1 new file mode 100644 index 0000000..96278df --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2025.06-1 @@ -0,0 +1,22 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Anaconda3-2025.06-1-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2025.06-1-Linux-aarch64.sh#98dfb82732991f3f4d385a265da5fd2190d65ec31ceafa0b93f3c5edf4431a5b" "anaconda" verify_py313 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2025.06-1-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2025.06-1-Linux-x86_64.sh#82976426a2c91fe1453281def386f9ebebd8fdb45dc6c970b54cfef4e9120857" "anaconda" verify_py313 + ;; +"MacOSX-arm64" ) + install_script "Anaconda3-2025.06-1-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2025.06-1-MacOSX-arm64.sh#f9366a024ac6f043dc224986c54f1b4e1226e6ccb6291d83bdadb489f159d847" "anaconda" verify_py313 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2025.06-1-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2025.06-1-MacOSX-x86_64.sh#58139fe195337f3041259e3a611339ed3afa4d164cc9aa2a7e8e84c0673e3670" "anaconda" verify_py313 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2025.12-1 b/plugins/python-build/share/python-build/anaconda3-2025.12-1 new file mode 100644 index 0000000..b9b7253 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2025.12-1 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Anaconda3-2025.12-1-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2025.12-1-Linux-aarch64.sh#9ba6b32919dfd1964377a4ac5c5e4de645b6bd09efab4a25aaf6e121a60e525c" "anaconda" verify_py313 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2025.12-1-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2025.12-1-Linux-x86_64.sh#132f1f312d05e391906b959ad83aa411b97ece55966bb34df011ef41ba60a35c" "anaconda" verify_py313 + ;; +"MacOSX-arm64" ) + install_script "Anaconda3-2025.12-1-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2025.12-1-MacOSX-arm64.sh#f998f0918b9f06e08c3444f2b2c897fd3036da6725441ca064aa71ad47c75481" "anaconda" verify_py313 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-2025.12-2 b/plugins/python-build/share/python-build/anaconda3-2025.12-2 new file mode 100644 index 0000000..ebb6dfa --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2025.12-2 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Anaconda3-2025.12-2-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2025.12-2-Linux-aarch64.sh#be13a20f31d82508a061984fa3555369cfd8e4692643721415c19e7dc2e9e0f9" "anaconda" verify_py313 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2025.12-2-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2025.12-2-Linux-x86_64.sh#57b2b48cc5b8665e25fce7011f0389d47c1288288007844b3b1ba482d4f39029" "anaconda" verify_py313 + ;; +"MacOSX-arm64" ) + install_script "Anaconda3-2025.12-2-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2025.12-2-MacOSX-arm64.sh#8d0b858358456d4ee159feb0c4ee6d635590b777f8b9ffa4aa7553c469aae2b6" "anaconda" verify_py313 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-4.0.0 b/plugins/python-build/share/python-build/anaconda3-4.0.0 new file mode 100644 index 0000000..50583f4 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-4.0.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda3-4.0.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-4.0.0-Linux-x86.sh#e1469fa0d24de12f33661ce3d7a06d77968be8822f366a61a0018a3850ab56b0" "anaconda" verify_py35 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-4.0.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.0.0-Linux-x86_64.sh#36a558a1109868661a5735f5f32607643f6dc05cf581fefb1c10fb8abbe22f39" "anaconda" verify_py35 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-4.0.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.0.0-MacOSX-x86_64.sh#704a776c0cf3fcca6e0c5a1e6b6043728229cfac813bff28f003157771824036" "anaconda" verify_py35 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-4.1.0 b/plugins/python-build/share/python-build/anaconda3-4.1.0 new file mode 100644 index 0000000..c27c3de --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-4.1.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda3-4.1.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-4.1.0-Linux-x86.sh#7764093f337a43e4962b12d01508c1a385f0f62c1ddc006b69af95ae763fc4c2" "anaconda" verify_py35 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-4.1.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.1.0-Linux-x86_64.sh#11d32cf4026603d3b327dc4299863be6b815905ff51a80329085e1bb9f96c8bd" "anaconda" verify_py35 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-4.1.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.1.0-MacOSX-x86_64.sh#4c45c8d75665fa5194ebe4e355d3427f5aa385f77eb2b5002c0c78d8ae7f2200" "anaconda" verify_py35 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-4.1.1 b/plugins/python-build/share/python-build/anaconda3-4.1.1 new file mode 100644 index 0000000..0a99791 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-4.1.1 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda3-4.1.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-4.1.1-Linux-x86.sh#931626363f4030c7a1e8897549b1d3589dc3f429874dc3dd8a79869ecf5c895c" "anaconda" verify_py35 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-4.1.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.1.1-Linux-x86_64.sh#4f5c95feb0e7efeadd3d348dcef117d7787c799f24b0429e45017008f3534e55" "anaconda" verify_py35 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-4.1.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.1.1-MacOSX-x86_64.sh#7c3c06e9281c41f1213d357cb5f233fd99d6d0db6bdba8d9fd7cfad1f1a85df9" "anaconda" verify_py35 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-4.2.0 b/plugins/python-build/share/python-build/anaconda3-4.2.0 new file mode 100644 index 0000000..2805e22 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-4.2.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda3-4.2.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-4.2.0-Linux-x86.sh#1a8320635f2f06ec9d8610e77d6d0f9cb2c5d11d20a4ff7fcda113e04b0a8a50" "anaconda" verify_py35 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-4.2.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.2.0-Linux-x86_64.sh#73b51715a12b6382dd4df3dd1905b531bd6792d4aa7273b2377a0436d45f0e78" "anaconda" verify_py35 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-4.2.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.2.0-MacOSX-x86_64.sh#95448921601e1952e01a17ba9767cd3621c154af7fc52dd6b7f57d462155a358" "anaconda" verify_py35 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-4.3.0 b/plugins/python-build/share/python-build/anaconda3-4.3.0 new file mode 100644 index 0000000..ebe9ea4 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-4.3.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda3-4.3.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-4.3.0-Linux-x86.sh#f7ce2eeec3e42c2ba1ee3b9fcd670478fd30f4be547c6e0a675d183c4ca9dd9b" "anaconda" verify_py36 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-4.3.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.3.0-Linux-x86_64.sh#e9169c3a5029aa820393ac92704eb9ee0701778a085ca7bdc3c57b388ac1beb6" "anaconda" verify_py36 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-4.3.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.3.0-MacOSX-x86_64.sh#c53059b810c5e7a9a5ef9c46a7ed76675dfc7183f4ea867b4d81449cbd5a093d" "anaconda" verify_py36 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-4.3.1 b/plugins/python-build/share/python-build/anaconda3-4.3.1 new file mode 100644 index 0000000..b4623ca --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-4.3.1 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda3-4.3.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-4.3.1-Linux-x86.sh#7b70bdba282a18ddbdc167afe8131f7532076cb1df8d3fbbd13e79ca3afaa2c1" "anaconda" verify_py36 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-4.3.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.3.1-Linux-x86_64.sh#4447b93d2c779201e5fb50cfc45de0ec96c3804e7ad0fe201ab6b99f73e90302" "anaconda" verify_py36 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-4.3.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.3.1-MacOSX-x86_64.sh#a42267203e207cb5e0f539e0d879ead12e436311825c7114d0edd880d001b539" "anaconda" verify_py36 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-4.4.0 b/plugins/python-build/share/python-build/anaconda3-4.4.0 new file mode 100644 index 0000000..2e99aa4 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-4.4.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda3-4.4.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-4.4.0-Linux-x86.sh#b0e492206d43067314b25963bc7d1f012096ca0323b7629f4ebcd071b03905b5" "anaconda" verify_py36 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-4.4.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.4.0-Linux-x86_64.sh#3301b37e402f3ff3df216fe0458f1e6a4ccbb7e67b4d626eae9651de5ea3ab63" "anaconda" verify_py36 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-4.4.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-4.4.0-MacOSX-x86_64.sh#10fe58f09ae524df2548d17b8bb1e75db17da597a6ec10d695ce01387a2d7422" "anaconda" verify_py36 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-5.0.0 b/plugins/python-build/share/python-build/anaconda3-5.0.0 new file mode 100644 index 0000000..16db366 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-5.0.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda3-5.0.0.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-5.0.0.1-Linux-x86.sh#407576899d3aa546bc3c2c4a13cbc18ab5bab372c3388ea80087f29b32184bee" "anaconda" verify_py36 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-5.0.0.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-5.0.0.1-Linux-x86_64.sh#092c92427f44687d789a41922ce8426fbdc3c529cc9d6d4ee6de5b62954b93b2" "anaconda" verify_py36 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-5.0.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-5.0.0-MacOSX-x86_64.sh#23df1e3a38a6b4aaa0ab559d0c1e51be76eca5d75cb595d473d223c8d17e762d" "anaconda" verify_py36 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-5.0.1 b/plugins/python-build/share/python-build/anaconda3-5.0.1 new file mode 100644 index 0000000..5293e9d --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-5.0.1 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda3-5.0.1-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86.sh#991a4b656fcb0236864fbb27ff03bb7f3d98579205829b76b66f65cfa6734240" "anaconda" verify_py36 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-5.0.1-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh#55e4db1919f49c92d5abbf27a4be5986ae157f074bf9f8238963cd4582a4068a" "anaconda" verify_py36 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-5.0.1-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-5.0.1-MacOSX-x86_64.sh#f438a0af923bc1edc7bca53f496c59a668d1a08b48c768f443ad7f5ea2b8b3f8" "anaconda" verify_py36 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-5.1.0 b/plugins/python-build/share/python-build/anaconda3-5.1.0 new file mode 100644 index 0000000..bde3797 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-5.1.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda3-5.1.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-5.1.0-Linux-x86.sh#0e940272517d8f8a6f26316a19e4be2bdaea8477a3a32cc2ecee7b48fd0fae84" "anaconda" verify_py36 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-5.1.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-5.1.0-Linux-x86_64.sh#7e6785caad25e33930bc03fac4994a434a21bc8401817b7efa28f53619fa9c29" "anaconda" verify_py36 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-5.1.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-5.1.0-MacOSX-x86_64.sh#be705b3c3a0ca29ee32ce7658890bb5edb32a9eadedc09dec3d7e3cfbfd23cb7" "anaconda" verify_py36 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-5.2.0 b/plugins/python-build/share/python-build/anaconda3-5.2.0 new file mode 100644 index 0000000..eb30956 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-5.2.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda3-5.2.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-5.2.0-Linux-x86.sh#f3527d085d06f35b6aeb96be2a9253ff9ec9ced3dc913c8e27e086329f3db588" "anaconda" verify_py36 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-5.2.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-5.2.0-Linux-x86_64.sh#09f53738b0cd3bb96f5b1bac488e5528df9906be2480fe61df40e0e0d19e3d48" "anaconda" verify_py36 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-5.2.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-5.2.0-MacOSX-x86_64.sh#c8089121dc89ffe8f9a0c01205bab75a112821a13d413152d6690f5eef094afa" "anaconda" verify_py36 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-5.3.0 b/plugins/python-build/share/python-build/anaconda3-5.3.0 new file mode 100644 index 0000000..97afce5 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-5.3.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda3-5.3.0-Linux-x86" "https://repo.continuum.io/archive/Anaconda3-5.3.0-Linux-x86.sh#c15ffac2ae35179a15dc5872e5bb405b4027a0fd76c6817e9cee39545bc5ca0b" "anaconda" verify_py36 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-5.3.0-Linux-x86_64" "https://repo.continuum.io/archive/Anaconda3-5.3.0-Linux-x86_64.sh#cfbf5fe70dd1b797ec677e63c61f8efc92dad930fd1c94d60390bb07fdc09959" "anaconda" verify_py36 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-5.3.0-MacOSX-x86_64" "https://repo.continuum.io/archive/Anaconda3-5.3.0-MacOSX-x86_64.sh#bc073b6e6d3b2ef29d01a2caf1de7c206c95968231ef0492d958eae1a314b4e9" "anaconda" verify_py36 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/anaconda3-5.3.1 b/plugins/python-build/share/python-build/anaconda3-5.3.1 new file mode 100644 index 0000000..b018813 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-5.3.1 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Anaconda3-5.3.1-Linux-x86.sh" "https://repo.continuum.io/archive/Anaconda3-5.3.1-Linux-x86.sh#5dab8b2c95595df7fa55b88643f8372135c14faabd9ec05a34021551bb0999a1" "anaconda" verify_py36 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-5.3.1-Linux-x86_64.sh" "https://repo.continuum.io/archive/Anaconda3-5.3.1-Linux-x86_64.sh#d4c4256a8f46173b675dd6a62d12f566ed3487f932bab6bb7058f06c124bcc27" "anaconda" verify_py36 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-5.3.1-MacOSX-x86_64.sh" "https://repo.continuum.io/archive/Anaconda3-5.3.1-MacOSX-x86_64.sh#23c373abce2463d4df495f5a1c7e8b0faec6eda09542d98f41ed65a0fa0dbde0" "anaconda" verify_py36 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/cinder-3.10-dev b/plugins/python-build/share/python-build/cinder-3.10-dev new file mode 100644 index 0000000..7d83cd6 --- /dev/null +++ b/plugins/python-build/share/python-build/cinder-3.10-dev @@ -0,0 +1,43 @@ +if [ "$(expr substr "$(uname -s)" 1 5)" != "Linux" ]; then + { + echo + colorize 1 "ERROR" + echo ": Cinder currently only supports Linux." + echo + return 1 + } >&2 +fi + +if [[ $(${CC:-gcc} -dumpversion 2>/dev/null) != 10 ]] && + (command -v "gcc-10" >/dev/null) && + (command -v "g++-10" >/dev/null); then + echo "python-build: setting the compiler to GCC 10" + export CC="gcc-10" + export CXX="g++-10" +fi + +if [[ $(awk -F. '{print $1}' <<< "$(${CC:-gcc} -dumpversion)") -lt 10 ]]; then + { + echo + colorize 1 "ERROR" + echo ": Cinder requires at least GCC 10." + echo + return 1 + } >&2 +fi + +require_distro Fedora 32 &> /dev/null || + { + echo + colorize 1 "WARNING" + echo ": Cinder officially only supports Facebook's Docker" + echo "images which are based on Fedora 32. It may fail to build" + echo "on a system with a different GCC and/or Glibc version." + echo + } >&2 + +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_git "Cinder-3.10-dev" "https://github.com/facebookincubator/cinder" "cinder/3.10" standard verify_py310 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/cinder-3.8-dev b/plugins/python-build/share/python-build/cinder-3.8-dev new file mode 100644 index 0000000..4d8a8a7 --- /dev/null +++ b/plugins/python-build/share/python-build/cinder-3.8-dev @@ -0,0 +1,43 @@ +if [ "$(expr substr "$(uname -s)" 1 5)" != "Linux" ]; then + { + echo + colorize 1 "ERROR" + echo ": Cinder currently only supports Linux." + echo + return 1 + } >&2 +fi + +if [[ $(${CC:-gcc} -dumpversion 2>/dev/null) != 10 ]] && + (command -v "gcc-10" >/dev/null) && + (command -v "g++-10" >/dev/null); then + echo "python-build: setting the compiler to GCC 10" + export CC="gcc-10" + export CXX="g++-10" +fi + +if [[ $(awk -F. '{print $1}' <<< "$(${CC:-gcc} -dumpversion)") -lt 10 ]]; then + { + echo + colorize 1 "ERROR" + echo ": Cinder requires at least GCC 10." + echo + return 1 + } >&2 +fi + +require_distro Fedora 32 &> /dev/null || + { + echo + colorize 1 "WARNING" + echo ": Cinder officially only supports Facebook's Docker" + echo "images which are based on Fedora 32. It may fail to build" + echo "on a system with a different GCC and/or Glibc version." + echo + } >&2 + +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_git "Cinder-3.8-dev" "https://github.com/facebookincubator/cinder" "cinder/3.8" standard verify_py38 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-22.3.0 b/plugins/python-build/share/python-build/graalpy-22.3.0 new file mode 100644 index 0000000..41f592e --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-22.3.0 @@ -0,0 +1,54 @@ +# Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='22.3.0' +BUILD='' + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="9853036fcde0b115026d8802a4f671b62d7a17fccb269c1e8b5fbf80cef10e23" + ;; +"linux-aarch64" ) + checksum="c48c5d9ff5699046c0629181a40a3116172e1c508c851f0993dcca45d86349c0" + ;; +"macos-amd64" ) + checksum="cc8454f460b5730e778d5b8f79385cf92c39321fbf27d44bb9ca90584670f921" + ;; +"macos-aarch64" ) + checksum="9a388834f28fbb86ff9588d9a150a4d26e9bec28be06c3d60ebe20079f855e41" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + urlprefix="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-${BUILD}" +else + urlprefix="https://github.com/oracle/graalpython/releases/download/vm-${VERSION}" +fi + +install_package "graalpy-${VERSION}${BUILD}" "${urlprefix}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-23.0.0 b/plugins/python-build/share/python-build/graalpy-23.0.0 new file mode 100644 index 0000000..abdb1d9 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-23.0.0 @@ -0,0 +1,54 @@ +# Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='23.0.0' +BUILD='' + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="25e4fa7c1d45db6dcac5bfa4d1a0aa9ef5581623dc5903ce98d246c5d394639c" + ;; +"linux-aarch64" ) + checksum="e2a00b2b6485282b4a04aa382e30d696e00d20eb2fe1736debbe2d9df2a8737a" + ;; +"macos-amd64" ) + checksum="1578902976e6aaf45b9758931f0bddbb29c5c9bdca62c67591d6e153340c2a4f" + ;; +"macos-aarch64" ) + checksum="cc40e1d47610c5f4a825a1a7c3ffe8b163c71b5d042d16aebd1a65451d4309a5" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + urlprefix="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-${BUILD}" +else + urlprefix="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}" +fi + +install_package "graalpy-${VERSION}${BUILD}" "${urlprefix}/graalpython-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-23.1.0 b/plugins/python-build/share/python-build/graalpy-23.1.0 new file mode 100644 index 0000000..c7915da --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-23.1.0 @@ -0,0 +1,63 @@ +# Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='23.1.0' +BUILD='' + +colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo +colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo +colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-23.1.0" && echo + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="afbb81f034e77aecf4717fe14f2a7403aa1b82f0abf53a2e55e46bd49efe8c39" + ;; +"linux-aarch64" ) + checksum="be1e21ea245ddbdb9c266e670d6f1e76a55c693f98cee44aa74a76b249e53f96" + ;; +"macos-amd64" ) + checksum="6445537c597567ccf5ae37d296ecd988a92149fb4a1fb57088811e75f19c6da4" + ;; +"macos-aarch64" ) + checksum="f1b9b22cd8c0afb7eabd59fad554c23f452fbafcdffccf8a22eca037199d62ae" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + { echo + colorize 1 "ERROR" + echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." + echo + } >&2 + exit 1 +fi + +url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" + +install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-23.1.2 b/plugins/python-build/share/python-build/graalpy-23.1.2 new file mode 100644 index 0000000..50d39a6 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-23.1.2 @@ -0,0 +1,64 @@ +# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='23.1.2' +BUILD='' + +colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo +colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo +colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-23.1.2" && echo + + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="ea9c61845968dd396f57bbb6bb6ccf1608b198dffd99c6fe2e5c03d836e40a74" + ;; +"linux-aarch64" ) + checksum="715cc67f551a009a04814e7201bc33e629ba6c329e7d32c265a3ebf8619f4a66" + ;; +"macos-amd64" ) + checksum="e9e5977077ef4986fce0f8416b81c1c468add9f3f123edfb223b54a5d34a95c6" + ;; +"macos-aarch64" ) + checksum="46c859233c7c5ce44fc44e97f17a1685dc3f8516785c2e419f8661ed7b5185b1" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + { echo + colorize 1 "ERROR" + echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." + echo + } >&2 + exit 1 +fi + +url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" + +install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-24.0.0 b/plugins/python-build/share/python-build/graalpy-24.0.0 new file mode 100644 index 0000000..d71e70f --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-24.0.0 @@ -0,0 +1,64 @@ +# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.0.0' +BUILD='' + +colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo +colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo +colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo + + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="f0d194dea76da26093b9b01b78c0fcabbd8714640b08fcd2a9b05b9ded3e2039" + ;; +"linux-aarch64" ) + checksum="5bf0fd9d115c3ecd6bfb89a2fac7b9ba9343841c3928d14eac471b9b1ad1266e" + ;; +"macos-amd64" ) + checksum="1e2e51ea618bd6f6fe9a0248486b5962f6258193249c0657dc0480fd2b92d772" + ;; +"macos-aarch64" ) + checksum="d5597711839a41506beb129f9d8015f8997a1db1e0c79972636834d955d4ef61" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + { echo + colorize 1 "ERROR" + echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." + echo + } >&2 + exit 1 +fi + +url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" + +install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-24.1.0 b/plugins/python-build/share/python-build/graalpy-24.1.0 new file mode 100644 index 0000000..2af5024 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-24.1.0 @@ -0,0 +1,64 @@ +# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.1.0' +BUILD='' + +colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo +colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo +colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo + + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="95819091eee7c21566601c22536768204b7c75e9b59e522a10961612a1dd6298" + ;; +"linux-aarch64" ) + checksum="838662e07ce745708d58a50e5e030f9af608306c4595adb3a8e7ac1f6e7d8b6a" + ;; +"macos-amd64" ) + checksum="4bee92fdf97ef9e2f9a8dfc56030b9f40860019bf57c9cd097a4b86baaf31d94" + ;; +"macos-aarch64" ) + checksum="520888b407e47c8bbc91b0830d540a1eb1a6919ad0ce5be3e657e54f77ee0fba" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + { echo + colorize 1 "ERROR" + echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." + echo + } >&2 + exit 1 +fi + +url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" + +install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-24.1.1 b/plugins/python-build/share/python-build/graalpy-24.1.1 new file mode 100644 index 0000000..332b7f3 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-24.1.1 @@ -0,0 +1,64 @@ +# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.1.1' +BUILD='' + +colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo +colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo +colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo + + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="b7ec8b6ead8f0ad19d212617f75c305b38d419bfd3ac6c9e82e9339282699ab9" + ;; +"linux-aarch64" ) + checksum="cb97bbef83372f00c7ea5f351bcb3c1ad36255ebd7d3cff9267d604ad183c28a" + ;; +"macos-amd64" ) + checksum="3f4583cf8438237a2061460d4df9025d04eaaae0beadb3626ccdcebf9cfe725a" + ;; +"macos-aarch64" ) + checksum="23d2397d90ebbd51747541f029ed80b7740fe36b23a45d4616ddad9b60f2c6cb" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + { echo + colorize 1 "ERROR" + echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." + echo + } >&2 + exit 1 +fi + +url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" + +install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-24.1.2 b/plugins/python-build/share/python-build/graalpy-24.1.2 new file mode 100644 index 0000000..21655a6 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-24.1.2 @@ -0,0 +1,64 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.1.2' +BUILD='' + +colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo +colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo +colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo + + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="859292dddb7deb47280e445afa61aa58326900e15fbf0d3fa8044f1a1ce23594" + ;; +"linux-aarch64" ) + checksum="5ad46ba7ef58f2b3871cb99aa244ef9bf6e6e4206770e027603e3c323ba3e67b" + ;; +"macos-amd64" ) + checksum="e2eed01618ae788b24e01ab423ff27382e15faa1ecb7c8eb7e9809b022c74fe8" + ;; +"macos-aarch64" ) + checksum="daa1fa51129f1bc4e5f0f2251ce7d0e039019eb9569579bb41aaa905407fa6a3" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + { echo + colorize 1 "ERROR" + echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." + echo + } >&2 + exit 1 +fi + +url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" + +install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-24.2.0 b/plugins/python-build/share/python-build/graalpy-24.2.0 new file mode 100644 index 0000000..05d212a --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-24.2.0 @@ -0,0 +1,64 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.2.0' +BUILD='' + +colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo +colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo +colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo + + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="06381ebe89a242bbb66afdc7dc35d21ae537f7eb130f16db1f0e94c2a65249ba" + ;; +"linux-aarch64" ) + checksum="a80f4fe8c4b2ad53af6e5090bab462c7d0797b9b281e35bfc8284b703610c5cf" + ;; +"macos-amd64" ) + checksum="dafd706de39041887d016ef84413f5252d085b03ad47a44a6f680f40ed1a87e4" + ;; +"macos-aarch64" ) + checksum="108ad4c15b814aecc5b69b83a10a3a5e8982c656c4b639740d034a4783eb3839" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + { echo + colorize 1 "ERROR" + echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." + echo + } >&2 + exit 1 +fi + +url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" + +install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-24.2.1 b/plugins/python-build/share/python-build/graalpy-24.2.1 new file mode 100644 index 0000000..0cf664d --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-24.2.1 @@ -0,0 +1,64 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.2.1' +BUILD='' + +colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo +colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo +colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo + + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="55872af24819cb99efa2338db057aeda0c8f9dd412a4a6f5ea19b256ee82fd9e" + ;; +"linux-aarch64" ) + checksum="2a80800a76ee6b737d6458ba9ab30ce386dfdd5b2b2bec3ee6bc51fd8e51e7c2" + ;; +"macos-amd64" ) + checksum="4bc42b36117c9ab09c4f411ec5a7a85ed58521dd20b529d971bb0ed3d0b7c363" + ;; +"macos-aarch64" ) + checksum="61e11d5176d5bb709b919979ef3525f4db1e39c404b59aa54d887f56bf8fab44" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + { echo + colorize 1 "ERROR" + echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." + echo + } >&2 + exit 1 +fi + +url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" + +install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-24.2.2 b/plugins/python-build/share/python-build/graalpy-24.2.2 new file mode 100644 index 0000000..04bb87f --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-24.2.2 @@ -0,0 +1,64 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.2.2' +BUILD='' + +colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo +colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo +colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo + + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="604b7abf6c58038a30866e52da43818af63bcd97909af8b1a96523c7f0e01414" + ;; +"linux-aarch64" ) + checksum="c9be459ab9479892b88dd63f8f88cbc7b1067f4cb27ff17f4761b36de6bd73af" + ;; +"macos-amd64" ) + checksum="2f4d5e7dbdf90e38778dfcb8ca3e1ec7eee257ef726b1937d5bc91b54cdddf9b" + ;; +"macos-aarch64" ) + checksum="f4a2ae01bae0fa53ec0d19f86d73c6dcc2a162d245552030183b84bfdd8f7635" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + { echo + colorize 1 "ERROR" + echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." + echo + } >&2 + exit 1 +fi + +url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" + +install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-25.0.0 b/plugins/python-build/share/python-build/graalpy-25.0.0 new file mode 100644 index 0000000..d135cb5 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-25.0.0 @@ -0,0 +1,64 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='25.0.0' +BUILD='' + +colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo +colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo +colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo + + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="8ca62fc996b4dcad146ff37139d22a8478959bde73789bfdd1e396287cd09dff" + ;; +"linux-aarch64" ) + checksum="e0008c00e8e925268d592de808839d913609e9f29b0e0dd9b69c795aabb64e2a" + ;; +"macos-amd64" ) + checksum="1709a02b2abc93cf698b95ddd6d8bbf43ddc7b268b09a9e5bced4e637d37369f" + ;; +"macos-aarch64" ) + checksum="4dfff34a4cfeb2c11441ce807c455719945b7f580bdec47d36daba342925a413" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + { echo + colorize 1 "ERROR" + echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." + echo + } >&2 + exit 1 +fi + +url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" + +install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-25.0.1 b/plugins/python-build/share/python-build/graalpy-25.0.1 new file mode 100644 index 0000000..8d4e3ab --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-25.0.1 @@ -0,0 +1,64 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='25.0.1' +BUILD='' + +colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo +colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo +colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo + + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="b5baff786753ebb774300fcf68a9bca4d14cbb8099f055637bee11786abb2d57" + ;; +"linux-aarch64" ) + checksum="f3315d1a3f13e7fcd785d0ca9b954d251da5f5d0dedae094c28a0566a239e4fd" + ;; +"macos-amd64" ) + checksum="10b0721d52397f0cc85f038900318da2203711cbcfae7899e3faed49d3dc6221" + ;; +"macos-aarch64" ) + checksum="389e0732f4d79e30335b70d41b6e8a2d769b435512fcb41675eb3dce4fc4d014" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + { echo + colorize 1 "ERROR" + echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." + echo + } >&2 + exit 1 +fi + +url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" + +install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-25.0.2 b/plugins/python-build/share/python-build/graalpy-25.0.2 new file mode 100644 index 0000000..883906f --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-25.0.2 @@ -0,0 +1,61 @@ +# Copyright (c) 2026, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='25.0.2' +BUILD='' + +colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo +colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo +colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo + + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="8967e4bae1c5040d62dbc98976f2099d5c36c00a79944e99b848d455e618ecdf" + ;; +"linux-aarch64" ) + checksum="805f3526296e04692b27ca001ba97674e53d0f036412d9ffc29aeb8b51517ab6" + ;; +"macos-aarch64" ) + checksum="c771688b8636932026180bdd9b5e3d6116316fa868faf7e602a60ba020c7bade" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + { echo + colorize 1 "ERROR" + echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." + echo + } >&2 + exit 1 +fi + +url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" + +install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-community-23.1.0 b/plugins/python-build/share/python-build/graalpy-community-23.1.0 new file mode 100644 index 0000000..ff46e4d --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-community-23.1.0 @@ -0,0 +1,54 @@ +# Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='23.1.0' +BUILD='' + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="720334d90d52b5337db018ad6582953e9383c27188f08810250c2fe14a11db5a" + ;; +"linux-aarch64" ) + checksum="c7dc4f94413e667070f7d46f57af04c4db53383e721be9637b58cb030dfa1f58" + ;; +"macos-amd64" ) + checksum="13583382ba716231edce1b71d53e9efba776fef003ef2f515bda9c00a831779a" + ;; +"macos-aarch64" ) + checksum="5bc39af6938c507ec169b02a34237b6f4b286982e5be04b3109c171becc1949d" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" +else + url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" +fi + +install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-community-23.1.2 b/plugins/python-build/share/python-build/graalpy-community-23.1.2 new file mode 100644 index 0000000..6b28b4b --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-community-23.1.2 @@ -0,0 +1,54 @@ +# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='23.1.2' +BUILD='' + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="27577bded9dd742c7b9b8e5315cec286657edb5842968cc966aa451ddc8729d9" + ;; +"linux-aarch64" ) + checksum="c993484132b9e196d351570ba6a74632eb8695767e383ca86ba1092c4484ff7a" + ;; +"macos-amd64" ) + checksum="e74d586f114b33e55e1a6849672e1a0ea5bd372d8f4a501b532d221c61915d3c" + ;; +"macos-aarch64" ) + checksum="d269f5fdb3e8ae323554de2876ef25d43aaa86867edc41f2b76ea53a27ee3662" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" +else + url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" +fi + +install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-community-24.0.0 b/plugins/python-build/share/python-build/graalpy-community-24.0.0 new file mode 100644 index 0000000..c232316 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-community-24.0.0 @@ -0,0 +1,54 @@ +# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.0.0' +BUILD='' + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="a77892d8d6b897b70b4226aa1b6abc8c41e824ae98d727429542b0157ae6f8d9" + ;; +"linux-aarch64" ) + checksum="201e2bad0ed59efc89654a77ae1634302111b3ffb9af53f9ee63ab43b735e5c3" + ;; +"macos-amd64" ) + checksum="7c816beb8c8b46ee0de60861f739c274efbc744304aa9034bffbd0319f13701d" + ;; +"macos-aarch64" ) + checksum="7f5540a28cf5c2c628cd003c3eb86bfa0a07175dae7d9b6528b40c44c4927402" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" +else + url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" +fi + +install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-community-24.1.0 b/plugins/python-build/share/python-build/graalpy-community-24.1.0 new file mode 100644 index 0000000..b2b48ec --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-community-24.1.0 @@ -0,0 +1,54 @@ +# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.1.0' +BUILD='' + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="89c7f8bd8f91639adc815949458d56ea9bffaa286249360d244fc6a6885c220a" + ;; +"linux-aarch64" ) + checksum="8f52958486606328a9692a0c0553f2cd3afd1c86c9df97ae47a703afc2e804a8" + ;; +"macos-amd64" ) + checksum="1b01102ca9cbfe8164e935ca834226db76e8ca9359a5585ba686430593cbc02d" + ;; +"macos-aarch64" ) + checksum="cd0d6064bbb4f92d50d2b85ed46f6a9c22a5ae775f15cc264508da8f026eecaa" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" +else + url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" +fi + +install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-community-24.1.1 b/plugins/python-build/share/python-build/graalpy-community-24.1.1 new file mode 100644 index 0000000..1fbbd4f --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-community-24.1.1 @@ -0,0 +1,54 @@ +# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.1.1' +BUILD='' + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="42a6b563271174161a1abca4b045b0602d8e27c12204f3cadd31265fd3ff6d19" + ;; +"linux-aarch64" ) + checksum="a513ea3036a48a6cee8cfa666bff7b5e6b1a1b6cf623400109fbf856476e9bd3" + ;; +"macos-amd64" ) + checksum="7f5591074dbd701faa6dec6ea10391bc2d8af736fe8370c5675a11842959edd7" + ;; +"macos-aarch64" ) + checksum="53f6161d0f9871efaf1f62f2c1894152da0bb2b504a95ebad6f35b19de994f77" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" +else + url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" +fi + +install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-community-24.1.2 b/plugins/python-build/share/python-build/graalpy-community-24.1.2 new file mode 100644 index 0000000..fccdffc --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-community-24.1.2 @@ -0,0 +1,54 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.1.2' +BUILD='' + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="d1bf37fb9edf8065e6dab4f351d2006acaff2b2e692cfaea07199380c892ee0c" + ;; +"linux-aarch64" ) + checksum="2568d5f7f3b9d8827de33eb864783c1fed4bc3e729a6fd14e072311c5105346f" + ;; +"macos-amd64" ) + checksum="29f9f19604bf2f7d255add89fa5639d6aab6877799414cb820398fed8ef3d5bb" + ;; +"macos-aarch64" ) + checksum="dcc4fa73cdb866e88c51219ddf9b9689b62633fc8304649372fe8ada4e03957d" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" +else + url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" +fi + +install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-community-24.2.0 b/plugins/python-build/share/python-build/graalpy-community-24.2.0 new file mode 100644 index 0000000..7f10274 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-community-24.2.0 @@ -0,0 +1,54 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.2.0' +BUILD='' + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="a3be9d91af186e270819cd3983507e073eeba33a303c5e5bec05ed1ac6078262" + ;; +"linux-aarch64" ) + checksum="6d5792eaebdf7847e1e75089f5d1f15f3762e55b8c69ea5631108c0e737cbf45" + ;; +"macos-amd64" ) + checksum="4a16be069341bdb3597d39c09eb11bfb994504f1c4c4b114cbb4489555229b6f" + ;; +"macos-aarch64" ) + checksum="bed8b15bc260a899766a2051d87c6fe9172c30751fa9c2e9a7ea2f5c8c49b781" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" +else + url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" +fi + +install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-community-24.2.1 b/plugins/python-build/share/python-build/graalpy-community-24.2.1 new file mode 100644 index 0000000..ca2ee6d --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-community-24.2.1 @@ -0,0 +1,54 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.2.1' +BUILD='' + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="96c1f332604f8425df0bb694d435d932cdf21c302e452cd10cf78a1626ba90a0" + ;; +"linux-aarch64" ) + checksum="676eefe6011a1a2c01997c7a3cea92817f0d9de7e608d561eb5255a1e5350eff" + ;; +"macos-amd64" ) + checksum="0d0a50cc93457bdebab992af287a275d0b364fcbd90b68cdf08ae9c64e3a1aca" + ;; +"macos-aarch64" ) + checksum="ec31fc1f024938e6dc193013a365c23ad3d532498c93c80c3af607a853964909" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" +else + url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" +fi + +install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-community-24.2.2 b/plugins/python-build/share/python-build/graalpy-community-24.2.2 new file mode 100644 index 0000000..a2a13e5 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-community-24.2.2 @@ -0,0 +1,54 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.2.2' +BUILD='' + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="384642677b76c26d6be1cf6bce2bc94d49df53845dd506414d95e2322bc9ac5d" + ;; +"linux-aarch64" ) + checksum="b91dbf13945443320c7ed0c806af174689f94125b5708d3818cbd8d99ee18b40" + ;; +"macos-amd64" ) + checksum="46b8800a675f27745705c4db363306836fd7e706d4c01d75582f535ed1cea6c0" + ;; +"macos-aarch64" ) + checksum="c280e6c629c45e00bd91f038c001ce02956e92ad206e6582c2a1634751695468" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" +else + url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" +fi + +install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-community-25.0.0 b/plugins/python-build/share/python-build/graalpy-community-25.0.0 new file mode 100644 index 0000000..92ce671 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-community-25.0.0 @@ -0,0 +1,54 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='25.0.0' +BUILD='' + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="628d5e2af40b2a3ca694bbea169388394dd30fe0727a3f1b4c92319d7bb788d5" + ;; +"linux-aarch64" ) + checksum="7065492dea48a31adb5894379cd35acfd479c5a4158f3496f1485adedacf9bbb" + ;; +"macos-amd64" ) + checksum="1b866e651f0016cfdc8d5d4f8e64023cd26024755d4fe5bef86d02f1a9b701ec" + ;; +"macos-aarch64" ) + checksum="cec1e964f75ca5e881830e8670acea9486d589c1db909adf2ba974f16650bb58" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" +else + url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" +fi + +install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-community-25.0.1 b/plugins/python-build/share/python-build/graalpy-community-25.0.1 new file mode 100644 index 0000000..abd5556 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-community-25.0.1 @@ -0,0 +1,54 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='25.0.1' +BUILD='' + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="5ac049e3e13a9b04eead81851e59dfc794278ffec1933ff429378c1a70c88d32" + ;; +"linux-aarch64" ) + checksum="2ea15f932e6e25b21edd0a2713b294ce91c1dca571414fcdff297028f1313de5" + ;; +"macos-amd64" ) + checksum="f7834df0a7c5087de746ae0b0143eda8cfc456c34ddccdc64817491a10e5294b" + ;; +"macos-aarch64" ) + checksum="f89b15b75f456240089dd50e06128aa7357371ee85098a04dc4a4cd34a65f0c9" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" +else + url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" +fi + +install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-community-25.0.2 b/plugins/python-build/share/python-build/graalpy-community-25.0.2 new file mode 100644 index 0000000..bf8b7e2 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-community-25.0.2 @@ -0,0 +1,51 @@ +# Copyright (c) 2026, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='25.0.2' +BUILD='' + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="8db86f13c0b701bab0780e8821052a40303c08b83fdc9c21da06605d14d4cc79" + ;; +"linux-aarch64" ) + checksum="98f7b9dea867c45cde5c2886b7544bd267242b2fa93586f2c9d3d38e88d5d109" + ;; +"macos-aarch64" ) + checksum="c64bef17f34d42327d5c3fe40c05eddf791c3653cc8366f6bf1149b51ce9d517" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" +else + url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" +fi + +install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-dev b/plugins/python-build/share/python-build/graalpy-dev new file mode 100644 index 0000000..3c5aeeb --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-dev @@ -0,0 +1,54 @@ +# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +JSON_URL=https://raw.githubusercontent.com/graalvm/graal-languages-ea-builds/main/graalpy/versions/latest-ea.json + +colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo +colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo +colorize 1 "Release builds of the GraalVM Community Edition variant of GraalPy are available, with names starting with graalpy-community-" && echo + +json=`http get "$JSON_URL"` +version=`expr "$json" : '{.*"version":[^"]*"\([^"]*\)'` +base_url=`expr "$json" : '{.*"download_base_url":[^"]*"\([^"]*\)'` + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + ;; +"linux-aarch64" ) + ;; +"macos-amd64" ) + ;; +"macos-aarch64" ) + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +url="${base_url}/graalpy-${version}-${graalpy_arch}.tar.gz" + +install_package "graalpy-${version}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpython-20.1.0 b/plugins/python-build/share/python-build/graalpython-20.1.0 new file mode 100644 index 0000000..9946f56 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpython-20.1.0 @@ -0,0 +1,48 @@ +# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='20.1.0' +BUILD='' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux64" ) + graalpython_arch="linux" + checksum="8df5d3797876d63e5b0fed6460b1943d53160fa3c3a589d0c1ce68c23646dd93" + ;; +"osx64" ) + graalpython_arch="macos" + checksum="7fe5aca69a64fd411d9b424b68118f2225daf96509ee1e0fcc4252a19887d9c7" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPython is available for $(pypy_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + urlprefix="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-${BUILD}" +else + urlprefix="https://github.com/oracle/graalpython/releases/download/vm-${VERSION}" +fi + +install_package "graalpython-${VERSION}${BUILD}" "${urlprefix}/graalpython-${VERSION}-${graalpython_arch}-amd64.tar.gz#${checksum}" "graalpython" ensurepip diff --git a/plugins/python-build/share/python-build/graalpython-20.2.0 b/plugins/python-build/share/python-build/graalpython-20.2.0 new file mode 100644 index 0000000..6b5002f --- /dev/null +++ b/plugins/python-build/share/python-build/graalpython-20.2.0 @@ -0,0 +1,48 @@ +# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='20.2.0' +BUILD='' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux64" ) + graalpython_arch="linux" + checksum="9ba0447523a6cf6f8b74fef2b918672762b7d7f67be9f5be8ab6b479f173cfd7" + ;; +"osx64" ) + graalpython_arch="macos" + checksum="e06f8e6f5766483d5613eca6a4703cec8a93236443c7c6f2866b31307e62bbe6" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPython is available for $(pypy_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + urlprefix="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-${BUILD}" +else + urlprefix="https://github.com/oracle/graalpython/releases/download/vm-${VERSION}" +fi + +install_package "graalpython-${VERSION}${BUILD}" "${urlprefix}/graalpython-${VERSION}-${graalpython_arch}-amd64.tar.gz#${checksum}" "graalpython" ensurepip diff --git a/plugins/python-build/share/python-build/graalpython-20.3.0 b/plugins/python-build/share/python-build/graalpython-20.3.0 new file mode 100644 index 0000000..36139f9 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpython-20.3.0 @@ -0,0 +1,48 @@ +# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='20.3.0' +BUILD='' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux64" ) + graalpython_arch="linux" + checksum="121508c64c2f18e9a57294d38a4c090c7a9417087f8549e120d0050906e2c82f" + ;; +"osx64" ) + graalpython_arch="macos" + checksum="1a80bf3fde2dc2d0fdc92605176c281835d912c26847346150b3be82d2a250e0" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPython is available for $(pypy_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + urlprefix="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-${BUILD}" +else + urlprefix="https://github.com/oracle/graalpython/releases/download/vm-${VERSION}" +fi + +install_package "graalpython-${VERSION}${BUILD}" "${urlprefix}/graalpython-${VERSION}-${graalpython_arch}-amd64.tar.gz#${checksum}" "graalpython" ensurepip diff --git a/plugins/python-build/share/python-build/graalpython-21.0.0 b/plugins/python-build/share/python-build/graalpython-21.0.0 new file mode 100644 index 0000000..9688c8d --- /dev/null +++ b/plugins/python-build/share/python-build/graalpython-21.0.0 @@ -0,0 +1,48 @@ +# Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='21.0.0' +BUILD='' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux64" ) + graalpython_arch="linux" + checksum="df2317bf57461e6a59840921f05a019a3bdf5e59f867b44ab36804d536224d7f" + ;; +"osx64" ) + graalpython_arch="macos" + checksum="3d4c02286d682228843cca2f4a0faeed7a0a64a9558eea5ceb7992a680bd61e6" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPython is available for $(pypy_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + urlprefix="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-${BUILD}" +else + urlprefix="https://github.com/oracle/graalpython/releases/download/vm-${VERSION}" +fi + +install_package "graalpython-${VERSION}${BUILD}" "${urlprefix}/graalpython-${VERSION}-${graalpython_arch}-amd64.tar.gz#${checksum}" "graalpython" ensurepip diff --git a/plugins/python-build/share/python-build/graalpython-21.1.0 b/plugins/python-build/share/python-build/graalpython-21.1.0 new file mode 100644 index 0000000..c1a59af --- /dev/null +++ b/plugins/python-build/share/python-build/graalpython-21.1.0 @@ -0,0 +1,48 @@ +# Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='21.1.0' +BUILD='' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux64" ) + graalpython_arch="linux" + checksum="fb48d041e4113cf8a0d0535402eaa64af112b1999839ebee49f431963af3ece1" + ;; +"osx64" ) + graalpython_arch="macos" + checksum="3efb2257b21ce7fdab5d3986f571ad531a5c1c73d23468431a5c8440ee49c2f6" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPython is available for $(pypy_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + urlprefix="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-${BUILD}" +else + urlprefix="https://github.com/oracle/graalpython/releases/download/vm-${VERSION}" +fi + +install_package "graalpython-${VERSION}${BUILD}" "${urlprefix}/graalpython-${VERSION}-${graalpython_arch}-amd64.tar.gz#${checksum}" "graalpython" ensurepip diff --git a/plugins/python-build/share/python-build/graalpython-21.2.0 b/plugins/python-build/share/python-build/graalpython-21.2.0 new file mode 100644 index 0000000..a2b5be1 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpython-21.2.0 @@ -0,0 +1,48 @@ +# Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='21.2.0' +BUILD='' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux64" ) + graalpython_arch="linux" + checksum="17399e168743ae8b7b3faa9870ce24213fb514a04a8966bd4bd10844baf039da" + ;; +"osx64" ) + graalpython_arch="macos" + checksum="b365278cba49d6e2e0c018d1f5a1e81fa0304be5fe6c086532630443c605b8c0" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPython is available for $(pypy_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + urlprefix="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-${BUILD}" +else + urlprefix="https://github.com/oracle/graalpython/releases/download/vm-${VERSION}" +fi + +install_package "graalpython-${VERSION}${BUILD}" "${urlprefix}/graalpython-${VERSION}-${graalpython_arch}-amd64.tar.gz#${checksum}" "graalpython" ensurepip diff --git a/plugins/python-build/share/python-build/graalpython-21.3.0 b/plugins/python-build/share/python-build/graalpython-21.3.0 new file mode 100644 index 0000000..866d4de --- /dev/null +++ b/plugins/python-build/share/python-build/graalpython-21.3.0 @@ -0,0 +1,48 @@ +# Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='21.3.0' +BUILD='' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux64" ) + graalpython_arch="linux" + checksum="b17bbc9753fb04f03290660952acfd212020676603970323780f190509b061b9" + ;; +"osx64" ) + graalpython_arch="macos" + checksum="feecbd2567a43aeaeb5ca6a7385ef3d5bd2c94e563b64afee7dcce0c8f87a1c9" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPython is available for $(pypy_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + urlprefix="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-${BUILD}" +else + urlprefix="https://github.com/oracle/graalpython/releases/download/vm-${VERSION}" +fi + +install_package "graalpython-${VERSION}${BUILD}" "${urlprefix}/graalpython-${VERSION}-${graalpython_arch}-amd64.tar.gz#${checksum}" "graalpython" ensurepip diff --git a/plugins/python-build/share/python-build/graalpython-22.0.0 b/plugins/python-build/share/python-build/graalpython-22.0.0 new file mode 100644 index 0000000..bd7817e --- /dev/null +++ b/plugins/python-build/share/python-build/graalpython-22.0.0 @@ -0,0 +1,48 @@ +# Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='22.0.0.2' +BUILD='' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux64" ) + graalpython_arch="linux" + checksum="e80c6051a609e7e1403b96992951814e967cf6deb9ca2507e691769d01970d55" + ;; +"osx64" ) + graalpython_arch="macos" + checksum="5b0476321162557a7b43e6cdadfc187280bc40a3452d327a4ae8d624afaa5336" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPython is available for $(pypy_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + urlprefix="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-${BUILD}" +else + urlprefix="https://github.com/oracle/graalpython/releases/download/vm-${VERSION}" +fi + +install_package "graalpython-${VERSION}${BUILD}" "${urlprefix}/graalpython-${VERSION}-${graalpython_arch}-amd64.tar.gz#${checksum}" "graalpython" ensurepip diff --git a/plugins/python-build/share/python-build/graalpython-22.1.0 b/plugins/python-build/share/python-build/graalpython-22.1.0 new file mode 100644 index 0000000..d3d938b --- /dev/null +++ b/plugins/python-build/share/python-build/graalpython-22.1.0 @@ -0,0 +1,48 @@ +# Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='22.1.0' +BUILD='' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux64" ) + graalpython_arch="linux" + checksum="06862993573b64bd64c802aace9135192a4ba28a15d8260c42c5de632ad616bc" + ;; +"osx64" ) + graalpython_arch="macos" + checksum="88b22ea4a5cb8345b680d15cc385dff7a8ab858fdf0e182c79c6c3b74755de6c" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPython is available for $(pypy_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + urlprefix="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-${BUILD}" +else + urlprefix="https://github.com/oracle/graalpython/releases/download/vm-${VERSION}" +fi + +install_package "graalpython-${VERSION}${BUILD}" "${urlprefix}/graalpython-${VERSION}-${graalpython_arch}-amd64.tar.gz#${checksum}" "graalpython" ensurepip diff --git a/plugins/python-build/share/python-build/graalpython-22.2.0 b/plugins/python-build/share/python-build/graalpython-22.2.0 new file mode 100644 index 0000000..3ae93d0 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpython-22.2.0 @@ -0,0 +1,48 @@ +# Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='22.2.0' +BUILD='' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux64" ) + graalpython_arch="linux" + checksum="75a7e5d7afc158169fd87df9c69c3801aa0293dd727ba09facad6b01e1b6dee5" + ;; +"osx64" ) + graalpython_arch="macos" + checksum="575d78ae2be8d4ce4adbc9c61229b6f1271f557f0f3ec410a494de7b29986dd7" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPython is available for $(pypy_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + urlprefix="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-${BUILD}" +else + urlprefix="https://github.com/oracle/graalpython/releases/download/vm-${VERSION}" +fi + +install_package "graalpython-${VERSION}${BUILD}" "${urlprefix}/graalpython-${VERSION}-${graalpython_arch}-amd64.tar.gz#${checksum}" "graalpython" ensurepip diff --git a/plugins/python-build/share/python-build/ironpython-2.7.4 b/plugins/python-build/share/python-build/ironpython-2.7.4 new file mode 100644 index 0000000..18c7753 --- /dev/null +++ b/plugins/python-build/share/python-build/ironpython-2.7.4 @@ -0,0 +1,2 @@ +install_zip "IronPython-2.7.4" "https://github.com/IronLanguages/main/releases/download/ipy-2.7.4/IronPython-2.7.4.zip#23358ebfd728adcc0b63ef44cb7db578d662d904b6f676c5292595286892796c" ironpython +# FIXME: have not confirmed to install setuptools into IronPython yet diff --git a/plugins/python-build/share/python-build/ironpython-2.7.5 b/plugins/python-build/share/python-build/ironpython-2.7.5 new file mode 100644 index 0000000..4a376d5 --- /dev/null +++ b/plugins/python-build/share/python-build/ironpython-2.7.5 @@ -0,0 +1,2 @@ +install_zip "IronPython-2.7.5" "https://github.com/IronLanguages/main/releases/download/ipy-2.7.5/IronPython-2.7.5.zip#d2651084a61a43379ce6c031f4f29c5e01ba96d1ff89a5282376dd4b84439b5b" ironpython +# FIXME: have not confirmed to install setuptools into IronPython yet diff --git a/plugins/python-build/share/python-build/ironpython-2.7.6.3 b/plugins/python-build/share/python-build/ironpython-2.7.6.3 new file mode 100644 index 0000000..fce1f31 --- /dev/null +++ b/plugins/python-build/share/python-build/ironpython-2.7.6.3 @@ -0,0 +1,2 @@ +install_zip "IronPython-2.7.6.3" "https://github.com/IronLanguages/main/releases/download/ipy-2.7.6.3/IronPython-2.7.6.3.zip#dfd00598f4752104f90c248c1662eafbebf7ead24e17531d852ffc32a5a8075b" ironpython +# FIXME: have not confirmed to install setuptools into IronPython yet diff --git a/plugins/python-build/share/python-build/ironpython-2.7.7 b/plugins/python-build/share/python-build/ironpython-2.7.7 new file mode 100644 index 0000000..9c032bb --- /dev/null +++ b/plugins/python-build/share/python-build/ironpython-2.7.7 @@ -0,0 +1,2 @@ +install_zip "IronPython-2.7.7" "https://github.com/IronLanguages/main/releases/download/ipy-2.7.7/IronPython-2.7.7-win.zip#657c134ff6d6f0ed86557d9455dcdfeac11823944f7aa36d72a41cc5444c4a89" ironpython ensurepip + diff --git a/plugins/python-build/share/python-build/ironpython-dev b/plugins/python-build/share/python-build/ironpython-dev new file mode 100644 index 0000000..c852338 --- /dev/null +++ b/plugins/python-build/share/python-build/ironpython-dev @@ -0,0 +1,2 @@ +install_git "ironpython-dev" "https://github.com/IronLanguages/ironpython2.git" master ironpython_builder +# FIXME: have not confirmed to install setuptools into IronPython yet diff --git a/plugins/python-build/share/python-build/jython-2.5-dev b/plugins/python-build/share/python-build/jython-2.5-dev new file mode 100644 index 0000000..9bebdee --- /dev/null +++ b/plugins/python-build/share/python-build/jython-2.5-dev @@ -0,0 +1,6 @@ +require_java +install_hg "jython-2.5-dev" "https://hg.python.org/jython" "2.5" jython_builder +install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python +# pip (>= 1.3) does not work properly since it uses HTTPS for downloads +# * https://github.com/pyenv/pyenv/issues/15 +install_package "pip-1.2.1" "https://pypi.python.org/packages/source/p/pip/pip-1.2.1.tar.gz#12a9302acfca62cdc7bc5d83386cac3e0581db61ac39acdb3a4e766a16b88eb1" python diff --git a/plugins/python-build/share/python-build/jython-2.5.0 b/plugins/python-build/share/python-build/jython-2.5.0 new file mode 100644 index 0000000..51ddf4b --- /dev/null +++ b/plugins/python-build/share/python-build/jython-2.5.0 @@ -0,0 +1,9 @@ +require_java +install_jar "jython-2.5.0" "https://downloads.sourceforge.net/project/jython/jython/2.5.0/jython_installer-2.5.0.jar#e3d8209ef9eb143df8101a5da6b3482cf457084e3a6247031fd510d71c13ab98" jython +# distribute (>= 0.33) does not support Jython prior to 2.5.2 +# * https://github.com/pyenv/pyenv/issues/15 +# * https://bitbucket.org/tarek/distribute/issue/367/importing-setuptoolssandbox-fails-on +install_package "distribute-0.6.32" "https://pypi.python.org/packages/source/d/distribute/distribute-0.6.32.tar.gz#8970cd1e148b5d1fea9430584aea66c45ea22d80e0933393ec49ebc388f718df" python +# pip (>= 1.3) does not work properly since it uses HTTPS for downloads +# * https://github.com/pyenv/pyenv/issues/15 +install_package "pip-1.2.1" "https://pypi.python.org/packages/source/p/pip/pip-1.2.1.tar.gz#12a9302acfca62cdc7bc5d83386cac3e0581db61ac39acdb3a4e766a16b88eb1" python diff --git a/plugins/python-build/share/python-build/jython-2.5.1 b/plugins/python-build/share/python-build/jython-2.5.1 new file mode 100644 index 0000000..a7e37e7 --- /dev/null +++ b/plugins/python-build/share/python-build/jython-2.5.1 @@ -0,0 +1,9 @@ +require_java +install_jar "jython-2.5.1" "https://downloads.sourceforge.net/project/jython/jython/2.5.1/jython_installer-2.5.1.jar#229dfd1ed9728aa7e00c71f111d08fa777a4edcd03383779c74216765098f9c5" jython +# distribute (>= 0.33) does not support Jython prior to 2.5.2 +# * https://github.com/pyenv/pyenv/issues/15 +# * https://bitbucket.org/tarek/distribute/issue/367/importing-setuptoolssandbox-fails-on +install_package "distribute-0.6.32" "https://pypi.python.org/packages/source/d/distribute/distribute-0.6.32.tar.gz#8970cd1e148b5d1fea9430584aea66c45ea22d80e0933393ec49ebc388f718df" python +# pip (>= 1.3) does not work properly since it uses HTTPS for downloads +# * https://github.com/pyenv/pyenv/issues/15 +install_package "pip-1.2.1" "https://pypi.python.org/packages/source/p/pip/pip-1.2.1.tar.gz#12a9302acfca62cdc7bc5d83386cac3e0581db61ac39acdb3a4e766a16b88eb1" python diff --git a/plugins/python-build/share/python-build/jython-2.5.2 b/plugins/python-build/share/python-build/jython-2.5.2 new file mode 100644 index 0000000..aff5f64 --- /dev/null +++ b/plugins/python-build/share/python-build/jython-2.5.2 @@ -0,0 +1,6 @@ +require_java +install_jar "jython-2.5.2" "https://downloads.sourceforge.net/project/jython/jython/2.5.2/jython_installer-2.5.2.jar#1b7168b961e31ddd89012a36cde611c340dadfd8b60b81c4248b026730ee2f29" jython +install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python +# pip (>= 1.3) does not work properly since it uses HTTPS for downloads +# * https://github.com/pyenv/pyenv/issues/15 +install_package "pip-1.2.1" "https://pypi.python.org/packages/source/p/pip/pip-1.2.1.tar.gz#12a9302acfca62cdc7bc5d83386cac3e0581db61ac39acdb3a4e766a16b88eb1" python diff --git a/plugins/python-build/share/python-build/jython-2.5.3 b/plugins/python-build/share/python-build/jython-2.5.3 new file mode 100644 index 0000000..da009b7 --- /dev/null +++ b/plugins/python-build/share/python-build/jython-2.5.3 @@ -0,0 +1,6 @@ +require_java +install_jar "jython-2.5.3" "https://search.maven.org/remotecontent?filepath=org/python/jython-installer/2.5.3/jython-installer-2.5.3.jar#05405966cdfa57abc8e705dd6aab92b8240097ce709fb916c8a0dbcaa491f99e" jython +install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python +# pip (>= 1.3) does not work properly since it uses HTTPS for downloads +# * https://github.com/pyenv/pyenv/issues/15 +install_package "pip-1.2.1" "https://pypi.python.org/packages/source/p/pip/pip-1.2.1.tar.gz#12a9302acfca62cdc7bc5d83386cac3e0581db61ac39acdb3a4e766a16b88eb1" python diff --git a/plugins/python-build/share/python-build/jython-2.5.4-rc1 b/plugins/python-build/share/python-build/jython-2.5.4-rc1 new file mode 100644 index 0000000..714c42d --- /dev/null +++ b/plugins/python-build/share/python-build/jython-2.5.4-rc1 @@ -0,0 +1,6 @@ +require_java +install_jar "jython-2.5.4-rc1" "https://search.maven.org/remotecontent?filepath=org/python/jython-installer/2.5.4-rc1/jython-installer-2.5.4-rc1.jar#2fa6821ef506804ca77f87631a21878c11d743f8a7fa9ed26e55dfd7696204d1" jython +install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python +# pip (>= 1.3) does not work properly since it uses HTTPS for downloads +# * https://github.com/pyenv/pyenv/issues/15 +install_package "pip-1.2.1" "https://pypi.python.org/packages/source/p/pip/pip-1.2.1.tar.gz#12a9302acfca62cdc7bc5d83386cac3e0581db61ac39acdb3a4e766a16b88eb1" python diff --git a/plugins/python-build/share/python-build/jython-2.7.0 b/plugins/python-build/share/python-build/jython-2.7.0 new file mode 100644 index 0000000..35cf2e1 --- /dev/null +++ b/plugins/python-build/share/python-build/jython-2.7.0 @@ -0,0 +1,14 @@ +require_java +unrequire_python27 +install_jar "jython-2.7.0" "https://repo1.maven.org/maven2/org/python/jython-installer/2.7.0/jython-installer-2.7.0.jar#b44352ece72382268a60e2848741c96609a91d796bb9a9c6ebeff62f0c12c9cf" jython + +case "$(pypy_architecture 2>/dev/null || true)" in +"osx64"|"win32" ) + # Jython does not seem to work properly on OSX/windows unless JAVA_HOME is set + if [ -z "${JAVA_HOME+defined}" ]; then + colorize 1 "WARNING: " + echo "Please ensure that your JAVA_HOME environment variable is set correctly!" + echo "See http://bugs.jython.org/issue2346 for details." + fi + ;; +esac diff --git a/plugins/python-build/share/python-build/jython-2.7.1 b/plugins/python-build/share/python-build/jython-2.7.1 new file mode 100644 index 0000000..b9e405a --- /dev/null +++ b/plugins/python-build/share/python-build/jython-2.7.1 @@ -0,0 +1,14 @@ +require_java +unrequire_python27 +install_jar "jython-2.7.1" "https://repo1.maven.org/maven2/org/python/jython-installer/2.7.1/jython-installer-2.7.1.jar#6e58dad0b8565b95c6fb14b4bfbf570523d1c5290244cfb33822789fa53b1d25" jython + +case "$(pypy_architecture 2>/dev/null || true)" in +"osx64"|"win32" ) + # Jython does not seem to work properly on OSX/windows unless JAVA_HOME is set + if [ -z "${JAVA_HOME+defined}" ]; then + colorize 1 "WARNING: " + echo "Please ensure that your JAVA_HOME environment variable is set correctly!" + echo "See http://bugs.jython.org/issue2346 for details." + fi + ;; +esac diff --git a/plugins/python-build/share/python-build/jython-2.7.2 b/plugins/python-build/share/python-build/jython-2.7.2 new file mode 100644 index 0000000..5ced805 --- /dev/null +++ b/plugins/python-build/share/python-build/jython-2.7.2 @@ -0,0 +1,14 @@ +require_java +unrequire_python27 +install_jar "jython-2.7.2" "https://repo1.maven.org/maven2/org/python/jython-installer/2.7.2/jython-installer-2.7.2.jar#36e40609567ce020a1de0aaffe45e0b68571c278c14116f52e58cc652fb71552" jython + +case "$(pypy_architecture 2>/dev/null || true)" in +"osx64"|"win32" ) + # Jython does not seem to work properly on OSX/windows unless JAVA_HOME is set + if [ -z "${JAVA_HOME+defined}" ]; then + colorize 1 "WARNING: " + echo "Please ensure that your JAVA_HOME environment variable is set correctly!" + echo "See http://bugs.jython.org/issue2346 for details." + fi + ;; +esac diff --git a/plugins/python-build/share/python-build/jython-2.7.3 b/plugins/python-build/share/python-build/jython-2.7.3 new file mode 100644 index 0000000..8e5c7cd --- /dev/null +++ b/plugins/python-build/share/python-build/jython-2.7.3 @@ -0,0 +1,14 @@ +require_java +unrequire_python27 +install_jar "jython-2.7.3" "https://repo1.maven.org/maven2/org/python/jython-installer/2.7.3/jython-installer-2.7.3.jar#3ffc25c5257d2028b176912a4091fe048c45c7d98218e52d7ce3160a62fdc9fc" jython + +case "$(pypy_architecture 2>/dev/null || true)" in +"osx64"|"win32" ) + # Jython does not seem to work properly on OSX/windows unless JAVA_HOME is set + if [ -z "${JAVA_HOME+defined}" ]; then + colorize 1 "WARNING: " + echo "Please ensure that your JAVA_HOME environment variable is set correctly!" + echo "See http://bugs.jython.org/issue2346 for details." + fi + ;; +esac diff --git a/plugins/python-build/share/python-build/jython-2.7.4 b/plugins/python-build/share/python-build/jython-2.7.4 new file mode 100644 index 0000000..e84ba42 --- /dev/null +++ b/plugins/python-build/share/python-build/jython-2.7.4 @@ -0,0 +1,14 @@ +require_java +unrequire_python27 +install_jar "jython-2.7.4" "https://repo1.maven.org/maven2/org/python/jython-installer/2.7.4/jython-installer-2.7.4.jar#6001f0741ed5f4a474e5c5861bcccf38dc65819e25d46a258cbc0278394a070b" jython + +case "$(pypy_architecture 2>/dev/null || true)" in +"osx64"|"win32" ) + # Jython does not seem to work properly on OSX/windows unless JAVA_HOME is set + if [ -z "${JAVA_HOME+defined}" ]; then + colorize 1 "WARNING: " + echo "Please ensure that your JAVA_HOME environment variable is set correctly!" + echo "See http://bugs.jython.org/issue2346 for details." + fi + ;; +esac diff --git a/plugins/python-build/share/python-build/jython-dev b/plugins/python-build/share/python-build/jython-dev new file mode 100644 index 0000000..7dbcb19 --- /dev/null +++ b/plugins/python-build/share/python-build/jython-dev @@ -0,0 +1,6 @@ +require_java +unrequire_python27 +install_hg "jython-dev" "https://hg.python.org/jython" "default" jython_builder ez_setup +# pip (>= 1.3) does not work properly since it uses HTTPS for downloads +# * https://github.com/pyenv/pyenv/issues/15 +install_package "pip-1.2.1" "https://pypi.python.org/packages/source/p/pip/pip-1.2.1.tar.gz#12a9302acfca62cdc7bc5d83386cac3e0581db61ac39acdb3a4e766a16b88eb1" python diff --git a/plugins/python-build/share/python-build/mambaforge b/plugins/python-build/share/python-build/mambaforge new file mode 100644 index 0000000..ff1ea14 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Mambaforge-Linux-ppc64le" "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-Linux-ppc64le.sh" "miniconda" verify_py3_latest + ;; +"Linux-x86_64" ) + install_script "Mambaforge-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-Linux-x86_64.sh" "miniconda" verify_py3_latest + ;; +"Linux-aarch64" ) + install_script "Mambaforge-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-Linux-aarch64.sh" "miniconda" verify_py3_latest + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-MacOSX-arm64" "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-MacOSX-arm64.sh" "miniconda" verify_py3_latest + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-MacOSX-x86_64.sh" "miniconda" verify_py3_latest + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-22.11.1-3 b/plugins/python-build/share/python-build/mambaforge-22.11.1-3 new file mode 100644 index 0000000..a6d7290 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-22.11.1-3 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-22.11.1-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Mambaforge-22.11.1-3-Linux-aarch64.sh#898134462553de6b16cdcf649b2fc5f46b7bff5ac92b12cae7f6a46eeb973c8d" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-22.11.1-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Mambaforge-22.11.1-3-Linux-ppc64le.sh#446b3c31293cfec57dc651fbd0aadb9b9663746863e7601b2aa25aa005907192" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-22.11.1-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Mambaforge-22.11.1-3-Linux-x86_64.sh#dc7b120aa6f12004e406498cb605c752bd6e4bfe18da169dfe119b91d0c8c8ce" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-22.11.1-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Mambaforge-22.11.1-3-MacOSX-arm64.sh#a85225bc54ba3c5caaf202817b4f49578d6134e6818c8fbc75173af69a80847d" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-22.11.1-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Mambaforge-22.11.1-3-MacOSX-x86_64.sh#0b17731c449ab96b3c5e39553fd68fbe1e4c68e9b016126ccf68a8f00a4a3a38" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-22.11.1-4 b/plugins/python-build/share/python-build/mambaforge-22.11.1-4 new file mode 100644 index 0000000..82e3daf --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-22.11.1-4 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-22.11.1-4-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Mambaforge-22.11.1-4-Linux-aarch64.sh#96191001f27e0cc76612d4498d34f9f656d8a7dddee44617159e42558651479c" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-22.11.1-4-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Mambaforge-22.11.1-4-Linux-ppc64le.sh#9ad024c2ed11e1c75324515727c70384f073be1373111c34b14b7212944e7e0d" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-22.11.1-4-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Mambaforge-22.11.1-4-Linux-x86_64.sh#16c7d256de783ceeb39970e675efa4a8eb830dcbb83187f1197abfea0bf07d30" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-22.11.1-4-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Mambaforge-22.11.1-4-MacOSX-arm64.sh#a551be4b416a05f31ba3605f78694f1e21559533744c45ded0c4bfeb7666f317" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-22.11.1-4-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Mambaforge-22.11.1-4-MacOSX-x86_64.sh#0f0f746330259c6f9c3678fdbdb6195dddad4b9bac921a6de07c62a60234ad8d" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-22.9.0-0 b/plugins/python-build/share/python-build/mambaforge-22.9.0-0 new file mode 100644 index 0000000..e3b1fea --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-22.9.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-22.9.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-0/Mambaforge-22.9.0-0-Linux-aarch64.sh#6076cfb0c2f88efa3e5e125dc54f3c0f8219cfe1ae9d9258a5abe42dbcf21a13" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-22.9.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-0/Mambaforge-22.9.0-0-Linux-ppc64le.sh#a17530e0e981991db5f6875e949dc22554f2ed0dd2b1bbb40ce677c910a2dc51" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-22.9.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-0/Mambaforge-22.9.0-0-Linux-x86_64.sh#7049f5ebdd6e2aee7611874599ab14445cd63070cdb63db2e00ae0b90d7c6132" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-22.9.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-0/Mambaforge-22.9.0-0-MacOSX-arm64.sh#d116ea977a2117068d290a961212f10fdaf1cc6ad156ea14b3979e2e4c0499d9" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-22.9.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-0/Mambaforge-22.9.0-0-MacOSX-x86_64.sh#03b0af9a3d343da8107edaf75713cea3b79c71aacbbeb8f06507d0dbd26c5218" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-22.9.0-1 b/plugins/python-build/share/python-build/mambaforge-22.9.0-1 new file mode 100644 index 0000000..9a71c6e --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-22.9.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-22.9.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-1/Mambaforge-22.9.0-1-Linux-aarch64.sh#2f60c1faadcf0660ac9a97e00c64edf8fd241664387a156685de4b72f36c657c" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-22.9.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-1/Mambaforge-22.9.0-1-Linux-ppc64le.sh#525cf02648ad50a221c1f1ca5ecc4c05be6cbe829e7d994c17507b439d923e55" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-22.9.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-1/Mambaforge-22.9.0-1-Linux-x86_64.sh#cba9a744454039944480871ed30d89e4e51a944a579b461dd9af60ea96560886" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-22.9.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-1/Mambaforge-22.9.0-1-MacOSX-arm64.sh#90c9c6eccdef8d938c4f31d44f2553c706b89955a4750adbd09d7eeefbedc603" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-22.9.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-1/Mambaforge-22.9.0-1-MacOSX-x86_64.sh#0afa53d38735762ee2a43174ee4ce726f076a1526f24122bd2faf7d0e005b61b" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-22.9.0-2 b/plugins/python-build/share/python-build/mambaforge-22.9.0-2 new file mode 100644 index 0000000..4090f49 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-22.9.0-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-22.9.0-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-2/Mambaforge-22.9.0-2-Linux-aarch64.sh#26cf4a5cd3a3b9085f75911b459b969d6ff8ab426ef9a8e7ce3b47cc683ead86" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-22.9.0-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-2/Mambaforge-22.9.0-2-Linux-ppc64le.sh#e13044cdbce8542896dd8b7128a00b691c119e7ad6e872c7de93ec9954b4775d" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-22.9.0-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-2/Mambaforge-22.9.0-2-Linux-x86_64.sh#d2bb6c33f2373131fc71283baae9eb81a279708d007e55d627d85abe30c2d0eb" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-22.9.0-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-2/Mambaforge-22.9.0-2-MacOSX-arm64.sh#21959f1a17a662b3f260e8b04fe2dfe82f1246746875a72f513d39159d8b816b" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-22.9.0-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-2/Mambaforge-22.9.0-2-MacOSX-x86_64.sh#844fc1ac61967990f0cfb9e516e8b0704ac2e500854588fd9851d2790d817bab" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-22.9.0-3 b/plugins/python-build/share/python-build/mambaforge-22.9.0-3 new file mode 100644 index 0000000..0ee165c --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-22.9.0-3 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-22.9.0-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-3/Mambaforge-22.9.0-3-Linux-aarch64.sh#bd9694b1558f4ee6c4eef081cefc57dbb32ceb6406e497018f0c7d2dab5b61dd" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-22.9.0-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-3/Mambaforge-22.9.0-3-Linux-ppc64le.sh#f19dc098452ddbd73caa83792aaacd63674be20898ac63b38ad687e5148199f8" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-22.9.0-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-3/Mambaforge-22.9.0-3-Linux-x86_64.sh#29f6374464307732c2c9d6711cdbca4d685c632f31e8bf1a5565276c65e0069b" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-22.9.0-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-3/Mambaforge-22.9.0-3-MacOSX-arm64.sh#eebe06970fec4cb1445bba106e65f57084b753d39766bf213edf4e02b14e27c1" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-22.9.0-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-3/Mambaforge-22.9.0-3-MacOSX-x86_64.sh#a3ccaf7b93b6f99bc2018f2a6f3cd95489940731f11fb9bf6adf1a44a7ba4e17" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-23.1.0-0 b/plugins/python-build/share/python-build/mambaforge-23.1.0-0 new file mode 100644 index 0000000..042fa44 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-23.1.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-23.1.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Mambaforge-23.1.0-0-Linux-aarch64.sh#01c29a399ad63c9aa28a69a622e9273e9bb8c5d504f1858ba789c5ca63ba1187" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-23.1.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Mambaforge-23.1.0-0-Linux-ppc64le.sh#ec0b8b10fbb9a7eb1b9c6ddf0487d0e8e0b16926791b84afc1623b43f45d1faf" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-23.1.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Mambaforge-23.1.0-0-Linux-x86_64.sh#0598ec82e02233e0e242b12129349416225dd07c2318f0ec1cfce4d7d9c397d8" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-23.1.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Mambaforge-23.1.0-0-MacOSX-arm64.sh#538ea7a9d24cad041a2b7fd71cf49f433137f9b4bc8e11408f2285e99cf79f96" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-23.1.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Mambaforge-23.1.0-0-MacOSX-x86_64.sh#61d95ff7a7bbe465a416f5ad43460fb1a50e621ed15233cc4e3441a03bb48cd4" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-23.1.0-1 b/plugins/python-build/share/python-build/mambaforge-23.1.0-1 new file mode 100644 index 0000000..4ba8377 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-23.1.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-23.1.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Mambaforge-23.1.0-1-Linux-aarch64.sh#d9d89c9e349369702171008d9ee7c5ce80ed420e5af60bd150a3db4bf674443a" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-23.1.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Mambaforge-23.1.0-1-Linux-ppc64le.sh#f7065963c9c7eba0ea80ad6431903ddb89fe1ec34c47967cbb8a5247c613b30b" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-23.1.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Mambaforge-23.1.0-1-Linux-x86_64.sh#cfb16c47dc2d115c8b114280aa605e322173f029fdb847a45348bf4bd23c62ab" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-23.1.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Mambaforge-23.1.0-1-MacOSX-arm64.sh#e519a74734f963c2fe744557115f8862fa573dea0de581b0b4a22cbd31127448" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-23.1.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Mambaforge-23.1.0-1-MacOSX-x86_64.sh#e33f9d426d62759e7c4adf5431fdd91a23df71732b5e22b699cace52255e8196" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-23.1.0-2 b/plugins/python-build/share/python-build/mambaforge-23.1.0-2 new file mode 100644 index 0000000..ef90d5c --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-23.1.0-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-23.1.0-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Mambaforge-23.1.0-2-Linux-aarch64.sh#a1a3f7cd517e97ef9b0f8e4c1afeb659c7c69849e623904297984e79b1f29b37" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-23.1.0-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Mambaforge-23.1.0-2-Linux-ppc64le.sh#fa7e75949d227c12d152efce5ae494ad5725fb0f71151dfdbdddd60e3d265dde" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-23.1.0-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Mambaforge-23.1.0-2-Linux-x86_64.sh#8c9244094375379cfe1b6317afc9e693924d0f58ea5c68c64cde4463847c1e31" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-23.1.0-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Mambaforge-23.1.0-2-MacOSX-arm64.sh#a58be683b4c00c32591eedc7a6675c8a4d3c7cbf3ef3808f4513033de46be7c8" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-23.1.0-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Mambaforge-23.1.0-2-MacOSX-x86_64.sh#f7c53778a47579d886441747a7fe697d020da3b1726f3f7fe7d7e779c3d506e2" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-23.1.0-3 b/plugins/python-build/share/python-build/mambaforge-23.1.0-3 new file mode 100644 index 0000000..ce40edb --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-23.1.0-3 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-23.1.0-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Mambaforge-23.1.0-3-Linux-aarch64.sh#b7038f4f4d972fa2589dd9edd014940b94600589f924cc6d35a9b11d37506c25" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-23.1.0-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Mambaforge-23.1.0-3-Linux-ppc64le.sh#b89f25891ce072a0de5f6f1f5889609dc1eee71ac1301c8ddb7538bd608f273c" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-23.1.0-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Mambaforge-23.1.0-3-Linux-x86_64.sh#7a6a07de6063245163a87972fb15be3a226045166eb7ee526344f82da1f3b694" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-23.1.0-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Mambaforge-23.1.0-3-MacOSX-arm64.sh#75368b03ac79b170537748a600ea847e35d83a4fef9ea438c34217b7e28b9330" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-23.1.0-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Mambaforge-23.1.0-3-MacOSX-x86_64.sh#7e4dd16067bbb4ab41616f3378d0c788302818c7fe13806fe8e97707471c9004" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-23.1.0-4 b/plugins/python-build/share/python-build/mambaforge-23.1.0-4 new file mode 100644 index 0000000..d4432ab --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-23.1.0-4 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-23.1.0-4-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Mambaforge-23.1.0-4-Linux-aarch64.sh#95c354268f62e32d57c84f2e1a0caf9b19f77c894ecc83008db0e5e666ce3d43" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-23.1.0-4-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Mambaforge-23.1.0-4-Linux-ppc64le.sh#70ed57b9d32457c172c208b16a839937e2dd77e3fa1bff5ef1cb2f1a7da102ba" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-23.1.0-4-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Mambaforge-23.1.0-4-Linux-x86_64.sh#6ca38e02be99c410644c283bac74601f296dd10995ce1c8d345af995a39b5916" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-23.1.0-4-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Mambaforge-23.1.0-4-MacOSX-arm64.sh#baa1ae638537766cac808efba09175ba21878b34288476dc7bbd01347145721f" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-23.1.0-4-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Mambaforge-23.1.0-4-MacOSX-x86_64.sh#26937ea98870531e51da942b7f6cc26cc9af49bb16390486ee6dde9e0dc2c597" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-23.10.0-0 b/plugins/python-build/share/python-build/mambaforge-23.10.0-0 new file mode 100644 index 0000000..f48a4a9 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-23.10.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-23.10.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Mambaforge-23.10.0-0-Linux-aarch64.sh#38d86db6ef78caa0ac001c48f454112df2a1e90cd6884dba03a3265393f762b2" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-23.10.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Mambaforge-23.10.0-0-Linux-ppc64le.sh#8f28c516ef441c0691d94a7cf3917b8c77eda4ac378c89bd491d4d8ff4f887c8" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-23.10.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Mambaforge-23.10.0-0-Linux-x86_64.sh#cf2782419e118db664653a6e63bbf212a24cbc3126c413aa5886fd0f7d20d3c0" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-23.10.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Mambaforge-23.10.0-0-MacOSX-arm64.sh#8b300c413195f33c3965445213de2b76bbf5fcbe9087aa80b8d6bf81a21b5764" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-23.10.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Mambaforge-23.10.0-0-MacOSX-x86_64.sh#8f1ddb27deffe5e631b3ce69fc3f880c7f3710ee08a42fee64e2b2e1a039683f" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-23.11.0-0 b/plugins/python-build/share/python-build/mambaforge-23.11.0-0 new file mode 100644 index 0000000..e22937e --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-23.11.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-23.11.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Mambaforge-23.11.0-0-Linux-aarch64.sh#71320f28280b4e41f37469f6b0ae85e31ba9c26a87c7ee69cecaae3eaa5a4057" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-23.11.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Mambaforge-23.11.0-0-Linux-ppc64le.sh#148b18f94b5a0878d5fa1190b41cad5a803eca1cd15429e26571fef11422e2b2" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-23.11.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Mambaforge-23.11.0-0-Linux-x86_64.sh#3dfdcc162bf0df83b5025608dc2acdbbc575bd416b75701fb5863343c0517a78" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-23.11.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Mambaforge-23.11.0-0-MacOSX-arm64.sh#dd832d8a65a861b5592b2cf1d55f26031f7c1491b30321754443931e7b1e6832" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-23.11.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Mambaforge-23.11.0-0-MacOSX-x86_64.sh#c6ac073b80cedb313561bc11c2e61b0bd102b74df0363ed6c1e90303b322092a" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-23.3.0-0 b/plugins/python-build/share/python-build/mambaforge-23.3.0-0 new file mode 100644 index 0000000..6a75d2b --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-23.3.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-23.3.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Mambaforge-23.3.0-0-Linux-aarch64.sh#ae506f8013fc3f487dd3c9a4fde0b1a529b02bb5478921913c46a115dbcd7d1f" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-23.3.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Mambaforge-23.3.0-0-Linux-ppc64le.sh#f8c0e24abaedfcf611c70451d0bb771f453a0eb4cc0bbbb0670f9753817827a6" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-23.3.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Mambaforge-23.3.0-0-Linux-x86_64.sh#f8b12a9815575b0fec9c85100053ef24e59043194546826fb565288c51ba930d" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-23.3.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Mambaforge-23.3.0-0-MacOSX-arm64.sh#82ed548de9de74d2b6dda9830f581d897eb82694c1df79d957eaef9066dd7ef4" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-23.3.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Mambaforge-23.3.0-0-MacOSX-x86_64.sh#d4603c9b380d5daa923f8d0543de5df57ba971a1562a519c6e3fe1240963012a" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-23.3.1-0 b/plugins/python-build/share/python-build/mambaforge-23.3.1-0 new file mode 100644 index 0000000..3a2c8f7 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-23.3.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-23.3.1-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Mambaforge-23.3.1-0-Linux-aarch64.sh#6e4feeafeff69f35a7455a35f763eb6d5a1e946e7b9b321099640ac93e619a53" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-23.3.1-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Mambaforge-23.3.1-0-Linux-ppc64le.sh#6518bf3aa2499a4c76fee54d33450d386a1d4c1bf2e0b2ddaec03f8f7b4319d2" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-23.3.1-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Mambaforge-23.3.1-0-Linux-x86_64.sh#c425dcc3501692f23564d8b0a7b3ba69166c61424e9ce0d825f64f9479dcafa1" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-23.3.1-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Mambaforge-23.3.1-0-MacOSX-arm64.sh#71e7ea4295d22f0c7ab08b334c07d9540e10775c8abd456314e186625cfb3bf1" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-23.3.1-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Mambaforge-23.3.1-0-MacOSX-x86_64.sh#b7b5fe0690528a4d449597e49edb2595625f2cf29e0473fd2a8d2dabc4d948f5" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-23.3.1-1 b/plugins/python-build/share/python-build/mambaforge-23.3.1-1 new file mode 100644 index 0000000..1e579c4 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-23.3.1-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-23.3.1-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Mambaforge-23.3.1-1-Linux-aarch64.sh#32dcc92b4f0b0108ac0734721fb65172395f6c39ecdcaf5bf63edc01f0932020" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-23.3.1-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Mambaforge-23.3.1-1-Linux-ppc64le.sh#93fa681cadda8b73bd93a1bf2f60aaa577fe02ef537ee5300eab33af2b45f6d0" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-23.3.1-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Mambaforge-23.3.1-1-Linux-x86_64.sh#dbe92c011a1315b9626e2f93a165892f4b89177145bc350b3859a483a3642a24" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-23.3.1-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Mambaforge-23.3.1-1-MacOSX-arm64.sh#1b07c1a231a18f21da6aac1abe87dd173ce141ce7612f06eab962eb9f8353a27" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-23.3.1-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Mambaforge-23.3.1-1-MacOSX-x86_64.sh#ee707e117c4eb54b7a02a0ba1b2fc2b60325ce6f767e76274e45dbe7743efa7d" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-24.1.2-0 b/plugins/python-build/share/python-build/mambaforge-24.1.2-0 new file mode 100644 index 0000000..902f0c1 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-24.1.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-24.1.2-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Mambaforge-24.1.2-0-Linux-aarch64.sh#937b2dab9a988d83a4a9e574148d1410204bdb3d137905083570e5a1a0a995e4" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-24.1.2-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Mambaforge-24.1.2-0-Linux-ppc64le.sh#68b28e441171cef9e4da81a1a99264a4b41c4bf99f8c132af9ec38c67fd41694" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-24.1.2-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Mambaforge-24.1.2-0-Linux-x86_64.sh#b172a8d2ff1c452768dd1beffb8d61880dde89f14e855de7e2459963af33828c" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-24.1.2-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Mambaforge-24.1.2-0-MacOSX-arm64.sh#b828ec3189393501d859b001f0dcfdf953140bb9506875ae997eb7ff641f6d19" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-24.1.2-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Mambaforge-24.1.2-0-MacOSX-x86_64.sh#3d3f50d7fa16b65ec507c062e6a337ba9c812650c796eb06495930b8cdd5d471" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-24.11.0-0 b/plugins/python-build/share/python-build/mambaforge-24.11.0-0 new file mode 100644 index 0000000..c490e0a --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-24.11.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-24.11.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Mambaforge-24.11.0-0-Linux-aarch64.sh#5816a4a11f08b0caba33c38365f65d81f3659fd73da498a87ab4510a58a9abd5" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-24.11.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Mambaforge-24.11.0-0-Linux-ppc64le.sh#1d530dd326f9b8e29a8005cba28a239f00c7979337d642cc89531b4755fb69b7" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-24.11.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Mambaforge-24.11.0-0-Linux-x86_64.sh#ae30935839c9e88458ce0605a251fa3f1ade623e3b9709f859460545577779f1" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-24.11.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Mambaforge-24.11.0-0-MacOSX-arm64.sh#5535232048d9e2430f165153636bbf781f21128132908e9db455130198c79dc5" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-24.11.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Mambaforge-24.11.0-0-MacOSX-x86_64.sh#f3849b245e724c0d3efde9deb125041b6a78aff69867691e1f7ecff79c40cbd1" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-24.11.0-1 b/plugins/python-build/share/python-build/mambaforge-24.11.0-1 new file mode 100644 index 0000000..baf39c1 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-24.11.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-24.11.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Mambaforge-24.11.0-1-Linux-aarch64.sh#7a02a83679a04e164a7ed5a95fe18688032012a4619a2dba6051dada20a437c3" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-24.11.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Mambaforge-24.11.0-1-Linux-ppc64le.sh#7f985f2dba06a62dcebeaf832ac926ba85707552134b5be310e9a28e869550e1" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-24.11.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Mambaforge-24.11.0-1-Linux-x86_64.sh#fad8afeb7a0247e8e8fd7a82e9306c694421d2e9b6b341752c73737fbebe4d73" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-24.11.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Mambaforge-24.11.0-1-MacOSX-arm64.sh#30d47bb61b337d2a2e166cc56923267089a6be526faf9677666af178a0059f0d" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-24.11.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Mambaforge-24.11.0-1-MacOSX-x86_64.sh#2303dcacb52860660e3f290d06e9313acb9e8826bfa6c1ca10972fedc9e3b388" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-24.3.0-0 b/plugins/python-build/share/python-build/mambaforge-24.3.0-0 new file mode 100644 index 0000000..b9d1a02 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-24.3.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-24.3.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Mambaforge-24.3.0-0-Linux-aarch64.sh#7f2a0282819f1a12bb44628a836b96fe9dfb21a5920fb8331325c47f91bf9a81" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-24.3.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Mambaforge-24.3.0-0-Linux-ppc64le.sh#4550d7cb6ea9bb145ae2aae7b02734a642ef24bda0abfc9b1b6d8d6abf0b7749" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-24.3.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Mambaforge-24.3.0-0-Linux-x86_64.sh#0be3654cc3b9c43d3aeeeca5efe6d2f31e9f7711702f3818529b367b3db677fb" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-24.3.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Mambaforge-24.3.0-0-MacOSX-arm64.sh#de7c7f229d05104de802f1f729a595736b08139c4ae59ba8ba0049050d63c98f" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-24.3.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Mambaforge-24.3.0-0-MacOSX-x86_64.sh#5455900cf1298f21333b7c0d1ec159952e1ef5426563cc97eb7e42053d608afc" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-24.5.0-0 b/plugins/python-build/share/python-build/mambaforge-24.5.0-0 new file mode 100644 index 0000000..c220cb1 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-24.5.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-24.5.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Mambaforge-24.5.0-0-Linux-aarch64.sh#a19c4d40dc4aa9084d729f3fbed36fd7a741bb8a0ef4f7df4bc92c5157817ba8" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-24.5.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Mambaforge-24.5.0-0-Linux-ppc64le.sh#db6432e76bac0547d65f06e1e0559a0d12147e9020e0cce99c8b07a9c8f2824d" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-24.5.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Mambaforge-24.5.0-0-Linux-x86_64.sh#afee51df9c542d2e1bef249ad167197ba90fd4386fd32a63383dc95efba4bdfe" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-24.5.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Mambaforge-24.5.0-0-MacOSX-arm64.sh#88514feaad5bf03605242bd4e767829ad9695587ef51621329343d9960771d2b" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-24.5.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Mambaforge-24.5.0-0-MacOSX-x86_64.sh#1dfb244bce67bc6d9c0900cce2bf9d9feaf66ba60e811b7c98c6e580394d0ccc" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-24.7.1-0 b/plugins/python-build/share/python-build/mambaforge-24.7.1-0 new file mode 100644 index 0000000..10b1acc --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-24.7.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-24.7.1-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Mambaforge-24.7.1-0-Linux-aarch64.sh#09221afebba644eabccb5a83a92ba7e1bf88ff17171f80f77f95aa81cad225cc" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-24.7.1-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Mambaforge-24.7.1-0-Linux-ppc64le.sh#1ba05b444bea703097054a25aee2ebb7b04236632791f08f28db82491e005b52" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-24.7.1-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Mambaforge-24.7.1-0-Linux-x86_64.sh#e72ecc1f1b170ee804da298e54ed616ce82543ce84a8b83f63cb0ada2e4bfa50" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-24.7.1-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Mambaforge-24.7.1-0-MacOSX-arm64.sh#204be9ff318a5b23f9466f8bbbf18f7e180c6ed393ffc2a9859d8ab06c474248" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-24.7.1-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Mambaforge-24.7.1-0-MacOSX-x86_64.sh#668e69e89e41c5e9bae4431cf4040346eb6e484831577a28795c44039f70798d" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-24.7.1-1 b/plugins/python-build/share/python-build/mambaforge-24.7.1-1 new file mode 100644 index 0000000..05e22e4 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-24.7.1-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-24.7.1-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Mambaforge-24.7.1-1-Linux-aarch64.sh#34ea804e678d71c747d5a7fc99f97ffea395252c8acaf0c66e6dc6812585573b" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-24.7.1-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Mambaforge-24.7.1-1-Linux-ppc64le.sh#3ee3e1d127adeea1950ed1b73ccbc7e4d9f2a25e98f5a18c09e8a3bb8a905d05" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-24.7.1-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Mambaforge-24.7.1-1-Linux-x86_64.sh#7b47af948c8a5d786bc7036eb918ba1254273a820bacd83596316919cd097a14" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-24.7.1-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Mambaforge-24.7.1-1-MacOSX-arm64.sh#5994a2ad9cd40b2c79cc67173b9be42ec04b7b5d65ad17443bd67d68740bc403" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-24.7.1-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Mambaforge-24.7.1-1-MacOSX-x86_64.sh#4fc2637e40282562a1139827cf36e98a71dfdd9b3306967210f9d02badf65447" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-24.7.1-2 b/plugins/python-build/share/python-build/mambaforge-24.7.1-2 new file mode 100644 index 0000000..e5ccb94 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-24.7.1-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-24.7.1-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Mambaforge-24.7.1-2-Linux-aarch64.sh#fd99046ef2394198c56df8988f50bbd18967edbc36d7fb29a4814f46ee5ab210" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-24.7.1-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Mambaforge-24.7.1-2-Linux-ppc64le.sh#3a09b99214c47d744c1e80a52de3e26b4a0420463cb50bade04b454af8ace591" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-24.7.1-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Mambaforge-24.7.1-2-Linux-x86_64.sh#4ce9db89d22e3ebd4e5c5d0b745613e25dcef79fba4d67760b09d76f15020d4c" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-24.7.1-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Mambaforge-24.7.1-2-MacOSX-arm64.sh#5920c685a6bedb7d71fe0caafd5fafdb41a664ff6f41ee637fd683e283e4d771" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-24.7.1-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Mambaforge-24.7.1-2-MacOSX-x86_64.sh#ec0ec07816a97080443472e052a6777c1e3870a83cadba1254bfa3bc60f65a6c" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-24.9.0-0 b/plugins/python-build/share/python-build/mambaforge-24.9.0-0 new file mode 100644 index 0000000..d93ef1c --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-24.9.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-24.9.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Mambaforge-24.9.0-0-Linux-aarch64.sh#2d83f58793e9e303746747a683833aec5b9178fb1a313a3f9a56df2d319e23a5" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-24.9.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Mambaforge-24.9.0-0-Linux-ppc64le.sh#cc083e40b1891611b26b0f63b5df3422cb4f8e1a29204f55caea514ead528eb2" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-24.9.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Mambaforge-24.9.0-0-Linux-x86_64.sh#77fb505f6266ffa1b5d59604cf6ba25948627e908928cbff148813957b1c28af" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-24.9.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Mambaforge-24.9.0-0-MacOSX-arm64.sh#ceb3dac98c1618f652aed493dc9488155ac7ca2c8abaccd18b93e58034a462c6" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-24.9.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Mambaforge-24.9.0-0-MacOSX-x86_64.sh#046d8eedabafc798c88f3764e71b6ca22728ccbf04806b68450421cb6ebdaae6" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-24.9.2-0 b/plugins/python-build/share/python-build/mambaforge-24.9.2-0 new file mode 100644 index 0000000..25c39a9 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-24.9.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-24.9.2-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Mambaforge-24.9.2-0-Linux-aarch64.sh#f142244dd08dc1a7dbb95a48f22e2c0cba01602bc0b6b0425520460d278c2f4d" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-24.9.2-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Mambaforge-24.9.2-0-Linux-ppc64le.sh#0c442d49787dea24847690e85744566cc901641b2c0ffd3f4e6579c9c4306a94" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-24.9.2-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Mambaforge-24.9.2-0-Linux-x86_64.sh#9e122fbb925a96011b876fcf118d70c55cbe982b6ee001fe23aa8a2600d649d1" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-24.9.2-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Mambaforge-24.9.2-0-MacOSX-arm64.sh#85f1c04493513a4552a14ed32b785c0b5484ecfafa827ef413605fd20e5d5cea" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-24.9.2-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Mambaforge-24.9.2-0-MacOSX-x86_64.sh#f845ed82244fe553dc4d1b3a7c134e3c0ede26a84d2d279cfa93bdcb0fc739b0" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.10.1-4 b/plugins/python-build/share/python-build/mambaforge-4.10.1-4 new file mode 100644 index 0000000..6ec49ac --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.10.1-4 @@ -0,0 +1,22 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86_64" ) + install_script "Mambaforge-4.10.1-4-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-4/Mambaforge-4.10.1-4-Linux-x86_64.sh#9eb335cb559644a6e462c077ebc129af51b7329817574fb707b994dafdddf2af" "miniconda" verify_py38 + ;; +"Linux-aarch64" ) + install_script "Mambaforge-4.10.1-4-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-4/Mambaforge-4.10.1-4-Linux-aarch64.sh#eb7d10c758afbd59432a8f08294bc3ac053e747e1997ff5d6a1141a276b6d0e5" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.10.1-4-MacOSX-arm64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-4/Mambaforge-4.10.1-4-MacOSX-arm64.sh#90a75e9fa9fedfe991a9eaf65cae62ef5cdb6a8fda9375654f31b3b6cf99ef06" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.10.1-4-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-4/Mambaforge-4.10.1-4-MacOSX-x86_64.sh#b8a849f0cf2923940a2fcda47a5f7181fa855dfc5c1b59134ac7e8b3735e0f71" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.10.1-5 b/plugins/python-build/share/python-build/mambaforge-4.10.1-5 new file mode 100644 index 0000000..88c6faf --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.10.1-5 @@ -0,0 +1,22 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86_64" ) + install_script "Mambaforge-4.10.1-5-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-5/Mambaforge-4.10.1-5-Linux-x86_64.sh#069e151cae85ed4747721e938e7974aa00889a1ae87cff33ddbdde9530fc4c6d" "miniconda" verify_py38 + ;; +"Linux-aarch64" ) + install_script "Mambaforge-4.10.1-5-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-5/Mambaforge-4.10.1-5-Linux-aarch64.sh#64739b6eb0108ff3873d4edb32d2760db166cc822797234654c888c0f7063b9d" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.10.1-5-MacOSX-arm64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-5/Mambaforge-4.10.1-5-MacOSX-arm64.sh#20553cd410ae250cd1cabce04e7478f57439ab1d55cb1c6a157998d96bee1b7d" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.10.1-5-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-5/Mambaforge-4.10.1-5-MacOSX-x86_64.sh#871fc6471ff8de7aa609db5f1a8e99bfaea6dabbbd2c41fa61c26ef82daa6832" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.10.2-0 b/plugins/python-build/share/python-build/mambaforge-4.10.2-0 new file mode 100644 index 0000000..3ea63c0 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.10.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-4.10.2-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.2-0/Mambaforge-4.10.2-0-Linux-aarch64.sh#cbc5329fa22f4d7ff10f66e59024b186d37653b9da31d841d23092a701f46b1f" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-4.10.2-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.2-0/Mambaforge-4.10.2-0-Linux-ppc64le.sh#c682e2e1f07e2da07cbe6252559af363bb0b67aa315527887fe2dd5123ca8760" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-4.10.2-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.2-0/Mambaforge-4.10.2-0-Linux-x86_64.sh#1e89ee86afa06e23b2478579be16a33fff6cff346314f6a6382fd20b1f83e669" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.10.2-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.2-0/Mambaforge-4.10.2-0-MacOSX-arm64.sh#87768fed0097edf58a129981129142db2651ab5d1591e19c5840ade186b443c5" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.10.2-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.2-0/Mambaforge-4.10.2-0-MacOSX-x86_64.sh#5a396db66672b5e6557e692bcb3cb527bcbe7c24b9c4a1c67b4449f8ef67cd47" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.10.3-0 b/plugins/python-build/share/python-build/mambaforge-4.10.3-0 new file mode 100644 index 0000000..11b2546 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.10.3-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-4.10.3-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-0/Mambaforge-4.10.3-0-Linux-aarch64.sh#d6d4fdf1d722c4afe9fdf5e372369321d5de9b491fdada22255665b122453fc7" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-4.10.3-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-0/Mambaforge-4.10.3-0-Linux-ppc64le.sh#cdda287122007bdc6b96ed62fb17c7c8213e38b3598ad6db03d8301c81d7d594" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-4.10.3-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-0/Mambaforge-4.10.3-0-Linux-x86_64.sh#5c3914235c0db8a8925d294a17d196fca7e6eab9175406fc78ed90fde34297db" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.10.3-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-0/Mambaforge-4.10.3-0-MacOSX-arm64.sh#17a38bf23ef3f2864eb3c1ebf1c07389635ad9ff65f0692f438c1f6286feef63" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.10.3-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-0/Mambaforge-4.10.3-0-MacOSX-x86_64.sh#43986b8c2a6b3535c2fa920c8001187c89695c0aaaa96c25696adb7746e0eb54" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.10.3-1 b/plugins/python-build/share/python-build/mambaforge-4.10.3-1 new file mode 100644 index 0000000..64eadc8 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.10.3-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-4.10.3-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-1/Mambaforge-4.10.3-1-Linux-aarch64.sh#e830d626bcf8fccde1e64567fa9974d87fa45026c3baa73c889bab9a7fa60647" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-4.10.3-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-1/Mambaforge-4.10.3-1-Linux-ppc64le.sh#ade3331e4946dc149c97346941c635ddef1b99d63ec0781027a0ae0d156f62d7" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-4.10.3-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-1/Mambaforge-4.10.3-1-Linux-x86_64.sh#72c623cc9ce300c5ad54e0b383e428b13e5c640e74529295ab61fbbfa1a8acaa" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.10.3-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-1/Mambaforge-4.10.3-1-MacOSX-arm64.sh#5d1e6ae4eb424290271fe25e7f8c3e8165ba5730a4817f92a157566f44c7e363" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.10.3-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-1/Mambaforge-4.10.3-1-MacOSX-x86_64.sh#a8b0e666c893eb21769c00ab4ba603d28590f4c92d1fafe6ca2eb959cecf76ce" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.10.3-10 b/plugins/python-build/share/python-build/mambaforge-4.10.3-10 new file mode 100644 index 0000000..4001247 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.10.3-10 @@ -0,0 +1,22 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86_64" ) + install_script "Mambaforge-4.10.3-10-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-10/Mambaforge-4.10.3-10-Linux-x86_64.sh#8b789c619d03760e606a9c9b3d098414653f6037b80f16174ad94f0ee0c679d8" "miniconda" verify_py38 + ;; +"Linux-aarch64" ) + install_script "Mambaforge-4.10.3-10-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-10/Mambaforge-4.10.3-10-Linux-aarch64.sh#60a1d50c92fe1d48e2744effca9e7b51bfd5cc4e863dbcdb762ed48020703e3a" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.10.3-10-MacOSX-arm64" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-10/Mambaforge-4.10.3-10-MacOSX-arm64.sh#72bc86612ab9435915b616c2edb076737cbabe2c33fd684d58c2f9ae72e1957c" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.10.3-10-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-10/Mambaforge-4.10.3-10-MacOSX-x86_64.sh#7c44259a0982cd3ef212649678af5f0dd4e0bb7306e8fffc93601dd1d739ec0b" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.10.3-2 b/plugins/python-build/share/python-build/mambaforge-4.10.3-2 new file mode 100644 index 0000000..5e870ee --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.10.3-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-4.10.3-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-2/Mambaforge-4.10.3-2-Linux-aarch64.sh#63294acfe2859c4a7b86151836da3253fd0370e9e0cd821be6ffb18a029c3a7a" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-4.10.3-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-2/Mambaforge-4.10.3-2-Linux-ppc64le.sh#8162d50d3111a4c0746c7a4e51094eea3011966816768c4d3638fe40050d6e59" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-4.10.3-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-2/Mambaforge-4.10.3-2-Linux-x86_64.sh#e4228930af7102de20019efdf45e4e9c056b6ae354cb2e344249e53a11f71175" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.10.3-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-2/Mambaforge-4.10.3-2-MacOSX-arm64.sh#49132e1e2593b4ab3762ff238e76dfc5f5bd670fe23c622c5051607709f93a0b" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.10.3-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-2/Mambaforge-4.10.3-2-MacOSX-x86_64.sh#cbd143702ed1d1176fa3b480eca1ec6eb0e32a2c9eab7134877ff32dabae91e0" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.10.3-3 b/plugins/python-build/share/python-build/mambaforge-4.10.3-3 new file mode 100644 index 0000000..ee8a495 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.10.3-3 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-4.10.3-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-3/Mambaforge-4.10.3-3-Linux-aarch64.sh#c53eda563935e7ed5d07816477758374f4c541d912ee5732f2f9ace37d9fab75" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-4.10.3-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-3/Mambaforge-4.10.3-3-Linux-ppc64le.sh#3b762a3cf77fffebc56d3ecdefe590bf065139b36f556bb57f7f83a0ebe8561b" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-4.10.3-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-3/Mambaforge-4.10.3-3-Linux-x86_64.sh#a012c24e1cc3bcbe74a1e5693e510830e7c2956e85877b08d1e28707a0bd8d75" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.10.3-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-3/Mambaforge-4.10.3-3-MacOSX-arm64.sh#6cbae54d7a2d99cdcf747d74412a0c6490c8240cbb2d870655f61a9600bc2f06" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.10.3-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-3/Mambaforge-4.10.3-3-MacOSX-x86_64.sh#69f626a18eb1a6fda52d9f005114604acff1fd2d7c10d46e56543dca7d78f30d" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.10.3-4 b/plugins/python-build/share/python-build/mambaforge-4.10.3-4 new file mode 100644 index 0000000..faffe22 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.10.3-4 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-4.10.3-4-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-4/Mambaforge-4.10.3-4-Linux-aarch64.sh#f37435d5e2bc3eb14ec7f5bc64f9c45997f8e0a6d2fef3a7bb1ffa19f118817b" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-4.10.3-4-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-4/Mambaforge-4.10.3-4-Linux-ppc64le.sh#68319a11298b8c13a15960cd9d2a5777fd34420b73587a7f2e8e4757752f3252" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-4.10.3-4-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-4/Mambaforge-4.10.3-4-Linux-x86_64.sh#5017562c434185b4d9d311274c14717077f6c09a238a4d34a1caf7618d26ddd4" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.10.3-4-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-4/Mambaforge-4.10.3-4-MacOSX-arm64.sh#901f2c2b4be08cadf6968f408d4a1ee632ddb011a07ce4b480b83d8da142255f" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.10.3-4-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-4/Mambaforge-4.10.3-4-MacOSX-x86_64.sh#b5fd40995aebd7631f761324eb425ee813fb4604ce8d8fde3c03cb60cac1716e" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.10.3-5 b/plugins/python-build/share/python-build/mambaforge-4.10.3-5 new file mode 100644 index 0000000..d3eab69 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.10.3-5 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-4.10.3-5-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-5/Mambaforge-4.10.3-5-Linux-aarch64.sh#5e471d796d7b1749949c0c0d79841e00f1b477833ce82b4b05b7b9886a1735eb" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-4.10.3-5-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-5/Mambaforge-4.10.3-5-Linux-ppc64le.sh#892ccb32b847978062c8045e96827a403d59fe64f318e0b92303be6a08e4d3f7" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-4.10.3-5-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-5/Mambaforge-4.10.3-5-Linux-x86_64.sh#2692f9ae27327412cbf018ec0218d21a99b013d0597ccaefc988540c8a9ced65" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.10.3-5-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-5/Mambaforge-4.10.3-5-MacOSX-arm64.sh#1c7517e204814f7227ef0d2e0fbf95b43f6afae978e882cd017779e31f8b26cb" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.10.3-5-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-5/Mambaforge-4.10.3-5-MacOSX-x86_64.sh#547823784a2b79641f29d06f70f74ae25775eec1680c6cca14888c4907441f5c" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.10.3-6 b/plugins/python-build/share/python-build/mambaforge-4.10.3-6 new file mode 100644 index 0000000..5bdc79d --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.10.3-6 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-4.10.3-6-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-6/Mambaforge-4.10.3-6-Linux-aarch64.sh#b6d3c0af4ba6202dc9994e70933d2de47ef8c4e6891afce768889a7d44e1db28" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-4.10.3-6-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-6/Mambaforge-4.10.3-6-Linux-ppc64le.sh#9d50677aeff37b56b0d6067339aad8c964942e28fc74a24a7602416a3dcc35b2" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-4.10.3-6-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-6/Mambaforge-4.10.3-6-Linux-x86_64.sh#c63907ba0971d2ca9a8775bd7ea48b635b2bdce4838b2f2d3a8e751876849595" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.10.3-6-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-6/Mambaforge-4.10.3-6-MacOSX-arm64.sh#c753e99380e3f777d690e7131fc79c6f9cb8fb79af23fb53c7b8a0ade3361fec" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.10.3-6-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-6/Mambaforge-4.10.3-6-MacOSX-x86_64.sh#955a6255871d9b53975e1c1581910844bcf33cbca613c7dba2842f6269917da6" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.10.3-7 b/plugins/python-build/share/python-build/mambaforge-4.10.3-7 new file mode 100644 index 0000000..0b03ab8 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.10.3-7 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-4.10.3-7-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-7/Mambaforge-4.10.3-7-Linux-aarch64.sh#ac95f137b287b3408e4f67f07a284357b1119ee157373b788b34e770ef2392b2" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-4.10.3-7-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-7/Mambaforge-4.10.3-7-Linux-ppc64le.sh#21c0190d2462eea68c78a600ce28828238d6a450858a289d7d4c03d9a2551ee8" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-4.10.3-7-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-7/Mambaforge-4.10.3-7-Linux-x86_64.sh#fc872522ec427fcab10167a93e802efaf251024b58cc27b084b915a9a73c4474" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.10.3-7-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-7/Mambaforge-4.10.3-7-MacOSX-arm64.sh#49c7ba06fe663c634929d5d85b4c06840f4ab9844744be691aab90848c52444e" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.10.3-7-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-7/Mambaforge-4.10.3-7-MacOSX-x86_64.sh#94ed8b8a647f48a815590958217aabebd4a3e3e10edaf2c5772d50a75727773a" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.10.3-8 b/plugins/python-build/share/python-build/mambaforge-4.10.3-8 new file mode 100644 index 0000000..c8d222f --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.10.3-8 @@ -0,0 +1,16 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"MacOSX-arm64" ) + install_script "Mambaforge-4.10.3-8-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-8/Mambaforge-4.10.3-8-MacOSX-arm64.sh#f40271609a59bad71e7b1c6fa61a36065ea35222a9497614bc970572594e1f5a" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.10.3-8-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-8/Mambaforge-4.10.3-8-MacOSX-x86_64.sh#4f3dfd9475ed226f6a4478fe5c0585117528700557fe06fb9db054a354f07951" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.10.3-9 b/plugins/python-build/share/python-build/mambaforge-4.10.3-9 new file mode 100644 index 0000000..bd6e404 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.10.3-9 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-4.10.3-9-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-9/Mambaforge-4.10.3-9-Linux-aarch64.sh#91fcdf2dfca49d68daaa9927d38f77a82718b5b72333180f9855e5b2cfa07c3b" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-4.10.3-9-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-9/Mambaforge-4.10.3-9-Linux-ppc64le.sh#4873079e88bcda0225af7c6acf59b48b272bb147ab9506e1b80cdab035a53b02" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-4.10.3-9-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-9/Mambaforge-4.10.3-9-Linux-x86_64.sh#f53ab6584385a4648608993de2a66bb84b9255c87e1f4315bb39cbfc05b19e87" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.10.3-9-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-9/Mambaforge-4.10.3-9-MacOSX-arm64.sh#968fe531ee2d9900409853085e6b458077144c1674061a5501938e3581b5adf4" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.10.3-9-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-9/Mambaforge-4.10.3-9-MacOSX-x86_64.sh#d669b345a7612552a9a218e3499b7a3a7c8deec2925d203155bd0922250b2823" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.11.0-0 b/plugins/python-build/share/python-build/mambaforge-4.11.0-0 new file mode 100644 index 0000000..04c8b5a --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.11.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-4.11.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-0/Mambaforge-4.11.0-0-Linux-aarch64.sh#9ad5db1775ed7f6a390774a7b7a2aeac3992499ee4b01e801f53528857112dc0" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-4.11.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-0/Mambaforge-4.11.0-0-Linux-ppc64le.sh#6fe80e207d409eb6c0922e068aa23aff5032083d9a5c2aacecc446a1d20f357b" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-4.11.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-0/Mambaforge-4.11.0-0-Linux-x86_64.sh#49268ee30d4418be4de852dda3aa4387f8c95b55a76f43fb1af68dcbf8b205c3" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.11.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-0/Mambaforge-4.11.0-0-MacOSX-arm64.sh#7703e27a2ceadb747a69f2c6a88b3cb859cb4bb4268fc85b03739e22d0eb160b" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.11.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-0/Mambaforge-4.11.0-0-MacOSX-x86_64.sh#2039f744e272d47878f0bc2ae372f03c7f07881f39a93d693d5445744f36f19d" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.11.0-1 b/plugins/python-build/share/python-build/mambaforge-4.11.0-1 new file mode 100644 index 0000000..1da0cf7 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.11.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-4.11.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-1/Mambaforge-4.11.0-1-Linux-aarch64.sh#8b2cd64b89c7e92a444dd2df993a4c0aeda20b1d090aeef8956bbb3fa5c526fe" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-4.11.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-1/Mambaforge-4.11.0-1-Linux-ppc64le.sh#c7fb2000b4447a410fd18d334a9b658f8682b19962fe0e22d1d003078dc89dfe" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-4.11.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-1/Mambaforge-4.11.0-1-Linux-x86_64.sh#32eb24c99062d5c97d1b8ab55cae19e37cca08464a3249e5eac65339927697e9" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.11.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-1/Mambaforge-4.11.0-1-MacOSX-arm64.sh#ce002867552011148b77e1df022465c584d25d0aec02fc15fdc96b68a0da1545" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.11.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-1/Mambaforge-4.11.0-1-MacOSX-x86_64.sh#11b0e24649ca1931cfcc92ff2b3a67d43e7f2485a1f57b7f512b5b7cd6f3f27c" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.11.0-2 b/plugins/python-build/share/python-build/mambaforge-4.11.0-2 new file mode 100644 index 0000000..57e7fec --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.11.0-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-4.11.0-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-2/Mambaforge-4.11.0-2-Linux-aarch64.sh#dc24d61b3c57fde5bb05367a9514bcdf7acd820f97ef913e94781c78dff55f8d" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-4.11.0-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-2/Mambaforge-4.11.0-2-Linux-ppc64le.sh#8936568238c0ab4ae6444390cbe22853f8852080b5bc85912e1d41c8d3bbaea7" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-4.11.0-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-2/Mambaforge-4.11.0-2-Linux-x86_64.sh#5708db10e2e84035f9ed5700731435bf4027c73b0d5d41562cb5cf5dd9048925" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.11.0-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-2/Mambaforge-4.11.0-2-MacOSX-arm64.sh#8265d0902b6c3914a64afa7899c6398b1db7005603ad5d190dc0f0c87e8a8446" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.11.0-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-2/Mambaforge-4.11.0-2-MacOSX-x86_64.sh#e6312bcd55bac1036ce0d3c52a36bf57d3f65d3ec4f36f6267617dbb7edfe16d" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.11.0-3 b/plugins/python-build/share/python-build/mambaforge-4.11.0-3 new file mode 100644 index 0000000..9106a71 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.11.0-3 @@ -0,0 +1,16 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"MacOSX-arm64" ) + install_script "Mambaforge-4.11.0-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-3/Mambaforge-4.11.0-3-MacOSX-arm64.sh#7f16bf19722987cba7b077a010276262d8c3b521cb5c759f0b981e0fb0877d50" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.11.0-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-3/Mambaforge-4.11.0-3-MacOSX-x86_64.sh#e0e60c1542d087b514c3a81a1d4df9f0cc1d127b5245f1685bf77b2562ad6314" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.11.0-4 b/plugins/python-build/share/python-build/mambaforge-4.11.0-4 new file mode 100644 index 0000000..173b35e --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.11.0-4 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-4.11.0-4-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-4/Mambaforge-4.11.0-4-Linux-aarch64.sh#e2105e962f19a764c33d986f6e6850a3ce9aef9efc9571c7293b5274c335231d" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-4.11.0-4-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-4/Mambaforge-4.11.0-4-Linux-ppc64le.sh#d50a94a0fd367242db4bf5121ba4fd9356e171c79444d2226081275baa31e63a" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-4.11.0-4-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-4/Mambaforge-4.11.0-4-Linux-x86_64.sh#3f3a9177c3ce022a5f7f8798aab360af004c6c1e4963d0e91fc005e54bc1e271" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.11.0-4-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-4/Mambaforge-4.11.0-4-MacOSX-arm64.sh#d0a86d865d3881f26bc0e677a83b7fdff700536e654cd8490c8fdc1731f93f6c" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.11.0-4-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-4/Mambaforge-4.11.0-4-MacOSX-x86_64.sh#9b385902da43fba025ba8a02e628057217fe75cace15af26add5748ab443abbb" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.12.0-0 b/plugins/python-build/share/python-build/mambaforge-4.12.0-0 new file mode 100644 index 0000000..b0ff824 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.12.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-4.12.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-0/Mambaforge-4.12.0-0-Linux-aarch64.sh#44e0a9f7c32e855e82a24af4df9a65ecf35a12b6eede8822b24dcf2308289d40" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-4.12.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-0/Mambaforge-4.12.0-0-Linux-ppc64le.sh#44de866d661a441f5e32605ce4708b3323f80348ccb5e0568e52a25a3de0d81e" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-4.12.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-0/Mambaforge-4.12.0-0-Linux-x86_64.sh#6c6fd04d688ceb7e6b540bba059dd3a541d60602e9adece3abaf754d15c83484" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.12.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-0/Mambaforge-4.12.0-0-MacOSX-arm64.sh#59d847b17148ebd27a4b31775d0047302cf9f8f8dae7db1e75bf037f0a823d48" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.12.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-0/Mambaforge-4.12.0-0-MacOSX-x86_64.sh#2301f866fb239ce6cda3e741e00be22ff7aa5ff76ba5683509ebae58df917546" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.12.0-1 b/plugins/python-build/share/python-build/mambaforge-4.12.0-1 new file mode 100644 index 0000000..41c61a7 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.12.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-4.12.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-1/Mambaforge-4.12.0-1-Linux-aarch64.sh#c6ee5819f700926485197c864ed1190e8ca9d436cf15b100ed8a35540f1c46ea" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-4.12.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-1/Mambaforge-4.12.0-1-Linux-ppc64le.sh#87dc485c6c82592102b8704e0e59cf9ce2fef762c369011a3e132fa72549d730" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-4.12.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-1/Mambaforge-4.12.0-1-Linux-x86_64.sh#10f7194e7356e46e41ddf6add800a2f175a801211ed62869ad8c0c301d493c34" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.12.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-1/Mambaforge-4.12.0-1-MacOSX-arm64.sh#234504f4db1d04966218f0c1ad73418a15e7e9bdf714d166bc5e86b917291cc2" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.12.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-1/Mambaforge-4.12.0-1-MacOSX-x86_64.sh#e68c3b8f94db17aae3b33f2bacb950c613c06b170507002d72231ff320b9ad7c" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.12.0-2 b/plugins/python-build/share/python-build/mambaforge-4.12.0-2 new file mode 100644 index 0000000..d24691c --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.12.0-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-4.12.0-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-2/Mambaforge-4.12.0-2-Linux-aarch64.sh#6b67bdd1552dfd6a2257c4c3da0ead19a4d34f68c16fb3e5b4bbc728b60cd200" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-4.12.0-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-2/Mambaforge-4.12.0-2-Linux-ppc64le.sh#f8700febc99cbda9cbe9ff52364477ed6a04efdf15a0aa499d8ea8be4a58998c" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-4.12.0-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-2/Mambaforge-4.12.0-2-Linux-x86_64.sh#8cb16ef82fe18d466850abb873c7966090b0fbdcf1e80842038e0b4e6d8f0b66" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.12.0-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-2/Mambaforge-4.12.0-2-MacOSX-arm64.sh#2e2be9d976da31b62ab314881d3c6ed3f65c76e3ea69cc4b59fb344780109026" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.12.0-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-2/Mambaforge-4.12.0-2-MacOSX-x86_64.sh#562c2bcbabff10387f130acea72b960454fa3d90b593126e4e4febcf6da763d3" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.12.0-3 b/plugins/python-build/share/python-build/mambaforge-4.12.0-3 new file mode 100644 index 0000000..d6a2d30 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.12.0-3 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-4.12.0-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-3/Mambaforge-4.12.0-3-Linux-aarch64.sh#379796ce7d0f6515093bdde06f45df1bd7261c4104f13f53a5cd30f9acba44d9" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-4.12.0-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-3/Mambaforge-4.12.0-3-Linux-ppc64le.sh#ae6fb19467c147c77cf31b044aaae155109bc0e952965d98990fa8d2b2e7bfdd" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-4.12.0-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-3/Mambaforge-4.12.0-3-Linux-x86_64.sh#93d481e4f12dce9f2ffe46904dc8cf88485c7b27fc4d18dd8e900e2c3ab83f80" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.12.0-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-3/Mambaforge-4.12.0-3-MacOSX-arm64.sh#6c3b82eb0edce21b58d0bcafc9afbbc498e140a8229b70275afcdf9e17db47d1" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.12.0-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-3/Mambaforge-4.12.0-3-MacOSX-x86_64.sh#17ecce907a048240970cc9a546369aed07bcd21f30116ad43249360dce69edcd" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.13.0-1 b/plugins/python-build/share/python-build/mambaforge-4.13.0-1 new file mode 100644 index 0000000..a542423 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.13.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-4.13.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-1/Mambaforge-4.13.0-1-Linux-aarch64.sh#69e3c90092f61916da7add745474e15317ed0dc6d48bfe4e4c90f359ba141d23" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-4.13.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-1/Mambaforge-4.13.0-1-Linux-ppc64le.sh#ff41608c73da7deb01f741682e9b6c92435f4b2aff2aecde353093d3125126cf" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-4.13.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-1/Mambaforge-4.13.0-1-Linux-x86_64.sh#412b79330e90e49cf7e39a7b6f4752970fcdb8eb54b1a45cc91afe6777e8518c" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.13.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-1/Mambaforge-4.13.0-1-MacOSX-arm64.sh#6263560d2b0902942841667721dad3621c05f704f6b080d968ad355aeca51486" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.13.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-1/Mambaforge-4.13.0-1-MacOSX-x86_64.sh#bc42d606b67ace370847deb849e7d1ea2879b0be78bb1be51b020c3cb4e5bef2" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.14.0-0 b/plugins/python-build/share/python-build/mambaforge-4.14.0-0 new file mode 100644 index 0000000..8f950be --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.14.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-4.14.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-0/Mambaforge-4.14.0-0-Linux-aarch64.sh#37221b8d818951fab125c0bfb6cc6e83dac059f66892d2544a83192828d8e2c4" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-4.14.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-0/Mambaforge-4.14.0-0-Linux-ppc64le.sh#607bbd38aa21af4c79a663f2a183a06cca054efdd8d617c17370522504c7be1e" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-4.14.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-0/Mambaforge-4.14.0-0-Linux-x86_64.sh#d47b78b593e3cf5513bafbfa6a51eafcd9f0e164c41c79c790061bb583c82859" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.14.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-0/Mambaforge-4.14.0-0-MacOSX-arm64.sh#35d05a65e19b8e5d596964936ddd6023ae66d664a25ba291a52fec18f06a73b6" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.14.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-0/Mambaforge-4.14.0-0-MacOSX-x86_64.sh#949f046b4404cc8e081807b048050e6642d8db5520c20d5158a7ef721fbf76c5" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.14.0-1 b/plugins/python-build/share/python-build/mambaforge-4.14.0-1 new file mode 100644 index 0000000..a7626de --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.14.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-4.14.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-1/Mambaforge-4.14.0-1-Linux-aarch64.sh#f721dc44d5aba7a24c6f76408979d125e7ed7f1ba56397ff073a9cfd1611f71c" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-4.14.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-1/Mambaforge-4.14.0-1-Linux-ppc64le.sh#da6cbf1abe89fae4e1246aa64e86e8e155e7938c462f968265266af61fda64cc" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-4.14.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-1/Mambaforge-4.14.0-1-Linux-x86_64.sh#d9c8337bda234cf53d2743f32efaab41cbc9d942b8fb52b8588996ef0300c82f" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.14.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-1/Mambaforge-4.14.0-1-MacOSX-arm64.sh#48aca11999c866058c8201cbd01361cd1bf35044e36655874238cd57c06b389d" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.14.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-1/Mambaforge-4.14.0-1-MacOSX-x86_64.sh#e0f2c280e5cd4b4211151a9d8e40c3f86b1b53fdb4b4fbb907603409581e696f" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-4.14.0-2 b/plugins/python-build/share/python-build/mambaforge-4.14.0-2 new file mode 100644 index 0000000..ea738f8 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-4.14.0-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-4.14.0-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-2/Mambaforge-4.14.0-2-Linux-aarch64.sh#af6b683bb6bf3170a29b1fe37c1356d4b7fd94f9c38019d33d3d1933a5a5f41a" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-4.14.0-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-2/Mambaforge-4.14.0-2-Linux-ppc64le.sh#ab2cfff59870fbd946d26ed55fc47def32de25879b994eac6c464d079ed39c68" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-4.14.0-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-2/Mambaforge-4.14.0-2-Linux-x86_64.sh#ac3cabd483712a216f1dddeb92a7f8e198a771390c6627aa94791ab6abc7fae8" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-4.14.0-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-2/Mambaforge-4.14.0-2-MacOSX-arm64.sh#28b45f0949cb734347656e27acb6feb6da6ff12f93cb8c7546d7195e1ae1beba" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-4.14.0-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-2/Mambaforge-4.14.0-2-MacOSX-x86_64.sh#efd4ea95da961c8005a28ecb8bde719d0fd408ccac92dafaaa37eab133ff7a52" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-pypy3 b/plugins/python-build/share/python-build/mambaforge-pypy3 new file mode 100644 index 0000000..fb493e4 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-pypy3 @@ -0,0 +1,22 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Mambaforge-pypy3-Linux-ppc64le" "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-pypy3-Linux-ppc64le.sh" "miniconda" verify_py3_latest + ;; +"Linux-x86_64" ) + install_script "Mambaforge-pypy3-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-pypy3-Linux-x86_64.sh" "miniconda" verify_py3_latest + ;; +"Linux-aarch64" ) + install_script "Mambaforge-pypy3-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-pypy3-Linux-aarch64.sh" "miniconda" verify_py3_latest + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-pypy3-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-pypy3-MacOSX-x86_64.sh" "miniconda" verify_py3_latest + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge with PyPy3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/micropython-1.10 b/plugins/python-build/share/python-build/micropython-1.10 new file mode 100644 index 0000000..6bca881 --- /dev/null +++ b/plugins/python-build/share/python-build/micropython-1.10 @@ -0,0 +1,4 @@ +has_tar_xz_support \ + && src="https://micropython.org/resources/source/micropython-1.10.tar.xz#8488ec243217c4578f1cf2ed20e749344b01510a52d443da95304949cf7abfdb" \ + || src="https://github.com/micropython/micropython/releases/download/v1.10/micropython-1.10.tar.gz#207de28a243d5be59c1d5433670a5c76472ece532b446cc25da6cf3c6e943fbc" +install_package micropython-1.10 "$src" micropython diff --git a/plugins/python-build/share/python-build/micropython-1.11 b/plugins/python-build/share/python-build/micropython-1.11 new file mode 100644 index 0000000..fb04d79 --- /dev/null +++ b/plugins/python-build/share/python-build/micropython-1.11 @@ -0,0 +1,4 @@ +has_tar_xz_support \ + && src="https://micropython.org/resources/source/micropython-1.11.tar.xz#c3d4918149e3b9427a318a8a78efb928f2b724123832f1feb4d7921af490269d" \ + || src="https://github.com/micropython/micropython/releases/download/v1.11/micropython-1.11.tar.gz#2edda4ffe283899af6d7b59dd0a0a59f8b845fe0f26017f1a180661338eca35f" +install_package micropython-1.11 "$src" micropython diff --git a/plugins/python-build/share/python-build/micropython-1.12 b/plugins/python-build/share/python-build/micropython-1.12 new file mode 100644 index 0000000..ddb47c3 --- /dev/null +++ b/plugins/python-build/share/python-build/micropython-1.12 @@ -0,0 +1,4 @@ +has_tar_xz_support \ + && src="https://micropython.org/resources/source/micropython-1.12.tar.xz#181bfe82ba310a3f91540ee70d373f247141db3f9de8082fb189145df085d1b4" \ + || src="https://github.com/micropython/micropython/releases/download/v1.12/micropython-1.12.tar.gz#98fd02366bca23a61c77bbf2b999a45cfc237132db66b5b0874378a5446d81ba" +install_package micropython-1.12 "$src" micropython diff --git a/plugins/python-build/share/python-build/micropython-1.13 b/plugins/python-build/share/python-build/micropython-1.13 new file mode 100644 index 0000000..e883e84 --- /dev/null +++ b/plugins/python-build/share/python-build/micropython-1.13 @@ -0,0 +1,4 @@ +has_tar_xz_support \ + && src="https://micropython.org/resources/source/micropython-1.13.tar.xz#fb5434ec1fd2f7d06733696b020a992e69005532bcb97a9b4158ec1fffbc9c1e" \ + || src="https://github.com/micropython/micropython/releases/download/v1.13/micropython-1.13.tar.gz#9ab32eb2c19a682f6de7e9b4226de849c42cb92e1ecb4cf56438a75d763bd451" +install_package micropython-1.13 "$src" micropython diff --git a/plugins/python-build/share/python-build/micropython-1.14 b/plugins/python-build/share/python-build/micropython-1.14 new file mode 100644 index 0000000..4aa5e88 --- /dev/null +++ b/plugins/python-build/share/python-build/micropython-1.14 @@ -0,0 +1,4 @@ +has_tar_xz_support \ + && { install=install_package; src="https://micropython.org/resources/source/micropython-1.14.tar.xz#97306156fdeab120a1244626c75a929bb820722afdfc1317dbd5dadef388d94c"; } \ + || { install=install_zip; src="https://micropython.org/resources/source/micropython-1.14.zip#9aff4d9d8231d93cb9dac2b239ff947d1f123a0fe7a58614c252474cdd3b88d9"; } +$install micropython-1.14 "$src" micropython diff --git a/plugins/python-build/share/python-build/micropython-1.15 b/plugins/python-build/share/python-build/micropython-1.15 new file mode 100644 index 0000000..d17f069 --- /dev/null +++ b/plugins/python-build/share/python-build/micropython-1.15 @@ -0,0 +1,4 @@ +has_tar_xz_support \ + && { install=install_package; src="https://micropython.org/resources/source/micropython-1.15.tar.xz#52d020b3adef6c2bd2b6c8aba672f381c3c99d2b90130ac8d0d7414999cb4e13"; } \ + || { install=install_zip; src="https://micropython.org/resources/source/micropython-1.15.zip#8a0c6b5914a1d1eaf63f4b3c226db5049107f1bc1c6046e4dda8d4c5c4657e97"; } +$install micropython-1.15 "$src" micropython diff --git a/plugins/python-build/share/python-build/micropython-1.16 b/plugins/python-build/share/python-build/micropython-1.16 new file mode 100644 index 0000000..f383f08 --- /dev/null +++ b/plugins/python-build/share/python-build/micropython-1.16 @@ -0,0 +1,4 @@ +has_tar_xz_support \ + && { install=install_package; src="https://micropython.org/resources/source/micropython-1.16.tar.xz#48271fb5da97efc22325c3fc1d87ba45b32bab25673206d8d8136c25e4ff29a9"; } \ + || { install=install_zip; src="https://micropython.org/resources/source/micropython-1.16.zip#427adc00d2a99d102e4ce46d9eb4933d168e863f859bb3ce5b84735f0899c1ed"; } +$install micropython-1.16 "$src" micropython diff --git a/plugins/python-build/share/python-build/micropython-1.17 b/plugins/python-build/share/python-build/micropython-1.17 new file mode 100644 index 0000000..8bb47c4 --- /dev/null +++ b/plugins/python-build/share/python-build/micropython-1.17 @@ -0,0 +1,4 @@ +has_tar_xz_support \ + && { install=install_package; src="https://micropython.org/resources/source/micropython-1.17.tar.xz#e322f915cee784de0f8614779cdb88fce175956975b3864e2d1898a53638a2f7"; } \ + || { install=install_zip; src="https://micropython.org/resources/source/micropython-1.17.zip#4dfc60e2ba67e89c0b794c0533bb4e43a10d4e38095d0640b64b4faa9160f244"; } +$install micropython-1.17 "$src" micropython diff --git a/plugins/python-build/share/python-build/micropython-1.18 b/plugins/python-build/share/python-build/micropython-1.18 new file mode 100644 index 0000000..ce156d2 --- /dev/null +++ b/plugins/python-build/share/python-build/micropython-1.18 @@ -0,0 +1,4 @@ +has_tar_xz_support \ + && { install=install_package; src="https://micropython.org/resources/source/micropython-1.18.tar.xz#96fc71b42ed331c64e1adc5a830ec4f29f2975c23e8751109c03f32b80fa3eb4"; } \ + || { install=install_zip; src="https://micropython.org/resources/source/micropython-1.18.zip#90fa8049cf275310638b9e9c77121f6042f7250b814ef622f9522befde009f57"; } +$install micropython-1.18 "$src" micropython diff --git a/plugins/python-build/share/python-build/micropython-1.19.1 b/plugins/python-build/share/python-build/micropython-1.19.1 new file mode 100644 index 0000000..8606896 --- /dev/null +++ b/plugins/python-build/share/python-build/micropython-1.19.1 @@ -0,0 +1,4 @@ +has_tar_xz_support \ + && { install=install_package; src="https://micropython.org/resources/source/micropython-1.19.1.tar.xz#940e3815e8c425c6eaed3a2aa30d320220cc012a2654b6e086e1b6f0567df350"; } \ + || { install=install_zip; src="https://micropython.org/resources/source/micropython-1.19.1.zip#7047ce208627457c6881850527edb78189a1855a974aa34e2d929c9a3b3c5cc3"; } +$install micropython-1.19.1 "$src" micropython diff --git a/plugins/python-build/share/python-build/micropython-1.20.0 b/plugins/python-build/share/python-build/micropython-1.20.0 new file mode 100644 index 0000000..6470571 --- /dev/null +++ b/plugins/python-build/share/python-build/micropython-1.20.0 @@ -0,0 +1,4 @@ +has_tar_xz_support \ + && { install=install_package; src="https://micropython.org/resources/source/micropython-1.20.0.tar.xz#098ef8e40abdc62551b5460d0ffe9489074240c0cb5589ca3c3a425551beb9bf"; } \ + || { install=install_zip; src="https://micropython.org/resources/source/micropython-1.20.0.zip#6a2ce86e372ee8c5b9310778fff7fca1daa580afa28ea755f1a303675a8612b7"; } +$install micropython-1.20.0 "$src" micropython diff --git a/plugins/python-build/share/python-build/micropython-1.21.0 b/plugins/python-build/share/python-build/micropython-1.21.0 new file mode 100644 index 0000000..ccd8b7d --- /dev/null +++ b/plugins/python-build/share/python-build/micropython-1.21.0 @@ -0,0 +1,4 @@ +has_tar_xz_support \ + && { install=install_package; src="https://micropython.org/resources/source/micropython-1.21.0.tar.xz#abd2152613559d3f44728668346e78be9d93458133a03b700baf222c322fd4d5"; } \ + || { install=install_zip; src="https://micropython.org/resources/source/micropython-1.21.0.zip#12521faacc7191353f2739267bd9fd2a5e60ea04fb47df74f8e22b6bf59ba967"; } +$install micropython-1.21.0 "$src" micropython \ No newline at end of file diff --git a/plugins/python-build/share/python-build/micropython-1.9.3 b/plugins/python-build/share/python-build/micropython-1.9.3 new file mode 100644 index 0000000..be77043 --- /dev/null +++ b/plugins/python-build/share/python-build/micropython-1.9.3 @@ -0,0 +1,4 @@ +has_tar_xz_support \ + && src="https://micropython.org/resources/source/micropython-1.9.3.tar.xz#3aa37065f5ea8df372d36253d0ae6333c68572e577df8558d4b7b93e070c624d" \ + || src="https://github.com/micropython/micropython/releases/download/v1.9.3/micropython-1.9.3.tar.gz#f94c0b4834edca625b86c0846c89e609ee8fbdbe98e7f719d5108d74b6b4945e" +install_package micropython-1.9.3 "$src" micropython_1_9 diff --git a/plugins/python-build/share/python-build/micropython-1.9.4 b/plugins/python-build/share/python-build/micropython-1.9.4 new file mode 100644 index 0000000..8d5dd56 --- /dev/null +++ b/plugins/python-build/share/python-build/micropython-1.9.4 @@ -0,0 +1,4 @@ +has_tar_xz_support \ + && src="https://micropython.org/resources/source/micropython-1.9.4.tar.xz#1d358d99e908a94fd6dd0d6b448ee56c5830b609cf27a42e0db3bee40cc52a9e" \ + || src="https://github.com/micropython/micropython/releases/download/v1.9.4/micropython-1.9.4.tar.gz#0db042011bffcbd65362b67eb3cca87eaefa9f2a55b747fa75e922c706b8ce1a" +install_package micropython-1.9.4 "$src" micropython_1_9 diff --git a/plugins/python-build/share/python-build/micropython-dev b/plugins/python-build/share/python-build/micropython-dev new file mode 100644 index 0000000..ee3d226 --- /dev/null +++ b/plugins/python-build/share/python-build/micropython-dev @@ -0,0 +1 @@ +install_git micropython-dev https://github.com/micropython/micropython master micropython diff --git a/plugins/python-build/share/python-build/miniconda-2.2.2 b/plugins/python-build/share/python-build/miniconda-2.2.2 new file mode 100644 index 0000000..63d54ee --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda-2.2.2 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda-2.2.2-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda-2.2.2-Linux-x86.sh#c6c7847066dbf459f3934f7fc870d2b0919cf2cbdad78601e85c2c720daadc9d" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda-2.2.2-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda-2.2.2-Linux-x86_64.sh#1cb05546029363279b0d6be5d66e7254b7e2b52637a02601483771f6248dde43" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda-2.2.2-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda-2.2.2-MacOSX-x86_64.sh#69139f6c3988b9dc7900e8e65a1f265745b185b6a60e577fe2fd4ff84646c94e" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda-3.0.0 b/plugins/python-build/share/python-build/miniconda-3.0.0 new file mode 100644 index 0000000..fb40cb1 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda-3.0.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda-3.0.0-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda-3.0.0-Linux-x86.sh#ffd2fb01d0c379d5e11a07f0712ebbddae73f24fe266d1af3c3fd93cc383ca8b" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda-3.0.0-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.0.0-Linux-x86_64.sh#09b3a81ea0421260ae5f8a1ba8a6a21b1e9f0c745d43b997010f11ad1920dbe3" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda-3.0.0-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.0.0-MacOSX-x86_64.sh#8f825d04146a8229154c54cf07e9cafd9b1fe44dbcfe92c36020a502489e04da" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda-3.0.4 b/plugins/python-build/share/python-build/miniconda-3.0.4 new file mode 100644 index 0000000..2934f46 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda-3.0.4 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda-3.0.4-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda-3.0.4-Linux-x86.sh#b3f392e042469a598e2cd74886d1e15c4708e190a4b188f50fa61c057d7a0ffe" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda-3.0.4-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.0.4-Linux-x86_64.sh#39f75a6d1619109b96756b4882d962ee12e40e07aa6d662eec10a88f19950eaa" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda-3.0.4-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.0.4-MacOSX-x86_64.sh#a457695a2c1216ee91f23d6a1cf2a911178382ee25fd5166ad21d45d5e57de5b" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda-3.0.5 b/plugins/python-build/share/python-build/miniconda-3.0.5 new file mode 100644 index 0000000..3874ada --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda-3.0.5 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda-3.0.5-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda-3.0.5-Linux-x86.sh#7f1b78d7380c664f65d811e76f3515c46689947634752e711693202a7451b85b" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda-3.0.5-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.0.5-Linux-x86_64.sh#5439a10dc7ff66fa48f5b40290adfad01e58db3b03317d87f90aaf72deda862a" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda-3.0.5-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.0.5-MacOSX-x86_64.sh#5ba297923cb06ed7077c4ee5e4213bc7db2878dbec9ccba1d4c9c61d5e2697ee" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda-3.10.1 b/plugins/python-build/share/python-build/miniconda-3.10.1 new file mode 100644 index 0000000..217498f --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda-3.10.1 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda-3.10.1-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda-3.10.1-Linux-x86.sh#509ee56f1590705472fdac4a00aa7191f79a6a09daf4af088e92f93c648d815e" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda-3.10.1-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.10.1-Linux-x86_64.sh#363f56f5608d1552325549e7371fcf460c5ed45484eb300058e3b99c997808b5" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda-3.10.1-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.10.1-MacOSX-x86_64.sh#61a1e468a79cca45a518b1760033e7af89108bf88487afead79f96e3229b422a" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda-3.16.0 b/plugins/python-build/share/python-build/miniconda-3.16.0 new file mode 100644 index 0000000..6c584a0 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda-3.16.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda-3.16.0-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda-3.16.0-Linux-x86.sh#57e9659848e6322cb18c1c4a5c844a4f7dc5e784dbd8977245769ff9db28dade" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda-3.16.0-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.16.0-Linux-x86_64.sh#b1facded0d33850e3a467d6e4589830be477bd4f819407b99b033a4d22601e4d" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda-3.16.0-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.16.0-MacOSX-x86_64.sh#e93517696d4ede4f8ff21ea42272f24508023b83f1e2e2c989d1b32ab19347a9" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda-3.18.3 b/plugins/python-build/share/python-build/miniconda-3.18.3 new file mode 100644 index 0000000..c6b720b --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda-3.18.3 @@ -0,0 +1 @@ +source "${BASH_SOURCE%/*}/miniconda2-3.18.3" diff --git a/plugins/python-build/share/python-build/miniconda-3.3.0 b/plugins/python-build/share/python-build/miniconda-3.3.0 new file mode 100644 index 0000000..349e851 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda-3.3.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda-3.3.0-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda-3.3.0-Linux-x86.sh#415119946afab438ee2ec9d9cd063977da780029d5561d2558101233913f226a" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda-3.3.0-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.3.0-Linux-x86_64.sh#e071ff3ffb9b4df65edf5e780d576c901753fecccd10e5af629138036aa51de3" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda-3.3.0-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.3.0-MacOSX-x86_64.sh#9e9a65c69a1f4ec3b4df05f477b517dfa1088182344bfe8009f58d0b4bd00e5c" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda-3.4.2 b/plugins/python-build/share/python-build/miniconda-3.4.2 new file mode 100644 index 0000000..c8bcd99 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda-3.4.2 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda-3.4.2-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda-3.4.2-Linux-x86.sh#f198359f0b34f7efa704235d24126160930b7ea7205127880f3acb0a47999413" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda-3.4.2-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.4.2-Linux-x86_64.sh#97d4e234f6abca0c53c606b8a7a73b909cc05a7703c512f4ea855de83b753db1" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda-3.4.2-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.4.2-MacOSX-x86_64.sh#f428977cbef0d5b78379d886735c75e446a482ecb6b5605837d6c2738ddcd074" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda-3.7.0 b/plugins/python-build/share/python-build/miniconda-3.7.0 new file mode 100644 index 0000000..023adb7 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda-3.7.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda-3.7.0-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda-3.7.0-Linux-x86.sh#cada23bbaab6f21053d45f6d76cf311dffb2f234659fcef0b6a33a6d769317cb" "miniconda" verify_py27 +;; +"Linux-x86_64" ) + install_script "Miniconda-3.7.0-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.7.0-Linux-x86_64.sh#ed6fd3f85dc43ca10e41355bf3efc40bffd64f2364aecad24ac68a9f1009a469" "miniconda" verify_py27 +;; +"MacOSX-x86_64" ) + install_script "Miniconda-3.7.0-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.7.0-MacOSX-x86_64.sh#9a8e731a2a3bd6ab3d5b7304c3c783c04582386142fe39ceb7d5bfabdd74d8eb" "miniconda" verify_py27 +;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda-3.8.3 b/plugins/python-build/share/python-build/miniconda-3.8.3 new file mode 100644 index 0000000..b859b98 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda-3.8.3 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda-3.8.3-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda-3.8.3-Linux-x86.sh#253a95fac2dbcc01ad5ce5a78d241a362482e1fbb24b1000ea5e217f55825cb6" "miniconda" verify_py27 +;; +"Linux-x86_64" ) + install_script "Miniconda-3.8.3-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.8.3-Linux-x86_64.sh#7ac19397731ffb212ed5534c29cd25f5f4c0c81669707ba6da8635cf1431c114" "miniconda" verify_py27 +;; +"MacOSX-x86_64" ) + install_script "Miniconda-3.8.3-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.8.3-MacOSX-x86_64.sh#e19e16b7969fb256d68f7de3a4e02331ba04e1c48a262d2b9f66db106e016257" "miniconda" verify_py27 +;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda-3.9.1 b/plugins/python-build/share/python-build/miniconda-3.9.1 new file mode 100644 index 0000000..d50b66e --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda-3.9.1 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda-3.9.1-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda-3.9.1-Linux-x86.sh#f3cdc8d774acce05462eb07d2676162c519e1e5d35c98d1dc3d6eb7b262da0b2" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda-3.9.1-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.9.1-Linux-x86_64.sh#64f2b5047f944bb9b06e46c7281e9edffd412981c93e31d4c111287a1d30fef4" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda-3.9.1-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda-3.9.1-MacOSX-x86_64.sh#ea529626cfb3519eebee83c40965f0a58375e0826c6777b759eb0c42ca9970d2" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda-latest b/plugins/python-build/share/python-build/miniconda-latest new file mode 100644 index 0000000..8b24428 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda-latest @@ -0,0 +1 @@ +source "${BASH_SOURCE%/*}/miniconda2-latest" diff --git a/plugins/python-build/share/python-build/miniconda2-2.7-4.8.3 b/plugins/python-build/share/python-build/miniconda2-2.7-4.8.3 new file mode 100644 index 0000000..a459ffe --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda2-2.7-4.8.3 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniconda2-py27_4.8.3-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda2-py27_4.8.3-Linux-ppc64le.sh#120b300120b1362831f2075cc0bd452f" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda2-py27_4.8.3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-py27_4.8.3-Linux-x86_64.sh#19ce7d0039ab349914d928e7f32b1c1b" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda2-py27_4.8.3-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-py27_4.8.3-MacOSX-x86_64.sh#14e2d294decc5a48a449b588f5819c10" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda2-3.18.3 b/plugins/python-build/share/python-build/miniconda2-3.18.3 new file mode 100644 index 0000000..dc4a6a4 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda2-3.18.3 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda2-3.18.3-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda2-3.18.3-Linux-x86.sh#1eceb3a763ab784af41a46dfd96a520659957b5fefdc1f4d53f00de43b539be0" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda2-3.18.3-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-3.18.3-Linux-x86_64.sh#dd16e093aec2346af4e8f383a9dedb9a3d6c1a0cb7637b180e1e0790dfa55e81" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda2-3.18.3-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-3.18.3-MacOSX-x86_64.sh#c90b37e4ba866ac2195ddf9ffe5549311279041def27ade29f661f5707d43c94" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda2-3.19.0 b/plugins/python-build/share/python-build/miniconda2-3.19.0 new file mode 100644 index 0000000..eeb0b07 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda2-3.19.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda2-3.19.0-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda2-3.19.0-Linux-x86.sh#869d65bed0927ff78973947f619558ed8be282851632449631d1923e3ac814d6" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda2-3.19.0-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-3.19.0-Linux-x86_64.sh#646b4d5398f8d76a0664375ee6226611c43ee3d49de3eb03efe7480e3c3b9ebf" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda2-3.19.0-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-3.19.0-MacOSX-x86_64.sh#32915acbfc8491e9fbe12b90a611a76b84e15f2cdef5272f576bfe77a4ef7061" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda2-4.0.5 b/plugins/python-build/share/python-build/miniconda2-4.0.5 new file mode 100644 index 0000000..d609380 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda2-4.0.5 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda2-4.0.5-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda2-4.0.5-Linux-x86.sh#fc85229837ef2f0571e0c369e6de8ae7339b6cd9f16449efce0a2a01f0bec110" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda2-4.0.5-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-4.0.5-Linux-x86_64.sh#ada5b7942e519829bc5e8e638d525e009676a7a598cf3dd80f041f6d5e39ddbb" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda2-4.0.5-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-4.0.5-MacOSX-x86_64.sh#7471adcdf7ff1f4e7464617992f57fb7f6f58dbc16ce2455d441dc2c2660e350" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda2-4.1.11 b/plugins/python-build/share/python-build/miniconda2-4.1.11 new file mode 100644 index 0000000..d3d16b5 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda2-4.1.11 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda2-4.1.11-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda2-4.1.11-Linux-x86.sh#5c4f6e121ddcbd24c7f7d3e7a6ce06c60cf2c98b14895620f1d7805d75bc5a9f" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda2-4.1.11-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-4.1.11-Linux-x86_64.sh#4cdd4707c8bd2959551e40c6d4561ebec2711e034a04305e2dd1f88f038edb04" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda2-4.1.11-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-4.1.11-MacOSX-x86_64.sh#a974389c7aab8058f14fa7d4bc00e5bb5316a3da4b0ca1463b854701532297d7" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda2-4.3.14 b/plugins/python-build/share/python-build/miniconda2-4.3.14 new file mode 100644 index 0000000..5921b9d --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda2-4.3.14 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda2-4.3.14-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda2-4.3.14-Linux-x86.sh#3ff873687fa5cd40f3d32ac8578003b97e98090b8fc1fa969bcfd087897f598d" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda2-4.3.14-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-4.3.14-Linux-x86_64.sh#2dc629843be954fc747f08ffbcb973b5473f6818464b82a00260c38f687e02f1" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda2-4.3.14-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-4.3.14-MacOSX-x86_64.sh#de5ec11463073f2d9cb4c7ea18e128ba24142d9065926a977262e61c66f61ae8" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda2-4.3.21 b/plugins/python-build/share/python-build/miniconda2-4.3.21 new file mode 100644 index 0000000..bb7fc2c --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda2-4.3.21 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda2-4.3.21-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda2-4.3.21-Linux-x86.sh#180b46832849ecba5cfb19e1cd60a38f98e02ac2fd1517648771af8f049b7d50" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda2-4.3.21-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-4.3.21-Linux-x86_64.sh#5097d5ec484a345c8785655113b19b88bfcd69af5f25a36c832ce498f02ea052" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda2-4.3.21-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-4.3.21-MacOSX-x86_64.sh#ec996889bed2f4bfbd6775222dcd5e1633e50b203e56643944611501a79b8037" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda2-4.3.27 b/plugins/python-build/share/python-build/miniconda2-4.3.27 new file mode 100644 index 0000000..ddd8432 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda2-4.3.27 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda2-4.3.27.1-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda2-4.3.27.1-Linux-x86.sh#3d80246ff3942599669f86c10468e25af482cdd1197c3168027ef6680c857f95" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda2-4.3.27.1-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-4.3.27.1-Linux-x86_64.sh#f7bb442faeed33330564bfc33188a9dcd4ebe2ab3771aa89a823c03e67197e1d" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda2-4.3.27-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-4.3.27-MacOSX-x86_64.sh#7e3d2bc3e48f1daca127062a59e518df37f279aa750ca595c2c8c9569eff2fba" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda2-4.3.30 b/plugins/python-build/share/python-build/miniconda2-4.3.30 new file mode 100644 index 0000000..1c7957d --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda2-4.3.30 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda2-4.3.30-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda2-4.3.30-Linux-x86.sh#3727dcc1561be246c052d6be210b5fd748bf32407cb7e06d0322fe4f79c77482" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda2-4.3.30-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-4.3.30-Linux-x86_64.sh#0891000ca28359e63aa77e613c01f7a88855dedfc0ddc8be31829f3139318cf3" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda2-4.3.30.1-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-4.3.30.1-MacOSX-x86_64.sh#1d4eb025ce58e6f0d5e19b39191ca17dee1fe3b2fd7d425a7418d99fe01fd65e" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda2-4.3.31 b/plugins/python-build/share/python-build/miniconda2-4.3.31 new file mode 100644 index 0000000..d130064 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda2-4.3.31 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda2-4.3.31-Linux-x86" "https://repo.anaconda.com/miniconda/Miniconda2-4.3.31-Linux-x86.sh#4067ba22e1d687f92b11531a0b30b17f" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda2-4.3.31-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.3.31-Linux-x86_64.sh#da2dd466d26e33a2b1f72fdb853a8ff0" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda2-4.3.31-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.3.31-MacOSX-x86_64.sh#2c499488605bafd9e13a430f299f1489" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda2-4.4.10 b/plugins/python-build/share/python-build/miniconda2-4.4.10 new file mode 100644 index 0000000..adaf142 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda2-4.4.10 @@ -0,0 +1,22 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniconda2-4.4.10-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda2-4.4.10-Linux-ppc64le.sh#c6bf34cef423be4cda46df61fd09e069" "miniconda" verify_py27 + ;; +"Linux-x86" ) + install_script "Miniconda2-4.4.10-Linux-x86" "https://repo.anaconda.com/miniconda/Miniconda2-4.4.10-Linux-x86.sh#1e8bf30cb77548f6aae9f4444b826fcb" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda2-4.4.10-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.4.10-Linux-x86_64.sh#dd54b344661560b861f86cc5ccff044b" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda2-4.4.10-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.4.10-MacOSX-x86_64.sh#20e0f8851c93331f763635c89840c39c" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda2-4.5.1 b/plugins/python-build/share/python-build/miniconda2-4.5.1 new file mode 100644 index 0000000..1b78b98 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda2-4.5.1 @@ -0,0 +1,22 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniconda2-4.5.1-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.1-Linux-ppc64le.sh#02a0628652df3ab5917568606fecb8c3" "miniconda" verify_py27 + ;; +"Linux-x86" ) + install_script "Miniconda2-4.5.1-Linux-x86" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.1-Linux-x86.sh#9da5b43024d7edba30d0359c547cd2e5" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda2-4.5.1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.1-Linux-x86_64.sh#332aeff0bb6b45bbf7e220dec17ba867" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda2-4.5.1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.1-MacOSX-x86_64.sh#ad96c4012ca4d84d94f94d9c2f90a889" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda2-4.5.11 b/plugins/python-build/share/python-build/miniconda2-4.5.11 new file mode 100644 index 0000000..af0bf60 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda2-4.5.11 @@ -0,0 +1,22 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniconda2-4.5.11-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.11-Linux-ppc64le.sh#b85a019f75ff87714eb3254dd1f3390f" "miniconda" verify_py27 + ;; +"Linux-x86" ) + install_script "Miniconda2-4.5.11-Linux-x86" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.11-Linux-x86.sh#187c460ffc6ea5f890b512320b2994c6" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda2-4.5.11-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.11-Linux-x86_64.sh#458324438b7b0e5afcc272b63d44195d" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda2-4.5.11-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.11-MacOSX-x86_64.sh#a444da43ad50a83c332ea1fb7a5bb96c" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda2-4.5.12 b/plugins/python-build/share/python-build/miniconda2-4.5.12 new file mode 100644 index 0000000..fd49f3f --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda2-4.5.12 @@ -0,0 +1,22 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniconda2-4.5.12-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.12-Linux-ppc64le.sh#e441328782c71c7ce71cc2a668df0451" "miniconda" verify_py27 + ;; +"Linux-x86" ) + install_script "Miniconda2-4.5.12-Linux-x86" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.12-Linux-x86.sh#56c90370226fd410c9b0086bd693d9c0" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda2-4.5.12-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.12-Linux-x86_64.sh#4be03f925e992a8eda03758b72a77298" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda2-4.5.12-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.12-MacOSX-x86_64.sh#76041da218ab91e2c9538a5dc19cd14e" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda2-4.5.4 b/plugins/python-build/share/python-build/miniconda2-4.5.4 new file mode 100644 index 0000000..c7098a5 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda2-4.5.4 @@ -0,0 +1,22 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniconda2-4.5.4-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.4-Linux-ppc64le.sh#3e26ee6447c8025609ea1e410f768417" "miniconda" verify_py27 + ;; +"Linux-x86" ) + install_script "Miniconda2-4.5.4-Linux-x86" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.4-Linux-x86.sh#a638ae058a0ce15c5b289d151c488045" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda2-4.5.4-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.4-Linux-x86_64.sh#8a1c02f6941d8778f8afad7328265cf5" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda2-4.5.4-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.5.4-MacOSX-x86_64.sh#35f4ca99d33ed56f68745eeaf1449274" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda2-4.6.14 b/plugins/python-build/share/python-build/miniconda2-4.6.14 new file mode 100644 index 0000000..e609b53 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda2-4.6.14 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniconda2-4.6.14-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda2-4.6.14-Linux-ppc64le.sh#76eeccfcf127bb29ce71a279ebd185a9" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda2-4.6.14-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.6.14-Linux-x86_64.sh#faa7cb0b0c8986ac3cacdbbd00fe4168" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda2-4.6.14-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.6.14-MacOSX-x86_64.sh#6665a5911f92dce1cf6d1021249af9db" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda2-4.7.10 b/plugins/python-build/share/python-build/miniconda2-4.7.10 new file mode 100644 index 0000000..9931995 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda2-4.7.10 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniconda2-4.7.10-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda2-4.7.10-Linux-ppc64le.sh#dee73c820a4e3af712f0b3ff02f57264" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda2-4.7.10-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.7.10-Linux-x86_64.sh#3bc6ffc6cda8efa467926dfd92a30bca" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda2-4.7.10-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.7.10-MacOSX-x86_64.sh#f540257a4b1df264e6f72c75f75620bb" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda2-4.7.12 b/plugins/python-build/share/python-build/miniconda2-4.7.12 new file mode 100644 index 0000000..8e89cfa --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda2-4.7.12 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniconda2-4.7.12-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda2-4.7.12-Linux-ppc64le.sh#59325e5b37e93f39ab4b3987abe1b7dd" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda2-4.7.12-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.7.12-Linux-x86_64.sh#5a218d9dce3a77905d17ae87ac72a1e8" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda2-4.7.12-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.7.12-MacOSX-x86_64.sh#2498099a426fcaafd1068fd6d79e3a6d" "miniconda" verify_py27 + ;; +"Linux-ppc64le" ) + install_script "Miniconda2-4.7.12.1-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda2-4.7.12.1-Linux-ppc64le.sh#f00e3c5881c2629a9b516cc7a62bbc3c" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda2-4.7.12.1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.7.12.1-Linux-x86_64.sh#23bf3acd6aead6e91fb936fc185b033e" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda2-4.7.12.1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda2-4.7.12.1-MacOSX-x86_64.sh#5a10de42eb90c1c21dbda191f1ec19b1" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda2-latest b/plugins/python-build/share/python-build/miniconda2-latest new file mode 100644 index 0000000..f81f640 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda2-latest @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda2-latest-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda2-latest-Linux-x86.sh" "miniconda" verify_py27 + ;; +"Linux-x86_64" ) + install_script "Miniconda2-latest-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-latest-Linux-x86_64.sh" "miniconda" verify_py27 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda2-latest-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda2-latest-MacOSX-x86_64.sh" "miniconda" verify_py27 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda2 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-2.2.2 b/plugins/python-build/share/python-build/miniconda3-2.2.2 new file mode 100644 index 0000000..804a490 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-2.2.2 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda3-2.2.2-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-2.2.2-Linux-x86.sh#55a8d6fbd680a4959525c600f3d30475af54b338beee7cd1b44a10d8122e3ee4" "miniconda" verify_py33 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-2.2.2-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-2.2.2-Linux-x86_64.sh#4fb79fd66c228e221e8e6627570c84efb785f90ede576d6697e91f906b515548" "miniconda" verify_py33 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-2.2.2-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-2.2.2-MacOSX-x86_64.sh#040065c06fdeaade1bec67418573608763f6c8c481e0e4e6a9f267598767ab33" "miniconda" verify_py33 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.0.0 b/plugins/python-build/share/python-build/miniconda3-3.0.0 new file mode 100644 index 0000000..704fb0e --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.0.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda3-3.0.0-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-3.0.0-Linux-x86.sh#1280ea8cbfcbd3f2a490b094657f2af7872752629b4895b88163f6d0d50dca83" "miniconda" verify_py33 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-3.0.0-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.0.0-Linux-x86_64.sh#6bfa6dd73140f00b15e49a8092ec74dbbb96ad28d68a5e05dedd9b427539fcaf" "miniconda" verify_py33 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-3.0.0-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.0.0-MacOSX-x86_64.sh#b693cfdd2c4b819cd2e977b7200277e7374bcc1578a3d1975255a28887896597" "miniconda" verify_py33 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.0.4 b/plugins/python-build/share/python-build/miniconda3-3.0.4 new file mode 100644 index 0000000..0648967 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.0.4 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda3-3.0.4-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-3.0.4-Linux-x86.sh#1046256accc3b752f4625658e7d845d65c14c7fbb7346579ee828adf7139471d" "miniconda" verify_py33 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-3.0.4-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.0.4-Linux-x86_64.sh#afe03bbed5001a5352e81c018e0bb14e6ade2baa09ecf689febfd6edecb5e93a" "miniconda" verify_py33 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-3.0.4-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.0.4-MacOSX-x86_64.sh#986525923231b4796c1eb13f2e4defae9aad5ed09b3e32c01b7ebb0aad4ad870" "miniconda" verify_py33 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.0.5 b/plugins/python-build/share/python-build/miniconda3-3.0.5 new file mode 100644 index 0000000..5d7d5cd --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.0.5 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda3-3.0.5-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-3.0.5-Linux-x86.sh#014d0e44b752d9e91373a3c56252b62c0f29b628a8584f8b5515c7c3d8acc6be" "miniconda" verify_py33 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-3.0.5-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.0.5-Linux-x86_64.sh#eaf8c5005645eecd18cc09d2da2a69314057a9e36eadc5084120bc1deffa332b" "miniconda" verify_py33 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-3.0.5-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.0.5-MacOSX-x86_64.sh#7c088951665e2c35574f6dde81189467d80806caff47872887525ed3d0b4dbd0" "miniconda" verify_py33 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-22.11.1-1 b/plugins/python-build/share/python-build/miniconda3-3.10-22.11.1-1 new file mode 100644 index 0000000..ed3e7e4 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-22.11.1-1 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_22.11.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_22.11.1-1-Linux-aarch64.sh#48a96df9ff56f7421b6dd7f9f71d548023847ba918c3826059918c08326c2017" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py310_22.11.1-1-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py310_22.11.1-1-Linux-ppc64le.sh#4c86c3383bb27b44f7059336c3a46c34922df42824577b93eadecefbf7423836" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_22.11.1-1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_22.11.1-1-Linux-s390x.sh#a150511e7fd19d07b770f278fb5dd2df4bc24a8f55f06d6274774f209a36c766" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_22.11.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_22.11.1-1-Linux-x86_64.sh#00938c3534750a0e4069499baf8f4e6dc1c2e471c86a59caa0dd03f4a9269db6" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_22.11.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_22.11.1-1-MacOSX-arm64.sh#22eec9b7d3add25ac3f9b60621d8f3d8df3e63d4aa0ae5eb846b558d7ba68333" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_22.11.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_22.11.1-1-MacOSX-x86_64.sh#7406579393427eaf9bc0e094dcd3c66d1e1b93ee9db4e7686d0a72ea5d7c0ce5" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-23.1.0-1 b/plugins/python-build/share/python-build/miniconda3-3.10-23.1.0-1 new file mode 100644 index 0000000..1b4cbea --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-23.1.0-1 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_23.1.0-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.1.0-1-Linux-aarch64.sh#80d6c306b015e1e3b01ea59dc66c676a81fa30279bc2da1f180a7ef7b2191d6e" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py310_23.1.0-1-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.1.0-1-Linux-ppc64le.sh#9ca8077a0af8845fc574a120ef8d68690d7a9862d354a2a4468de5d2196f406c" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_23.1.0-1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.1.0-1-Linux-s390x.sh#0d00a9d34c5fd17d116bf4e7c893b7441a67c7a25416ede90289d87216104a97" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_23.1.0-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.1.0-1-Linux-x86_64.sh#32d73e1bc33fda089d7cd9ef4c1be542616bd8e437d1f77afeeaf7afdb019787" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_23.1.0-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.1.0-1-MacOSX-arm64.sh#cc5bcf95d5db0f7f454b2d800d52da8b70563f8454d529e7ac2da9725650eb27" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_23.1.0-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.1.0-1-MacOSX-x86_64.sh#bfb81814e16eb450b1dbde7b4ecb9ebc5186834cb4ede5926c699762ca69953b" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-23.10.0-1 b/plugins/python-build/share/python-build/miniconda3-3.10-23.10.0-1 new file mode 100644 index 0000000..ecdea4e --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-23.10.0-1 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_23.10.0-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.10.0-1-Linux-aarch64.sh#3b8698e433dd9e8f948f94939b176b7819807bedb86020b81e2fca674d3df3b4" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py310_23.10.0-1-Linux-ppc64le.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.10.0-1-Linux-ppc64le.sh#8ba2b32ee15be9e43c3712d9235e8c6f1350de733e72f67ef035c878eee134e5" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_23.10.0-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.10.0-1-Linux-s390x.sh#ab037a5df6414fe48979285769a61bf99e46d1efd1c98bd3b0a9ab767862f86b" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_23.10.0-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.10.0-1-Linux-x86_64.sh#c7a34df472feb69805b64df6e8db58363c5ccab41cd3b40b07e3e6dfb924359a" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_23.10.0-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.10.0-1-MacOSX-arm64.sh#a1477dfb4edfe922c2d1ed8dce90c16e6c57b3008f9503fae804acfda67736ae" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_23.10.0-1-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.10.0-1-MacOSX-x86_64.sh#bea320962dce404ecc1f6f4b0c0462cd3300df8ab165e5cb5bcee372c498535f" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-23.11.0-1 b/plugins/python-build/share/python-build/miniconda3-3.10-23.11.0-1 new file mode 100644 index 0000000..1be16ce --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-23.11.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_23.11.0-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-1-Linux-aarch64.sh#30b3f26fee441c5d70bd50ec06ea1acaa0e373ad30771165eada3f6bdf27766a" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_23.11.0-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-1-Linux-s390x.sh#54bfe6a47e24ddaa74b02c88d64596c1234fdf6c3789740471dea2bf3c685392" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_23.11.0-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-1-Linux-x86_64.sh#6581658486be8e700d77e24eccafba586a0fbafafadcf73d35ab13eaee4b80b1" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_23.11.0-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-1-MacOSX-arm64.sh#570f66f7264d8ba3195fc0755baed35320842b36fb34ef16bdc142f1dc616cae" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_23.11.0-1-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-1-MacOSX-x86_64.sh#6517332e5af2088a0413dd9f536f258814efb6d5b9f78011a6f2ea53e2874484" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-23.11.0-2 b/plugins/python-build/share/python-build/miniconda3-3.10-23.11.0-2 new file mode 100644 index 0000000..bf84089 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-23.11.0-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_23.11.0-2-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-2-Linux-aarch64.sh#85bb96bca04b75f2081b4c0f7f10476fd67fba1637c18b07272aa3a518df5596" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_23.11.0-2-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-2-Linux-s390x.sh#fd506291eb51641e8cd3164c09fec31826f26dc446c3da9bb4c88fe35c95dfe7" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_23.11.0-2-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-2-Linux-x86_64.sh#35a58b8961e1187e7311b979968662c6223e86e1451191bed2e67a72b6bd0658" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_23.11.0-2-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-2-MacOSX-arm64.sh#958a8d6e14d9eb843b24ba4019a1b62e0dedd819d844247485fd0c0ea4acbc61" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_23.11.0-2-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-2-MacOSX-x86_64.sh#07a6f46146993510d5d839ee014fc2229f7870d92aa73a52f11dd240833f08fb" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-23.3.1-0 b/plugins/python-build/share/python-build/miniconda3-3.10-23.3.1-0 new file mode 100644 index 0000000..00703dd --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-23.3.1-0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_23.3.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.3.1-0-Linux-aarch64.sh#6950c7b1f4f65ce9b87ee1a2d684837771ae7b2e6044e0da9e915d1dee6c924c" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py310_23.3.1-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.3.1-0-Linux-ppc64le.sh#b3de538cd542bc4f5a2f2d2a79386288d6e04f0e1459755f3cefe64763e51d16" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_23.3.1-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.3.1-0-Linux-s390x.sh#ed4f51afc967e921ff5721151f567a4c43c4288ac93ec2393c6238b8c4891de8" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_23.3.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.3.1-0-Linux-x86_64.sh#aef279d6baea7f67940f16aad17ebe5f6aac97487c7c03466ff01f4819e5a651" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_23.3.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.3.1-0-MacOSX-arm64.sh#9d1d12573339c49050b0d5a840af0ff6c32d33c3de1b3db478c01878eb003d64" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_23.3.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.3.1-0-MacOSX-x86_64.sh#5abc78b664b7da9d14ade330534cc98283bb838c6b10ad9cfd8b9cc4153f8104" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-23.5.0-3 b/plugins/python-build/share/python-build/miniconda3-3.10-23.5.0-3 new file mode 100644 index 0000000..de8ca21 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-23.5.0-3 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_23.5.0-3-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.0-3-Linux-aarch64.sh#a632110a9ebddd8528b26241663ee9368d218e36b40e570072774897762f1de8" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py310_23.5.0-3-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.0-3-Linux-ppc64le.sh#5ed0af4645f49c4412e33a3f94396bcb3eb25f4a3ccb0bfe5bc23ef06bad6f3f" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_23.5.0-3-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.0-3-Linux-s390x.sh#5701eba074e3c2894949370ab456df48361a2efaad9b11209dbf8258ddf1e331" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_23.5.0-3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.0-3-Linux-x86_64.sh#738890e7a6f0719a942c632a0aab1df7a5a592c5667d0495d1f0495990a709ba" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_23.5.0-3-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.0-3-MacOSX-arm64.sh#ff2121c0a8245bbe63ff70cdb76b492c831889225f9c5277e096f08fd03e7f17" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_23.5.0-3-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.0-3-MacOSX-x86_64.sh#03a98ff5d1c813d7bf969203fe404d7a6f149b335c2077703656807721603495" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-23.5.1-0 b/plugins/python-build/share/python-build/miniconda3-3.10-23.5.1-0 new file mode 100644 index 0000000..1b5f19e --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-23.5.1-0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_23.5.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.1-0-Linux-aarch64.sh#d6a99c45326f8e849b18964090f0f5ac56bc4f173a6b18a4a5057bc09bd128f3" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py310_23.5.1-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.1-0-Linux-ppc64le.sh#920a8d8f9a6aa6bc1cd2ddf56cb0af779b3c70eb82d61fb05397814adfc0837f" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_23.5.1-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.1-0-Linux-s390x.sh#63962e4c21e13b680f62d8c7cf11fb1a4a2192188d0d7c0a0994099470b65567" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_23.5.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.1-0-Linux-x86_64.sh#9f4cd0a9f7289a1e03b79fe6d06bab0769c46c33a774ea8a94dc3c1883344d85" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_23.5.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.1-0-MacOSX-arm64.sh#dde48d596695115a05218d694b20212d900a66c005a1926a9018a756b1188f1f" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_23.5.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.1-0-MacOSX-x86_64.sh#4e5315e39ce5be6d64fb0bf0a62aa6e8d09224542fa5b9a4d695c599bd6f66b0" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-23.5.2-0 b/plugins/python-build/share/python-build/miniconda3-3.10-23.5.2-0 new file mode 100644 index 0000000..a50be90 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-23.5.2-0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_23.5.2-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.2-0-Linux-aarch64.sh#24f7fe91032538cf2d9748facabae346e45e46ca21bb5f2d5875b7865dca6fa4" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py310_23.5.2-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.2-0-Linux-ppc64le.sh#3a76e4e400271d1589770dac8f696b03d1faf45fee57da38e8c399b6cb0daadb" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_23.5.2-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.2-0-Linux-s390x.sh#7a65b8593db0ec4b561b9968daca7c7c4f5f95cb21fe717ba895fded924bc056" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_23.5.2-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.2-0-Linux-x86_64.sh#ea5e6e8a3d5a0247b9df85382d27220fac8e59b5778fd313c5913879cd9baafc" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_23.5.2-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.2-0-MacOSX-arm64.sh#71b7ca2ae4068504f9c6dab30fd6e83694086241156af1e319d598befe0f3a26" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_23.5.2-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.5.2-0-MacOSX-x86_64.sh#13c57188a4bcb7462a7580c9ddf8ff2d301e353c835d33042a51a231667cf25d" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-23.9.0-0 b/plugins/python-build/share/python-build/miniconda3-3.10-23.9.0-0 new file mode 100644 index 0000000..81da0ef --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-23.9.0-0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_23.9.0-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.9.0-0-Linux-aarch64.sh#bc0f7f0a1c83cdf1330726168518b55454d092c64593f82872a50c4b5742b958" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py310_23.9.0-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.9.0-0-Linux-ppc64le.sh#fa9d79e1df278dc72e5935fec3c87c6897a9388895a2a47b0ed49935d71c92e7" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_23.9.0-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.9.0-0-Linux-s390x.sh#e10a160a44b0356f2ce59ce562855461499202976197ca7e1bf25ccb51dabb57" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_23.9.0-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.9.0-0-Linux-x86_64.sh#b272a5f843762f0a18f6b70a162cd554a43a06adcd6f5a2102840e41907fffe5" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_23.9.0-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.9.0-0-MacOSX-arm64.sh#3178aad8c75b30830e97d9a232433df1dfbe6cd34f55e0d7769cfaa17aa49e84" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_23.9.0-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.9.0-0-MacOSX-x86_64.sh#88266dda3e812bf6789fceeb9cfcfbbcada860aa4050ae2a781812fbd077ed35" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-24.1.2-0 b/plugins/python-build/share/python-build/miniconda3-3.10-24.1.2-0 new file mode 100644 index 0000000..1261a0b --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-24.1.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_24.1.2-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.1.2-0-Linux-aarch64.sh#e560e737ac0e625dcc19ca2927457c2944434a61280daae2594632aca76d1422" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_24.1.2-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.1.2-0-Linux-s390x.sh#014fd09da9f7ecae040d586a6ff4218e508bf0e5e0232be6383ff37973a337c7" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_24.1.2-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.1.2-0-Linux-x86_64.sh#8eb5999c2f7ac6189690d95ae5ec911032fa6697ae4b34eb3235802086566d78" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_24.1.2-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.1.2-0-MacOSX-arm64.sh#01110da80119c11078d2b39a499b6dc086c5fd4b413f4b333d32feb3b03cbe7b" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_24.1.2-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.1.2-0-MacOSX-x86_64.sh#f078682fca26350717c1940650c227f9843fe9f3f0ecc87bf2665bccc5c64f9c" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-24.11.1-0 b/plugins/python-build/share/python-build/miniconda3-3.10-24.11.1-0 new file mode 100644 index 0000000..3e4721b --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-24.11.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_24.11.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.11.1-0-Linux-aarch64.sh#70fa20d714ba54114c41990a7222a49bd3c833a0f602bd0e0df507bb2f787035" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_24.11.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.11.1-0-Linux-s390x.sh#c5021ecb894cc7b1bb2d62f2156bdaf3e642235b501998bcc730024b07515c74" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_24.11.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.11.1-0-Linux-x86_64.sh#7a3cdbb78a642b2b6dd0687c9e09824e53330368ab57406e27d88e25c4fe4e40" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_24.11.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.11.1-0-MacOSX-arm64.sh#73d7eb2569e976c6da1946723a3b8bebf0f2aaccef80b28f8eef69fd835572b1" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_24.11.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.11.1-0-MacOSX-x86_64.sh#2f8be5e7beeda8d161be2254d1d1d7e786ca8d11602bd1b7dde1134fcad365fa" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-24.3.0-0 b/plugins/python-build/share/python-build/miniconda3-3.10-24.3.0-0 new file mode 100644 index 0000000..746f696 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-24.3.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_24.3.0-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-Linux-aarch64.sh#cacbd0c4b829dae73ddbcee6b30674dc7aa20bf6dea720929fb01d4b6279f743" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_24.3.0-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-Linux-s390x.sh#fb0f113b0ad2eb9a05b017f49d4a27960ff9ec3d8ec0b580b79efb8c84d15d8e" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_24.3.0-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-Linux-x86_64.sh#def595b1b182749df0974cddb5c8befe70664ace16403d7a7bf54467be5ea48b" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_24.3.0-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-MacOSX-arm64.sh#ceae63e7c99b4ff33ddb1a9973956d829d4a00d39f1f7c6e2056e0e076059535" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_24.3.0-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-MacOSX-x86_64.sh#094c5a94818caf41deba41411876c3cffa918efdf8ada40dc32bcc535d181c78" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-24.4.0-0 b/plugins/python-build/share/python-build/miniconda3-3.10-24.4.0-0 new file mode 100644 index 0000000..ecf8834 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-24.4.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_24.4.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.4.0-0-Linux-aarch64.sh#68f3a537bf2ba8031961c8be6b52236c75478c797e0333e055539f02147676b8" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_24.4.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.4.0-0-Linux-s390x.sh#d5d06f9aa66d9cc9a23d6278826cb09f44f8e005b8b8fcf2664bef02e61ca751" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_24.4.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.4.0-0-Linux-x86_64.sh#fdaa5afdea8c07b6f2203b8f95abe0e4e8c4d3fd3c10d19fe590311446591ffa" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_24.4.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.4.0-0-MacOSX-arm64.sh#21f0b7c653518a6eb6135593c509cefc78fdff839bb2e887d36bc03eda607faf" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_24.4.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.4.0-0-MacOSX-x86_64.sh#c2eed72ff97b4eb81bc1171616b0ff48a440a2e1ad5638e1899b80286767c568" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-24.5.0-0 b/plugins/python-build/share/python-build/miniconda3-3.10-24.5.0-0 new file mode 100644 index 0000000..c759e63 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-24.5.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_24.5.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.5.0-0-Linux-aarch64.sh#edcf076c80846beded0b72e98811cf7b93d0abc2ae93c060efc76f8da1e6fc45" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_24.5.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.5.0-0-Linux-s390x.sh#e00f3d03d13fc4fa394a5d20a5476087237ee6cb029eba3b02322acc104b530b" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_24.5.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.5.0-0-Linux-x86_64.sh#b3d73db6a05069fbdf20dc33fc9b6a29fa7198578f0d090c639f5ca0e84102bd" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_24.5.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.5.0-0-MacOSX-arm64.sh#e422602aa19140c600b5889e5b41a0d7187640107ea82fcb5da857dd25330148" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_24.5.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.5.0-0-MacOSX-x86_64.sh#6d7c1cc138adfc4bb2ccbb8a22eb8e9eb13a366b6af0d63245b643e6c3a3c708" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-24.7.1-0 b/plugins/python-build/share/python-build/miniconda3-3.10-24.7.1-0 new file mode 100644 index 0000000..8db8d33 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-24.7.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_24.7.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.7.1-0-Linux-aarch64.sh#8a5f3510b91f9641c72046f82974a2b95f0b7fee7ed3a9f8223fd5e447c13a2e" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_24.7.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.7.1-0-Linux-s390x.sh#f0fa28fb5ee38ac1950fdb22cbef435f08dbe1846690a7757298e5021152ad38" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_24.7.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.7.1-0-Linux-x86_64.sh#684cda724bc37e3bbbb342e440fc4cac515c92e91a489eb4359feca35382894b" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_24.7.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.7.1-0-MacOSX-arm64.sh#0205a5fca4648832f1a0a3862149722dded533cabbb1d274609f883690e7ee72" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_24.7.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.7.1-0-MacOSX-x86_64.sh#fb3406a97b59c665640ab427694844676c9c4d3ab7ca551866381b4e547b4dcf" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-24.9.2-0 b/plugins/python-build/share/python-build/miniconda3-3.10-24.9.2-0 new file mode 100644 index 0000000..3c4047e --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-24.9.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_24.9.2-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.9.2-0-Linux-aarch64.sh#5d022f16ecb01d33ac8c85a87a0a8dccfb025dc90b20dbd56c4b9ae8f9727578" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_24.9.2-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.9.2-0-Linux-s390x.sh#93d75b306151f96a460a80d8849d85636929a90490f44004f4296a0b8399ccc5" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_24.9.2-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.9.2-0-Linux-x86_64.sh#364869f004c6259268b09a667ed476080bf4f44e9c4ab06a293146df8990d43f" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_24.9.2-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.9.2-0-MacOSX-arm64.sh#d666284d5dd9290b446de5dc20e8498545867c7730799cba8f52e97a45db42d2" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_24.9.2-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.9.2-0-MacOSX-x86_64.sh#7359ff3963ab3ccdc5eec244c610270b456a9584477cb645aa7539924bdd0482" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-0 b/plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-0 new file mode 100644 index 0000000..6d89065 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-0 @@ -0,0 +1,26 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_25.1.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-0-Linux-aarch64.sh#d8a975d2194aab5ace390c273c5328be89342b956711c1648d02c87e4c4ffeb1" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_25.1.1-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-0-Linux-s390x.sh#087d1cb3708da2a07def69e925731a87b500a9b5befec5e7666422480a5edc67" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_25.1.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-0-Linux-x86_64.sh#2346f43213d3e96abca95d0a7df2575d52c66030f2feb90d3d58ed3eabe76aa3" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_25.1.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-0-MacOSX-arm64.sh#e52fabc1c331e79cb4a348eea0ac9fc75742609ed5a41370a1e8790a97c13449" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_25.1.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-0-MacOSX-x86_64.sh#3d9720b16428a924b09f460f942be1f841c28d9ceeff9149051a8f4241745839" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-1 b/plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-1 new file mode 100644 index 0000000..e0f31b5 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-1 @@ -0,0 +1,26 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_25.1.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-1-Linux-aarch64.sh#a72a3247d4c5843bf9ba3e902218ada02e2b75b16260541befd7ac0961077fa9" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_25.1.1-1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-1-Linux-s390x.sh#072b62a97432048e5ad1e9a987c6739de719192f6c19c79b06d1e05424cd4c35" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_25.1.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-1-Linux-x86_64.sh#585972959914f1f9be463284d477717eb10f7306bda63f2ec3c4c86047b9dd72" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_25.1.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-1-MacOSX-arm64.sh#0be344f9eb9e7cf7c2d45598922674e599739c9a9f6c5ee1436238005da9dd03" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_25.1.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-1-MacOSX-x86_64.sh#497d6deb3932f8f0257a3db515419e871a0f1ecb155e0fd80d13ca7bbccbecac" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-2 b/plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-2 new file mode 100644 index 0000000..3b660ac --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-2 @@ -0,0 +1,26 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_25.1.1-2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-2-Linux-aarch64.sh#5f61143e93d9d48a82aa99a1d7b1c77561f599b9a67ab954862e6e8d6a25c0cc" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_25.1.1-2-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-2-Linux-s390x.sh#89d689248a6855da3e6087cfeebaad6886e4ef46b4e96671bf251bb9aa6b1499" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_25.1.1-2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-2-Linux-x86_64.sh#7f298109ab95b5436632973a04189a125282cc948f1dd1b03fa9cb6c71443915" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_25.1.1-2-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-2-MacOSX-arm64.sh#119e3196d9e67f8eb0f88d4a3188849b5b8bf14a8dd87873c0bff7ce016eea52" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_25.1.1-2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-2-MacOSX-x86_64.sh#543d635dcd34256ac87ffe7a242259cf8f639d51a503da4e4eb3e29ecf406302" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-25.11.1-1 b/plugins/python-build/share/python-build/miniconda3-3.10-25.11.1-1 new file mode 100644 index 0000000..bd6c372 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-25.11.1-1 @@ -0,0 +1,20 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_25.11.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.11.1-1-Linux-aarch64.sh#cbac1da35d4c8635384f58b9a776c23fcb3c4dc0b936b8d4d0526f2d0a4b1c4c" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_25.11.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.11.1-1-Linux-x86_64.sh#f6174765edd75e1ef2bb3f16e99266d291deebf6532f2f7e800569afc084d0eb" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_25.11.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.11.1-1-MacOSX-arm64.sh#c83c7a20dd45442ef05321637872bdd9ee13395098e9bb1a22a28b1dccdd9a31" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-25.3.1-1 b/plugins/python-build/share/python-build/miniconda3-3.10-25.3.1-1 new file mode 100644 index 0000000..bfca1d2 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-25.3.1-1 @@ -0,0 +1,23 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_25.3.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.3.1-1-Linux-aarch64.sh#7879e8e2c89d26d8c4776fbad72656afda697e67e2e70b9b8eef368b111d2253" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_25.3.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.3.1-1-Linux-x86_64.sh#fa277fc23e40625d4c12a00c0378b4bbb2baee96660796431ee76185fe1b5025" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_25.3.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.3.1-1-MacOSX-arm64.sh#79036d813ac3035b8d833ea427df6ccd02d25798d7abb5e5b4423f6642088a33" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_25.3.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.3.1-1-MacOSX-x86_64.sh#adf482eea0ffa1f6ead1cb217ee0a2cc8c0732399782a609c4333dc96bf9d6a6" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-25.5.1-0 b/plugins/python-build/share/python-build/miniconda3-3.10-25.5.1-0 new file mode 100644 index 0000000..58936af --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-25.5.1-0 @@ -0,0 +1,23 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_25.5.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.5.1-0-Linux-aarch64.sh#6886af5e5db79dfb4429cde937b6f806d02b0e98dd11249c74917661fc7b1f4b" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_25.5.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.5.1-0-Linux-x86_64.sh#aa8cbd6aa7ef85d0528616d2dffce8bd0b51924e7ddd18734ede6c1c63c462d0" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_25.5.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.5.1-0-MacOSX-arm64.sh#169baa18136f7ee46052ec4e1719401e1b99427bba3cf0507da0a6980b7e32a1" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_25.5.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.5.1-0-MacOSX-x86_64.sh#7d7aa6302fe696afa5b46b3c8f6eaf80fcf3c1355df0c3a8910514cf02bf02af" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-25.5.1-1 b/plugins/python-build/share/python-build/miniconda3-3.10-25.5.1-1 new file mode 100644 index 0000000..3223806 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-25.5.1-1 @@ -0,0 +1,23 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_25.5.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.5.1-1-Linux-aarch64.sh#630f724622a3f45f66b3b08f708bc44e2cb595ad147f68750271c6352cb4d734" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_25.5.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.5.1-1-Linux-x86_64.sh#84bd8f60fea2e09f1fa72f258132337aff7a20ec1e12dea9d1eff96830cf3d8c" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_25.5.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.5.1-1-MacOSX-arm64.sh#4e8309e9c0ed87fe5f5ffc77ae71201f51939f5c163d00f6867154f1b9cee41a" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_25.5.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.5.1-1-MacOSX-x86_64.sh#564e63a326cf73b2ab9a4a8be5bdf51996388f10a8eb4170071cb74f836d1e4e" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-25.7.0-2 b/plugins/python-build/share/python-build/miniconda3-3.10-25.7.0-2 new file mode 100644 index 0000000..f1184c6 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-25.7.0-2 @@ -0,0 +1,23 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_25.7.0-2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.7.0-2-Linux-aarch64.sh#e13bd0e0b4f70841f78aea8a978eb35cd6afb0af3e2d2b8f85d24636bb56bc21" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_25.7.0-2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.7.0-2-Linux-x86_64.sh#647b55a8da07136fa2543fbf6b9719d3a4c2369dec5dd31d2c4bda2b51107717" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_25.7.0-2-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.7.0-2-MacOSX-arm64.sh#623c2e81b87516753d902aee0003e7126ab34817f27d46c6fd2c097435cab470" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_25.7.0-2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.7.0-2-MacOSX-x86_64.sh#cd6f9cd295cecab025884175c59a0d0bd2ff919ebf60abfa1bd5e5b36772876e" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-25.9.1-1 b/plugins/python-build/share/python-build/miniconda3-3.10-25.9.1-1 new file mode 100644 index 0000000..bec3df9 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-25.9.1-1 @@ -0,0 +1,20 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_25.9.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.9.1-1-Linux-aarch64.sh#28fc3db9c7ee63cedab38b0e6006409f1f448be7ffc57b270623efd4422b0608" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_25.9.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.9.1-1-Linux-x86_64.sh#04a8b03d8b0ec062d923e592201a6fd88b7247c309ef8848afb25c424c40ac39" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_25.9.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.9.1-1-MacOSX-arm64.sh#fb3fbef60259b36b0248c73fecdd974f8554d5fccfe0a7b8a45eb06dedbe8a85" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-25.9.1-3 b/plugins/python-build/share/python-build/miniconda3-3.10-25.9.1-3 new file mode 100644 index 0000000..59b021e --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-25.9.1-3 @@ -0,0 +1,20 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_25.9.1-3-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.9.1-3-Linux-aarch64.sh#bc58460f17ec60d6c920d4352dd4d5e465aa22b56580bd4cd57c9693859761ec" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_25.9.1-3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.9.1-3-Linux-x86_64.sh#e4dea08f67e7093433c34d02b8947b093a902f1120b283758d5200bd92db594c" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_25.9.1-3-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.9.1-3-MacOSX-arm64.sh#3b54f297df4c9f3e45ce692a87984e79d13761a45469d37e852a8b216215ccf0" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-26.1.1-1 b/plugins/python-build/share/python-build/miniconda3-3.10-26.1.1-1 new file mode 100644 index 0000000..2826d05 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-26.1.1-1 @@ -0,0 +1,20 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_26.1.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_26.1.1-1-Linux-aarch64.sh#0a78d6620113acd42d840925514c0f5eec9f2e1e8ae4394755c401b3b605875b" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_26.1.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_26.1.1-1-Linux-x86_64.sh#4410410a6343f688bbfd48d80eb23e3125964e254e4c18802679d2e61b06876e" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_26.1.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_26.1.1-1-MacOSX-arm64.sh#cadb31098a13b7dcc016594f54b01bcf1371161ba762a9ac3ba0d8f04b2615e2" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-26.3.2-2 b/plugins/python-build/share/python-build/miniconda3-3.10-26.3.2-2 new file mode 100644 index 0000000..eb8bab9 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-26.3.2-2 @@ -0,0 +1,20 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_26.3.2-2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_26.3.2-2-Linux-aarch64.sh#4b217efc09a7ce2bed8e818ee3c0242c5b267a96254b64ce55a585eca4a79b1a" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_26.3.2-2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_26.3.2-2-Linux-x86_64.sh#f07a277e0f62e2eabe42a6bc1e2ccd3d40503fbeb2b7adb7e808b2d888355761" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_26.3.2-2-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_26.3.2-2-MacOSX-arm64.sh#9b699985b4e27b4bfb987f7cbb79096271e3cdb2b1ea14fe0f43dbb63111d593" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10.1 b/plugins/python-build/share/python-build/miniconda3-3.10.1 new file mode 100644 index 0000000..4244c09 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10.1 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda3-3.10.1-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-3.10.1-Linux-x86.sh#e9b751fa8bc5372731512e058fa3867ad9e54983b48d462b4c8f7a031953c2bc" "miniconda" verify_py34 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-3.10.1-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.10.1-Linux-x86_64.sh#cbd86f49008319416d1e57f9ac43a42445058f06aaeebe5ab974769887a8628b" "miniconda" verify_py34 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-3.10.1-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.10.1-MacOSX-x86_64.sh#58ba40cbd1cf5bba680f94321d2ce22685a2b06ad9252044f06a0018fe99bd62" "miniconda" verify_py34 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-23.10.0-1 b/plugins/python-build/share/python-build/miniconda3-3.11-23.10.0-1 new file mode 100644 index 0000000..e1e50ba --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-23.10.0-1 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_23.10.0-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.10.0-1-Linux-aarch64.sh#a60e70ad7e8ac5bb44ad876b5782d7cdc66e10e1f45291b29f4f8d37cc4aa2c8" "miniconda" verify_py311 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py311_23.10.0-1-Linux-ppc64le.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.10.0-1-Linux-ppc64le.sh#1a2eda0a9a52a4bd058abbe9de5bb2bc751fcd7904c4755deffdf938d6f4436e" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_23.10.0-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.10.0-1-Linux-s390x.sh#ae212385c9d7f7473da7401d3f5f6cbbbc79a1fce730aa48531947e9c07e0808" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_23.10.0-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.10.0-1-Linux-x86_64.sh#d0643508fa49105552c94a523529f4474f91730d3e0d1f168f1700c43ae67595" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script ""Miniconda3-py311_23.10.0-1-MacOSX-arm64.sh "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.10.0-1-MacOSX-arm64.sh#5043144d7eaea2286e30d091b62fcf50f7ed983b092230e56c370b592e7a57f2" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script ""Miniconda3-py311_23.10.0-1-MacOSX-x86_64.sh "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.10.0-1-MacOSX-x86_64.sh#8c50faa3880fdef96967477af09d41c52332998beeee7ef8116c79d4f5023d72" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-23.11.0-1 b/plugins/python-build/share/python-build/miniconda3-3.11-23.11.0-1 new file mode 100644 index 0000000..f395b7f --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-23.11.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_23.11.0-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-1-Linux-aarch64.sh#63c06a1974695e50bbe767a030903d169e637e42d5b7b6d30876b19a01fbbad8" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_23.11.0-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-1-Linux-s390x.sh#04586c734987a39114b81384014c2cfa89360c518371b6fa249d3062efca27fe" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_23.11.0-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-1-Linux-x86_64.sh#5b3cefe534e23541f5f703f40d4818e361c3615dbf14651a0f29554c3fc3d0fd" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_23.11.0-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-1-MacOSX-arm64.sh#7901f8f272478657bd023cfd6d832b53213053897efd23c1061bcc35c68c0637" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_23.11.0-1-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-1-MacOSX-x86_64.sh#7ee24fb01fbe1081d6dd600805f5f9c6a3a12714670ecad65a6dfcf870c8a74d" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-23.11.0-2 b/plugins/python-build/share/python-build/miniconda3-3.11-23.11.0-2 new file mode 100644 index 0000000..493e092 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-23.11.0-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_23.11.0-2-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-2-Linux-aarch64.sh#decd447fb99dbd0fc5004481ec9bf8c04f9ba28b35a9292afe49ecefe400237f" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_23.11.0-2-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-2-Linux-s390x.sh#53a9e9eb97cd6e318f4f184add069436e1a46124cf864bf2d7bd67043e50e471" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_23.11.0-2-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-2-Linux-x86_64.sh#c9ae82568e9665b1105117b4b1e499607d2a920f0aea6f94410e417a0eff1b9c" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_23.11.0-2-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-2-MacOSX-arm64.sh#5694c382e6056d62ed874f22692224c4f53bca22e8135b6f069111e081be07aa" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_23.11.0-2-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-2-MacOSX-x86_64.sh#2b7f9e46308c28c26dd83abad3e72121ef63916eaf17b63723b5a1f728dc3032" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-23.5.0-3 b/plugins/python-build/share/python-build/miniconda3-3.11-23.5.0-3 new file mode 100644 index 0000000..57743ea --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-23.5.0-3 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_23.5.0-3-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.0-3-Linux-aarch64.sh#6e3e60e7093194b3435fde19efc54d0dd78be393bf5b7487cc28cd1039ebed4d" "miniconda" verify_py311 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py311_23.5.0-3-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.0-3-Linux-ppc64le.sh#c1ab8b5d629f66a1609e456a0d6a83a2896af6dc0b2b702025cb19456030eacd" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_23.5.0-3-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.0-3-Linux-s390x.sh#42e7cc490fc81d9b1dc56cf8bd951e084e804824d60aca3a4b15d35c57ad373e" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_23.5.0-3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.0-3-Linux-x86_64.sh#61a5c087893f6210176045931b89ee6e8760c17abd9c862b2cab4c1b7d00f7c8" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_23.5.0-3-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.0-3-MacOSX-arm64.sh#c4ce7311d2d1c729bf8d98e6d5aa2581ce0b08a1480985e63efaf8529b2fc6ca" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_23.5.0-3-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.0-3-MacOSX-x86_64.sh#2503d9e852fcaf85adca825bde84bdc297b118fd2c14316e4f27a93a190a7bdd" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-23.5.1-0 b/plugins/python-build/share/python-build/miniconda3-3.11-23.5.1-0 new file mode 100644 index 0000000..f0130d8 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-23.5.1-0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_23.5.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.1-0-Linux-aarch64.sh#a7a68db6676075aa20991d3fac6d7cfdb2bb3c815c0c17ea26fac96241486c6b" "miniconda" verify_py311 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py311_23.5.1-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.1-0-Linux-ppc64le.sh#63d6756dd9956e3ff581381fd319088fe23af53df8ccad8c6f029c89f5a1e534" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_23.5.1-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.1-0-Linux-s390x.sh#4472acdf8bab722a6dc4ef0b59636feac12b3520ef3d88c1bebd11106b596a96" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_23.5.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.1-0-Linux-x86_64.sh#333779c9cae3fe14735949a8dcb9657b9e55ada69e9c60f191c5d582b2deac20" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_23.5.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.1-0-MacOSX-arm64.sh#52b3a134a73d48204e7517fb5b4378bece65a048e9a32c9276eb3fd51989b976" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_23.5.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.1-0-MacOSX-x86_64.sh#834a194e6d790eade3db98a78ec3f2857df13bb8b6661a26a34e67462561015b" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-23.5.2-0 b/plugins/python-build/share/python-build/miniconda3-3.11-23.5.2-0 new file mode 100644 index 0000000..7bb8bd3 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-23.5.2-0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_23.5.2-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.2-0-Linux-aarch64.sh#3962738cfac270ae4ff30da0e382aecf6b3305a12064b196457747b157749a7a" "miniconda" verify_py311 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py311_23.5.2-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.2-0-Linux-ppc64le.sh#92237cb2a443dd15005ec004f2f744b14de02cd5513a00983c2f191eb43d1b29" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_23.5.2-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.2-0-Linux-s390x.sh#221a4cd7f0a9275c3263efa07fa37385746de884f4306bb5d1fe5733ca770550" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_23.5.2-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.2-0-Linux-x86_64.sh#634d76df5e489c44ade4085552b97bebc786d49245ed1a830022b0b406de5817" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_23.5.2-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.2-0-MacOSX-arm64.sh#c8f436dbde130f171d39dd7b4fca669c223f130ba7789b83959adc1611a35644" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_23.5.2-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.5.2-0-MacOSX-x86_64.sh#1622e7a0fa60a7d3d892c2d8153b54cd6ffe3e6b979d931320ba56bd52581d4b" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-23.9.0-0 b/plugins/python-build/share/python-build/miniconda3-3.11-23.9.0-0 new file mode 100644 index 0000000..4c32258 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-23.9.0-0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_23.9.0-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.9.0-0-Linux-aarch64.sh#1242847b34b23353d429fcbcfb6586f0c373e63070ad7d6371c23ddbb577778a" "miniconda" verify_py311 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py311_23.9.0-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.9.0-0-Linux-ppc64le.sh#07b53e411c2e4423bd34c3526d6644b916c4b2143daa8fbcb36b8ead412239b9" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_23.9.0-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.9.0-0-Linux-s390x.sh#707c68e25c643c84036a16acdf836a3835ea75ffd2341c05ec2da6db1f3e9963" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_23.9.0-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.9.0-0-Linux-x86_64.sh#43651393236cb8bb4219dcd429b3803a60f318e5507d8d84ca00dafa0c69f1bb" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_23.9.0-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.9.0-0-MacOSX-arm64.sh#4215f6fc572207f73a8f64692b4936b1952051f4cd620eec2ebd1f946e98b886" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_23.9.0-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.9.0-0-MacOSX-x86_64.sh#4b60eb49cf8fea6272bd2060878ab02cbab187dffd2fd732685c3c92a60b62ed" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-24.1.2-0 b/plugins/python-build/share/python-build/miniconda3-3.11-24.1.2-0 new file mode 100644 index 0000000..e832287 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-24.1.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_24.1.2-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.1.2-0-Linux-aarch64.sh#1e046ef2d9d47289db2491f103c81b0b4baf943a9234ac59bd5bca076c881d98" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_24.1.2-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.1.2-0-Linux-s390x.sh#0489909051fd9e2c9addfa5fbd531ccb7f8f2463ac47376b8854e5a09b1c4011" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_24.1.2-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.1.2-0-Linux-x86_64.sh#3f2e5498e550a6437f15d9cc8020d52742d0ba70976ee8fce4f0daefa3992d2e" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_24.1.2-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.1.2-0-MacOSX-arm64.sh#b5c4f646144fa4760bd5f6114ff2e6b49a3ef7c57b993f569adceea784f21a52" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_24.1.2-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.1.2-0-MacOSX-x86_64.sh#3b26c0867561d0988040193c8efd9f53ca922026f735367436aa05b467b1f187" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-24.11.1-0 b/plugins/python-build/share/python-build/miniconda3-3.11-24.11.1-0 new file mode 100644 index 0000000..8139f67 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-24.11.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_24.11.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.11.1-0-Linux-aarch64.sh#a8846ade7a5ddd9b6a6546590054d70d1c2cbe4fbe8c79fb70227e8fd93ef9f8" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_24.11.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.11.1-0-Linux-s390x.sh#bb499b18dbcbb2d89b22f91fe26fe661f5ed1f1944fdc743560d69cd52a2468f" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_24.11.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.11.1-0-Linux-x86_64.sh#807774bae6cd87132094458217ebf713df436f64779faf9bb4c3d4b6615c1e3a" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_24.11.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.11.1-0-MacOSX-arm64.sh#862af4d7cb257219c6b280848049e09e1aff27acd06d5422359f2249f938e282" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_24.11.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.11.1-0-MacOSX-x86_64.sh#388f669ab95d659b4c97353f756ce93ed2000ec0114edaec9688f8541fa4bcab" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-24.3.0-0 b/plugins/python-build/share/python-build/miniconda3-3.11-24.3.0-0 new file mode 100644 index 0000000..973b940 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-24.3.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_24.3.0-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.3.0-0-Linux-aarch64.sh#49082882752167cdea60e1aeedac7b73136bdfdd63b9bb3aca3c038901544458" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_24.3.0-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.3.0-0-Linux-s390x.sh#8e52dd1300c9462367d303a596a931e6ef8db422c7c79194efa6fdb152c92b61" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_24.3.0-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.3.0-0-Linux-x86_64.sh#4da8dde69eca0d9bc31420349a204851bfa2a1c87aeb87fe0c05517797edaac4" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_24.3.0-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.3.0-0-MacOSX-arm64.sh#b7663626fedf8395d3fed78383b08060a13bd6747003bdb2a39220407f55cf65" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_24.3.0-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.3.0-0-MacOSX-x86_64.sh#fdd6294aaa0472f7ddeac89deacceec1469e76bd2a16ac11f37b4ab584fe5089" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-24.4.0-0 b/plugins/python-build/share/python-build/miniconda3-3.11-24.4.0-0 new file mode 100644 index 0000000..22c577e --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-24.4.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_24.4.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.4.0-0-Linux-aarch64.sh#d3ed9ff565c7341a4e4c957443ccb4f12f3dd5a087549099e7f199c36469e55c" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_24.4.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.4.0-0-Linux-s390x.sh#f2bea598cb72ed838a6e62b7dd8fbf1c3941a92783ba686822f70108c8c2e543" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_24.4.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.4.0-0-Linux-x86_64.sh#7cb030a12d1da35e1c548344a895b108e0d2fbdc4f6b67d5180b2ac8539cc473" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_24.4.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.4.0-0-MacOSX-arm64.sh#a396cf4ca0088cf2d78517b28732b61697cdcb698528300946ef6409353eca86" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_24.4.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.4.0-0-MacOSX-x86_64.sh#b7f3adebd2b25dbefdc85e16f5ee130ac0d1167f416078f961e90f277476b115" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-24.5.0-0 b/plugins/python-build/share/python-build/miniconda3-3.11-24.5.0-0 new file mode 100644 index 0000000..ca06844 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-24.5.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_24.5.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.5.0-0-Linux-aarch64.sh#94a742af7bf5c7bae3dba6bd07d84d94b858b839e15af2ea0cd10fdf2bde8a73" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_24.5.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.5.0-0-Linux-s390x.sh#002963f32aebe1091d5da9a82416831f3c11217e6b4ea164c655f0d11f0cff80" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_24.5.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.5.0-0-Linux-x86_64.sh#38b203bb1f2be78b735ebc00162f29e8e73fcd9a619ed5980490a72193ee1f58" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_24.5.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.5.0-0-MacOSX-arm64.sh#a3d62f20f09e8079db76379090f21b7ae34832dadeb5a250e4fab324c8328727" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_24.5.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.5.0-0-MacOSX-x86_64.sh#9e7dc7e0fbf0e9b2ff6bafdae9bf6ef122ae92d53533c2bbeb73433c0c6a4bd9" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-24.7.1-0 b/plugins/python-build/share/python-build/miniconda3-3.11-24.7.1-0 new file mode 100644 index 0000000..305c4a3 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-24.7.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_24.7.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.7.1-0-Linux-aarch64.sh#f0ade904394ac5058dc293dd242a8af5c2005d28e020185691df32a5cc7ce0a0" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_24.7.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.7.1-0-Linux-s390x.sh#124b8f0df8c23e673409a68320f594a32e4e9e9608a3a6be1fddc0d597410e01" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_24.7.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.7.1-0-Linux-x86_64.sh#a098a5b1581d8fd078c430b82e27106602223e335efef708a124e723814d120c" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_24.7.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.7.1-0-MacOSX-arm64.sh#9e7a3e0b835c0b18d561041a49311280ed58a7424a3324da370e69d4350eabcd" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_24.7.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.7.1-0-MacOSX-x86_64.sh#e459d9478ece4415e1a2e9b127da7240823e7d1bf6207a4d92779081b351f773" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-24.9.2-0 b/plugins/python-build/share/python-build/miniconda3-3.11-24.9.2-0 new file mode 100644 index 0000000..e309b59 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-24.9.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_24.9.2-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.9.2-0-Linux-aarch64.sh#c4c12d969be6a02cb7370a0c717400e8eec79dea722ef0fba98d745048948980" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_24.9.2-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.9.2-0-Linux-s390x.sh#8de1e23f3e0a097bc3b9173a1b4b56544bd34d2831b70a71a9d528eeab0dbe90" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_24.9.2-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.9.2-0-Linux-x86_64.sh#62ef806265659c47e37e22e8f9adce29e75c4ea0497e619c280f54c823887c4f" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_24.9.2-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.9.2-0-MacOSX-arm64.sh#7358a1d53e7f857a9b87af148d20cdd00f3a91eca9f663371dfa3d830c375033" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_24.9.2-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.9.2-0-MacOSX-x86_64.sh#5d4229c322629cf2932c3a4e181501c98dae35b866c96d208b6688b0e2381604" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-0 b/plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-0 new file mode 100644 index 0000000..4b01e5d --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-0 @@ -0,0 +1,26 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_25.1.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-0-Linux-aarch64.sh#737f02e2e6c192afbef000f6dba79f4dbbe852193c6890243516ea50d916d31c" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_25.1.1-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-0-Linux-s390x.sh#6244e894c56afc095eba0d2c2e88125af1a6a661187b136b8d1abc1392cca8eb" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_25.1.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-0-Linux-x86_64.sh#9bc631a7edfc015bbf944d5f48c3852e7c0c83aeae0359b75bee9f402942413a" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_25.1.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-0-MacOSX-arm64.sh#0189917c28f8c3a8e9f113532225d4878e6f018d215739ccff92f99750fe7083" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_25.1.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-0-MacOSX-x86_64.sh#af0d2916b3e3aad814f246a85c48ec9658e2b5f4d1cc7f09246d197fa18169c8" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-1 b/plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-1 new file mode 100644 index 0000000..de32f5b --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-1 @@ -0,0 +1,26 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_25.1.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-1-Linux-aarch64.sh#288aa5b21b97db7f09bf6da03323b3a3b97d461a4c5bf666be58312eb6b6e311" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_25.1.1-1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-1-Linux-s390x.sh#e0c755e9e2e26f75cccda56fe978e7a964ed559f474486421a0022b7351bc108" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_25.1.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-1-Linux-x86_64.sh#03a253f7ca5cf1fdfca2aedced769d8479cb559b7c92e70f24c176fd9d23bc8e" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_25.1.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-1-MacOSX-arm64.sh#871ca583ee0be45d5fa36eba4143a6701e775c500c7b30ac519ef1a0205d78c3" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_25.1.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-1-MacOSX-x86_64.sh#deb025449147280611e6ca8bf89291cddb6eab06e2bff0114ac05f6f67b5ca89" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-2 b/plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-2 new file mode 100644 index 0000000..d498393 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-2 @@ -0,0 +1,26 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_25.1.1-2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-2-Linux-aarch64.sh#8a1d4407fce7ec552ac6ed655ce93d83549e02b819cacefbb7f640f9051e638b" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_25.1.1-2-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-2-Linux-s390x.sh#0b4d5a3f16dcb2d230ba5dfdfdb848c854006aab6dd1bd3dbf29fcddf04b07a4" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_25.1.1-2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-2-Linux-x86_64.sh#d8c1645776c0758214e4191c605abe5878002051316bd423f2b14b22d6cb4251" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_25.1.1-2-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-2-MacOSX-arm64.sh#140b80b4d285bbbcc8616891876ec3613e46acbedb02321b9ddc03ff0784c584" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_25.1.1-2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-2-MacOSX-x86_64.sh#41c4ed1ce9f44049346a7efd8311919f82a8115637eced8796b5d18599f50cae" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-25.11.1-1 b/plugins/python-build/share/python-build/miniconda3-3.11-25.11.1-1 new file mode 100644 index 0000000..9ba7b77 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-25.11.1-1 @@ -0,0 +1,20 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_25.11.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.11.1-1-Linux-aarch64.sh#ed0c6cc091802bc4d1440260d60d431b263f22d5cb9be5df71e7ff176c8f1cd8" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_25.11.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.11.1-1-Linux-x86_64.sh#cf5fe14f1be074b82908f188ff759b61ddf87ed15a766f8641182ebf190832b4" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_25.11.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.11.1-1-MacOSX-arm64.sh#5d76efda2d459389e35d5406494230bb78635bdb99500bda7d7eb3c4e3742f1c" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-25.3.1-1 b/plugins/python-build/share/python-build/miniconda3-3.11-25.3.1-1 new file mode 100644 index 0000000..7f409f4 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-25.3.1-1 @@ -0,0 +1,23 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_25.3.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.3.1-1-Linux-aarch64.sh#8d2470bdbee7e93d9b4972a3272b63673ba62113282378f98f23b423cc61ef59" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_25.3.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.3.1-1-Linux-x86_64.sh#6239d42dacc169e290ac37516b2eb6751763edbd977b237e9688884c7b4ea706" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_25.3.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.3.1-1-MacOSX-arm64.sh#dc08b8f6fb2acb4f1c8b076a59226e29acf0a9dbeb7b5f643a8c19eb0d14a294" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_25.3.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.3.1-1-MacOSX-x86_64.sh#2494921f81db2c9b72e26e4aced35d5c58ea2a61ce040efd77ed2957ba4d8d3f" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-25.5.1-0 b/plugins/python-build/share/python-build/miniconda3-3.11-25.5.1-0 new file mode 100644 index 0000000..180e931 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-25.5.1-0 @@ -0,0 +1,23 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_25.5.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.5.1-0-Linux-aarch64.sh#3862c5ecba0949c3bdbeeb7d072664215924fbccb25f0d3f33782362c5405e22" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_25.5.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.5.1-0-Linux-x86_64.sh#a921abd74e16f5dee8a4d79b124635fac9b939c465ba2e942ea61b3fcd1451d8" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_25.5.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.5.1-0-MacOSX-arm64.sh#23a6d150c1fc7426147f9458c20ec73fa97aa369e19152997b7206f23b983d66" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_25.5.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.5.1-0-MacOSX-x86_64.sh#cc23ad95d62e1d3c5754c2ead09f2c56bfe1112b38b69a4edc140a0a2c8d5300" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-25.5.1-1 b/plugins/python-build/share/python-build/miniconda3-3.11-25.5.1-1 new file mode 100644 index 0000000..65c349c --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-25.5.1-1 @@ -0,0 +1,23 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_25.5.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.5.1-1-Linux-aarch64.sh#39a6d853df41b74aabe37dd666732f7556f81584af789693d7e3005d7a04c64f" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_25.5.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.5.1-1-Linux-x86_64.sh#94b4cb34b583ce549fb17e3b5e93b6e4adfd4605cf0aa4d5f00bd06f620182e2" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_25.5.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.5.1-1-MacOSX-arm64.sh#73b8ef14c88fa2bf9b74c70f7a888a0a19941a67929e4879850a67c948d4ac58" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_25.5.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.5.1-1-MacOSX-x86_64.sh#1060cbd0001c12c3e89bf39413c430cc481a894f065923a03e599c8426020229" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-25.7.0-2 b/plugins/python-build/share/python-build/miniconda3-3.11-25.7.0-2 new file mode 100644 index 0000000..ba1f829 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-25.7.0-2 @@ -0,0 +1,23 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_25.7.0-2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.7.0-2-Linux-aarch64.sh#28ca561ec2d9a1ae72fbf3f833b8918c747ce21f57d79e218e47bf7d4d2ce792" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_25.7.0-2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.7.0-2-Linux-x86_64.sh#e072c062a7e017732c97963ef0d9a1cb474b92b7f25c8a032f9632cfe75add4f" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_25.7.0-2-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.7.0-2-MacOSX-arm64.sh#c5edc119ec1bf31d3be6e088ea7c66314561ed21ccffd72e3484586e27aa7719" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_25.7.0-2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.7.0-2-MacOSX-x86_64.sh#c05bab0c09ed67ed536c827ae39600d16217d559dcdad8820a04f32473276963" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-25.9.1-1 b/plugins/python-build/share/python-build/miniconda3-3.11-25.9.1-1 new file mode 100644 index 0000000..6d2d135 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-25.9.1-1 @@ -0,0 +1,20 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_25.9.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.9.1-1-Linux-aarch64.sh#4e0723b9d76aa491cf22511dac36f4fdec373e41d2a243ff875e19b8df39bf94" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_25.9.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.9.1-1-Linux-x86_64.sh#238abad23f8d4d8ba89dd05df0b0079e278909a36e06955f12bbef4aa94e6131" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_25.9.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.9.1-1-MacOSX-arm64.sh#5d5f58477f40d23e491394a7114a318724f1f9161e2b8bd08c5845c47b036b72" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-25.9.1-3 b/plugins/python-build/share/python-build/miniconda3-3.11-25.9.1-3 new file mode 100644 index 0000000..faa2995 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-25.9.1-3 @@ -0,0 +1,20 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_25.9.1-3-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.9.1-3-Linux-aarch64.sh#92a4df72178d87626072b39aca8fa4721f29d192ed0d70e268586f63b41f7657" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_25.9.1-3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.9.1-3-Linux-x86_64.sh#e331037f492848e68764b0c430912b2417b977d654706009ac8eb475e03ae0a2" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_25.9.1-3-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.9.1-3-MacOSX-arm64.sh#6d92abcee72a7aa4de3694f718fbb523f261efdb5027c7448907b9cfd6507e89" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-26.1.1-1 b/plugins/python-build/share/python-build/miniconda3-3.11-26.1.1-1 new file mode 100644 index 0000000..fd086b8 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-26.1.1-1 @@ -0,0 +1,20 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_26.1.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_26.1.1-1-Linux-aarch64.sh#1726ea55308160a32e82d90a6f4914caa46f58fe157442224f2faf92fdef1e0e" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_26.1.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_26.1.1-1-Linux-x86_64.sh#52d1f19154b0716d7dc0872f0d858702640da08a4e53fd0035ba988608203d6b" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_26.1.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_26.1.1-1-MacOSX-arm64.sh#720266b29d46b8da1b466342aa02d7d04683670bf2bf53576cc70d89253f60ca" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-26.3.2-2 b/plugins/python-build/share/python-build/miniconda3-3.11-26.3.2-2 new file mode 100644 index 0000000..88d5225 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-26.3.2-2 @@ -0,0 +1,20 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_26.3.2-2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_26.3.2-2-Linux-aarch64.sh#4d18bc365dc233d34b35f30d1e2f3491c7a2956cd84c6a13eaa8851619d894b1" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_26.3.2-2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_26.3.2-2-Linux-x86_64.sh#1f5ece9c2c8c5a643f95e0101fab6c824b101e82dee9132c222cbc1c1475bd32" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_26.3.2-2-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_26.3.2-2-MacOSX-arm64.sh#4c2ddf372bf41603a5958c756348d436ff19357628cd7e93dd091c1c1c22f229" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-24.1.2-0 b/plugins/python-build/share/python-build/miniconda3-3.12-24.1.2-0 new file mode 100644 index 0000000..dab27cd --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-24.1.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_24.1.2-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.1.2-0-Linux-aarch64.sh#942a057a52ec99f0fca4f413b87b332f6e61fad95c05fa7cabc003ae0b4471de" "miniconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py312_24.1.2-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.1.2-0-Linux-s390x.sh#7ee6a3c41a825eca3b1c9e3c7155c67f7c26e31a75d7dc4f78f75a4c438e3009" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_24.1.2-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.1.2-0-Linux-x86_64.sh#b978856ec3c826eb495b60e3fffe621f670c101150ebcbdeede4f961f22dc438" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_24.1.2-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.1.2-0-MacOSX-arm64.sh#1c277b1ec046fd1b628390994e3fa3dbac0e364f44cd98b915daaa67a326c66a" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_24.1.2-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.1.2-0-MacOSX-x86_64.sh#bc45a2ceea9341579532847cc9f29a9769d60f12e306bba7f0de6ad5acdd73e9" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-24.11.1-0 b/plugins/python-build/share/python-build/miniconda3-3.12-24.11.1-0 new file mode 100644 index 0000000..f3c8bd1 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-24.11.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_24.11.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.11.1-0-Linux-aarch64.sh#9180a2f1fab799fd76e9ef914643269dcf5bad9d455623b905b87f5d39ae140f" "miniconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py312_24.11.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.11.1-0-Linux-s390x.sh#105bce6b0137f574147b8fdfd5e3a7d6c92f3ea9fbf3e0de61331ea43586e9af" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_24.11.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.11.1-0-Linux-x86_64.sh#636b209b00b6673471f846581829d4b96b9c3378679925a59a584257c3fef5a3" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_24.11.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.11.1-0-MacOSX-arm64.sh#9d5c5782d24a09075e45f131693d24907d8c45a4e6205c51d4d3a81b72dc5ad7" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_24.11.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.11.1-0-MacOSX-x86_64.sh#71419eaf7f0bc016c41e8e27815609e76f2d6bcfc39426c19ca5e5cf7a2ea36f" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-24.3.0-0 b/plugins/python-build/share/python-build/miniconda3-3.12-24.3.0-0 new file mode 100644 index 0000000..95880ce --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-24.3.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_24.3.0-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.3.0-0-Linux-aarch64.sh#05f70cbc89b6caf84e22db836f7696a16b617992eb23d6102acf7651eb132365" "miniconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py312_24.3.0-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.3.0-0-Linux-s390x.sh#b601cb8e3ea65a4ed1aecd96d4f3d14aca5b590b2e1ab0ec5c04c825f5c5e439" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_24.3.0-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.3.0-0-Linux-x86_64.sh#96a44849ff17e960eeb8877ecd9055246381c4d4f2d031263b63fa7e2e930af1" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_24.3.0-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.3.0-0-MacOSX-arm64.sh#72d4e9198a6884c0bd86cce2b4a3e8abb05415776e3b142c4b1de625bbaf4c50" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_24.3.0-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.3.0-0-MacOSX-x86_64.sh#fd71a4bf03fbb21d4b4d25245f17bef6308dfec478e901a60594dfa02e4605eb" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-24.4.0-0 b/plugins/python-build/share/python-build/miniconda3-3.12-24.4.0-0 new file mode 100644 index 0000000..20c8dfb --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-24.4.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_24.4.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.4.0-0-Linux-aarch64.sh#832d48e11e444c1a25f320fccdd0f0fabefec63c1cd801e606836e1c9c76ad51" "miniconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py312_24.4.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.4.0-0-Linux-s390x.sh#e973f1b6352d58b1ab35f30424f1565d7ffa469dcde2d52c86ec1c117db11aad" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_24.4.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.4.0-0-Linux-x86_64.sh#b6597785e6b071f1ca69cf7be6d0161015b96340b9a9e132215d5713408c3a7c" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_24.4.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.4.0-0-MacOSX-arm64.sh#f4925c0150d232d95de798a64c696f4b2df2745bb997b793506bdfd27bf91e11" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_24.4.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.4.0-0-MacOSX-x86_64.sh#1413369470adb7cf52f8b961e81b3ceeb92f5931a451bef9cb0c42be0ce17ef3" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-24.5.0-0 b/plugins/python-build/share/python-build/miniconda3-3.12-24.5.0-0 new file mode 100644 index 0000000..d9c91fd --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-24.5.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_24.5.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.5.0-0-Linux-aarch64.sh#70afe954cc8ee91f605f9aa48985bfe01ecfc10751339e8245eac7262b01298d" "miniconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py312_24.5.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.5.0-0-Linux-s390x.sh#bd2a0a8ea34c84c860868d5b8efde07afc51cdede76b64dd94e9c3fd2d65257e" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_24.5.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.5.0-0-Linux-x86_64.sh#4b3b3b1b99215e85fd73fb2c2d7ebf318ac942a457072de62d885056556eb83e" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_24.5.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.5.0-0-MacOSX-arm64.sh#12e678b8156aea69a132568b6176a019c7a1ba753ddf5caedf086d3c5460fe92" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_24.5.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.5.0-0-MacOSX-x86_64.sh#b1c87c8334ea878d30a9976c1860b1004e6d55bdec5228089fec40be81156363" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-24.7.1-0 b/plugins/python-build/share/python-build/miniconda3-3.12-24.7.1-0 new file mode 100644 index 0000000..78f0af4 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-24.7.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_24.7.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.7.1-0-Linux-aarch64.sh#bdace1e233cda30ce37105de627e646ae8e04b036373eacfcd7fa8e35949f1b7" "miniconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py312_24.7.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.7.1-0-Linux-s390x.sh#5a454c59314f63a0b860e2ed27d68f4a2516c77a7beda919fc11d3cd03c6b2d2" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_24.7.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.7.1-0-Linux-x86_64.sh#33442cd3813df33dcbb4a932b938ee95398be98344dff4c30f7e757cd2110e4f" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_24.7.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.7.1-0-MacOSX-arm64.sh#e7ef5a899f9383d14d5b15aef61d54a8cd9bf3c4de18a372af0455d8f5f78cd2" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_24.7.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.7.1-0-MacOSX-x86_64.sh#5cfb85d81d94dfe3ef3265f2247aef32a35aeb450ea71c3a204cefed384fb87d" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-24.9.2-0 b/plugins/python-build/share/python-build/miniconda3-3.12-24.9.2-0 new file mode 100644 index 0000000..96b1186 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-24.9.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_24.9.2-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.9.2-0-Linux-aarch64.sh#86b8df7481646cf87e77873e9789adb7569b58248d3aa629eb2da35e6f2e2eed" "miniconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py312_24.9.2-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.9.2-0-Linux-s390x.sh#876db345b31db6d2b96ab1e2aedfbcea8af6b951a3218e6fd36f657452d1305c" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_24.9.2-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.9.2-0-Linux-x86_64.sh#8d936ba600300e08eca3d874dee88c61c6f39303597b2b66baee54af4f7b4122" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_24.9.2-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.9.2-0-MacOSX-arm64.sh#08d8a82ed21d2dae707554d540b172fe03327347db747644fbb33abfaf07fddd" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_24.9.2-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.9.2-0-MacOSX-x86_64.sh#ce3b440c32c9c636bbe529477fd496798c35b96d9db1838e3df6b0a80714da4e" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-0 b/plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-0 new file mode 100644 index 0000000..dc7f588 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-0 @@ -0,0 +1,26 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_25.1.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-0-Linux-aarch64.sh#ae9d3ea83df97e78fd51c452d0bc75005a28d504c22db6f1000822293f916b54" "miniconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py312_25.1.1-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-0-Linux-s390x.sh#fa0b443ea73c71abd29eb51212c7b032d5089cbb2761aa07f91668b903a2a575" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_25.1.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-0-Linux-x86_64.sh#832de27a5a35b7963f0d83466abada3eb138e51985255f190e0dc350427a9dd1" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_25.1.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-0-MacOSX-arm64.sh#24821d2c87598ae0f8e697e612cdf41d0dbc9ae563cae8aacd878d50d1a86e1e" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_25.1.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-0-MacOSX-x86_64.sh#65f91c564abced759ce7fca099239b7ed4ae9835cb4b64a11923cd3b5f57f5f1" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-1 b/plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-1 new file mode 100644 index 0000000..8f466e4 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-1 @@ -0,0 +1,26 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_25.1.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-1-Linux-aarch64.sh#c8a2112c5ed07196a0e7cf0682ff39c9a28eac5862df49659af7d4f6906efa70" "miniconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py312_25.1.1-1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-1-Linux-s390x.sh#f644f5c18985078e6cd1af9c517f9634dbb3199a86f75eb90a9fb303289ebf0b" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_25.1.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-1-Linux-x86_64.sh#2cc524b9b47b268e1a3ecca1f7f3c1bb4142f42a10001c88fb69c6664ca8a9a6" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_25.1.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-1-MacOSX-arm64.sh#c8f316330308f712b94dd7ac2a6048f87d6b364c3354f4e619ed4aef6d99dfad" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_25.1.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-1-MacOSX-x86_64.sh#29fce1ea800ff167e2f44d5a0dbd33124384b33520fd481378908e94de68b1a1" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-2 b/plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-2 new file mode 100644 index 0000000..dc68b3c --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-2 @@ -0,0 +1,26 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_25.1.1-2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-2-Linux-aarch64.sh#6d05b9f9b7f327b90797a4cf56d68c81578bab2f63257a3e7a8b72cb0f0e4b5d" "miniconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py312_25.1.1-2-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-2-Linux-s390x.sh#55c681937c27e13a8ed818d1fec182e623e0308fffc1b10605896dac15f90077" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_25.1.1-2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-2-Linux-x86_64.sh#4766d85b5f7d235ce250e998ebb5a8a8210cbd4f2b0fea4d2177b3ed9ea87884" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_25.1.1-2-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-2-MacOSX-arm64.sh#16e7eea739d470d0c3451e9bb779bbfa169b98cfb283d2d6508945e0c6b36ada" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_25.1.1-2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-2-MacOSX-x86_64.sh#0df9f4b7d063a78d18fd02af2b0a97121879af00b535ea79ee23d68d1005e6f8" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-25.11.1-1 b/plugins/python-build/share/python-build/miniconda3-3.12-25.11.1-1 new file mode 100644 index 0000000..108113a --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-25.11.1-1 @@ -0,0 +1,20 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_25.11.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.11.1-1-Linux-aarch64.sh#f51aa82c395a2c5854c28ef8b7a24e252d5daca4a7a054ec8d9d6847d1d84518" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_25.11.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.11.1-1-Linux-x86_64.sh#498ddb7c091002e4fd76e3496d91d2d915b183d1d850bef6e060fd45e2523213" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_25.11.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.11.1-1-MacOSX-arm64.sh#febaaeddd0deff2d3b034f7ef99efcab7169549d9be4175e1870170d59377a58" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-25.3.1-1 b/plugins/python-build/share/python-build/miniconda3-3.12-25.3.1-1 new file mode 100644 index 0000000..3c73231 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-25.3.1-1 @@ -0,0 +1,23 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_25.3.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.3.1-1-Linux-aarch64.sh#4b8078ef311bad880b2497c098d734cd0e7316410a4f4fa1a8dbf6ab9ade98ea" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_25.3.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.3.1-1-Linux-x86_64.sh#8937a2c9a86cfc5495ba2234476f89686beff5c8e0569b1ed5771a927c75107b" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_25.3.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.3.1-1-MacOSX-arm64.sh#a0986857f44b8e22eaa65965d462921cf22c0624fef0fb9ad005811e43152ab8" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_25.3.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.3.1-1-MacOSX-x86_64.sh#ef6583760e507a08006618c4c425075989a7c9b990ec463538bd95e329ac07f8" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-25.5.1-0 b/plugins/python-build/share/python-build/miniconda3-3.12-25.5.1-0 new file mode 100644 index 0000000..226d169 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-25.5.1-0 @@ -0,0 +1,23 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_25.5.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.5.1-0-Linux-aarch64.sh#9bd5765f163568f4ac85b8189aa2b260d1febb1080d085bb2535a3cae2d7f0e4" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_25.5.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.5.1-0-Linux-x86_64.sh#b99e5bcdf8cd2df9ffd11019eac8a20cf84598267941500935d62e14a0e2a6f6" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_25.5.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.5.1-0-MacOSX-arm64.sh#016845b69dc9476cc3aa950b6577c9d596aae705258ee30b3261b4d258033426" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_25.5.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.5.1-0-MacOSX-x86_64.sh#bf9f441d20e6af3f6035e07e892e245161a4dc4962cae3346ef77c75a62b033d" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-25.5.1-1 b/plugins/python-build/share/python-build/miniconda3-3.12-25.5.1-1 new file mode 100644 index 0000000..847f0c7 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-25.5.1-1 @@ -0,0 +1,23 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_25.5.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.5.1-1-Linux-aarch64.sh#b007c6307c9a2081b8abfa0ff16caf0117226a7a9485031853fea125795de7ca" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_25.5.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.5.1-1-Linux-x86_64.sh#e3228df32afc6d43cb190a416b91937cdcd1c6308d9fe652274539a07142966f" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_25.5.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.5.1-1-MacOSX-arm64.sh#b7fef84af2ae88c395e29bde17707b9b33e34a36e431a083f5f38348c75fa89f" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_25.5.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.5.1-1-MacOSX-x86_64.sh#f9501093dc8a509179fb7ac6c230ae5c35405fca47d8c95bfa97d9327781727a" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-25.7.0-2 b/plugins/python-build/share/python-build/miniconda3-3.12-25.7.0-2 new file mode 100644 index 0000000..c546558 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-25.7.0-2 @@ -0,0 +1,23 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_25.7.0-2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.7.0-2-Linux-aarch64.sh#edc03373d75b3a06de594a7f819ad351bd2fa7602854f392107998e62468c783" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_25.7.0-2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.7.0-2-Linux-x86_64.sh#188b5d94ab3acefdeaebd7cb470d2fb74a3280563c77075de6e3e1d58d84ab0a" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_25.7.0-2-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.7.0-2-MacOSX-arm64.sh#8d67e7824088d7aa3bde938a4fc4365bb39ba1f710104cfe7bd9cfb9a99bd8d2" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_25.7.0-2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.7.0-2-MacOSX-x86_64.sh#e8f6aed58d708cc544ba6bacbebad86787cb8df56667ff4729ad2fe36af32846" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-25.9.1-1 b/plugins/python-build/share/python-build/miniconda3-3.12-25.9.1-1 new file mode 100644 index 0000000..a2f4b3a --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-25.9.1-1 @@ -0,0 +1,20 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_25.9.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.9.1-1-Linux-aarch64.sh#11ab86931679e6d9b15112f2e866dad1fcbd89a039a6442c0bce7b86fd282f0a" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_25.9.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.9.1-1-Linux-x86_64.sh#a0def9c732d94b156529ef7db8edd6e1862cee784a27a4961870dca86e89fba4" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_25.9.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.9.1-1-MacOSX-arm64.sh#6bf3d8cac26587f6e53f05cd781f9201d2918c37dc3ef20677b383e250568100" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-25.9.1-3 b/plugins/python-build/share/python-build/miniconda3-3.12-25.9.1-3 new file mode 100644 index 0000000..ed38ff5 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-25.9.1-3 @@ -0,0 +1,20 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_25.9.1-3-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.9.1-3-Linux-aarch64.sh#8c5c1d38011fed8053d7bdaaf7fab372c3f71dbb77791e07692fb8059b7828bd" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_25.9.1-3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.9.1-3-Linux-x86_64.sh#07fc00c146a481f7ae2657a31eb7ec0d5d77a107b981d58ab5d7cd8bc99be778" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_25.9.1-3-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.9.1-3-MacOSX-arm64.sh#67108a40cca0ae1a59b74672341d94ed6641430e10371616426c31c2014e19b9" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-26.1.1-1 b/plugins/python-build/share/python-build/miniconda3-3.12-26.1.1-1 new file mode 100644 index 0000000..2979a4c --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-26.1.1-1 @@ -0,0 +1,20 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_26.1.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_26.1.1-1-Linux-aarch64.sh#0a84d50ec92fbb248e31bff0a5888bf2f4dc322fc979e94ecc6e9946d0324ce7" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_26.1.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_26.1.1-1-Linux-x86_64.sh#eef1283cdc9d37f55743778ea4567e91aa28c2e3be4adab529dda324c3c897a2" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_26.1.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_26.1.1-1-MacOSX-arm64.sh#4a1e3630353121edad84fe79982a99ad8001425e27313c34f7ba9b6cec95d3dd" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-26.3.2-2 b/plugins/python-build/share/python-build/miniconda3-3.12-26.3.2-2 new file mode 100644 index 0000000..314134a --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-26.3.2-2 @@ -0,0 +1,20 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_26.3.2-2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_26.3.2-2-Linux-aarch64.sh#03d0268de83af20b3ea4e5a8927559b03e968d20f2e080794bc0fb762510773a" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_26.3.2-2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_26.3.2-2-Linux-x86_64.sh#32673413a39a21ae3997c9b38236e9df15c9fcef930b510487c64fe259e03f95" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_26.3.2-2-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_26.3.2-2-MacOSX-arm64.sh#ac941aaca113aa07fb429ad3b2f6b8f086d14b1fca5872f190c4a3ac8837308c" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.13-25.11.1-1 b/plugins/python-build/share/python-build/miniconda3-3.13-25.11.1-1 new file mode 100644 index 0000000..f5e3f15 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.13-25.11.1-1 @@ -0,0 +1,20 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py313_25.11.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.11.1-1-Linux-aarch64.sh#9f39cc8c46ca37afed5e563cc234b3add34fea2f1119e076dcae7a377ca6b8ee" "miniconda" verify_py313 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py313_25.11.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.11.1-1-Linux-x86_64.sh#e0b10e050e8928e2eb9aad2c522ee3b5d31d30048b8a9997663a8a460d538cef" "miniconda" verify_py313 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py313_25.11.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.11.1-1-MacOSX-arm64.sh#9f84ad10ea513fb59bb714933bc8dc092bd25fdb03c236868f5d5af3c26a1fd4" "miniconda" verify_py313 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.13-25.3.1-1 b/plugins/python-build/share/python-build/miniconda3-3.13-25.3.1-1 new file mode 100644 index 0000000..a468d36 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.13-25.3.1-1 @@ -0,0 +1,23 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py313_25.3.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.3.1-1-Linux-aarch64.sh#4caa0c266ab726b440ccad40a74774167494e001da5de281b74f2d5673e4ace9" "miniconda" verify_py313 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py313_25.3.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.3.1-1-Linux-x86_64.sh#53a86109463cfd70ba7acab396d416e623012914eee004729e1ecd6fe94e8c69" "miniconda" verify_py313 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py313_25.3.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.3.1-1-MacOSX-arm64.sh#d54b27ed4a6d3c31fedbad6f9f488377702196b0d8d89854e8e7d01f701f225b" "miniconda" verify_py313 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py313_25.3.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.3.1-1-MacOSX-x86_64.sh#614c455b74d85abe98c2d0fb9b00628bbf2d48932ea4b49ec05b5c4bee7e9239" "miniconda" verify_py313 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.13-25.5.1-0 b/plugins/python-build/share/python-build/miniconda3-3.13-25.5.1-0 new file mode 100644 index 0000000..9cea933 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.13-25.5.1-0 @@ -0,0 +1,23 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py313_25.5.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.5.1-0-Linux-aarch64.sh#368d5250682c12d3e1810e8cf5ce4f08e95ccc56c96dcf559567a6b4f72b203d" "miniconda" verify_py313 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py313_25.5.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.5.1-0-Linux-x86_64.sh#ae15e3f987bdf93edfd6f9dd35b122c34ac72555822f80f5c7c8642595a13197" "miniconda" verify_py313 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py313_25.5.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.5.1-0-MacOSX-arm64.sh#2559c460b128c0c1c0ce5e9d00fd03160baa7c15ae9f758eaaaab5506d442416" "miniconda" verify_py313 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py313_25.5.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.5.1-0-MacOSX-x86_64.sh#8507e1fcea7f744af3c858b8df4666d60ed42d383442fd560fe8f97949249d88" "miniconda" verify_py313 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.13-25.5.1-1 b/plugins/python-build/share/python-build/miniconda3-3.13-25.5.1-1 new file mode 100644 index 0000000..e795f99 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.13-25.5.1-1 @@ -0,0 +1,23 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py313_25.5.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.5.1-1-Linux-aarch64.sh#b7d611dcaa638efd700a4a4eb24fbcb9f7b94cc1773d7c655959c330d0b68e16" "miniconda" verify_py313 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py313_25.5.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.5.1-1-Linux-x86_64.sh#612af113b49db0368e2be41ac4d51b7088eebd5f31daeeb89f23fff8f920db58" "miniconda" verify_py313 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py313_25.5.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.5.1-1-MacOSX-arm64.sh#2ec6f7981770b3396a9ab426e07ac8ef5b12b4393aa2e4bcc984376fe3aa327e" "miniconda" verify_py313 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py313_25.5.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.5.1-1-MacOSX-x86_64.sh#4152f260040d452bfe00c67ac6b429aec7ff3b98f62bab8abe4c468e98e51891" "miniconda" verify_py313 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.13-25.7.0-2 b/plugins/python-build/share/python-build/miniconda3-3.13-25.7.0-2 new file mode 100644 index 0000000..75c1bdb --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.13-25.7.0-2 @@ -0,0 +1,23 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py313_25.7.0-2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.7.0-2-Linux-aarch64.sh#350dc95067e0c87bcaa67367e60ea1caae01872adeb945c760bb4a67518d9673" "miniconda" verify_py313 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py313_25.7.0-2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.7.0-2-Linux-x86_64.sh#dda3629462ba1cfa72eb74535214c2e315c77f1cfb0f02046537e99f1bf64abc" "miniconda" verify_py313 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py313_25.7.0-2-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.7.0-2-MacOSX-arm64.sh#5c0137ef38c153649da28ca31a420b9c12c94cf636319beb8c925396d797fe62" "miniconda" verify_py313 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py313_25.7.0-2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.7.0-2-MacOSX-x86_64.sh#9c88674b1a839eeb4cff006df397a05ea7d896472318fd84b7070278f9653dc6" "miniconda" verify_py313 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.13-25.9.1-1 b/plugins/python-build/share/python-build/miniconda3-3.13-25.9.1-1 new file mode 100644 index 0000000..374743a --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.13-25.9.1-1 @@ -0,0 +1,20 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py313_25.9.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.9.1-1-Linux-aarch64.sh#a0de4562c368a8b5ca4385843f405684c79bea7aa3b75d7513ff99c0c6435d51" "miniconda" verify_py313 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py313_25.9.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.9.1-1-Linux-x86_64.sh#6022714da22986097bbefa13dab3d957257fef04e1c37d1ebd3645b5b99bc9d4" "miniconda" verify_py313 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py313_25.9.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.9.1-1-MacOSX-arm64.sh#491f35ab841c99225e5680209d5455a2f5278551378781c0dfeaf2586d7ae3df" "miniconda" verify_py313 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.13-25.9.1-3 b/plugins/python-build/share/python-build/miniconda3-3.13-25.9.1-3 new file mode 100644 index 0000000..5d4e891 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.13-25.9.1-3 @@ -0,0 +1,20 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py313_25.9.1-3-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.9.1-3-Linux-aarch64.sh#036053e7e6e5866435bc1a11711b41293e5bf0776bb4aa9a7ea46d01f30eda31" "miniconda" verify_py313 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py313_25.9.1-3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.9.1-3-Linux-x86_64.sh#6bec65fcb0c66596a5058c6767d25d89a537eb83ee84684ec0fa5a4fbfb32647" "miniconda" verify_py313 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py313_25.9.1-3-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_25.9.1-3-MacOSX-arm64.sh#751b360885e8de7a350e3484542ccbfe7ff3d55cce794255167991dfa7ed79e1" "miniconda" verify_py313 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.13-26.1.1-1 b/plugins/python-build/share/python-build/miniconda3-3.13-26.1.1-1 new file mode 100644 index 0000000..5ed8228 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.13-26.1.1-1 @@ -0,0 +1,20 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py313_26.1.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_26.1.1-1-Linux-aarch64.sh#07c82b5aec04d5f0f3e4b246835b6bc85e104821cbcb0a059c7ea80f028503f4" "miniconda" verify_py313 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py313_26.1.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_26.1.1-1-Linux-x86_64.sh#f6dfb5b59614fd7b2956b240b2575a9d58203ec7f7a99f85128158a0fdc5c1d7" "miniconda" verify_py313 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py313_26.1.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_26.1.1-1-MacOSX-arm64.sh#745f97a6553ebdce0bfdaafe00b0d1939784b38cdaadb3378ca7868a51616a65" "miniconda" verify_py313 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.13-26.3.2-2 b/plugins/python-build/share/python-build/miniconda3-3.13-26.3.2-2 new file mode 100644 index 0000000..1db3019 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.13-26.3.2-2 @@ -0,0 +1,20 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py313_26.3.2-2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_26.3.2-2-Linux-aarch64.sh#81a5e828724478a7a036027a74356ceff0206147d3b1243c8ba32e0cfa187967" "miniconda" verify_py313 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py313_26.3.2-2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_26.3.2-2-Linux-x86_64.sh#2284bafb7863a23411b19874d216e237964d4b32dd9beb6807fa8b2d84570961" "miniconda" verify_py313 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py313_26.3.2-2-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py313_26.3.2-2-MacOSX-arm64.sh#6efc019c78003166fec1551486c68e08605eaca009039b1cda5f4e919e0c6dce" "miniconda" verify_py313 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.16.0 b/plugins/python-build/share/python-build/miniconda3-3.16.0 new file mode 100644 index 0000000..16413e6 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.16.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda3-3.16.0-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-3.16.0-Linux-x86.sh#faedb7a75584d48d563f0f9b449cb00bf8d05ddb3e1ede1936bf522f03f0e1e2" "miniconda" verify_py34 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-3.16.0-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.16.0-Linux-x86_64.sh#3becbcdd36761711850cffa11064b87cfe067dbeb4a5eda544dc341af482de87" "miniconda" verify_py34 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-3.16.0-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.16.0-MacOSX-x86_64.sh#36fe954548a6900249270f9632b76252e247313cc9d551c096d7e1f526a88631" "miniconda" verify_py34 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.18.3 b/plugins/python-build/share/python-build/miniconda3-3.18.3 new file mode 100644 index 0000000..ccdcb03 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.18.3 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda3-3.18.3-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-3.18.3-Linux-x86.sh#7f6b432daacfbe67ac5fd5b3e3bc5bca75642e4e099e967b1353a5b0a828b036" "miniconda" verify_py35 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-3.18.3-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.18.3-Linux-x86_64.sh#6eee19f7ac958578b0da4124f58b09f23422fa6f6b26af8b594a47f08cc61af4" "miniconda" verify_py35 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-3.18.3-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.18.3-MacOSX-x86_64.sh#b81c9b27eb9a91e3183e51000dbf986bfe91f99acfa1a4e3bc849ddacc7bf934" "miniconda" verify_py35 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.19.0 b/plugins/python-build/share/python-build/miniconda3-3.19.0 new file mode 100644 index 0000000..b429fec --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.19.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda3-3.19.0-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-3.19.0-Linux-x86.sh#9789463cad35cdb3ee4cda5a9c3767cad21491faacc071fcd60eb38a9f75098e" "miniconda" verify_py35 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-3.19.0-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.19.0-Linux-x86_64.sh#9ea57c0fdf481acf89d816184f969b04bc44dea27b258c4e86b1e3a25ff26aa0" "miniconda" verify_py35 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-3.19.0-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.19.0-MacOSX-x86_64.sh#40ec9c2726262addd330c24f62853de47430482965f0bb8cba47d8cd995bec29" "miniconda" verify_py35 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.3.0 b/plugins/python-build/share/python-build/miniconda3-3.3.0 new file mode 100644 index 0000000..1e934bd --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.3.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda3-3.3.0-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-3.3.0-Linux-x86.sh#80957b9c4b8d5674e13693cdf6be3e73ff1a109fa26faaefd4f0dbeb11a57295" "miniconda" verify_py33 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-3.3.0-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.3.0-Linux-x86_64.sh#07fbf1b54c7a03a524a34ec0078d4c39499fe7cdf3dce209e686ef5e0433722f" "miniconda" verify_py33 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-3.3.0-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.3.0-MacOSX-x86_64.sh#131b6a351987caab78410082e81d9cb51db262301cb9b8f09656bc94cddc51e4" "miniconda" verify_py33 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.4.2 b/plugins/python-build/share/python-build/miniconda3-3.4.2 new file mode 100644 index 0000000..30ea7df --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.4.2 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda3-3.4.2-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-3.4.2-Linux-x86.sh#9629cb8f1d633d1bfff59985fa93493eae3c18590893631bc5c1ae57d880e659" "miniconda" verify_py33 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-3.4.2-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.4.2-Linux-x86_64.sh#ea2eb831c89fedb8cd5e7d1cc4d299726684b8d8ccd0fdf16f039bd316dccf78" "miniconda" verify_py33 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-3.4.2-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.4.2-MacOSX-x86_64.sh#8dbad17efb24dc04473fef911239a09e9bf4219cdcfef7b9e263f5f129a8f38d" "miniconda" verify_py33 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.7-22.11.1-1 b/plugins/python-build/share/python-build/miniconda3-3.7-22.11.1-1 new file mode 100644 index 0000000..b024ad3 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.7-22.11.1-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py37_22.11.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_22.11.1-1-Linux-aarch64.sh#ebba2f7e33ce5594c50e6422477106e6bb327310838fbac3db89d2eaebcde943" "miniconda" verify_py37 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py37_22.11.1-1-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py37_22.11.1-1-Linux-ppc64le.sh#dda16ae14992697e3c90b56fe9de819f5f3b1dcb3ac7a31d24ab5736ccd5f129" "miniconda" verify_py37 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py37_22.11.1-1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py37_22.11.1-1-Linux-s390x.sh#3c71628865164c3f8b461f8e4b2a353ff1367eed61c83b9c3e14fc201608b1a7" "miniconda" verify_py37 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py37_22.11.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_22.11.1-1-Linux-x86_64.sh#22b14d52265b4e609c6ce78e2f2884b277d976b83b5f9c8a83423e3eba2ccfbe" "miniconda" verify_py37 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py37_22.11.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_22.11.1-1-MacOSX-x86_64.sh#e51d459aae45bb6b86c2716738b778b788785e6e1ea4b2ed244a0fdd754feb19" "miniconda" verify_py37 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.7-23.1.0-1 b/plugins/python-build/share/python-build/miniconda3-3.7-23.1.0-1 new file mode 100644 index 0000000..f3fbfbf --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.7-23.1.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py37_23.1.0-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_23.1.0-1-Linux-aarch64.sh#31c1d635fae931b7c0687018cc87e918e8098ed5dd5e76a658e10c57e00ef864" "miniconda" verify_py37 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py37_23.1.0-1-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py37_23.1.0-1-Linux-ppc64le.sh#d2de534bfa46aa34ef0b115a309de7e8a681683af65faf86bcee6a00460f07be" "miniconda" verify_py37 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py37_23.1.0-1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py37_23.1.0-1-Linux-s390x.sh#72a8fa9aca5abaf99771110746b1345a33d390c9b29a7b4daffe6a2ff00f2366" "miniconda" verify_py37 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py37_23.1.0-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_23.1.0-1-Linux-x86_64.sh#fc96109ea96493e31f70abbc5cae58e80634480c0686ab46924549ac41176812" "miniconda" verify_py37 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py37_23.1.0-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_23.1.0-1-MacOSX-x86_64.sh#bdfb2f01c0a3917bf258daffc65b69bfe07e29753be624aaf9cbda5ba02f43f4" "miniconda" verify_py37 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.7-4.10.1 b/plugins/python-build/share/python-build/miniconda3-3.7-4.10.1 new file mode 100644 index 0000000..cf66695 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.7-4.10.1 @@ -0,0 +1,16 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py37_4.10.1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.10.1-Linux-aarch64.sh#bcb84cfe1f5ccf477fa73fc87d2f4125" "miniconda" verify_py37 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py37_4.10.1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.10.1-Linux-s390x.sh#0738d7c00290860d60870103c710e4c2" "miniconda" verify_py37 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.7-4.10.3 b/plugins/python-build/share/python-build/miniconda3-3.7-4.10.3 new file mode 100644 index 0000000..639aa63 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.7-4.10.3 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py37_4.10.3-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.10.3-Linux-aarch64.sh#19815e497b045246307f9317bcb4fb93" "miniconda" verify_py37 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py37_4.10.3-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.10.3-Linux-ppc64le.sh#a926bbaf28d59ac1264799e3ca770a44" "miniconda" verify_py37 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py37_4.10.3-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.10.3-Linux-s390x.sh#a82215f8abf68e44a8666a658ac4cdf9" "miniconda" verify_py37 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py37_4.10.3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.10.3-Linux-x86_64.sh#9f186c1d86c266acc47dbc1603f0e2ed" "miniconda" verify_py37 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py37_4.10.3-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.10.3-MacOSX-x86_64.sh#b88a2eb66917c55a6bd1973fabaf05b3" "miniconda" verify_py37 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.7-4.11.0 b/plugins/python-build/share/python-build/miniconda3-3.7-4.11.0 new file mode 100644 index 0000000..2189f0e --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.7-4.11.0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py37_4.11.0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.11.0-Linux-aarch64.sh#07e8dfaf467e5432d402a79b11085783" "miniconda" verify_py37 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py37_4.11.0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.11.0-Linux-ppc64le.sh#cf7cbccc16bf82365bbf0129f646ff45" "miniconda" verify_py37 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py37_4.11.0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.11.0-Linux-s390x.sh#1dc6dbf1951e65217d07cf30887360a8" "miniconda" verify_py37 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py37_4.11.0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.11.0-Linux-x86_64.sh#7675bd23411179956bcc4692f16ef27d" "miniconda" verify_py37 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py37_4.11.0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.11.0-MacOSX-x86_64.sh#0dde31d693fbcb4feb1eb4292cba4371" "miniconda" verify_py37 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.7-4.12.0 b/plugins/python-build/share/python-build/miniconda3-3.7-4.12.0 new file mode 100644 index 0000000..f706448 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.7-4.12.0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py37_4.12.0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.12.0-Linux-aarch64.sh#dbac5ea2d2a1dfcf864f5ad0ac775647" "miniconda" verify_py37 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py37_4.12.0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.12.0-Linux-ppc64le.sh#57a654d3f143db5230d181cad7a938c1" "miniconda" verify_py37 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py37_4.12.0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.12.0-Linux-s390x.sh#2f6c9cb12b37dca5d7d29a4b5d04ffdd" "miniconda" verify_py37 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py37_4.12.0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.12.0-Linux-x86_64.sh#770bac2587bc7380198b4f0741115b11" "miniconda" verify_py37 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py37_4.12.0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.12.0-MacOSX-x86_64.sh#161c0c4b88410149beb73d1eea6ec937" "miniconda" verify_py37 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.7-4.8.2 b/plugins/python-build/share/python-build/miniconda3-3.7-4.8.2 new file mode 100644 index 0000000..5d62711 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.7-4.8.2 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniconda3-py37_4.8.2-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.8.2-Linux-ppc64le.sh#e50662a93f3f5e56ef2d3fdfaf2f8e91" "miniconda" verify_py37 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py37_4.8.2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.8.2-Linux-x86_64.sh#87e77f097f6ebb5127c77662dfc3165e" "miniconda" verify_py37 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py37_4.8.2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.8.2-MacOSX-x86_64.sh#e0320c20ea13d04407424ecf57b70eaf" "miniconda" verify_py37 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.7-4.8.3 b/plugins/python-build/share/python-build/miniconda3-3.7-4.8.3 new file mode 100644 index 0000000..bc10060 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.7-4.8.3 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniconda3-py37_4.8.3-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.8.3-Linux-ppc64le.sh#ae06d853a09764d86e400cd797c2e922" "miniconda" verify_py37 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py37_4.8.3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.8.3-Linux-x86_64.sh#751786b92c00b1aeae3f017b781018df" "miniconda" verify_py37 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py37_4.8.3-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.8.3-MacOSX-x86_64.sh#d1754f1e192e078b4d207a8b2e5607b0" "miniconda" verify_py37 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.7-4.9.2 b/plugins/python-build/share/python-build/miniconda3-3.7-4.9.2 new file mode 100644 index 0000000..da4a6e8 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.7-4.9.2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py37_4.9.2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.9.2-Linux-aarch64.sh#eb76394f962a84fb6af4ed8bf115b904" "miniconda" verify_py37 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py37_4.9.2-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.9.2-Linux-ppc64le.sh#5bdc8650a2d1b32c8fd6eed9ed61aef5" "miniconda" verify_py37 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py37_4.9.2-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.9.2-Linux-s390x.sh#aa9207a1111352af948b8932d7823dce" "miniconda" verify_py37 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py37_4.9.2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.9.2-Linux-x86_64.sh#3143b1116f2d466d9325c206b7de88f7" "miniconda" verify_py37 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py37_4.9.2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py37_4.9.2-MacOSX-x86_64.sh#cfe1b551b169d6386f5f4b7df40cdac4" "miniconda" verify_py37 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.7.0 b/plugins/python-build/share/python-build/miniconda3-3.7.0 new file mode 100644 index 0000000..49399c4 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.7.0 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda3-3.7.0-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-3.7.0-Linux-x86.sh#d5143303a8159a5b7388cc1d09aa6d9bc029c2c5f8cb53230a5fcf07d9ee149c" "miniconda" verify_py34 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-3.7.0-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.7.0-Linux-x86_64.sh#dba631db9938216af83ca9793605a73fae8b8e5ef966c15b9e89c09bf405de26" "miniconda" verify_py34 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-3.7.0-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.7.0-MacOSX-x86_64.sh#fd4df5a944801019ef56a348bdcb483a7fdbf376c98aeacb25a78e5bc9bb4158" "miniconda" verify_py34 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.8-22.11.1-1 b/plugins/python-build/share/python-build/miniconda3-3.8-22.11.1-1 new file mode 100644 index 0000000..5c3c2b8 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.8-22.11.1-1 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py38_22.11.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_22.11.1-1-Linux-aarch64.sh#ff65684bce7a7ad7abb698ff649195816ee0f47a4f17cb9632a44abf69357ea5" "miniconda" verify_py38 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py38_22.11.1-1-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_22.11.1-1-Linux-ppc64le.sh#59fd0901f9fa1ba6b07e734adff4d6c5215e9d7f13ad37f0044af22e9b72194a" "miniconda" verify_py38 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py38_22.11.1-1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_22.11.1-1-Linux-s390x.sh#5bdc6ead307c098b32ba8473b7cbbe87eb80f8eca9adba03f47848bcb34a9b38" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py38_22.11.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_22.11.1-1-Linux-x86_64.sh#473e5ecc8e078e9ef89355fbca21f8eefa5f9081544befca99867c7beac3150d" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py38_22.11.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_22.11.1-1-MacOSX-arm64.sh#bf75dbf193db6895c62b2bb963cab2534a8bbdf0ac956f270da8d7a19f4d1b54" "miniconda" verify_py38 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py38_22.11.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_22.11.1-1-MacOSX-x86_64.sh#6c4cea3c355326f503d15ae97e5126437529a595499e3ce304cd0f247e935da8" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.8-23.1.0-1 b/plugins/python-build/share/python-build/miniconda3-3.8-23.1.0-1 new file mode 100644 index 0000000..ea76717 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.8-23.1.0-1 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py38_23.1.0-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.1.0-1-Linux-aarch64.sh#10ea91cc579a64a3a88727119ac3f55839562f55118458b82824b544bc74f90d" "miniconda" verify_py38 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py38_23.1.0-1-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.1.0-1-Linux-ppc64le.sh#d89faee2d839c7e8a2c96f3ca60295c08e837c2f134f6bb9e9e21b707babedc2" "miniconda" verify_py38 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py38_23.1.0-1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.1.0-1-Linux-s390x.sh#3d1e06eddaef0976530c54ed7dda80df62705c16513634e58f7d1c4567227b9e" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py38_23.1.0-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.1.0-1-Linux-x86_64.sh#640b7dceee6fad10cb7e7b54667b2945c4d6f57625d062b2b0952b7f3a908ab7" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py38_23.1.0-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.1.0-1-MacOSX-arm64.sh#8dfab7797151a31b16c174da9a5bc09529d5859f21e77f0655ea9b18209cc926" "miniconda" verify_py38 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py38_23.1.0-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.1.0-1-MacOSX-x86_64.sh#5d789cda38b23245ffed6b88c60b7479d984bbf20e3b70d66cd150f04a9c25c5" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.8-23.10.0-1 b/plugins/python-build/share/python-build/miniconda3-3.8-23.10.0-1 new file mode 100644 index 0000000..77d1887 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.8-23.10.0-1 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py38_23.10.0-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.10.0-1-Linux-aarch64.sh#aee297bdefb15cfee9e2cb4c0881f811ce18c1a066ac75b811b21967ccd41acd" "miniconda" verify_py38 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py38_23.10.0-1-Linux-ppc64le.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.10.0-1-Linux-ppc64le.sh#1d7ccb2fa31042116b38ec518a63428d9cf87adba8771ffa9f0e3241f6b5a72a" "miniconda" verify_py38 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py38_23.10.0-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.10.0-1-Linux-s390x.sh#095bfb828b3155e6a345b7e821010451dfd291e8373b618a3b72a050a1c7a909" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py38_23.10.0-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.10.0-1-Linux-x86_64.sh#6842afb93a64fd4f04daa0f49f4618857d2327ead1366851eb0e49f1ae460f00" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py38_23.10.0-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.10.0-1-MacOSX-arm64.sh#c5ece9fce0a2f3c68600476e4256146f03511f82f76d05324eedbdc9eb06bed7" "miniconda" verify_py38 + ;; +"MacOSX-x86_64" ) + install_script ""Miniconda3-py38_23.10.0-1-MacOSX-x86_64.sh "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.10.0-1-MacOSX-x86_64.sh#0e6921f44b4278aa178969f59da57ca4ced2a55ef7730c774296f1de1801c561" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.8-23.11.0-1 b/plugins/python-build/share/python-build/miniconda3-3.8-23.11.0-1 new file mode 100644 index 0000000..c0653ac --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.8-23.11.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py38_23.11.0-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-1-Linux-aarch64.sh#3b28bce7689d42c85190e86738f152efc88a7d17cbcd90b4eb8cb92be42e3bff" "miniconda" verify_py38 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py38_23.11.0-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-1-Linux-s390x.sh#38e4050d6b73814071c065d36c41c6fea553fbf973e72e6375b958fcff747b69" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py38_23.11.0-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-1-Linux-x86_64.sh#ad3cb53ddfbadd190172b864337572206733ae75515fcfb17157cc8f2cb907a5" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py38_23.11.0-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-1-MacOSX-arm64.sh#89b1b0428e68fea63af15193237f2efed9a3c80cffa2fc221cca0af2465d3fd2" "miniconda" verify_py38 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py38_23.11.0-1-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-1-MacOSX-x86_64.sh#5056bea02062a198991a09c8c9c02c39735ad2d26cdbf21863eaa799bcacd8ab" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.8-23.11.0-2 b/plugins/python-build/share/python-build/miniconda3-3.8-23.11.0-2 new file mode 100644 index 0000000..24ff73e --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.8-23.11.0-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py38_23.11.0-2-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-2-Linux-aarch64.sh#6e439ae5373d35b78a3f45775fa69f0afddd0c0a9e5e545cd2f75f913a6d143b" "miniconda" verify_py38 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py38_23.11.0-2-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-2-Linux-s390x.sh#4d53356e80b3be7e90dbcf021d40cd3d7f889cf4d19574c9957ba22f5a9d98f2" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py38_23.11.0-2-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-2-Linux-x86_64.sh#cb908ddbd603d789d94076ea4dd3f8517b15866719e007725dca778a8dfab823" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py38_23.11.0-2-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-2-MacOSX-arm64.sh#5b0258717b9c53c90fc9255ef739d766325fc284761b637837e3d378bb12d3e3" "miniconda" verify_py38 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py38_23.11.0-2-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-2-MacOSX-x86_64.sh#143d79c7018c66ef452a27711090367dc36e0046ae765f514bc2b1c2b4f76746" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.8-23.3.1-0 b/plugins/python-build/share/python-build/miniconda3-3.8-23.3.1-0 new file mode 100644 index 0000000..1207508 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.8-23.3.1-0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py38_23.3.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.3.1-0-Linux-aarch64.sh#ad491ebad6efec7470fe2139c8b407a895cb2c828b3233b97da6e4f22cae0cde" "miniconda" verify_py38 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py38_23.3.1-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.3.1-0-Linux-ppc64le.sh#8aa819800ba3ec88ad8518a9e4fc71ada8087547300fc53527c4ecc8072a4d50" "miniconda" verify_py38 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py38_23.3.1-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.3.1-0-Linux-s390x.sh#e4d83bb9f0900c9128504f7e3c4d3b9e5eaf3b87c4bb5190a3086947e92bd3fa" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py38_23.3.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.3.1-0-Linux-x86_64.sh#d1f3a4388c1a6fd065e32870f67abc39eb38f4edd36c4947ec7411e32311bd59" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py38_23.3.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.3.1-0-MacOSX-arm64.sh#e0151c68f6a11a38b29c2f4a775bf6a22187fa2c8ca0f31930d69f2f013c0810" "miniconda" verify_py38 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py38_23.3.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.3.1-0-MacOSX-x86_64.sh#eb7b2d285f6d3b7c9cde9576c8c647e70b65361426b0e0e069b4ab23ccbb79e2" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.8-23.5.0-3 b/plugins/python-build/share/python-build/miniconda3-3.8-23.5.0-3 new file mode 100644 index 0000000..d1432bf --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.8-23.5.0-3 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py38_23.5.0-3-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.0-3-Linux-aarch64.sh#853e1c3c24f1c4cc2a1c57b05059740127724a2b346f887e3f0bb92a6cd05fe1" "miniconda" verify_py38 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py38_23.5.0-3-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.0-3-Linux-ppc64le.sh#5bef0b71b9c9c6a27e534894e913e47e545793a549a8815bb4a66a8c9d793d45" "miniconda" verify_py38 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py38_23.5.0-3-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.0-3-Linux-s390x.sh#e0271bc3af023053258cfe01059d53769bbd32dc5542b5c96280d29dcd8568f6" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py38_23.5.0-3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.0-3-Linux-x86_64.sh#f833ae8ad96db31d4f2a09d12f1b188721c769d60d813d7e6341c19e77bc791f" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py38_23.5.0-3-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.0-3-MacOSX-arm64.sh#5daf6837136d08a17f039b29993f67207ba90dcc90abe94c6d5a8925f6888076" "miniconda" verify_py38 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py38_23.5.0-3-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.0-3-MacOSX-x86_64.sh#54ead65ad1ff77d9cba2512a8765d64e6b7d8ae154e2fc1a6fcb01395b9a8cf3" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.8-23.5.1-0 b/plugins/python-build/share/python-build/miniconda3-3.8-23.5.1-0 new file mode 100644 index 0000000..981c7c1 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.8-23.5.1-0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py38_23.5.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.1-0-Linux-aarch64.sh#dcf57b73c3db9b4ce5ab1407f0573c83241b5041f2c6fd590959a091ca518b4c" "miniconda" verify_py38 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py38_23.5.1-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.1-0-Linux-ppc64le.sh#1c141b28ffe6dee40fc04c0d175da22270b86c63ec67e71798cd15183d10bcf2" "miniconda" verify_py38 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py38_23.5.1-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.1-0-Linux-s390x.sh#1c7c2188cad19a1a00bf8a5895af8bd67a06f983ea02d34ad3cdb40cb6a86224" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py38_23.5.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.1-0-Linux-x86_64.sh#05c1284d67d35abcc3a9b814cd124ec351020b9172962bcc166bf2f2ac22ea5e" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py38_23.5.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.1-0-MacOSX-arm64.sh#044bc2a3eab865448924bf2aeab069a7a61a174b132c58f6e9a88cf14c5b647c" "miniconda" verify_py38 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py38_23.5.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.1-0-MacOSX-x86_64.sh#ed617d73092e9f0b696f2b55e68126d751040ef6700c2ea38bc913bf18fd8956" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.8-23.5.2-0 b/plugins/python-build/share/python-build/miniconda3-3.8-23.5.2-0 new file mode 100644 index 0000000..6d1246c --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.8-23.5.2-0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py38_23.5.2-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.2-0-Linux-aarch64.sh#cd39b811ac9a2f9094c4dfff9ec0f7ec811d6ad7ede5ab3f1a31d330ab3a2c55" "miniconda" verify_py38 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py38_23.5.2-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.2-0-Linux-ppc64le.sh#6fc3bf00d4fe0c724fab884d93b981acbc22bb8fc41c144df6d2fc080ff80e25" "miniconda" verify_py38 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py38_23.5.2-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.2-0-Linux-s390x.sh#b840fd5a8474a3e6831cd50a64eadf73239c6ad7deeebf2c3d3fe366220b2722" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py38_23.5.2-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.2-0-Linux-x86_64.sh#e2a4438671e0e42c5bba14cb51de6ce9763938184d6ca2967340bbe972bbe7e6" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py38_23.5.2-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.2-0-MacOSX-arm64.sh#782bd1a401b20b41227a086adae98e270bbc942c3b7621788fb5574a9583142e" "miniconda" verify_py38 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py38_23.5.2-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.2-0-MacOSX-x86_64.sh#6dc8bfb3b382c31be1755545ae6afc5fbdf8a67726ffdb8a05b917204bd08779" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.8-23.9.0-0 b/plugins/python-build/share/python-build/miniconda3-3.8-23.9.0-0 new file mode 100644 index 0000000..dd256a9 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.8-23.9.0-0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py38_23.9.0-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.9.0-0-Linux-aarch64.sh#c59fbb2565812573f39b88425ef48607de70d1feadc522204811555e58bb972c" "miniconda" verify_py38 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py38_23.9.0-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.9.0-0-Linux-ppc64le.sh#4d1903b396de1c3473a81b2794f0d9792b30b4e9d98ae1c9dcfeef3aba15435b" "miniconda" verify_py38 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py38_23.9.0-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.9.0-0-Linux-s390x.sh#57cf786d2c30aed186a14e9319c596579750ef75d1c8c039734492b5e6d6762c" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py38_23.9.0-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.9.0-0-Linux-x86_64.sh#3c684c1c22d3a0e6bd5ab28186fd7b068b5c552f0937ee927ad117f35a5573fc" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py38_23.9.0-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.9.0-0-MacOSX-arm64.sh#694facc3601da8a93592d6f947818c2064d6854ca1f2a7e5b40b3e2e91e65baa" "miniconda" verify_py38 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py38_23.9.0-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.9.0-0-MacOSX-x86_64.sh#6fab242ca8200a1d59e54c5cc1abb89f7519a136da234e2ab77a30fb87c4ce7d" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.8-4.10.1 b/plugins/python-build/share/python-build/miniconda3-3.8-4.10.1 new file mode 100644 index 0000000..cf3b39c --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.8-4.10.1 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py38_4.10.1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.10.1-Linux-aarch64.sh#34aba2af867e5411eff7fddd80982aa9" "miniconda" verify_py38 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py38_4.10.1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.10.1-Linux-s390x.sh#ff0ed5428dd94a6f5c64c92a59a73165" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py38_4.10.1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.10.1-MacOSX-arm64.sh#1bb73c5cd765d135e2b874fc0f08d50c" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.8-4.10.3 b/plugins/python-build/share/python-build/miniconda3-3.8-4.10.3 new file mode 100644 index 0000000..80fefee --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.8-4.10.3 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py38_4.10.3-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.10.3-Linux-aarch64.sh#1b84ae526853a0301d0c04b68b718ea8" "miniconda" verify_py38 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py38_4.10.3-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.10.3-Linux-ppc64le.sh#12ddb1b94f30f8fc633c3223b0398d2f" "miniconda" verify_py38 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py38_4.10.3-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.10.3-Linux-s390x.sh#44e34b6ee8a47db8c28834f86ada6d41" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py38_4.10.3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.10.3-Linux-x86_64.sh#14da4a9a44b337f7ccb8363537f65b9c" "miniconda" verify_py38 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py38_4.10.3-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.10.3-MacOSX-x86_64.sh#cb609591c280423e999fc421cdb779d3" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.8-4.11.0 b/plugins/python-build/share/python-build/miniconda3-3.8-4.11.0 new file mode 100644 index 0000000..eb13e77 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.8-4.11.0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py38_4.11.0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.11.0-Linux-aarch64.sh#18344281ba44bdd1e38c8ae0f05a8758" "miniconda" verify_py38 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py38_4.11.0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.11.0-Linux-ppc64le.sh#adec9893a69557f1eaadce56f24f6614" "miniconda" verify_py38 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py38_4.11.0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.11.0-Linux-s390x.sh#b337e6834c940774e762cfb420ec7b91" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py38_4.11.0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.11.0-Linux-x86_64.sh#252d3b0c863333639f99fbc465ee1d61" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py38_4.11.0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.11.0-MacOSX-arm64.sh#1075216b8a7458b8fb86f6386dc5a4a9" "miniconda" verify_py38 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py38_4.11.0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.11.0-MacOSX-x86_64.sh#e0ab9762f3d20d23bbff4b804a03cb08" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.8-4.12.0 b/plugins/python-build/share/python-build/miniconda3-3.8-4.12.0 new file mode 100644 index 0000000..79cf751 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.8-4.12.0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py38_4.12.0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.12.0-Linux-aarch64.sh#72cb127e8f455b692e3c8a9009b34f7c" "miniconda" verify_py38 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py38_4.12.0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.12.0-Linux-ppc64le.sh#2023a9a4008a9e1c4c317f3b1a6a99cd" "miniconda" verify_py38 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py38_4.12.0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.12.0-Linux-s390x.sh#f5692dec773b021dea5074b6f6bc3464" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py38_4.12.0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.12.0-Linux-x86_64.sh#9986028a26f489f99af4398eac966d36" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py38_4.12.0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.12.0-MacOSX-arm64.sh#c8796b213b0dee4426e442f6eb059b40" "miniconda" verify_py38 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py38_4.12.0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.12.0-MacOSX-x86_64.sh#215d80a3912d71c2272e37c63340f48a" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.8-4.8.2 b/plugins/python-build/share/python-build/miniconda3-3.8-4.8.2 new file mode 100644 index 0000000..aaf4dd9 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.8-4.8.2 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniconda3-py38_4.8.2-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.8.2-Linux-ppc64le.sh#8dbe9589f7ba6e17428ac57658802eb2" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py38_4.8.2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.8.2-Linux-x86_64.sh#cbda751e713b5a95f187ae70b509403f" "miniconda" verify_py38 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py38_4.8.2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.8.2-MacOSX-x86_64.sh#589972cf83097c97e70c41813f2fe3a2" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.8-4.8.3 b/plugins/python-build/share/python-build/miniconda3-3.8-4.8.3 new file mode 100644 index 0000000..4d93ac4 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.8-4.8.3 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniconda3-py38_4.8.3-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.8.3-Linux-ppc64le.sh#a48a5db8c22c47cea7b04af2c3af2a1f" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py38_4.8.3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.8.3-Linux-x86_64.sh#d63adf39f2c220950a063e0529d4ff74" "miniconda" verify_py38 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py38_4.8.3-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.8.3-MacOSX-x86_64.sh#3fe6d972d40ee60f2e8496cf943ad852" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.8-4.9.2 b/plugins/python-build/share/python-build/miniconda3-3.8-4.9.2 new file mode 100644 index 0000000..8ad3d75 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.8-4.9.2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py38_4.9.2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.9.2-Linux-aarch64.sh#2359284ff562247fc2da4b68334ccac7" "miniconda" verify_py38 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py38_4.9.2-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.9.2-Linux-ppc64le.sh#b05f6c543ce0c593761bbfb4e6548ff6" "miniconda" verify_py38 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py38_4.9.2-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.9.2-Linux-s390x.sh#29a7a50a29954d26a64e1a651a9e6f83" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py38_4.9.2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.9.2-Linux-x86_64.sh#122c8c9beb51e124ab32a0fa6426c656" "miniconda" verify_py38 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py38_4.9.2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.9.2-MacOSX-x86_64.sh#cb40e2c1a32dccd6cdd8d5e49977a635" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.8.3 b/plugins/python-build/share/python-build/miniconda3-3.8.3 new file mode 100644 index 0000000..eb42e96 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.8.3 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda3-3.8.3-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-3.8.3-Linux-x86.sh#2345cf595864ee0a139f6dd1572070442445baace0dec7a4937267169708f929" "miniconda" verify_py34 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-3.8.3-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.8.3-Linux-x86_64.sh#26483a27b56d3567596b866076cb6de75c4b7e376fe359720ec27fca2c05ceec" "miniconda" verify_py34 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-3.8.3-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.8.3-MacOSX-x86_64.sh#86be2f1d55755670e0a21902584768b69732b31e87af22d1cca856f3d9e5c20d" "miniconda" verify_py34 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-22.11.1-1 b/plugins/python-build/share/python-build/miniconda3-3.9-22.11.1-1 new file mode 100644 index 0000000..f9a7107 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-22.11.1-1 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_22.11.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_22.11.1-1-Linux-aarch64.sh#031b6c52060bb75e930846c0a66baa91db8196f0d97fd32f3822c54db6b7c76a" "miniconda" verify_py39 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py39_22.11.1-1-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py39_22.11.1-1-Linux-ppc64le.sh#16cc2d74644cf838d2761723c01172e0b704674317630480902ef429af29bd0b" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_22.11.1-1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_22.11.1-1-Linux-s390x.sh#ed6176aa6b52e22d939ea5c0c38f9f3cf52d2519a5d0dcb414936287893a31f9" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_22.11.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_22.11.1-1-Linux-x86_64.sh#e685005710679914a909bfb9c52183b3ccc56ad7bb84acc861d596fcbe5d28bb" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_22.11.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_22.11.1-1-MacOSX-arm64.sh#eca5e241faea19d4b352aba819f99f42e2336fdbeecb04f5bc89c9ca786ea798" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_22.11.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_22.11.1-1-MacOSX-x86_64.sh#9a537f3a1b472098754c59a30b94822f1e9458405af831172aaa8f8124e9df88" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-23.1.0-1 b/plugins/python-build/share/python-build/miniconda3-3.9-23.1.0-1 new file mode 100644 index 0000000..9e2f8ee --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-23.1.0-1 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_23.1.0-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.1.0-1-Linux-aarch64.sh#5e67416a574c49e19dc21d5b9ed586400863a685bc4e34b4d933ea8c7c1ed2da" "miniconda" verify_py39 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py39_23.1.0-1-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.1.0-1-Linux-ppc64le.sh#cf5d7cad2b0eb260903b3661ee3fa822eecb25cf3c9b14bc9de10d72963d3d5a" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_23.1.0-1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.1.0-1-Linux-s390x.sh#5159322f15d9e2b22b3cf90fe88b336d84f62189178c872a9288a339d86f5d20" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_23.1.0-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.1.0-1-Linux-x86_64.sh#5dc619babc1d19d6688617966251a38d245cb93d69066ccde9a013e1ebb5bf18" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_23.1.0-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.1.0-1-MacOSX-arm64.sh#a7133a703e41ea0b1738196fb03f72b22250327adea94521c9dd6100c304dc63" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_23.1.0-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.1.0-1-MacOSX-x86_64.sh#d78eaac94f85bacbc704f629bdfbc2cd42a72dc3a4fd383a3bfc80997495320e" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-23.10.0-1 b/plugins/python-build/share/python-build/miniconda3-3.9-23.10.0-1 new file mode 100644 index 0000000..04cd1e6 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-23.10.0-1 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_23.10.0-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.10.0-1-Linux-aarch64.sh#e7558e2a628ce2f40e8ea792763b942ba587b01b33a677d2d22e7372ec50dbb7" "miniconda" verify_py39 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py39_23.10.0-1-Linux-ppc64le.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.10.0-1-Linux-ppc64le.sh#cd92b3272d85c94ef54b685d49fbbd9d36c6680e6b518f1806c039ddb34fc754" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_23.10.0-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.10.0-1-Linux-s390x.sh#1aa4b984316faa9917c0dce8656bf3b32941def86397815adbe124185b7d3cdb" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_23.10.0-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.10.0-1-Linux-x86_64.sh#3dbb87a74f80c84ae166a380bf51da8ef75699ce97c234e3e196afa20d1a9319" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_23.10.0-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.10.0-1-MacOSX-arm64.sh#adfac9e92405a6fdb60cc3b39018cb5084d096799be8f82fa88d26dadbe719b6" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_23.10.0-1-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.10.0-1-MacOSX-x86_64.sh#6d26cbe11e964bf573c459420154139d922ffa2e5c690c9c1e9bdb84f17f83af" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-23.11.0-1 b/plugins/python-build/share/python-build/miniconda3-3.9-23.11.0-1 new file mode 100644 index 0000000..1f2aa85 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-23.11.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_23.11.0-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-1-Linux-aarch64.sh#a8a9c37882209680d9258e57ce5d5ca0e186f0159e703736b9f5122e94864083" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_23.11.0-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-1-Linux-s390x.sh#719c653d7e4b724566c2a9fa365f7b6dbb830d279513ae62e02e11144722c1c9" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_23.11.0-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-1-Linux-x86_64.sh#d36c0f778b6b164223a174acafbe8556b841b67e53cb84b3eb24f1956b62121a" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_23.11.0-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-1-MacOSX-arm64.sh#1f345d26837e505713aa7b9332cc740c7f2319c7208dc6bd7b95b6a251a9b665" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_23.11.0-1-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-1-MacOSX-x86_64.sh#7b05aff168e441ec500e038bb3e252e5b01f3059a74f92fb7f3a7630eb6a6b13" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-23.11.0-2 b/plugins/python-build/share/python-build/miniconda3-3.9-23.11.0-2 new file mode 100644 index 0000000..f99536d --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-23.11.0-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_23.11.0-2-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-2-Linux-aarch64.sh#465f30688bae46f73b8497bb601face6b652092ace0e515c898e2a64f8c0f15f" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_23.11.0-2-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-2-Linux-s390x.sh#ff1de437a3f9110d8d7665c1f6d178bb797150689264bec5d0d8b36604e3823a" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_23.11.0-2-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-2-Linux-x86_64.sh#b911ff745c55db982078ac51ed4d848da0170f16ba642822a3bc7dd3fc8c61ba" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_23.11.0-2-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-2-MacOSX-arm64.sh#0234becafc167a475fbbcd9a59dda0eec288343695ff6b9645b34fcb9f124bb5" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_23.11.0-2-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-2-MacOSX-x86_64.sh#cc22270c81080d50e518f74d36a151fd3727e2cd6fccc4b1fd345f9a852d5762" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-23.3.1-0 b/plugins/python-build/share/python-build/miniconda3-3.9-23.3.1-0 new file mode 100644 index 0000000..48b5dbd --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-23.3.1-0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_23.3.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.3.1-0-Linux-aarch64.sh#e93ccab720b57f821e0d758f54e9aee9bd2f0ea931ebb26b78d866704437a296" "miniconda" verify_py39 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py39_23.3.1-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.3.1-0-Linux-ppc64le.sh#d2bcef86812863adaf11fcda6df829aa508760cbde4a19174cf0fec03e8498f5" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_23.3.1-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.3.1-0-Linux-s390x.sh#d0b658566edd239dd50fc28ab1d3a57b8b0da707481b3b18c27d11273c4fdb5a" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_23.3.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.3.1-0-Linux-x86_64.sh#1564571a6a06a9999a75a6c65d63cb82911fc647e96ba5b729f904bf00c177d3" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_23.3.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.3.1-0-MacOSX-arm64.sh#c74474bab188b8b3dcaf0f0ca52f5e0743591dbe171766016023d052acf96502" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_23.3.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.3.1-0-MacOSX-x86_64.sh#54d739715feb0cd5c127865215cc9f50697709d71e9ee7da430576c5a1c8010d" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-23.5.0-3 b/plugins/python-build/share/python-build/miniconda3-3.9-23.5.0-3 new file mode 100644 index 0000000..8031d63 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-23.5.0-3 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_23.5.0-3-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.0-3-Linux-aarch64.sh#f77868e96eee904cd137ebe463439258d76281830bb9e2bd330d23aea1ddd31a" "miniconda" verify_py39 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py39_23.5.0-3-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.0-3-Linux-ppc64le.sh#4bbda8ba3b8d1d26f04a469bbe29b3ef626a8b10b823f64314719e132f7c3696" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_23.5.0-3-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.0-3-Linux-s390x.sh#7ef72ef1411b028788c81308238b604cba46315cb42e70a2d65511c05440ebca" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_23.5.0-3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.0-3-Linux-x86_64.sh#b7fc320922235ccbaacba7b5a61e34671e75f3a2c7110c63db0c6a9f98ecf8a8" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_23.5.0-3-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.0-3-MacOSX-arm64.sh#d006d99f86850510f9aed1a81e16a4213a4829e7ea6913f0c42054b4b0ac05a7" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_23.5.0-3-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.0-3-MacOSX-x86_64.sh#86ae780b5c5a32c45bc0f2e146941afea6dd1ca48e8d5e1bf99a83df255a0a78" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-23.5.1-0 b/plugins/python-build/share/python-build/miniconda3-3.9-23.5.1-0 new file mode 100644 index 0000000..382bdc8 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-23.5.1-0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_23.5.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.1-0-Linux-aarch64.sh#ac438ca1a76d78622cc7768d94988e5673983f60f0302941ce05ea4e11e1376e" "miniconda" verify_py39 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py39_23.5.1-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.1-0-Linux-ppc64le.sh#a981947722decf258e4a21f06ab5ddd545c709ba959957121a3e3b89b3dd860a" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_23.5.1-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.1-0-Linux-s390x.sh#b3ea1e4ce80901b70b49d14bc4a008d910410ddd58dead9c4c220834f5aa46c2" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_23.5.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.1-0-Linux-x86_64.sh#960b7aa0294d6d828739ad5542fe1d8b81bb602be401ad00febdf9d29bf37514" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_23.5.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.1-0-MacOSX-arm64.sh#63aaa53c1f6139d667f8e308a2849632efeb575e6223d075ab8a8c15850478d6" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_23.5.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.1-0-MacOSX-x86_64.sh#056b43eb844aac487e5f6e0f748c528a34cd3d38c8409f239a75bf89ffede3b9" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-23.5.2-0 b/plugins/python-build/share/python-build/miniconda3-3.9-23.5.2-0 new file mode 100644 index 0000000..a3fd290 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-23.5.2-0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_23.5.2-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.2-0-Linux-aarch64.sh#ecc06a39bdf786ebb8325a2754690a808f873154719c97d10087ef0883b69e84" "miniconda" verify_py39 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py39_23.5.2-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.2-0-Linux-ppc64le.sh#dc5aee01ee36a154b8070e6948b9a43773b6942476a144bc89e6135ac5beac58" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_23.5.2-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.2-0-Linux-s390x.sh#40ece8784a9e7dd521ab354ffc816bb466842ae3eee681a93647945c5070c9b4" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_23.5.2-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.2-0-Linux-x86_64.sh#9829d95f639bd0053b2ed06d1204e60644617bf37dd5cc57523732e0e8d64516" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_23.5.2-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.2-0-MacOSX-arm64.sh#1b10164086354b39a46ff928eef5797ff57e0fa9706ccaf7d4e621b416541479" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_23.5.2-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.5.2-0-MacOSX-x86_64.sh#dcbbdf92dc2954c79002b64ed53d3451e191dbdde0b30c67334f41dc6ca46ac1" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-23.9.0-0 b/plugins/python-build/share/python-build/miniconda3-3.9-23.9.0-0 new file mode 100644 index 0000000..c2b8ca4 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-23.9.0-0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_23.9.0-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.9.0-0-Linux-aarch64.sh#b3ae7a36e3adbe9f9ab152b645d8d20b09bd25b4f0a9be15bfb4d36aafdedd98" "miniconda" verify_py39 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py39_23.9.0-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.9.0-0-Linux-ppc64le.sh#f7699ab404cbcba918e1977cc54ee8573902835d3272e3d80b5a107f8c5b5b38" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_23.9.0-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.9.0-0-Linux-s390x.sh#eab9add06fe3b0beb9b54b3ab3fc57b944dc370a3c9342216082f7747d6c74a7" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_23.9.0-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.9.0-0-Linux-x86_64.sh#9200a10c762186391c35709382ed7cfa6578a051c9c76ea58f998df62c5afab0" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_23.9.0-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.9.0-0-MacOSX-arm64.sh#3143f830fdff011a3d389fdb53b8021e90b662615a1ed62a0bcad099cef35c26" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_23.9.0-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.9.0-0-MacOSX-x86_64.sh#763c08ad5bdf159d32e406bd3b03394e1fba6923f1936271ca27c8073f744ac2" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-24.1.2-0 b/plugins/python-build/share/python-build/miniconda3-3.9-24.1.2-0 new file mode 100644 index 0000000..3e03e03 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-24.1.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_24.1.2-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.1.2-0-Linux-aarch64.sh#b3e7d8ad4a4c9106594b268ab1cd9494ce982eaf7734bb2cd13a47e14e92a43e" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_24.1.2-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.1.2-0-Linux-s390x.sh#c1e5b7cee62b465a919b88a9c5658c426c6633f1fbcb568d2cff36a13aef6b97" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_24.1.2-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.1.2-0-Linux-x86_64.sh#b978856ec3c826eb495b60e3fffe621f670c101150ebcbdeede4f961f22dc438" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_24.1.2-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.1.2-0-MacOSX-arm64.sh#2a7e44373bdf47caae991ff8d7d275a2ded51ed0e8e457c7edc9ecd45e48cda4" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_24.1.2-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.1.2-0-MacOSX-x86_64.sh#d4e81df5beaa73dbbb9e1e91065e8f8222e9a9d44a2e7271aedd6e4a5054c541" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-24.11.1-0 b/plugins/python-build/share/python-build/miniconda3-3.9-24.11.1-0 new file mode 100644 index 0000000..2214c1f --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-24.11.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_24.11.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.11.1-0-Linux-aarch64.sh#35411dc715549d0a95f4814c4f318a3d0addfafc3a25fa7e89e2ba47e8d87b4d" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_24.11.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.11.1-0-Linux-s390x.sh#c130a7064c5c513c42280ec41a5f8c93aaab522ecd6bd0f2138c8c9f78d4f522" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_24.11.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.11.1-0-Linux-x86_64.sh#3ea8373098d72140e08aac9217822b047ec094eb457e7f73945af7c6f68bf6f5" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_24.11.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.11.1-0-MacOSX-arm64.sh#a8a07c4255882de2f132ed2d4cfaa3bdf89370de71ba8cd3914e013f5bffcc68" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_24.11.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.11.1-0-MacOSX-x86_64.sh#5ca59fa5a4835587ba6ea73169a7e55862771cf9b0618d0549b7b484fe1a2e67" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-24.3.0-0 b/plugins/python-build/share/python-build/miniconda3-3.9-24.3.0-0 new file mode 100644 index 0000000..8e28547 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-24.3.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_24.3.0-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.3.0-0-Linux-aarch64.sh#860f532a33501cf0eccc2677048e21db4a12151938d181821af3e5d30e2dc390" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_24.3.0-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.3.0-0-Linux-s390x.sh#1570e27adba2dcc24b182c21cd4e793ab5719aa5b1f7f8e29c16ec74d6d9a16f" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_24.3.0-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.3.0-0-Linux-x86_64.sh#1c3d44e987dc56c7d8954419fa1a078be5ddbc293d8cb98b184a23f9a270faad" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_24.3.0-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.3.0-0-MacOSX-arm64.sh#f091e4e2d7c2521d40c8c2e561c344a401cf9900e4efa122bf1c93fd6ae5cc9c" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_24.3.0-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.3.0-0-MacOSX-x86_64.sh#ed7cfddd313f3ec568f95abae38b337ebf339cddd378ee2f91c86e5da53374e5" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-24.4.0-0 b/plugins/python-build/share/python-build/miniconda3-3.9-24.4.0-0 new file mode 100644 index 0000000..7b60311 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-24.4.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_24.4.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.4.0-0-Linux-aarch64.sh#6f09fd08165a9fdccb2a2c64e9bbcf68ce58a9bfb571600306eb44d29718b13f" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_24.4.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.4.0-0-Linux-s390x.sh#8766e30b038087e7da2bb9a8bca4ca3f2ed621659f0ea8954ffab789f4a8f192" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_24.4.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.4.0-0-Linux-x86_64.sh#edd7610f2e2b25d15f6ffa81ca94de0748dd107096871459a7966dcf9a564ea9" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_24.4.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.4.0-0-MacOSX-arm64.sh#74f3de552d93712cc7c531f690b78d6acad8e3812da43fc3a1acbc5c39243480" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_24.4.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.4.0-0-MacOSX-x86_64.sh#d3ad5e0bf74aa1cb838df2f73e4be4e5d9a0f259a05b5223199ea1f6f6edf9f3" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-24.5.0-0 b/plugins/python-build/share/python-build/miniconda3-3.9-24.5.0-0 new file mode 100644 index 0000000..827ad86 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-24.5.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_24.5.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.5.0-0-Linux-aarch64.sh#b716e3bc556e9ab7a4f206b04b53bd57c24e94956598d89fc78863b115cce9e8" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_24.5.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.5.0-0-Linux-s390x.sh#c2d6bec964a96130eb5f1c4ea46993cf10f7957d45ac31d9aa94c34b5ebfed32" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_24.5.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.5.0-0-Linux-x86_64.sh#07a2435123fd8f41e6528baa5f272ce754fd8acaef08ce7081afb00227b8754a" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_24.5.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.5.0-0-MacOSX-arm64.sh#f5f63a0de44b7b0872f3c00dca71b896933ccc844a93bf120aad6df66b6475b3" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_24.5.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.5.0-0-MacOSX-x86_64.sh#b65d7f01820bdfe1abb6b4dd84d48e6c62a6d72ee0cc400a4e8bb4ea89ff1c84" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-24.7.1-0 b/plugins/python-build/share/python-build/miniconda3-3.9-24.7.1-0 new file mode 100644 index 0000000..ddffbad --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-24.7.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_24.7.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.7.1-0-Linux-aarch64.sh#dc6d508f463b19def014d34b61297df30cc15eeac9cf47eb372634812b6721e6" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_24.7.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.7.1-0-Linux-s390x.sh#31553ed04ff777deefbb76bb194a2212ccf1168f2757f36794a567f58bb94ae1" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_24.7.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.7.1-0-Linux-x86_64.sh#2006a61abc8b4fd04de5eb92620e1f72bada713cc84b5b4899463095e1210556" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_24.7.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.7.1-0-MacOSX-arm64.sh#f50fceaf2d42c898559adae1ee17c22c452824a909370fdec8d4fcf844696f06" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_24.7.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.7.1-0-MacOSX-x86_64.sh#f5035c0595f791a822fbf3bf5b555e8e68fe33437affa3811b125ebd39efbe81" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-24.9.2-0 b/plugins/python-build/share/python-build/miniconda3-3.9-24.9.2-0 new file mode 100644 index 0000000..907a1c1 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-24.9.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_24.9.2-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.9.2-0-Linux-aarch64.sh#4607ec9145ad9c0413e6300dab3febe442e265efce486176ef1f8518ba8bfaeb" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_24.9.2-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.9.2-0-Linux-s390x.sh#5ccde79ed4c333f0e236f36338ed5db111a2fff50859235c4f8fffd2045a6655" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_24.9.2-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.9.2-0-Linux-x86_64.sh#4b540d78e5bdd770b39216c0563424ef6656504cbe24c67b2d0454c2eb7afe93" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_24.9.2-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.9.2-0-MacOSX-arm64.sh#4d5abecbb3264def02ad95ed6c888016f95631649b848da552a1066c52bcd1da" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_24.9.2-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.9.2-0-MacOSX-x86_64.sh#7535da558c8821d967e026288eaec75d9a159ec760d75c869fd10fa58d3986c3" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-0 b/plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-0 new file mode 100644 index 0000000..d8499f8 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-0 @@ -0,0 +1,26 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_25.1.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-0-Linux-aarch64.sh#6813ed27242f8c6a000fcdc0b2bb93253411a22ef110eec915b7d1a4aab3587b" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_25.1.1-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-0-Linux-s390x.sh#8220e1e67cc73a51d90108f5bdf5451aefae0b00d400958ae7d42e21d9a32999" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_25.1.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-0-Linux-x86_64.sh#13a5870ab5b5c75f23a54eac2ba8dbff38bd4bd33d52aecbc6154ca0ff488e10" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_25.1.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-0-MacOSX-arm64.sh#6d60e9a8e0f531e09791f033529a6142ceb39ec7d23f8fc8231d287e39cdb30d" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_25.1.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-0-MacOSX-x86_64.sh#3752cbfae31526e53cae1b2976e183787fc98782c63bbd048853ed8860616051" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-1 b/plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-1 new file mode 100644 index 0000000..4176313 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-1 @@ -0,0 +1,26 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_25.1.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-1-Linux-aarch64.sh#ae55c260fd250154627f74d0ede010c99c20741698d7d687b2dfca0aa14ce2d5" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_25.1.1-1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-1-Linux-s390x.sh#6957a17c17e86fe43ba3c2e18dcfc1415710410c4a36f7a1c46fbc64aab4fb27" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_25.1.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-1-Linux-x86_64.sh#c5ec876718798ccd6ce93ce38eb3253ef103244ea6efaa8c978df19047ba916a" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_25.1.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-1-MacOSX-arm64.sh#d717fb09b137a048d9b2f6ee9d3e7ef63ab841e35d80cb37f40d20ac949915c2" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_25.1.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-1-MacOSX-x86_64.sh#a01dd65f2463bdec15abc1f796847912c67caaf78ea1c67f038ec02aa8c3adaf" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-2 b/plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-2 new file mode 100644 index 0000000..2dee6f7 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-2 @@ -0,0 +1,26 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_25.1.1-2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-2-Linux-aarch64.sh#5afee04df06c923462341cfc87727100a67fa854550d0d7a2e6295005168e6b7" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_25.1.1-2-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-2-Linux-s390x.sh#94a10a8a43dfd0360ecad9df24ef768db1b776d1a76fc2df1928d76c0bbb5535" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_25.1.1-2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-2-Linux-x86_64.sh#b40682cedf1e1755c02555f8d3d98aadb4607a68da7caf72a9bbe1fb9ae0b904" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_25.1.1-2-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-2-MacOSX-arm64.sh#b50b4c46b481d3c9cb4befdbcf18087748d85eee9148c56a35f199940d607933" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_25.1.1-2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-2-MacOSX-x86_64.sh#92109afe5edcc06d3a3c61b0faf1edd3e3e2539eaad637d2711305ccd0065046" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-25.3.1-1 b/plugins/python-build/share/python-build/miniconda3-3.9-25.3.1-1 new file mode 100644 index 0000000..dc9cecb --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-25.3.1-1 @@ -0,0 +1,23 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_25.3.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.3.1-1-Linux-aarch64.sh#435f9b5640716dd770e9abe404c54db7d3493cb61a814c5de1fe345ea017d4a6" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_25.3.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.3.1-1-Linux-x86_64.sh#2d94390e8858c72f6a28080954fd640ae4449d08d7b9d4ff8c94ad39beaf5f46" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_25.3.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.3.1-1-MacOSX-arm64.sh#5838abb6f108de3f42aaaf3c3bb0747879b4202f70332e7ffb81dc3fa6b518a4" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_25.3.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.3.1-1-MacOSX-x86_64.sh#51e293033a02582295e5795b7ec440ac322251a46894c20bca65dd15399bd447" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-25.5.1-0 b/plugins/python-build/share/python-build/miniconda3-3.9-25.5.1-0 new file mode 100644 index 0000000..fb76040 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-25.5.1-0 @@ -0,0 +1,23 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_25.5.1-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.5.1-0-Linux-aarch64.sh#e4311fcce812cce6a914e7a82fb1180d278eaa705e40be6789795781d375fe53" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_25.5.1-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.5.1-0-Linux-x86_64.sh#eac177f8c3bf584c1816aded4a0e2d9201253a4305cd0cbc8c1d4adbe6bde96d" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_25.5.1-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.5.1-0-MacOSX-arm64.sh#562d7f0632a9f6ee636c6457b45daa200ca44890d920f6d671dfa44c6150b052" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_25.5.1-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.5.1-0-MacOSX-x86_64.sh#47b52b6c817c5cb41877e24f78d34add775065f8815e5205a9c3d7dada3306c7" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-25.5.1-1 b/plugins/python-build/share/python-build/miniconda3-3.9-25.5.1-1 new file mode 100644 index 0000000..7ebea2f --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-25.5.1-1 @@ -0,0 +1,23 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_25.5.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.5.1-1-Linux-aarch64.sh#a1078a803928d8f8f1fd29a2bdad6689f19239844ee3beb84372f66f00cbfb19" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_25.5.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.5.1-1-Linux-x86_64.sh#33778762cb69381ce01de7f60bf4350935d3b31169e541fc9fbffbab5712670a" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_25.5.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.5.1-1-MacOSX-arm64.sh#8c6968889bbebb3df94ce441775c1e7cfecae2fefb3955b09ac3b7b619bf7208" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_25.5.1-1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.5.1-1-MacOSX-x86_64.sh#83884da278a084d5d1923613af229aa4c384eebe197b48cb996a4c862d850e7f" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-25.7.0-2 b/plugins/python-build/share/python-build/miniconda3-3.9-25.7.0-2 new file mode 100644 index 0000000..582a42d --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-25.7.0-2 @@ -0,0 +1,23 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_25.7.0-2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.7.0-2-Linux-aarch64.sh#18befc78dbfca5bbdc2c8085f2bedd0345a5fbf7d0f1e189fddaf2d17f31d3af" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_25.7.0-2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.7.0-2-Linux-x86_64.sh#790e8ea347cf49ba250fceacdc0b022237a9150717b9e4c17f2e70abc075c05d" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_25.7.0-2-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.7.0-2-MacOSX-arm64.sh#914254c199cf3584ac918259dda70410d6deba2a6f73b0ec8728010e6afb75b0" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_25.7.0-2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.7.0-2-MacOSX-x86_64.sh#dab8685fca4398bc7471cc4fd3fb1afe7ee3b43767bba28d788f9aa9961a702d" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-25.9.1-1 b/plugins/python-build/share/python-build/miniconda3-3.9-25.9.1-1 new file mode 100644 index 0000000..d06e0b5 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-25.9.1-1 @@ -0,0 +1,20 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_25.9.1-1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.9.1-1-Linux-aarch64.sh#983ef280dec1d0f965b6b6133c585ce902e07136105d4977aa5de3aa027cfa55" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_25.9.1-1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.9.1-1-Linux-x86_64.sh#d8d13344b46a057659397b9ca1a948d184bf59f04efa8864df8c01f7557e2baa" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_25.9.1-1-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.9.1-1-MacOSX-arm64.sh#857f09c2be8feaf3664064a2e324e96656104a9a45ab0a657a49c03754855b77" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-25.9.1-3 b/plugins/python-build/share/python-build/miniconda3-3.9-25.9.1-3 new file mode 100644 index 0000000..37aa2e9 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-25.9.1-3 @@ -0,0 +1,20 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_25.9.1-3-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.9.1-3-Linux-aarch64.sh#2cf395401906b6968cfd2bc5b522ad4dca40374987e790c4daa83f049d132841" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_25.9.1-3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.9.1-3-Linux-x86_64.sh#0ac18f10d17ca918247b4606df82be38eba6e23380a7eddb25b47ef6ccdb920e" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_25.9.1-3-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.9.1-3-MacOSX-arm64.sh#f05dcd060e3915a0a3a9dece324d2eb88268fa251fff2fb63d48e232c5fab510" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-4.10.1 b/plugins/python-build/share/python-build/miniconda3-3.9-4.10.1 new file mode 100644 index 0000000..b5249b4 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-4.10.1 @@ -0,0 +1,16 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_4.10.1-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.10.1-Linux-aarch64.sh#67fb85a56aa7fda6e2fc5cdeb2aafec0" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_4.10.1-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.10.1-Linux-s390x.sh#089da98e758bbc4a0e784d75340ec5d0" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-4.10.3 b/plugins/python-build/share/python-build/miniconda3-3.9-4.10.3 new file mode 100644 index 0000000..9f0ae7f --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-4.10.3 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_4.10.3-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.10.3-Linux-aarch64.sh#d4e7afa2783cd85532d59d7ccb9ec268" "miniconda" verify_py39 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py39_4.10.3-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.10.3-Linux-ppc64le.sh#07ea41c691bdcc7d9c71cae1a1a88151" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_4.10.3-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.10.3-Linux-s390x.sh#633ae4c5382ca883f1f38a7d8c472f85" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_4.10.3-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.10.3-Linux-x86_64.sh#8c69f65a4ae27fb41df0fe552b4a8a3b" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_4.10.3-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.10.3-MacOSX-x86_64.sh#09bb30a9204ced74ce3c06762cb442fc" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-4.11.0 b/plugins/python-build/share/python-build/miniconda3-3.9-4.11.0 new file mode 100644 index 0000000..f542389 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-4.11.0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_4.11.0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.11.0-Linux-aarch64.sh#f25b8ff2dbebe0285360ef1b4c883da6" "miniconda" verify_py39 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py39_4.11.0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.11.0-Linux-ppc64le.sh#305e55110a3ad9384230e5fe396ccd89" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_4.11.0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.11.0-Linux-s390x.sh#26e904d1f42bf8cece2b99a698c10a46" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_4.11.0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.11.0-Linux-x86_64.sh#4e2f31e0b2598634c80daa12e4981647" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_4.11.0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.11.0-MacOSX-arm64.sh#c19959eafcb84a26e00af5d9f55826eb" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_4.11.0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.11.0-MacOSX-x86_64.sh#d1303e5c7510b2ef444b9ba474551733" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-4.12.0 b/plugins/python-build/share/python-build/miniconda3-3.9-4.12.0 new file mode 100644 index 0000000..ad0b6fa --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-4.12.0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_4.12.0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.12.0-Linux-aarch64.sh#9baf936183f3479c97bff16fe62fb56c" "miniconda" verify_py39 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py39_4.12.0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.12.0-Linux-ppc64le.sh#2244290b6c899106901bbefad21aa49d" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_4.12.0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.12.0-Linux-s390x.sh#f8d3b0ad1cf6a3a7175cd76d7e121820" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_4.12.0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.12.0-Linux-x86_64.sh#7843dd7d0a2c53b0df37ca8189672992" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_4.12.0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.12.0-MacOSX-arm64.sh#f7448cfeb278f2a84ed903db02d5525c" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_4.12.0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.12.0-MacOSX-x86_64.sh#143b9bb03b6e4865be4ebbf40b108772" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-4.9.2 b/plugins/python-build/share/python-build/miniconda3-3.9-4.9.2 new file mode 100644 index 0000000..c083ba8 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-4.9.2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_4.9.2-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.9.2-Linux-aarch64.sh#af1c16d821569ebf1bdaf549fcba7d27" "miniconda" verify_py39 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py39_4.9.2-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.9.2-Linux-ppc64le.sh#73b8d60454389905b1d209f1b0c211d9" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_4.9.2-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.9.2-Linux-s390x.sh#ae66aa46e565c97bf3485275b370c7e5" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_4.9.2-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.9.2-Linux-x86_64.sh#b4e46fcc8029e2cfa731b788f25b1d36" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_4.9.2-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_4.9.2-MacOSX-x86_64.sh#0658832393a50f5a578bcad825304886" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9.1 b/plugins/python-build/share/python-build/miniconda3-3.9.1 new file mode 100644 index 0000000..55779b4 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9.1 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda3-3.9.1-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-3.9.1-Linux-x86.sh#1a9f8abfc63080c2d764039335a24465388533cca86472224c994ed8d32c4d48" "miniconda" verify_py34 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-3.9.1-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.9.1-Linux-x86_64.sh#6c6b44acdd0bc4229377ee10d52c8ac6160c336d9cdd669db7371aa9344e1ac3" "miniconda" verify_py34 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-3.9.1-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-3.9.1-MacOSX-x86_64.sh#e32523e3fdf0addab008e816c54eb6ae6eb6d62b1122d1e0dc4f4313a97b0591" "miniconda" verify_py34 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-4.0.5 b/plugins/python-build/share/python-build/miniconda3-4.0.5 new file mode 100644 index 0000000..8dfaaff --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-4.0.5 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda3-4.0.5-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-4.0.5-Linux-x86.sh#3c06b31b0f70d21f4f62021b8db98929faa3a99ebe6b5b1a2999576d16c30e35" "miniconda" verify_py35 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-4.0.5-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.0.5-Linux-x86_64.sh#a7bcd0425d8b6688753946b59681572f63c2241aed77bf0ec6de4c5edc5ceeac" "miniconda" verify_py35 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-4.0.5-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.0.5-MacOSX-x86_64.sh#5673d23ed00515dbb7d236bc0db239c875db54ba1cd0976d907d0552dc58928f" "miniconda" verify_py35 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-4.1.11 b/plugins/python-build/share/python-build/miniconda3-4.1.11 new file mode 100644 index 0000000..92e9fd2 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-4.1.11 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda3-4.1.11-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-4.1.11-Linux-x86.sh#4e89584027016060ce4e1dc40b8cb9e1c2dfd0d9f99335fca48d419ec90753c5" "miniconda" verify_py35 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-4.1.11-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.1.11-Linux-x86_64.sh#efd6a9362fc6b4085f599a881d20e57de628da8c1a898c08ec82874f3bad41bf" "miniconda" verify_py35 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-4.1.11-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.1.11-MacOSX-x86_64.sh#c4e3ba528721278f74e68ef070493a27d920ba10432dd2c2d563774799eda79c" "miniconda" verify_py35 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-4.2.12 b/plugins/python-build/share/python-build/miniconda3-4.2.12 new file mode 100644 index 0000000..535fc5f --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-4.2.12 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda3-4.2.12-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-4.2.12-Linux-x86.sh#64dae61d366ada1d5c6baf345a466c95b68eb6df574ee454fc234a7a99943702" "miniconda" verify_py35 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-4.2.12-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.2.12-Linux-x86_64.sh#c59b3dd3cad550ac7596e0d599b91e75d88826db132e4146030ef471bb434e9a" "miniconda" verify_py35 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-4.2.12-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.2.12-MacOSX-x86_64.sh#da15fd52352dcefc944a32cd54c8ec3cfc68cfbbadcb86dbea72fe681c7a7a70" "miniconda" verify_py35 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-4.3.11 b/plugins/python-build/share/python-build/miniconda3-4.3.11 new file mode 100644 index 0000000..e3f5385 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-4.3.11 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda3-4.3.11-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-4.3.11-Linux-x86.sh#ebda072999dd24bbede7cf3d99fb781187aa9148f71826edadbac0a55ce278cb" "miniconda" verify_py36 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-4.3.11-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.3.11-Linux-x86_64.sh#b9fe70ce7b6fa8df05abfb56995959b897d0365299f5046063bc236843474fb8" "miniconda" verify_py36 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-4.3.11-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.3.11-MacOSX-x86_64.sh#81f127e36249064d0f87b5d5dfa4d6094c6d5998f36a7bc80cb5028b4e32b7a2" "miniconda" verify_py36 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-4.3.14 b/plugins/python-build/share/python-build/miniconda3-4.3.14 new file mode 100644 index 0000000..fb8a829 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-4.3.14 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda3-4.3.14-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-4.3.14-Linux-x86.sh#4e3bf0348537770b2768de1e013ebccf2b4d66ce6e7a2942b254a53d3486c394" "miniconda" verify_py36 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-4.3.14-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.3.14-Linux-x86_64.sh#902f31a46b4a05477a9862485be5f84af761a444f8813345ff8dad8f6d3bccb2" "miniconda" verify_py36 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-4.3.14-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.3.14-MacOSX-x86_64.sh#fa5bf41893336138e262ada14ae7a67824df62c6c87351bb250bde203c253d67" "miniconda" verify_py36 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-4.3.21 b/plugins/python-build/share/python-build/miniconda3-4.3.21 new file mode 100644 index 0000000..e92aab7 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-4.3.21 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda3-4.3.21-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-4.3.21-Linux-x86.sh#f6a3190b1ada3f7d7a0eb8080cc927216d6c910f2adb5ffdc21817cb71a4fe68" "miniconda" verify_py35 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-4.3.21-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.3.21-Linux-x86_64.sh#e9089c735b4ae53cb1035b1a97cec9febe6decf76868383292af589218304a90" "miniconda" verify_py35 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-4.3.21-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.3.21-MacOSX-x86_64.sh#0f12382bbcd89c4141b0ace621813876723b569daa270b77d9c61323d2d5a881" "miniconda" verify_py35 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-4.3.27 b/plugins/python-build/share/python-build/miniconda3-4.3.27 new file mode 100644 index 0000000..43bc174 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-4.3.27 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda3-4.3.27.1-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-4.3.27.1-Linux-x86.sh#15fb3364174544d16f452f50eedc32a8a90e27d2fccddff7313654259322105b" "miniconda" verify_py36 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-4.3.27.1-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.3.27.1-Linux-x86_64.sh#640f505f06f87d75bebc629e4a677ebb185ea9a34eb6d7c199db0753ffc42f62" "miniconda" verify_py36 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-4.3.27-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.3.27-MacOSX-x86_64.sh#768651bc018eba0e698659dae94fc858b21081334c483c80a069883820208f18" "miniconda" verify_py36 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-4.3.30 b/plugins/python-build/share/python-build/miniconda3-4.3.30 new file mode 100644 index 0000000..ef3f59e --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-4.3.30 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda3-4.3.30-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-4.3.30-Linux-x86.sh#5d0c59c3d93b56dea90af1be96a9f36aa7f35605d9f821e8b86c1aa31d3b4e4b" "miniconda" verify_py36 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-4.3.30-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.3.30-Linux-x86_64.sh#66c822dfe76636b4cc2ae5604816e0e723aa01620f50087f06410ecf5bfdf38c" "miniconda" verify_py36 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-4.3.30.1-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-4.3.30.1-MacOSX-x86_64.sh#43d05d914139e6249498fe24cf97390a16eb95b56fc05b7f39470ff8b176d1af" "miniconda" verify_py36 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-4.3.31 b/plugins/python-build/share/python-build/miniconda3-4.3.31 new file mode 100644 index 0000000..668a506 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-4.3.31 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda3-4.3.31-Linux-x86" "https://repo.anaconda.com/miniconda/Miniconda3-4.3.31-Linux-x86.sh#df2f9770d83df8269f3f43f1e60285e6" "miniconda" verify_py36 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-4.3.31-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.3.31-Linux-x86_64.sh#7fe70b214bee1143e3e3f0467b71453c" "miniconda" verify_py36 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-4.3.31-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.3.31-MacOSX-x86_64.sh#03c2dedc466886459e968157c63197f3" "miniconda" verify_py36 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-4.4.10 b/plugins/python-build/share/python-build/miniconda3-4.4.10 new file mode 100644 index 0000000..4ee15c8 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-4.4.10 @@ -0,0 +1,22 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniconda3-4.4.10-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-4.4.10-Linux-ppc64le.sh#57ca0b05eb96868b83aa69e4567b86ae" "miniconda" verify_py36 + ;; +"Linux-x86" ) + install_script "Miniconda3-4.4.10-Linux-x86" "https://repo.anaconda.com/miniconda/Miniconda3-4.4.10-Linux-x86.sh#e770b4e45ac596c35f6393db988c5c33" "miniconda" verify_py36 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-4.4.10-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.4.10-Linux-x86_64.sh#bec6203dbb2f53011e974e9bf4d46e93" "miniconda" verify_py36 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-4.4.10-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.4.10-MacOSX-x86_64.sh#268ec716435aa19212901510f00815fd" "miniconda" verify_py36 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-4.5.1 b/plugins/python-build/share/python-build/miniconda3-4.5.1 new file mode 100644 index 0000000..f25f331 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-4.5.1 @@ -0,0 +1,22 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniconda3-4.5.1-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.1-Linux-ppc64le.sh#454e3b786937eeaa50fb7bee991ac19e" "miniconda" verify_py36 + ;; +"Linux-x86" ) + install_script "Miniconda3-4.5.1-Linux-x86" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.1-Linux-x86.sh#5d6627bfad03b87f1ad4173ebbeb933d" "miniconda" verify_py36 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-4.5.1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.1-Linux-x86_64.sh#0c28787e3126238df24c5d4858bd0744" "miniconda" verify_py36 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-4.5.1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.1-MacOSX-x86_64.sh#ac87d2074bd50103468b8681084236f6" "miniconda" verify_py36 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-4.5.11 b/plugins/python-build/share/python-build/miniconda3-4.5.11 new file mode 100644 index 0000000..307ac4b --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-4.5.11 @@ -0,0 +1,22 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniconda3-4.5.11-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.11-Linux-ppc64le.sh#4b1ac3b4b70bfa710c9f1c5c6d3f3166" "miniconda" verify_py36 + ;; +"Linux-x86" ) + install_script "Miniconda3-4.5.11-Linux-x86" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.11-Linux-x86.sh#d8c3ea1bd25cf02c4ea92df4d31ef652" "miniconda" verify_py36 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-4.5.11-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.11-Linux-x86_64.sh#e1045ee415162f944b6aebfe560b8fee" "miniconda" verify_py36 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-4.5.11-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.11-MacOSX-x86_64.sh#7f7613bf98023f7d6ffe5df53c3a00a0" "miniconda" verify_py36 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-4.5.12 b/plugins/python-build/share/python-build/miniconda3-4.5.12 new file mode 100644 index 0000000..72530e9 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-4.5.12 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda3-4.5.12-Linux-x86" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.12-Linux-x86.sh#38f586a269ac74f5f10195867c4f96ae" "miniconda" verify_py36 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-4.5.12-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.12-Linux-x86_64.sh#866ae9dff53ad0874e1d1a60b1ad1ef8" "miniconda" verify_py36 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-4.5.12-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.12-MacOSX-x86_64.sh#a583d1e174e1dc960e87fb4b026a9370" "miniconda" verify_py36 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-4.5.4 b/plugins/python-build/share/python-build/miniconda3-4.5.4 new file mode 100644 index 0000000..11a0d2e --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-4.5.4 @@ -0,0 +1,22 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniconda3-4.5.4-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.4-Linux-ppc64le.sh#05c1e073f262105179cf57920dfc4d43" "miniconda" verify_py36 + ;; +"Linux-x86" ) + install_script "Miniconda3-4.5.4-Linux-x86" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.4-Linux-x86.sh#0fcc79d640d82b7d36ea39654a82dd9d" "miniconda" verify_py36 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-4.5.4-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.4-Linux-x86_64.sh#a946ea1d0c4a642ddf0c3a26a18bb16d" "miniconda" verify_py36 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-4.5.4-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.5.4-MacOSX-x86_64.sh#164ec263c4070db642ce31bb45d68813" "miniconda" verify_py36 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-4.6.14 b/plugins/python-build/share/python-build/miniconda3-4.6.14 new file mode 100644 index 0000000..61838da --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-4.6.14 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniconda3-4.6.14-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-4.6.14-Linux-ppc64le.sh#6d3bd64dfc436f38755cde1a3ad40799" "miniconda" verify_py36 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-4.6.14-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.6.14-Linux-x86_64.sh#718259965f234088d785cad1fbd7de03" "miniconda" verify_py36 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-4.6.14-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.6.14-MacOSX-x86_64.sh#ffa5f0eead5576fb26b7e6902f5eed09" "miniconda" verify_py36 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-4.7.10 b/plugins/python-build/share/python-build/miniconda3-4.7.10 new file mode 100644 index 0000000..a0200b0 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-4.7.10 @@ -0,0 +1,19 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniconda3-4.7.10-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-4.7.10-Linux-ppc64le.sh#f406a65d6362b33b22520186555c8d88" "miniconda" verify_py37 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-4.7.10-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.7.10-Linux-x86_64.sh#1c945f2b3335c7b2b15130b1b2dc5cf4" "miniconda" verify_py37 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-4.7.10-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.7.10-MacOSX-x86_64.sh#9cc5819a400a3fd5c7363792483fef1e" "miniconda" verify_py37 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-4.7.12 b/plugins/python-build/share/python-build/miniconda3-4.7.12 new file mode 100644 index 0000000..d16e4aa --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-4.7.12 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniconda3-4.7.12-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-4.7.12-Linux-ppc64le.sh#bd5c2331edcbe87391465e6acf2d3f10" "miniconda" verify_py37 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-4.7.12-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.7.12-Linux-x86_64.sh#0dba759b8ecfc8948f626fa18785e3d8" "miniconda" verify_py37 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-4.7.12-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.7.12-MacOSX-x86_64.sh#677f38d5ab7e1ce4fef134068e3bd76a" "miniconda" verify_py37 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-4.7.12.1-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-4.7.12.1-Linux-ppc64le.sh#9de38932ed6a8865562e6057b578694f" "miniconda" verify_py37 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-4.7.12.1-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.7.12.1-Linux-x86_64.sh#81c773ff87af5cfac79ab862942ab6b3" "miniconda" verify_py37 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-4.7.12.1-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-4.7.12.1-MacOSX-x86_64.sh#621daddf9de519014c6c38e8923583b8" "miniconda" verify_py37 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-latest b/plugins/python-build/share/python-build/miniconda3-latest new file mode 100644 index 0000000..fc331a9 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-latest @@ -0,0 +1,26 @@ +export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-x86" ) + install_script "Miniconda3-latest-Linux-x86" "https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86.sh" "miniconda" verify_py3_latest + ;; +"Linux-x86_64" ) + install_script "Miniconda3-latest-Linux-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh" "miniconda" verify_py3_latest + ;; +"Linux-aarch64" ) + install_script "Miniconda3-latest-Linux-aarch64" "https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-aarch64.sh" "miniconda" verify_py3_latest + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-latest-MacOSX-x86_64" "https://repo.continuum.io/miniconda/Miniconda3-latest-MacOSX-x86_64.sh" "miniconda" verify_py3_latest + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-latest-MacOSX-arm64" "https://repo.continuum.io/miniconda/Miniconda3-latest-MacOSX-arm64.sh" "miniconda" verify_py3_latest + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda3-latest is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge-pypy3 b/plugins/python-build/share/python-build/miniforge-pypy3 new file mode 100644 index 0000000..ca7708c --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge-pypy3 @@ -0,0 +1,23 @@ + +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniforge-pypy3-Linux-ppc64le" "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge-pypy3-Linux-ppc64le.sh" "miniconda" verify_py3_latest + ;; +"Linux-x86_64" ) + install_script "Miniforge-pypy3-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge-pypy3-Linux-x86_64.sh" "miniconda" verify_py3_latest + ;; +"Linux-aarch64" ) + install_script "Miniforge-pypy3-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge-pypy3-Linux-aarch64.sh" "miniconda" verify_py3_latest + ;; +"MacOSX-x86_64" ) + install_script "Miniforge-pypy3-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge-pypy3-MacOSX-x86_64.sh" "miniconda" verify_py3_latest + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge with PyPy3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-22.11.1-3 b/plugins/python-build/share/python-build/miniforge3-22.11.1-3 new file mode 100644 index 0000000..4d6a363 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-22.11.1-3 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-22.11.1-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Miniforge3-22.11.1-3-Linux-aarch64.sh#6ee6fbbaaf900f090e9786b093ad829f0d3e6224d8c50ee37d5fc2c1317b2521" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-22.11.1-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Miniforge3-22.11.1-3-Linux-ppc64le.sh#bfccb07a65500c7ed2a7eb363c720caf69dc6baaa36ef52b1224df270c215c2c" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-22.11.1-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Miniforge3-22.11.1-3-Linux-x86_64.sh#b96991615834e66a34f3653f12597b5938425bb00a0ce47dc493ea03ecf6f339" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-22.11.1-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Miniforge3-22.11.1-3-MacOSX-arm64.sh#f416cc5ceb8420d12d078254f161f7c59fd41ca4dfcd86ce6a67c9c34069a15e" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-22.11.1-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Miniforge3-22.11.1-3-MacOSX-x86_64.sh#9e590b6635d97a81fcb8b5366384317db544629b290f34423f3710a6917d2d58" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-22.11.1-4 b/plugins/python-build/share/python-build/miniforge3-22.11.1-4 new file mode 100644 index 0000000..f87097a --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-22.11.1-4 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-22.11.1-4-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Miniforge3-22.11.1-4-Linux-aarch64.sh#2beb7624679016dcd4758ffb9b18efe4ba79af95e2357a606a4945f8ee64dbe6" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-22.11.1-4-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Miniforge3-22.11.1-4-Linux-ppc64le.sh#d689249d97e170d4dedd54291eb6680243ef83b39900ecb1d6df0679c70434d4" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-22.11.1-4-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Miniforge3-22.11.1-4-Linux-x86_64.sh#737d1b2666528416706a916b355c43ff58deeaebf5ca906bc1a551e96c73ab8e" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-22.11.1-4-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Miniforge3-22.11.1-4-MacOSX-arm64.sh#7be6b8b25eb328d6df048a7b533514097a6d30ff348d0f28671059c98c4c31aa" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-22.11.1-4-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Miniforge3-22.11.1-4-MacOSX-x86_64.sh#d3bd39dc391552a037a95230786c026165c042499fa365aae0da4002d9530731" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-22.9.0-0 b/plugins/python-build/share/python-build/miniforge3-22.9.0-0 new file mode 100644 index 0000000..71878c4 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-22.9.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-22.9.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-0/Miniforge3-22.9.0-0-Linux-aarch64.sh#e3d8d8a2ca641a70f3aee492fff22f67ced642bded34a260827a1fa82437a999" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-22.9.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-0/Miniforge3-22.9.0-0-Linux-ppc64le.sh#7db5858e7de6d730b92c3a6d1138f21ada88396876fa9fec65115d15e2f922e2" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-22.9.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-0/Miniforge3-22.9.0-0-Linux-x86_64.sh#24b704203a4cdabd99362f52a9836c55219579814eb904188675e077b488be38" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-22.9.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-0/Miniforge3-22.9.0-0-MacOSX-arm64.sh#e9eb55f8409e5f227c5ecc5f5d0024e4d81148454a763b95b612447a1585cc2c" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-22.9.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-0/Miniforge3-22.9.0-0-MacOSX-x86_64.sh#c6e4fc3e9dca2375e91a3bc2f27c01634bb1841ab4d284a3a83b4181ae79b16d" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-22.9.0-1 b/plugins/python-build/share/python-build/miniforge3-22.9.0-1 new file mode 100644 index 0000000..604b206 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-22.9.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-22.9.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-1/Miniforge3-22.9.0-1-Linux-aarch64.sh#786777d47b27f490701ecb42c61b245bd945c34bc9ce8d7e90f4b87f430297a1" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-22.9.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-1/Miniforge3-22.9.0-1-Linux-ppc64le.sh#f51ea2fe47b2481a42e67747573690e13cac796c6f18ba1af1d198850c35c23a" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-22.9.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-1/Miniforge3-22.9.0-1-Linux-x86_64.sh#47f4b8ef9c5e2ba28eb3c17d27c4d0709f59ea3ab78d7d87c2d34e0c7ad439d5" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-22.9.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-1/Miniforge3-22.9.0-1-MacOSX-arm64.sh#8631692804809f14ac9da0c2d277bcede715854da6b1a3fa81822ba961dc546b" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-22.9.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-1/Miniforge3-22.9.0-1-MacOSX-x86_64.sh#0b56334b4ed62076fbf6973fd3ced9d41190b73ab27432c8db224ca42e614207" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-22.9.0-2 b/plugins/python-build/share/python-build/miniforge3-22.9.0-2 new file mode 100644 index 0000000..96e85dc --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-22.9.0-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-22.9.0-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-2/Miniforge3-22.9.0-2-Linux-aarch64.sh#3d75758c4d98181946b29d391323209752c5a111530738b5e36eba77e8e026aa" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-22.9.0-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-2/Miniforge3-22.9.0-2-Linux-ppc64le.sh#e84ffc9f018d5b23601106f299fefd25a75afb6fdd3416037ce4b561781156fc" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-22.9.0-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-2/Miniforge3-22.9.0-2-Linux-x86_64.sh#180aefcbcf8a9f24123adb9e64e16c9bb16bc3f129bd79a5912ff44f295cc405" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-22.9.0-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-2/Miniforge3-22.9.0-2-MacOSX-arm64.sh#6ac610dabf9a64574ec83b158b2eb6023bc3de0de9a0c528d4fa876df2a27d13" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-22.9.0-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-2/Miniforge3-22.9.0-2-MacOSX-x86_64.sh#d7f50abd340f63515b2059ed462548f5d395e2f9d7847a98c5428998504f5bff" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-22.9.0-3 b/plugins/python-build/share/python-build/miniforge3-22.9.0-3 new file mode 100644 index 0000000..289238b --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-22.9.0-3 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-22.9.0-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-3/Miniforge3-22.9.0-3-Linux-aarch64.sh#3862fd31ed24d9254cecd8b080dc741b556a6e371b4615880173a782c7cf3b27" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-22.9.0-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-3/Miniforge3-22.9.0-3-Linux-ppc64le.sh#914e0ae86d5ce473379841041e52c7891aa65e46be7892c2258cb439a83dd301" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-22.9.0-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-3/Miniforge3-22.9.0-3-Linux-x86_64.sh#0df76d7a8e66c4f96478ff71b90b7a8df04c19474f3d36dd77ace53e75aa47e4" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-22.9.0-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-3/Miniforge3-22.9.0-3-MacOSX-arm64.sh#c3065cbfaef72966599fc658a2724f5109b0315f7b9ffc6078fd061b084942f4" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-22.9.0-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.9.0-3/Miniforge3-22.9.0-3-MacOSX-x86_64.sh#45a1314dad30baececc43b4ecef839a17e43860a6a9c77e87ab1d4297796fa9d" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-23.1.0-0 b/plugins/python-build/share/python-build/miniforge3-23.1.0-0 new file mode 100644 index 0000000..a67b877 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-23.1.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-23.1.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Miniforge3-23.1.0-0-Linux-aarch64.sh#4972174d7bc88c636f50257fd2dc718abfd648b227dacbde4c8db716d05bb08b" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-23.1.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Miniforge3-23.1.0-0-Linux-ppc64le.sh#21ccc195bdee24caf9eef5e8fdd250d3fba9147a68e1cd114c2375cb03ba6043" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-23.1.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Miniforge3-23.1.0-0-Linux-x86_64.sh#9bbcc29e8e43151bd4634fbe086e3d7914aba3963ac6b1e8d59c530435bd33d9" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-23.1.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Miniforge3-23.1.0-0-MacOSX-arm64.sh#0aece610f84e023d062e1c88bfc6033dd60101ec9b79819f87fc1b009263989b" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-23.1.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Miniforge3-23.1.0-0-MacOSX-x86_64.sh#a9665fec3c8c1abd572666d4c49d512b3c27082324a1713ca2fde6efb8ce7856" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-23.1.0-1 b/plugins/python-build/share/python-build/miniforge3-23.1.0-1 new file mode 100644 index 0000000..83a0638 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-23.1.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-23.1.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Miniforge3-23.1.0-1-Linux-aarch64.sh#9083f5aa0a125bfbc1a8e8d5eb57812a2761b884e0806a75ebc3c95be894791e" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-23.1.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Miniforge3-23.1.0-1-Linux-ppc64le.sh#6b9d4af128f6378ec688ce412fb1a4fe8ce298df9d05bb7092637c8047faeb26" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-23.1.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Miniforge3-23.1.0-1-Linux-x86_64.sh#7a5859e873ed36fc9a141fff0ac60e133b971b3413aed49a4c82693d4f4a2ad2" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-23.1.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Miniforge3-23.1.0-1-MacOSX-arm64.sh#147ee54acc6ebd5148d712945fed29c4e01a247528f28fd958615f63bfc75687" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-23.1.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Miniforge3-23.1.0-1-MacOSX-x86_64.sh#7c737a78918164c5a07a6489b8429f9788aadb58536434c0d34316e7686dc424" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-23.1.0-2 b/plugins/python-build/share/python-build/miniforge3-23.1.0-2 new file mode 100644 index 0000000..538280f --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-23.1.0-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-23.1.0-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Miniforge3-23.1.0-2-Linux-aarch64.sh#ca662b0c5620cc4f70afe75a674b212a424bb16da103251d07afe8cfa268983c" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-23.1.0-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Miniforge3-23.1.0-2-Linux-ppc64le.sh#34e7db7d071b15abb07603108d5a74c4878aa25be30005163ed9bdbafe8ecf79" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-23.1.0-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Miniforge3-23.1.0-2-Linux-x86_64.sh#ee75d00832ef4aeb1ae04ac62ffb1dc917409696cfbe50f5f93125ab9b165278" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-23.1.0-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Miniforge3-23.1.0-2-MacOSX-arm64.sh#05891e572dedd62c128c51ed7cdcceba191155779f5ea1abdf0e57e3fba8a982" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-23.1.0-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Miniforge3-23.1.0-2-MacOSX-x86_64.sh#1d837379b50b57bf009b6a6956a7cff10dc25ca52a940a35b7090f2e9b6c5482" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-23.1.0-3 b/plugins/python-build/share/python-build/miniforge3-23.1.0-3 new file mode 100644 index 0000000..dcfb05a --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-23.1.0-3 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-23.1.0-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Miniforge3-23.1.0-3-Linux-aarch64.sh#2e180aa558ff38481ec5147b7f06060c3c8cfbd12894abe31b5f75fc23f7d09a" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-23.1.0-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Miniforge3-23.1.0-3-Linux-ppc64le.sh#00722f3dd257143816d94d8fc97a3c43ccc3046e31956240d14c210268ccc64e" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-23.1.0-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Miniforge3-23.1.0-3-Linux-x86_64.sh#d4e4750ac95508512c52ff33fa71834e7839e8c51224694a544aecdd655ce29c" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-23.1.0-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Miniforge3-23.1.0-3-MacOSX-arm64.sh#85f4f38d3502871c09d94ab2fd43fe221284eb33c361c486c2b420a726328a7e" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-23.1.0-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Miniforge3-23.1.0-3-MacOSX-x86_64.sh#846df715e78ef3b875d1cbf17ed124e261f5ece2dd0e2556310cf4dfbc1238f6" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-23.1.0-4 b/plugins/python-build/share/python-build/miniforge3-23.1.0-4 new file mode 100644 index 0000000..0aa8686 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-23.1.0-4 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-23.1.0-4-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Miniforge3-23.1.0-4-Linux-aarch64.sh#bf6a4b9d3e0195b9c64b58f0e28738edc259a214f362edbc23884e82ad59cb8c" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-23.1.0-4-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Miniforge3-23.1.0-4-Linux-ppc64le.sh#0e49480e6a3429d9578bdbdc154d623375273b3e8c205353c1cc9d6e0cce1f59" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-23.1.0-4-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Miniforge3-23.1.0-4-Linux-x86_64.sh#35c531207d2a8d212215bdb7f998c926f24bc8686e1cf46a693a3ea375613a7f" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-23.1.0-4-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Miniforge3-23.1.0-4-MacOSX-arm64.sh#de48052b85900a3878cedbb25add7e17b14d5bdfba8ba523791851a10a6b84fe" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-23.1.0-4-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Miniforge3-23.1.0-4-MacOSX-x86_64.sh#a43f4e34aa27b5cb849027b01b03931df52f768fc8b82b1f72f40ff064abb6f3" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-23.10.0-0 b/plugins/python-build/share/python-build/miniforge3-23.10.0-0 new file mode 100644 index 0000000..ef4624c --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-23.10.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-23.10.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Miniforge3-23.10.0-0-Linux-aarch64.sh#3760323416d2ce48ca8445386a8c12b453a92f111614dd1870f0ea684d6d32a8" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-23.10.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Miniforge3-23.10.0-0-Linux-ppc64le.sh#d1a5287138cc4bcc70dad3d1dcf770d8ec13f93c82aeea481bb727860b0f4b5c" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-23.10.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Miniforge3-23.10.0-0-Linux-x86_64.sh#da66ba24d5ffdf4c339ec8923de9e207f682f2027f9f382103080dea4407ef33" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-23.10.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Miniforge3-23.10.0-0-MacOSX-arm64.sh#057b6ba35d5872b33b6342183546bd0d5e838460bb019a2fe4db2208eb042135" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-23.10.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Miniforge3-23.10.0-0-MacOSX-x86_64.sh#a1785d943daba4f23dac64fc389b4e5929aee6d20eb8ba245671887249238df9" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-23.11.0-0 b/plugins/python-build/share/python-build/miniforge3-23.11.0-0 new file mode 100644 index 0000000..3873f0f --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-23.11.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-23.11.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Miniforge3-23.11.0-0-Linux-aarch64.sh#775968746d062a14bd84db3ae72f18f60f4acf229bd840625805e87668486bf4" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-23.11.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Miniforge3-23.11.0-0-Linux-ppc64le.sh#a77f1293dbc2a70c5b58f495f70dfc143f3455ca9da9edbc1afa66157c1c722a" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-23.11.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Miniforge3-23.11.0-0-Linux-x86_64.sh#73576b96409ed38a7ca596bece058e8c77c6ef3eab42af7cfdf2ae975e8f3928" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-23.11.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Miniforge3-23.11.0-0-MacOSX-arm64.sh#9382007611d4ad7201976a33cd65aaf2b3de582285b76c894d8c71eac544bfe1" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-23.11.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Miniforge3-23.11.0-0-MacOSX-x86_64.sh#6e586a93cc8c6d21deb543d46740806795eae4ff16a76bc5f8a57673e3044c73" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-23.3.0-0 b/plugins/python-build/share/python-build/miniforge3-23.3.0-0 new file mode 100644 index 0000000..58204c9 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-23.3.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-23.3.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Miniforge3-23.3.0-0-Linux-aarch64.sh#ca3ccf3006d7923b91157c434c4a9ba58b99812a00cf48aa83f2835ea3f7d167" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-23.3.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Miniforge3-23.3.0-0-Linux-ppc64le.sh#4b12965a0c0746110480c61440ba836022db72cdfed69616de3dfa66ba7c92df" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-23.3.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Miniforge3-23.3.0-0-Linux-x86_64.sh#17484f59cbe983abb953cc33e7a4c0ee0b33153de61d5465bb1aaf176e43d038" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-23.3.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Miniforge3-23.3.0-0-MacOSX-arm64.sh#37ca7c33fefcfb45deef58eaa690970c7392a87f01a076f932dd7f3f684888d7" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-23.3.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Miniforge3-23.3.0-0-MacOSX-x86_64.sh#32f797ba073ae153bd1fd36a556833c0082c3cd44ac25f13fc5228258aadf7a5" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-23.3.1-0 b/plugins/python-build/share/python-build/miniforge3-23.3.1-0 new file mode 100644 index 0000000..941d15e --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-23.3.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-23.3.1-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Miniforge3-23.3.1-0-Linux-aarch64.sh#b71277b8b40a6817d923fde0b858f56a4504f4e9b659d343dd8eae9d9473ab7f" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-23.3.1-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Miniforge3-23.3.1-0-Linux-ppc64le.sh#434b461d309110bfeb72198541a541985aa197e3b605de27978c15f31d1520ef" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-23.3.1-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Miniforge3-23.3.1-0-Linux-x86_64.sh#9be723d231609919fa3e3bb06f899a9a9c22e92e570bada8129a1bf50fee8d73" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-23.3.1-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Miniforge3-23.3.1-0-MacOSX-arm64.sh#32632039d6f457e56589591bd893f62cba85e31379ec8b663f8b06f35b0860e7" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-23.3.1-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Miniforge3-23.3.1-0-MacOSX-x86_64.sh#e9447f308499d99821c48293fe258bb47595f238140cd9c834f57321d3839cd0" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-23.3.1-1 b/plugins/python-build/share/python-build/miniforge3-23.3.1-1 new file mode 100644 index 0000000..aac3c7c --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-23.3.1-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-23.3.1-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Miniforge3-23.3.1-1-Linux-aarch64.sh#dc5d94b83251621f088bd82df896ea45e63597293ece7ccd923b2346aed34b89" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-23.3.1-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Miniforge3-23.3.1-1-Linux-ppc64le.sh#2eafa28fee5f1dfffb01feaca70de000f8e8335e1f659603ef0b9a40b9d1f213" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-23.3.1-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Miniforge3-23.3.1-1-Linux-x86_64.sh#b3e14bd70f99bc8959445fad3532128a6af36c5e77bc62226db0e80d1df0e9e9" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-23.3.1-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Miniforge3-23.3.1-1-MacOSX-arm64.sh#51d15ed1471ef8633f99574dc0c43fc972ce1981ebf08eade4d9b249bb7640e4" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-23.3.1-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Miniforge3-23.3.1-1-MacOSX-x86_64.sh#d8eef4816b28f1bfc099d8fc2cdac4fb0ebbe1ddd27f4acb66d83d66c260cb63" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.1.2-0 b/plugins/python-build/share/python-build/miniforge3-24.1.2-0 new file mode 100644 index 0000000..30594ac --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.1.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.1.2-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Miniforge3-24.1.2-0-Linux-aarch64.sh#f881e2fa24aa898c25fac3250ccb213e8b892fdd95851f000dce93c419e8f89a" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.1.2-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Miniforge3-24.1.2-0-Linux-ppc64le.sh#858b9acbcca1e3f67298a56095f547f2c540d79e1020918cf0d8d6a8af407542" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.1.2-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Miniforge3-24.1.2-0-Linux-x86_64.sh#dbadb808edf4da00af35d888d3eeebbfdce71972b60bf4b16dbacaee2ab57f28" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.1.2-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Miniforge3-24.1.2-0-MacOSX-arm64.sh#b372d2189e5752e92a4b4bbc4a91b8a08a4f0612d39c0762111c8dd60914b1c7" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.1.2-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Miniforge3-24.1.2-0-MacOSX-x86_64.sh#e447e7e0173e94ea8725a4c6675c29bcd3082f8fff7948b47e05af72b12d1261" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.11.0-0 b/plugins/python-build/share/python-build/miniforge3-24.11.0-0 new file mode 100644 index 0000000..fe4c137 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.11.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.11.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Miniforge3-24.11.0-0-Linux-aarch64.sh#47cfd3caf3a0a6f56ebbfc7da775306fe076b8e49b14d3fd88b5463ab324c185" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.11.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Miniforge3-24.11.0-0-Linux-ppc64le.sh#877e3992041e36f49ce16681e5b24e23617ad044d1a077cf21b5cce90896e244" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.11.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Miniforge3-24.11.0-0-Linux-x86_64.sh#5fa69e4294be07229a94a1c1e8073fbf63894c757c2136f98c87b48f9d458793" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.11.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Miniforge3-24.11.0-0-MacOSX-arm64.sh#3c7c115de0ed6103b7d2e5c1fe969c2c9fd3aec4a454c1d5aa9b5721414413e0" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.11.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Miniforge3-24.11.0-0-MacOSX-x86_64.sh#1f0527ec14784de0766d8405a674868e51afb869ea16c915fb2672256209ecfd" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.11.0-1 b/plugins/python-build/share/python-build/miniforge3-24.11.0-1 new file mode 100644 index 0000000..89dfd50 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.11.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.11.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Miniforge3-24.11.0-1-Linux-aarch64.sh#21e5af2d961a19535e1ba8d67d8ce46c522b6e616dea826c6987ff4db8499b73" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.11.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Miniforge3-24.11.0-1-Linux-ppc64le.sh#20847d0978fbf301da2f9d66ae47dc9da8c080cc1e3f70acb2264e3b6ff99ceb" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.11.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Miniforge3-24.11.0-1-Linux-x86_64.sh#936836bb2dd546a7ab5999bed2a2d1ce8416c5359e28199df8b384529a85dcac" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.11.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Miniforge3-24.11.0-1-MacOSX-arm64.sh#6c2ff0b7cf1b6300a3dc6125da8e78407d3ffd3a7359742957fcca0cd7cd7604" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.11.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Miniforge3-24.11.0-1-MacOSX-x86_64.sh#5f42fb48c528b2f60a659d0cc19adb74a4098d8a1519ac7fe0724273eae050c5" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.11.2-0 b/plugins/python-build/share/python-build/miniforge3-24.11.2-0 new file mode 100644 index 0000000..4f2acc0 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.11.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.11.2-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-0/Miniforge3-24.11.2-0-Linux-aarch64.sh#4f182710a6394f81eda2a6f8578c63d4b52842ad8a9c6b54c7a4cf43513cf118" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.11.2-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-0/Miniforge3-24.11.2-0-Linux-ppc64le.sh#6fb5e999d256eeb79c0ce793145966b995b22ff1001ec0fd662be2ba4a4fb538" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.11.2-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-0/Miniforge3-24.11.2-0-Linux-x86_64.sh#e6ac45dc94bbc93a31802ed8b74f41b653a132e9f5d4d6b028ae00c5a9c563ba" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.11.2-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-0/Miniforge3-24.11.2-0-MacOSX-arm64.sh#f62f38d92e4ae015d82d1aa4aad392747f4e1a61d75deece3a68bdaf472e3ca7" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.11.2-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-0/Miniforge3-24.11.2-0-MacOSX-x86_64.sh#9dd0058e927986bc53d0685f6ac995267f7d8edbd178b4a47692bf08bfd7b11c" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.11.2-1 b/plugins/python-build/share/python-build/miniforge3-24.11.2-1 new file mode 100644 index 0000000..a355820 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.11.2-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.11.2-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-1/Miniforge3-24.11.2-1-Linux-aarch64.sh#ef4e191fc6843f343d51b31310d36eacbc1de2899ea233190ff63188ffe30894" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.11.2-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-1/Miniforge3-24.11.2-1-Linux-ppc64le.sh#ddda150ca836abaa03e718945687614f9b8fd9694dffd7f3d73d416ba2027e0d" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.11.2-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-1/Miniforge3-24.11.2-1-Linux-x86_64.sh#c79c7326a846d6df9ec824e19ccc99454d8f5009e37888df301b23eef11280ca" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.11.2-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-1/Miniforge3-24.11.2-1-MacOSX-arm64.sh#8bde418e8f5030b887535940cad3b531adf128a38b99e58ba6a26e68e9d5ad06" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.11.2-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-1/Miniforge3-24.11.2-1-MacOSX-x86_64.sh#50a00997a0f08737d076e93f964dffcb51bc4792fd9371344fd244ab97bcf61c" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.11.3-0 b/plugins/python-build/share/python-build/miniforge3-24.11.3-0 new file mode 100644 index 0000000..e312c88 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.11.3-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.11.3-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-0/Miniforge3-24.11.3-0-Linux-aarch64.sh#d3f2b771857009ec804faeeef191352186194cb5737a831e55c6347a5f47cb8f" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.11.3-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-0/Miniforge3-24.11.3-0-Linux-ppc64le.sh#8f8a2eadc773e4c9a3d4587a08b24646e0b2374e0ea0ac538a499303c2527fd2" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.11.3-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-0/Miniforge3-24.11.3-0-Linux-x86_64.sh#2e1ad2188fe69fcdd522c2b20c08c800a5c7411b775eca768318b1540ed32e53" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.11.3-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-0/Miniforge3-24.11.3-0-MacOSX-arm64.sh#dbead9822b1932ecc1b3238311a843400462b38e302bbd067ef373aa39dedd4f" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.11.3-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-0/Miniforge3-24.11.3-0-MacOSX-x86_64.sh#1f8e16f2f8e7538c2ef1d08cbb8f2feadc75907e31dbcde75a10ca788fc03abb" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.11.3-1 b/plugins/python-build/share/python-build/miniforge3-24.11.3-1 new file mode 100644 index 0000000..f81d46e --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.11.3-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.11.3-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-1/Miniforge3-24.11.3-1-Linux-aarch64.sh#64ee999aaa1e81968345382569780dae499bdc680751b1b408e2030c51397d49" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.11.3-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-1/Miniforge3-24.11.3-1-Linux-ppc64le.sh#db36c2024ca0b7216a91faebb20de11bca3d8baa4e3c8b253a65e3d9149f6e72" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.11.3-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-1/Miniforge3-24.11.3-1-Linux-x86_64.sh#2163c5c29661ae2850c00a9d03af82db795b822d391ae68a5f8cce62a7483a54" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.11.3-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-1/Miniforge3-24.11.3-1-MacOSX-arm64.sh#a2c3cfe749325634b2c29103f7c65a160e9c0ddc6b3c35528b0921ba3f6e9a91" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.11.3-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-1/Miniforge3-24.11.3-1-MacOSX-x86_64.sh#304bb96966caeb96e7ccd1859bf81f6abf15de667c144bf3600cbeaf3491033c" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.11.3-2 b/plugins/python-build/share/python-build/miniforge3-24.11.3-2 new file mode 100644 index 0000000..541db6a --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.11.3-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.11.3-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-2/Miniforge3-24.11.3-2-Linux-aarch64.sh#d61942220d28e2103ad6303de808fec52d2e276fa698e2ae5d8ab865e194c504" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.11.3-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-2/Miniforge3-24.11.3-2-Linux-ppc64le.sh#7e312337a1a34c88802ff300a50ff785c6db85a8e518ee1cdc0d58085e0ad08e" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.11.3-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-2/Miniforge3-24.11.3-2-Linux-x86_64.sh#65af53dad30b3fcbd1cb1d4ad62fd3a86221464754844544558aae3a28795189" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.11.3-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-2/Miniforge3-24.11.3-2-MacOSX-arm64.sh#a20f9dd033fcdb26329abab726bfddf22de44bf1d37030bb212cf52120b26618" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.11.3-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-2/Miniforge3-24.11.3-2-MacOSX-x86_64.sh#164f9891ca2338d9c748d1d007d081d1206ae255264df201493204b93b8ba484" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.3.0-0 b/plugins/python-build/share/python-build/miniforge3-24.3.0-0 new file mode 100644 index 0000000..981e85d --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.3.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.3.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Miniforge3-24.3.0-0-Linux-aarch64.sh#6c879fe354d3e26b8d960cff6b1f3cb9d2e58c79c5c07f23fff62469dc5c1480" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.3.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Miniforge3-24.3.0-0-Linux-ppc64le.sh#b7710f5dbab9a49995e027cc72cc729ad54506fbba7b936b56737d1437aa6504" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.3.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Miniforge3-24.3.0-0-Linux-x86_64.sh#23367676b610de826f50f7ddc91139a816d4b59bd4c69cc9b6082d9b2e7fe8a3" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.3.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Miniforge3-24.3.0-0-MacOSX-arm64.sh#9b3c3d9fa30437592e680390f2b27d45c5d5cfcbfad9a1af233f70a6d8be71a1" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.3.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Miniforge3-24.3.0-0-MacOSX-x86_64.sh#26a80621b146d60e5ae0d896b83ec138416653b951286361b1f93a804cb6a8d9" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.5.0-0 b/plugins/python-build/share/python-build/miniforge3-24.5.0-0 new file mode 100644 index 0000000..7056c6e --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.5.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.5.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Miniforge3-24.5.0-0-Linux-aarch64.sh#848f2d6917c473b1091e31a51241a7626d4dac4b90809a9b2ed937e0cea18d87" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.5.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Miniforge3-24.5.0-0-Linux-ppc64le.sh#1a947af7d68e8a06c2057c9a01ec03a5f7e26133fe42ad531f0a4b898b91dc86" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.5.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Miniforge3-24.5.0-0-Linux-x86_64.sh#a754b435830e1c038dada434873ad69a99970a4ea17a68d3bbcade0a37c8c8fb" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.5.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Miniforge3-24.5.0-0-MacOSX-arm64.sh#9c423bb8c9b80709f9682eac9d2a8f5cdecb54601fd4ec1ec6bb98349cf54a92" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.5.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Miniforge3-24.5.0-0-MacOSX-x86_64.sh#31ad3bbd4114021cdd1bf14a641bcf0f38b4dc71f0931be2720528c2555a587e" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.7.1-0 b/plugins/python-build/share/python-build/miniforge3-24.7.1-0 new file mode 100644 index 0000000..6bd8574 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.7.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.7.1-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Miniforge3-24.7.1-0-Linux-aarch64.sh#7a3372268b45679584043b4ba1e0318ee5027384a8d330f2d991b14d815d6a6d" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.7.1-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Miniforge3-24.7.1-0-Linux-ppc64le.sh#af1015e0531f4ff5e19001c476b720609609401d9cb80fc8a02c5e5d50e02ed5" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.7.1-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Miniforge3-24.7.1-0-Linux-x86_64.sh#b64f77042cf8eafd31ced64f9253a74fb85db63545fe167ba5756aea0e8125be" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.7.1-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Miniforge3-24.7.1-0-MacOSX-arm64.sh#2de2a2a31964be19ae157b5f93429cb50f8bf3983c580c8b14acefaf3d7e7c5b" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.7.1-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Miniforge3-24.7.1-0-MacOSX-x86_64.sh#03b73291d46199a40cb694a400010de9d737e6397d3eed676f28828fe2df5025" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.7.1-1 b/plugins/python-build/share/python-build/miniforge3-24.7.1-1 new file mode 100644 index 0000000..58f6294 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.7.1-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.7.1-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Miniforge3-24.7.1-1-Linux-aarch64.sh#9ed15a4d030928c6e537cb673538803ca5f07adb89957b9cfc24ebdc00ba4bf9" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.7.1-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Miniforge3-24.7.1-1-Linux-ppc64le.sh#9b05977d9fdadcc9cd9aeb9199a302139b9a77f708e39e83bfc0b1a1f4a7d4b8" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.7.1-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Miniforge3-24.7.1-1-Linux-x86_64.sh#6ae27b78c8cd5ce19987970dc734648ca0bf7ce7a7b3c0e41ab514cfe92add1d" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.7.1-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Miniforge3-24.7.1-1-MacOSX-arm64.sh#4effe540ea3abe9b2b5c1dad897f6186f343c4d6c8c234f8a5a4cb544ed14ec9" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.7.1-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Miniforge3-24.7.1-1-MacOSX-x86_64.sh#8c880fdb3cb80e1a2ebbfd82cc84b2ab7409aa515843423e8aaa77cd08149053" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.7.1-2 b/plugins/python-build/share/python-build/miniforge3-24.7.1-2 new file mode 100644 index 0000000..c3b4660 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.7.1-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.7.1-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Miniforge3-24.7.1-2-Linux-aarch64.sh#7bf60bce50f57af7ea4500b45eeb401d9350011ab34c9c45f736647d8dba9021" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.7.1-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Miniforge3-24.7.1-2-Linux-ppc64le.sh#bb5d14dac73b85da8fbe386cdd3c94022a468563a0c55e6b20a58d82b55a9737" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.7.1-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Miniforge3-24.7.1-2-Linux-x86_64.sh#636f7faca2d51ee42b4640ce160c751a46d57621ef4bf14378704c87c5db4fe3" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.7.1-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Miniforge3-24.7.1-2-MacOSX-arm64.sh#cafa7cc6d7baef6ea292880ae46c6c9d28bc1156394a418ceada30118d8b6b9a" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.7.1-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Miniforge3-24.7.1-2-MacOSX-x86_64.sh#ec6150160703ee622e6520863f68c5130473b69558aed822c4e369e90ef42aad" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.9.0-0 b/plugins/python-build/share/python-build/miniforge3-24.9.0-0 new file mode 100644 index 0000000..561e9af --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.9.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.9.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Miniforge3-24.9.0-0-Linux-aarch64.sh#7fae81c0df8545175a647e09b1372dcbf32a1b7fcc194d0d5ffc9a13be4e4269" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.9.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Miniforge3-24.9.0-0-Linux-ppc64le.sh#d442c75fd69359dd8ef444e3ba16a83d88ff437c92669661e2450b0d81575305" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.9.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Miniforge3-24.9.0-0-Linux-x86_64.sh#a75b489adb52effd81d15f0e700c0803992fe6a2357e8eb80685a529df7daa48" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.9.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Miniforge3-24.9.0-0-MacOSX-arm64.sh#ac903e9babc2067add5a6619a1e37bbd4ddb9177ba633ecfa63c8e68df6e1fca" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.9.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Miniforge3-24.9.0-0-MacOSX-x86_64.sh#0b32751fe373819f813490b640c7e83baecf208727fae34a7495d3127f983663" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.9.2-0 b/plugins/python-build/share/python-build/miniforge3-24.9.2-0 new file mode 100644 index 0000000..0fd2b7e --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.9.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.9.2-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Miniforge3-24.9.2-0-Linux-aarch64.sh#f33ec46c6c9dbcdc9d1101b04dcddff17f4ca54524a9575992e743bbc051d61c" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.9.2-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Miniforge3-24.9.2-0-Linux-ppc64le.sh#0b24b38611b486e3d1615aa778a6252430d54ae6e1210cd2874a3d8e8efd7abe" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.9.2-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Miniforge3-24.9.2-0-Linux-x86_64.sh#ca8c544254c40ae5192eb7db4e133ff4eb9f942a1fec737dba8205ac3f626322" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.9.2-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Miniforge3-24.9.2-0-MacOSX-arm64.sh#b2ee4415bce51895b74b99de6e83ac0f737fd968052b5b49f79e05b292220084" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.9.2-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Miniforge3-24.9.2-0-MacOSX-x86_64.sh#22b9eab7508d464c7d270883e733496beef25520d96c8383b4683f0122ae0222" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-25.1.1-0 b/plugins/python-build/share/python-build/miniforge3-25.1.1-0 new file mode 100644 index 0000000..a982bd3 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-25.1.1-0 @@ -0,0 +1,22 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-25.1.1-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-0/Miniforge3-25.1.1-0-Linux-aarch64.sh#4183d312c6a42edd5bc06be21e92b0d8b9afb720efc37df44f3e5002b35f9d2e" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-25.1.1-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-0/Miniforge3-25.1.1-0-Linux-x86_64.sh#a37495662f55746d92344b309b8b594d6b1a83d7acdd742adaca93ed2e10d32b" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-25.1.1-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-0/Miniforge3-25.1.1-0-MacOSX-arm64.sh#0f82fec65b7900cbffbda22a1d7a64c278569be241f6f2b87eded9a0f4c54008" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-25.1.1-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-0/Miniforge3-25.1.1-0-MacOSX-x86_64.sh#6b0e0e1901d121292edc52acc948d92a473218c1c4d621df9403805fc19f0dff" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-25.1.1-1 b/plugins/python-build/share/python-build/miniforge3-25.1.1-1 new file mode 100644 index 0000000..0424ed2 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-25.1.1-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-25.1.1-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-1/Miniforge3-25.1.1-1-Linux-aarch64.sh#2e9889a77e32b322ce4aef26e465ff44f6493de66243faae9528c1d57c2a91e9" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-25.1.1-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-1/Miniforge3-25.1.1-1-Linux-ppc64le.sh#2e47c220ff4c6f074c30ec977bb925861597e588c63dbb8df7c4aebf89c70c38" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-25.1.1-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-1/Miniforge3-25.1.1-1-Linux-x86_64.sh#73ccbf68c018df3f30bbe15cd69235b5994d8b32b62d50d9389be89736d0a08d" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-25.1.1-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-1/Miniforge3-25.1.1-1-MacOSX-arm64.sh#288dcf12f3c9a054ba004e4d7b38467653e0084949ded152145079047ae8f94e" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-25.1.1-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-1/Miniforge3-25.1.1-1-MacOSX-x86_64.sh#02500e29f3956211fcbfeda20756fd5d05c537ff5e6d0f530d9003729105fae2" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-25.1.1-2 b/plugins/python-build/share/python-build/miniforge3-25.1.1-2 new file mode 100644 index 0000000..30bf465 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-25.1.1-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-25.1.1-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-2/Miniforge3-25.1.1-2-Linux-aarch64.sh#99e5b987d6662ce956db33beab94b330a7024561b7f14e79f7ee413100f20927" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-25.1.1-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-2/Miniforge3-25.1.1-2-Linux-ppc64le.sh#47f8bdffef0bb72e31db2bf26764bb64956528f792db33e03e4c414fee69c629" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-25.1.1-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-2/Miniforge3-25.1.1-2-Linux-x86_64.sh#d1090d98cbae7ed8a9ae19a92cfba6fc47cdc48c8c9b679df78408dba6820eff" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-25.1.1-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-2/Miniforge3-25.1.1-2-MacOSX-arm64.sh#a85a688a7b5a536974b939e2b774c0e98b1f9417a81ab01d0ae4ff192d98e2ac" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-25.1.1-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-2/Miniforge3-25.1.1-2-MacOSX-x86_64.sh#172d0445149d85abd266e59d7d829106ab503cd6fba131819c9a1db9daa4e7ea" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-25.11.0-1 b/plugins/python-build/share/python-build/miniforge3-25.11.0-1 new file mode 100644 index 0000000..a539082 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-25.11.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-25.11.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.11.0-1/Miniforge3-25.11.0-1-Linux-aarch64.sh#43a3783f9e121088f1c92b131b4305b9ebf159424ad2543dfcfc0f1952b5e127" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-25.11.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/25.11.0-1/Miniforge3-25.11.0-1-Linux-ppc64le.sh#8fb7a41bd2682381c48c7820608918e7d56f5390bc3be5705a0c1c536f607963" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-25.11.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.11.0-1/Miniforge3-25.11.0-1-Linux-x86_64.sh#be1bad9d4e67a8753eb76fb4940e9a08036786675c7adf060627e55791bf110d" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-25.11.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.11.0-1/Miniforge3-25.11.0-1-MacOSX-arm64.sh#b4992687abec8c4863fc079382509f0e07e4221fb9e185d7f6a3860449b4e46d" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-25.11.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.11.0-1/Miniforge3-25.11.0-1-MacOSX-x86_64.sh#7b78e8d20557fcc946585290a6177dc3d2e7d1b07f382175aad24b6355b21832" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-25.3.0-1 b/plugins/python-build/share/python-build/miniforge3-25.3.0-1 new file mode 100644 index 0000000..8ad63ec --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-25.3.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-25.3.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-1/Miniforge3-25.3.0-1-Linux-aarch64.sh#e4459077f78a9a1fbaa0cd6812897623360ea8ba2e73094ed5df5b662cbb2491" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-25.3.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-1/Miniforge3-25.3.0-1-Linux-ppc64le.sh#a5f77d8d45b530b6e583b6a9bd5aa33ea70b5b77bd7c61728e12bf11a8137a5c" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-25.3.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-1/Miniforge3-25.3.0-1-Linux-x86_64.sh#defd7ea7e823257900d404dcf734762359e13bfff451f1bfc7cafa0f7c110247" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-25.3.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-1/Miniforge3-25.3.0-1-MacOSX-arm64.sh#141da48a332295b34cd9207efeb7a0dbc7711c2de26bfaf2b9c3b7ac3ce36e73" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-25.3.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-1/Miniforge3-25.3.0-1-MacOSX-x86_64.sh#18eac9db50d23d6e84767bd170092759430c03ae66a928b3adf48d5c60e1614c" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-25.3.0-2 b/plugins/python-build/share/python-build/miniforge3-25.3.0-2 new file mode 100644 index 0000000..44afc3f --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-25.3.0-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-25.3.0-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-2/Miniforge3-25.3.0-2-Linux-aarch64.sh#79a8d3a5f8d3681855545d7f623443e30079e4d26732956ff2f07632e8d2a9ef" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-25.3.0-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-2/Miniforge3-25.3.0-2-Linux-ppc64le.sh#1ebc02ff29e346c4dc987cf2df52af6e9e57958c82df62c8839dfbdbf2366222" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-25.3.0-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-2/Miniforge3-25.3.0-2-Linux-x86_64.sh#40cbe16854f3a346cdc5ce6a4bcbbe25973172fa8117a5e6168038173890054b" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-25.3.0-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-2/Miniforge3-25.3.0-2-MacOSX-arm64.sh#e658f618ef81473ae71f056b19a83224d147e6b54cd2c6477bc130345d9385b3" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-25.3.0-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-2/Miniforge3-25.3.0-2-MacOSX-x86_64.sh#86c557f5c2517c9ade892c671e41df5cf3f3b8bb13bc4738dc6bee928d08597d" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-25.3.0-3 b/plugins/python-build/share/python-build/miniforge3-25.3.0-3 new file mode 100644 index 0000000..f6035f9 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-25.3.0-3 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-25.3.0-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-3/Miniforge3-25.3.0-3-Linux-aarch64.sh#ac89f17b0eec4e98d38a53d1ae688e0f22c77d8ea5b5f008c2455e90ef095339" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-25.3.0-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-3/Miniforge3-25.3.0-3-Linux-ppc64le.sh#1ce4084983b899d2f895bd13085ba20ff787fbcc2f2c865c618bffc97dd877b8" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-25.3.0-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-3/Miniforge3-25.3.0-3-Linux-x86_64.sh#1b57f8cb991982063f79b56176881093abb1dc76d73fda32102afde60585b5a1" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-25.3.0-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-3/Miniforge3-25.3.0-3-MacOSX-arm64.sh#16205127ac2b5701881636229b7fe42e1f961007513b8673f8064da331e496a0" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-25.3.0-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.0-3/Miniforge3-25.3.0-3-MacOSX-x86_64.sh#c562e11d8f9caca3dcfb9ba6d5043b9238975d271751e12c3fbfc2a472b4b8fb" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-25.3.1-0 b/plugins/python-build/share/python-build/miniforge3-25.3.1-0 new file mode 100644 index 0000000..843a9cb --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-25.3.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-25.3.1-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.1-0/Miniforge3-25.3.1-0-Linux-aarch64.sh#a57c9e3d6c0c449c0283fd07e0bfa30d95eb8d547a14e8dc06c606405d01a7f0" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-25.3.1-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.1-0/Miniforge3-25.3.1-0-Linux-ppc64le.sh#87eb7d349a0ed3ba964c5263d90663e3dff93f252305b7bf24c12e714117bdfe" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-25.3.1-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.1-0/Miniforge3-25.3.1-0-Linux-x86_64.sh#376b160ed8130820db0ab0f3826ac1fc85923647f75c1b8231166e3d559ab768" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-25.3.1-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.1-0/Miniforge3-25.3.1-0-MacOSX-arm64.sh#d9eabd1868030589a1d74017b8723b01cf81b5fec1b9da8021b6fa44be7bbeae" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-25.3.1-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.3.1-0/Miniforge3-25.3.1-0-MacOSX-x86_64.sh#6c09a3550bb65bdb6d3db6f6c2b890b987b57189f3b71c67a5af49943d2522e8" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-25.9.1-0 b/plugins/python-build/share/python-build/miniforge3-25.9.1-0 new file mode 100644 index 0000000..9c59b23 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-25.9.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-25.9.1-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.9.1-0/Miniforge3-25.9.1-0-Linux-aarch64.sh#b2b223680807e8f407b67603f6a5a224452b7f0ce177bc6719f870040c3bfa98" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-25.9.1-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/25.9.1-0/Miniforge3-25.9.1-0-Linux-ppc64le.sh#89a6b1b761a94396921967939cfc0881efe08bda48fe9b40bbf4a134f8fcdd84" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-25.9.1-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.9.1-0/Miniforge3-25.9.1-0-Linux-x86_64.sh#07f64c1d908ae036e9f6a81f97704899311c0ae677d83980d664b9781d4cc5fc" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-25.9.1-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.9.1-0/Miniforge3-25.9.1-0-MacOSX-arm64.sh#414e21f6094fbf6cd69ad50c47d4630b5523e6b53fd6ff7df5fd9d0ee502eeff" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-25.9.1-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.9.1-0/Miniforge3-25.9.1-0-MacOSX-x86_64.sh#f12e25c92c9942219b6dd42d3cf0a2513d337b37d2954a8a84bee3d859632f41" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-26.1.0-0 b/plugins/python-build/share/python-build/miniforge3-26.1.0-0 new file mode 100644 index 0000000..3efa8c3 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-26.1.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-26.1.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.0-0/Miniforge3-26.1.0-0-Linux-aarch64.sh#8baf8844ecf13e1458f81659ea286251d04b2d5ed90040efb77f158adedb2d95" "miniconda" verify_py313 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-26.1.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.0-0/Miniforge3-26.1.0-0-Linux-ppc64le.sh#902190ad825b74b78a6a2816364453bb4d6989a599172aa3785d4afd0ebeb917" "miniconda" verify_py313 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-26.1.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.0-0/Miniforge3-26.1.0-0-Linux-x86_64.sh#127b5e14cfe6c83b787f624487cdc2168645ed82fdca1b0c1937caa086aed6d5" "miniconda" verify_py313 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-26.1.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.0-0/Miniforge3-26.1.0-0-MacOSX-arm64.sh#219b9e0d733fa2086d7d094a5ed830db146ccf22ae32c330b2da5df5c9604b78" "miniconda" verify_py313 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-26.1.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.0-0/Miniforge3-26.1.0-0-MacOSX-x86_64.sh#90a41a28ad0221fbaf728ca1267f6243638a56c579fba8a1b970edfee4062d53" "miniconda" verify_py313 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-26.1.1-2 b/plugins/python-build/share/python-build/miniforge3-26.1.1-2 new file mode 100644 index 0000000..dd2c64c --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-26.1.1-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-26.1.1-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.1-2/Miniforge3-26.1.1-2-Linux-aarch64.sh#6525bfb24940c5e063ed14f2d840968b0fc4152a3f4edd253b7a1049a15656e7" "miniconda" verify_py313 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-26.1.1-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.1-2/Miniforge3-26.1.1-2-Linux-ppc64le.sh#637cf03310343d199bcd7725aab54f59666fb1694bb99fc841973203da9c3f25" "miniconda" verify_py313 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-26.1.1-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.1-2/Miniforge3-26.1.1-2-Linux-x86_64.sh#831421c1f32d8b510e0ef7f261aaabdbf567bdbba37373432d492621b824ab1f" "miniconda" verify_py313 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-26.1.1-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.1-2/Miniforge3-26.1.1-2-MacOSX-arm64.sh#ed60de20689ab24dd646b9ec4b06762d35f8c0043026778699ba7c9f0816492c" "miniconda" verify_py313 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-26.1.1-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.1-2/Miniforge3-26.1.1-2-MacOSX-x86_64.sh#74f3e5cdb70bf0ff9bab3e4ba8d35aee5b46bf7eebca94202cbd8d46e16ecf77" "miniconda" verify_py313 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-26.1.1-3 b/plugins/python-build/share/python-build/miniforge3-26.1.1-3 new file mode 100644 index 0000000..262b99f --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-26.1.1-3 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-26.1.1-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.1-3/Miniforge3-26.1.1-3-Linux-aarch64.sh#83280e4ee71a5bd547d6b318f96e9ababe1054911ff6cc2b8801ce5493fe67e5" "miniconda" verify_py313 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-26.1.1-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.1-3/Miniforge3-26.1.1-3-Linux-ppc64le.sh#5711fd69219bc9746389ef751ee4c2549d40d9b1626a0ea93cc63db1a739eee6" "miniconda" verify_py313 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-26.1.1-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.1-3/Miniforge3-26.1.1-3-Linux-x86_64.sh#b25b828b702df4dd2a6d24d4eb56cfa912471dd8e3342cde2c3d86fe3dc2d870" "miniconda" verify_py313 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-26.1.1-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.1-3/Miniforge3-26.1.1-3-MacOSX-arm64.sh#38e73713bc504e11cf2a70f8bc01de4a778c547e9191e682606ba76fa4397fd9" "miniconda" verify_py313 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-26.1.1-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.1.1-3/Miniforge3-26.1.1-3-MacOSX-x86_64.sh#d81e77d8f3c104c64e0ab27256f901e58ac9965288ccec774db87bf1a98a03e7" "miniconda" verify_py313 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-26.3.2-0 b/plugins/python-build/share/python-build/miniforge3-26.3.2-0 new file mode 100644 index 0000000..730167f --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-26.3.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-26.3.2-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.3.2-0/Miniforge3-26.3.2-0-Linux-aarch64.sh#b8f0320c0fe9bc9dd24be8896ecf4995bbba4227c9822902daeeb7f3689ba7d3" "miniconda" verify_py313 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-26.3.2-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/26.3.2-0/Miniforge3-26.3.2-0-Linux-ppc64le.sh#ccfef271bf337a9278d53d57760e7231f678e5ba64c5b6c9a69cbff7669a527f" "miniconda" verify_py313 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-26.3.2-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.3.2-0/Miniforge3-26.3.2-0-Linux-x86_64.sh#1d9b75bdf29ba48d9f10bb155a685baab02d318d1d591d2495f97524579dccc1" "miniconda" verify_py313 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-26.3.2-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.3.2-0/Miniforge3-26.3.2-0-MacOSX-arm64.sh#a58d9e5a30cac3cd5ecdba2dc52dd042584a2f742a47e975779530f89e5768f5" "miniconda" verify_py313 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-26.3.2-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.3.2-0/Miniforge3-26.3.2-0-MacOSX-x86_64.sh#f19cc973899925b29141239880787e26cd524bcecd259c2fee72e0f561fc7b54" "miniconda" verify_py313 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-26.3.2-1 b/plugins/python-build/share/python-build/miniforge3-26.3.2-1 new file mode 100644 index 0000000..9a23f15 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-26.3.2-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-26.3.2-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.3.2-1/Miniforge3-26.3.2-1-Linux-aarch64.sh#22b8f855a3934c105a05a164d23f9a4c770dd127ec1ae26ad43114625585d9f2" "miniconda" verify_py313 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-26.3.2-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/26.3.2-1/Miniforge3-26.3.2-1-Linux-ppc64le.sh#d00248a68f2083bc1bea9c157191ba2f6be43756bf5b0d6021b70f1f9372843e" "miniconda" verify_py313 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-26.3.2-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.3.2-1/Miniforge3-26.3.2-1-Linux-x86_64.sh#0e80314f5f5088fb10bc06139ac6a097644ee009500e74b627192c93362b4502" "miniconda" verify_py313 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-26.3.2-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.3.2-1/Miniforge3-26.3.2-1-MacOSX-arm64.sh#031cc06de7287d1d69d6419bea0daf1a4a8bb8108711f859b1c351aa722d7281" "miniconda" verify_py313 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-26.3.2-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/26.3.2-1/Miniforge3-26.3.2-1-MacOSX-x86_64.sh#720022a19b363b55eadb27c807dfbba6607dc0cc7b312fb39574bdb616f5cc19" "miniconda" verify_py313 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.10 b/plugins/python-build/share/python-build/miniforge3-4.10 new file mode 100644 index 0000000..0d814b8 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.10 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniforge3-4.10.0-0-Linux-ppc64le" "https://github.com/conda-forge/miniforge/releases/download/4.10.0-0/Miniforge3-4.10.0-0-Linux-ppc64le.sh#cb72e16906f025bbc979b5e72b494722" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.10.0-0-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.0-0/Miniforge3-4.10.0-0-Linux-x86_64.sh#3db11e33e22a78e2d3371acc883625df" "miniconda" verify_py38 + ;; +"Linux-aarch64" ) + install_script "Miniforge3-4.10.0-0-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/download/4.10.0-0/Miniforge3-4.10.0-0-Linux-aarch64.sh#64ec2e626c1c71332a73081fe482d08e" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.10.0-0-MacOSX-arm64" "https://github.com/conda-forge/miniforge/releases/download/4.10.0-0/Miniforge3-4.10.0-0-MacOSX-arm64.sh#a44e4306922989e49a888c4dd2ad6263" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.10.0-0-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.0-0/Miniforge3-4.10.0-0-MacOSX-x86_64.sh#76a212a23d14e3f027d44fe6837e4a7d" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.10.1-1 b/plugins/python-build/share/python-build/miniforge3-4.10.1-1 new file mode 100644 index 0000000..396692b --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.10.1-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniforge3-4.10.1-1-Linux-ppc64le" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-1/Miniforge3-4.10.1-1-Linux-ppc64le.sh#37743c08b9394c6345d538f3952a1640" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.10.1-1-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-1/Miniforge3-4.10.1-1-Linux-x86_64.sh#e1f2f1f0fe54d3aab5585238e5517ac5" "miniconda" verify_py38 + ;; +"Linux-aarch64" ) + install_script "Miniforge3-4.10.1-1-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-1/Miniforge3-4.10.1-1-Linux-aarch64.sh#64ec2e626c1c71332a73081fe482d08e" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.10.1-1-MacOSX-arm64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-1/Miniforge3-4.10.1-1-MacOSX-arm64.sh#888fac13d06ae4c4a79eaa9c6ab79473" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.10.1-1-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-1/Miniforge3-4.10.1-1-MacOSX-x86_64.sh#792fa7d76d0fa02304ec0b4fa2786352" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.10.1-3 b/plugins/python-build/share/python-build/miniforge3-4.10.1-3 new file mode 100644 index 0000000..b4053a4 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.10.1-3 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniforge3-4.10.1-3-Linux-ppc64le" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-3/Miniforge3-4.10.1-3-Linux-ppc64le.sh#650083e39c5b3910600debfce07a3644b5906621be72d16847d1ca05f4f5b4f8" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.10.1-3-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-3/Miniforge3-4.10.1-3-Linux-x86_64.sh#0ab2d494557ce8dfb4344bd960eb98c92d02f25d174c77029a459b20884e0e26" "miniconda" verify_py38 + ;; +"Linux-aarch64" ) + install_script "Miniforge3-4.10.1-3-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-3/Miniforge3-4.10.1-3-Linux-aarch64.sh#8bb5e5885c4b4e9bed0621740a40ceb428c4894b339050227b25690181da2794" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.10.1-3-MacOSX-arm64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-3/Miniforge3-4.10.1-3-MacOSX-arm64.sh#ea7fd5565debe13f484f15236651da88f0137e99b27c36d9001373f13621e393" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.10.1-3-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-3/Miniforge3-4.10.1-3-MacOSX-x86_64.sh#1b85ece22e2d35565db90dfc9121e15fcd4eb179e948983662157e7a9fad2201" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.10.1-5 b/plugins/python-build/share/python-build/miniforge3-4.10.1-5 new file mode 100644 index 0000000..622edcf --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.10.1-5 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniforge3-4.10.1-5-Linux-ppc64le" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-5/Miniforge3-4.10.1-5-Linux-ppc64le.sh#0b23d9c25582dbd2cf8171366f5fb0ef5d5e7f8262eb670094f33400e88f3726" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.10.1-5-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-5/Miniforge3-4.10.1-5-Linux-x86_64.sh#f47637e899258d4fa568aa866c37ecf19a2dacc50fa64a5ebc65443ccdf73243" "miniconda" verify_py38 + ;; +"Linux-aarch64" ) + install_script "Miniforge3-4.10.1-5-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-5/Miniforge3-4.10.1-5-Linux-aarch64.sh#d582c3bf289dc5c2f86dde9182b27e49b095d00da40842f3e379a113b12ce7cb" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.10.1-5-MacOSX-arm64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-5/Miniforge3-4.10.1-5-MacOSX-arm64.sh#29fee39691dfe84cf3222c61fce0c8357d933eefcc0d49041b48153efe91f345" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.10.1-5-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.1-5/Miniforge3-4.10.1-5-MacOSX-x86_64.sh#f67dfc4d5e3dea173e31267eb0890733098f0fd2d42944282d17f27a1bc3f8cc" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.10.2-0 b/plugins/python-build/share/python-build/miniforge3-4.10.2-0 new file mode 100644 index 0000000..a6337d5 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.10.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-4.10.2-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.2-0/Miniforge3-4.10.2-0-Linux-aarch64.sh#eb0a303e716d795b64a4ab056e3c03dae7760c3a3275312419051d272f5d0307" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-4.10.2-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.2-0/Miniforge3-4.10.2-0-Linux-ppc64le.sh#1a55c5f9ee8c49ce0368b77acb4964a8b060ca57d951f68adb98b28c3ed5c145" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.10.2-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.2-0/Miniforge3-4.10.2-0-Linux-x86_64.sh#d2d66f09811c0d846ffb2f04c1827854aa4333624a0dc841389230291d944c30" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.10.2-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.2-0/Miniforge3-4.10.2-0-MacOSX-arm64.sh#36d4a12254c90bdacd3c2a757c8c257dffe3c67754c44372d446c2a54e03cebc" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.10.2-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.2-0/Miniforge3-4.10.2-0-MacOSX-x86_64.sh#60aaecd1681633e84bad0520479e938a0a0c671fa7d78d2aa607d4807c670975" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.10.3-0 b/plugins/python-build/share/python-build/miniforge3-4.10.3-0 new file mode 100644 index 0000000..ffc6fbd --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.10.3-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-4.10.3-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-0/Miniforge3-4.10.3-0-Linux-aarch64.sh#4aff1bfe62b2974a418937bd4687316acef46e461908332159b2f68cb95f6d67" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-4.10.3-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-0/Miniforge3-4.10.3-0-Linux-ppc64le.sh#b854e26db0635846ad4065c54de9d8cef7a97050d7e1303923c5ba18ea9b4dd1" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.10.3-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-0/Miniforge3-4.10.3-0-Linux-x86_64.sh#c22bd3f494ac12f3ef2f146d7625ab140272670f7b4d606af8ff50aac3a0dae2" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.10.3-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-0/Miniforge3-4.10.3-0-MacOSX-arm64.sh#14e0ce6a16c7de8372d0d59cdf279b53601f62b14a073d0824c5ee7384005a2f" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.10.3-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-0/Miniforge3-4.10.3-0-MacOSX-x86_64.sh#e405b2a2be60b6b408569e4b7f6e39c87c3b579235e92dd58615fe708f18d036" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.10.3-1 b/plugins/python-build/share/python-build/miniforge3-4.10.3-1 new file mode 100644 index 0000000..b089835 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.10.3-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-4.10.3-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-1/Miniforge3-4.10.3-1-Linux-aarch64.sh#ebb7b2548f3908ccc1b3c39bc41e2a3dbe19b4d266e844bc929147c39c8a14d3" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-4.10.3-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-1/Miniforge3-4.10.3-1-Linux-ppc64le.sh#cf20609570a5a716e7370a836ee895cbc4e7ca2683a598d32cc0573fddd65e66" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.10.3-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-1/Miniforge3-4.10.3-1-Linux-x86_64.sh#303d65289f600fa4c85fe2b0fef9bb0848ec544a75a9c3079607d847918f7023" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.10.3-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-1/Miniforge3-4.10.3-1-MacOSX-arm64.sh#823f61563947fd9ff92970f4e2323f2f0b61fe5f3cfb75cc7579a1c6169f8853" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.10.3-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-1/Miniforge3-4.10.3-1-MacOSX-x86_64.sh#8ed6871bbd0b24f66b2d87fd88cbcd0854142e5cf1447de5f5f246884ef9c846" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.10.3-10 b/plugins/python-build/share/python-build/miniforge3-4.10.3-10 new file mode 100644 index 0000000..786ef01 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.10.3-10 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniforge3-4.10.3-10-Linux-ppc64le" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-10/Miniforge3-4.10.3-10-Linux-ppc64le.sh#8df85d4af3d2d24f86bb6784d4c196b770b7b9c0be8917d79aec9e08f517d0e9" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.10.3-10-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-10/Miniforge3-4.10.3-10-Linux-x86_64.sh#8ed8cd582d16cd58e0ccd87e692fbe71de6365a51678b579b2f40d8d6f6e5771" "miniconda" verify_py38 + ;; +"Linux-aarch64" ) + install_script "Miniforge3-4.10.3-10-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-10/Miniforge3-4.10.3-10-Linux-aarch64.sh#b2d510c6cd0aac3964a7a7838a7f7376b804fbdd0ba04909ece53f883f624233" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.10.3-10-MacOSX-arm64" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-10/Miniforge3-4.10.3-10-MacOSX-arm64.sh#bd4d59ead779a6e2d9af69fd8cdcaac8e1446191c59ab446ae8547a1aecd75b7" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.10.3-10-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-10/Miniforge3-4.10.3-10-MacOSX-x86_64.sh#7d325a5370664ec2fe1c09c3066c22fd905431f338c7eed31ad7e14c7ce4bd83" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.10.3-2 b/plugins/python-build/share/python-build/miniforge3-4.10.3-2 new file mode 100644 index 0000000..ce88b87 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.10.3-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-4.10.3-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-2/Miniforge3-4.10.3-2-Linux-aarch64.sh#11705546b6e6f7052a83992b7505f74e7cb51b5a519ddccbd9eabfad9451bfee" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-4.10.3-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-2/Miniforge3-4.10.3-2-Linux-ppc64le.sh#da8c5a43f941155aa937bb00068e4ecc5651fe3a9ea0eddd9c40e339eb5fa6d7" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.10.3-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-2/Miniforge3-4.10.3-2-Linux-x86_64.sh#8af640a77047b493d37b4e21302387abb6a62e0b3f942416c525e60dde019c7e" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.10.3-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-2/Miniforge3-4.10.3-2-MacOSX-arm64.sh#74fdfc71022af33ef671c9fe08f917f0e5d4ff5e69b1ef1a02b72f12df146d45" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.10.3-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-2/Miniforge3-4.10.3-2-MacOSX-x86_64.sh#ac68224f726bc2dc38502d6aaf605af976d29cc3fbaaca3c948b1fd5271e8235" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.10.3-3 b/plugins/python-build/share/python-build/miniforge3-4.10.3-3 new file mode 100644 index 0000000..0916e73 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.10.3-3 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-4.10.3-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-3/Miniforge3-4.10.3-3-Linux-aarch64.sh#ca6aa614c217c923bbb6fb48246f356b013697629bcf7d4d3b71c8813910ff94" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-4.10.3-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-3/Miniforge3-4.10.3-3-Linux-ppc64le.sh#84572443a08a640a0308f3f80a3a98431241eed646c26398144b2c8042524006" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.10.3-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-3/Miniforge3-4.10.3-3-Linux-x86_64.sh#12c83e744bf52564445cae0281bc7870b24c77257ac9c72986cbb1443e9b6d0a" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.10.3-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-3/Miniforge3-4.10.3-3-MacOSX-arm64.sh#5f5906dec9ba56fe4cbf1a50b9a573629f4af8f3f166785d114a8af65b9c78a3" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.10.3-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-3/Miniforge3-4.10.3-3-MacOSX-x86_64.sh#3242d65bae12edf2d7cd29ed466fc72cb66f3f031f621ac360ab8968e4d29974" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.10.3-4 b/plugins/python-build/share/python-build/miniforge3-4.10.3-4 new file mode 100644 index 0000000..95e9305 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.10.3-4 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-4.10.3-4-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-4/Miniforge3-4.10.3-4-Linux-aarch64.sh#1237209ed8145efc05dcc4e97e367811d569154609fffcc22ebcb08b0e0392d2" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-4.10.3-4-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-4/Miniforge3-4.10.3-4-Linux-ppc64le.sh#591825a5b5f690bb74759c0f93c347f0ae1f9b30057609d8205a11b2b7c21902" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.10.3-4-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-4/Miniforge3-4.10.3-4-Linux-x86_64.sh#13626e6d43546d0b8c47be37b34d2c2ba5e0a518066b0659addb4afcc30a70be" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.10.3-4-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-4/Miniforge3-4.10.3-4-MacOSX-arm64.sh#0079a2172ff9cc92d6a0f30d4269d7e27ef77f5074525c31fb46db57f9ccaefe" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.10.3-4-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-4/Miniforge3-4.10.3-4-MacOSX-x86_64.sh#21be593ec3a3d917862bf452a78bf4c9dddb9b360346562b3c19c21efd892d77" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.10.3-5 b/plugins/python-build/share/python-build/miniforge3-4.10.3-5 new file mode 100644 index 0000000..0c5581f --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.10.3-5 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-4.10.3-5-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-5/Miniforge3-4.10.3-5-Linux-aarch64.sh#acd5f31fd2bdd9ebd996a6d5b36fcc6a8ab5d0b3820cbc47d660afa2cf0bd3ba" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-4.10.3-5-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-5/Miniforge3-4.10.3-5-Linux-ppc64le.sh#e018e8a7c41e1871b456bc27efbc0e3a4093d3e6ba84cb5ea94f6d0601b3e27a" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.10.3-5-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-5/Miniforge3-4.10.3-5-Linux-x86_64.sh#5f143112b6c9533c550b447cc01f7313a86b6b88b92632791bcb4320e57f9af6" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.10.3-5-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-5/Miniforge3-4.10.3-5-MacOSX-arm64.sh#77989d3186c21ec8de9ff22ef076e815c465c026cef087601b2bec5d02cfd889" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.10.3-5-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-5/Miniforge3-4.10.3-5-MacOSX-x86_64.sh#6f324566af60279518c2d03ffd69f605b335f87f72e6e7e4c2f383808e41e212" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.10.3-6 b/plugins/python-build/share/python-build/miniforge3-4.10.3-6 new file mode 100644 index 0000000..b11e8a3 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.10.3-6 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-4.10.3-6-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-6/Miniforge3-4.10.3-6-Linux-aarch64.sh#a79cd78324bb42cde5150d2194744205b9ebae1ebab06c50c3205e4846efb9e0" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-4.10.3-6-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-6/Miniforge3-4.10.3-6-Linux-ppc64le.sh#d3624b1d7a715a6089c309b9a593a5c241a1d959d00b037c074d3080be587b27" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.10.3-6-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-6/Miniforge3-4.10.3-6-Linux-x86_64.sh#8e76a21311e4fcc9ee8497b72717b276bb960e0151c5b27816502f14bac6303f" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.10.3-6-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-6/Miniforge3-4.10.3-6-MacOSX-arm64.sh#4ba889103eb119e9d12e45b5fba3bcdef45877d9a886657f14f1ebe71a9b5a63" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.10.3-6-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-6/Miniforge3-4.10.3-6-MacOSX-x86_64.sh#eabb50e2594d55eeb2a74fa05a919be876ec364e8064e1623ab096f39d6b6dd1" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.10.3-7 b/plugins/python-build/share/python-build/miniforge3-4.10.3-7 new file mode 100644 index 0000000..e48d475 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.10.3-7 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-4.10.3-7-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-7/Miniforge3-4.10.3-7-Linux-aarch64.sh#d597961defe8c7889f3e924d0dc7624fab2c8845abccdd8ffa8da8018ff3dc6e" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-4.10.3-7-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-7/Miniforge3-4.10.3-7-Linux-ppc64le.sh#8825827240c0d06413876055bf3a04d8704f0e5ac773692a352502862dce7aa5" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.10.3-7-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-7/Miniforge3-4.10.3-7-Linux-x86_64.sh#4de9b7dcc9b2761136f4a7a42a8b2ea06ae2ebc61d865c9fca0db3d6c90b569d" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.10.3-7-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-7/Miniforge3-4.10.3-7-MacOSX-arm64.sh#3cd1f11743f936ba522709eb7a173930c299ac681671a909b664222329a56290" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.10.3-7-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-7/Miniforge3-4.10.3-7-MacOSX-x86_64.sh#a25c1b381b20873ed856ce675a7a2ccf48f1d6782a5cdce9f06496e6ffa7883f" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.10.3-8 b/plugins/python-build/share/python-build/miniforge3-4.10.3-8 new file mode 100644 index 0000000..c488eee --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.10.3-8 @@ -0,0 +1,16 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"MacOSX-arm64" ) + install_script "Miniforge3-4.10.3-8-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-8/Miniforge3-4.10.3-8-MacOSX-arm64.sh#ed1f245d8effb463c9bd5d1cde034e7e291684e0668885a87deb34303dafced5" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.10.3-8-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-8/Miniforge3-4.10.3-8-MacOSX-x86_64.sh#9c123f45da81878b3b3f221dcb7595f6420cac0310235316a7deba93cf12bbe3" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.10.3-9 b/plugins/python-build/share/python-build/miniforge3-4.10.3-9 new file mode 100644 index 0000000..119d4b3 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.10.3-9 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-4.10.3-9-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-9/Miniforge3-4.10.3-9-Linux-aarch64.sh#33850a3806c61c2f0c27a4619a49a2ab7c27691b65b64ea764b57b3cc572efa1" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-4.10.3-9-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-9/Miniforge3-4.10.3-9-Linux-ppc64le.sh#7192460dcf7d309ebe0c2e53f0034c86b097de4f1ebf669f677d57886b9b48de" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.10.3-9-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-9/Miniforge3-4.10.3-9-Linux-x86_64.sh#387ed0e31a0e16def1f4b602c8a3633f707c53fff7cbf2ff56175953d0c6f7e7" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.10.3-9-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-9/Miniforge3-4.10.3-9-MacOSX-arm64.sh#68196959ddc966046935ab80fb0fda73675914e55e96764e0358f7eb4a4e7714" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.10.3-9-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.10.3-9/Miniforge3-4.10.3-9-MacOSX-x86_64.sh#86ba79bba787ea943d11810b8f7b393a3ce5d421cd31528436c3ffa17eb062ed" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.11.0-0 b/plugins/python-build/share/python-build/miniforge3-4.11.0-0 new file mode 100644 index 0000000..52090ad --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.11.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-4.11.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-0/Miniforge3-4.11.0-0-Linux-aarch64.sh#3c4728ece94f005a0edfcb45f930bf2fd4acdaafdee2692006b0322ca6c44ca7" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-4.11.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-0/Miniforge3-4.11.0-0-Linux-ppc64le.sh#cfaedc8ff54703b91ef0a1f27232ac4f85dad2725d65a19624e63674aca19bd0" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.11.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-0/Miniforge3-4.11.0-0-Linux-x86_64.sh#4c24b38969ac413efa3a984290296f72578340d06004f2c7ba5efcbf828ec86b" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.11.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-0/Miniforge3-4.11.0-0-MacOSX-arm64.sh#d37c13f42f6d8e1b5786da5c73735eb4584a100c8b3572e5413dffe943a6a38b" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.11.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-0/Miniforge3-4.11.0-0-MacOSX-x86_64.sh#037da3c64fd8f8179ce99909784cfdaa2326b7ea832e747de8ea9e396c1583e7" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.11.0-1 b/plugins/python-build/share/python-build/miniforge3-4.11.0-1 new file mode 100644 index 0000000..e1290c2 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.11.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-4.11.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-1/Miniforge3-4.11.0-1-Linux-aarch64.sh#5032a44b9a6c11a2ef46c02707c9c21adc276e2acd40305d615a6b923b7acd26" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-4.11.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-1/Miniforge3-4.11.0-1-Linux-ppc64le.sh#38ea90c2aa8c380a50f8fadf329981b0ad8c05064a928212a234e9101d23a81f" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.11.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-1/Miniforge3-4.11.0-1-Linux-x86_64.sh#83ed76dcc907c9d9fc553a8a33278f06e80a27ac47c0db78e73f2b14f0bfbad1" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.11.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-1/Miniforge3-4.11.0-1-MacOSX-arm64.sh#67f6c7bec83f04d8fe3a8083c6a13084b9dd0bb33e5bb8975a9a6531f7360875" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.11.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-1/Miniforge3-4.11.0-1-MacOSX-x86_64.sh#9795921a6836f0d1e0abc10e4a724dcddaba8fbcf9740b2764c6d64f1378b835" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.11.0-2 b/plugins/python-build/share/python-build/miniforge3-4.11.0-2 new file mode 100644 index 0000000..9e4ba1c --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.11.0-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-4.11.0-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-2/Miniforge3-4.11.0-2-Linux-aarch64.sh#6497f1e696c4f2931acecdc341242f3b2d1acfdb1360c6dd86dbd5a4000a970d" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-4.11.0-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-2/Miniforge3-4.11.0-2-Linux-ppc64le.sh#7661deb911b2210d619a60c4f63275680c003ec83898fd80af4025d30e722a44" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.11.0-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-2/Miniforge3-4.11.0-2-Linux-x86_64.sh#f671f3a225ce5517021f0eb430ffa9110eebad8e0a0549d36c778e7769cb4970" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.11.0-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-2/Miniforge3-4.11.0-2-MacOSX-arm64.sh#eba035fb0f2f0d7a095713e93fd3848c847e18e8dbbef7173653f57a0518abe8" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.11.0-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-2/Miniforge3-4.11.0-2-MacOSX-x86_64.sh#379323b33054730c7d06004f9a0cc7eb8283e45ae6d44814bb0b283d5eda2f03" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.11.0-3 b/plugins/python-build/share/python-build/miniforge3-4.11.0-3 new file mode 100644 index 0000000..3b5ee48 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.11.0-3 @@ -0,0 +1,16 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"MacOSX-arm64" ) + install_script "Miniforge3-4.11.0-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-3/Miniforge3-4.11.0-3-MacOSX-arm64.sh#e74e4acfcc2bdf662746172b684855790d018f3b9c1d2630e65b2c4e316f3eb5" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.11.0-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-3/Miniforge3-4.11.0-3-MacOSX-x86_64.sh#f7a5e379135a7f2454a6cfe7d81fa7f6a082793c60d6c88648b4035ca1c83d24" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.11.0-4 b/plugins/python-build/share/python-build/miniforge3-4.11.0-4 new file mode 100644 index 0000000..67d2be6 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.11.0-4 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-4.11.0-4-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-4/Miniforge3-4.11.0-4-Linux-aarch64.sh#7b88645381840589aeaa8a2a9a3a077a0909541ecfd6752b44eef53af83786b5" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-4.11.0-4-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-4/Miniforge3-4.11.0-4-Linux-ppc64le.sh#adfe136cef5dd92bf54ec8e71656714ec485a140b18cfb3319837828d4a5ede0" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.11.0-4-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-4/Miniforge3-4.11.0-4-Linux-x86_64.sh#b8560aaab6edce86e690cdf096427dde0fa2c4f1bb083b20b642e6b2b4543ed1" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.11.0-4-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-4/Miniforge3-4.11.0-4-MacOSX-arm64.sh#7b3e3c29f8cc4a6a13e53f20e155f7bd30216e071c6028f699582b23bff06e60" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.11.0-4-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.11.0-4/Miniforge3-4.11.0-4-MacOSX-x86_64.sh#5f0019f6f671f3a41352b53ee7001dfbc6d7806a62d3691159c60d493ed82ea2" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.12.0-0 b/plugins/python-build/share/python-build/miniforge3-4.12.0-0 new file mode 100644 index 0000000..8759730 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.12.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-4.12.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-0/Miniforge3-4.12.0-0-Linux-aarch64.sh#09b0ec8cefd3d94327ce12185af8164c8890bff00351b3f64bf280e22e947d21" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-4.12.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-0/Miniforge3-4.12.0-0-Linux-ppc64le.sh#29e3969b82538c78a13e684f53c0a0cd2eba7b500e7e187e4d6bddacc3eb66e1" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.12.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-0/Miniforge3-4.12.0-0-Linux-x86_64.sh#ccb6c87f42355e2e0b652dd35a980b7c60ca5e53643237f6a070748ef0dd23ff" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.12.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-0/Miniforge3-4.12.0-0-MacOSX-arm64.sh#e52cb92d620c5a408afef9ac8b5d2e964e2c72211c69cc41a2bb4d6af0a26001" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.12.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-0/Miniforge3-4.12.0-0-MacOSX-x86_64.sh#3bfcd52dd1acafc712b6fb042d4b019c6f09ea3ba62710f722f4e9ebcde7f67c" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.12.0-1 b/plugins/python-build/share/python-build/miniforge3-4.12.0-1 new file mode 100644 index 0000000..69245c2 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.12.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-4.12.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-1/Miniforge3-4.12.0-1-Linux-aarch64.sh#b1fb77baffdc187f1ccf34db781aa849f8c057b31fdb7394788fe6c8ffb99916" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-4.12.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-1/Miniforge3-4.12.0-1-Linux-ppc64le.sh#3b4bd33274e02ef7a19ffacd0e7eafe9275f08fc188a77f3a75ddf877772bf35" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.12.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-1/Miniforge3-4.12.0-1-Linux-x86_64.sh#fe0c49f6af64668006b87174a7dcddd3ea59fe2d0f05c7db3de057e2fbc8a6e9" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.12.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-1/Miniforge3-4.12.0-1-MacOSX-arm64.sh#622fc4220a90a80ff7f6ae40883d2d37eb09e9168aa74b9516de81c302490527" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.12.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-1/Miniforge3-4.12.0-1-MacOSX-x86_64.sh#4456a11cc99ac9a671b83f3ecf1d670e93dc88c1e5ecd3f038e041e658104b05" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.12.0-2 b/plugins/python-build/share/python-build/miniforge3-4.12.0-2 new file mode 100644 index 0000000..2e13d22 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.12.0-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-4.12.0-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-2/Miniforge3-4.12.0-2-Linux-aarch64.sh#507c9763942821d7541b5a1b1130545e4c19416cc0473054faa10fee435aa9fa" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-4.12.0-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-2/Miniforge3-4.12.0-2-Linux-ppc64le.sh#447d1729353189ba732e951b598d5b9ea4ab46296db4523ac34a775150a60199" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.12.0-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-2/Miniforge3-4.12.0-2-Linux-x86_64.sh#e8bd60572d1bdcd9fc16114f423653c95e02f0be1393383f77fba17cf8acb10e" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.12.0-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-2/Miniforge3-4.12.0-2-MacOSX-arm64.sh#24181b1a42c6bb9704e28ac4ecb234f3c86d882a7db408948692bc5792a2f713" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.12.0-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-2/Miniforge3-4.12.0-2-MacOSX-x86_64.sh#37007407ab504fb8bd3af68ff821c0819ad2f016087b9c45f1e95a910c92531e" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.12.0-3 b/plugins/python-build/share/python-build/miniforge3-4.12.0-3 new file mode 100644 index 0000000..8815c13 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.12.0-3 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-4.12.0-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-3/Miniforge3-4.12.0-3-Linux-aarch64.sh#8ddc79ffaa40dfc7e3d93c8c02e268c6d3958c4ef662bc2194c36aa7d50820a3" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-4.12.0-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-3/Miniforge3-4.12.0-3-Linux-ppc64le.sh#2892b96723bb8aec33275ce033c209cd0ee53a9208afce7138c79438bd533fbb" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.12.0-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-3/Miniforge3-4.12.0-3-Linux-x86_64.sh#680f8549374474bad903ebb2985a2c264f592fecae1544700bcc4e0d41e1ba17" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.12.0-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-3/Miniforge3-4.12.0-3-MacOSX-arm64.sh#9088b27744512960b4834d318204f2bdbaeb44c13dd21b4740de357cea270d44" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.12.0-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.12.0-3/Miniforge3-4.12.0-3-MacOSX-x86_64.sh#76b6cf644e74c2c2df9ff7a315259a1cf82170bcb9fea0038069616fe25d1d14" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.13.0-0 b/plugins/python-build/share/python-build/miniforge3-4.13.0-0 new file mode 100644 index 0000000..f951835 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.13.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-4.13.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-0/Miniforge3-4.13.0-0-Linux-aarch64.sh#930ea585fa30047ada7bc892aa96bb4b521f082469b0594e3fbbbb6ac17dcda5" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-4.13.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-0/Miniforge3-4.13.0-0-Linux-ppc64le.sh#ce3c506f2dc939b368e91521355a68653aa40541371ffe12aa0cbe43e264f26c" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.13.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-0/Miniforge3-4.13.0-0-Linux-x86_64.sh#e810f2e2a36bec232ed8f00e68be1b75590b51b4e3f3de39aab3212e596bf7a8" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.13.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-0/Miniforge3-4.13.0-0-MacOSX-arm64.sh#b00587bfd44d259d28d376497d0fc68bd150eb74b4a96771220917699bd26340" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.13.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-0/Miniforge3-4.13.0-0-MacOSX-x86_64.sh#f29457257d01f06569f342723d58d4c6b526c9404dbb579ab72548d933b5b547" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.13.0-1 b/plugins/python-build/share/python-build/miniforge3-4.13.0-1 new file mode 100644 index 0000000..de2776d --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.13.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-4.13.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-1/Miniforge3-4.13.0-1-Linux-aarch64.sh#e0d671d18ef578700dce1796f1a8796a74c8e5e4e5d6ee9f33cf6a1159f570c8" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-4.13.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-1/Miniforge3-4.13.0-1-Linux-ppc64le.sh#2981ba22334a73f3bd8c0bcb9ad2510c411ab454280f460ca461977e5c0c43a6" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.13.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-1/Miniforge3-4.13.0-1-Linux-x86_64.sh#6e0a33060c525909fa0e8ae74cb511480e8191cef88e3c297619f31574804184" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.13.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-1/Miniforge3-4.13.0-1-MacOSX-arm64.sh#57bef67a4c80bfef04223eb76ee1b49b1bdfd5eeb46ebcf49e65d6c308c84a98" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.13.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.13.0-1/Miniforge3-4.13.0-1-MacOSX-x86_64.sh#9996677f0ca0bfa6399e9a5688556bfaff544389ea123e2ac6e6252d3a1d0658" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.14.0-0 b/plugins/python-build/share/python-build/miniforge3-4.14.0-0 new file mode 100644 index 0000000..1bdb1a2 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.14.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-4.14.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-0/Miniforge3-4.14.0-0-Linux-aarch64.sh#8e2de8657e0ff7315daf22df1874d5a57ff8295bc9489d43d61f2d9fac49e42b" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-4.14.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-0/Miniforge3-4.14.0-0-Linux-ppc64le.sh#a1614873842aec1703ea4509554998663d5a774976c30bf89c76410a5f82aaa0" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.14.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-0/Miniforge3-4.14.0-0-Linux-x86_64.sh#643dd45d9a9dd362508e8edd8cd535a87b002bd7716b12fb956247c8c7494908" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.14.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-0/Miniforge3-4.14.0-0-MacOSX-arm64.sh#91b7cadb5986af1c38555cfb4214dcb353212492a89d5e7f4c32204829ed1829" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.14.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-0/Miniforge3-4.14.0-0-MacOSX-x86_64.sh#80ee5ce53a1f4edb21677dd6794a043ad7d1db6e3d5ffe7a994937923a50a2c9" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.14.0-1 b/plugins/python-build/share/python-build/miniforge3-4.14.0-1 new file mode 100644 index 0000000..c3353d1 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.14.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-4.14.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-1/Miniforge3-4.14.0-1-Linux-aarch64.sh#79bb1694aee2cd4bc7ee412f267f6b06ccd011cd7be6686970599bff9ab5ae0b" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-4.14.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-1/Miniforge3-4.14.0-1-Linux-ppc64le.sh#d82789f644759b21cbfcfb3de96b6a9879c38d6c3aa90394ee8b0916e0c5c45b" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.14.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-1/Miniforge3-4.14.0-1-Linux-x86_64.sh#8a83e4a7440157d57631b9cb4958591b41547263a30f02046767271695a242ad" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.14.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-1/Miniforge3-4.14.0-1-MacOSX-arm64.sh#d2dc25e5c73e420ae22a30abfebd24b51cb1d66d369594085ee42ba0e3e3d4d9" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.14.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-1/Miniforge3-4.14.0-1-MacOSX-x86_64.sh#4b956674c1c5f312bfc04f8f4d1a47bfe5cc7b9ca6a011cdd044c7152a8309d7" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.14.0-2 b/plugins/python-build/share/python-build/miniforge3-4.14.0-2 new file mode 100644 index 0000000..d702e4a --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.14.0-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-4.14.0-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-2/Miniforge3-4.14.0-2-Linux-aarch64.sh#52e44682aecbfb1c41e9f07b0f2f08ab22369e236893768be3c85ad6c039090f" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-4.14.0-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-2/Miniforge3-4.14.0-2-Linux-ppc64le.sh#60d37536a07fbf9278308a8601fa125b5d643fb36e6b8e12faad45455aae3119" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.14.0-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-2/Miniforge3-4.14.0-2-Linux-x86_64.sh#ff0b9f78a51a4d9851e8fd3cdb6ff0b233f4f49d82c0690a12560e57075690bd" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.14.0-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-2/Miniforge3-4.14.0-2-MacOSX-arm64.sh#5089a254923acb6221cf7c3c5138cf68664684e18d4223e53482948c21975d7e" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.14.0-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/4.14.0-2/Miniforge3-4.14.0-2-MacOSX-x86_64.sh#ac3c2a283f6ebf24d6072d39f9bf9297c64a752315353f666260f72b02daf6d1" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-4.9.2 b/plugins/python-build/share/python-build/miniforge3-4.9.2 new file mode 100644 index 0000000..5d7323e --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-4.9.2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniforge3-4.9.2-7-Linux-ppc64le" "https://github.com/conda-forge/miniforge/releases/download/4.9.2-7/Miniforge3-4.9.2-7-Linux-ppc64le.sh#fb18f348f35328aff5dd7edbd83ea2e2" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-4.9.2-7-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.9.2-7/Miniforge3-4.9.2-7-Linux-x86_64.sh#d96baf1a0559a1f642528c0e38aad984" "miniconda" verify_py38 + ;; +"Linux-aarch64" ) + install_script "Miniforge3-4.9.2-7-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/download/4.9.2-7/Miniforge3-4.9.2-7-Linux-aarch64.sh#c5bceb970dcff512f35f444397b5ce11" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-4.9.2-7-MacOSX-arm64" "https://github.com/conda-forge/miniforge/releases/download/4.9.2-7/Miniforge3-4.9.2-7-MacOSX-arm64.sh#cca7e2cbbf5734eda475a72e81fe8031" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-4.9.2-7-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/download/4.9.2-7/Miniforge3-4.9.2-7-MacOSX-x86_64.sh#f270b7bfd721899cb175c10f0b6cfa01" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-latest b/plugins/python-build/share/python-build/miniforge3-latest new file mode 100644 index 0000000..1af5ea6 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-latest @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-ppc64le" ) + install_script "Miniforge3-Linux-ppc64le" "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-ppc64le.sh" "miniconda" verify_py3_latest + ;; +"Linux-x86_64" ) + install_script "Miniforge3-Linux-x86_64" "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh" "miniconda" verify_py3_latest + ;; +"Linux-aarch64" ) + install_script "Miniforge3-Linux-aarch64" "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-aarch64.sh" "miniconda" verify_py3_latest + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-MacOSX-arm64" "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh" "miniconda" verify_py3_latest + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-MacOSX-x86_64" "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-x86_64.sh" "miniconda" verify_py3_latest + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge3 is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/nogil-3.9.10 b/plugins/python-build/share/python-build/nogil-3.9.10 new file mode 100644 index 0000000..6981b60 --- /dev/null +++ b/plugins/python-build/share/python-build/nogil-3.9.10 @@ -0,0 +1,5 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1l" "https://www.openssl.org/source/openssl-1.1.1l.tar.gz#0b7a3e5e59c34827fe0c3a74b7ec8baef302b98fa80088d7f9153aa16fa76bd1" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +install_package "nogil-3.9.10" "https://github.com/colesbury/nogil/archive/refs/tags/v3.9.10-nogil.tar.gz#5058c0ec07f0444673b86977c18e786183ca35617d9e6ada2329f7a87a4a0993" standard verify_py39 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/nogil-3.9.10-1 b/plugins/python-build/share/python-build/nogil-3.9.10-1 new file mode 100644 index 0000000..03083a5 --- /dev/null +++ b/plugins/python-build/share/python-build/nogil-3.9.10-1 @@ -0,0 +1,5 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1l" "https://www.openssl.org/source/openssl-1.1.1l.tar.gz#0b7a3e5e59c34827fe0c3a74b7ec8baef302b98fa80088d7f9153aa16fa76bd1" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +install_package "nogil-3.9.10-1" "https://github.com/colesbury/nogil/archive/refs/tags/v3.9.10-nogil-2023-01-22.tar.gz#cbda308c7586745573d665cd53d71b50707fd6f85c1c5d7a9f5b092e869cc757" standard verify_py39 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/patches/2.1.3/Python-2.1.3/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.1.3/Python-2.1.3/000_patch-setup.py.diff new file mode 100644 index 0000000..9ef12fd --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.1.3/Python-2.1.3/000_patch-setup.py.diff @@ -0,0 +1,58 @@ +--- setup.py.orig 2014-06-22 01:56:56.614802000 -0700 ++++ setup.py 2014-06-22 01:55:54.555149273 -0700 +@@ -12,10 +12,18 @@ + from distutils.errors import * + from distutils.core import Extension, setup + from distutils.command.build_ext import build_ext ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] + ++def add_dir_to_list(dirlist, dir): ++ """Add the directory 'dir' to the list 'dirlist' (at the front) if ++ 1) 'dir' is not already in 'dirlist' ++ 2) 'dir' actually exists, and is a directory.""" ++ if dir is not None and os.path.isdir(dir) and dir not in dirlist: ++ dirlist.insert(0, dir) ++ + def find_file(filename, std_dirs, paths): + """Searches for the directory where a given file is located, + and returns a possibly-empty list of additional directories, or None +@@ -144,12 +152,36 @@ + + return platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ fp = open(tmpfile) ++ multiarch_path_component = fp.readline().strip() ++ fp.close() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + if '/usr/local/lib' not in self.compiler.library_dirs: + self.compiler.library_dirs.insert(0, '/usr/local/lib') + if '/usr/local/include' not in self.compiler.include_dirs: + self.compiler.include_dirs.insert(0, '/usr/local/include' ) ++ self.add_multiarch_paths() + + # lib_dirs and inc_dirs are used to search for files; + # if a file is found in one of those directories, it can diff --git a/plugins/python-build/share/python-build/patches/2.2.3/Python-2.2.3/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.2.3/Python-2.2.3/000_patch-setup.py.diff new file mode 100644 index 0000000..9a94f0f --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.2.3/Python-2.2.3/000_patch-setup.py.diff @@ -0,0 +1,58 @@ +--- setup.py.orig 2014-06-22 01:49:02.521459238 -0700 ++++ setup.py 2014-06-22 01:53:59.607792944 -0700 +@@ -10,10 +10,18 @@ + from distutils.core import Extension, setup + from distutils.command.build_ext import build_ext + from distutils.command.install import install ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] + ++def add_dir_to_list(dirlist, dir): ++ """Add the directory 'dir' to the list 'dirlist' (at the front) if ++ 1) 'dir' is not already in 'dirlist' ++ 2) 'dir' actually exists, and is a directory.""" ++ if dir is not None and os.path.isdir(dir) and dir not in dirlist: ++ dirlist.insert(0, dir) ++ + def find_file(filename, std_dirs, paths): + """Searches for the directory where a given file is located, + and returns a possibly-empty list of additional directories, or None +@@ -209,12 +217,36 @@ + + return platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ fp = open(tmpfile) ++ multiarch_path_component = fp.readline().strip() ++ fp.close() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + if '/usr/local/lib' not in self.compiler.library_dirs: + self.compiler.library_dirs.insert(0, '/usr/local/lib') + if '/usr/local/include' not in self.compiler.include_dirs: + self.compiler.include_dirs.insert(0, '/usr/local/include' ) ++ self.add_multiarch_paths() + + try: + have_unicode = unicode diff --git a/plugins/python-build/share/python-build/patches/2.3.7/Python-2.3.7/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.3.7/Python-2.3.7/000_patch-setup.py.diff new file mode 100644 index 0000000..5c7939d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.3.7/Python-2.3.7/000_patch-setup.py.diff @@ -0,0 +1,45 @@ +--- setup.py.orig 2005-01-17 13:07:52.000000000 -0800 ++++ setup.py 2014-06-22 02:03:46.888499800 -0700 +@@ -13,6 +13,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -239,10 +240,34 @@ + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ fp = open(tmpfile) ++ multiarch_path_component = fp.readline().strip() ++ fp.close() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # fink installs lots of goodies in /sw/... - make sure we + # check there diff --git a/plugins/python-build/share/python-build/patches/2.3.7/Python-2.3.7/001_fortify_crash_workaround.diff b/plugins/python-build/share/python-build/patches/2.3.7/Python-2.3.7/001_fortify_crash_workaround.diff new file mode 100644 index 0000000..0e47919 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.3.7/Python-2.3.7/001_fortify_crash_workaround.diff @@ -0,0 +1,51 @@ +Author: Dwayne Litzenberger +Date: Sun Jun 22 01:15:05 2014 -0700 + + Patch configure to handle Ubuntu Bug#286334 + + Fixes this crash: + + *** buffer overflow detected ***: ./python terminated + ======= Backtrace: ========= + /lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x2b08765c9007] + +diff --git configure configure +index 4838393..654de3f 100755 +--- configure ++++ configure +@@ -20798,6 +20798,15 @@ done + echo "$as_me:$LINENO: result: done" >&5 + echo "${ECHO_T}done" >&6 + ++case $ac_sys_system in ++Linux*) ++# Workaround for bug in Ubuntu 10.10 amd64 gcc-4.4 ++# See http://orip.org/2008/10/building-python-235-on-ubuntu-intrepid.html ++# and Ubuntu Bug #286334 ++BASECFLAGS="$BASECFLAGS -U_FORTIFY_SOURCE" ++;; ++esac ++ + # generate output files + ac_config_files="$ac_config_files Makefile.pre Modules/Setup.config" + +diff --git configure.in configure.in +index ba7a011..060a73f 100644 +--- configure.in ++++ configure.in +@@ -3072,6 +3072,15 @@ for dir in $SRCDIRS; do + done + AC_MSG_RESULT(done) + ++case $ac_sys_system in ++Linux*) ++# Workaround for bug in Ubuntu 10.10 amd64 gcc-4.4 ++# See http://orip.org/2008/10/building-python-235-on-ubuntu-intrepid.html ++# and Ubuntu Bug #286334 ++BASECFLAGS="$BASECFLAGS -U_FORTIFY_SOURCE" ++;; ++esac ++ + # generate output files + AC_CONFIG_FILES(Makefile.pre Modules/Setup.config) + AC_OUTPUT diff --git a/plugins/python-build/share/python-build/patches/2.4.0/Python-2.4/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.4.0/Python-2.4/000_patch-setup.py.diff new file mode 100644 index 0000000..ffe4b0d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.4.0/Python-2.4/000_patch-setup.py.diff @@ -0,0 +1,45 @@ +--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 ++++ setup.py 2011-07-07 19:25:04.548416377 +0900 +@@ -13,6 +13,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -242,10 +243,34 @@ + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ fp = open(tmpfile) ++ multiarch_path_component = fp.readline().strip() ++ fp.close() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. diff --git a/plugins/python-build/share/python-build/patches/2.4.0/Python-2.4/001_fortify_crash_workaround.diff b/plugins/python-build/share/python-build/patches/2.4.0/Python-2.4/001_fortify_crash_workaround.diff new file mode 100644 index 0000000..0e47919 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.4.0/Python-2.4/001_fortify_crash_workaround.diff @@ -0,0 +1,51 @@ +Author: Dwayne Litzenberger +Date: Sun Jun 22 01:15:05 2014 -0700 + + Patch configure to handle Ubuntu Bug#286334 + + Fixes this crash: + + *** buffer overflow detected ***: ./python terminated + ======= Backtrace: ========= + /lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x2b08765c9007] + +diff --git configure configure +index 4838393..654de3f 100755 +--- configure ++++ configure +@@ -20798,6 +20798,15 @@ done + echo "$as_me:$LINENO: result: done" >&5 + echo "${ECHO_T}done" >&6 + ++case $ac_sys_system in ++Linux*) ++# Workaround for bug in Ubuntu 10.10 amd64 gcc-4.4 ++# See http://orip.org/2008/10/building-python-235-on-ubuntu-intrepid.html ++# and Ubuntu Bug #286334 ++BASECFLAGS="$BASECFLAGS -U_FORTIFY_SOURCE" ++;; ++esac ++ + # generate output files + ac_config_files="$ac_config_files Makefile.pre Modules/Setup.config" + +diff --git configure.in configure.in +index ba7a011..060a73f 100644 +--- configure.in ++++ configure.in +@@ -3072,6 +3072,15 @@ for dir in $SRCDIRS; do + done + AC_MSG_RESULT(done) + ++case $ac_sys_system in ++Linux*) ++# Workaround for bug in Ubuntu 10.10 amd64 gcc-4.4 ++# See http://orip.org/2008/10/building-python-235-on-ubuntu-intrepid.html ++# and Ubuntu Bug #286334 ++BASECFLAGS="$BASECFLAGS -U_FORTIFY_SOURCE" ++;; ++esac ++ + # generate output files + AC_CONFIG_FILES(Makefile.pre Modules/Setup.config) + AC_OUTPUT diff --git a/plugins/python-build/share/python-build/patches/2.4.0/Python-2.4/002_patch-posixmodule.diff b/plugins/python-build/share/python-build/patches/2.4.0/Python-2.4/002_patch-posixmodule.diff new file mode 100644 index 0000000..800da16 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.4.0/Python-2.4/002_patch-posixmodule.diff @@ -0,0 +1,20 @@ +--- Modules/posixmodule.c.orig 2019-04-04 20:27:41.000000000 +0200 ++++ Modules/posixmodule.c 2019-04-04 20:28:07.000000000 +0200 +@@ -5300,7 +5300,7 @@ + Close a file descriptor (for low level IO)."); + + static PyObject * +-posix_close(PyObject *self, PyObject *args) ++posix_closex(PyObject *self, PyObject *args) + { + int fd, res; + if (!PyArg_ParseTuple(args, "i:close", &fd)) +@@ -7554,7 +7554,7 @@ + {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__}, + #endif /* HAVE_TCSETPGRP */ + {"open", posix_open, METH_VARARGS, posix_open__doc__}, +- {"close", posix_close, METH_VARARGS, posix_close__doc__}, ++ {"close", posix_closex, METH_VARARGS, posix_close__doc__}, + {"dup", posix_dup, METH_VARARGS, posix_dup__doc__}, + {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__}, + {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__}, \ No newline at end of file diff --git a/plugins/python-build/share/python-build/patches/2.4.1/Python-2.4.1/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.4.1/Python-2.4.1/000_patch-setup.py.diff new file mode 100644 index 0000000..ffe4b0d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.4.1/Python-2.4.1/000_patch-setup.py.diff @@ -0,0 +1,45 @@ +--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 ++++ setup.py 2011-07-07 19:25:04.548416377 +0900 +@@ -13,6 +13,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -242,10 +243,34 @@ + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ fp = open(tmpfile) ++ multiarch_path_component = fp.readline().strip() ++ fp.close() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. diff --git a/plugins/python-build/share/python-build/patches/2.4.1/Python-2.4.1/001_fortify_crash_workaround.diff b/plugins/python-build/share/python-build/patches/2.4.1/Python-2.4.1/001_fortify_crash_workaround.diff new file mode 100644 index 0000000..0e47919 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.4.1/Python-2.4.1/001_fortify_crash_workaround.diff @@ -0,0 +1,51 @@ +Author: Dwayne Litzenberger +Date: Sun Jun 22 01:15:05 2014 -0700 + + Patch configure to handle Ubuntu Bug#286334 + + Fixes this crash: + + *** buffer overflow detected ***: ./python terminated + ======= Backtrace: ========= + /lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x2b08765c9007] + +diff --git configure configure +index 4838393..654de3f 100755 +--- configure ++++ configure +@@ -20798,6 +20798,15 @@ done + echo "$as_me:$LINENO: result: done" >&5 + echo "${ECHO_T}done" >&6 + ++case $ac_sys_system in ++Linux*) ++# Workaround for bug in Ubuntu 10.10 amd64 gcc-4.4 ++# See http://orip.org/2008/10/building-python-235-on-ubuntu-intrepid.html ++# and Ubuntu Bug #286334 ++BASECFLAGS="$BASECFLAGS -U_FORTIFY_SOURCE" ++;; ++esac ++ + # generate output files + ac_config_files="$ac_config_files Makefile.pre Modules/Setup.config" + +diff --git configure.in configure.in +index ba7a011..060a73f 100644 +--- configure.in ++++ configure.in +@@ -3072,6 +3072,15 @@ for dir in $SRCDIRS; do + done + AC_MSG_RESULT(done) + ++case $ac_sys_system in ++Linux*) ++# Workaround for bug in Ubuntu 10.10 amd64 gcc-4.4 ++# See http://orip.org/2008/10/building-python-235-on-ubuntu-intrepid.html ++# and Ubuntu Bug #286334 ++BASECFLAGS="$BASECFLAGS -U_FORTIFY_SOURCE" ++;; ++esac ++ + # generate output files + AC_CONFIG_FILES(Makefile.pre Modules/Setup.config) + AC_OUTPUT diff --git a/plugins/python-build/share/python-build/patches/2.4.1/Python-2.4.1/002_patch-posixmodule.diff b/plugins/python-build/share/python-build/patches/2.4.1/Python-2.4.1/002_patch-posixmodule.diff new file mode 100644 index 0000000..800da16 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.4.1/Python-2.4.1/002_patch-posixmodule.diff @@ -0,0 +1,20 @@ +--- Modules/posixmodule.c.orig 2019-04-04 20:27:41.000000000 +0200 ++++ Modules/posixmodule.c 2019-04-04 20:28:07.000000000 +0200 +@@ -5300,7 +5300,7 @@ + Close a file descriptor (for low level IO)."); + + static PyObject * +-posix_close(PyObject *self, PyObject *args) ++posix_closex(PyObject *self, PyObject *args) + { + int fd, res; + if (!PyArg_ParseTuple(args, "i:close", &fd)) +@@ -7554,7 +7554,7 @@ + {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__}, + #endif /* HAVE_TCSETPGRP */ + {"open", posix_open, METH_VARARGS, posix_open__doc__}, +- {"close", posix_close, METH_VARARGS, posix_close__doc__}, ++ {"close", posix_closex, METH_VARARGS, posix_close__doc__}, + {"dup", posix_dup, METH_VARARGS, posix_dup__doc__}, + {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__}, + {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__}, \ No newline at end of file diff --git a/plugins/python-build/share/python-build/patches/2.4.2/Python-2.4.2/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.4.2/Python-2.4.2/000_patch-setup.py.diff new file mode 100644 index 0000000..ffe4b0d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.4.2/Python-2.4.2/000_patch-setup.py.diff @@ -0,0 +1,45 @@ +--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 ++++ setup.py 2011-07-07 19:25:04.548416377 +0900 +@@ -13,6 +13,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -242,10 +243,34 @@ + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ fp = open(tmpfile) ++ multiarch_path_component = fp.readline().strip() ++ fp.close() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. diff --git a/plugins/python-build/share/python-build/patches/2.4.2/Python-2.4.2/001_fortify_crash_workaround.diff b/plugins/python-build/share/python-build/patches/2.4.2/Python-2.4.2/001_fortify_crash_workaround.diff new file mode 100644 index 0000000..0e47919 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.4.2/Python-2.4.2/001_fortify_crash_workaround.diff @@ -0,0 +1,51 @@ +Author: Dwayne Litzenberger +Date: Sun Jun 22 01:15:05 2014 -0700 + + Patch configure to handle Ubuntu Bug#286334 + + Fixes this crash: + + *** buffer overflow detected ***: ./python terminated + ======= Backtrace: ========= + /lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x2b08765c9007] + +diff --git configure configure +index 4838393..654de3f 100755 +--- configure ++++ configure +@@ -20798,6 +20798,15 @@ done + echo "$as_me:$LINENO: result: done" >&5 + echo "${ECHO_T}done" >&6 + ++case $ac_sys_system in ++Linux*) ++# Workaround for bug in Ubuntu 10.10 amd64 gcc-4.4 ++# See http://orip.org/2008/10/building-python-235-on-ubuntu-intrepid.html ++# and Ubuntu Bug #286334 ++BASECFLAGS="$BASECFLAGS -U_FORTIFY_SOURCE" ++;; ++esac ++ + # generate output files + ac_config_files="$ac_config_files Makefile.pre Modules/Setup.config" + +diff --git configure.in configure.in +index ba7a011..060a73f 100644 +--- configure.in ++++ configure.in +@@ -3072,6 +3072,15 @@ for dir in $SRCDIRS; do + done + AC_MSG_RESULT(done) + ++case $ac_sys_system in ++Linux*) ++# Workaround for bug in Ubuntu 10.10 amd64 gcc-4.4 ++# See http://orip.org/2008/10/building-python-235-on-ubuntu-intrepid.html ++# and Ubuntu Bug #286334 ++BASECFLAGS="$BASECFLAGS -U_FORTIFY_SOURCE" ++;; ++esac ++ + # generate output files + AC_CONFIG_FILES(Makefile.pre Modules/Setup.config) + AC_OUTPUT diff --git a/plugins/python-build/share/python-build/patches/2.4.2/Python-2.4.2/002_patch-posixmodule.diff b/plugins/python-build/share/python-build/patches/2.4.2/Python-2.4.2/002_patch-posixmodule.diff new file mode 100644 index 0000000..800da16 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.4.2/Python-2.4.2/002_patch-posixmodule.diff @@ -0,0 +1,20 @@ +--- Modules/posixmodule.c.orig 2019-04-04 20:27:41.000000000 +0200 ++++ Modules/posixmodule.c 2019-04-04 20:28:07.000000000 +0200 +@@ -5300,7 +5300,7 @@ + Close a file descriptor (for low level IO)."); + + static PyObject * +-posix_close(PyObject *self, PyObject *args) ++posix_closex(PyObject *self, PyObject *args) + { + int fd, res; + if (!PyArg_ParseTuple(args, "i:close", &fd)) +@@ -7554,7 +7554,7 @@ + {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__}, + #endif /* HAVE_TCSETPGRP */ + {"open", posix_open, METH_VARARGS, posix_open__doc__}, +- {"close", posix_close, METH_VARARGS, posix_close__doc__}, ++ {"close", posix_closex, METH_VARARGS, posix_close__doc__}, + {"dup", posix_dup, METH_VARARGS, posix_dup__doc__}, + {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__}, + {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__}, \ No newline at end of file diff --git a/plugins/python-build/share/python-build/patches/2.4.3/Python-2.4.3/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.4.3/Python-2.4.3/000_patch-setup.py.diff new file mode 100644 index 0000000..ffe4b0d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.4.3/Python-2.4.3/000_patch-setup.py.diff @@ -0,0 +1,45 @@ +--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 ++++ setup.py 2011-07-07 19:25:04.548416377 +0900 +@@ -13,6 +13,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -242,10 +243,34 @@ + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ fp = open(tmpfile) ++ multiarch_path_component = fp.readline().strip() ++ fp.close() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. diff --git a/plugins/python-build/share/python-build/patches/2.4.3/Python-2.4.3/001_fortify_crash_workaround.diff b/plugins/python-build/share/python-build/patches/2.4.3/Python-2.4.3/001_fortify_crash_workaround.diff new file mode 100644 index 0000000..0e47919 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.4.3/Python-2.4.3/001_fortify_crash_workaround.diff @@ -0,0 +1,51 @@ +Author: Dwayne Litzenberger +Date: Sun Jun 22 01:15:05 2014 -0700 + + Patch configure to handle Ubuntu Bug#286334 + + Fixes this crash: + + *** buffer overflow detected ***: ./python terminated + ======= Backtrace: ========= + /lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x2b08765c9007] + +diff --git configure configure +index 4838393..654de3f 100755 +--- configure ++++ configure +@@ -20798,6 +20798,15 @@ done + echo "$as_me:$LINENO: result: done" >&5 + echo "${ECHO_T}done" >&6 + ++case $ac_sys_system in ++Linux*) ++# Workaround for bug in Ubuntu 10.10 amd64 gcc-4.4 ++# See http://orip.org/2008/10/building-python-235-on-ubuntu-intrepid.html ++# and Ubuntu Bug #286334 ++BASECFLAGS="$BASECFLAGS -U_FORTIFY_SOURCE" ++;; ++esac ++ + # generate output files + ac_config_files="$ac_config_files Makefile.pre Modules/Setup.config" + +diff --git configure.in configure.in +index ba7a011..060a73f 100644 +--- configure.in ++++ configure.in +@@ -3072,6 +3072,15 @@ for dir in $SRCDIRS; do + done + AC_MSG_RESULT(done) + ++case $ac_sys_system in ++Linux*) ++# Workaround for bug in Ubuntu 10.10 amd64 gcc-4.4 ++# See http://orip.org/2008/10/building-python-235-on-ubuntu-intrepid.html ++# and Ubuntu Bug #286334 ++BASECFLAGS="$BASECFLAGS -U_FORTIFY_SOURCE" ++;; ++esac ++ + # generate output files + AC_CONFIG_FILES(Makefile.pre Modules/Setup.config) + AC_OUTPUT diff --git a/plugins/python-build/share/python-build/patches/2.4.3/Python-2.4.3/002_patch-posixmodule.diff b/plugins/python-build/share/python-build/patches/2.4.3/Python-2.4.3/002_patch-posixmodule.diff new file mode 100644 index 0000000..800da16 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.4.3/Python-2.4.3/002_patch-posixmodule.diff @@ -0,0 +1,20 @@ +--- Modules/posixmodule.c.orig 2019-04-04 20:27:41.000000000 +0200 ++++ Modules/posixmodule.c 2019-04-04 20:28:07.000000000 +0200 +@@ -5300,7 +5300,7 @@ + Close a file descriptor (for low level IO)."); + + static PyObject * +-posix_close(PyObject *self, PyObject *args) ++posix_closex(PyObject *self, PyObject *args) + { + int fd, res; + if (!PyArg_ParseTuple(args, "i:close", &fd)) +@@ -7554,7 +7554,7 @@ + {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__}, + #endif /* HAVE_TCSETPGRP */ + {"open", posix_open, METH_VARARGS, posix_open__doc__}, +- {"close", posix_close, METH_VARARGS, posix_close__doc__}, ++ {"close", posix_closex, METH_VARARGS, posix_close__doc__}, + {"dup", posix_dup, METH_VARARGS, posix_dup__doc__}, + {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__}, + {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__}, \ No newline at end of file diff --git a/plugins/python-build/share/python-build/patches/2.4.4/Python-2.4.4/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.4.4/Python-2.4.4/000_patch-setup.py.diff new file mode 100644 index 0000000..ffe4b0d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.4.4/Python-2.4.4/000_patch-setup.py.diff @@ -0,0 +1,45 @@ +--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 ++++ setup.py 2011-07-07 19:25:04.548416377 +0900 +@@ -13,6 +13,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -242,10 +243,34 @@ + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ fp = open(tmpfile) ++ multiarch_path_component = fp.readline().strip() ++ fp.close() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. diff --git a/plugins/python-build/share/python-build/patches/2.4.4/Python-2.4.4/001_patch-posixmodule.diff b/plugins/python-build/share/python-build/patches/2.4.4/Python-2.4.4/001_patch-posixmodule.diff new file mode 100644 index 0000000..800da16 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.4.4/Python-2.4.4/001_patch-posixmodule.diff @@ -0,0 +1,20 @@ +--- Modules/posixmodule.c.orig 2019-04-04 20:27:41.000000000 +0200 ++++ Modules/posixmodule.c 2019-04-04 20:28:07.000000000 +0200 +@@ -5300,7 +5300,7 @@ + Close a file descriptor (for low level IO)."); + + static PyObject * +-posix_close(PyObject *self, PyObject *args) ++posix_closex(PyObject *self, PyObject *args) + { + int fd, res; + if (!PyArg_ParseTuple(args, "i:close", &fd)) +@@ -7554,7 +7554,7 @@ + {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__}, + #endif /* HAVE_TCSETPGRP */ + {"open", posix_open, METH_VARARGS, posix_open__doc__}, +- {"close", posix_close, METH_VARARGS, posix_close__doc__}, ++ {"close", posix_closex, METH_VARARGS, posix_close__doc__}, + {"dup", posix_dup, METH_VARARGS, posix_dup__doc__}, + {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__}, + {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__}, \ No newline at end of file diff --git a/plugins/python-build/share/python-build/patches/2.4.5/Python-2.4.5/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.4.5/Python-2.4.5/000_patch-setup.py.diff new file mode 100644 index 0000000..ffe4b0d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.4.5/Python-2.4.5/000_patch-setup.py.diff @@ -0,0 +1,45 @@ +--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 ++++ setup.py 2011-07-07 19:25:04.548416377 +0900 +@@ -13,6 +13,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -242,10 +243,34 @@ + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ fp = open(tmpfile) ++ multiarch_path_component = fp.readline().strip() ++ fp.close() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. diff --git a/plugins/python-build/share/python-build/patches/2.4.5/Python-2.4.5/001_patch-posixmodule.diff b/plugins/python-build/share/python-build/patches/2.4.5/Python-2.4.5/001_patch-posixmodule.diff new file mode 100644 index 0000000..800da16 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.4.5/Python-2.4.5/001_patch-posixmodule.diff @@ -0,0 +1,20 @@ +--- Modules/posixmodule.c.orig 2019-04-04 20:27:41.000000000 +0200 ++++ Modules/posixmodule.c 2019-04-04 20:28:07.000000000 +0200 +@@ -5300,7 +5300,7 @@ + Close a file descriptor (for low level IO)."); + + static PyObject * +-posix_close(PyObject *self, PyObject *args) ++posix_closex(PyObject *self, PyObject *args) + { + int fd, res; + if (!PyArg_ParseTuple(args, "i:close", &fd)) +@@ -7554,7 +7554,7 @@ + {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__}, + #endif /* HAVE_TCSETPGRP */ + {"open", posix_open, METH_VARARGS, posix_open__doc__}, +- {"close", posix_close, METH_VARARGS, posix_close__doc__}, ++ {"close", posix_closex, METH_VARARGS, posix_close__doc__}, + {"dup", posix_dup, METH_VARARGS, posix_dup__doc__}, + {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__}, + {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__}, \ No newline at end of file diff --git a/plugins/python-build/share/python-build/patches/2.4.6/Python-2.4.6/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.4.6/Python-2.4.6/000_patch-setup.py.diff new file mode 100644 index 0000000..ffe4b0d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.4.6/Python-2.4.6/000_patch-setup.py.diff @@ -0,0 +1,45 @@ +--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 ++++ setup.py 2011-07-07 19:25:04.548416377 +0900 +@@ -13,6 +13,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -242,10 +243,34 @@ + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ fp = open(tmpfile) ++ multiarch_path_component = fp.readline().strip() ++ fp.close() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. diff --git a/plugins/python-build/share/python-build/patches/2.4.6/Python-2.4.6/001_patch-posixmodule.diff b/plugins/python-build/share/python-build/patches/2.4.6/Python-2.4.6/001_patch-posixmodule.diff new file mode 100644 index 0000000..800da16 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.4.6/Python-2.4.6/001_patch-posixmodule.diff @@ -0,0 +1,20 @@ +--- Modules/posixmodule.c.orig 2019-04-04 20:27:41.000000000 +0200 ++++ Modules/posixmodule.c 2019-04-04 20:28:07.000000000 +0200 +@@ -5300,7 +5300,7 @@ + Close a file descriptor (for low level IO)."); + + static PyObject * +-posix_close(PyObject *self, PyObject *args) ++posix_closex(PyObject *self, PyObject *args) + { + int fd, res; + if (!PyArg_ParseTuple(args, "i:close", &fd)) +@@ -7554,7 +7554,7 @@ + {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__}, + #endif /* HAVE_TCSETPGRP */ + {"open", posix_open, METH_VARARGS, posix_open__doc__}, +- {"close", posix_close, METH_VARARGS, posix_close__doc__}, ++ {"close", posix_closex, METH_VARARGS, posix_close__doc__}, + {"dup", posix_dup, METH_VARARGS, posix_dup__doc__}, + {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__}, + {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__}, \ No newline at end of file diff --git a/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/000_patch-setup.py.diff new file mode 100644 index 0000000..ffe4b0d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/000_patch-setup.py.diff @@ -0,0 +1,45 @@ +--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 ++++ setup.py 2011-07-07 19:25:04.548416377 +0900 +@@ -13,6 +13,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -242,10 +243,34 @@ + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ fp = open(tmpfile) ++ multiarch_path_component = fp.readline().strip() ++ fp.close() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. diff --git a/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/001_patch-svnversion.patch b/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/001_patch-svnversion.patch new file mode 100644 index 0000000..d5d9542 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/001_patch-svnversion.patch @@ -0,0 +1,47 @@ +diff -r -u ./Makefile.pre.in ../Python-2.5/Makefile.pre.in +--- ./Makefile.pre.in 2006-07-31 01:20:10.000000000 +0900 ++++ ../Python-2.5/Makefile.pre.in 2013-05-08 19:19:27.000000000 +0900 +@@ -455,7 +455,7 @@ + $(SIGNAL_OBJS) \ + $(MODOBJS) \ + $(srcdir)/Modules/getbuildinfo.c +- $(CC) -c $(PY_CFLAGS) -DSVNVERSION=\"`LANG=C $(SVNVERSION)`\" -o $@ $(srcdir)/Modules/getbuildinfo.c ++ $(CC) -c $(PY_CFLAGS) -DSVNVERSION="\"`LANG=C $(SVNVERSION)`\"" -o $@ $(srcdir)/Modules/getbuildinfo.c + + Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile + $(CC) -c $(PY_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ +diff -r -u ./Modules/getbuildinfo.c ../Python-2.5/Modules/getbuildinfo.c +--- ./Modules/getbuildinfo.c 2006-01-18 18:13:51.000000000 +0900 ++++ ../Python-2.5/Modules/getbuildinfo.c 2013-05-08 19:19:40.000000000 +0900 +@@ -43,6 +43,6 @@ + #ifdef SVNVERSION + return SVNVERSION; + #else +- return "exported"; ++ return "Unversioned directory"; + #endif + } +diff -r -u ./Python/sysmodule.c ../Python-2.5/Python/sysmodule.c +--- ./Python/sysmodule.c 2006-07-21 14:32:28.000000000 +0900 ++++ ../Python-2.5/Python/sysmodule.c 2013-05-08 19:19:55.000000000 +0900 +@@ -1009,7 +1009,7 @@ + + + svnversion = _Py_svnversion(); +- if (strcmp(svnversion, "exported") != 0) ++ if (strcmp(svnversion, "Unversioned directory") != 0) + svn_revision = svnversion; + else if (istag) { + len = strlen(_patchlevel_revision); +diff -r -u ./configure.in ../Python-2.5/configure.in +--- ./configure.in 2006-09-05 11:54:42.000000000 +0900 ++++ ../Python-2.5/configure.in 2013-05-08 19:20:05.000000000 +0900 +@@ -686,7 +686,7 @@ + then + SVNVERSION="svnversion \$(srcdir)" + else +- SVNVERSION="echo exported" ++ SVNVERSION="echo Unversioned directory" + fi + + case $MACHDEP in diff --git a/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/002_darwin_c_source.patch b/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/002_darwin_c_source.patch new file mode 100644 index 0000000..8cef44a --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/002_darwin_c_source.patch @@ -0,0 +1,166 @@ +diff -r -u ./configure ../Python-2.5/configure +--- ./configure 2006-09-05 11:54:42.000000000 +0900 ++++ ../Python-2.5/configure 2013-07-19 15:27:46.000000000 +0900 +@@ -1396,6 +1396,16 @@ + _ACEOF + + ++# The later defininition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables ++# certain features on Mac OS X, so we need _DARWIN_C_SOURCE to re-enable ++# them. ++ ++cat >>confdefs.h <<\_ACEOF ++#define _DARWIN_C_SOURCE 1 ++_ACEOF ++ ++ ++ + define_xopen_source=yes + + # Arguments passed to configure. +@@ -3885,11 +3895,110 @@ + ;; + # is there any other compiler on Darwin besides gcc? + Darwin*) +- BASECFLAGS="$BASECFLAGS -Wno-long-double -no-cpp-precomp -mno-fused-madd" ++ # -Wno-long-double, -no-cpp-precomp, and -mno-fused-madd ++ # used to be here, but non-Apple gcc doesn't accept them. ++ if test "${CC}" = gcc ++ then ++ { echo "$as_me:${as_lineno-$LINENO}: checking which compiler should be used" >&5 ++echo -n "checking which compiler should be used... " >&6; } ++ case "${UNIVERSALSDK}" in ++ */MacOSX10.4u.sdk) ++ # Build using 10.4 SDK, force usage of gcc when the ++ # compiler is gcc, otherwise the user will get very ++ # confusing error messages when building on OSX 10.6 ++ CC=gcc-4.0 ++ CPP=cpp-4.0 ++ ;; ++ esac ++ { echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 ++echo "$CC" >&6; } ++ fi ++ ++ + if test "${enable_universalsdk}"; then +- BASECFLAGS="-arch ppc -arch i386 -isysroot ${UNIVERSALSDK} ${BASECFLAGS}" ++ UNIVERSAL_ARCH_FLAGS="" ++ if test "$UNIVERSAL_ARCHS" = "32-bit" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch ppc -arch i386" ++ ARCH_RUN_32BIT="" ++ LIPO_32BIT_FLAGS="" ++ elif test "$UNIVERSAL_ARCHS" = "64-bit" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64" ++ LIPO_32BIT_FLAGS="" ++ ARCH_RUN_32BIT="true" ++ ++ elif test "$UNIVERSAL_ARCHS" = "all" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64" ++ LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" ++ ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" ++ ++ elif test "$UNIVERSAL_ARCHS" = "intel" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64" ++ LIPO_32BIT_FLAGS="-extract i386" ++ ARCH_RUN_32BIT="/usr/bin/arch -i386" ++ ++ elif test "$UNIVERSAL_ARCHS" = "3-way" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch x86_64" ++ LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" ++ ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" ++ ++ else ++ as_fn_error $? "proper usage is --with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5 ++ ++ fi ++ ++ ++ CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" ++ if test "${UNIVERSALSDK}" != "/" ++ then ++ CFLAGS="-isysroot ${UNIVERSALSDK} ${CFLAGS}" ++ LDFLAGS="-isysroot ${UNIVERSALSDK} ${LDFLAGS}" ++ CPPFLAGS="-isysroot ${UNIVERSALSDK} ${CPPFLAGS}" ++ fi + fi + ++ # Calculate the right deployment target for this build. ++ # ++ cur_target=`sw_vers -productVersion | sed 's/\(10\.[0-9]*\).*/\1/'` ++ if test ${cur_target} '>' 10.2 && \ ++ test ${cur_target} '<' 10.6 ++ then ++ cur_target=10.3 ++ if test ${enable_universalsdk}; then ++ if test "${UNIVERSAL_ARCHS}" = "all"; then ++ # Ensure that the default platform for a ++ # 4-way universal build is OSX 10.5, ++ # that's the first OS release where ++ # 4-way builds make sense. ++ cur_target='10.5' ++ ++ elif test "${UNIVERSAL_ARCHS}" = "3-way"; then ++ cur_target='10.5' ++ ++ elif test "${UNIVERSAL_ARCHS}" = "intel"; then ++ cur_target='10.5' ++ ++ elif test "${UNIVERSAL_ARCHS}" = "64-bit"; then ++ cur_target='10.5' ++ fi ++ else ++ if test `/usr/bin/arch` = "i386"; then ++ # On Intel macs default to a deployment ++ # target of 10.4, that's the first OSX ++ # release with Intel support. ++ cur_target="10.4" ++ fi ++ fi ++ fi ++ CONFIGURE_MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET-${cur_target}} ++ ++ # Make sure that MACOSX_DEPLOYMENT_TARGET is set in the ++ # environment with a value that is the same as what we'll use ++ # in the Makefile to ensure that we'll get the same compiler ++ # environment during configure and build time. ++ MACOSX_DEPLOYMENT_TARGET="$CONFIGURE_MACOSX_DEPLOYMENT_TARGET" ++ export MACOSX_DEPLOYMENT_TARGET ++ EXPORT_MACOSX_DEPLOYMENT_TARGET='' ++ + ;; + OSF*) + BASECFLAGS="$BASECFLAGS -mieee" +@@ -10851,7 +10960,7 @@ + if test "${enable_universalsdk}"; then + : + else +- LIBTOOL_CRUFT="${LIBTOOL_CRUFT} -arch_only `arch`" ++ LIBTOOL_CRUFT="${LIBTOOL_CRUFT}" + fi + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; +@@ -10863,7 +10972,7 @@ + else + LIBTOOL_CRUFT="" + fi +- LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs -arch_only `arch`" ++ LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs" + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; + esac +diff -r -u ./pyconfig.h.in ../Python-2.5/pyconfig.h.in +--- ./pyconfig.h.in 2006-07-30 23:09:47.000000000 +0900 ++++ ../Python-2.5/pyconfig.h.in 2013-07-17 23:12:31.000000000 +0900 +@@ -912,6 +912,11 @@ + /* Define on Irix to enable u_int */ + #undef _BSD_TYPES + ++/* Define on Darwin to activate all library features */ ++#ifndef _DARWIN_C_SOURCE ++#define _DARWIN_C_SOURCE ++#endif ++ + /* This must be set to 64 on some systems to enable large file support. */ + #undef _FILE_OFFSET_BITS + diff --git a/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/003_osx_lp64.patch b/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/003_osx_lp64.patch new file mode 100644 index 0000000..fc07fc1 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/003_osx_lp64.patch @@ -0,0 +1,271 @@ +diff -r -u ./Include/pymactoolbox.h ../Python-2.5/Include/pymactoolbox.h +--- ./Include/pymactoolbox.h 2004-11-05 16:02:59.000000000 +0900 ++++ ../Python-2.5/Include/pymactoolbox.h 2013-07-17 23:38:51.000000000 +0900 +@@ -8,7 +8,10 @@ + #endif + + #include ++ ++#ifndef __LP64__ + #include ++#endif /* !__LP64__ */ + + /* + ** Helper routines for error codes and such. +@@ -18,8 +21,11 @@ + PyObject *PyMac_GetOSErrException(void); /* Initialize & return it */ + PyObject *PyErr_Mac(PyObject *, int); /* Exception with a mac error */ + PyObject *PyMac_Error(OSErr); /* Uses PyMac_GetOSErrException */ ++#ifndef __LP64__ + extern OSErr PyMac_GetFullPathname(FSSpec *, char *, int); /* convert + fsspec->path */ ++#endif /* __LP64__ */ ++ + /* + ** These conversion routines are defined in mactoolboxglue.c itself. + */ +@@ -83,8 +89,10 @@ + #endif /* USE_TOOLBOX_OBJECT_GLUE */ + + /* macfs exports */ ++#ifndef __LP64__ + int PyMac_GetFSSpec(PyObject *, FSSpec *); /* argument parser for FSSpec */ + PyObject *PyMac_BuildFSSpec(FSSpec *); /* Convert FSSpec to PyObject */ ++#endif /* !__LP64__ */ + + int PyMac_GetFSRef(PyObject *, FSRef *); /* argument parser for FSRef */ + PyObject *PyMac_BuildFSRef(FSRef *); /* Convert FSRef to PyObject */ +@@ -101,39 +109,54 @@ + extern int CmpInstObj_Convert(PyObject *, ComponentInstance *); + + /* Ctl exports */ ++#ifndef __LP64__ + extern PyObject *CtlObj_New(ControlHandle); + extern int CtlObj_Convert(PyObject *, ControlHandle *); ++#endif /* !__LP64__ */ + + /* Dlg exports */ ++#ifndef __LP64__ + extern PyObject *DlgObj_New(DialogPtr); + extern int DlgObj_Convert(PyObject *, DialogPtr *); + extern PyObject *DlgObj_WhichDialog(DialogPtr); ++#endif /* !__LP64__ */ + + /* Drag exports */ ++#ifndef __LP64__ + extern PyObject *DragObj_New(DragReference); + extern int DragObj_Convert(PyObject *, DragReference *); ++#endif /* !__LP64__ */ + + /* List exports */ ++#ifndef __LP64__ + extern PyObject *ListObj_New(ListHandle); + extern int ListObj_Convert(PyObject *, ListHandle *); ++#endif /* !__LP64__ */ + + /* Menu exports */ ++#ifndef __LP64__ + extern PyObject *MenuObj_New(MenuHandle); + extern int MenuObj_Convert(PyObject *, MenuHandle *); ++#endif /* !__LP64__ */ + + /* Qd exports */ ++#ifndef __LP64__ + extern PyObject *GrafObj_New(GrafPtr); + extern int GrafObj_Convert(PyObject *, GrafPtr *); + extern PyObject *BMObj_New(BitMapPtr); + extern int BMObj_Convert(PyObject *, BitMapPtr *); + extern PyObject *QdRGB_New(RGBColor *); + extern int QdRGB_Convert(PyObject *, RGBColor *); ++#endif /* !__LP64__ */ + + /* Qdoffs exports */ ++#ifndef __LP64__ + extern PyObject *GWorldObj_New(GWorldPtr); + extern int GWorldObj_Convert(PyObject *, GWorldPtr *); ++#endif /* !__LP64__ */ + + /* Qt exports */ ++#ifndef __LP64__ + extern PyObject *TrackObj_New(Track); + extern int TrackObj_Convert(PyObject *, Track *); + extern PyObject *MovieObj_New(Movie); +@@ -146,6 +169,7 @@ + extern int UserDataObj_Convert(PyObject *, UserData *); + extern PyObject *MediaObj_New(Media); + extern int MediaObj_Convert(PyObject *, Media *); ++#endif /* !__LP64__ */ + + /* Res exports */ + extern PyObject *ResObj_New(Handle); +@@ -154,13 +178,17 @@ + extern int OptResObj_Convert(PyObject *, Handle *); + + /* TE exports */ ++#ifndef __LP64__ + extern PyObject *TEObj_New(TEHandle); + extern int TEObj_Convert(PyObject *, TEHandle *); ++#endif /* !__LP64__ */ + + /* Win exports */ ++#ifndef __LP64__ + extern PyObject *WinObj_New(WindowPtr); + extern int WinObj_Convert(PyObject *, WindowPtr *); + extern PyObject *WinObj_WhichWindow(WindowPtr); ++#endif /* !__LP64__ */ + + /* CF exports */ + extern PyObject *CFObj_New(CFTypeRef); +diff -r -u ./Mac/Modules/res/_Resmodule.c ../Python-2.5/Mac/Modules/res/_Resmodule.c +--- ./Mac/Modules/res/_Resmodule.c 2005-07-04 05:59:44.000000000 +0900 ++++ ../Python-2.5/Mac/Modules/res/_Resmodule.c 2013-07-17 23:38:51.000000000 +0900 +@@ -414,6 +414,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *ResObj_as_Control(ResourceObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -431,6 +432,7 @@ + return _res; + + } ++#endif /* !__LP64__ */ + + static PyObject *ResObj_LoadResource(ResourceObject *_self, PyObject *_args) + { +@@ -1152,6 +1154,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *Res_OpenRFPerm(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1287,6 +1290,7 @@ + _res = Py_None; + return _res; + } ++#endif /* !__LP64__ */ + + static PyObject *Res_InsertResourceFile(PyObject *_self, PyObject *_args) + { +@@ -1327,6 +1331,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *Res_FSpResourceFileAlreadyOpen(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1413,6 +1418,7 @@ + nextRefNum); + return _res; + } ++#endif /* !__LP64__ */ + + static PyObject *Res_FSOpenResFile(PyObject *_self, PyObject *_args) + { +@@ -1438,6 +1444,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *Res_FSCreateResFile(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1534,6 +1541,7 @@ + PyMac_BuildFSSpec, &newSpec); + return _res; + } ++#endif /* __LP64__ */ + + static PyObject *Res_FSOpenResourceFile(PyObject *_self, PyObject *_args) + { +@@ -1637,6 +1645,7 @@ + PyDoc_STR("(short refNum) -> (short _rv)")}, + {"SetResFileAttrs", (PyCFunction)Res_SetResFileAttrs, 1, + PyDoc_STR("(short refNum, short attrs) -> None")}, ++#ifndef __LP64__ + {"OpenRFPerm", (PyCFunction)Res_OpenRFPerm, 1, + PyDoc_STR("(Str255 fileName, short vRefNum, SignedByte permission) -> (short _rv)")}, + {"HOpenResFile", (PyCFunction)Res_HOpenResFile, 1, +@@ -1647,10 +1656,12 @@ + PyDoc_STR("(FSSpec spec, SignedByte permission) -> (short _rv)")}, + {"FSpCreateResFile", (PyCFunction)Res_FSpCreateResFile, 1, + PyDoc_STR("(FSSpec spec, OSType creator, OSType fileType, ScriptCode scriptTag) -> None")}, ++#endif /* !__LP64__ */ + {"InsertResourceFile", (PyCFunction)Res_InsertResourceFile, 1, + PyDoc_STR("(SInt16 refNum, RsrcChainLocation where) -> None")}, + {"DetachResourceFile", (PyCFunction)Res_DetachResourceFile, 1, + PyDoc_STR("(SInt16 refNum) -> None")}, ++#ifndef __LP64__ + {"FSpResourceFileAlreadyOpen", (PyCFunction)Res_FSpResourceFileAlreadyOpen, 1, + PyDoc_STR("(FSSpec resourceFile) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, + {"FSpOpenOrphanResFile", (PyCFunction)Res_FSpOpenOrphanResFile, 1, +@@ -1659,14 +1670,17 @@ + PyDoc_STR("() -> (SInt16 refNum)")}, + {"GetNextResourceFile", (PyCFunction)Res_GetNextResourceFile, 1, + PyDoc_STR("(SInt16 curRefNum) -> (SInt16 nextRefNum)")}, ++#endif /* __LP64__ */ + {"FSOpenResFile", (PyCFunction)Res_FSOpenResFile, 1, + PyDoc_STR("(FSRef ref, SignedByte permission) -> (short _rv)")}, ++#ifndef __LP64__ + {"FSCreateResFile", (PyCFunction)Res_FSCreateResFile, 1, + PyDoc_STR("(FSRef parentRef, Buffer nameLength) -> (FSRef newRef, FSSpec newSpec)")}, + {"FSResourceFileAlreadyOpen", (PyCFunction)Res_FSResourceFileAlreadyOpen, 1, + PyDoc_STR("(FSRef resourceFileRef) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, + {"FSCreateResourceFile", (PyCFunction)Res_FSCreateResourceFile, 1, + PyDoc_STR("(FSRef parentRef, Buffer nameLength, Buffer forkNameLength) -> (FSRef newRef, FSSpec newSpec)")}, ++#endif /* __LP64__ */ + {"FSOpenResourceFile", (PyCFunction)Res_FSOpenResourceFile, 1, + PyDoc_STR("(FSRef ref, Buffer forkNameLength, SignedByte permissions) -> (SInt16 refNum)")}, + {"Handle", (PyCFunction)Res_Handle, 1, +diff -r -u ./Modules/_ctypes/libffi/src/darwin/ffitarget.h ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h +--- ./Modules/_ctypes/libffi/src/darwin/ffitarget.h 2006-05-26 06:58:05.000000000 +0900 ++++ ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h 2013-07-17 23:38:51.000000000 +0900 +@@ -4,7 +4,7 @@ + * created by configure). This makes is possible to build a univeral binary + * of ctypes in one go. + */ +-#if defined(__i386__) ++#if defined(__i386__) || defined(__x86_64__) + + #ifndef X86_DARWIN + #define X86_DARWIN +diff -r -u ./Python/mactoolboxglue.c ../Python-2.5/Python/mactoolboxglue.c +--- ./Python/mactoolboxglue.c 2006-07-12 01:44:25.000000000 +0900 ++++ ../Python-2.5/Python/mactoolboxglue.c 2013-07-17 23:39:09.000000000 +0900 +@@ -106,6 +106,7 @@ + } + + ++#ifndef __LP64__ + OSErr + PyMac_GetFullPathname(FSSpec *fss, char *path, int len) + { +@@ -153,6 +154,7 @@ + Py_XDECREF(fs); + return err; + } ++#endif /* !__LP64__ */ + + /* Convert a 4-char string object argument to an OSType value */ + int +@@ -417,6 +419,7 @@ + GLUE_NEW(GWorldPtr, GWorldObj_New, "Carbon.Qdoffs") + GLUE_CONVERT(GWorldPtr, GWorldObj_Convert, "Carbon.Qdoffs") + ++#ifndef __LP64__ + GLUE_NEW(Track, TrackObj_New, "Carbon.Qt") + GLUE_CONVERT(Track, TrackObj_Convert, "Carbon.Qt") + GLUE_NEW(Movie, MovieObj_New, "Carbon.Qt") +@@ -429,6 +432,7 @@ + GLUE_CONVERT(UserData, UserDataObj_Convert, "Carbon.Qt") + GLUE_NEW(Media, MediaObj_New, "Carbon.Qt") + GLUE_CONVERT(Media, MediaObj_Convert, "Carbon.Qt") ++#endif /* !__LP64__ */ + + GLUE_NEW(Handle, ResObj_New, "Carbon.Res") + GLUE_CONVERT(Handle, ResObj_Convert, "Carbon.Res") diff --git a/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/004_osx_libffi.patch b/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/004_osx_libffi.patch new file mode 100644 index 0000000..8318432 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/004_osx_libffi.patch @@ -0,0 +1,6881 @@ +diff -r -u ./Modules/_ctypes/libffi_osx/LICENSE ./Modules/_ctypes/libffi_osx/LICENSE +new file mode 100644 +index 0000000..f591795 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/LICENSE +@@ -0,0 +1,20 @@ ++libffi - Copyright (c) 1996-2003 Red Hat, Inc. ++ ++Permission is hereby granted, free of charge, to any person obtaining ++a copy of this software and associated documentation files (the ++``Software''), to deal in the Software without restriction, including ++without limitation the rights to use, copy, modify, merge, publish, ++distribute, sublicense, and/or sell copies of the Software, and to ++permit persons to whom the Software is furnished to do so, subject to ++the following conditions: ++ ++The above copyright notice and this permission notice shall be included ++in all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++OTHER DEALINGS IN THE SOFTWARE. +diff -r -u ./Modules/_ctypes/libffi_osx/README ./Modules/_ctypes/libffi_osx/README +new file mode 100644 +index 0000000..1fc2747 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/README +@@ -0,0 +1,500 @@ ++This directory contains the libffi package, which is not part of GCC but ++shipped with GCC as convenience. ++ ++Status ++====== ++ ++libffi-2.00 has not been released yet! This is a development snapshot! ++ ++libffi-1.20 was released on October 5, 1998. Check the libffi web ++page for updates: . ++ ++ ++What is libffi? ++=============== ++ ++Compilers for high level languages generate code that follow certain ++conventions. These conventions are necessary, in part, for separate ++compilation to work. One such convention is the "calling ++convention". The "calling convention" is essentially a set of ++assumptions made by the compiler about where function arguments will ++be found on entry to a function. A "calling convention" also specifies ++where the return value for a function is found. ++ ++Some programs may not know at the time of compilation what arguments ++are to be passed to a function. For instance, an interpreter may be ++told at run-time about the number and types of arguments used to call ++a given function. Libffi can be used in such programs to provide a ++bridge from the interpreter program to compiled code. ++ ++The libffi library provides a portable, high level programming ++interface to various calling conventions. This allows a programmer to ++call any function specified by a call interface description at run ++time. ++ ++Ffi stands for Foreign Function Interface. A foreign function ++interface is the popular name for the interface that allows code ++written in one language to call code written in another language. The ++libffi library really only provides the lowest, machine dependent ++layer of a fully featured foreign function interface. A layer must ++exist above libffi that handles type conversions for values passed ++between the two languages. ++ ++ ++Supported Platforms and Prerequisites ++===================================== ++ ++Libffi has been ported to: ++ ++ SunOS 4.1.3 & Solaris 2.x (SPARC-V8, SPARC-V9) ++ ++ Irix 5.3 & 6.2 (System V/o32 & n32) ++ ++ Intel x86 - Linux (System V ABI) ++ ++ Alpha - Linux and OSF/1 ++ ++ m68k - Linux (System V ABI) ++ ++ PowerPC - Linux (System V ABI, Darwin, AIX) ++ ++ ARM - Linux (System V ABI) ++ ++Libffi has been tested with the egcs 1.0.2 gcc compiler. Chances are ++that other versions will work. Libffi has also been built and tested ++with the SGI compiler tools. ++ ++On PowerPC, the tests failed (see the note below). ++ ++You must use GNU make to build libffi. SGI's make will not work. ++Sun's probably won't either. ++ ++If you port libffi to another platform, please let me know! I assume ++that some will be easy (x86 NetBSD), and others will be more difficult ++(HP). ++ ++ ++Installing libffi ++================= ++ ++[Note: before actually performing any of these installation steps, ++ you may wish to read the "Platform Specific Notes" below.] ++ ++First you must configure the distribution for your particular ++system. Go to the directory you wish to build libffi in and run the ++"configure" program found in the root directory of the libffi source ++distribution. ++ ++You may want to tell configure where to install the libffi library and ++header files. To do that, use the --prefix configure switch. Libffi ++will install under /usr/local by default. ++ ++If you want to enable extra run-time debugging checks use the the ++--enable-debug configure switch. This is useful when your program dies ++mysteriously while using libffi. ++ ++Another useful configure switch is --enable-purify-safety. Using this ++will add some extra code which will suppress certain warnings when you ++are using Purify with libffi. Only use this switch when using ++Purify, as it will slow down the library. ++ ++Configure has many other options. Use "configure --help" to see them all. ++ ++Once configure has finished, type "make". Note that you must be using ++GNU make. SGI's make will not work. Sun's probably won't either. ++You can ftp GNU make from prep.ai.mit.edu:/pub/gnu. ++ ++To ensure that libffi is working as advertised, type "make test". ++ ++To install the library and header files, type "make install". ++ ++ ++Using libffi ++============ ++ ++ The Basics ++ ---------- ++ ++Libffi assumes that you have a pointer to the function you wish to ++call and that you know the number and types of arguments to pass it, ++as well as the return type of the function. ++ ++The first thing you must do is create an ffi_cif object that matches ++the signature of the function you wish to call. The cif in ffi_cif ++stands for Call InterFace. To prepare a call interface object, use the ++following function: ++ ++ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, ++ unsigned int nargs, ++ ffi_type *rtype, ffi_type **atypes); ++ ++ CIF is a pointer to the call interface object you wish ++ to initialize. ++ ++ ABI is an enum that specifies the calling convention ++ to use for the call. FFI_DEFAULT_ABI defaults ++ to the system's native calling convention. Other ++ ABI's may be used with care. They are system ++ specific. ++ ++ NARGS is the number of arguments this function accepts. ++ libffi does not yet support vararg functions. ++ ++ RTYPE is a pointer to an ffi_type structure that represents ++ the return type of the function. Ffi_type objects ++ describe the types of values. libffi provides ++ ffi_type objects for many of the native C types: ++ signed int, unsigned int, signed char, unsigned char, ++ etc. There is also a pointer ffi_type object and ++ a void ffi_type. Use &ffi_type_void for functions that ++ don't return values. ++ ++ ATYPES is a vector of ffi_type pointers. ARGS must be NARGS long. ++ If NARGS is 0, this is ignored. ++ ++ ++ffi_prep_cif will return a status code that you are responsible ++for checking. It will be one of the following: ++ ++ FFI_OK - All is good. ++ ++ FFI_BAD_TYPEDEF - One of the ffi_type objects that ffi_prep_cif ++ came across is bad. ++ ++ ++Before making the call, the VALUES vector should be initialized ++with pointers to the appropriate argument values. ++ ++To call the function using the initialized ffi_cif, use the ++ffi_call function: ++ ++void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues); ++ ++ CIF is a pointer to the ffi_cif initialized specifically ++ for this function. ++ ++ FN is a pointer to the function you want to call. ++ ++ RVALUE is a pointer to a chunk of memory that is to hold the ++ result of the function call. Currently, it must be ++ at least one word in size (except for the n32 version ++ under Irix 6.x, which must be a pointer to an 8 byte ++ aligned value (a long long). It must also be at least ++ word aligned (depending on the return type, and the ++ system's alignment requirements). If RTYPE is ++ &ffi_type_void, this is ignored. If RVALUE is NULL, ++ the return value is discarded. ++ ++ AVALUES is a vector of void* that point to the memory locations ++ holding the argument values for a call. ++ If NARGS is 0, this is ignored. ++ ++ ++If you are expecting a return value from FN it will have been stored ++at RVALUE. ++ ++ ++ ++ An Example ++ ---------- ++ ++Here is a trivial example that calls puts() a few times. ++ ++ #include ++ #include ++ ++ int main() ++ { ++ ffi_cif cif; ++ ffi_type *args[1]; ++ void *values[1]; ++ char *s; ++ int rc; ++ ++ /* Initialize the argument info vectors */ ++ args[0] = &ffi_type_uint; ++ values[0] = &s; ++ ++ /* Initialize the cif */ ++ if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, ++ &ffi_type_uint, args) == FFI_OK) ++ { ++ s = "Hello World!"; ++ ffi_call(&cif, puts, &rc, values); ++ /* rc now holds the result of the call to puts */ ++ ++ /* values holds a pointer to the function's arg, so to ++ call puts() again all we need to do is change the ++ value of s */ ++ s = "This is cool!"; ++ ffi_call(&cif, puts, &rc, values); ++ } ++ ++ return 0; ++ } ++ ++ ++ ++ Aggregate Types ++ --------------- ++ ++Although libffi has no special support for unions or bit-fields, it is ++perfectly happy passing structures back and forth. You must first ++describe the structure to libffi by creating a new ffi_type object ++for it. Here is the definition of ffi_type: ++ ++ typedef struct _ffi_type ++ { ++ unsigned size; ++ short alignment; ++ short type; ++ struct _ffi_type **elements; ++ } ffi_type; ++ ++All structures must have type set to FFI_TYPE_STRUCT. You may set ++size and alignment to 0. These will be calculated and reset to the ++appropriate values by ffi_prep_cif(). ++ ++elements is a NULL terminated array of pointers to ffi_type objects ++that describe the type of the structure elements. These may, in turn, ++be structure elements. ++ ++The following example initializes a ffi_type object representing the ++tm struct from Linux's time.h: ++ ++ struct tm { ++ int tm_sec; ++ int tm_min; ++ int tm_hour; ++ int tm_mday; ++ int tm_mon; ++ int tm_year; ++ int tm_wday; ++ int tm_yday; ++ int tm_isdst; ++ /* Those are for future use. */ ++ long int __tm_gmtoff__; ++ __const char *__tm_zone__; ++ }; ++ ++ { ++ ffi_type tm_type; ++ ffi_type *tm_type_elements[12]; ++ int i; ++ ++ tm_type.size = tm_type.alignment = 0; ++ tm_type.elements = &tm_type_elements; ++ ++ for (i = 0; i < 9; i++) ++ tm_type_elements[i] = &ffi_type_sint; ++ ++ tm_type_elements[9] = &ffi_type_slong; ++ tm_type_elements[10] = &ffi_type_pointer; ++ tm_type_elements[11] = NULL; ++ ++ /* tm_type can now be used to represent tm argument types and ++ return types for ffi_prep_cif() */ ++ } ++ ++ ++ ++Platform Specific Notes ++======================= ++ ++ Intel x86 ++ --------- ++ ++There are no known problems with the x86 port. ++ ++ Sun SPARC - SunOS 4.1.3 & Solaris 2.x ++ ------------------------------------- ++ ++You must use GNU Make to build libffi on Sun platforms. ++ ++ MIPS - Irix 5.3 & 6.x ++ --------------------- ++ ++Irix 6.2 and better supports three different calling conventions: o32, ++n32 and n64. Currently, libffi only supports both o32 and n32 under ++Irix 6.x, but only o32 under Irix 5.3. Libffi will automatically be ++configured for whichever calling convention it was built for. ++ ++By default, the configure script will try to build libffi with the GNU ++development tools. To build libffi with the SGI development tools, set ++the environment variable CC to either "cc -32" or "cc -n32" before ++running configure under Irix 6.x (depending on whether you want an o32 ++or n32 library), or just "cc" for Irix 5.3. ++ ++With the n32 calling convention, when returning structures smaller ++than 16 bytes, be sure to provide an RVALUE that is 8 byte aligned. ++Here's one way of forcing this: ++ ++ double struct_storage[2]; ++ my_small_struct *s = (my_small_struct *) struct_storage; ++ /* Use s for RVALUE */ ++ ++If you don't do this you are liable to get spurious bus errors. ++ ++"long long" values are not supported yet. ++ ++You must use GNU Make to build libffi on SGI platforms. ++ ++ ARM - System V ABI ++ ------------------ ++ ++The ARM port was performed on a NetWinder running ARM Linux ELF ++(2.0.31) and gcc 2.8.1. ++ ++ ++ ++ PowerPC System V ABI ++ -------------------- ++ ++There are two `System V ABI's which libffi implements for PowerPC. ++They differ only in how small structures are returned from functions. ++ ++In the FFI_SYSV version, structures that are 8 bytes or smaller are ++returned in registers. This is what GCC does when it is configured ++for solaris, and is what the System V ABI I have (dated September ++1995) says. ++ ++In the FFI_GCC_SYSV version, all structures are returned the same way: ++by passing a pointer as the first argument to the function. This is ++what GCC does when it is configured for linux or a generic sysv ++target. ++ ++EGCS 1.0.1 (and probably other versions of EGCS/GCC) also has a ++inconsistency with the SysV ABI: When a procedure is called with many ++floating-point arguments, some of them get put on the stack. They are ++all supposed to be stored in double-precision format, even if they are ++only single-precision, but EGCS stores single-precision arguments as ++single-precision anyway. This causes one test to fail (the `many ++arguments' test). ++ ++ ++What's With The Crazy Comments? ++=============================== ++ ++You might notice a number of cryptic comments in the code, delimited ++by /*@ and @*/. These are annotations read by the program LCLint, a ++tool for statically checking C programs. You can read all about it at ++. ++ ++ ++History ++======= ++ ++1.20 Oct-5-98 ++ Raffaele Sena produces ARM port. ++ ++1.19 Oct-5-98 ++ Fixed x86 long double and long long return support. ++ m68k bug fixes from Andreas Schwab. ++ Patch for DU assembler compatibility for the Alpha from Richard ++ Henderson. ++ ++1.18 Apr-17-98 ++ Bug fixes and MIPS configuration changes. ++ ++1.17 Feb-24-98 ++ Bug fixes and m68k port from Andreas Schwab. PowerPC port from ++ Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes. ++ ++1.16 Feb-11-98 ++ Richard Henderson produces Alpha port. ++ ++1.15 Dec-4-97 ++ Fixed an n32 ABI bug. New libtool, auto* support. ++ ++1.14 May-13-97 ++ libtool is now used to generate shared and static libraries. ++ Fixed a minor portability problem reported by Russ McManus ++ . ++ ++1.13 Dec-2-96 ++ Added --enable-purify-safety to keep Purify from complaining ++ about certain low level code. ++ Sparc fix for calling functions with < 6 args. ++ Linux x86 a.out fix. ++ ++1.12 Nov-22-96 ++ Added missing ffi_type_void, needed for supporting void return ++ types. Fixed test case for non MIPS machines. Cygnus Support ++ is now Cygnus Solutions. ++ ++1.11 Oct-30-96 ++ Added notes about GNU make. ++ ++1.10 Oct-29-96 ++ Added configuration fix for non GNU compilers. ++ ++1.09 Oct-29-96 ++ Added --enable-debug configure switch. Clean-ups based on LCLint ++ feedback. ffi_mips.h is always installed. Many configuration ++ fixes. Fixed ffitest.c for sparc builds. ++ ++1.08 Oct-15-96 ++ Fixed n32 problem. Many clean-ups. ++ ++1.07 Oct-14-96 ++ Gordon Irlam rewrites v8.S again. Bug fixes. ++ ++1.06 Oct-14-96 ++ Gordon Irlam improved the sparc port. ++ ++1.05 Oct-14-96 ++ Interface changes based on feedback. ++ ++1.04 Oct-11-96 ++ Sparc port complete (modulo struct passing bug). ++ ++1.03 Oct-10-96 ++ Passing struct args, and returning struct values works for ++ all architectures/calling conventions. Expanded tests. ++ ++1.02 Oct-9-96 ++ Added SGI n32 support. Fixed bugs in both o32 and Linux support. ++ Added "make test". ++ ++1.01 Oct-8-96 ++ Fixed float passing bug in mips version. Restructured some ++ of the code. Builds cleanly with SGI tools. ++ ++1.00 Oct-7-96 ++ First release. No public announcement. ++ ++ ++Authors & Credits ++================= ++ ++libffi was written by Anthony Green . ++ ++Portions of libffi were derived from Gianni Mariani's free gencall ++library for Silicon Graphics machines. ++ ++The closure mechanism was designed and implemented by Kresten Krab ++Thorup. ++ ++The Sparc port was derived from code contributed by the fine folks at ++Visible Decisions Inc . Further enhancements were ++made by Gordon Irlam at Cygnus Solutions . ++ ++The Alpha port was written by Richard Henderson at Cygnus Solutions. ++ ++Andreas Schwab ported libffi to m68k Linux and provided a number of ++bug fixes. ++ ++Geoffrey Keating ported libffi to the PowerPC. ++ ++Raffaele Sena ported libffi to the ARM. ++ ++Jesper Skov and Andrew Haley both did more than their fair share of ++stepping through the code and tracking down bugs. ++ ++Thanks also to Tom Tromey for bug fixes and configuration help. ++ ++Thanks to Jim Blandy, who provided some useful feedback on the libffi ++interface. ++ ++If you have a problem, or have found a bug, please send a note to ++green@cygnus.com. +diff -r -u ./Modules/_ctypes/libffi_osx/README.pyobjc ./Modules/_ctypes/libffi_osx/README.pyobjc +new file mode 100644 +index 0000000..405d85f +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/README.pyobjc +@@ -0,0 +1,5 @@ ++This directory contains a slightly modified version of libffi, extracted from ++the GCC source-tree. ++ ++The only modifications are those that are necessary to compile libffi using ++the Apple provided compiler and outside of the GCC source tree. +diff -r -u ./Modules/_ctypes/libffi_osx/ffi.c ./Modules/_ctypes/libffi_osx/ffi.c +new file mode 100644 +index 0000000..bf42093 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/ffi.c +@@ -0,0 +1,226 @@ ++/* ----------------------------------------------------------------------- ++ prep_cif.c - Copyright (c) 1996, 1998 Red Hat, Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++#include ++ ++/* Round up to FFI_SIZEOF_ARG. */ ++#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG) ++ ++/* Perform machine independent initialization of aggregate type ++ specifications. */ ++ ++static ffi_status ++initialize_aggregate( ++/*@out@*/ ffi_type* arg) ++{ ++/*@-usedef@*/ ++ ++ if (arg == NULL || arg->elements == NULL || ++ arg->size != 0 || arg->alignment != 0) ++ return FFI_BAD_TYPEDEF; ++ ++ ffi_type** ptr = &(arg->elements[0]); ++ ++ while ((*ptr) != NULL) ++ { ++ if (((*ptr)->size == 0) && (initialize_aggregate(*ptr) != FFI_OK)) ++ return FFI_BAD_TYPEDEF; ++ ++ /* Perform a sanity check on the argument type */ ++ FFI_ASSERT_VALID_TYPE(*ptr); ++ ++#ifdef POWERPC_DARWIN ++ int curalign = (*ptr)->alignment; ++ ++ if (ptr != &(arg->elements[0])) ++ { ++ if (curalign > 4 && curalign != 16) ++ curalign = 4; ++ } ++ ++ arg->size = ALIGN(arg->size, curalign); ++ arg->size += (*ptr)->size; ++ arg->alignment = (arg->alignment > curalign) ? ++ arg->alignment : curalign; ++#else ++ arg->size = ALIGN(arg->size, (*ptr)->alignment); ++ arg->size += (*ptr)->size; ++ arg->alignment = (arg->alignment > (*ptr)->alignment) ? ++ arg->alignment : (*ptr)->alignment; ++#endif ++ ++ ptr++; ++ } ++ ++ /* Structure size includes tail padding. This is important for ++ structures that fit in one register on ABIs like the PowerPC64 ++ Linux ABI that right justify small structs in a register. ++ It's also needed for nested structure layout, for example ++ struct A { long a; char b; }; struct B { struct A x; char y; }; ++ should find y at an offset of 2*sizeof(long) and result in a ++ total size of 3*sizeof(long). */ ++ arg->size = ALIGN(arg->size, arg->alignment); ++ ++ if (arg->size == 0) ++ return FFI_BAD_TYPEDEF; ++ ++ return FFI_OK; ++ ++/*@=usedef@*/ ++} ++ ++#ifndef __CRIS__ ++/* The CRIS ABI specifies structure elements to have byte ++ alignment only, so it completely overrides this functions, ++ which assumes "natural" alignment and padding. */ ++ ++/* Perform machine independent ffi_cif preparation, then call ++ machine dependent routine. */ ++ ++#if defined(X86_DARWIN) ++ ++static inline bool ++struct_on_stack( ++ int size) ++{ ++ if (size > 8) ++ return true; ++ ++ /* This is not what the ABI says, but is what is really implemented */ ++ switch (size) ++ { ++ case 1: ++ case 2: ++ case 4: ++ case 8: ++ return false; ++ ++ default: ++ return true; ++ } ++} ++ ++#endif // defined(X86_DARWIN) ++ ++// Arguments' ffi_type->alignment must be nonzero. ++ffi_status ++ffi_prep_cif( ++/*@out@*/ /*@partial@*/ ffi_cif* cif, ++ ffi_abi abi, ++ unsigned int nargs, ++/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, ++/*@dependent@*/ ffi_type** atypes) ++{ ++ if (cif == NULL) ++ return FFI_BAD_TYPEDEF; ++ ++ if (abi <= FFI_FIRST_ABI || abi > FFI_DEFAULT_ABI) ++ return FFI_BAD_ABI; ++ ++ unsigned int bytes = 0; ++ unsigned int i; ++ ffi_type** ptr; ++ ++ cif->abi = abi; ++ cif->arg_types = atypes; ++ cif->nargs = nargs; ++ cif->rtype = rtype; ++ cif->flags = 0; ++ ++ /* Initialize the return type if necessary */ ++ /*@-usedef@*/ ++ if ((cif->rtype->size == 0) && (initialize_aggregate(cif->rtype) != FFI_OK)) ++ return FFI_BAD_TYPEDEF; ++ /*@=usedef@*/ ++ ++ /* Perform a sanity check on the return type */ ++ FFI_ASSERT_VALID_TYPE(cif->rtype); ++ ++ /* x86-64 and s390 stack space allocation is handled in prep_machdep. */ ++#if !defined M68K && !defined __x86_64__ && !defined S390 && !defined PA ++ /* Make space for the return structure pointer */ ++ if (cif->rtype->type == FFI_TYPE_STRUCT ++#ifdef SPARC ++ && (cif->abi != FFI_V9 || cif->rtype->size > 32) ++#endif ++#ifdef X86_DARWIN ++ && (struct_on_stack(cif->rtype->size)) ++#endif ++ ) ++ bytes = STACK_ARG_SIZE(sizeof(void*)); ++#endif ++ ++ for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) ++ { ++ /* Initialize any uninitialized aggregate type definitions */ ++ if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) ++ return FFI_BAD_TYPEDEF; ++ ++ if ((*ptr)->alignment == 0) ++ return FFI_BAD_TYPEDEF; ++ ++ /* Perform a sanity check on the argument type, do this ++ check after the initialization. */ ++ FFI_ASSERT_VALID_TYPE(*ptr); ++ ++#if defined(X86_DARWIN) ++ { ++ int align = (*ptr)->alignment; ++ ++ if (align > 4) ++ align = 4; ++ ++ if ((align - 1) & bytes) ++ bytes = ALIGN(bytes, align); ++ ++ bytes += STACK_ARG_SIZE((*ptr)->size); ++ } ++#elif !defined __x86_64__ && !defined S390 && !defined PA ++#ifdef SPARC ++ if (((*ptr)->type == FFI_TYPE_STRUCT ++ && ((*ptr)->size > 16 || cif->abi != FFI_V9)) ++ || ((*ptr)->type == FFI_TYPE_LONGDOUBLE ++ && cif->abi != FFI_V9)) ++ bytes += sizeof(void*); ++ else ++#endif ++ { ++ /* Add any padding if necessary */ ++ if (((*ptr)->alignment - 1) & bytes) ++ bytes = ALIGN(bytes, (*ptr)->alignment); ++ ++ bytes += STACK_ARG_SIZE((*ptr)->size); ++ } ++#endif ++ } ++ ++ cif->bytes = bytes; ++ ++ /* Perform machine dependent cif processing */ ++ return ffi_prep_cif_machdep(cif); ++} ++#endif /* not __CRIS__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi.h ./Modules/_ctypes/libffi_osx/include/ffi.h +new file mode 100644 +index 0000000..c104a5c +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ffi.h +@@ -0,0 +1,355 @@ ++/* -----------------------------------------------------------------*-C-*- ++ libffi PyOBJC - Copyright (c) 1996-2003 Red Hat, Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ++ ----------------------------------------------------------------------- */ ++ ++/* ------------------------------------------------------------------- ++ The basic API is described in the README file. ++ ++ The raw API is designed to bypass some of the argument packing ++ and unpacking on architectures for which it can be avoided. ++ ++ The closure API allows interpreted functions to be packaged up ++ inside a C function pointer, so that they can be called as C functions, ++ with no understanding on the client side that they are interpreted. ++ It can also be used in other cases in which it is necessary to package ++ up a user specified parameter and a function pointer as a single ++ function pointer. ++ ++ The closure API must be implemented in order to get its functionality, ++ e.g. for use by gij. Routines are provided to emulate the raw API ++ if the underlying platform doesn't allow faster implementation. ++ ++ More details on the raw and closure API can be found in: ++ ++ http://gcc.gnu.org/ml/java/1999-q3/msg00138.html ++ ++ and ++ ++ http://gcc.gnu.org/ml/java/1999-q3/msg00174.html ++ -------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_H ++#define LIBFFI_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/* Specify which architecture libffi is configured for. */ ++#ifdef MACOSX ++# if defined(__i386__) || defined(__x86_64__) ++# define X86_DARWIN ++# elif defined(__ppc__) || defined(__ppc64__) ++# define POWERPC_DARWIN ++# else ++# error "Unsupported MacOS X CPU type" ++# endif ++#else ++#error "Unsupported OS type" ++#endif ++ ++/* ---- System configuration information --------------------------------- */ ++ ++#include "ffitarget.h" ++#include "fficonfig.h" ++ ++#ifndef LIBFFI_ASM ++ ++#include ++#include ++ ++/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). ++ But we can find it either under the correct ANSI name, or under GNU ++ C's internal name. */ ++#ifdef LONG_LONG_MAX ++# define FFI_LONG_LONG_MAX LONG_LONG_MAX ++#else ++# ifdef LLONG_MAX ++# define FFI_LONG_LONG_MAX LLONG_MAX ++# else ++# ifdef __GNUC__ ++# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ ++# endif ++# endif ++#endif ++ ++#if SCHAR_MAX == 127 ++# define ffi_type_uchar ffi_type_uint8 ++# define ffi_type_schar ffi_type_sint8 ++#else ++#error "char size not supported" ++#endif ++ ++#if SHRT_MAX == 32767 ++# define ffi_type_ushort ffi_type_uint16 ++# define ffi_type_sshort ffi_type_sint16 ++#elif SHRT_MAX == 2147483647 ++# define ffi_type_ushort ffi_type_uint32 ++# define ffi_type_sshort ffi_type_sint32 ++#else ++#error "short size not supported" ++#endif ++ ++#if INT_MAX == 32767 ++# define ffi_type_uint ffi_type_uint16 ++# define ffi_type_sint ffi_type_sint16 ++#elif INT_MAX == 2147483647 ++# define ffi_type_uint ffi_type_uint32 ++# define ffi_type_sint ffi_type_sint32 ++#elif INT_MAX == 9223372036854775807 ++# define ffi_type_uint ffi_type_uint64 ++# define ffi_type_sint ffi_type_sint64 ++#else ++#error "int size not supported" ++#endif ++ ++#define ffi_type_ulong ffi_type_uint64 ++#define ffi_type_slong ffi_type_sint64 ++ ++#if LONG_MAX == 2147483647 ++# if FFI_LONG_LONG_MAX != 9223372036854775807 ++# error "no 64-bit data type supported" ++# endif ++#elif LONG_MAX != 9223372036854775807 ++#error "long size not supported" ++#endif ++ ++/* The closure code assumes that this works on pointers, i.e. a size_t ++ can hold a pointer. */ ++ ++typedef struct _ffi_type { ++ size_t size; ++ unsigned short alignment; ++ unsigned short type; ++/*@null@*/ struct _ffi_type** elements; ++} ffi_type; ++ ++/* These are defined in types.c */ ++extern ffi_type ffi_type_void; ++extern ffi_type ffi_type_uint8; ++extern ffi_type ffi_type_sint8; ++extern ffi_type ffi_type_uint16; ++extern ffi_type ffi_type_sint16; ++extern ffi_type ffi_type_uint32; ++extern ffi_type ffi_type_sint32; ++extern ffi_type ffi_type_uint64; ++extern ffi_type ffi_type_sint64; ++extern ffi_type ffi_type_float; ++extern ffi_type ffi_type_double; ++extern ffi_type ffi_type_longdouble; ++extern ffi_type ffi_type_pointer; ++ ++typedef enum ffi_status { ++ FFI_OK = 0, ++ FFI_BAD_TYPEDEF, ++ FFI_BAD_ABI ++} ffi_status; ++ ++typedef unsigned FFI_TYPE; ++ ++typedef struct ffi_cif { ++ ffi_abi abi; ++ unsigned nargs; ++/*@dependent@*/ ffi_type** arg_types; ++/*@dependent@*/ ffi_type* rtype; ++ unsigned bytes; ++ unsigned flags; ++#ifdef FFI_EXTRA_CIF_FIELDS ++ FFI_EXTRA_CIF_FIELDS; ++#endif ++} ffi_cif; ++ ++/* ---- Definitions for the raw API -------------------------------------- */ ++ ++#ifndef FFI_SIZEOF_ARG ++# if LONG_MAX == 2147483647 ++# define FFI_SIZEOF_ARG 4 ++# elif LONG_MAX == 9223372036854775807 ++# define FFI_SIZEOF_ARG 8 ++# endif ++#endif ++ ++typedef union { ++ ffi_sarg sint; ++ ffi_arg uint; ++ float flt; ++ char data[FFI_SIZEOF_ARG]; ++ void* ptr; ++} ffi_raw; ++ ++void ++ffi_raw_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ ffi_raw* avalue); ++ ++void ++ffi_ptrarray_to_raw( ++ ffi_cif* cif, ++ void** args, ++ ffi_raw* raw); ++ ++void ++ffi_raw_to_ptrarray( ++ ffi_cif* cif, ++ ffi_raw* raw, ++ void** args); ++ ++size_t ++ffi_raw_size( ++ ffi_cif* cif); ++ ++/* This is analogous to the raw API, except it uses Java parameter ++ packing, even on 64-bit machines. I.e. on 64-bit machines ++ longs and doubles are followed by an empty 64-bit word. */ ++void ++ffi_java_raw_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ ffi_raw* avalue); ++ ++void ++ffi_java_ptrarray_to_raw( ++ ffi_cif* cif, ++ void** args, ++ ffi_raw* raw); ++ ++void ++ffi_java_raw_to_ptrarray( ++ ffi_cif* cif, ++ ffi_raw* raw, ++ void** args); ++ ++size_t ++ffi_java_raw_size( ++ ffi_cif* cif); ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#if FFI_CLOSURES ++ ++typedef struct ffi_closure { ++ char tramp[FFI_TRAMPOLINE_SIZE]; ++ ffi_cif* cif; ++ void (*fun)(ffi_cif*,void*,void**,void*); ++ void* user_data; ++} ffi_closure; ++ ++ffi_status ++ffi_prep_closure( ++ ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,void**,void*), ++ void* user_data); ++ ++void ffi_closure_free(void *); ++void *ffi_closure_alloc (size_t size, void **code); ++ ++typedef struct ffi_raw_closure { ++ char tramp[FFI_TRAMPOLINE_SIZE]; ++ ffi_cif* cif; ++ ++#if !FFI_NATIVE_RAW_API ++ /* if this is enabled, then a raw closure has the same layout ++ as a regular closure. We use this to install an intermediate ++ handler to do the transaltion, void** -> ffi_raw*. */ ++ void (*translate_args)(ffi_cif*,void*,void**,void*); ++ void* this_closure; ++#endif ++ ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*); ++ void* user_data; ++} ffi_raw_closure; ++ ++ffi_status ++ffi_prep_raw_closure( ++ ffi_raw_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), ++ void* user_data); ++ ++ffi_status ++ffi_prep_java_raw_closure( ++ ffi_raw_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), ++ void* user_data); ++ ++#endif // FFI_CLOSURES ++ ++/* ---- Public interface definition -------------------------------------- */ ++ ++ffi_status ++ffi_prep_cif( ++/*@out@*/ /*@partial@*/ ffi_cif* cif, ++ ffi_abi abi, ++ unsigned int nargs, ++/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, ++/*@dependent@*/ ffi_type** atypes); ++ ++void ++ffi_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ void** avalue); ++ ++/* Useful for eliminating compiler warnings */ ++#define FFI_FN(f) ((void (*)(void))f) ++ ++#endif // #ifndef LIBFFI_ASM ++/* ---- Definitions shared with assembly code ---------------------------- */ ++ ++/* If these change, update src/mips/ffitarget.h. */ ++#define FFI_TYPE_VOID 0 ++#define FFI_TYPE_INT 1 ++#define FFI_TYPE_FLOAT 2 ++#define FFI_TYPE_DOUBLE 3 ++ ++#ifdef HAVE_LONG_DOUBLE ++# define FFI_TYPE_LONGDOUBLE 4 ++#else ++# define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE ++#endif ++ ++#define FFI_TYPE_UINT8 5 ++#define FFI_TYPE_SINT8 6 ++#define FFI_TYPE_UINT16 7 ++#define FFI_TYPE_SINT16 8 ++#define FFI_TYPE_UINT32 9 ++#define FFI_TYPE_SINT32 10 ++#define FFI_TYPE_UINT64 11 ++#define FFI_TYPE_SINT64 12 ++#define FFI_TYPE_STRUCT 13 ++#define FFI_TYPE_POINTER 14 ++ ++/* This should always refer to the last type code (for sanity checks) */ ++#define FFI_TYPE_LAST FFI_TYPE_POINTER ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif // #ifndef LIBFFI_H +diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi_common.h ./Modules/_ctypes/libffi_osx/include/ffi_common.h +new file mode 100644 +index 0000000..685a358 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ffi_common.h +@@ -0,0 +1,102 @@ ++/* ----------------------------------------------------------------------- ++ ffi_common.h - Copyright (c) 1996 Red Hat, Inc. ++ ++ Common internal definitions and macros. Only necessary for building ++ libffi. ++ ----------------------------------------------------------------------- */ ++ ++#ifndef FFI_COMMON_H ++#define FFI_COMMON_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include "fficonfig.h" ++ ++/* Do not move this. Some versions of AIX are very picky about where ++ this is positioned. */ ++#ifdef __GNUC__ ++# define alloca __builtin_alloca ++#else ++# if HAVE_ALLOCA_H ++# include ++# else ++# ifdef _AIX ++# pragma alloca ++# else ++# ifndef alloca /* predefined by HP cc +Olibcalls */ ++char* alloca(); ++# endif ++# endif ++# endif ++#endif ++ ++/* Check for the existence of memcpy. */ ++#if STDC_HEADERS ++# include ++#else ++# ifndef HAVE_MEMCPY ++# define memcpy(d, s, n) bcopy((s), (d), (n)) ++# endif ++#endif ++ ++/*#if defined(FFI_DEBUG) ++#include ++#endif*/ ++ ++#ifdef FFI_DEBUG ++#include ++ ++/*@exits@*/ void ++ffi_assert( ++/*@temp@*/ char* expr, ++/*@temp@*/ char* file, ++ int line); ++void ++ffi_stop_here(void); ++void ++ffi_type_test( ++/*@temp@*/ /*@out@*/ ffi_type* a, ++/*@temp@*/ char* file, ++ int line); ++ ++# define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) ++# define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) ++# define FFI_ASSERT_VALID_TYPE(x) ffi_type_test(x, __FILE__, __LINE__) ++#else ++# define FFI_ASSERT(x) ++# define FFI_ASSERT_AT(x, f, l) ++# define FFI_ASSERT_VALID_TYPE(x) ++#endif // #ifdef FFI_DEBUG ++ ++#define ALIGN(v, a) (((size_t)(v) + (a) - 1) & ~((a) - 1)) ++ ++/* Perform machine dependent cif processing */ ++ffi_status ++ffi_prep_cif_machdep( ++ ffi_cif* cif); ++ ++/* Extended cif, used in callback from assembly routine */ ++typedef struct extended_cif { ++/*@dependent@*/ ffi_cif* cif; ++/*@dependent@*/ void* rvalue; ++/*@dependent@*/ void** avalue; ++} extended_cif; ++ ++/* Terse sized type definitions. */ ++typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); ++typedef signed int SINT8 __attribute__((__mode__(__QI__))); ++typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); ++typedef signed int SINT16 __attribute__((__mode__(__HI__))); ++typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); ++typedef signed int SINT32 __attribute__((__mode__(__SI__))); ++typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); ++typedef signed int SINT64 __attribute__((__mode__(__DI__))); ++typedef float FLOAT32; ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif // #ifndef FFI_COMMON_H +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/fficonfig.h ./Modules/_ctypes/libffi_osx/include/fficonfig.h +new file mode 100644 +index 0000000..2172490 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/fficonfig.h +@@ -0,0 +1,150 @@ ++/* Manually created fficonfig.h for Darwin on PowerPC or Intel ++ ++ This file is manually generated to do away with the need for autoconf and ++ therefore make it easier to cross-compile and build fat binaries. ++ ++ NOTE: This file was added by PyObjC. ++*/ ++ ++#ifndef MACOSX ++#error "This file is only supported on Mac OS X" ++#endif ++ ++#if defined(__i386__) ++# define BYTEORDER 1234 ++# undef HOST_WORDS_BIG_ENDIAN ++# undef WORDS_BIGENDIAN ++# define SIZEOF_DOUBLE 8 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++ ++#elif defined(__x86_64__) ++# define BYTEORDER 1234 ++# undef HOST_WORDS_BIG_ENDIAN ++# undef WORDS_BIGENDIAN ++# define SIZEOF_DOUBLE 8 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++ ++#elif defined(__ppc__) ++# define BYTEORDER 4321 ++# define HOST_WORDS_BIG_ENDIAN 1 ++# define WORDS_BIGENDIAN 1 ++# define SIZEOF_DOUBLE 8 ++# if __GNUC__ >= 4 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++# else ++# undef HAVE_LONG_DOUBLE ++# define SIZEOF_LONG_DOUBLE 8 ++# endif ++ ++#elif defined(__ppc64__) ++# define BYTEORDER 4321 ++# define HOST_WORDS_BIG_ENDIAN 1 ++# define WORDS_BIGENDIAN 1 ++# define SIZEOF_DOUBLE 8 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++ ++#else ++#error "Unknown CPU type" ++#endif ++ ++/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP ++ systems. This function is required for `alloca.c' support on those systems. */ ++#undef CRAY_STACKSEG_END ++ ++/* Define to 1 if using `alloca.c'. */ ++/* #undef C_ALLOCA */ ++ ++/* Define to the flags needed for the .section .eh_frame directive. */ ++#define EH_FRAME_FLAGS "aw" ++ ++/* Define this if you want extra debugging. */ ++/* #undef FFI_DEBUG */ ++ ++/* Define this is you do not want support for the raw API. */ ++#define FFI_NO_RAW_API 1 ++ ++/* Define this if you do not want support for aggregate types. */ ++/* #undef FFI_NO_STRUCTS */ ++ ++/* Define to 1 if you have `alloca', as a function or macro. */ ++#define HAVE_ALLOCA 1 ++ ++/* Define to 1 if you have and it should be used (not on Ultrix). */ ++#define HAVE_ALLOCA_H 1 ++ ++/* Define if your assembler supports .register. */ ++/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ ++ ++/* Define if your assembler and linker support unaligned PC relative relocs. */ ++/* #undef HAVE_AS_SPARC_UA_PCREL */ ++ ++/* Define to 1 if you have the `memcpy' function. */ ++#define HAVE_MEMCPY 1 ++ ++/* Define if mmap with MAP_ANON(YMOUS) works. */ ++#define HAVE_MMAP_ANON 1 ++ ++/* Define if mmap of /dev/zero works. */ ++/* #undef HAVE_MMAP_DEV_ZERO */ ++ ++/* Define if read-only mmap of a plain file works. */ ++#define HAVE_MMAP_FILE 1 ++ ++/* Define if .eh_frame sections should be read-only. */ ++/* #undef HAVE_RO_EH_FRAME */ ++ ++/* Define to 1 if your C compiler doesn't accept -c and -o together. */ ++/* #undef NO_MINUS_C_MINUS_O */ ++ ++/* Name of package */ ++#define PACKAGE "libffi" ++ ++/* Define to the address where bug reports for this package should be sent. */ ++#define PACKAGE_BUGREPORT "http://gcc.gnu.org/bugs.html" ++ ++/* Define to the full name of this package. */ ++#define PACKAGE_NAME "libffi" ++ ++/* Define to the full name and version of this package. */ ++#define PACKAGE_STRING "libffi 2.1" ++ ++/* Define to the one symbol short name of this package. */ ++#define PACKAGE_TARNAME "libffi" ++ ++/* Define to the version of this package. */ ++#define PACKAGE_VERSION "2.1" ++ ++/* If using the C implementation of alloca, define if you know the ++ direction of stack growth for your system; otherwise it will be ++ automatically deduced at run-time. ++ STACK_DIRECTION > 0 => grows toward higher addresses ++ STACK_DIRECTION < 0 => grows toward lower addresses ++ STACK_DIRECTION = 0 => direction of growth unknown */ ++/* #undef STACK_DIRECTION */ ++ ++/* Define to 1 if you have the ANSI C header files. */ ++#define STDC_HEADERS 1 ++ ++/* Define this if you are using Purify and want to suppress spurious messages. */ ++/* #undef USING_PURIFY */ ++ ++/* Version number of package */ ++#define VERSION "2.1-pyobjc" ++ ++#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE ++# ifdef LIBFFI_ASM ++# define FFI_HIDDEN(name) .hidden name ++# else ++# define FFI_HIDDEN __attribute__((visibility ("hidden"))) ++# endif ++#else ++# ifdef LIBFFI_ASM ++# define FFI_HIDDEN(name) ++# else ++# define FFI_HIDDEN ++# endif ++#endif +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/ffitarget.h ./Modules/_ctypes/libffi_osx/include/ffitarget.h +new file mode 100644 +index 0000000..faaa30d +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ffitarget.h +@@ -0,0 +1,13 @@ ++/* Dispatch to the right ffitarget file. This file is PyObjC specific; in a ++ normal build, the build environment copies the file to the right location or ++ sets up the right include flags. We want to do neither because that would ++ make building fat binaries harder. ++*/ ++ ++#if defined(__i386__) || defined(__x86_64__) ++#include "x86-ffitarget.h" ++#elif defined(__ppc__) || defined(__ppc64__) ++#include "ppc-ffitarget.h" ++#else ++#error "Unsupported CPU type" ++#endif +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h +new file mode 100644 +index 0000000..2318421 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h +@@ -0,0 +1,104 @@ ++/* -----------------------------------------------------------------*-C-*- ++ ppc-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ Target configuration macros for PowerPC. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++/* ---- System specific configurations ----------------------------------- */ ++ ++#if (defined(POWERPC) && defined(__powerpc64__)) || \ ++ (defined(POWERPC_DARWIN) && defined(__ppc64__)) ++#define POWERPC64 ++#endif ++ ++#ifndef LIBFFI_ASM ++ ++typedef unsigned long ffi_arg; ++typedef signed long ffi_sarg; ++ ++typedef enum ffi_abi { ++ FFI_FIRST_ABI = 0, ++ ++#ifdef POWERPC ++ FFI_SYSV, ++ FFI_GCC_SYSV, ++ FFI_LINUX64, ++# ifdef POWERPC64 ++ FFI_DEFAULT_ABI = FFI_LINUX64, ++# else ++ FFI_DEFAULT_ABI = FFI_GCC_SYSV, ++# endif ++#endif ++ ++#ifdef POWERPC_AIX ++ FFI_AIX, ++ FFI_DARWIN, ++ FFI_DEFAULT_ABI = FFI_AIX, ++#endif ++ ++#ifdef POWERPC_DARWIN ++ FFI_AIX, ++ FFI_DARWIN, ++ FFI_DEFAULT_ABI = FFI_DARWIN, ++#endif ++ ++#ifdef POWERPC_FREEBSD ++ FFI_SYSV, ++ FFI_GCC_SYSV, ++ FFI_LINUX64, ++ FFI_DEFAULT_ABI = FFI_SYSV, ++#endif ++ ++ FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 ++} ffi_abi; ++ ++#endif // #ifndef LIBFFI_ASM ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#define FFI_CLOSURES 1 ++#define FFI_NATIVE_RAW_API 0 ++ ++/* Needed for FFI_SYSV small structure returns. */ ++#define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST) ++ ++#if defined(POWERPC64) /*|| defined(POWERPC_AIX)*/ ++# define FFI_TRAMPOLINE_SIZE 48 ++#elif defined(POWERPC_AIX) ++# define FFI_TRAMPOLINE_SIZE 24 ++#else ++# define FFI_TRAMPOLINE_SIZE 40 ++#endif ++ ++#ifndef LIBFFI_ASM ++# if defined(POWERPC_DARWIN) || defined(POWERPC_AIX) ++typedef struct ffi_aix_trampoline_struct { ++ void* code_pointer; /* Pointer to ffi_closure_ASM */ ++ void* toc; /* TOC */ ++ void* static_chain; /* Pointer to closure */ ++} ffi_aix_trampoline_struct; ++# endif ++#endif // #ifndef LIBFFI_ASM ++ ++#endif // #ifndef LIBFFI_TARGET_H +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h +new file mode 100644 +index 0000000..55c2b6c +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h +@@ -0,0 +1,88 @@ ++/* -----------------------------------------------------------------*-C-*- ++ x86-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ Target configuration macros for x86 and x86-64. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ++ ----------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++/* ---- System specific configurations ----------------------------------- */ ++ ++#if defined(X86_64) && defined(__i386__) ++# undef X86_64 ++# define X86 ++#endif ++ ++#if defined(__x86_64__) ++# ifndef X86_64 ++# define X86_64 ++# endif ++#endif ++ ++/* ---- Generic type definitions ----------------------------------------- */ ++ ++#ifndef LIBFFI_ASM ++ ++typedef unsigned long ffi_arg; ++typedef signed long ffi_sarg; ++ ++typedef enum ffi_abi { ++ FFI_FIRST_ABI = 0, ++ ++ /* ---- Intel x86 Win32 ---------- */ ++#ifdef X86_WIN32 ++ FFI_SYSV, ++ FFI_STDCALL, ++ /* TODO: Add fastcall support for the sake of completeness */ ++ FFI_DEFAULT_ABI = FFI_SYSV, ++#endif ++ ++ /* ---- Intel x86 and AMD x86-64 - */ ++#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__)) ++ FFI_SYSV, ++ FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ ++# ifdef __i386__ ++ FFI_DEFAULT_ABI = FFI_SYSV, ++# else ++ FFI_DEFAULT_ABI = FFI_UNIX64, ++# endif ++#endif ++ ++ FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 ++} ffi_abi; ++ ++#endif // #ifndef LIBFFI_ASM ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#define FFI_CLOSURES 1 ++ ++#if defined(X86_64) || (defined(__x86_64__) && defined(X86_DARWIN)) ++# define FFI_TRAMPOLINE_SIZE 24 ++# define FFI_NATIVE_RAW_API 0 ++#else ++# define FFI_TRAMPOLINE_SIZE 10 ++# define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ ++#endif ++ ++#endif // #ifndef LIBFFI_TARGET_H +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S +new file mode 100644 +index 0000000..f143dbd +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S +@@ -0,0 +1,365 @@ ++#if defined(__ppc__) || defined(__ppc64__) ++ ++/* ----------------------------------------------------------------------- ++ ppc-darwin.S - Copyright (c) 2000 John Hornkvist ++ Copyright (c) 2004 Free Software Foundation, Inc. ++ ++ PowerPC Assembly glue. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++ ++#include ++#include ++#include ++#include ++ ++.text ++ .align 2 ++.globl _ffi_prep_args ++ ++.text ++ .align 2 ++.globl _ffi_call_DARWIN ++ ++.text ++ .align 2 ++_ffi_call_DARWIN: ++LFB0: ++ mr r12,r8 /* We only need r12 until the call, ++ so it doesn't have to be saved. */ ++ ++LFB1: ++ /* Save the old stack pointer as AP. */ ++ mr r8,r1 ++ ++LCFI0: ++#if defined(__ppc64__) ++ /* Allocate the stack space we need. ++ r4 (size of input data) ++ 48 bytes (linkage area) ++ 40 bytes (saved registers) ++ 8 bytes (extra FPR) ++ r4 + 96 bytes total ++ */ ++ ++ addi r4,r4,-96 // Add our overhead. ++ li r0,-32 // Align to 32 bytes. ++ and r4,r4,r0 ++#endif ++ stgux r1,r1,r4 // Grow the stack. ++ mflr r9 ++ ++ /* Save registers we use. */ ++#if defined(__ppc64__) ++ std r27,-40(r8) ++#endif ++ stg r28,MODE_CHOICE(-16,-32)(r8) ++ stg r29,MODE_CHOICE(-12,-24)(r8) ++ stg r30,MODE_CHOICE(-8,-16)(r8) ++ stg r31,MODE_CHOICE(-4,-8)(r8) ++ stg r9,SF_RETURN(r8) /* return address */ ++#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ ++ stg r2,MODE_CHOICE(20,40)(r1) ++#endif ++ ++LCFI1: ++#if defined(__ppc64__) ++ mr r27,r3 // our extended_cif ++#endif ++ /* Save arguments over call. */ ++ mr r31,r5 /* flags, */ ++ mr r30,r6 /* rvalue, */ ++ mr r29,r7 /* function address, */ ++ mr r28,r8 /* our AP. */ ++ ++LCFI2: ++ /* Call ffi_prep_args. */ ++ mr r4,r1 ++ li r9,0 ++ mtctr r12 /* r12 holds address of _ffi_prep_args. */ ++ bctrl ++#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ ++ lg r2,MODE_CHOICE(20,40)(r1) ++#endif ++ ++ /* Now do the call. ++ Set up cr1 with bits 4-7 of the flags. */ ++ mtcrf 0x40,r31 ++ ++ /* Load all those argument registers. ++ We have set up a nice stack frame, just load it into registers. */ ++ lg r3,SF_ARG1(r1) ++ lg r4,SF_ARG2(r1) ++ lg r5,SF_ARG3(r1) ++ lg r6,SF_ARG4(r1) ++ nop ++ lg r7,SF_ARG5(r1) ++ lg r8,SF_ARG6(r1) ++ lg r9,SF_ARG7(r1) ++ lg r10,SF_ARG8(r1) ++ ++ /* Load all the FP registers. */ ++ bf 6,L2 /* No floats to load. */ ++#if defined(__ppc64__) ++ lfd f1,MODE_CHOICE(-16,-40)-(14*8)(r28) ++ lfd f2,MODE_CHOICE(-16,-40)-(13*8)(r28) ++ lfd f3,MODE_CHOICE(-16,-40)-(12*8)(r28) ++ lfd f4,MODE_CHOICE(-16,-40)-(11*8)(r28) ++ nop ++ lfd f5,MODE_CHOICE(-16,-40)-(10*8)(r28) ++ lfd f6,MODE_CHOICE(-16,-40)-(9*8)(r28) ++ lfd f7,MODE_CHOICE(-16,-40)-(8*8)(r28) ++ lfd f8,MODE_CHOICE(-16,-40)-(7*8)(r28) ++ nop ++ lfd f9,MODE_CHOICE(-16,-40)-(6*8)(r28) ++ lfd f10,MODE_CHOICE(-16,-40)-(5*8)(r28) ++ lfd f11,MODE_CHOICE(-16,-40)-(4*8)(r28) ++ lfd f12,MODE_CHOICE(-16,-40)-(3*8)(r28) ++ nop ++ lfd f13,MODE_CHOICE(-16,-40)-(2*8)(r28) ++ lfd f14,MODE_CHOICE(-16,-40)-(1*8)(r28) ++#elif defined(__ppc__) ++ lfd f1,MODE_CHOICE(-16,-40)-(13*8)(r28) ++ lfd f2,MODE_CHOICE(-16,-40)-(12*8)(r28) ++ lfd f3,MODE_CHOICE(-16,-40)-(11*8)(r28) ++ lfd f4,MODE_CHOICE(-16,-40)-(10*8)(r28) ++ nop ++ lfd f5,MODE_CHOICE(-16,-40)-(9*8)(r28) ++ lfd f6,MODE_CHOICE(-16,-40)-(8*8)(r28) ++ lfd f7,MODE_CHOICE(-16,-40)-(7*8)(r28) ++ lfd f8,MODE_CHOICE(-16,-40)-(6*8)(r28) ++ nop ++ lfd f9,MODE_CHOICE(-16,-40)-(5*8)(r28) ++ lfd f10,MODE_CHOICE(-16,-40)-(4*8)(r28) ++ lfd f11,MODE_CHOICE(-16,-40)-(3*8)(r28) ++ lfd f12,MODE_CHOICE(-16,-40)-(2*8)(r28) ++ nop ++ lfd f13,MODE_CHOICE(-16,-40)-(1*8)(r28) ++#else ++#error undefined architecture ++#endif ++ ++L2: ++ mr r12,r29 // Put the target address in r12 as specified. ++ mtctr r12 // Get the address to call into CTR. ++ nop ++ nop ++ bctrl // Make the call. ++ ++ // Deal with the return value. ++#if defined(__ppc64__) ++ mtcrf 0x3,r31 // flags in cr6 and cr7 ++ bt 27,L(st_return_value) ++#elif defined(__ppc__) ++ mtcrf 0x1,r31 // flags in cr7 ++#else ++#error undefined architecture ++#endif ++ ++ bt 30,L(done_return_value) ++ bt 29,L(fp_return_value) ++ stg r3,0(r30) ++#if defined(__ppc__) ++ bf 28,L(done_return_value) // Store the second long if necessary. ++ stg r4,4(r30) ++#endif ++ // Fall through ++ ++L(done_return_value): ++ lg r1,0(r1) // Restore stack pointer. ++ // Restore the registers we used. ++ lg r9,SF_RETURN(r1) // return address ++ lg r31,MODE_CHOICE(-4,-8)(r1) ++ mtlr r9 ++ lg r30,MODE_CHOICE(-8,-16)(r1) ++ lg r29,MODE_CHOICE(-12,-24)(r1) ++ lg r28,MODE_CHOICE(-16,-32)(r1) ++#if defined(__ppc64__) ++ ld r27,-40(r1) ++#endif ++ blr ++ ++#if defined(__ppc64__) ++L(st_return_value): ++ // Grow the stack enough to fit the registers. Leave room for 8 args ++ // to trample the 1st 8 slots in param area. ++ stgu r1,-SF_ROUND(280)(r1) // 64 + 104 + 48 + 64 ++ ++ // Store GPRs ++ std r3,SF_ARG9(r1) ++ std r4,SF_ARG10(r1) ++ std r5,SF_ARG11(r1) ++ std r6,SF_ARG12(r1) ++ nop ++ std r7,SF_ARG13(r1) ++ std r8,SF_ARG14(r1) ++ std r9,SF_ARG15(r1) ++ std r10,SF_ARG16(r1) ++ ++ // Store FPRs ++ nop ++ bf 26,L(call_struct_to_ram_form) ++ stfd f1,SF_ARG17(r1) ++ stfd f2,SF_ARG18(r1) ++ stfd f3,SF_ARG19(r1) ++ stfd f4,SF_ARG20(r1) ++ nop ++ stfd f5,SF_ARG21(r1) ++ stfd f6,SF_ARG22(r1) ++ stfd f7,SF_ARG23(r1) ++ stfd f8,SF_ARG24(r1) ++ nop ++ stfd f9,SF_ARG25(r1) ++ stfd f10,SF_ARG26(r1) ++ stfd f11,SF_ARG27(r1) ++ stfd f12,SF_ARG28(r1) ++ nop ++ stfd f13,SF_ARG29(r1) ++ ++L(call_struct_to_ram_form): ++ ld r3,0(r27) // extended_cif->cif* ++ ld r3,16(r3) // ffi_cif->rtype* ++ addi r4,r1,SF_ARG9 // stored GPRs ++ addi r6,r1,SF_ARG17 // stored FPRs ++ li r5,0 // GPR size ptr (NULL) ++ li r7,0 // FPR size ptr (NULL) ++ li r8,0 // FPR count ptr (NULL) ++ li r10,0 // struct offset (NULL) ++ mr r9,r30 // return area ++ bl Lffi64_struct_to_ram_form$stub ++ lg r1,0(r1) // Restore stack pointer. ++ b L(done_return_value) ++#endif ++ ++L(fp_return_value): ++ /* Do we have long double to store? */ ++ bf 31,L(fd_return_value) ++ stfd f1,0(r30) ++ stfd f2,8(r30) ++ b L(done_return_value) ++ ++L(fd_return_value): ++ /* Do we have double to store? */ ++ bf 28,L(float_return_value) ++ stfd f1,0(r30) ++ b L(done_return_value) ++ ++L(float_return_value): ++ /* We only have a float to store. */ ++ stfs f1,0(r30) ++ b L(done_return_value) ++ ++LFE1: ++/* END(_ffi_call_DARWIN) */ ++ ++/* Provide a null definition of _ffi_call_AIX. */ ++.text ++ .align 2 ++.globl _ffi_call_AIX ++.text ++ .align 2 ++_ffi_call_AIX: ++ blr ++/* END(_ffi_call_AIX) */ ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ; Length of Common Information Entry ++LSCIE1: ++ .long 0x0 ; CIE Identifier Tag ++ .byte 0x1 ; CIE Version ++ .ascii "zR\0" ; CIE Augmentation ++ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor ++ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte 0x41 ; CIE RA Column ++ .byte 0x1 ; uleb128 0x1; Augmentation size ++ .byte 0x10 ; FDE Encoding (pcrel) ++ .byte 0xc ; DW_CFA_def_cfa ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x0 ; uleb128 0x0 ++ .align LOG2_GPR_BYTES ++LECIE1: ++.globl _ffi_call_DARWIN.eh ++_ffi_call_DARWIN.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ; FDE Length ++ ++LASFDE1: ++ .long LASFDE1-EH_frame1 ; FDE CIE offset ++ .g_long LFB0-. ; FDE initial location ++ .set L$set$3,LFE1-LFB0 ++ .g_long L$set$3 ; FDE address range ++ .byte 0x0 ; uleb128 0x0; Augmentation size ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$4,LCFI0-LFB1 ++ .long L$set$4 ++ .byte 0xd ; DW_CFA_def_cfa_register ++ .byte 0x08 ; uleb128 0x08 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$5,LCFI1-LCFI0 ++ .long L$set$5 ++ .byte 0x11 ; DW_CFA_offset_extended_sf ++ .byte 0x41 ; uleb128 0x41 ++ .byte 0x7e ; sleb128 -2 ++ .byte 0x9f ; DW_CFA_offset, column 0x1f ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x9e ; DW_CFA_offset, column 0x1e ++ .byte 0x2 ; uleb128 0x2 ++ .byte 0x9d ; DW_CFA_offset, column 0x1d ++ .byte 0x3 ; uleb128 0x3 ++ .byte 0x9c ; DW_CFA_offset, column 0x1c ++ .byte 0x4 ; uleb128 0x4 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$6,LCFI2-LCFI1 ++ .long L$set$6 ++ .byte 0xd ; DW_CFA_def_cfa_register ++ .byte 0x1c ; uleb128 0x1c ++ .align LOG2_GPR_BYTES ++LEFDE1: ++ ++#if defined(__ppc64__) ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi64_struct_to_ram_form$stub: ++ .indirect_symbol _ffi64_struct_to_ram_form ++ mflr r0 ++ bcl 20,31,LO$ffi64_struct_to_ram_form ++ ++LO$ffi64_struct_to_ram_form: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form) ++ mtlr r0 ++ lgu r12,lo16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi64_struct_to_ram_form$lazy_ptr: ++ .indirect_symbol _ffi64_struct_to_ram_form ++ .g_long dyld_stub_binding_helper ++ ++#endif // __ppc64__ ++#endif // __ppc__ || __ppc64__ +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h +new file mode 100644 +index 0000000..cf4bd50 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h +@@ -0,0 +1,85 @@ ++/* ----------------------------------------------------------------------- ++ ppc-darwin.h - Copyright (c) 2002, 2003, 2004, Free Software Foundation, ++ Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define L(x) x ++ ++#define SF_ARG9 MODE_CHOICE(56,112) ++#define SF_ARG10 MODE_CHOICE(60,120) ++#define SF_ARG11 MODE_CHOICE(64,128) ++#define SF_ARG12 MODE_CHOICE(68,136) ++#define SF_ARG13 MODE_CHOICE(72,144) ++#define SF_ARG14 MODE_CHOICE(76,152) ++#define SF_ARG15 MODE_CHOICE(80,160) ++#define SF_ARG16 MODE_CHOICE(84,168) ++#define SF_ARG17 MODE_CHOICE(88,176) ++#define SF_ARG18 MODE_CHOICE(92,184) ++#define SF_ARG19 MODE_CHOICE(96,192) ++#define SF_ARG20 MODE_CHOICE(100,200) ++#define SF_ARG21 MODE_CHOICE(104,208) ++#define SF_ARG22 MODE_CHOICE(108,216) ++#define SF_ARG23 MODE_CHOICE(112,224) ++#define SF_ARG24 MODE_CHOICE(116,232) ++#define SF_ARG25 MODE_CHOICE(120,240) ++#define SF_ARG26 MODE_CHOICE(124,248) ++#define SF_ARG27 MODE_CHOICE(128,256) ++#define SF_ARG28 MODE_CHOICE(132,264) ++#define SF_ARG29 MODE_CHOICE(136,272) ++ ++#define ASM_NEEDS_REGISTERS 4 ++#define NUM_GPR_ARG_REGISTERS 8 ++#define NUM_FPR_ARG_REGISTERS 13 ++ ++#define FFI_TYPE_1_BYTE(x) ((x) == FFI_TYPE_UINT8 || (x) == FFI_TYPE_SINT8) ++#define FFI_TYPE_2_BYTE(x) ((x) == FFI_TYPE_UINT16 || (x) == FFI_TYPE_SINT16) ++#define FFI_TYPE_4_BYTE(x) \ ++ ((x) == FFI_TYPE_UINT32 || (x) == FFI_TYPE_SINT32 ||\ ++ (x) == FFI_TYPE_INT || (x) == FFI_TYPE_FLOAT) ++ ++#if !defined(LIBFFI_ASM) ++ ++enum { ++ FLAG_RETURNS_NOTHING = 1 << (31 - 30), // cr7 ++ FLAG_RETURNS_FP = 1 << (31 - 29), ++ FLAG_RETURNS_64BITS = 1 << (31 - 28), ++ FLAG_RETURNS_128BITS = 1 << (31 - 31), ++ ++ FLAG_RETURNS_STRUCT = 1 << (31 - 27), // cr6 ++ FLAG_STRUCT_CONTAINS_FP = 1 << (31 - 26), ++ ++ FLAG_ARG_NEEDS_COPY = 1 << (31 - 7), ++ FLAG_FP_ARGUMENTS = 1 << (31 - 6), // cr1.eq; specified by ABI ++ FLAG_4_GPR_ARGUMENTS = 1 << (31 - 5), ++ FLAG_RETVAL_REFERENCE = 1 << (31 - 4) ++}; ++ ++#if defined(__ppc64__) ++void ffi64_struct_to_ram_form(const ffi_type*, const char*, unsigned int*, ++ const char*, unsigned int*, unsigned int*, char*, unsigned int*); ++void ffi64_struct_to_reg_form(const ffi_type*, const char*, unsigned int*, ++ unsigned int*, char*, unsigned int*, char*, unsigned int*); ++bool ffi64_stret_needs_ptr(const ffi_type* inType, ++ unsigned short*, unsigned short*); ++#endif ++ ++#endif // !defined(LIBFFI_ASM) +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S +new file mode 100644 +index 0000000..c3d30c2 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S +@@ -0,0 +1,308 @@ ++#if defined(__ppc__) ++ ++/* ----------------------------------------------------------------------- ++ ppc-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, ++ Inc. based on ppc_closure.S ++ ++ PowerPC Assembly glue. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++ ++#include ++#include // for FFI_TRAMPOLINE_SIZE ++#include ++#include ++ ++ .file "ppc-darwin_closure.S" ++.text ++ .align LOG2_GPR_BYTES ++ .globl _ffi_closure_ASM ++ ++.text ++ .align LOG2_GPR_BYTES ++ ++_ffi_closure_ASM: ++LFB1: ++ mflr r0 // Save return address ++ stg r0,SF_RETURN(r1) ++ ++LCFI0: ++ /* 24/48 bytes (Linkage Area) ++ 32/64 bytes (outgoing parameter area, always reserved) ++ 104 bytes (13*8 from FPR) ++ 16/32 bytes (result) ++ 176/232 total bytes */ ++ ++ /* skip over caller save area and keep stack aligned to 16/32. */ ++ stgu r1,-SF_ROUND(176)(r1) ++ ++LCFI1: ++ /* We want to build up an area for the parameters passed ++ in registers. (both floating point and integer) */ ++ ++ /* 176/256 bytes (callee stack frame aligned to 16/32) ++ 24/48 bytes (caller linkage area) ++ 200/304 (start of caller parameter area aligned to 4/8) ++ */ ++ ++ /* Save GPRs 3 - 10 (aligned to 4/8) ++ in the parents outgoing area. */ ++ stg r3,200(r1) ++ stg r4,204(r1) ++ stg r5,208(r1) ++ stg r6,212(r1) ++ stg r7,216(r1) ++ stg r8,220(r1) ++ stg r9,224(r1) ++ stg r10,228(r1) ++ ++ /* Save FPRs 1 - 13. (aligned to 8) */ ++ stfd f1,56(r1) ++ stfd f2,64(r1) ++ stfd f3,72(r1) ++ stfd f4,80(r1) ++ stfd f5,88(r1) ++ stfd f6,96(r1) ++ stfd f7,104(r1) ++ stfd f8,112(r1) ++ stfd f9,120(r1) ++ stfd f10,128(r1) ++ stfd f11,136(r1) ++ stfd f12,144(r1) ++ stfd f13,152(r1) ++ ++ // Set up registers for the routine that actually does the work. ++ mr r3,r11 // context pointer from the trampoline ++ addi r4,r1,160 // result storage ++ addi r5,r1,200 // saved GPRs ++ addi r6,r1,56 // saved FPRs ++ bl Lffi_closure_helper_DARWIN$stub ++ ++ /* Now r3 contains the return type. Use it to look up in a table ++ so we know how to deal with each type. */ ++ addi r5,r1,160 // Copy result storage pointer. ++ bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. ++ mflr r4 // Move to r4. ++ slwi r3,r3,4 // Multiply return type by 16. ++ add r3,r3,r4 // Add contents of table to table address. ++ mtctr r3 ++ bctr ++ ++LFE1: ++/* Each of the ret_typeX code fragments has to be exactly 16 bytes long ++ (4 instructions). For cache effectiveness we align to a 16 byte boundary ++ first. */ ++ .align 4 ++ nop ++ nop ++ nop ++ ++Lget_ret_type0_addr: ++ blrl ++ ++/* case FFI_TYPE_VOID */ ++Lret_type0: ++ b Lfinish ++ nop ++ nop ++ nop ++ ++/* case FFI_TYPE_INT */ ++Lret_type1: ++ lwz r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_FLOAT */ ++Lret_type2: ++ lfs f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_DOUBLE */ ++Lret_type3: ++ lfd f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_LONGDOUBLE */ ++Lret_type4: ++ lfd f1,0(r5) ++ lfd f2,8(r5) ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_UINT8 */ ++Lret_type5: ++ lbz r3,3(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_SINT8 */ ++Lret_type6: ++ lbz r3,3(r5) ++ extsb r3,r3 ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_UINT16 */ ++Lret_type7: ++ lhz r3,2(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_SINT16 */ ++Lret_type8: ++ lha r3,2(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_UINT32 */ ++Lret_type9: // same as Lret_type1 ++ lwz r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_SINT32 */ ++Lret_type10: // same as Lret_type1 ++ lwz r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_UINT64 */ ++Lret_type11: ++ lwz r3,0(r5) ++ lwz r4,4(r5) ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_SINT64 */ ++Lret_type12: // same as Lret_type11 ++ lwz r3,0(r5) ++ lwz r4,4(r5) ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_STRUCT */ ++Lret_type13: ++ b Lfinish ++ nop ++ nop ++ nop ++ ++/* End 16-byte aligned cases */ ++/* case FFI_TYPE_POINTER */ ++// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types ++// are added in future, the following code will need to be updated and ++// padded to 16 bytes. ++Lret_type14: ++ lg r3,0(r5) ++ // fall through ++ ++/* case done */ ++Lfinish: ++ addi r1,r1,SF_ROUND(176) // Restore stack pointer. ++ lg r0,SF_RETURN(r1) // Restore return address. ++ mtlr r0 // Restore link register. ++ blr ++ ++/* END(ffi_closure_ASM) */ ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ; Length of Common Information Entry ++LSCIE1: ++ .long 0x0 ; CIE Identifier Tag ++ .byte 0x1 ; CIE Version ++ .ascii "zR\0" ; CIE Augmentation ++ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor ++ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte 0x41 ; CIE RA Column ++ .byte 0x1 ; uleb128 0x1; Augmentation size ++ .byte 0x10 ; FDE Encoding (pcrel) ++ .byte 0xc ; DW_CFA_def_cfa ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x0 ; uleb128 0x0 ++ .align LOG2_GPR_BYTES ++LECIE1: ++.globl _ffi_closure_ASM.eh ++_ffi_closure_ASM.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ; FDE Length ++ ++LASFDE1: ++ .long LASFDE1-EH_frame1 ; FDE CIE offset ++ .g_long LFB1-. ; FDE initial location ++ .set L$set$3,LFE1-LFB1 ++ .g_long L$set$3 ; FDE address range ++ .byte 0x0 ; uleb128 0x0; Augmentation size ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$3,LCFI1-LCFI0 ++ .long L$set$3 ++ .byte 0xe ; DW_CFA_def_cfa_offset ++ .byte 176,1 ; uleb128 176 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$4,LCFI0-LFB1 ++ .long L$set$4 ++ .byte 0x11 ; DW_CFA_offset_extended_sf ++ .byte 0x41 ; uleb128 0x41 ++ .byte 0x7e ; sleb128 -2 ++ .align LOG2_GPR_BYTES ++ ++LEFDE1: ++.data ++ .align LOG2_GPR_BYTES ++LDFCM0: ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi_closure_helper_DARWIN$stub: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ mflr r0 ++ bcl 20,31,LO$ffi_closure_helper_DARWIN ++ ++LO$ffi_closure_helper_DARWIN: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) ++ mtlr r0 ++ lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi_closure_helper_DARWIN$lazy_ptr: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ .g_long dyld_stub_binding_helper ++ ++ ++#endif // __ppc__ +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c +new file mode 100644 +index 0000000..8953d5f +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c +@@ -0,0 +1,1776 @@ ++#if defined(__ppc__) || defined(__ppc64__) ++ ++/* ----------------------------------------------------------------------- ++ ffi.c - Copyright (c) 1998 Geoffrey Keating ++ ++ PowerPC Foreign Function Interface ++ ++ Darwin ABI support (c) 2001 John Hornkvist ++ AIX ABI support (c) 2002 Free Software Foundation, Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#if 0 ++#if defined(POWERPC_DARWIN) ++#include // for sys_icache_invalidate() ++#endif ++ ++#else ++ ++#pragma weak sys_icache_invalidate ++extern void sys_icache_invalidate(void *start, size_t len); ++ ++#endif ++ ++ ++extern void ffi_closure_ASM(void); ++ ++// The layout of a function descriptor. A C function pointer really ++// points to one of these. ++typedef struct aix_fd_struct { ++ void* code_pointer; ++ void* toc; ++} aix_fd; ++ ++/* ffi_prep_args is called by the assembly routine once stack space ++ has been allocated for the function's arguments. ++ ++ The stack layout we want looks like this: ++ ++ | Return address from ffi_call_DARWIN | higher addresses ++ |--------------------------------------------| ++ | Previous backchain pointer 4/8 | stack pointer here ++ |--------------------------------------------|-\ <<< on entry to ++ | Saved r28-r31 (4/8)*4 | | ffi_call_DARWIN ++ |--------------------------------------------| | ++ | Parameters (at least 8*(4/8)=32/64) | | (176) +112 - +288 ++ |--------------------------------------------| | ++ | Space for GPR2 4/8 | | ++ |--------------------------------------------| | stack | ++ | Reserved (4/8)*2 | | grows | ++ |--------------------------------------------| | down V ++ | Space for callee's LR 4/8 | | ++ |--------------------------------------------| | lower addresses ++ | Saved CR 4/8 | | ++ |--------------------------------------------| | stack pointer here ++ | Current backchain pointer 4/8 | | during ++ |--------------------------------------------|-/ <<< ffi_call_DARWIN ++ ++ Note: ppc64 CR is saved in the low word of a long on the stack. ++*/ ++ ++/*@-exportheader@*/ ++void ++ffi_prep_args( ++ extended_cif* inEcif, ++ unsigned *const stack) ++/*@=exportheader@*/ ++{ ++ /* Copy the ecif to a local var so we can trample the arg. ++ BC note: test this with GP later for possible problems... */ ++ volatile extended_cif* ecif = inEcif; ++ ++ const unsigned bytes = ecif->cif->bytes; ++ const unsigned flags = ecif->cif->flags; ++ ++ /* Cast the stack arg from int* to long*. sizeof(long) == 4 in 32-bit mode ++ and 8 in 64-bit mode. */ ++ unsigned long *const longStack = (unsigned long *const)stack; ++ ++ /* 'stacktop' points at the previous backchain pointer. */ ++#if defined(__ppc64__) ++ // In ppc-darwin.s, an extra 96 bytes is reserved for the linkage area, ++ // saved registers, and an extra FPR. ++ unsigned long *const stacktop = ++ (unsigned long *)(unsigned long)((char*)longStack + bytes + 96); ++#elif defined(__ppc__) ++ unsigned long *const stacktop = longStack + (bytes / sizeof(long)); ++#else ++#error undefined architecture ++#endif ++ ++ /* 'fpr_base' points at the space for fpr1, and grows upwards as ++ we use FPR registers. */ ++ double* fpr_base = (double*)(stacktop - ASM_NEEDS_REGISTERS) - ++ NUM_FPR_ARG_REGISTERS; ++ ++#if defined(__ppc64__) ++ // 64-bit saves an extra register, and uses an extra FPR. Knock fpr_base ++ // down a couple pegs. ++ fpr_base -= 2; ++#endif ++ ++ unsigned int fparg_count = 0; ++ ++ /* 'next_arg' grows up as we put parameters in it. */ ++ unsigned long* next_arg = longStack + 6; /* 6 reserved positions. */ ++ ++ int i; ++ double double_tmp; ++ void** p_argv = ecif->avalue; ++ unsigned long gprvalue; ++ ffi_type** ptr = ecif->cif->arg_types; ++ ++ /* Check that everything starts aligned properly. */ ++ FFI_ASSERT(stack == SF_ROUND(stack)); ++ FFI_ASSERT(stacktop == SF_ROUND(stacktop)); ++ FFI_ASSERT(bytes == SF_ROUND(bytes)); ++ ++ /* Deal with return values that are actually pass-by-reference. ++ Rule: ++ Return values are referenced by r3, so r4 is the first parameter. */ ++ ++ if (flags & FLAG_RETVAL_REFERENCE) ++ *next_arg++ = (unsigned long)(char*)ecif->rvalue; ++ ++ /* Now for the arguments. */ ++ for (i = ecif->cif->nargs; i > 0; i--, ptr++, p_argv++) ++ { ++ switch ((*ptr)->type) ++ { ++ /* If a floating-point parameter appears before all of the general- ++ purpose registers are filled, the corresponding GPRs that match ++ the size of the floating-point parameter are shadowed for the ++ benefit of vararg and pre-ANSI functions. */ ++ case FFI_TYPE_FLOAT: ++ double_tmp = *(float*)*p_argv; ++ ++ if (fparg_count < NUM_FPR_ARG_REGISTERS) ++ *fpr_base++ = double_tmp; ++ ++ *(double*)next_arg = double_tmp; ++ ++ next_arg++; ++ fparg_count++; ++ FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); ++ ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ double_tmp = *(double*)*p_argv; ++ ++ if (fparg_count < NUM_FPR_ARG_REGISTERS) ++ *fpr_base++ = double_tmp; ++ ++ *(double*)next_arg = double_tmp; ++ ++ next_arg += MODE_CHOICE(2,1); ++ fparg_count++; ++ FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); ++ ++ break; ++ ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++#if defined(__ppc64__) ++ if (fparg_count < NUM_FPR_ARG_REGISTERS) ++ *(long double*)fpr_base = *(long double*)*p_argv; ++#elif defined(__ppc__) ++ if (fparg_count < NUM_FPR_ARG_REGISTERS - 1) ++ *(long double*)fpr_base = *(long double*)*p_argv; ++ else if (fparg_count == NUM_FPR_ARG_REGISTERS - 1) ++ *(double*)fpr_base = *(double*)*p_argv; ++#else ++#error undefined architecture ++#endif ++ ++ *(long double*)next_arg = *(long double*)*p_argv; ++ fparg_count += 2; ++ fpr_base += 2; ++ next_arg += MODE_CHOICE(4,2); ++ FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); ++ ++ break; ++#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++#if defined(__ppc64__) ++ gprvalue = *(long long*)*p_argv; ++ goto putgpr; ++#elif defined(__ppc__) ++ *(long long*)next_arg = *(long long*)*p_argv; ++ next_arg += 2; ++ break; ++#else ++#error undefined architecture ++#endif ++ ++ case FFI_TYPE_POINTER: ++ gprvalue = *(unsigned long*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_UINT8: ++ gprvalue = *(unsigned char*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_SINT8: ++ gprvalue = *(signed char*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_UINT16: ++ gprvalue = *(unsigned short*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_SINT16: ++ gprvalue = *(signed short*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_STRUCT: ++ { ++#if defined(__ppc64__) ++ unsigned int gprSize = 0; ++ unsigned int fprSize = 0; ++ ++ ffi64_struct_to_reg_form(*ptr, (char*)*p_argv, NULL, &fparg_count, ++ (char*)next_arg, &gprSize, (char*)fpr_base, &fprSize); ++ next_arg += gprSize / sizeof(long); ++ fpr_base += fprSize / sizeof(double); ++ ++#elif defined(__ppc__) ++ char* dest_cpy = (char*)next_arg; ++ ++ /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, ++ SI 4 bytes) are aligned as if they were those modes. ++ Structures with 3 byte in size are padded upwards. */ ++ unsigned size_al = (*ptr)->size; ++ ++ /* If the first member of the struct is a double, then align ++ the struct to double-word. */ ++ if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) ++ size_al = ALIGN((*ptr)->size, 8); ++ ++ if (ecif->cif->abi == FFI_DARWIN) ++ { ++ if (size_al < 3) ++ dest_cpy += 4 - size_al; ++ } ++ ++ memcpy((char*)dest_cpy, (char*)*p_argv, size_al); ++ next_arg += (size_al + 3) / 4; ++#else ++#error undefined architecture ++#endif ++ break; ++ } ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ gprvalue = *(unsigned*)*p_argv; ++ ++putgpr: ++ *next_arg++ = gprvalue; ++ break; ++ ++ default: ++ break; ++ } ++ } ++ ++ /* Check that we didn't overrun the stack... */ ++ //FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS); ++ //FFI_ASSERT((unsigned *)fpr_base ++ // <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); ++ //FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); ++} ++ ++#if defined(__ppc64__) ++ ++bool ++ffi64_struct_contains_fp( ++ const ffi_type* inType) ++{ ++ bool containsFP = false; ++ unsigned int i; ++ ++ for (i = 0; inType->elements[i] != NULL && !containsFP; i++) ++ { ++ if (inType->elements[i]->type == FFI_TYPE_FLOAT || ++ inType->elements[i]->type == FFI_TYPE_DOUBLE || ++ inType->elements[i]->type == FFI_TYPE_LONGDOUBLE) ++ containsFP = true; ++ else if (inType->elements[i]->type == FFI_TYPE_STRUCT) ++ containsFP = ffi64_struct_contains_fp(inType->elements[i]); ++ } ++ ++ return containsFP; ++} ++ ++#endif // defined(__ppc64__) ++ ++/* Perform machine dependent cif processing. */ ++ffi_status ++ffi_prep_cif_machdep( ++ ffi_cif* cif) ++{ ++ /* All this is for the DARWIN ABI. */ ++ int i; ++ ffi_type** ptr; ++ int intarg_count = 0; ++ int fparg_count = 0; ++ unsigned int flags = 0; ++ unsigned int size_al = 0; ++ ++ /* All the machine-independent calculation of cif->bytes will be wrong. ++ Redo the calculation for DARWIN. */ ++ ++ /* Space for the frame pointer, callee's LR, CR, etc, and for ++ the asm's temp regs. */ ++ unsigned int bytes = (6 + ASM_NEEDS_REGISTERS) * sizeof(long); ++ ++ /* Return value handling. The rules are as follows: ++ - 32-bit (or less) integer values are returned in gpr3; ++ - Structures of size <= 4 bytes also returned in gpr3; ++ - 64-bit integer values and structures between 5 and 8 bytes are ++ returned in gpr3 and gpr4; ++ - Single/double FP values are returned in fpr1; ++ - Long double FP (if not equivalent to double) values are returned in ++ fpr1 and fpr2; ++ - Larger structures values are allocated space and a pointer is passed ++ as the first argument. */ ++ switch (cif->rtype->type) ++ { ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ flags |= FLAG_RETURNS_128BITS; ++ flags |= FLAG_RETURNS_FP; ++ break; ++#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_DOUBLE: ++ flags |= FLAG_RETURNS_64BITS; ++ /* Fall through. */ ++ case FFI_TYPE_FLOAT: ++ flags |= FLAG_RETURNS_FP; ++ break; ++ ++#if defined(__ppc64__) ++ case FFI_TYPE_POINTER: ++#endif ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ flags |= FLAG_RETURNS_64BITS; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ { ++#if defined(__ppc64__) ++ ++ if (ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) ++ { ++ flags |= FLAG_RETVAL_REFERENCE; ++ flags |= FLAG_RETURNS_NOTHING; ++ intarg_count++; ++ } ++ else ++ { ++ flags |= FLAG_RETURNS_STRUCT; ++ ++ if (ffi64_struct_contains_fp(cif->rtype)) ++ flags |= FLAG_STRUCT_CONTAINS_FP; ++ } ++ ++#elif defined(__ppc__) ++ ++ flags |= FLAG_RETVAL_REFERENCE; ++ flags |= FLAG_RETURNS_NOTHING; ++ intarg_count++; ++ ++#else ++#error undefined architecture ++#endif ++ break; ++ } ++ ++ case FFI_TYPE_VOID: ++ flags |= FLAG_RETURNS_NOTHING; ++ break; ++ ++ default: ++ /* Returns 32-bit integer, or similar. Nothing to do here. */ ++ break; ++ } ++ ++ /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the ++ first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest ++ goes on the stack. Structures are passed as a pointer to a copy of ++ the structure. Stuff on the stack needs to keep proper alignment. */ ++ for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) ++ { ++ switch ((*ptr)->type) ++ { ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ fparg_count++; ++ /* If this FP arg is going on the stack, it must be ++ 8-byte-aligned. */ ++ if (fparg_count > NUM_FPR_ARG_REGISTERS ++ && intarg_count % 2 != 0) ++ intarg_count++; ++ break; ++ ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ fparg_count += 2; ++ /* If this FP arg is going on the stack, it must be ++ 8-byte-aligned. */ ++ ++ if ( ++#if defined(__ppc64__) ++ fparg_count > NUM_FPR_ARG_REGISTERS + 1 ++#elif defined(__ppc__) ++ fparg_count > NUM_FPR_ARG_REGISTERS ++#else ++#error undefined architecture ++#endif ++ && intarg_count % 2 != 0) ++ intarg_count++; ++ ++ intarg_count += 2; ++ break; ++#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ /* 'long long' arguments are passed as two words, but ++ either both words must fit in registers or both go ++ on the stack. If they go on the stack, they must ++ be 8-byte-aligned. */ ++ if (intarg_count == NUM_GPR_ARG_REGISTERS - 1 ++ || (intarg_count >= NUM_GPR_ARG_REGISTERS ++ && intarg_count % 2 != 0)) ++ intarg_count++; ++ ++ intarg_count += MODE_CHOICE(2,1); ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ size_al = (*ptr)->size; ++ /* If the first member of the struct is a double, then align ++ the struct to double-word. */ ++ if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) ++ size_al = ALIGN((*ptr)->size, 8); ++ ++#if defined(__ppc64__) ++ // Look for FP struct members. ++ unsigned int j; ++ ++ for (j = 0; (*ptr)->elements[j] != NULL; j++) ++ { ++ if ((*ptr)->elements[j]->type == FFI_TYPE_FLOAT || ++ (*ptr)->elements[j]->type == FFI_TYPE_DOUBLE) ++ { ++ fparg_count++; ++ ++ if (fparg_count > NUM_FPR_ARG_REGISTERS) ++ intarg_count++; ++ } ++ else if ((*ptr)->elements[j]->type == FFI_TYPE_LONGDOUBLE) ++ { ++ fparg_count += 2; ++ ++ if (fparg_count > NUM_FPR_ARG_REGISTERS + 1) ++ intarg_count += 2; ++ } ++ else ++ intarg_count++; ++ } ++#elif defined(__ppc__) ++ intarg_count += (size_al + 3) / 4; ++#else ++#error undefined architecture ++#endif ++ ++ break; ++ ++ default: ++ /* Everything else is passed as a 4/8-byte word in a GPR, either ++ the object itself or a pointer to it. */ ++ intarg_count++; ++ break; ++ } ++ } ++ ++ /* Space for the FPR registers, if needed. */ ++ if (fparg_count != 0) ++ { ++ flags |= FLAG_FP_ARGUMENTS; ++#if defined(__ppc64__) ++ bytes += (NUM_FPR_ARG_REGISTERS + 1) * sizeof(double); ++#elif defined(__ppc__) ++ bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); ++#else ++#error undefined architecture ++#endif ++ } ++ ++ /* Stack space. */ ++#if defined(__ppc64__) ++ if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS) ++ bytes += (intarg_count + fparg_count) * sizeof(long); ++#elif defined(__ppc__) ++ if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS) ++ bytes += (intarg_count + 2 * fparg_count) * sizeof(long); ++#else ++#error undefined architecture ++#endif ++ else ++ bytes += NUM_GPR_ARG_REGISTERS * sizeof(long); ++ ++ /* The stack space allocated needs to be a multiple of 16/32 bytes. */ ++ bytes = SF_ROUND(bytes); ++ ++ cif->flags = flags; ++ cif->bytes = bytes; ++ ++ return FFI_OK; ++} ++ ++/*@-declundef@*/ ++/*@-exportheader@*/ ++extern void ++ffi_call_AIX( ++/*@out@*/ extended_cif*, ++ unsigned, ++ unsigned, ++/*@out@*/ unsigned*, ++ void (*fn)(void), ++ void (*fn2)(extended_cif*, unsigned *const)); ++ ++extern void ++ffi_call_DARWIN( ++/*@out@*/ extended_cif*, ++ unsigned long, ++ unsigned, ++/*@out@*/ unsigned*, ++ void (*fn)(void), ++ void (*fn2)(extended_cif*, unsigned *const)); ++/*@=declundef@*/ ++/*@=exportheader@*/ ++ ++void ++ffi_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ void** avalue) ++{ ++ extended_cif ecif; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return ++ value address then we need to make one. */ ++ if ((rvalue == NULL) && ++ (cif->rtype->type == FFI_TYPE_STRUCT)) ++ { ++ /*@-sysunrecog@*/ ++ ecif.rvalue = alloca(cif->rtype->size); ++ /*@=sysunrecog@*/ ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ switch (cif->abi) ++ { ++ case FFI_AIX: ++ /*@-usedef@*/ ++ ffi_call_AIX(&ecif, -cif->bytes, ++ cif->flags, ecif.rvalue, fn, ffi_prep_args); ++ /*@=usedef@*/ ++ break; ++ ++ case FFI_DARWIN: ++ /*@-usedef@*/ ++ ffi_call_DARWIN(&ecif, -(long)cif->bytes, ++ cif->flags, ecif.rvalue, fn, ffi_prep_args); ++ /*@=usedef@*/ ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++/* here I'd like to add the stack frame layout we use in darwin_closure.S ++ and aix_clsoure.S ++ ++ SP previous -> +---------------------------------------+ <--- child frame ++ | back chain to caller 4 | ++ +---------------------------------------+ 4 ++ | saved CR 4 | ++ +---------------------------------------+ 8 ++ | saved LR 4 | ++ +---------------------------------------+ 12 ++ | reserved for compilers 4 | ++ +---------------------------------------+ 16 ++ | reserved for binders 4 | ++ +---------------------------------------+ 20 ++ | saved TOC pointer 4 | ++ +---------------------------------------+ 24 ++ | always reserved 8*4=32 (previous GPRs)| ++ | according to the linkage convention | ++ | from AIX | ++ +---------------------------------------+ 56 ++ | our FPR area 13*8=104 | ++ | f1 | ++ | . | ++ | f13 | ++ +---------------------------------------+ 160 ++ | result area 8 | ++ +---------------------------------------+ 168 ++ | alignement to the next multiple of 16 | ++SP current --> +---------------------------------------+ 176 <- parent frame ++ | back chain to caller 4 | ++ +---------------------------------------+ 180 ++ | saved CR 4 | ++ +---------------------------------------+ 184 ++ | saved LR 4 | ++ +---------------------------------------+ 188 ++ | reserved for compilers 4 | ++ +---------------------------------------+ 192 ++ | reserved for binders 4 | ++ +---------------------------------------+ 196 ++ | saved TOC pointer 4 | ++ +---------------------------------------+ 200 ++ | always reserved 8*4=32 we store our | ++ | GPRs here | ++ | r3 | ++ | . | ++ | r10 | ++ +---------------------------------------+ 232 ++ | overflow part | ++ +---------------------------------------+ xxx ++ | ???? | ++ +---------------------------------------+ xxx ++*/ ++ ++#if !defined(POWERPC_DARWIN) ++ ++#define MIN_LINE_SIZE 32 ++ ++static void ++flush_icache( ++ char* addr) ++{ ++#ifndef _AIX ++ __asm__ volatile ( ++ "dcbf 0,%0\n" ++ "sync\n" ++ "icbi 0,%0\n" ++ "sync\n" ++ "isync" ++ : : "r" (addr) : "memory"); ++#endif ++} ++ ++static void ++flush_range( ++ char* addr, ++ int size) ++{ ++ int i; ++ ++ for (i = 0; i < size; i += MIN_LINE_SIZE) ++ flush_icache(addr + i); ++ ++ flush_icache(addr + size - 1); ++} ++ ++#endif // !defined(POWERPC_DARWIN) ++ ++ffi_status ++ffi_prep_closure( ++ ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*, void*, void**, void*), ++ void* user_data) ++{ ++ switch (cif->abi) ++ { ++ case FFI_DARWIN: ++ { ++ FFI_ASSERT (cif->abi == FFI_DARWIN); ++ ++ unsigned int* tramp = (unsigned int*)&closure->tramp[0]; ++ ++#if defined(__ppc64__) ++ tramp[0] = 0x7c0802a6; // mflr r0 ++ tramp[1] = 0x429f0005; // bcl 20,31,+0x8 ++ tramp[2] = 0x7d6802a6; // mflr r11 ++ tramp[3] = 0x7c0803a6; // mtlr r0 ++ tramp[4] = 0xe98b0018; // ld r12,24(r11) ++ tramp[5] = 0x7d8903a6; // mtctr r12 ++ tramp[6] = 0xe96b0020; // ld r11,32(r11) ++ tramp[7] = 0x4e800420; // bctr ++ *(unsigned long*)&tramp[8] = (unsigned long)ffi_closure_ASM; ++ *(unsigned long*)&tramp[10] = (unsigned long)closure; ++#elif defined(__ppc__) ++ tramp[0] = 0x7c0802a6; // mflr r0 ++ tramp[1] = 0x429f0005; // bcl 20,31,+0x8 ++ tramp[2] = 0x7d6802a6; // mflr r11 ++ tramp[3] = 0x7c0803a6; // mtlr r0 ++ tramp[4] = 0x818b0018; // lwz r12,24(r11) ++ tramp[5] = 0x7d8903a6; // mtctr r12 ++ tramp[6] = 0x816b001c; // lwz r11,28(r11) ++ tramp[7] = 0x4e800420; // bctr ++ tramp[8] = (unsigned long)ffi_closure_ASM; ++ tramp[9] = (unsigned long)closure; ++#else ++#error undefined architecture ++#endif ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ ++ // Flush the icache. Only necessary on Darwin. ++#if defined(POWERPC_DARWIN) ++ sys_icache_invalidate(closure->tramp, FFI_TRAMPOLINE_SIZE); ++#else ++ flush_range(closure->tramp, FFI_TRAMPOLINE_SIZE); ++#endif ++ ++ break; ++ } ++ ++ case FFI_AIX: ++ { ++ FFI_ASSERT (cif->abi == FFI_AIX); ++ ++ ffi_aix_trampoline_struct* tramp_aix = ++ (ffi_aix_trampoline_struct*)(closure->tramp); ++ aix_fd* fd = (aix_fd*)(void*)ffi_closure_ASM; ++ ++ tramp_aix->code_pointer = fd->code_pointer; ++ tramp_aix->toc = fd->toc; ++ tramp_aix->static_chain = closure; ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ break; ++ } ++ ++ default: ++ return FFI_BAD_ABI; ++ } ++ ++ return FFI_OK; ++} ++ ++#if defined(__ppc__) ++ typedef double ldbits[2]; ++ ++ typedef union ++ { ++ ldbits lb; ++ long double ld; ++ } ldu; ++#endif ++ ++typedef union ++{ ++ float f; ++ double d; ++} ffi_dblfl; ++ ++/* The trampoline invokes ffi_closure_ASM, and on entry, r11 holds the ++ address of the closure. After storing the registers that could possibly ++ contain parameters to be passed into the stack frame and setting up space ++ for a return value, ffi_closure_ASM invokes the following helper function ++ to do most of the work. */ ++int ++ffi_closure_helper_DARWIN( ++ ffi_closure* closure, ++ void* rvalue, ++ unsigned long* pgr, ++ ffi_dblfl* pfr) ++{ ++ /* rvalue is the pointer to space for return value in closure assembly ++ pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM ++ pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM. */ ++ ++#if defined(__ppc__) ++ ldu temp_ld; ++#endif ++ ++ double temp; ++ unsigned int i; ++ unsigned int nf = 0; /* number of FPRs already used. */ ++ unsigned int ng = 0; /* number of GPRs already used. */ ++ ffi_cif* cif = closure->cif; ++ long avn = cif->nargs; ++ void** avalue = alloca(cif->nargs * sizeof(void*)); ++ ffi_type** arg_types = cif->arg_types; ++ ++ /* Copy the caller's structure return value address so that the closure ++ returns the data directly to the caller. */ ++#if defined(__ppc64__) ++ if (cif->rtype->type == FFI_TYPE_STRUCT && ++ ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) ++#elif defined(__ppc__) ++ if (cif->rtype->type == FFI_TYPE_STRUCT) ++#else ++#error undefined architecture ++#endif ++ { ++ rvalue = (void*)*pgr; ++ pgr++; ++ ng++; ++ } ++ ++ /* Grab the addresses of the arguments from the stack frame. */ ++ for (i = 0; i < avn; i++) ++ { ++ switch (arg_types[i]->type) ++ { ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT8: ++ avalue[i] = (char*)pgr + MODE_CHOICE(3,7); ++ ng++; ++ pgr++; ++ break; ++ ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT16: ++ avalue[i] = (char*)pgr + MODE_CHOICE(2,6); ++ ng++; ++ pgr++; ++ break; ++ ++#if defined(__ppc__) ++ case FFI_TYPE_POINTER: ++#endif ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT32: ++ avalue[i] = (char*)pgr + MODE_CHOICE(0,4); ++ ng++; ++ pgr++; ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ if (cif->abi == FFI_DARWIN) ++ { ++#if defined(__ppc64__) ++ unsigned int gprSize = 0; ++ unsigned int fprSize = 0; ++ unsigned int savedFPRSize = fprSize; ++ ++ avalue[i] = alloca(arg_types[i]->size); ++ ffi64_struct_to_ram_form(arg_types[i], (const char*)pgr, ++ &gprSize, (const char*)pfr, &fprSize, &nf, avalue[i], NULL); ++ ++ ng += gprSize / sizeof(long); ++ pgr += gprSize / sizeof(long); ++ pfr += (fprSize - savedFPRSize) / sizeof(double); ++ ++#elif defined(__ppc__) ++ /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, ++ SI 4 bytes) are aligned as if they were those modes. */ ++ unsigned int size_al = size_al = arg_types[i]->size; ++ ++ /* If the first member of the struct is a double, then align ++ the struct to double-word. */ ++ if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE) ++ size_al = ALIGN(arg_types[i]->size, 8); ++ ++ if (size_al < 3) ++ avalue[i] = (void*)pgr + MODE_CHOICE(4,8) - size_al; ++ else ++ avalue[i] = (void*)pgr; ++ ++ ng += (size_al + 3) / sizeof(long); ++ pgr += (size_al + 3) / sizeof(long); ++#else ++#error undefined architecture ++#endif ++ } ++ ++ break; ++ ++#if defined(__ppc64__) ++ case FFI_TYPE_POINTER: ++#endif ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_UINT64: ++ /* Long long ints are passed in 1 or 2 GPRs. */ ++ avalue[i] = pgr; ++ ng += MODE_CHOICE(2,1); ++ pgr += MODE_CHOICE(2,1); ++ ++ break; ++ ++ case FFI_TYPE_FLOAT: ++ /* A float value consumes a GPR. ++ There are 13 64-bit floating point registers. */ ++ if (nf < NUM_FPR_ARG_REGISTERS) ++ { ++ temp = pfr->d; ++ pfr->f = (float)temp; ++ avalue[i] = pfr; ++ pfr++; ++ } ++ else ++ avalue[i] = pgr; ++ ++ nf++; ++ ng++; ++ pgr++; ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ /* A double value consumes one or two GPRs. ++ There are 13 64bit floating point registers. */ ++ if (nf < NUM_FPR_ARG_REGISTERS) ++ { ++ avalue[i] = pfr; ++ pfr++; ++ } ++ else ++ avalue[i] = pgr; ++ ++ nf++; ++ ng += MODE_CHOICE(2,1); ++ pgr += MODE_CHOICE(2,1); ++ ++ break; ++ ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_LONGDOUBLE: ++#if defined(__ppc64__) ++ if (nf < NUM_FPR_ARG_REGISTERS) ++ { ++ avalue[i] = pfr; ++ pfr += 2; ++ } ++#elif defined(__ppc__) ++ /* A long double value consumes 2/4 GPRs and 2 FPRs. ++ There are 13 64bit floating point registers. */ ++ if (nf < NUM_FPR_ARG_REGISTERS - 1) ++ { ++ avalue[i] = pfr; ++ pfr += 2; ++ } ++ /* Here we have the situation where one part of the long double ++ is stored in fpr13 and the other part is already on the stack. ++ We use a union to pass the long double to avalue[i]. */ ++ else if (nf == NUM_FPR_ARG_REGISTERS - 1) ++ { ++ memcpy (&temp_ld.lb[0], pfr, sizeof(temp_ld.lb[0])); ++ memcpy (&temp_ld.lb[1], pgr + 2, sizeof(temp_ld.lb[1])); ++ avalue[i] = &temp_ld.ld; ++ } ++#else ++#error undefined architecture ++#endif ++ else ++ avalue[i] = pgr; ++ ++ nf += 2; ++ ng += MODE_CHOICE(4,2); ++ pgr += MODE_CHOICE(4,2); ++ ++ break; ++ ++#endif /* FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE */ ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ } ++ ++ (closure->fun)(cif, rvalue, avalue, closure->user_data); ++ ++ /* Tell ffi_closure_ASM to perform return type promotions. */ ++ return cif->rtype->type; ++} ++ ++#if defined(__ppc64__) ++ ++/* ffi64_struct_to_ram_form ++ ++ Rebuild a struct's natural layout from buffers of concatenated registers. ++ Return the number of registers used. ++ inGPRs[0-7] == r3, inFPRs[0-7] == f1 ... ++*/ ++void ++ffi64_struct_to_ram_form( ++ const ffi_type* inType, ++ const char* inGPRs, ++ unsigned int* ioGPRMarker, ++ const char* inFPRs, ++ unsigned int* ioFPRMarker, ++ unsigned int* ioFPRsUsed, ++ char* outStruct, // caller-allocated ++ unsigned int* ioStructMarker) ++{ ++ unsigned int srcGMarker = 0; ++ unsigned int srcFMarker = 0; ++ unsigned int savedFMarker = 0; ++ unsigned int fprsUsed = 0; ++ unsigned int savedFPRsUsed = 0; ++ unsigned int destMarker = 0; ++ ++ static unsigned int recurseCount = 0; ++ ++ if (ioGPRMarker) ++ srcGMarker = *ioGPRMarker; ++ ++ if (ioFPRMarker) ++ { ++ srcFMarker = *ioFPRMarker; ++ savedFMarker = srcFMarker; ++ } ++ ++ if (ioFPRsUsed) ++ { ++ fprsUsed = *ioFPRsUsed; ++ savedFPRsUsed = fprsUsed; ++ } ++ ++ if (ioStructMarker) ++ destMarker = *ioStructMarker; ++ ++ size_t i; ++ ++ switch (inType->size) ++ { ++ case 1: case 2: case 4: ++ srcGMarker += 8 - inType->size; ++ break; ++ ++ default: ++ break; ++ } ++ ++ for (i = 0; inType->elements[i] != NULL; i++) ++ { ++ switch (inType->elements[i]->type) ++ { ++ case FFI_TYPE_FLOAT: ++ srcFMarker = ALIGN(srcFMarker, 4); ++ srcGMarker = ALIGN(srcGMarker, 4); ++ destMarker = ALIGN(destMarker, 4); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ *(float*)&outStruct[destMarker] = ++ (float)*(double*)&inFPRs[srcFMarker]; ++ srcFMarker += 8; ++ fprsUsed++; ++ } ++ else ++ *(float*)&outStruct[destMarker] = ++ (float)*(double*)&inGPRs[srcGMarker]; ++ ++ srcGMarker += 4; ++ destMarker += 4; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (destMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) ++ srcGMarker = ALIGN(srcGMarker, 8); ++ } ++ ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ srcFMarker = ALIGN(srcFMarker, 8); ++ destMarker = ALIGN(destMarker, 8); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ *(double*)&outStruct[destMarker] = ++ *(double*)&inFPRs[srcFMarker]; ++ srcFMarker += 8; ++ fprsUsed++; ++ } ++ else ++ *(double*)&outStruct[destMarker] = ++ *(double*)&inGPRs[srcGMarker]; ++ ++ destMarker += 8; ++ ++ // Skip next GPR ++ srcGMarker += 8; ++ srcGMarker = ALIGN(srcGMarker, 8); ++ ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ destMarker = ALIGN(destMarker, 16); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ srcFMarker = ALIGN(srcFMarker, 8); ++ srcGMarker = ALIGN(srcGMarker, 8); ++ *(long double*)&outStruct[destMarker] = ++ *(long double*)&inFPRs[srcFMarker]; ++ srcFMarker += 16; ++ fprsUsed += 2; ++ } ++ else ++ { ++ srcFMarker = ALIGN(srcFMarker, 16); ++ srcGMarker = ALIGN(srcGMarker, 16); ++ *(long double*)&outStruct[destMarker] = ++ *(long double*)&inGPRs[srcGMarker]; ++ } ++ ++ destMarker += 16; ++ ++ // Skip next 2 GPRs ++ srcGMarker += 16; ++ srcGMarker = ALIGN(srcGMarker, 8); ++ ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ { ++ if (inType->alignment == 1) // chars only ++ { ++ if (inType->size == 1) ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ else if (inType->size == 2) ++ { ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ i++; ++ } ++ else ++ { ++ memcpy(&outStruct[destMarker], ++ &inGPRs[srcGMarker], inType->size); ++ srcGMarker += inType->size; ++ destMarker += inType->size; ++ i += inType->size - 1; ++ } ++ } ++ else // chars and other stuff ++ { ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (srcGMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) ++ srcGMarker = ALIGN(srcGMarker, inType->alignment); // was 8 ++ } ++ } ++ ++ break; ++ } ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ srcGMarker = ALIGN(srcGMarker, 2); ++ destMarker = ALIGN(destMarker, 2); ++ ++ *(short*)&outStruct[destMarker] = ++ *(short*)&inGPRs[srcGMarker]; ++ srcGMarker += 2; ++ destMarker += 2; ++ ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ srcGMarker = ALIGN(srcGMarker, 4); ++ destMarker = ALIGN(destMarker, 4); ++ ++ *(int*)&outStruct[destMarker] = ++ *(int*)&inGPRs[srcGMarker]; ++ srcGMarker += 4; ++ destMarker += 4; ++ ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ srcGMarker = ALIGN(srcGMarker, 8); ++ destMarker = ALIGN(destMarker, 8); ++ ++ *(long long*)&outStruct[destMarker] = ++ *(long long*)&inGPRs[srcGMarker]; ++ srcGMarker += 8; ++ destMarker += 8; ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ recurseCount++; ++ ffi64_struct_to_ram_form(inType->elements[i], inGPRs, ++ &srcGMarker, inFPRs, &srcFMarker, &fprsUsed, ++ outStruct, &destMarker); ++ recurseCount--; ++ break; ++ ++ default: ++ FFI_ASSERT(0); // unknown element type ++ break; ++ } ++ } ++ ++ srcGMarker = ALIGN(srcGMarker, inType->alignment); ++ ++ // Take care of the special case for 16-byte structs, but not for ++ // nested structs. ++ if (recurseCount == 0 && srcGMarker == 16) ++ { ++ *(long double*)&outStruct[0] = *(long double*)&inGPRs[0]; ++ srcFMarker = savedFMarker; ++ fprsUsed = savedFPRsUsed; ++ } ++ ++ if (ioGPRMarker) ++ *ioGPRMarker = ALIGN(srcGMarker, 8); ++ ++ if (ioFPRMarker) ++ *ioFPRMarker = srcFMarker; ++ ++ if (ioFPRsUsed) ++ *ioFPRsUsed = fprsUsed; ++ ++ if (ioStructMarker) ++ *ioStructMarker = ALIGN(destMarker, 8); ++} ++ ++/* ffi64_struct_to_reg_form ++ ++ Copy a struct's elements into buffers that can be sliced into registers. ++ Return the sizes of the output buffers in bytes. Pass NULL buffer pointers ++ to calculate size only. ++ outGPRs[0-7] == r3, outFPRs[0-7] == f1 ... ++*/ ++void ++ffi64_struct_to_reg_form( ++ const ffi_type* inType, ++ const char* inStruct, ++ unsigned int* ioStructMarker, ++ unsigned int* ioFPRsUsed, ++ char* outGPRs, // caller-allocated ++ unsigned int* ioGPRSize, ++ char* outFPRs, // caller-allocated ++ unsigned int* ioFPRSize) ++{ ++ size_t i; ++ unsigned int srcMarker = 0; ++ unsigned int destGMarker = 0; ++ unsigned int destFMarker = 0; ++ unsigned int savedFMarker = 0; ++ unsigned int fprsUsed = 0; ++ unsigned int savedFPRsUsed = 0; ++ ++ static unsigned int recurseCount = 0; ++ ++ if (ioStructMarker) ++ srcMarker = *ioStructMarker; ++ ++ if (ioFPRsUsed) ++ { ++ fprsUsed = *ioFPRsUsed; ++ savedFPRsUsed = fprsUsed; ++ } ++ ++ if (ioGPRSize) ++ destGMarker = *ioGPRSize; ++ ++ if (ioFPRSize) ++ { ++ destFMarker = *ioFPRSize; ++ savedFMarker = destFMarker; ++ } ++ ++ switch (inType->size) ++ { ++ case 1: case 2: case 4: ++ destGMarker += 8 - inType->size; ++ break; ++ ++ default: ++ break; ++ } ++ ++ for (i = 0; inType->elements[i] != NULL; i++) ++ { ++ switch (inType->elements[i]->type) ++ { ++ // Shadow floating-point types in GPRs for vararg and pre-ANSI ++ // functions. ++ case FFI_TYPE_FLOAT: ++ // Nudge markers to next 4/8-byte boundary ++ srcMarker = ALIGN(srcMarker, 4); ++ destGMarker = ALIGN(destGMarker, 4); ++ destFMarker = ALIGN(destFMarker, 8); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ if (outFPRs != NULL && inStruct != NULL) ++ *(double*)&outFPRs[destFMarker] = ++ (double)*(float*)&inStruct[srcMarker]; ++ ++ destFMarker += 8; ++ fprsUsed++; ++ } ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(double*)&outGPRs[destGMarker] = ++ (double)*(float*)&inStruct[srcMarker]; ++ ++ srcMarker += 4; ++ destGMarker += 4; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (srcMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 4)) ++ destGMarker = ALIGN(destGMarker, 8); ++ } ++ ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ srcMarker = ALIGN(srcMarker, 8); ++ destFMarker = ALIGN(destFMarker, 8); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ if (outFPRs != NULL && inStruct != NULL) ++ *(double*)&outFPRs[destFMarker] = ++ *(double*)&inStruct[srcMarker]; ++ ++ destFMarker += 8; ++ fprsUsed++; ++ } ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(double*)&outGPRs[destGMarker] = ++ *(double*)&inStruct[srcMarker]; ++ ++ srcMarker += 8; ++ ++ // Skip next GPR ++ destGMarker += 8; ++ destGMarker = ALIGN(destGMarker, 8); ++ ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ srcMarker = ALIGN(srcMarker, 16); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ destFMarker = ALIGN(destFMarker, 8); ++ destGMarker = ALIGN(destGMarker, 8); ++ ++ if (outFPRs != NULL && inStruct != NULL) ++ *(long double*)&outFPRs[destFMarker] = ++ *(long double*)&inStruct[srcMarker]; ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long double*)&outGPRs[destGMarker] = ++ *(long double*)&inStruct[srcMarker]; ++ ++ destFMarker += 16; ++ fprsUsed += 2; ++ } ++ else ++ { ++ destGMarker = ALIGN(destGMarker, 16); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long double*)&outGPRs[destGMarker] = ++ *(long double*)&inStruct[srcMarker]; ++ } ++ ++ srcMarker += 16; ++ destGMarker += 16; // Skip next 2 GPRs ++ destGMarker = ALIGN(destGMarker, 8); // was 16 ++ ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ if (inType->alignment == 1) // bytes only ++ { ++ if (inType->size == 1) ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ outGPRs[destGMarker] = inStruct[srcMarker]; ++ ++ srcMarker++; ++ destGMarker++; ++ } ++ else if (inType->size == 2) ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ { ++ outGPRs[destGMarker] = inStruct[srcMarker]; ++ outGPRs[destGMarker + 1] = inStruct[srcMarker + 1]; ++ } ++ ++ srcMarker += 2; ++ destGMarker += 2; ++ ++ i++; ++ } ++ else ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ { ++ // Avoid memcpy for small chunks. ++ if (inType->size <= sizeof(long)) ++ *(long*)&outGPRs[destGMarker] = ++ *(long*)&inStruct[srcMarker]; ++ else ++ memcpy(&outGPRs[destGMarker], ++ &inStruct[srcMarker], inType->size); ++ } ++ ++ srcMarker += inType->size; ++ destGMarker += inType->size; ++ i += inType->size - 1; ++ } ++ } ++ else // bytes and other stuff ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ outGPRs[destGMarker] = inStruct[srcMarker]; ++ ++ srcMarker++; ++ destGMarker++; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (destGMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 4)) ++ destGMarker = ALIGN(destGMarker, inType->alignment); // was 8 ++ } ++ } ++ ++ break; ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ srcMarker = ALIGN(srcMarker, 2); ++ destGMarker = ALIGN(destGMarker, 2); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(short*)&outGPRs[destGMarker] = ++ *(short*)&inStruct[srcMarker]; ++ ++ srcMarker += 2; ++ destGMarker += 2; ++ ++ if (inType->elements[i + 1] == NULL) ++ destGMarker = ALIGN(destGMarker, inType->alignment); ++ ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ srcMarker = ALIGN(srcMarker, 4); ++ destGMarker = ALIGN(destGMarker, 4); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(int*)&outGPRs[destGMarker] = ++ *(int*)&inStruct[srcMarker]; ++ ++ srcMarker += 4; ++ destGMarker += 4; ++ ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ srcMarker = ALIGN(srcMarker, 8); ++ destGMarker = ALIGN(destGMarker, 8); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long long*)&outGPRs[destGMarker] = ++ *(long long*)&inStruct[srcMarker]; ++ ++ srcMarker += 8; ++ destGMarker += 8; ++ ++ if (inType->elements[i + 1] == NULL) ++ destGMarker = ALIGN(destGMarker, inType->alignment); ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ recurseCount++; ++ ffi64_struct_to_reg_form(inType->elements[i], ++ inStruct, &srcMarker, &fprsUsed, outGPRs, ++ &destGMarker, outFPRs, &destFMarker); ++ recurseCount--; ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ } ++ ++ destGMarker = ALIGN(destGMarker, inType->alignment); ++ ++ // Take care of the special case for 16-byte structs, but not for ++ // nested structs. ++ if (recurseCount == 0 && destGMarker == 16) ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long double*)&outGPRs[0] = *(long double*)&inStruct[0]; ++ ++ destFMarker = savedFMarker; ++ fprsUsed = savedFPRsUsed; ++ } ++ ++ if (ioStructMarker) ++ *ioStructMarker = ALIGN(srcMarker, 8); ++ ++ if (ioFPRsUsed) ++ *ioFPRsUsed = fprsUsed; ++ ++ if (ioGPRSize) ++ *ioGPRSize = ALIGN(destGMarker, 8); ++ ++ if (ioFPRSize) ++ *ioFPRSize = ALIGN(destFMarker, 8); ++} ++ ++/* ffi64_stret_needs_ptr ++ ++ Determine whether a returned struct needs a pointer in r3 or can fit ++ in registers. ++*/ ++ ++bool ++ffi64_stret_needs_ptr( ++ const ffi_type* inType, ++ unsigned short* ioGPRCount, ++ unsigned short* ioFPRCount) ++{ ++ // Obvious case first- struct is larger than combined FPR size. ++ if (inType->size > 14 * 8) ++ return true; ++ ++ // Now the struct can physically fit in registers, determine if it ++ // also fits logically. ++ bool needsPtr = false; ++ unsigned short gprsUsed = 0; ++ unsigned short fprsUsed = 0; ++ size_t i; ++ ++ if (ioGPRCount) ++ gprsUsed = *ioGPRCount; ++ ++ if (ioFPRCount) ++ fprsUsed = *ioFPRCount; ++ ++ for (i = 0; inType->elements[i] != NULL && !needsPtr; i++) ++ { ++ switch (inType->elements[i]->type) ++ { ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ gprsUsed++; ++ fprsUsed++; ++ ++ if (fprsUsed > 13) ++ needsPtr = true; ++ ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ gprsUsed += 2; ++ fprsUsed += 2; ++ ++ if (fprsUsed > 14) ++ needsPtr = true; ++ ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ { ++ gprsUsed++; ++ ++ if (gprsUsed > 8) ++ { ++ needsPtr = true; ++ break; ++ } ++ ++ if (inType->elements[i + 1] == NULL) // last byte in the struct ++ break; ++ ++ // Count possible contiguous bytes ahead, up to 8. ++ unsigned short j; ++ ++ for (j = 1; j < 8; j++) ++ { ++ if (inType->elements[i + j] == NULL || ++ !FFI_TYPE_1_BYTE(inType->elements[i + j]->type)) ++ break; ++ } ++ ++ i += j - 1; // allow for i++ before the test condition ++ ++ break; ++ } ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ gprsUsed++; ++ ++ if (gprsUsed > 8) ++ needsPtr = true; ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ needsPtr = ffi64_stret_needs_ptr( ++ inType->elements[i], &gprsUsed, &fprsUsed); ++ ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ } ++ ++ if (ioGPRCount) ++ *ioGPRCount = gprsUsed; ++ ++ if (ioFPRCount) ++ *ioFPRCount = fprsUsed; ++ ++ return needsPtr; ++} ++ ++/* ffi64_data_size ++ ++ Calculate the size in bytes of an ffi type. ++*/ ++ ++unsigned int ++ffi64_data_size( ++ const ffi_type* inType) ++{ ++ unsigned int size = 0; ++ ++ switch (inType->type) ++ { ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ size = 1; ++ break; ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ size = 2; ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_FLOAT: ++ size = 4; ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_DOUBLE: ++ size = 8; ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ size = 16; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ ffi64_struct_to_reg_form( ++ inType, NULL, NULL, NULL, NULL, &size, NULL, NULL); ++ break; ++ ++ case FFI_TYPE_VOID: ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ ++ return size; ++} ++ ++#endif /* defined(__ppc64__) */ ++#endif /* __ppc__ || __ppc64__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S +new file mode 100644 +index 0000000..7162fa1 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S +@@ -0,0 +1,418 @@ ++#if defined(__ppc64__) ++ ++/* ----------------------------------------------------------------------- ++ ppc64-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, ++ Inc. based on ppc_closure.S ++ ++ PowerPC Assembly glue. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++ ++#include ++#include // for FFI_TRAMPOLINE_SIZE ++#include ++#include ++ ++ .file "ppc64-darwin_closure.S" ++.text ++ .align LOG2_GPR_BYTES ++ .globl _ffi_closure_ASM ++ ++.text ++ .align LOG2_GPR_BYTES ++ ++_ffi_closure_ASM: ++LFB1: ++ mflr r0 ++ stg r0,SF_RETURN(r1) // save return address ++ ++ // Save GPRs 3 - 10 (aligned to 8) in the parents outgoing area. ++ stg r3,SF_ARG1(r1) ++ stg r4,SF_ARG2(r1) ++ stg r5,SF_ARG3(r1) ++ stg r6,SF_ARG4(r1) ++ stg r7,SF_ARG5(r1) ++ stg r8,SF_ARG6(r1) ++ stg r9,SF_ARG7(r1) ++ stg r10,SF_ARG8(r1) ++ ++LCFI0: ++/* 48 bytes (Linkage Area) ++ 64 bytes (outgoing parameter area, always reserved) ++ 112 bytes (14*8 for incoming FPR) ++ ? bytes (result) ++ 112 bytes (14*8 for outgoing FPR) ++ 16 bytes (2 saved registers) ++ 352 + ? total bytes ++*/ ++ ++ std r31,-8(r1) // Save registers we use. ++ std r30,-16(r1) ++ mr r30,r1 // Save the old SP. ++ mr r31,r11 // Save the ffi_closure around ffi64_data_size. ++ ++ // Calculate the space we need. ++ stdu r1,-SF_MINSIZE(r1) ++ ld r3,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* ++ ld r3,16(r3) // ffi_cif->rtype* ++ bl Lffi64_data_size$stub ++ ld r1,0(r1) ++ ++ addi r3,r3,352 // Add our overhead. ++ neg r3,r3 ++ li r0,-32 // Align to 32 bytes. ++ and r3,r3,r0 ++ stdux r1,r1,r3 // Grow the stack. ++ ++ mr r11,r31 // Copy the ffi_closure back. ++ ++LCFI1: ++ // We want to build up an area for the parameters passed ++ // in registers. (both floating point and integer) ++ ++/* 320 bytes (callee stack frame aligned to 32) ++ 48 bytes (caller linkage area) ++ 368 (start of caller parameter area aligned to 8) ++*/ ++ ++ // Save FPRs 1 - 14. (aligned to 8) ++ stfd f1,112(r1) ++ stfd f2,120(r1) ++ stfd f3,128(r1) ++ stfd f4,136(r1) ++ stfd f5,144(r1) ++ stfd f6,152(r1) ++ stfd f7,160(r1) ++ stfd f8,168(r1) ++ stfd f9,176(r1) ++ stfd f10,184(r1) ++ stfd f11,192(r1) ++ stfd f12,200(r1) ++ stfd f13,208(r1) ++ stfd f14,216(r1) ++ ++ // Set up registers for the routine that actually does the work. ++ mr r3,r11 // context pointer from the trampoline ++ addi r4,r1,224 // result storage ++ addi r5,r30,SF_ARG1 // saved GPRs ++ addi r6,r1,112 // saved FPRs ++ bl Lffi_closure_helper_DARWIN$stub ++ ++ // Look the proper starting point in table ++ // by using return type as an offset. ++ addi r5,r1,224 // Get pointer to results area. ++ bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. ++ mflr r4 // Move to r4. ++ slwi r3,r3,4 // Now multiply return type by 16. ++ add r3,r3,r4 // Add contents of table to table address. ++ mtctr r3 ++ bctr ++ ++LFE1: ++ // Each of the ret_typeX code fragments has to be exactly 16 bytes long ++ // (4 instructions). For cache effectiveness we align to a 16 byte ++ // boundary first. ++ .align 4 ++ nop ++ nop ++ nop ++ ++Lget_ret_type0_addr: ++ blrl ++ ++// case FFI_TYPE_VOID ++Lret_type0: ++ b Lfinish ++ nop ++ nop ++ nop ++ ++// case FFI_TYPE_INT ++Lret_type1: ++ lwz r3,4(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_FLOAT ++Lret_type2: ++ lfs f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_DOUBLE ++Lret_type3: ++ lfd f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_LONGDOUBLE ++Lret_type4: ++ lfd f1,0(r5) ++ lfd f2,8(r5) ++ b Lfinish ++ nop ++ ++// case FFI_TYPE_UINT8 ++Lret_type5: ++ lbz r3,7(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT8 ++Lret_type6: ++ lbz r3,7(r5) ++ extsb r3,r3 ++ b Lfinish ++ nop ++ ++// case FFI_TYPE_UINT16 ++Lret_type7: ++ lhz r3,6(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT16 ++Lret_type8: ++ lha r3,6(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_UINT32 ++Lret_type9: // same as Lret_type1 ++ lwz r3,4(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT32 ++Lret_type10: // same as Lret_type1 ++ lwz r3,4(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_UINT64 ++Lret_type11: ++ ld r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT64 ++Lret_type12: // same as Lret_type11 ++ ld r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_STRUCT ++Lret_type13: ++ b Lret_struct ++ nop ++ nop ++ nop ++ ++// ** End 16-byte aligned cases ** ++// case FFI_TYPE_POINTER ++// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types ++// are added in future, the following code will need to be updated and ++// padded to 16 bytes. ++Lret_type14: ++ lg r3,0(r5) ++ b Lfinish ++ ++// copy struct into registers ++Lret_struct: ++ ld r31,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* ++ ld r3,16(r31) // ffi_cif->rtype* ++ ld r31,24(r31) // ffi_cif->flags ++ mr r4,r5 // copy struct* to 2nd arg ++ addi r7,r1,SF_ARG9 // GPR return area ++ addi r9,r30,-16-(14*8) // FPR return area ++ li r5,0 // struct offset ptr (NULL) ++ li r6,0 // FPR used count ptr (NULL) ++ li r8,0 // GPR return area size ptr (NULL) ++ li r10,0 // FPR return area size ptr (NULL) ++ bl Lffi64_struct_to_reg_form$stub ++ ++ // Load GPRs ++ ld r3,SF_ARG9(r1) ++ ld r4,SF_ARG10(r1) ++ ld r5,SF_ARG11(r1) ++ ld r6,SF_ARG12(r1) ++ nop ++ ld r7,SF_ARG13(r1) ++ ld r8,SF_ARG14(r1) ++ ld r9,SF_ARG15(r1) ++ ld r10,SF_ARG16(r1) ++ nop ++ ++ // Load FPRs ++ mtcrf 0x2,r31 ++ bf 26,Lfinish ++ lfd f1,-16-(14*8)(r30) ++ lfd f2,-16-(13*8)(r30) ++ lfd f3,-16-(12*8)(r30) ++ lfd f4,-16-(11*8)(r30) ++ nop ++ lfd f5,-16-(10*8)(r30) ++ lfd f6,-16-(9*8)(r30) ++ lfd f7,-16-(8*8)(r30) ++ lfd f8,-16-(7*8)(r30) ++ nop ++ lfd f9,-16-(6*8)(r30) ++ lfd f10,-16-(5*8)(r30) ++ lfd f11,-16-(4*8)(r30) ++ lfd f12,-16-(3*8)(r30) ++ nop ++ lfd f13,-16-(2*8)(r30) ++ lfd f14,-16-(1*8)(r30) ++ // Fall through ++ ++// case done ++Lfinish: ++ lg r1,0(r1) // Restore stack pointer. ++ ld r31,-8(r1) // Restore registers we used. ++ ld r30,-16(r1) ++ lg r0,SF_RETURN(r1) // Get return address. ++ mtlr r0 // Reset link register. ++ blr ++ ++// END(ffi_closure_ASM) ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ; Length of Common Information Entry ++LSCIE1: ++ .long 0x0 ; CIE Identifier Tag ++ .byte 0x1 ; CIE Version ++ .ascii "zR\0" ; CIE Augmentation ++ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor ++ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte 0x41 ; CIE RA Column ++ .byte 0x1 ; uleb128 0x1; Augmentation size ++ .byte 0x10 ; FDE Encoding (pcrel) ++ .byte 0xc ; DW_CFA_def_cfa ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x0 ; uleb128 0x0 ++ .align LOG2_GPR_BYTES ++LECIE1: ++.globl _ffi_closure_ASM.eh ++_ffi_closure_ASM.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ; FDE Length ++ ++LASFDE1: ++ .long LASFDE1-EH_frame1 ; FDE CIE offset ++ .g_long LFB1-. ; FDE initial location ++ .set L$set$3,LFE1-LFB1 ++ .g_long L$set$3 ; FDE address range ++ .byte 0x0 ; uleb128 0x0; Augmentation size ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$3,LCFI1-LCFI0 ++ .long L$set$3 ++ .byte 0xe ; DW_CFA_def_cfa_offset ++ .byte 176,1 ; uleb128 176 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$4,LCFI0-LFB1 ++ .long L$set$4 ++ .byte 0x11 ; DW_CFA_offset_extended_sf ++ .byte 0x41 ; uleb128 0x41 ++ .byte 0x7e ; sleb128 -2 ++ .align LOG2_GPR_BYTES ++ ++LEFDE1: ++.data ++ .align LOG2_GPR_BYTES ++LDFCM0: ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi_closure_helper_DARWIN$stub: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ mflr r0 ++ bcl 20,31,LO$ffi_closure_helper_DARWIN ++ ++LO$ffi_closure_helper_DARWIN: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) ++ mtlr r0 ++ lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi_closure_helper_DARWIN$lazy_ptr: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ .g_long dyld_stub_binding_helper ++ ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi64_struct_to_reg_form$stub: ++ .indirect_symbol _ffi64_struct_to_reg_form ++ mflr r0 ++ bcl 20,31,LO$ffi64_struct_to_reg_form ++ ++LO$ffi64_struct_to_reg_form: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form) ++ mtlr r0 ++ lgu r12,lo16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form)(r11) ++ mtctr r12 ++ bctr ++ ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi64_data_size$stub: ++ .indirect_symbol _ffi64_data_size ++ mflr r0 ++ bcl 20,31,LO$ffi64_data_size ++ ++LO$ffi64_data_size: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size) ++ mtlr r0 ++ lgu r12,lo16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi64_struct_to_reg_form$lazy_ptr: ++ .indirect_symbol _ffi64_struct_to_reg_form ++ .g_long dyld_stub_binding_helper ++ ++L_ffi64_data_size$lazy_ptr: ++ .indirect_symbol _ffi64_data_size ++ .g_long dyld_stub_binding_helper ++ ++#endif // __ppc64__ +diff -r -u ./Modules/_ctypes/libffi_osx/types.c ./Modules/_ctypes/libffi_osx/types.c +new file mode 100644 +index 0000000..44806ae +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/types.c +@@ -0,0 +1,115 @@ ++/* ----------------------------------------------------------------------- ++ types.c - Copyright (c) 1996, 1998 Red Hat, Inc. ++ ++ Predefined ffi_types needed by libffi. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++/* Type definitions */ ++#define FFI_INTEGRAL_TYPEDEF(n, s, a, t) \ ++ ffi_type ffi_type_##n = { s, a, t, NULL } ++#define FFI_AGGREGATE_TYPEDEF(n, e) \ ++ ffi_type ffi_type_##n = { 0, 0, FFI_TYPE_STRUCT, e } ++ ++FFI_INTEGRAL_TYPEDEF(uint8, 1, 1, FFI_TYPE_UINT8); ++FFI_INTEGRAL_TYPEDEF(sint8, 1, 1, FFI_TYPE_SINT8); ++FFI_INTEGRAL_TYPEDEF(uint16, 2, 2, FFI_TYPE_UINT16); ++FFI_INTEGRAL_TYPEDEF(sint16, 2, 2, FFI_TYPE_SINT16); ++FFI_INTEGRAL_TYPEDEF(uint32, 4, 4, FFI_TYPE_UINT32); ++FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32); ++FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT); ++ ++/* Size and alignment are fake here. They must not be 0. */ ++FFI_INTEGRAL_TYPEDEF(void, 1, 1, FFI_TYPE_VOID); ++ ++#if defined ALPHA || defined SPARC64 || defined X86_64 || \ ++ defined S390X || defined IA64 || defined POWERPC64 ++FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER); ++#else ++FFI_INTEGRAL_TYPEDEF(pointer, 4, 4, FFI_TYPE_POINTER); ++#endif ++ ++#if defined X86 || defined ARM || defined M68K || defined(X86_DARWIN) ++ ++# ifdef X86_64 ++ FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); ++ FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); ++# else ++ FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); ++ FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); ++# endif ++ ++#elif defined(POWERPC_DARWIN) ++FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); ++FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); ++#elif defined SH ++FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); ++FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); ++#else ++FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); ++FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); ++#endif ++ ++#if defined X86 || defined X86_WIN32 || defined M68K || defined(X86_DARWIN) ++ ++# if defined X86_WIN32 || defined X86_64 ++ FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); ++# endif ++ ++# ifdef X86_DARWIN ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE); ++# endif ++ ++#elif defined ARM || defined SH || defined POWERPC_AIX ++FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); ++FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE); ++#elif defined POWERPC_DARWIN ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++ ++# if __GNUC__ >= 4 ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); ++# endif ++ ++#elif defined SPARC ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++ ++# ifdef SPARC64 ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE); ++# endif ++ ++#elif defined X86_64 || defined POWERPC64 ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++#else ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); ++#endif +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/x86/darwin64.S ./Modules/_ctypes/libffi_osx/x86/darwin64.S +new file mode 100644 +index 0000000..165d469 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/darwin64.S +@@ -0,0 +1,417 @@ ++/* ----------------------------------------------------------------------- ++ darwin64.S - Copyright (c) 2006 Free Software Foundation, Inc. ++ derived from unix64.S ++ ++ x86-64 Foreign Function Interface for Darwin. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#ifdef __x86_64__ ++#define LIBFFI_ASM ++#include ++#include ++ ++ .file "darwin64.S" ++.text ++ ++/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, ++ void *raddr, void (*fnaddr)()); ++ ++ Bit o trickiness here -- ARGS+BYTES is the base of the stack frame ++ for this function. This has been allocated by ffi_call. We also ++ deallocate some of the stack that has been alloca'd. */ ++ ++ .align 3 ++ .globl _ffi_call_unix64 ++ ++_ffi_call_unix64: ++LUW0: ++ movq (%rsp), %r10 /* Load return address. */ ++ movq %rdi, %r12 /* Save a copy of the register area. */ ++ leaq (%rdi, %rsi), %rax /* Find local stack base. */ ++ movq %rdx, (%rax) /* Save flags. */ ++ movq %rcx, 8(%rax) /* Save raddr. */ ++ movq %rbp, 16(%rax) /* Save old frame pointer. */ ++ movq %r10, 24(%rax) /* Relocate return address. */ ++ movq %rax, %rbp /* Finalize local stack frame. */ ++LUW1: ++ /* movq %rdi, %r10 // Save a copy of the register area. */ ++ movq %r12, %r10 ++ movq %r8, %r11 /* Save a copy of the target fn. */ ++ movl %r9d, %eax /* Set number of SSE registers. */ ++ ++ /* Load up all argument registers. */ ++ movq (%r10), %rdi ++ movq 8(%r10), %rsi ++ movq 16(%r10), %rdx ++ movq 24(%r10), %rcx ++ movq 32(%r10), %r8 ++ movq 40(%r10), %r9 ++ testl %eax, %eax ++ jnz Lload_sse ++Lret_from_load_sse: ++ ++ /* Deallocate the reg arg area. */ ++ leaq 176(%r10), %rsp ++ ++ /* Call the user function. */ ++ call *%r11 ++ ++ /* Deallocate stack arg area; local stack frame in redzone. */ ++ leaq 24(%rbp), %rsp ++ ++ movq 0(%rbp), %rcx /* Reload flags. */ ++ movq 8(%rbp), %rdi /* Reload raddr. */ ++ movq 16(%rbp), %rbp /* Reload old frame pointer. */ ++LUW2: ++ ++ /* The first byte of the flags contains the FFI_TYPE. */ ++ movzbl %cl, %r10d ++ leaq Lstore_table(%rip), %r11 ++ movslq (%r11, %r10, 4), %r10 ++ addq %r11, %r10 ++ jmp *%r10 ++ ++Lstore_table: ++ .long Lst_void-Lstore_table /* FFI_TYPE_VOID */ ++ .long Lst_sint32-Lstore_table /* FFI_TYPE_INT */ ++ .long Lst_float-Lstore_table /* FFI_TYPE_FLOAT */ ++ .long Lst_double-Lstore_table /* FFI_TYPE_DOUBLE */ ++ .long Lst_ldouble-Lstore_table /* FFI_TYPE_LONGDOUBLE */ ++ .long Lst_uint8-Lstore_table /* FFI_TYPE_UINT8 */ ++ .long Lst_sint8-Lstore_table /* FFI_TYPE_SINT8 */ ++ .long Lst_uint16-Lstore_table /* FFI_TYPE_UINT16 */ ++ .long Lst_sint16-Lstore_table /* FFI_TYPE_SINT16 */ ++ .long Lst_uint32-Lstore_table /* FFI_TYPE_UINT32 */ ++ .long Lst_sint32-Lstore_table /* FFI_TYPE_SINT32 */ ++ .long Lst_int64-Lstore_table /* FFI_TYPE_UINT64 */ ++ .long Lst_int64-Lstore_table /* FFI_TYPE_SINT64 */ ++ .long Lst_struct-Lstore_table /* FFI_TYPE_STRUCT */ ++ .long Lst_int64-Lstore_table /* FFI_TYPE_POINTER */ ++ ++ .text ++ .align 3 ++Lst_void: ++ ret ++ .align 3 ++Lst_uint8: ++ movzbq %al, %rax ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_sint8: ++ movsbq %al, %rax ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_uint16: ++ movzwq %ax, %rax ++ movq %rax, (%rdi) ++ .align 3 ++Lst_sint16: ++ movswq %ax, %rax ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_uint32: ++ movl %eax, %eax ++ movq %rax, (%rdi) ++ .align 3 ++Lst_sint32: ++ cltq ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_int64: ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_float: ++ movss %xmm0, (%rdi) ++ ret ++ .align 3 ++Lst_double: ++ movsd %xmm0, (%rdi) ++ ret ++Lst_ldouble: ++ fstpt (%rdi) ++ ret ++ .align 3 ++Lst_struct: ++ leaq -20(%rsp), %rsi /* Scratch area in redzone. */ ++ ++ /* We have to locate the values now, and since we don't want to ++ write too much data into the user's return value, we spill the ++ value to a 16 byte scratch area first. Bits 8, 9, and 10 ++ control where the values are located. Only one of the three ++ bits will be set; see ffi_prep_cif_machdep for the pattern. */ ++ movd %xmm0, %r10 ++ movd %xmm1, %r11 ++ testl $0x100, %ecx ++ cmovnz %rax, %rdx ++ cmovnz %r10, %rax ++ testl $0x200, %ecx ++ cmovnz %r10, %rdx ++ testl $0x400, %ecx ++ cmovnz %r10, %rax ++ cmovnz %r11, %rdx ++ movq %rax, (%rsi) ++ movq %rdx, 8(%rsi) ++ ++ /* Bits 12-31 contain the true size of the structure. Copy from ++ the scratch area to the true destination. */ ++ shrl $12, %ecx ++ rep movsb ++ ret ++ ++ /* Many times we can avoid loading any SSE registers at all. ++ It's not worth an indirect jump to load the exact set of ++ SSE registers needed; zero or all is a good compromise. */ ++ .align 3 ++LUW3: ++Lload_sse: ++ movdqa 48(%r10), %xmm0 ++ movdqa 64(%r10), %xmm1 ++ movdqa 80(%r10), %xmm2 ++ movdqa 96(%r10), %xmm3 ++ movdqa 112(%r10), %xmm4 ++ movdqa 128(%r10), %xmm5 ++ movdqa 144(%r10), %xmm6 ++ movdqa 160(%r10), %xmm7 ++ jmp Lret_from_load_sse ++ ++LUW4: ++ .align 3 ++ .globl _ffi_closure_unix64 ++ ++_ffi_closure_unix64: ++LUW5: ++ /* The carry flag is set by the trampoline iff SSE registers ++ are used. Don't clobber it before the branch instruction. */ ++ leaq -200(%rsp), %rsp ++LUW6: ++ movq %rdi, (%rsp) ++ movq %rsi, 8(%rsp) ++ movq %rdx, 16(%rsp) ++ movq %rcx, 24(%rsp) ++ movq %r8, 32(%rsp) ++ movq %r9, 40(%rsp) ++ jc Lsave_sse ++Lret_from_save_sse: ++ ++ movq %r10, %rdi ++ leaq 176(%rsp), %rsi ++ movq %rsp, %rdx ++ leaq 208(%rsp), %rcx ++ call _ffi_closure_unix64_inner ++ ++ /* Deallocate stack frame early; return value is now in redzone. */ ++ addq $200, %rsp ++LUW7: ++ ++ /* The first byte of the return value contains the FFI_TYPE. */ ++ movzbl %al, %r10d ++ leaq Lload_table(%rip), %r11 ++ movslq (%r11, %r10, 4), %r10 ++ addq %r11, %r10 ++ jmp *%r10 ++ ++Lload_table: ++ .long Lld_void-Lload_table /* FFI_TYPE_VOID */ ++ .long Lld_int32-Lload_table /* FFI_TYPE_INT */ ++ .long Lld_float-Lload_table /* FFI_TYPE_FLOAT */ ++ .long Lld_double-Lload_table /* FFI_TYPE_DOUBLE */ ++ .long Lld_ldouble-Lload_table /* FFI_TYPE_LONGDOUBLE */ ++ .long Lld_int8-Lload_table /* FFI_TYPE_UINT8 */ ++ .long Lld_int8-Lload_table /* FFI_TYPE_SINT8 */ ++ .long Lld_int16-Lload_table /* FFI_TYPE_UINT16 */ ++ .long Lld_int16-Lload_table /* FFI_TYPE_SINT16 */ ++ .long Lld_int32-Lload_table /* FFI_TYPE_UINT32 */ ++ .long Lld_int32-Lload_table /* FFI_TYPE_SINT32 */ ++ .long Lld_int64-Lload_table /* FFI_TYPE_UINT64 */ ++ .long Lld_int64-Lload_table /* FFI_TYPE_SINT64 */ ++ .long Lld_struct-Lload_table /* FFI_TYPE_STRUCT */ ++ .long Lld_int64-Lload_table /* FFI_TYPE_POINTER */ ++ ++ .text ++ .align 3 ++Lld_void: ++ ret ++ .align 3 ++Lld_int8: ++ movzbl -24(%rsp), %eax ++ ret ++ .align 3 ++Lld_int16: ++ movzwl -24(%rsp), %eax ++ ret ++ .align 3 ++Lld_int32: ++ movl -24(%rsp), %eax ++ ret ++ .align 3 ++Lld_int64: ++ movq -24(%rsp), %rax ++ ret ++ .align 3 ++Lld_float: ++ movss -24(%rsp), %xmm0 ++ ret ++ .align 3 ++Lld_double: ++ movsd -24(%rsp), %xmm0 ++ ret ++ .align 3 ++Lld_ldouble: ++ fldt -24(%rsp) ++ ret ++ .align 3 ++Lld_struct: ++ /* There are four possibilities here, %rax/%rdx, %xmm0/%rax, ++ %rax/%xmm0, %xmm0/%xmm1. We collapse two by always loading ++ both rdx and xmm1 with the second word. For the remaining, ++ bit 8 set means xmm0 gets the second word, and bit 9 means ++ that rax gets the second word. */ ++ movq -24(%rsp), %rcx ++ movq -16(%rsp), %rdx ++ movq -16(%rsp), %xmm1 ++ testl $0x100, %eax ++ cmovnz %rdx, %rcx ++ movd %rcx, %xmm0 ++ testl $0x200, %eax ++ movq -24(%rsp), %rax ++ cmovnz %rdx, %rax ++ ret ++ ++ /* See the comment above Lload_sse; the same logic applies here. */ ++ .align 3 ++LUW8: ++Lsave_sse: ++ movdqa %xmm0, 48(%rsp) ++ movdqa %xmm1, 64(%rsp) ++ movdqa %xmm2, 80(%rsp) ++ movdqa %xmm3, 96(%rsp) ++ movdqa %xmm4, 112(%rsp) ++ movdqa %xmm5, 128(%rsp) ++ movdqa %xmm6, 144(%rsp) ++ movdqa %xmm7, 160(%rsp) ++ jmp Lret_from_save_sse ++ ++LUW9: ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 /* CIE Length */ ++ .long L$set$0 ++LSCIE1: ++ .long 0x0 /* CIE Identifier Tag */ ++ .byte 0x1 /* CIE Version */ ++ .ascii "zR\0" /* CIE Augmentation */ ++ .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ ++ .byte 0x78 /* sleb128 -8; CIE Data Alignment Factor */ ++ .byte 0x10 /* CIE RA Column */ ++ .byte 0x1 /* uleb128 0x1; Augmentation size */ ++ .byte 0x10 /* FDE Encoding (pcrel sdata4) */ ++ .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ ++ .byte 0x7 /* uleb128 0x7 */ ++ .byte 0x8 /* uleb128 0x8 */ ++ .byte 0x90 /* DW_CFA_offset, column 0x10 */ ++ .byte 0x1 ++ .align 3 ++LECIE1: ++ .globl _ffi_call_unix64.eh ++_ffi_call_unix64.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 /* FDE Length */ ++ .long L$set$1 ++LASFDE1: ++ .long LASFDE1-EH_frame1 /* FDE CIE offset */ ++ .quad LUW0-. /* FDE initial location */ ++ .set L$set$2,LUW4-LUW0 /* FDE address range */ ++ .quad L$set$2 ++ .byte 0x0 /* Augmentation size */ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$3,LUW1-LUW0 ++ .long L$set$3 ++ ++ /* New stack frame based off rbp. This is a itty bit of unwind ++ trickery in that the CFA *has* changed. There is no easy way ++ to describe it correctly on entry to the function. Fortunately, ++ it doesn't matter too much since at all points we can correctly ++ unwind back to ffi_call. Note that the location to which we ++ moved the return address is (the new) CFA-8, so from the ++ perspective of the unwind info, it hasn't moved. */ ++ .byte 0xc /* DW_CFA_def_cfa, %rbp offset 32 */ ++ .byte 0x6 ++ .byte 0x20 ++ .byte 0x80+6 /* DW_CFA_offset, %rbp offset 2*-8 */ ++ .byte 0x2 ++ .byte 0xa /* DW_CFA_remember_state */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$4,LUW2-LUW1 ++ .long L$set$4 ++ .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ ++ .byte 0x7 ++ .byte 0x8 ++ .byte 0xc0+6 /* DW_CFA_restore, %rbp */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$5,LUW3-LUW2 ++ .long L$set$5 ++ .byte 0xb /* DW_CFA_restore_state */ ++ ++ .align 3 ++LEFDE1: ++ .globl _ffi_closure_unix64.eh ++_ffi_closure_unix64.eh: ++LSFDE3: ++ .set L$set$6,LEFDE3-LASFDE3 /* FDE Length */ ++ .long L$set$6 ++LASFDE3: ++ .long LASFDE3-EH_frame1 /* FDE CIE offset */ ++ .quad LUW5-. /* FDE initial location */ ++ .set L$set$7,LUW9-LUW5 /* FDE address range */ ++ .quad L$set$7 ++ .byte 0x0 /* Augmentation size */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$8,LUW6-LUW5 ++ .long L$set$8 ++ .byte 0xe /* DW_CFA_def_cfa_offset */ ++ .byte 208,1 /* uleb128 208 */ ++ .byte 0xa /* DW_CFA_remember_state */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$9,LUW7-LUW6 ++ .long L$set$9 ++ .byte 0xe /* DW_CFA_def_cfa_offset */ ++ .byte 0x8 ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$10,LUW8-LUW7 ++ .long L$set$10 ++ .byte 0xb /* DW_CFA_restore_state */ ++ ++ .align 3 ++LEFDE3: ++ .subsections_via_symbols ++ ++#endif /* __x86_64__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S +new file mode 100644 +index 0000000..925a841 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S +@@ -0,0 +1,422 @@ ++#ifdef __i386__ ++/* ----------------------------------------------------------------------- ++ darwin.S - Copyright (c) 1996, 1998, 2001, 2002, 2003 Red Hat, Inc. ++ ++ X86 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++/* ++ * This file is based on sysv.S and then hacked up by Ronald who hasn't done ++ * assembly programming in 8 years. ++ */ ++ ++#ifndef __x86_64__ ++ ++#define LIBFFI_ASM ++#include ++#include ++ ++#ifdef PyObjC_STRICT_DEBUGGING ++ /* XXX: Debugging of stack alignment, to be removed */ ++#define ASSERT_STACK_ALIGNED movdqa -16(%esp), %xmm0 ++#else ++#define ASSERT_STACK_ALIGNED ++#endif ++ ++.text ++ ++.globl _ffi_prep_args ++ ++ .align 4 ++.globl _ffi_call_SYSV ++ ++_ffi_call_SYSV: ++LFB1: ++ pushl %ebp ++LCFI0: ++ movl %esp,%ebp ++LCFI1: ++ subl $8,%esp ++ /* Make room for all of the new args. */ ++ movl 16(%ebp),%ecx ++ subl %ecx,%esp ++ ++ movl %esp,%eax ++ ++ /* Place all of the ffi_prep_args in position */ ++ subl $8,%esp ++ pushl 12(%ebp) ++ pushl %eax ++ call *8(%ebp) ++ ++ /* Return stack to previous state and call the function */ ++ addl $16,%esp ++ ++ call *28(%ebp) ++ ++ /* Remove the space we pushed for the args */ ++ movl 16(%ebp),%ecx ++ addl %ecx,%esp ++ ++ /* Load %ecx with the return type code */ ++ movl 20(%ebp),%ecx ++ ++ /* If the return value pointer is NULL, assume no return value. */ ++ cmpl $0,24(%ebp) ++ jne Lretint ++ ++ /* Even if there is no space for the return value, we are ++ obliged to handle floating-point values. */ ++ cmpl $FFI_TYPE_FLOAT,%ecx ++ jne Lnoretval ++ fstp %st(0) ++ ++ jmp Lepilogue ++ ++Lretint: ++ cmpl $FFI_TYPE_INT,%ecx ++ jne Lretfloat ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movl %eax,0(%ecx) ++ jmp Lepilogue ++ ++Lretfloat: ++ cmpl $FFI_TYPE_FLOAT,%ecx ++ jne Lretdouble ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ fstps (%ecx) ++ jmp Lepilogue ++ ++Lretdouble: ++ cmpl $FFI_TYPE_DOUBLE,%ecx ++ jne Lretlongdouble ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ fstpl (%ecx) ++ jmp Lepilogue ++ ++Lretlongdouble: ++ cmpl $FFI_TYPE_LONGDOUBLE,%ecx ++ jne Lretint64 ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ fstpt (%ecx) ++ jmp Lepilogue ++ ++Lretint64: ++ cmpl $FFI_TYPE_SINT64,%ecx ++ jne Lretstruct1b ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movl %eax,0(%ecx) ++ movl %edx,4(%ecx) ++ jmp Lepilogue ++ ++Lretstruct1b: ++ cmpl $FFI_TYPE_SINT8,%ecx ++ jne Lretstruct2b ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movb %al,0(%ecx) ++ jmp Lepilogue ++ ++Lretstruct2b: ++ cmpl $FFI_TYPE_SINT16,%ecx ++ jne Lretstruct ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movw %ax,0(%ecx) ++ jmp Lepilogue ++ ++Lretstruct: ++ cmpl $FFI_TYPE_STRUCT,%ecx ++ jne Lnoretval ++ /* Nothing to do! */ ++ addl $4,%esp ++ popl %ebp ++ ret ++ ++Lnoretval: ++Lepilogue: ++ addl $8,%esp ++ movl %ebp,%esp ++ popl %ebp ++ ret ++LFE1: ++.ffi_call_SYSV_end: ++ ++ .align 4 ++FFI_HIDDEN (ffi_closure_SYSV) ++.globl _ffi_closure_SYSV ++ ++_ffi_closure_SYSV: ++LFB2: ++ pushl %ebp ++LCFI2: ++ movl %esp, %ebp ++LCFI3: ++ subl $56, %esp ++ leal -40(%ebp), %edx ++ movl %edx, -12(%ebp) /* resp */ ++ leal 8(%ebp), %edx ++ movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ ++ leal -12(%ebp), %edx ++ movl %edx, (%esp) /* &resp */ ++ movl %ebx, 8(%esp) ++LCFI7: ++ call L_ffi_closure_SYSV_inner$stub ++ movl 8(%esp), %ebx ++ movl -12(%ebp), %ecx ++ cmpl $FFI_TYPE_INT, %eax ++ je Lcls_retint ++ cmpl $FFI_TYPE_FLOAT, %eax ++ je Lcls_retfloat ++ cmpl $FFI_TYPE_DOUBLE, %eax ++ je Lcls_retdouble ++ cmpl $FFI_TYPE_LONGDOUBLE, %eax ++ je Lcls_retldouble ++ cmpl $FFI_TYPE_SINT64, %eax ++ je Lcls_retllong ++ cmpl $FFI_TYPE_UINT8, %eax ++ je Lcls_retstruct1 ++ cmpl $FFI_TYPE_SINT8, %eax ++ je Lcls_retstruct1 ++ cmpl $FFI_TYPE_UINT16, %eax ++ je Lcls_retstruct2 ++ cmpl $FFI_TYPE_SINT16, %eax ++ je Lcls_retstruct2 ++ cmpl $FFI_TYPE_STRUCT, %eax ++ je Lcls_retstruct ++Lcls_epilogue: ++ movl %ebp, %esp ++ popl %ebp ++ ret ++Lcls_retint: ++ movl (%ecx), %eax ++ jmp Lcls_epilogue ++Lcls_retfloat: ++ flds (%ecx) ++ jmp Lcls_epilogue ++Lcls_retdouble: ++ fldl (%ecx) ++ jmp Lcls_epilogue ++Lcls_retldouble: ++ fldt (%ecx) ++ jmp Lcls_epilogue ++Lcls_retllong: ++ movl (%ecx), %eax ++ movl 4(%ecx), %edx ++ jmp Lcls_epilogue ++Lcls_retstruct1: ++ movsbl (%ecx), %eax ++ jmp Lcls_epilogue ++Lcls_retstruct2: ++ movswl (%ecx), %eax ++ jmp Lcls_epilogue ++Lcls_retstruct: ++ lea -8(%ebp),%esp ++ movl %ebp, %esp ++ popl %ebp ++ ret $4 ++LFE2: ++ ++#if !FFI_NO_RAW_API ++ ++#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) ++#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) ++#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) ++#define CIF_FLAGS_OFFSET 20 ++ ++ .align 4 ++FFI_HIDDEN (ffi_closure_raw_SYSV) ++.globl _ffi_closure_raw_SYSV ++ ++_ffi_closure_raw_SYSV: ++LFB3: ++ pushl %ebp ++LCFI4: ++ movl %esp, %ebp ++LCFI5: ++ pushl %esi ++LCFI6: ++ subl $36, %esp ++ movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ ++ movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ ++ movl %edx, 12(%esp) /* user_data */ ++ leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ ++ movl %edx, 8(%esp) /* raw_args */ ++ leal -24(%ebp), %edx ++ movl %edx, 4(%esp) /* &res */ ++ movl %esi, (%esp) /* cif */ ++ call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ ++ movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ ++ cmpl $FFI_TYPE_INT, %eax ++ je Lrcls_retint ++ cmpl $FFI_TYPE_FLOAT, %eax ++ je Lrcls_retfloat ++ cmpl $FFI_TYPE_DOUBLE, %eax ++ je Lrcls_retdouble ++ cmpl $FFI_TYPE_LONGDOUBLE, %eax ++ je Lrcls_retldouble ++ cmpl $FFI_TYPE_SINT64, %eax ++ je Lrcls_retllong ++Lrcls_epilogue: ++ addl $36, %esp ++ popl %esi ++ popl %ebp ++ ret ++Lrcls_retint: ++ movl -24(%ebp), %eax ++ jmp Lrcls_epilogue ++Lrcls_retfloat: ++ flds -24(%ebp) ++ jmp Lrcls_epilogue ++Lrcls_retdouble: ++ fldl -24(%ebp) ++ jmp Lrcls_epilogue ++Lrcls_retldouble: ++ fldt -24(%ebp) ++ jmp Lrcls_epilogue ++Lrcls_retllong: ++ movl -24(%ebp), %eax ++ movl -20(%ebp), %edx ++ jmp Lrcls_epilogue ++LFE3: ++#endif ++ ++.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5 ++L_ffi_closure_SYSV_inner$stub: ++ .indirect_symbol _ffi_closure_SYSV_inner ++ hlt ; hlt ; hlt ; hlt ; hlt ++ ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ++LSCIE1: ++ .long 0x0 ++ .byte 0x1 ++ .ascii "zR\0" ++ .byte 0x1 ++ .byte 0x7c ++ .byte 0x8 ++ .byte 0x1 ++ .byte 0x10 ++ .byte 0xc ++ .byte 0x5 ++ .byte 0x4 ++ .byte 0x88 ++ .byte 0x1 ++ .align 2 ++LECIE1: ++.globl _ffi_call_SYSV.eh ++_ffi_call_SYSV.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ++LASFDE1: ++ .long LASFDE1-EH_frame1 ++ .long LFB1-. ++ .set L$set$2,LFE1-LFB1 ++ .long L$set$2 ++ .byte 0x0 ++ .byte 0x4 ++ .set L$set$3,LCFI0-LFB1 ++ .long L$set$3 ++ .byte 0xe ++ .byte 0x8 ++ .byte 0x84 ++ .byte 0x2 ++ .byte 0x4 ++ .set L$set$4,LCFI1-LCFI0 ++ .long L$set$4 ++ .byte 0xd ++ .byte 0x4 ++ .align 2 ++LEFDE1: ++.globl _ffi_closure_SYSV.eh ++_ffi_closure_SYSV.eh: ++LSFDE2: ++ .set L$set$5,LEFDE2-LASFDE2 ++ .long L$set$5 ++LASFDE2: ++ .long LASFDE2-EH_frame1 ++ .long LFB2-. ++ .set L$set$6,LFE2-LFB2 ++ .long L$set$6 ++ .byte 0x0 ++ .byte 0x4 ++ .set L$set$7,LCFI2-LFB2 ++ .long L$set$7 ++ .byte 0xe ++ .byte 0x8 ++ .byte 0x84 ++ .byte 0x2 ++ .byte 0x4 ++ .set L$set$8,LCFI3-LCFI2 ++ .long L$set$8 ++ .byte 0xd ++ .byte 0x4 ++ .align 2 ++LEFDE2: ++ ++#if !FFI_NO_RAW_API ++ ++.globl _ffi_closure_raw_SYSV.eh ++_ffi_closure_raw_SYSV.eh: ++LSFDE3: ++ .set L$set$10,LEFDE3-LASFDE3 ++ .long L$set$10 ++LASFDE3: ++ .long LASFDE3-EH_frame1 ++ .long LFB3-. ++ .set L$set$11,LFE3-LFB3 ++ .long L$set$11 ++ .byte 0x0 ++ .byte 0x4 ++ .set L$set$12,LCFI4-LFB3 ++ .long L$set$12 ++ .byte 0xe ++ .byte 0x8 ++ .byte 0x84 ++ .byte 0x2 ++ .byte 0x4 ++ .set L$set$13,LCFI5-LCFI4 ++ .long L$set$13 ++ .byte 0xd ++ .byte 0x4 ++ .byte 0x4 ++ .set L$set$14,LCFI6-LCFI5 ++ .long L$set$14 ++ .byte 0x85 ++ .byte 0x3 ++ .align 2 ++LEFDE3: ++ ++#endif ++ ++#endif /* ifndef __x86_64__ */ ++ ++#endif /* defined __i386__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c +new file mode 100644 +index 0000000..06feaf2 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c +@@ -0,0 +1,734 @@ ++#ifdef __x86_64__ ++ ++/* ----------------------------------------------------------------------- ++ x86-ffi64.c - Copyright (c) 2002 Bo Thorsen ++ ++ x86-64 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++#include ++ ++#define MAX_GPR_REGS 6 ++#define MAX_SSE_REGS 8 ++ ++typedef struct RegisterArgs { ++ /* Registers for argument passing. */ ++ UINT64 gpr[MAX_GPR_REGS]; ++ __int128_t sse[MAX_SSE_REGS]; ++} RegisterArgs; ++ ++extern void ++ffi_call_unix64( ++ void* args, ++ unsigned long bytes, ++ unsigned flags, ++ void* raddr, ++ void (*fnaddr)(), ++ unsigned ssecount); ++ ++/* All reference to register classes here is identical to the code in ++ gcc/config/i386/i386.c. Do *not* change one without the other. */ ++ ++/* Register class used for passing given 64bit part of the argument. ++ These represent classes as documented by the PS ABI, with the exception ++ of SSESF, SSEDF classes, that are basically SSE class, just gcc will ++ use SF or DFmode move instead of DImode to avoid reformating penalties. ++ ++ Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves ++ whenever possible (upper half does contain padding). */ ++enum x86_64_reg_class ++{ ++ X86_64_NO_CLASS, ++ X86_64_INTEGER_CLASS, ++ X86_64_INTEGERSI_CLASS, ++ X86_64_SSE_CLASS, ++ X86_64_SSESF_CLASS, ++ X86_64_SSEDF_CLASS, ++ X86_64_SSEUP_CLASS, ++ X86_64_X87_CLASS, ++ X86_64_X87UP_CLASS, ++ X86_64_COMPLEX_X87_CLASS, ++ X86_64_MEMORY_CLASS ++}; ++ ++#define MAX_CLASSES 4 ++#define SSE_CLASS_P(X) ((X) >= X86_64_SSE_CLASS && X <= X86_64_SSEUP_CLASS) ++ ++/* x86-64 register passing implementation. See x86-64 ABI for details. Goal ++ of this code is to classify each 8bytes of incoming argument by the register ++ class and assign registers accordingly. */ ++ ++/* Return the union class of CLASS1 and CLASS2. ++ See the x86-64 PS ABI for details. */ ++static enum x86_64_reg_class ++merge_classes( ++ enum x86_64_reg_class class1, ++ enum x86_64_reg_class class2) ++{ ++ /* Rule #1: If both classes are equal, this is the resulting class. */ ++ if (class1 == class2) ++ return class1; ++ ++ /* Rule #2: If one of the classes is NO_CLASS, the resulting class is ++ the other class. */ ++ if (class1 == X86_64_NO_CLASS) ++ return class2; ++ ++ if (class2 == X86_64_NO_CLASS) ++ return class1; ++ ++ /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */ ++ if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS) ++ return X86_64_MEMORY_CLASS; ++ ++ /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */ ++ if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS) ++ || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS)) ++ return X86_64_INTEGERSI_CLASS; ++ ++ if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS ++ || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS) ++ return X86_64_INTEGER_CLASS; ++ ++ /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class, ++ MEMORY is used. */ ++ if (class1 == X86_64_X87_CLASS ++ || class1 == X86_64_X87UP_CLASS ++ || class1 == X86_64_COMPLEX_X87_CLASS ++ || class2 == X86_64_X87_CLASS ++ || class2 == X86_64_X87UP_CLASS ++ || class2 == X86_64_COMPLEX_X87_CLASS) ++ return X86_64_MEMORY_CLASS; ++ ++ /* Rule #6: Otherwise class SSE is used. */ ++ return X86_64_SSE_CLASS; ++} ++ ++/* Classify the argument of type TYPE and mode MODE. ++ CLASSES will be filled by the register class used to pass each word ++ of the operand. The number of words is returned. In case the parameter ++ should be passed in memory, 0 is returned. As a special case for zero ++ sized containers, classes[0] will be NO_CLASS and 1 is returned. ++ ++ See the x86-64 PS ABI for details. */ ++ ++static int ++classify_argument( ++ ffi_type* type, ++ enum x86_64_reg_class classes[], ++ size_t byte_offset) ++{ ++ switch (type->type) ++ { ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_POINTER: ++#if 0 ++ if (byte_offset + type->size <= 4) ++ classes[0] = X86_64_INTEGERSI_CLASS; ++ else ++ classes[0] = X86_64_INTEGER_CLASS; ++ ++ return 1; ++#else ++ { ++ int size = byte_offset + type->size; ++ ++ if (size <= 4) ++ { ++ classes[0] = X86_64_INTEGERSI_CLASS; ++ return 1; ++ } ++ else if (size <= 8) ++ { ++ classes[0] = X86_64_INTEGER_CLASS; ++ return 1; ++ } ++ else if (size <= 12) ++ { ++ classes[0] = X86_64_INTEGER_CLASS; ++ classes[1] = X86_64_INTEGERSI_CLASS; ++ return 2; ++ } ++ else if (size <= 16) ++ { ++ classes[0] = classes[1] = X86_64_INTEGERSI_CLASS; ++ return 2; ++ } ++ else ++ FFI_ASSERT (0); ++ } ++#endif ++ ++ case FFI_TYPE_FLOAT: ++ if (byte_offset == 0) ++ classes[0] = X86_64_SSESF_CLASS; ++ else ++ classes[0] = X86_64_SSE_CLASS; ++ ++ return 1; ++ ++ case FFI_TYPE_DOUBLE: ++ classes[0] = X86_64_SSEDF_CLASS; ++ return 1; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ classes[0] = X86_64_X87_CLASS; ++ classes[1] = X86_64_X87UP_CLASS; ++ return 2; ++ ++ case FFI_TYPE_STRUCT: ++ { ++ ffi_type** ptr; ++ int i; ++ enum x86_64_reg_class subclasses[MAX_CLASSES]; ++ const int UNITS_PER_WORD = 8; ++ int words = ++ (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; ++ ++ /* If the struct is larger than 16 bytes, pass it on the stack. */ ++ if (type->size > 16) ++ return 0; ++ ++ for (i = 0; i < words; i++) ++ classes[i] = X86_64_NO_CLASS; ++ ++ /* Merge the fields of structure. */ ++ for (ptr = type->elements; *ptr != NULL; ptr++) ++ { ++ byte_offset = ALIGN(byte_offset, (*ptr)->alignment); ++ ++ int num = classify_argument(*ptr, subclasses, byte_offset % 8); ++ ++ if (num == 0) ++ return 0; ++ ++ int pos = byte_offset / 8; ++ ++ for (i = 0; i < num; i++) ++ { ++ classes[i + pos] = ++ merge_classes(subclasses[i], classes[i + pos]); ++ } ++ ++ byte_offset += (*ptr)->size; ++ } ++ ++ if (words > 2) ++ { ++ /* When size > 16 bytes, if the first one isn't ++ X86_64_SSE_CLASS or any other ones aren't ++ X86_64_SSEUP_CLASS, everything should be passed in ++ memory. */ ++ if (classes[0] != X86_64_SSE_CLASS) ++ return 0; ++ ++ for (i = 1; i < words; i++) ++ if (classes[i] != X86_64_SSEUP_CLASS) ++ return 0; ++ } ++ ++ ++ /* Final merger cleanup. */ ++ for (i = 0; i < words; i++) ++ { ++ /* If one class is MEMORY, everything should be passed in ++ memory. */ ++ if (classes[i] == X86_64_MEMORY_CLASS) ++ return 0; ++ ++ /* The X86_64_SSEUP_CLASS should be always preceded by ++ X86_64_SSE_CLASS. */ ++ if (classes[i] == X86_64_SSEUP_CLASS ++ && classes[i - 1] != X86_64_SSE_CLASS ++ && classes[i - 1] != X86_64_SSEUP_CLASS) ++ { ++ FFI_ASSERT(i != 0); ++ classes[i] = X86_64_SSE_CLASS; ++ } ++ ++ /* X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS. */ ++ if (classes[i] == X86_64_X87UP_CLASS ++ && classes[i - 1] != X86_64_X87_CLASS) ++ { ++ FFI_ASSERT(i != 0); ++ classes[i] = X86_64_SSE_CLASS; ++ } ++ } ++ ++ return words; ++ } ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ ++ return 0; /* Never reached. */ ++} ++ ++/* Examine the argument and return set number of register required in each ++ class. Return zero if parameter should be passed in memory, otherwise ++ the number of registers. */ ++static int ++examine_argument( ++ ffi_type* type, ++ enum x86_64_reg_class classes[MAX_CLASSES], ++ _Bool in_return, ++ int* pngpr, ++ int* pnsse) ++{ ++ int n = classify_argument(type, classes, 0); ++ int ngpr = 0; ++ int nsse = 0; ++ int i; ++ ++ if (n == 0) ++ return 0; ++ ++ for (i = 0; i < n; ++i) ++ { ++ switch (classes[i]) ++ { ++ case X86_64_INTEGER_CLASS: ++ case X86_64_INTEGERSI_CLASS: ++ ngpr++; ++ break; ++ ++ case X86_64_SSE_CLASS: ++ case X86_64_SSESF_CLASS: ++ case X86_64_SSEDF_CLASS: ++ nsse++; ++ break; ++ ++ case X86_64_NO_CLASS: ++ case X86_64_SSEUP_CLASS: ++ break; ++ ++ case X86_64_X87_CLASS: ++ case X86_64_X87UP_CLASS: ++ case X86_64_COMPLEX_X87_CLASS: ++ return in_return != 0; ++ ++ default: ++ abort(); ++ } ++ } ++ ++ *pngpr = ngpr; ++ *pnsse = nsse; ++ ++ return n; ++} ++ ++/* Perform machine dependent cif processing. */ ++ffi_status ++ffi_prep_cif_machdep( ++ ffi_cif* cif) ++{ ++ int gprcount = 0; ++ int ssecount = 0; ++ int flags = cif->rtype->type; ++ int i, avn, n, ngpr, nsse; ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ size_t bytes; ++ ++ if (flags != FFI_TYPE_VOID) ++ { ++ n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); ++ ++ if (n == 0) ++ { ++ /* The return value is passed in memory. A pointer to that ++ memory is the first argument. Allocate a register for it. */ ++ gprcount++; ++ ++ /* We don't have to do anything in asm for the return. */ ++ flags = FFI_TYPE_VOID; ++ } ++ else if (flags == FFI_TYPE_STRUCT) ++ { ++ /* Mark which registers the result appears in. */ ++ _Bool sse0 = SSE_CLASS_P(classes[0]); ++ _Bool sse1 = n == 2 && SSE_CLASS_P(classes[1]); ++ ++ if (sse0 && !sse1) ++ flags |= 1 << 8; ++ else if (!sse0 && sse1) ++ flags |= 1 << 9; ++ else if (sse0 && sse1) ++ flags |= 1 << 10; ++ ++ /* Mark the true size of the structure. */ ++ flags |= cif->rtype->size << 12; ++ } ++ } ++ ++ /* Go over all arguments and determine the way they should be passed. ++ If it's in a register and there is space for it, let that be so. If ++ not, add it's size to the stack byte count. */ ++ for (bytes = 0, i = 0, avn = cif->nargs; i < avn; i++) ++ { ++ if (examine_argument(cif->arg_types[i], classes, 0, &ngpr, &nsse) == 0 ++ || gprcount + ngpr > MAX_GPR_REGS ++ || ssecount + nsse > MAX_SSE_REGS) ++ { ++ long align = cif->arg_types[i]->alignment; ++ ++ if (align < 8) ++ align = 8; ++ ++ bytes = ALIGN(bytes, align); ++ bytes += cif->arg_types[i]->size; ++ } ++ else ++ { ++ gprcount += ngpr; ++ ssecount += nsse; ++ } ++ } ++ ++ if (ssecount) ++ flags |= 1 << 11; ++ ++ cif->flags = flags; ++ cif->bytes = bytes; ++ cif->bytes = ALIGN(bytes,8); ++ ++ return FFI_OK; ++} ++ ++void ++ffi_call( ++ ffi_cif* cif, ++ void (*fn)(), ++ void* rvalue, ++ void** avalue) ++{ ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ char* stack; ++ char* argp; ++ ffi_type** arg_types; ++ int gprcount, ssecount, ngpr, nsse, i, avn; ++ _Bool ret_in_memory; ++ RegisterArgs* reg_args; ++ ++ /* Can't call 32-bit mode from 64-bit mode. */ ++ FFI_ASSERT(cif->abi == FFI_UNIX64); ++ ++ /* If the return value is a struct and we don't have a return value ++ address then we need to make one. Note the setting of flags to ++ VOID above in ffi_prep_cif_machdep. */ ++ ret_in_memory = (cif->rtype->type == FFI_TYPE_STRUCT ++ && (cif->flags & 0xff) == FFI_TYPE_VOID); ++ ++ if (rvalue == NULL && ret_in_memory) ++ rvalue = alloca (cif->rtype->size); ++ ++ /* Allocate the space for the arguments, plus 4 words of temp space. */ ++ stack = alloca(sizeof(RegisterArgs) + cif->bytes + 4 * 8); ++ reg_args = (RegisterArgs*)stack; ++ argp = stack + sizeof(RegisterArgs); ++ ++ gprcount = ssecount = 0; ++ ++ /* If the return value is passed in memory, add the pointer as the ++ first integer argument. */ ++ if (ret_in_memory) ++ reg_args->gpr[gprcount++] = (long) rvalue; ++ ++ avn = cif->nargs; ++ arg_types = cif->arg_types; ++ ++ for (i = 0; i < avn; ++i) ++ { ++ size_t size = arg_types[i]->size; ++ int n; ++ ++ n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); ++ ++ if (n == 0 ++ || gprcount + ngpr > MAX_GPR_REGS ++ || ssecount + nsse > MAX_SSE_REGS) ++ { ++ long align = arg_types[i]->alignment; ++ ++ /* Stack arguments are *always* at least 8 byte aligned. */ ++ if (align < 8) ++ align = 8; ++ ++ /* Pass this argument in memory. */ ++ argp = (void *) ALIGN (argp, align); ++ memcpy (argp, avalue[i], size); ++ argp += size; ++ } ++ else ++ { /* The argument is passed entirely in registers. */ ++ char *a = (char *) avalue[i]; ++ int j; ++ ++ for (j = 0; j < n; j++, a += 8, size -= 8) ++ { ++ switch (classes[j]) ++ { ++ case X86_64_INTEGER_CLASS: ++ case X86_64_INTEGERSI_CLASS: ++ reg_args->gpr[gprcount] = 0; ++ switch (arg_types[i]->type) { ++ case FFI_TYPE_SINT8: ++ { ++ int8_t shortval = *(int8_t*)a; ++ int64_t actval = (int64_t)shortval; ++ reg_args->gpr[gprcount] = actval; ++ /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ ++ break; ++ } ++ ++ case FFI_TYPE_SINT16: ++ { ++ int16_t shortval = *(int16_t*)a; ++ int64_t actval = (int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ case FFI_TYPE_SINT32: ++ { ++ int32_t shortval = *(int32_t*)a; ++ int64_t actval = (int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ case FFI_TYPE_UINT8: ++ { ++ u_int8_t shortval = *(u_int8_t*)a; ++ u_int64_t actval = (u_int64_t)shortval; ++ /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ ++ reg_args->gpr[gprcount] = actval; ++ break; ++ } ++ ++ case FFI_TYPE_UINT16: ++ { ++ u_int16_t shortval = *(u_int16_t*)a; ++ u_int64_t actval = (u_int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ case FFI_TYPE_UINT32: ++ { ++ u_int32_t shortval = *(u_int32_t*)a; ++ u_int64_t actval = (u_int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ default: ++ //memcpy (®_args->gpr[gprcount], a, size < 8 ? size : 8); ++ reg_args->gpr[gprcount] = *(int64_t*)a; ++ } ++ gprcount++; ++ break; ++ ++ case X86_64_SSE_CLASS: ++ case X86_64_SSEDF_CLASS: ++ reg_args->sse[ssecount++] = *(UINT64 *) a; ++ break; ++ ++ case X86_64_SSESF_CLASS: ++ reg_args->sse[ssecount++] = *(UINT32 *) a; ++ break; ++ ++ default: ++ abort(); ++ } ++ } ++ } ++ } ++ ++ ffi_call_unix64 (stack, cif->bytes + sizeof(RegisterArgs), ++ cif->flags, rvalue, fn, ssecount); ++} ++ ++extern void ffi_closure_unix64(void); ++ ++ffi_status ++ffi_prep_closure( ++ ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*, void*, void**, void*), ++ void* user_data) ++{ ++ if (cif->abi != FFI_UNIX64) ++ return FFI_BAD_ABI; ++ ++ volatile unsigned short* tramp = ++ (volatile unsigned short*)&closure->tramp[0]; ++ ++ tramp[0] = 0xbb49; /* mov , %r11 */ ++ *(void* volatile*)&tramp[1] = ffi_closure_unix64; ++ tramp[5] = 0xba49; /* mov , %r10 */ ++ *(void* volatile*)&tramp[6] = closure; ++ ++ /* Set the carry bit if the function uses any sse registers. ++ This is clc or stc, together with the first byte of the jmp. */ ++ tramp[10] = cif->flags & (1 << 11) ? 0x49f9 : 0x49f8; ++ tramp[11] = 0xe3ff; /* jmp *%r11 */ ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ ++ return FFI_OK; ++} ++ ++#pragma clang diagnostic push ++#pragma clang diagnostic ignored "-Wmissing-prototypes" ++int ++ffi_closure_unix64_inner( ++ ffi_closure* closure, ++ void* rvalue, ++ RegisterArgs* reg_args, ++ char* argp) ++#pragma clang diagnostic pop ++{ ++ ffi_cif* cif = closure->cif; ++ void** avalue = alloca(cif->nargs * sizeof(void *)); ++ ffi_type** arg_types; ++ long i, avn; ++ int gprcount = 0; ++ int ssecount = 0; ++ int ngpr, nsse; ++ int ret; ++ ++ ret = cif->rtype->type; ++ ++ if (ret != FFI_TYPE_VOID) ++ { ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ int n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); ++ ++ if (n == 0) ++ { ++ /* The return value goes in memory. Arrange for the closure ++ return value to go directly back to the original caller. */ ++ rvalue = (void *) reg_args->gpr[gprcount++]; ++ ++ /* We don't have to do anything in asm for the return. */ ++ ret = FFI_TYPE_VOID; ++ } ++ else if (ret == FFI_TYPE_STRUCT && n == 2) ++ { ++ /* Mark which register the second word of the structure goes in. */ ++ _Bool sse0 = SSE_CLASS_P (classes[0]); ++ _Bool sse1 = SSE_CLASS_P (classes[1]); ++ ++ if (!sse0 && sse1) ++ ret |= 1 << 8; ++ else if (sse0 && !sse1) ++ ret |= 1 << 9; ++ } ++ } ++ ++ avn = cif->nargs; ++ arg_types = cif->arg_types; ++ ++ for (i = 0; i < avn; ++i) ++ { ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ int n; ++ ++ n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); ++ ++ if (n == 0 ++ || gprcount + ngpr > MAX_GPR_REGS ++ || ssecount + nsse > MAX_SSE_REGS) ++ { ++ long align = arg_types[i]->alignment; ++ ++ /* Stack arguments are *always* at least 8 byte aligned. */ ++ if (align < 8) ++ align = 8; ++ ++ /* Pass this argument in memory. */ ++ argp = (void *) ALIGN (argp, align); ++ avalue[i] = argp; ++ argp += arg_types[i]->size; ++ } ++ ++#if !defined(X86_DARWIN) ++ /* If the argument is in a single register, or two consecutive ++ registers, then we can use that address directly. */ ++ else if (n == 1 || (n == 2 && ++ SSE_CLASS_P (classes[0]) == SSE_CLASS_P (classes[1]))) ++ { ++ // The argument is in a single register. ++ if (SSE_CLASS_P (classes[0])) ++ { ++ avalue[i] = ®_args->sse[ssecount]; ++ ssecount += n; ++ } ++ else ++ { ++ avalue[i] = ®_args->gpr[gprcount]; ++ gprcount += n; ++ } ++ } ++#endif ++ ++ /* Otherwise, allocate space to make them consecutive. */ ++ else ++ { ++ char *a = alloca (16); ++ int j; ++ ++ avalue[i] = a; ++ ++ for (j = 0; j < n; j++, a += 8) ++ { ++ if (SSE_CLASS_P (classes[j])) ++ memcpy (a, ®_args->sse[ssecount++], 8); ++ else ++ memcpy (a, ®_args->gpr[gprcount++], 8); ++ } ++ } ++ } ++ ++ /* Invoke the closure. */ ++ closure->fun (cif, rvalue, avalue, closure->user_data); ++ ++ /* Tell assembly how to perform return type promotions. */ ++ return ret; ++} ++ ++#endif /* __x86_64__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c +new file mode 100644 +index 0000000..706ea0f +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c +@@ -0,0 +1,438 @@ ++#ifdef __i386__ ++/* ----------------------------------------------------------------------- ++ ffi.c - Copyright (c) 1996, 1998, 1999, 2001 Red Hat, Inc. ++ Copyright (c) 2002 Ranjit Mathew ++ Copyright (c) 2002 Bo Thorsen ++ Copyright (c) 2002 Roger Sayle ++ ++ x86 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++ ++/* ffi_prep_args is called by the assembly routine once stack space ++ has been allocated for the function's arguments */ ++ ++void ffi_prep_args(char *stack, extended_cif *ecif); ++ ++void ffi_prep_args(char *stack, extended_cif *ecif) ++{ ++ register unsigned int i; ++ register void **p_argv; ++ register char *argp; ++ register ffi_type **p_arg; ++ ++ argp = stack; ++ ++ if (ecif->cif->flags == FFI_TYPE_STRUCT) ++ { ++ *(void **) argp = ecif->rvalue; ++ argp += 4; ++ } ++ ++ p_argv = ecif->avalue; ++ ++ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; ++ i != 0; ++ i--, p_arg++) ++ { ++ size_t z; ++ ++ /* Align if necessary */ ++ if ((sizeof(int) - 1) & (unsigned) argp) ++ argp = (char *) ALIGN(argp, sizeof(int)); ++ ++ z = (*p_arg)->size; ++ if (z < sizeof(int)) ++ { ++ z = sizeof(int); ++ switch ((*p_arg)->type) ++ { ++ case FFI_TYPE_SINT8: ++ *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT8: ++ *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_SINT16: ++ *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT16: ++ *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_SINT32: ++ *(signed int *) argp = (signed int)*(SINT32 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT32: ++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ } ++ else ++ { ++ memcpy(argp, *p_argv, z); ++ } ++ p_argv++; ++ argp += z; ++ } ++ ++ return; ++} ++ ++/* Perform machine dependent cif processing */ ++ffi_status ffi_prep_cif_machdep(ffi_cif *cif) ++{ ++ /* Set the return type flag */ ++ switch (cif->rtype->type) ++ { ++ case FFI_TYPE_VOID: ++#ifdef X86 ++ case FFI_TYPE_STRUCT: ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_SINT16: ++#endif ++ ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ case FFI_TYPE_LONGDOUBLE: ++ cif->flags = (unsigned) cif->rtype->type; ++ break; ++ ++ case FFI_TYPE_UINT64: ++ cif->flags = FFI_TYPE_SINT64; ++ break; ++ ++#ifndef X86 ++ case FFI_TYPE_STRUCT: ++ if (cif->rtype->size == 1) ++ { ++ cif->flags = FFI_TYPE_SINT8; /* same as char size */ ++ } ++ else if (cif->rtype->size == 2) ++ { ++ cif->flags = FFI_TYPE_SINT16; /* same as short size */ ++ } ++ else if (cif->rtype->size == 4) ++ { ++ cif->flags = FFI_TYPE_INT; /* same as int type */ ++ } ++ else if (cif->rtype->size == 8) ++ { ++ cif->flags = FFI_TYPE_SINT64; /* same as int64 type */ ++ } ++ else ++ { ++ cif->flags = FFI_TYPE_STRUCT; ++ } ++ break; ++#endif ++ ++ default: ++ cif->flags = FFI_TYPE_INT; ++ break; ++ } ++ ++#ifdef X86_DARWIN ++ cif->bytes = (cif->bytes + 15) & ~0xF; ++#endif ++ ++ return FFI_OK; ++} ++ ++extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, ++ unsigned, unsigned, unsigned *, void (*fn)()); ++ ++#ifdef X86_WIN32 ++extern void ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, ++ unsigned, unsigned, unsigned *, void (*fn)()); ++ ++#endif /* X86_WIN32 */ ++ ++void ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue) ++{ ++ extended_cif ecif; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return */ ++ /* value address then we need to make one */ ++ ++ if ((rvalue == NULL) && ++ (cif->flags == FFI_TYPE_STRUCT)) ++ { ++ ecif.rvalue = alloca(cif->rtype->size); ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ ++ switch (cif->abi) ++ { ++ case FFI_SYSV: ++ ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, ++ fn); ++ break; ++#ifdef X86_WIN32 ++ case FFI_STDCALL: ++ ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ break; ++#endif /* X86_WIN32 */ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++ ++/** private members **/ ++ ++static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, ++ void** args, ffi_cif* cif); ++void FFI_HIDDEN ffi_closure_SYSV (ffi_closure *) ++__attribute__ ((regparm(1))); ++unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *) ++__attribute__ ((regparm(1))); ++void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *) ++__attribute__ ((regparm(1))); ++ ++/* This function is jumped to by the trampoline */ ++ ++unsigned int FFI_HIDDEN ++ffi_closure_SYSV_inner (closure, respp, args) ++ffi_closure *closure; ++void **respp; ++void *args; ++{ ++ // our various things... ++ ffi_cif *cif; ++ void **arg_area; ++ ++ cif = closure->cif; ++ arg_area = (void**) alloca (cif->nargs * sizeof (void*)); ++ ++ /* this call will initialize ARG_AREA, such that each ++ * element in that array points to the corresponding ++ * value on the stack; and if the function returns ++ * a structure, it will re-set RESP to point to the ++ * structure return address. */ ++ ++ ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); ++ ++ (closure->fun) (cif, *respp, arg_area, closure->user_data); ++ ++ return cif->flags; ++} ++ ++static void ++ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue, ++ ffi_cif *cif) ++{ ++ register unsigned int i; ++ register void **p_argv; ++ register char *argp; ++ register ffi_type **p_arg; ++ ++ argp = stack; ++ ++ if ( cif->flags == FFI_TYPE_STRUCT ) { ++ *rvalue = *(void **) argp; ++ argp += 4; ++ } ++ ++ p_argv = avalue; ++ ++ for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) ++ { ++ size_t z; ++ ++ /* Align if necessary */ ++ if ((sizeof(int) - 1) & (unsigned) argp) { ++ argp = (char *) ALIGN(argp, sizeof(int)); ++ } ++ ++ z = (*p_arg)->size; ++ ++ /* because we're little endian, this is what it turns into. */ ++ ++ *p_argv = (void*) argp; ++ ++ p_argv++; ++ argp += z; ++ } ++ ++ return; ++} ++ ++/* How to make a trampoline. Derived from gcc/config/i386/i386.c. */ ++ ++#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ ++({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ ++unsigned int __fun = (unsigned int)(FUN); \ ++unsigned int __ctx = (unsigned int)(CTX); \ ++unsigned int __dis = __fun - (__ctx + FFI_TRAMPOLINE_SIZE); \ ++*(unsigned char*) &__tramp[0] = 0xb8; \ ++*(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \ ++*(unsigned char *) &__tramp[5] = 0xe9; \ ++*(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \ ++}) ++ ++ ++/* the cif must already be prep'ed */ ++ffi_status ++ffi_prep_closure (ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,void**,void*), ++ void *user_data) ++{ ++ if (cif->abi != FFI_SYSV) ++ return FFI_BAD_ABI; ++ ++ FFI_INIT_TRAMPOLINE (&closure->tramp[0], \ ++ &ffi_closure_SYSV, \ ++ (void*)closure); ++ ++ closure->cif = cif; ++ closure->user_data = user_data; ++ closure->fun = fun; ++ ++ return FFI_OK; ++} ++ ++/* ------- Native raw API support -------------------------------- */ ++ ++#if !FFI_NO_RAW_API ++ ++ffi_status ++ffi_prep_raw_closure_loc (ffi_raw_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), ++ void *user_data, ++ void *codeloc) ++{ ++ int i; ++ ++ FFI_ASSERT (cif->abi == FFI_SYSV); ++ ++ // we currently don't support certain kinds of arguments for raw ++ // closures. This should be implemented by a separate assembly language ++ // routine, since it would require argument processing, something we ++ // don't do now for performance. ++ ++ for (i = cif->nargs-1; i >= 0; i--) ++ { ++ FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_STRUCT); ++ FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_LONGDOUBLE); ++ } ++ ++ ++ FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_raw_SYSV, ++ codeloc); ++ ++ closure->cif = cif; ++ closure->user_data = user_data; ++ closure->fun = fun; ++ ++ return FFI_OK; ++} ++ ++static void ++ffi_prep_args_raw(char *stack, extended_cif *ecif) ++{ ++ memcpy (stack, ecif->avalue, ecif->cif->bytes); ++} ++ ++/* we borrow this routine from libffi (it must be changed, though, to ++ * actually call the function passed in the first argument. as of ++ * libffi-1.20, this is not the case.) ++ */ ++ ++extern void ++ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, unsigned, ++ unsigned, unsigned *, void (*fn)()); ++ ++#ifdef X86_WIN32 ++extern void ++ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, unsigned, ++ unsigned, unsigned *, void (*fn)()); ++#endif /* X86_WIN32 */ ++ ++void ++ffi_raw_call(ffi_cif *cif, void (*fn)(), void *rvalue, ffi_raw *fake_avalue) ++{ ++ extended_cif ecif; ++ void **avalue = (void **)fake_avalue; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return */ ++ /* value address then we need to make one */ ++ ++ if ((rvalue == NULL) && ++ (cif->rtype->type == FFI_TYPE_STRUCT)) ++ { ++ ecif.rvalue = alloca(cif->rtype->size); ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ ++ switch (cif->abi) ++ { ++ case FFI_SYSV: ++ ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ break; ++#ifdef X86_WIN32 ++ case FFI_STDCALL: ++ ffi_call_STDCALL(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ break; ++#endif /* X86_WIN32 */ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++#endif ++#endif // __i386__ +diff -r -u ./setup.py ./setup.py +index 46b92fe..2bf6b4b 100644 +--- ./setup.py ++++ ./setup.py +@@ -98,8 +98,14 @@ class PyBuildExt(build_ext): + self.detect_modules() + + # Remove modules that are present on the disabled list +- self.extensions = [ext for ext in self.extensions +- if ext.name not in disabled_module_list] ++ extensions = [ext for ext in self.extensions ++ if ext.name not in disabled_module_list] ++ # move ctypes to the end, it depends on other modules ++ ext_map = dict((ext.name, i) for i, ext in enumerate(extensions)) ++ if "_ctypes" in ext_map: ++ ctypes = extensions.pop(ext_map["_ctypes"]) ++ extensions.append(ctypes) ++ self.extensions = extensions + + # Fix up the autodetected modules, prefixing all the source files + # with Modules/ and adding Python's include directory to the path. +@@ -1330,9 +1336,39 @@ class PyBuildExt(build_ext): + # *** Uncomment these for TOGL extension only: + # -lGL -lGLU -lXext -lXmu \ + ++ def configure_ctypes_darwin(self, ext): ++ # Darwin (OS X) uses preconfigured files, in ++ # the Modules/_ctypes/libffi_osx directory. ++ srcdir = sysconfig.get_config_var('srcdir') ++ ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', ++ '_ctypes', 'libffi_osx')) ++ sources = [os.path.join(ffi_srcdir, p) ++ for p in ['ffi.c', ++ 'x86/darwin64.S', ++ 'x86/x86-darwin.S', ++ 'x86/x86-ffi_darwin.c', ++ 'x86/x86-ffi64.c', ++ 'powerpc/ppc-darwin.S', ++ 'powerpc/ppc-darwin_closure.S', ++ 'powerpc/ppc-ffi_darwin.c', ++ 'powerpc/ppc64-darwin_closure.S', ++ ]] ++ ++ # Add .S (preprocessed assembly) to C compiler source extensions. ++ self.compiler.src_extensions.append('.S') ++ ++ include_dirs = [os.path.join(ffi_srcdir, 'include'), ++ os.path.join(ffi_srcdir, 'powerpc')] ++ ext.include_dirs.extend(include_dirs) ++ ext.sources.extend(sources) ++ return True ++ + def configure_ctypes(self, ext): + if not self.use_system_libffi: +- (srcdir,) = sysconfig.get_config_vars('srcdir') ++ if sys.platform == 'darwin': ++ return self.configure_ctypes_darwin(ext) ++ ++ srcdir = sysconfig.get_config_var('srcdir') + ffi_builddir = os.path.join(self.build_temp, 'libffi') + ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', + '_ctypes', 'libffi')) +@@ -1347,7 +1383,10 @@ class PyBuildExt(build_ext): + ffi_configfile): + from distutils.dir_util import mkpath + mkpath(ffi_builddir) +- config_args = [] ++ config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split() ++ if (('--host=' in arg) or ('--build=' in arg))] ++ if not self.verbose: ++ config_args.append("-q") + + # Pass empty CFLAGS because we'll just append the resulting + # CFLAGS to Python's; -g or -O2 is to be avoided. +@@ -1367,10 +1406,12 @@ class PyBuildExt(build_ext): + self.compiler.src_extensions.append('.S') + + include_dirs = [os.path.join(ffi_builddir, 'include'), +- ffi_builddir, ffi_srcdir] ++ ffi_builddir, ++ os.path.join(ffi_srcdir, 'src')] + extra_compile_args = fficonfig['ffi_cflags'].split() + +- ext.sources.extend(fficonfig['ffi_sources']) ++ ext.sources.extend(os.path.join(ffi_srcdir, f) for f in ++ fficonfig['ffi_sources']) + ext.include_dirs.extend(include_dirs) + ext.extra_compile_args.extend(extra_compile_args) + return True +@@ -1390,6 +1431,7 @@ class PyBuildExt(build_ext): + + if sys.platform == 'darwin': + sources.append('_ctypes/darwin/dlfcn_simple.c') ++ extra_compile_args.append('-DMACOSX') + include_dirs.append('_ctypes/darwin') + # XXX Is this still needed? + ## extra_link_args.extend(['-read_only_relocs', 'warning']) +@@ -1419,7 +1461,14 @@ class PyBuildExt(build_ext): + if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"): + return + +- ffi_inc = find_file('ffi.h', [], inc_dirs) ++ if sys.platform == 'darwin': ++ # OS X 10.5 comes with libffi.dylib; the include files are ++ # in /usr/include/ffi ++ inc_dirs.append('/usr/include/ffi') ++ ++ ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] ++ if not ffi_inc or ffi_inc[0] == '': ++ ffi_inc = find_file('ffi.h', [], inc_dirs) + if ffi_inc is not None: + ffi_h = ffi_inc[0] + '/ffi.h' + fp = open(ffi_h) diff --git a/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/005_osx_failed_modules.patch b/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/005_osx_failed_modules.patch new file mode 100644 index 0000000..5ccfe9c --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/005_osx_failed_modules.patch @@ -0,0 +1,124 @@ +diff -r -u ./Mac/Modules/cg/_CGmodule.c ./Mac/Modules/cg/_CGmodule.c +index 8115614..e36fce9 100755 +--- ./Mac/Modules/cg/_CGmodule.c ++++ ./Mac/Modules/cg/_CGmodule.c +@@ -1025,6 +1025,7 @@ static PyObject *CGContextRefObj_CGContextSetShouldAntialias(CGContextRefObject + return _res; + } + ++#ifndef __LP64__ + static PyObject *CGContextRefObj_SyncCGContextOriginWithPort(CGContextRefObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1055,6 +1056,7 @@ static PyObject *CGContextRefObj_ClipCGContextToRegion(CGContextRefObject *_self + _res = Py_None; + return _res; + } ++#endif + + static PyMethodDef CGContextRefObj_methods[] = { + {"CGContextSaveGState", (PyCFunction)CGContextRefObj_CGContextSaveGState, 1, +@@ -1173,10 +1175,12 @@ static PyMethodDef CGContextRefObj_methods[] = { + PyDoc_STR("() -> None")}, + {"CGContextSetShouldAntialias", (PyCFunction)CGContextRefObj_CGContextSetShouldAntialias, 1, + PyDoc_STR("(int shouldAntialias) -> None")}, ++#ifndef __LP64__ + {"SyncCGContextOriginWithPort", (PyCFunction)CGContextRefObj_SyncCGContextOriginWithPort, 1, + PyDoc_STR("(CGrafPtr port) -> None")}, + {"ClipCGContextToRegion", (PyCFunction)CGContextRefObj_ClipCGContextToRegion, 1, + PyDoc_STR("(Rect portRect, RgnHandle region) -> None")}, ++#endif + {NULL, NULL, 0} + }; + +@@ -1254,6 +1258,7 @@ PyTypeObject CGContextRef_Type = { + /* ------------------ End object type CGContextRef ------------------ */ + + ++#ifndef __LP64__ + static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1271,10 +1276,13 @@ static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) + return _res; + + } ++#endif + + static PyMethodDef CG_methods[] = { ++#ifndef __LP64__ + {"CreateCGContextForPort", (PyCFunction)CG_CreateCGContextForPort, 1, + PyDoc_STR("(CGrafPtr) -> CGContextRef")}, ++#endif + {NULL, NULL, 0} + }; + +diff -r -u ./Modules/_curses_panel.c ./Modules/_curses_panel.c +index 0acf3fd..1728b59 100644 +--- ./Modules/_curses_panel.c ++++ ./Modules/_curses_panel.c +@@ -56,7 +56,7 @@ typedef struct { + + PyTypeObject PyCursesPanel_Type; + +-#define PyCursesPanel_Check(v) ((v)->ob_type == &PyCursesPanel_Type) ++#define PyCursesPanel_Check(v) (Py_TYPE(v) == &PyCursesPanel_Type) + + /* Some helper functions. The problem is that there's always a window + associated with a panel. To ensure that Python's GC doesn't pull +@@ -178,12 +178,13 @@ PyCursesPanel_New(PANEL *pan, PyCursesWindowObject *wo) + po = PyObject_NEW(PyCursesPanelObject, &PyCursesPanel_Type); + if (po == NULL) return NULL; + po->pan = pan; +- po->wo = wo; +- Py_INCREF(wo); + if (insert_lop(po) < 0) { +- PyObject_DEL(po); +- return NULL; ++ po->wo = NULL; ++ Py_DECREF(po); ++ return NULL; + } ++ po->wo = wo; ++ Py_INCREF(wo); + return (PyObject *)po; + } + +@@ -191,8 +192,10 @@ static void + PyCursesPanel_Dealloc(PyCursesPanelObject *po) + { + (void)del_panel(po->pan); +- Py_DECREF(po->wo); +- remove_lop(po); ++ if (po->wo != NULL) { ++ Py_DECREF(po->wo); ++ remove_lop(po); ++ } + PyObject_DEL(po); + } + +@@ -338,11 +341,10 @@ PyCursesPanel_GetAttr(PyCursesPanelObject *self, char *name) + /* -------------------------------------------------------*/ + + PyTypeObject PyCursesPanel_Type = { +- PyObject_HEAD_INIT(NULL) +- 0, /*ob_size*/ +- "_curses_panel.curses panel", /*tp_name*/ +- sizeof(PyCursesPanelObject), /*tp_basicsize*/ +- 0, /*tp_itemsize*/ ++ PyVarObject_HEAD_INIT(NULL, 0) ++ "_curses_panel.curses panel", /*tp_name*/ ++ sizeof(PyCursesPanelObject), /*tp_basicsize*/ ++ 0, /*tp_itemsize*/ + /* methods */ + (destructor)PyCursesPanel_Dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ +@@ -458,7 +460,7 @@ init_curses_panel(void) + PyObject *m, *d, *v; + + /* Initialize object type */ +- PyCursesPanel_Type.ob_type = &PyType_Type; ++ Py_TYPE(&PyCursesPanel_Type) = &PyType_Type; + + import_curses(); + diff --git a/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/000_patch-setup.py.diff new file mode 100644 index 0000000..ffe4b0d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/000_patch-setup.py.diff @@ -0,0 +1,45 @@ +--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 ++++ setup.py 2011-07-07 19:25:04.548416377 +0900 +@@ -13,6 +13,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -242,10 +243,34 @@ + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ fp = open(tmpfile) ++ multiarch_path_component = fp.readline().strip() ++ fp.close() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. diff --git a/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/001_patch-svnversion.patch b/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/001_patch-svnversion.patch new file mode 100644 index 0000000..7331b3c --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/001_patch-svnversion.patch @@ -0,0 +1,47 @@ +diff -r -u ./Makefile.pre.in ../Python-2.5.1/Makefile.pre.in +--- ./Makefile.pre.in 2006-12-09 05:46:13.000000000 +0900 ++++ ../Python-2.5.1/Makefile.pre.in 2013-05-08 19:05:06.000000000 +0900 +@@ -455,7 +455,7 @@ + $(SIGNAL_OBJS) \ + $(MODOBJS) \ + $(srcdir)/Modules/getbuildinfo.c +- $(CC) -c $(PY_CFLAGS) -DSVNVERSION=\"`LC_ALL=C $(SVNVERSION)`\" -o $@ $(srcdir)/Modules/getbuildinfo.c ++ $(CC) -c $(PY_CFLAGS) -DSVNVERSION="\"`LC_ALL=C $(SVNVERSION)`\"" -o $@ $(srcdir)/Modules/getbuildinfo.c + + Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile + $(CC) -c $(PY_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ +diff -r -u ./Modules/getbuildinfo.c ../Python-2.5.1/Modules/getbuildinfo.c +--- ./Modules/getbuildinfo.c 2006-01-18 18:13:51.000000000 +0900 ++++ ../Python-2.5.1/Modules/getbuildinfo.c 2013-05-08 19:05:31.000000000 +0900 +@@ -43,6 +43,6 @@ + #ifdef SVNVERSION + return SVNVERSION; + #else +- return "exported"; ++ return "Unversioned directory"; + #endif + } +diff -r -u ./Python/sysmodule.c ../Python-2.5.1/Python/sysmodule.c +--- ./Python/sysmodule.c 2007-04-16 15:12:02.000000000 +0900 ++++ ../Python-2.5.1/Python/sysmodule.c 2013-05-08 19:05:49.000000000 +0900 +@@ -1011,7 +1011,7 @@ + + + svnversion = _Py_svnversion(); +- if (strcmp(svnversion, "exported") != 0) ++ if (strcmp(svnversion, "Unversioned directory") != 0) + svn_revision = svnversion; + else if (istag) { + len = strlen(_patchlevel_revision); +diff -r -u ./configure.in ../Python-2.5.1/configure.in +--- ./configure.in 2007-03-12 19:50:51.000000000 +0900 ++++ ../Python-2.5.1/configure.in 2013-05-08 19:04:36.000000000 +0900 +@@ -691,7 +691,7 @@ + then + SVNVERSION="svnversion \$(srcdir)" + else +- SVNVERSION="echo exported" ++ SVNVERSION="echo Unversioned directory" + fi + + case $MACHDEP in diff --git a/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/002_darwin_c_source.patch b/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/002_darwin_c_source.patch new file mode 100644 index 0000000..8cef44a --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/002_darwin_c_source.patch @@ -0,0 +1,166 @@ +diff -r -u ./configure ../Python-2.5/configure +--- ./configure 2006-09-05 11:54:42.000000000 +0900 ++++ ../Python-2.5/configure 2013-07-19 15:27:46.000000000 +0900 +@@ -1396,6 +1396,16 @@ + _ACEOF + + ++# The later defininition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables ++# certain features on Mac OS X, so we need _DARWIN_C_SOURCE to re-enable ++# them. ++ ++cat >>confdefs.h <<\_ACEOF ++#define _DARWIN_C_SOURCE 1 ++_ACEOF ++ ++ ++ + define_xopen_source=yes + + # Arguments passed to configure. +@@ -3885,11 +3895,110 @@ + ;; + # is there any other compiler on Darwin besides gcc? + Darwin*) +- BASECFLAGS="$BASECFLAGS -Wno-long-double -no-cpp-precomp -mno-fused-madd" ++ # -Wno-long-double, -no-cpp-precomp, and -mno-fused-madd ++ # used to be here, but non-Apple gcc doesn't accept them. ++ if test "${CC}" = gcc ++ then ++ { echo "$as_me:${as_lineno-$LINENO}: checking which compiler should be used" >&5 ++echo -n "checking which compiler should be used... " >&6; } ++ case "${UNIVERSALSDK}" in ++ */MacOSX10.4u.sdk) ++ # Build using 10.4 SDK, force usage of gcc when the ++ # compiler is gcc, otherwise the user will get very ++ # confusing error messages when building on OSX 10.6 ++ CC=gcc-4.0 ++ CPP=cpp-4.0 ++ ;; ++ esac ++ { echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 ++echo "$CC" >&6; } ++ fi ++ ++ + if test "${enable_universalsdk}"; then +- BASECFLAGS="-arch ppc -arch i386 -isysroot ${UNIVERSALSDK} ${BASECFLAGS}" ++ UNIVERSAL_ARCH_FLAGS="" ++ if test "$UNIVERSAL_ARCHS" = "32-bit" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch ppc -arch i386" ++ ARCH_RUN_32BIT="" ++ LIPO_32BIT_FLAGS="" ++ elif test "$UNIVERSAL_ARCHS" = "64-bit" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64" ++ LIPO_32BIT_FLAGS="" ++ ARCH_RUN_32BIT="true" ++ ++ elif test "$UNIVERSAL_ARCHS" = "all" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64" ++ LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" ++ ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" ++ ++ elif test "$UNIVERSAL_ARCHS" = "intel" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64" ++ LIPO_32BIT_FLAGS="-extract i386" ++ ARCH_RUN_32BIT="/usr/bin/arch -i386" ++ ++ elif test "$UNIVERSAL_ARCHS" = "3-way" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch x86_64" ++ LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" ++ ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" ++ ++ else ++ as_fn_error $? "proper usage is --with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5 ++ ++ fi ++ ++ ++ CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" ++ if test "${UNIVERSALSDK}" != "/" ++ then ++ CFLAGS="-isysroot ${UNIVERSALSDK} ${CFLAGS}" ++ LDFLAGS="-isysroot ${UNIVERSALSDK} ${LDFLAGS}" ++ CPPFLAGS="-isysroot ${UNIVERSALSDK} ${CPPFLAGS}" ++ fi + fi + ++ # Calculate the right deployment target for this build. ++ # ++ cur_target=`sw_vers -productVersion | sed 's/\(10\.[0-9]*\).*/\1/'` ++ if test ${cur_target} '>' 10.2 && \ ++ test ${cur_target} '<' 10.6 ++ then ++ cur_target=10.3 ++ if test ${enable_universalsdk}; then ++ if test "${UNIVERSAL_ARCHS}" = "all"; then ++ # Ensure that the default platform for a ++ # 4-way universal build is OSX 10.5, ++ # that's the first OS release where ++ # 4-way builds make sense. ++ cur_target='10.5' ++ ++ elif test "${UNIVERSAL_ARCHS}" = "3-way"; then ++ cur_target='10.5' ++ ++ elif test "${UNIVERSAL_ARCHS}" = "intel"; then ++ cur_target='10.5' ++ ++ elif test "${UNIVERSAL_ARCHS}" = "64-bit"; then ++ cur_target='10.5' ++ fi ++ else ++ if test `/usr/bin/arch` = "i386"; then ++ # On Intel macs default to a deployment ++ # target of 10.4, that's the first OSX ++ # release with Intel support. ++ cur_target="10.4" ++ fi ++ fi ++ fi ++ CONFIGURE_MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET-${cur_target}} ++ ++ # Make sure that MACOSX_DEPLOYMENT_TARGET is set in the ++ # environment with a value that is the same as what we'll use ++ # in the Makefile to ensure that we'll get the same compiler ++ # environment during configure and build time. ++ MACOSX_DEPLOYMENT_TARGET="$CONFIGURE_MACOSX_DEPLOYMENT_TARGET" ++ export MACOSX_DEPLOYMENT_TARGET ++ EXPORT_MACOSX_DEPLOYMENT_TARGET='' ++ + ;; + OSF*) + BASECFLAGS="$BASECFLAGS -mieee" +@@ -10851,7 +10960,7 @@ + if test "${enable_universalsdk}"; then + : + else +- LIBTOOL_CRUFT="${LIBTOOL_CRUFT} -arch_only `arch`" ++ LIBTOOL_CRUFT="${LIBTOOL_CRUFT}" + fi + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; +@@ -10863,7 +10972,7 @@ + else + LIBTOOL_CRUFT="" + fi +- LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs -arch_only `arch`" ++ LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs" + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; + esac +diff -r -u ./pyconfig.h.in ../Python-2.5/pyconfig.h.in +--- ./pyconfig.h.in 2006-07-30 23:09:47.000000000 +0900 ++++ ../Python-2.5/pyconfig.h.in 2013-07-17 23:12:31.000000000 +0900 +@@ -912,6 +912,11 @@ + /* Define on Irix to enable u_int */ + #undef _BSD_TYPES + ++/* Define on Darwin to activate all library features */ ++#ifndef _DARWIN_C_SOURCE ++#define _DARWIN_C_SOURCE ++#endif ++ + /* This must be set to 64 on some systems to enable large file support. */ + #undef _FILE_OFFSET_BITS + diff --git a/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/003_osx_lp64.patch b/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/003_osx_lp64.patch new file mode 100644 index 0000000..fc07fc1 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/003_osx_lp64.patch @@ -0,0 +1,271 @@ +diff -r -u ./Include/pymactoolbox.h ../Python-2.5/Include/pymactoolbox.h +--- ./Include/pymactoolbox.h 2004-11-05 16:02:59.000000000 +0900 ++++ ../Python-2.5/Include/pymactoolbox.h 2013-07-17 23:38:51.000000000 +0900 +@@ -8,7 +8,10 @@ + #endif + + #include ++ ++#ifndef __LP64__ + #include ++#endif /* !__LP64__ */ + + /* + ** Helper routines for error codes and such. +@@ -18,8 +21,11 @@ + PyObject *PyMac_GetOSErrException(void); /* Initialize & return it */ + PyObject *PyErr_Mac(PyObject *, int); /* Exception with a mac error */ + PyObject *PyMac_Error(OSErr); /* Uses PyMac_GetOSErrException */ ++#ifndef __LP64__ + extern OSErr PyMac_GetFullPathname(FSSpec *, char *, int); /* convert + fsspec->path */ ++#endif /* __LP64__ */ ++ + /* + ** These conversion routines are defined in mactoolboxglue.c itself. + */ +@@ -83,8 +89,10 @@ + #endif /* USE_TOOLBOX_OBJECT_GLUE */ + + /* macfs exports */ ++#ifndef __LP64__ + int PyMac_GetFSSpec(PyObject *, FSSpec *); /* argument parser for FSSpec */ + PyObject *PyMac_BuildFSSpec(FSSpec *); /* Convert FSSpec to PyObject */ ++#endif /* !__LP64__ */ + + int PyMac_GetFSRef(PyObject *, FSRef *); /* argument parser for FSRef */ + PyObject *PyMac_BuildFSRef(FSRef *); /* Convert FSRef to PyObject */ +@@ -101,39 +109,54 @@ + extern int CmpInstObj_Convert(PyObject *, ComponentInstance *); + + /* Ctl exports */ ++#ifndef __LP64__ + extern PyObject *CtlObj_New(ControlHandle); + extern int CtlObj_Convert(PyObject *, ControlHandle *); ++#endif /* !__LP64__ */ + + /* Dlg exports */ ++#ifndef __LP64__ + extern PyObject *DlgObj_New(DialogPtr); + extern int DlgObj_Convert(PyObject *, DialogPtr *); + extern PyObject *DlgObj_WhichDialog(DialogPtr); ++#endif /* !__LP64__ */ + + /* Drag exports */ ++#ifndef __LP64__ + extern PyObject *DragObj_New(DragReference); + extern int DragObj_Convert(PyObject *, DragReference *); ++#endif /* !__LP64__ */ + + /* List exports */ ++#ifndef __LP64__ + extern PyObject *ListObj_New(ListHandle); + extern int ListObj_Convert(PyObject *, ListHandle *); ++#endif /* !__LP64__ */ + + /* Menu exports */ ++#ifndef __LP64__ + extern PyObject *MenuObj_New(MenuHandle); + extern int MenuObj_Convert(PyObject *, MenuHandle *); ++#endif /* !__LP64__ */ + + /* Qd exports */ ++#ifndef __LP64__ + extern PyObject *GrafObj_New(GrafPtr); + extern int GrafObj_Convert(PyObject *, GrafPtr *); + extern PyObject *BMObj_New(BitMapPtr); + extern int BMObj_Convert(PyObject *, BitMapPtr *); + extern PyObject *QdRGB_New(RGBColor *); + extern int QdRGB_Convert(PyObject *, RGBColor *); ++#endif /* !__LP64__ */ + + /* Qdoffs exports */ ++#ifndef __LP64__ + extern PyObject *GWorldObj_New(GWorldPtr); + extern int GWorldObj_Convert(PyObject *, GWorldPtr *); ++#endif /* !__LP64__ */ + + /* Qt exports */ ++#ifndef __LP64__ + extern PyObject *TrackObj_New(Track); + extern int TrackObj_Convert(PyObject *, Track *); + extern PyObject *MovieObj_New(Movie); +@@ -146,6 +169,7 @@ + extern int UserDataObj_Convert(PyObject *, UserData *); + extern PyObject *MediaObj_New(Media); + extern int MediaObj_Convert(PyObject *, Media *); ++#endif /* !__LP64__ */ + + /* Res exports */ + extern PyObject *ResObj_New(Handle); +@@ -154,13 +178,17 @@ + extern int OptResObj_Convert(PyObject *, Handle *); + + /* TE exports */ ++#ifndef __LP64__ + extern PyObject *TEObj_New(TEHandle); + extern int TEObj_Convert(PyObject *, TEHandle *); ++#endif /* !__LP64__ */ + + /* Win exports */ ++#ifndef __LP64__ + extern PyObject *WinObj_New(WindowPtr); + extern int WinObj_Convert(PyObject *, WindowPtr *); + extern PyObject *WinObj_WhichWindow(WindowPtr); ++#endif /* !__LP64__ */ + + /* CF exports */ + extern PyObject *CFObj_New(CFTypeRef); +diff -r -u ./Mac/Modules/res/_Resmodule.c ../Python-2.5/Mac/Modules/res/_Resmodule.c +--- ./Mac/Modules/res/_Resmodule.c 2005-07-04 05:59:44.000000000 +0900 ++++ ../Python-2.5/Mac/Modules/res/_Resmodule.c 2013-07-17 23:38:51.000000000 +0900 +@@ -414,6 +414,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *ResObj_as_Control(ResourceObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -431,6 +432,7 @@ + return _res; + + } ++#endif /* !__LP64__ */ + + static PyObject *ResObj_LoadResource(ResourceObject *_self, PyObject *_args) + { +@@ -1152,6 +1154,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *Res_OpenRFPerm(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1287,6 +1290,7 @@ + _res = Py_None; + return _res; + } ++#endif /* !__LP64__ */ + + static PyObject *Res_InsertResourceFile(PyObject *_self, PyObject *_args) + { +@@ -1327,6 +1331,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *Res_FSpResourceFileAlreadyOpen(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1413,6 +1418,7 @@ + nextRefNum); + return _res; + } ++#endif /* !__LP64__ */ + + static PyObject *Res_FSOpenResFile(PyObject *_self, PyObject *_args) + { +@@ -1438,6 +1444,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *Res_FSCreateResFile(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1534,6 +1541,7 @@ + PyMac_BuildFSSpec, &newSpec); + return _res; + } ++#endif /* __LP64__ */ + + static PyObject *Res_FSOpenResourceFile(PyObject *_self, PyObject *_args) + { +@@ -1637,6 +1645,7 @@ + PyDoc_STR("(short refNum) -> (short _rv)")}, + {"SetResFileAttrs", (PyCFunction)Res_SetResFileAttrs, 1, + PyDoc_STR("(short refNum, short attrs) -> None")}, ++#ifndef __LP64__ + {"OpenRFPerm", (PyCFunction)Res_OpenRFPerm, 1, + PyDoc_STR("(Str255 fileName, short vRefNum, SignedByte permission) -> (short _rv)")}, + {"HOpenResFile", (PyCFunction)Res_HOpenResFile, 1, +@@ -1647,10 +1656,12 @@ + PyDoc_STR("(FSSpec spec, SignedByte permission) -> (short _rv)")}, + {"FSpCreateResFile", (PyCFunction)Res_FSpCreateResFile, 1, + PyDoc_STR("(FSSpec spec, OSType creator, OSType fileType, ScriptCode scriptTag) -> None")}, ++#endif /* !__LP64__ */ + {"InsertResourceFile", (PyCFunction)Res_InsertResourceFile, 1, + PyDoc_STR("(SInt16 refNum, RsrcChainLocation where) -> None")}, + {"DetachResourceFile", (PyCFunction)Res_DetachResourceFile, 1, + PyDoc_STR("(SInt16 refNum) -> None")}, ++#ifndef __LP64__ + {"FSpResourceFileAlreadyOpen", (PyCFunction)Res_FSpResourceFileAlreadyOpen, 1, + PyDoc_STR("(FSSpec resourceFile) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, + {"FSpOpenOrphanResFile", (PyCFunction)Res_FSpOpenOrphanResFile, 1, +@@ -1659,14 +1670,17 @@ + PyDoc_STR("() -> (SInt16 refNum)")}, + {"GetNextResourceFile", (PyCFunction)Res_GetNextResourceFile, 1, + PyDoc_STR("(SInt16 curRefNum) -> (SInt16 nextRefNum)")}, ++#endif /* __LP64__ */ + {"FSOpenResFile", (PyCFunction)Res_FSOpenResFile, 1, + PyDoc_STR("(FSRef ref, SignedByte permission) -> (short _rv)")}, ++#ifndef __LP64__ + {"FSCreateResFile", (PyCFunction)Res_FSCreateResFile, 1, + PyDoc_STR("(FSRef parentRef, Buffer nameLength) -> (FSRef newRef, FSSpec newSpec)")}, + {"FSResourceFileAlreadyOpen", (PyCFunction)Res_FSResourceFileAlreadyOpen, 1, + PyDoc_STR("(FSRef resourceFileRef) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, + {"FSCreateResourceFile", (PyCFunction)Res_FSCreateResourceFile, 1, + PyDoc_STR("(FSRef parentRef, Buffer nameLength, Buffer forkNameLength) -> (FSRef newRef, FSSpec newSpec)")}, ++#endif /* __LP64__ */ + {"FSOpenResourceFile", (PyCFunction)Res_FSOpenResourceFile, 1, + PyDoc_STR("(FSRef ref, Buffer forkNameLength, SignedByte permissions) -> (SInt16 refNum)")}, + {"Handle", (PyCFunction)Res_Handle, 1, +diff -r -u ./Modules/_ctypes/libffi/src/darwin/ffitarget.h ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h +--- ./Modules/_ctypes/libffi/src/darwin/ffitarget.h 2006-05-26 06:58:05.000000000 +0900 ++++ ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h 2013-07-17 23:38:51.000000000 +0900 +@@ -4,7 +4,7 @@ + * created by configure). This makes is possible to build a univeral binary + * of ctypes in one go. + */ +-#if defined(__i386__) ++#if defined(__i386__) || defined(__x86_64__) + + #ifndef X86_DARWIN + #define X86_DARWIN +diff -r -u ./Python/mactoolboxglue.c ../Python-2.5/Python/mactoolboxglue.c +--- ./Python/mactoolboxglue.c 2006-07-12 01:44:25.000000000 +0900 ++++ ../Python-2.5/Python/mactoolboxglue.c 2013-07-17 23:39:09.000000000 +0900 +@@ -106,6 +106,7 @@ + } + + ++#ifndef __LP64__ + OSErr + PyMac_GetFullPathname(FSSpec *fss, char *path, int len) + { +@@ -153,6 +154,7 @@ + Py_XDECREF(fs); + return err; + } ++#endif /* !__LP64__ */ + + /* Convert a 4-char string object argument to an OSType value */ + int +@@ -417,6 +419,7 @@ + GLUE_NEW(GWorldPtr, GWorldObj_New, "Carbon.Qdoffs") + GLUE_CONVERT(GWorldPtr, GWorldObj_Convert, "Carbon.Qdoffs") + ++#ifndef __LP64__ + GLUE_NEW(Track, TrackObj_New, "Carbon.Qt") + GLUE_CONVERT(Track, TrackObj_Convert, "Carbon.Qt") + GLUE_NEW(Movie, MovieObj_New, "Carbon.Qt") +@@ -429,6 +432,7 @@ + GLUE_CONVERT(UserData, UserDataObj_Convert, "Carbon.Qt") + GLUE_NEW(Media, MediaObj_New, "Carbon.Qt") + GLUE_CONVERT(Media, MediaObj_Convert, "Carbon.Qt") ++#endif /* !__LP64__ */ + + GLUE_NEW(Handle, ResObj_New, "Carbon.Res") + GLUE_CONVERT(Handle, ResObj_Convert, "Carbon.Res") diff --git a/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/004_osx_libffi.patch b/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/004_osx_libffi.patch new file mode 100644 index 0000000..8318432 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/004_osx_libffi.patch @@ -0,0 +1,6881 @@ +diff -r -u ./Modules/_ctypes/libffi_osx/LICENSE ./Modules/_ctypes/libffi_osx/LICENSE +new file mode 100644 +index 0000000..f591795 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/LICENSE +@@ -0,0 +1,20 @@ ++libffi - Copyright (c) 1996-2003 Red Hat, Inc. ++ ++Permission is hereby granted, free of charge, to any person obtaining ++a copy of this software and associated documentation files (the ++``Software''), to deal in the Software without restriction, including ++without limitation the rights to use, copy, modify, merge, publish, ++distribute, sublicense, and/or sell copies of the Software, and to ++permit persons to whom the Software is furnished to do so, subject to ++the following conditions: ++ ++The above copyright notice and this permission notice shall be included ++in all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++OTHER DEALINGS IN THE SOFTWARE. +diff -r -u ./Modules/_ctypes/libffi_osx/README ./Modules/_ctypes/libffi_osx/README +new file mode 100644 +index 0000000..1fc2747 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/README +@@ -0,0 +1,500 @@ ++This directory contains the libffi package, which is not part of GCC but ++shipped with GCC as convenience. ++ ++Status ++====== ++ ++libffi-2.00 has not been released yet! This is a development snapshot! ++ ++libffi-1.20 was released on October 5, 1998. Check the libffi web ++page for updates: . ++ ++ ++What is libffi? ++=============== ++ ++Compilers for high level languages generate code that follow certain ++conventions. These conventions are necessary, in part, for separate ++compilation to work. One such convention is the "calling ++convention". The "calling convention" is essentially a set of ++assumptions made by the compiler about where function arguments will ++be found on entry to a function. A "calling convention" also specifies ++where the return value for a function is found. ++ ++Some programs may not know at the time of compilation what arguments ++are to be passed to a function. For instance, an interpreter may be ++told at run-time about the number and types of arguments used to call ++a given function. Libffi can be used in such programs to provide a ++bridge from the interpreter program to compiled code. ++ ++The libffi library provides a portable, high level programming ++interface to various calling conventions. This allows a programmer to ++call any function specified by a call interface description at run ++time. ++ ++Ffi stands for Foreign Function Interface. A foreign function ++interface is the popular name for the interface that allows code ++written in one language to call code written in another language. The ++libffi library really only provides the lowest, machine dependent ++layer of a fully featured foreign function interface. A layer must ++exist above libffi that handles type conversions for values passed ++between the two languages. ++ ++ ++Supported Platforms and Prerequisites ++===================================== ++ ++Libffi has been ported to: ++ ++ SunOS 4.1.3 & Solaris 2.x (SPARC-V8, SPARC-V9) ++ ++ Irix 5.3 & 6.2 (System V/o32 & n32) ++ ++ Intel x86 - Linux (System V ABI) ++ ++ Alpha - Linux and OSF/1 ++ ++ m68k - Linux (System V ABI) ++ ++ PowerPC - Linux (System V ABI, Darwin, AIX) ++ ++ ARM - Linux (System V ABI) ++ ++Libffi has been tested with the egcs 1.0.2 gcc compiler. Chances are ++that other versions will work. Libffi has also been built and tested ++with the SGI compiler tools. ++ ++On PowerPC, the tests failed (see the note below). ++ ++You must use GNU make to build libffi. SGI's make will not work. ++Sun's probably won't either. ++ ++If you port libffi to another platform, please let me know! I assume ++that some will be easy (x86 NetBSD), and others will be more difficult ++(HP). ++ ++ ++Installing libffi ++================= ++ ++[Note: before actually performing any of these installation steps, ++ you may wish to read the "Platform Specific Notes" below.] ++ ++First you must configure the distribution for your particular ++system. Go to the directory you wish to build libffi in and run the ++"configure" program found in the root directory of the libffi source ++distribution. ++ ++You may want to tell configure where to install the libffi library and ++header files. To do that, use the --prefix configure switch. Libffi ++will install under /usr/local by default. ++ ++If you want to enable extra run-time debugging checks use the the ++--enable-debug configure switch. This is useful when your program dies ++mysteriously while using libffi. ++ ++Another useful configure switch is --enable-purify-safety. Using this ++will add some extra code which will suppress certain warnings when you ++are using Purify with libffi. Only use this switch when using ++Purify, as it will slow down the library. ++ ++Configure has many other options. Use "configure --help" to see them all. ++ ++Once configure has finished, type "make". Note that you must be using ++GNU make. SGI's make will not work. Sun's probably won't either. ++You can ftp GNU make from prep.ai.mit.edu:/pub/gnu. ++ ++To ensure that libffi is working as advertised, type "make test". ++ ++To install the library and header files, type "make install". ++ ++ ++Using libffi ++============ ++ ++ The Basics ++ ---------- ++ ++Libffi assumes that you have a pointer to the function you wish to ++call and that you know the number and types of arguments to pass it, ++as well as the return type of the function. ++ ++The first thing you must do is create an ffi_cif object that matches ++the signature of the function you wish to call. The cif in ffi_cif ++stands for Call InterFace. To prepare a call interface object, use the ++following function: ++ ++ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, ++ unsigned int nargs, ++ ffi_type *rtype, ffi_type **atypes); ++ ++ CIF is a pointer to the call interface object you wish ++ to initialize. ++ ++ ABI is an enum that specifies the calling convention ++ to use for the call. FFI_DEFAULT_ABI defaults ++ to the system's native calling convention. Other ++ ABI's may be used with care. They are system ++ specific. ++ ++ NARGS is the number of arguments this function accepts. ++ libffi does not yet support vararg functions. ++ ++ RTYPE is a pointer to an ffi_type structure that represents ++ the return type of the function. Ffi_type objects ++ describe the types of values. libffi provides ++ ffi_type objects for many of the native C types: ++ signed int, unsigned int, signed char, unsigned char, ++ etc. There is also a pointer ffi_type object and ++ a void ffi_type. Use &ffi_type_void for functions that ++ don't return values. ++ ++ ATYPES is a vector of ffi_type pointers. ARGS must be NARGS long. ++ If NARGS is 0, this is ignored. ++ ++ ++ffi_prep_cif will return a status code that you are responsible ++for checking. It will be one of the following: ++ ++ FFI_OK - All is good. ++ ++ FFI_BAD_TYPEDEF - One of the ffi_type objects that ffi_prep_cif ++ came across is bad. ++ ++ ++Before making the call, the VALUES vector should be initialized ++with pointers to the appropriate argument values. ++ ++To call the function using the initialized ffi_cif, use the ++ffi_call function: ++ ++void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues); ++ ++ CIF is a pointer to the ffi_cif initialized specifically ++ for this function. ++ ++ FN is a pointer to the function you want to call. ++ ++ RVALUE is a pointer to a chunk of memory that is to hold the ++ result of the function call. Currently, it must be ++ at least one word in size (except for the n32 version ++ under Irix 6.x, which must be a pointer to an 8 byte ++ aligned value (a long long). It must also be at least ++ word aligned (depending on the return type, and the ++ system's alignment requirements). If RTYPE is ++ &ffi_type_void, this is ignored. If RVALUE is NULL, ++ the return value is discarded. ++ ++ AVALUES is a vector of void* that point to the memory locations ++ holding the argument values for a call. ++ If NARGS is 0, this is ignored. ++ ++ ++If you are expecting a return value from FN it will have been stored ++at RVALUE. ++ ++ ++ ++ An Example ++ ---------- ++ ++Here is a trivial example that calls puts() a few times. ++ ++ #include ++ #include ++ ++ int main() ++ { ++ ffi_cif cif; ++ ffi_type *args[1]; ++ void *values[1]; ++ char *s; ++ int rc; ++ ++ /* Initialize the argument info vectors */ ++ args[0] = &ffi_type_uint; ++ values[0] = &s; ++ ++ /* Initialize the cif */ ++ if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, ++ &ffi_type_uint, args) == FFI_OK) ++ { ++ s = "Hello World!"; ++ ffi_call(&cif, puts, &rc, values); ++ /* rc now holds the result of the call to puts */ ++ ++ /* values holds a pointer to the function's arg, so to ++ call puts() again all we need to do is change the ++ value of s */ ++ s = "This is cool!"; ++ ffi_call(&cif, puts, &rc, values); ++ } ++ ++ return 0; ++ } ++ ++ ++ ++ Aggregate Types ++ --------------- ++ ++Although libffi has no special support for unions or bit-fields, it is ++perfectly happy passing structures back and forth. You must first ++describe the structure to libffi by creating a new ffi_type object ++for it. Here is the definition of ffi_type: ++ ++ typedef struct _ffi_type ++ { ++ unsigned size; ++ short alignment; ++ short type; ++ struct _ffi_type **elements; ++ } ffi_type; ++ ++All structures must have type set to FFI_TYPE_STRUCT. You may set ++size and alignment to 0. These will be calculated and reset to the ++appropriate values by ffi_prep_cif(). ++ ++elements is a NULL terminated array of pointers to ffi_type objects ++that describe the type of the structure elements. These may, in turn, ++be structure elements. ++ ++The following example initializes a ffi_type object representing the ++tm struct from Linux's time.h: ++ ++ struct tm { ++ int tm_sec; ++ int tm_min; ++ int tm_hour; ++ int tm_mday; ++ int tm_mon; ++ int tm_year; ++ int tm_wday; ++ int tm_yday; ++ int tm_isdst; ++ /* Those are for future use. */ ++ long int __tm_gmtoff__; ++ __const char *__tm_zone__; ++ }; ++ ++ { ++ ffi_type tm_type; ++ ffi_type *tm_type_elements[12]; ++ int i; ++ ++ tm_type.size = tm_type.alignment = 0; ++ tm_type.elements = &tm_type_elements; ++ ++ for (i = 0; i < 9; i++) ++ tm_type_elements[i] = &ffi_type_sint; ++ ++ tm_type_elements[9] = &ffi_type_slong; ++ tm_type_elements[10] = &ffi_type_pointer; ++ tm_type_elements[11] = NULL; ++ ++ /* tm_type can now be used to represent tm argument types and ++ return types for ffi_prep_cif() */ ++ } ++ ++ ++ ++Platform Specific Notes ++======================= ++ ++ Intel x86 ++ --------- ++ ++There are no known problems with the x86 port. ++ ++ Sun SPARC - SunOS 4.1.3 & Solaris 2.x ++ ------------------------------------- ++ ++You must use GNU Make to build libffi on Sun platforms. ++ ++ MIPS - Irix 5.3 & 6.x ++ --------------------- ++ ++Irix 6.2 and better supports three different calling conventions: o32, ++n32 and n64. Currently, libffi only supports both o32 and n32 under ++Irix 6.x, but only o32 under Irix 5.3. Libffi will automatically be ++configured for whichever calling convention it was built for. ++ ++By default, the configure script will try to build libffi with the GNU ++development tools. To build libffi with the SGI development tools, set ++the environment variable CC to either "cc -32" or "cc -n32" before ++running configure under Irix 6.x (depending on whether you want an o32 ++or n32 library), or just "cc" for Irix 5.3. ++ ++With the n32 calling convention, when returning structures smaller ++than 16 bytes, be sure to provide an RVALUE that is 8 byte aligned. ++Here's one way of forcing this: ++ ++ double struct_storage[2]; ++ my_small_struct *s = (my_small_struct *) struct_storage; ++ /* Use s for RVALUE */ ++ ++If you don't do this you are liable to get spurious bus errors. ++ ++"long long" values are not supported yet. ++ ++You must use GNU Make to build libffi on SGI platforms. ++ ++ ARM - System V ABI ++ ------------------ ++ ++The ARM port was performed on a NetWinder running ARM Linux ELF ++(2.0.31) and gcc 2.8.1. ++ ++ ++ ++ PowerPC System V ABI ++ -------------------- ++ ++There are two `System V ABI's which libffi implements for PowerPC. ++They differ only in how small structures are returned from functions. ++ ++In the FFI_SYSV version, structures that are 8 bytes or smaller are ++returned in registers. This is what GCC does when it is configured ++for solaris, and is what the System V ABI I have (dated September ++1995) says. ++ ++In the FFI_GCC_SYSV version, all structures are returned the same way: ++by passing a pointer as the first argument to the function. This is ++what GCC does when it is configured for linux or a generic sysv ++target. ++ ++EGCS 1.0.1 (and probably other versions of EGCS/GCC) also has a ++inconsistency with the SysV ABI: When a procedure is called with many ++floating-point arguments, some of them get put on the stack. They are ++all supposed to be stored in double-precision format, even if they are ++only single-precision, but EGCS stores single-precision arguments as ++single-precision anyway. This causes one test to fail (the `many ++arguments' test). ++ ++ ++What's With The Crazy Comments? ++=============================== ++ ++You might notice a number of cryptic comments in the code, delimited ++by /*@ and @*/. These are annotations read by the program LCLint, a ++tool for statically checking C programs. You can read all about it at ++. ++ ++ ++History ++======= ++ ++1.20 Oct-5-98 ++ Raffaele Sena produces ARM port. ++ ++1.19 Oct-5-98 ++ Fixed x86 long double and long long return support. ++ m68k bug fixes from Andreas Schwab. ++ Patch for DU assembler compatibility for the Alpha from Richard ++ Henderson. ++ ++1.18 Apr-17-98 ++ Bug fixes and MIPS configuration changes. ++ ++1.17 Feb-24-98 ++ Bug fixes and m68k port from Andreas Schwab. PowerPC port from ++ Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes. ++ ++1.16 Feb-11-98 ++ Richard Henderson produces Alpha port. ++ ++1.15 Dec-4-97 ++ Fixed an n32 ABI bug. New libtool, auto* support. ++ ++1.14 May-13-97 ++ libtool is now used to generate shared and static libraries. ++ Fixed a minor portability problem reported by Russ McManus ++ . ++ ++1.13 Dec-2-96 ++ Added --enable-purify-safety to keep Purify from complaining ++ about certain low level code. ++ Sparc fix for calling functions with < 6 args. ++ Linux x86 a.out fix. ++ ++1.12 Nov-22-96 ++ Added missing ffi_type_void, needed for supporting void return ++ types. Fixed test case for non MIPS machines. Cygnus Support ++ is now Cygnus Solutions. ++ ++1.11 Oct-30-96 ++ Added notes about GNU make. ++ ++1.10 Oct-29-96 ++ Added configuration fix for non GNU compilers. ++ ++1.09 Oct-29-96 ++ Added --enable-debug configure switch. Clean-ups based on LCLint ++ feedback. ffi_mips.h is always installed. Many configuration ++ fixes. Fixed ffitest.c for sparc builds. ++ ++1.08 Oct-15-96 ++ Fixed n32 problem. Many clean-ups. ++ ++1.07 Oct-14-96 ++ Gordon Irlam rewrites v8.S again. Bug fixes. ++ ++1.06 Oct-14-96 ++ Gordon Irlam improved the sparc port. ++ ++1.05 Oct-14-96 ++ Interface changes based on feedback. ++ ++1.04 Oct-11-96 ++ Sparc port complete (modulo struct passing bug). ++ ++1.03 Oct-10-96 ++ Passing struct args, and returning struct values works for ++ all architectures/calling conventions. Expanded tests. ++ ++1.02 Oct-9-96 ++ Added SGI n32 support. Fixed bugs in both o32 and Linux support. ++ Added "make test". ++ ++1.01 Oct-8-96 ++ Fixed float passing bug in mips version. Restructured some ++ of the code. Builds cleanly with SGI tools. ++ ++1.00 Oct-7-96 ++ First release. No public announcement. ++ ++ ++Authors & Credits ++================= ++ ++libffi was written by Anthony Green . ++ ++Portions of libffi were derived from Gianni Mariani's free gencall ++library for Silicon Graphics machines. ++ ++The closure mechanism was designed and implemented by Kresten Krab ++Thorup. ++ ++The Sparc port was derived from code contributed by the fine folks at ++Visible Decisions Inc . Further enhancements were ++made by Gordon Irlam at Cygnus Solutions . ++ ++The Alpha port was written by Richard Henderson at Cygnus Solutions. ++ ++Andreas Schwab ported libffi to m68k Linux and provided a number of ++bug fixes. ++ ++Geoffrey Keating ported libffi to the PowerPC. ++ ++Raffaele Sena ported libffi to the ARM. ++ ++Jesper Skov and Andrew Haley both did more than their fair share of ++stepping through the code and tracking down bugs. ++ ++Thanks also to Tom Tromey for bug fixes and configuration help. ++ ++Thanks to Jim Blandy, who provided some useful feedback on the libffi ++interface. ++ ++If you have a problem, or have found a bug, please send a note to ++green@cygnus.com. +diff -r -u ./Modules/_ctypes/libffi_osx/README.pyobjc ./Modules/_ctypes/libffi_osx/README.pyobjc +new file mode 100644 +index 0000000..405d85f +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/README.pyobjc +@@ -0,0 +1,5 @@ ++This directory contains a slightly modified version of libffi, extracted from ++the GCC source-tree. ++ ++The only modifications are those that are necessary to compile libffi using ++the Apple provided compiler and outside of the GCC source tree. +diff -r -u ./Modules/_ctypes/libffi_osx/ffi.c ./Modules/_ctypes/libffi_osx/ffi.c +new file mode 100644 +index 0000000..bf42093 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/ffi.c +@@ -0,0 +1,226 @@ ++/* ----------------------------------------------------------------------- ++ prep_cif.c - Copyright (c) 1996, 1998 Red Hat, Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++#include ++ ++/* Round up to FFI_SIZEOF_ARG. */ ++#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG) ++ ++/* Perform machine independent initialization of aggregate type ++ specifications. */ ++ ++static ffi_status ++initialize_aggregate( ++/*@out@*/ ffi_type* arg) ++{ ++/*@-usedef@*/ ++ ++ if (arg == NULL || arg->elements == NULL || ++ arg->size != 0 || arg->alignment != 0) ++ return FFI_BAD_TYPEDEF; ++ ++ ffi_type** ptr = &(arg->elements[0]); ++ ++ while ((*ptr) != NULL) ++ { ++ if (((*ptr)->size == 0) && (initialize_aggregate(*ptr) != FFI_OK)) ++ return FFI_BAD_TYPEDEF; ++ ++ /* Perform a sanity check on the argument type */ ++ FFI_ASSERT_VALID_TYPE(*ptr); ++ ++#ifdef POWERPC_DARWIN ++ int curalign = (*ptr)->alignment; ++ ++ if (ptr != &(arg->elements[0])) ++ { ++ if (curalign > 4 && curalign != 16) ++ curalign = 4; ++ } ++ ++ arg->size = ALIGN(arg->size, curalign); ++ arg->size += (*ptr)->size; ++ arg->alignment = (arg->alignment > curalign) ? ++ arg->alignment : curalign; ++#else ++ arg->size = ALIGN(arg->size, (*ptr)->alignment); ++ arg->size += (*ptr)->size; ++ arg->alignment = (arg->alignment > (*ptr)->alignment) ? ++ arg->alignment : (*ptr)->alignment; ++#endif ++ ++ ptr++; ++ } ++ ++ /* Structure size includes tail padding. This is important for ++ structures that fit in one register on ABIs like the PowerPC64 ++ Linux ABI that right justify small structs in a register. ++ It's also needed for nested structure layout, for example ++ struct A { long a; char b; }; struct B { struct A x; char y; }; ++ should find y at an offset of 2*sizeof(long) and result in a ++ total size of 3*sizeof(long). */ ++ arg->size = ALIGN(arg->size, arg->alignment); ++ ++ if (arg->size == 0) ++ return FFI_BAD_TYPEDEF; ++ ++ return FFI_OK; ++ ++/*@=usedef@*/ ++} ++ ++#ifndef __CRIS__ ++/* The CRIS ABI specifies structure elements to have byte ++ alignment only, so it completely overrides this functions, ++ which assumes "natural" alignment and padding. */ ++ ++/* Perform machine independent ffi_cif preparation, then call ++ machine dependent routine. */ ++ ++#if defined(X86_DARWIN) ++ ++static inline bool ++struct_on_stack( ++ int size) ++{ ++ if (size > 8) ++ return true; ++ ++ /* This is not what the ABI says, but is what is really implemented */ ++ switch (size) ++ { ++ case 1: ++ case 2: ++ case 4: ++ case 8: ++ return false; ++ ++ default: ++ return true; ++ } ++} ++ ++#endif // defined(X86_DARWIN) ++ ++// Arguments' ffi_type->alignment must be nonzero. ++ffi_status ++ffi_prep_cif( ++/*@out@*/ /*@partial@*/ ffi_cif* cif, ++ ffi_abi abi, ++ unsigned int nargs, ++/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, ++/*@dependent@*/ ffi_type** atypes) ++{ ++ if (cif == NULL) ++ return FFI_BAD_TYPEDEF; ++ ++ if (abi <= FFI_FIRST_ABI || abi > FFI_DEFAULT_ABI) ++ return FFI_BAD_ABI; ++ ++ unsigned int bytes = 0; ++ unsigned int i; ++ ffi_type** ptr; ++ ++ cif->abi = abi; ++ cif->arg_types = atypes; ++ cif->nargs = nargs; ++ cif->rtype = rtype; ++ cif->flags = 0; ++ ++ /* Initialize the return type if necessary */ ++ /*@-usedef@*/ ++ if ((cif->rtype->size == 0) && (initialize_aggregate(cif->rtype) != FFI_OK)) ++ return FFI_BAD_TYPEDEF; ++ /*@=usedef@*/ ++ ++ /* Perform a sanity check on the return type */ ++ FFI_ASSERT_VALID_TYPE(cif->rtype); ++ ++ /* x86-64 and s390 stack space allocation is handled in prep_machdep. */ ++#if !defined M68K && !defined __x86_64__ && !defined S390 && !defined PA ++ /* Make space for the return structure pointer */ ++ if (cif->rtype->type == FFI_TYPE_STRUCT ++#ifdef SPARC ++ && (cif->abi != FFI_V9 || cif->rtype->size > 32) ++#endif ++#ifdef X86_DARWIN ++ && (struct_on_stack(cif->rtype->size)) ++#endif ++ ) ++ bytes = STACK_ARG_SIZE(sizeof(void*)); ++#endif ++ ++ for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) ++ { ++ /* Initialize any uninitialized aggregate type definitions */ ++ if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) ++ return FFI_BAD_TYPEDEF; ++ ++ if ((*ptr)->alignment == 0) ++ return FFI_BAD_TYPEDEF; ++ ++ /* Perform a sanity check on the argument type, do this ++ check after the initialization. */ ++ FFI_ASSERT_VALID_TYPE(*ptr); ++ ++#if defined(X86_DARWIN) ++ { ++ int align = (*ptr)->alignment; ++ ++ if (align > 4) ++ align = 4; ++ ++ if ((align - 1) & bytes) ++ bytes = ALIGN(bytes, align); ++ ++ bytes += STACK_ARG_SIZE((*ptr)->size); ++ } ++#elif !defined __x86_64__ && !defined S390 && !defined PA ++#ifdef SPARC ++ if (((*ptr)->type == FFI_TYPE_STRUCT ++ && ((*ptr)->size > 16 || cif->abi != FFI_V9)) ++ || ((*ptr)->type == FFI_TYPE_LONGDOUBLE ++ && cif->abi != FFI_V9)) ++ bytes += sizeof(void*); ++ else ++#endif ++ { ++ /* Add any padding if necessary */ ++ if (((*ptr)->alignment - 1) & bytes) ++ bytes = ALIGN(bytes, (*ptr)->alignment); ++ ++ bytes += STACK_ARG_SIZE((*ptr)->size); ++ } ++#endif ++ } ++ ++ cif->bytes = bytes; ++ ++ /* Perform machine dependent cif processing */ ++ return ffi_prep_cif_machdep(cif); ++} ++#endif /* not __CRIS__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi.h ./Modules/_ctypes/libffi_osx/include/ffi.h +new file mode 100644 +index 0000000..c104a5c +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ffi.h +@@ -0,0 +1,355 @@ ++/* -----------------------------------------------------------------*-C-*- ++ libffi PyOBJC - Copyright (c) 1996-2003 Red Hat, Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ++ ----------------------------------------------------------------------- */ ++ ++/* ------------------------------------------------------------------- ++ The basic API is described in the README file. ++ ++ The raw API is designed to bypass some of the argument packing ++ and unpacking on architectures for which it can be avoided. ++ ++ The closure API allows interpreted functions to be packaged up ++ inside a C function pointer, so that they can be called as C functions, ++ with no understanding on the client side that they are interpreted. ++ It can also be used in other cases in which it is necessary to package ++ up a user specified parameter and a function pointer as a single ++ function pointer. ++ ++ The closure API must be implemented in order to get its functionality, ++ e.g. for use by gij. Routines are provided to emulate the raw API ++ if the underlying platform doesn't allow faster implementation. ++ ++ More details on the raw and closure API can be found in: ++ ++ http://gcc.gnu.org/ml/java/1999-q3/msg00138.html ++ ++ and ++ ++ http://gcc.gnu.org/ml/java/1999-q3/msg00174.html ++ -------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_H ++#define LIBFFI_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/* Specify which architecture libffi is configured for. */ ++#ifdef MACOSX ++# if defined(__i386__) || defined(__x86_64__) ++# define X86_DARWIN ++# elif defined(__ppc__) || defined(__ppc64__) ++# define POWERPC_DARWIN ++# else ++# error "Unsupported MacOS X CPU type" ++# endif ++#else ++#error "Unsupported OS type" ++#endif ++ ++/* ---- System configuration information --------------------------------- */ ++ ++#include "ffitarget.h" ++#include "fficonfig.h" ++ ++#ifndef LIBFFI_ASM ++ ++#include ++#include ++ ++/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). ++ But we can find it either under the correct ANSI name, or under GNU ++ C's internal name. */ ++#ifdef LONG_LONG_MAX ++# define FFI_LONG_LONG_MAX LONG_LONG_MAX ++#else ++# ifdef LLONG_MAX ++# define FFI_LONG_LONG_MAX LLONG_MAX ++# else ++# ifdef __GNUC__ ++# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ ++# endif ++# endif ++#endif ++ ++#if SCHAR_MAX == 127 ++# define ffi_type_uchar ffi_type_uint8 ++# define ffi_type_schar ffi_type_sint8 ++#else ++#error "char size not supported" ++#endif ++ ++#if SHRT_MAX == 32767 ++# define ffi_type_ushort ffi_type_uint16 ++# define ffi_type_sshort ffi_type_sint16 ++#elif SHRT_MAX == 2147483647 ++# define ffi_type_ushort ffi_type_uint32 ++# define ffi_type_sshort ffi_type_sint32 ++#else ++#error "short size not supported" ++#endif ++ ++#if INT_MAX == 32767 ++# define ffi_type_uint ffi_type_uint16 ++# define ffi_type_sint ffi_type_sint16 ++#elif INT_MAX == 2147483647 ++# define ffi_type_uint ffi_type_uint32 ++# define ffi_type_sint ffi_type_sint32 ++#elif INT_MAX == 9223372036854775807 ++# define ffi_type_uint ffi_type_uint64 ++# define ffi_type_sint ffi_type_sint64 ++#else ++#error "int size not supported" ++#endif ++ ++#define ffi_type_ulong ffi_type_uint64 ++#define ffi_type_slong ffi_type_sint64 ++ ++#if LONG_MAX == 2147483647 ++# if FFI_LONG_LONG_MAX != 9223372036854775807 ++# error "no 64-bit data type supported" ++# endif ++#elif LONG_MAX != 9223372036854775807 ++#error "long size not supported" ++#endif ++ ++/* The closure code assumes that this works on pointers, i.e. a size_t ++ can hold a pointer. */ ++ ++typedef struct _ffi_type { ++ size_t size; ++ unsigned short alignment; ++ unsigned short type; ++/*@null@*/ struct _ffi_type** elements; ++} ffi_type; ++ ++/* These are defined in types.c */ ++extern ffi_type ffi_type_void; ++extern ffi_type ffi_type_uint8; ++extern ffi_type ffi_type_sint8; ++extern ffi_type ffi_type_uint16; ++extern ffi_type ffi_type_sint16; ++extern ffi_type ffi_type_uint32; ++extern ffi_type ffi_type_sint32; ++extern ffi_type ffi_type_uint64; ++extern ffi_type ffi_type_sint64; ++extern ffi_type ffi_type_float; ++extern ffi_type ffi_type_double; ++extern ffi_type ffi_type_longdouble; ++extern ffi_type ffi_type_pointer; ++ ++typedef enum ffi_status { ++ FFI_OK = 0, ++ FFI_BAD_TYPEDEF, ++ FFI_BAD_ABI ++} ffi_status; ++ ++typedef unsigned FFI_TYPE; ++ ++typedef struct ffi_cif { ++ ffi_abi abi; ++ unsigned nargs; ++/*@dependent@*/ ffi_type** arg_types; ++/*@dependent@*/ ffi_type* rtype; ++ unsigned bytes; ++ unsigned flags; ++#ifdef FFI_EXTRA_CIF_FIELDS ++ FFI_EXTRA_CIF_FIELDS; ++#endif ++} ffi_cif; ++ ++/* ---- Definitions for the raw API -------------------------------------- */ ++ ++#ifndef FFI_SIZEOF_ARG ++# if LONG_MAX == 2147483647 ++# define FFI_SIZEOF_ARG 4 ++# elif LONG_MAX == 9223372036854775807 ++# define FFI_SIZEOF_ARG 8 ++# endif ++#endif ++ ++typedef union { ++ ffi_sarg sint; ++ ffi_arg uint; ++ float flt; ++ char data[FFI_SIZEOF_ARG]; ++ void* ptr; ++} ffi_raw; ++ ++void ++ffi_raw_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ ffi_raw* avalue); ++ ++void ++ffi_ptrarray_to_raw( ++ ffi_cif* cif, ++ void** args, ++ ffi_raw* raw); ++ ++void ++ffi_raw_to_ptrarray( ++ ffi_cif* cif, ++ ffi_raw* raw, ++ void** args); ++ ++size_t ++ffi_raw_size( ++ ffi_cif* cif); ++ ++/* This is analogous to the raw API, except it uses Java parameter ++ packing, even on 64-bit machines. I.e. on 64-bit machines ++ longs and doubles are followed by an empty 64-bit word. */ ++void ++ffi_java_raw_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ ffi_raw* avalue); ++ ++void ++ffi_java_ptrarray_to_raw( ++ ffi_cif* cif, ++ void** args, ++ ffi_raw* raw); ++ ++void ++ffi_java_raw_to_ptrarray( ++ ffi_cif* cif, ++ ffi_raw* raw, ++ void** args); ++ ++size_t ++ffi_java_raw_size( ++ ffi_cif* cif); ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#if FFI_CLOSURES ++ ++typedef struct ffi_closure { ++ char tramp[FFI_TRAMPOLINE_SIZE]; ++ ffi_cif* cif; ++ void (*fun)(ffi_cif*,void*,void**,void*); ++ void* user_data; ++} ffi_closure; ++ ++ffi_status ++ffi_prep_closure( ++ ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,void**,void*), ++ void* user_data); ++ ++void ffi_closure_free(void *); ++void *ffi_closure_alloc (size_t size, void **code); ++ ++typedef struct ffi_raw_closure { ++ char tramp[FFI_TRAMPOLINE_SIZE]; ++ ffi_cif* cif; ++ ++#if !FFI_NATIVE_RAW_API ++ /* if this is enabled, then a raw closure has the same layout ++ as a regular closure. We use this to install an intermediate ++ handler to do the transaltion, void** -> ffi_raw*. */ ++ void (*translate_args)(ffi_cif*,void*,void**,void*); ++ void* this_closure; ++#endif ++ ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*); ++ void* user_data; ++} ffi_raw_closure; ++ ++ffi_status ++ffi_prep_raw_closure( ++ ffi_raw_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), ++ void* user_data); ++ ++ffi_status ++ffi_prep_java_raw_closure( ++ ffi_raw_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), ++ void* user_data); ++ ++#endif // FFI_CLOSURES ++ ++/* ---- Public interface definition -------------------------------------- */ ++ ++ffi_status ++ffi_prep_cif( ++/*@out@*/ /*@partial@*/ ffi_cif* cif, ++ ffi_abi abi, ++ unsigned int nargs, ++/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, ++/*@dependent@*/ ffi_type** atypes); ++ ++void ++ffi_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ void** avalue); ++ ++/* Useful for eliminating compiler warnings */ ++#define FFI_FN(f) ((void (*)(void))f) ++ ++#endif // #ifndef LIBFFI_ASM ++/* ---- Definitions shared with assembly code ---------------------------- */ ++ ++/* If these change, update src/mips/ffitarget.h. */ ++#define FFI_TYPE_VOID 0 ++#define FFI_TYPE_INT 1 ++#define FFI_TYPE_FLOAT 2 ++#define FFI_TYPE_DOUBLE 3 ++ ++#ifdef HAVE_LONG_DOUBLE ++# define FFI_TYPE_LONGDOUBLE 4 ++#else ++# define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE ++#endif ++ ++#define FFI_TYPE_UINT8 5 ++#define FFI_TYPE_SINT8 6 ++#define FFI_TYPE_UINT16 7 ++#define FFI_TYPE_SINT16 8 ++#define FFI_TYPE_UINT32 9 ++#define FFI_TYPE_SINT32 10 ++#define FFI_TYPE_UINT64 11 ++#define FFI_TYPE_SINT64 12 ++#define FFI_TYPE_STRUCT 13 ++#define FFI_TYPE_POINTER 14 ++ ++/* This should always refer to the last type code (for sanity checks) */ ++#define FFI_TYPE_LAST FFI_TYPE_POINTER ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif // #ifndef LIBFFI_H +diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi_common.h ./Modules/_ctypes/libffi_osx/include/ffi_common.h +new file mode 100644 +index 0000000..685a358 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ffi_common.h +@@ -0,0 +1,102 @@ ++/* ----------------------------------------------------------------------- ++ ffi_common.h - Copyright (c) 1996 Red Hat, Inc. ++ ++ Common internal definitions and macros. Only necessary for building ++ libffi. ++ ----------------------------------------------------------------------- */ ++ ++#ifndef FFI_COMMON_H ++#define FFI_COMMON_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include "fficonfig.h" ++ ++/* Do not move this. Some versions of AIX are very picky about where ++ this is positioned. */ ++#ifdef __GNUC__ ++# define alloca __builtin_alloca ++#else ++# if HAVE_ALLOCA_H ++# include ++# else ++# ifdef _AIX ++# pragma alloca ++# else ++# ifndef alloca /* predefined by HP cc +Olibcalls */ ++char* alloca(); ++# endif ++# endif ++# endif ++#endif ++ ++/* Check for the existence of memcpy. */ ++#if STDC_HEADERS ++# include ++#else ++# ifndef HAVE_MEMCPY ++# define memcpy(d, s, n) bcopy((s), (d), (n)) ++# endif ++#endif ++ ++/*#if defined(FFI_DEBUG) ++#include ++#endif*/ ++ ++#ifdef FFI_DEBUG ++#include ++ ++/*@exits@*/ void ++ffi_assert( ++/*@temp@*/ char* expr, ++/*@temp@*/ char* file, ++ int line); ++void ++ffi_stop_here(void); ++void ++ffi_type_test( ++/*@temp@*/ /*@out@*/ ffi_type* a, ++/*@temp@*/ char* file, ++ int line); ++ ++# define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) ++# define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) ++# define FFI_ASSERT_VALID_TYPE(x) ffi_type_test(x, __FILE__, __LINE__) ++#else ++# define FFI_ASSERT(x) ++# define FFI_ASSERT_AT(x, f, l) ++# define FFI_ASSERT_VALID_TYPE(x) ++#endif // #ifdef FFI_DEBUG ++ ++#define ALIGN(v, a) (((size_t)(v) + (a) - 1) & ~((a) - 1)) ++ ++/* Perform machine dependent cif processing */ ++ffi_status ++ffi_prep_cif_machdep( ++ ffi_cif* cif); ++ ++/* Extended cif, used in callback from assembly routine */ ++typedef struct extended_cif { ++/*@dependent@*/ ffi_cif* cif; ++/*@dependent@*/ void* rvalue; ++/*@dependent@*/ void** avalue; ++} extended_cif; ++ ++/* Terse sized type definitions. */ ++typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); ++typedef signed int SINT8 __attribute__((__mode__(__QI__))); ++typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); ++typedef signed int SINT16 __attribute__((__mode__(__HI__))); ++typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); ++typedef signed int SINT32 __attribute__((__mode__(__SI__))); ++typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); ++typedef signed int SINT64 __attribute__((__mode__(__DI__))); ++typedef float FLOAT32; ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif // #ifndef FFI_COMMON_H +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/fficonfig.h ./Modules/_ctypes/libffi_osx/include/fficonfig.h +new file mode 100644 +index 0000000..2172490 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/fficonfig.h +@@ -0,0 +1,150 @@ ++/* Manually created fficonfig.h for Darwin on PowerPC or Intel ++ ++ This file is manually generated to do away with the need for autoconf and ++ therefore make it easier to cross-compile and build fat binaries. ++ ++ NOTE: This file was added by PyObjC. ++*/ ++ ++#ifndef MACOSX ++#error "This file is only supported on Mac OS X" ++#endif ++ ++#if defined(__i386__) ++# define BYTEORDER 1234 ++# undef HOST_WORDS_BIG_ENDIAN ++# undef WORDS_BIGENDIAN ++# define SIZEOF_DOUBLE 8 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++ ++#elif defined(__x86_64__) ++# define BYTEORDER 1234 ++# undef HOST_WORDS_BIG_ENDIAN ++# undef WORDS_BIGENDIAN ++# define SIZEOF_DOUBLE 8 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++ ++#elif defined(__ppc__) ++# define BYTEORDER 4321 ++# define HOST_WORDS_BIG_ENDIAN 1 ++# define WORDS_BIGENDIAN 1 ++# define SIZEOF_DOUBLE 8 ++# if __GNUC__ >= 4 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++# else ++# undef HAVE_LONG_DOUBLE ++# define SIZEOF_LONG_DOUBLE 8 ++# endif ++ ++#elif defined(__ppc64__) ++# define BYTEORDER 4321 ++# define HOST_WORDS_BIG_ENDIAN 1 ++# define WORDS_BIGENDIAN 1 ++# define SIZEOF_DOUBLE 8 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++ ++#else ++#error "Unknown CPU type" ++#endif ++ ++/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP ++ systems. This function is required for `alloca.c' support on those systems. */ ++#undef CRAY_STACKSEG_END ++ ++/* Define to 1 if using `alloca.c'. */ ++/* #undef C_ALLOCA */ ++ ++/* Define to the flags needed for the .section .eh_frame directive. */ ++#define EH_FRAME_FLAGS "aw" ++ ++/* Define this if you want extra debugging. */ ++/* #undef FFI_DEBUG */ ++ ++/* Define this is you do not want support for the raw API. */ ++#define FFI_NO_RAW_API 1 ++ ++/* Define this if you do not want support for aggregate types. */ ++/* #undef FFI_NO_STRUCTS */ ++ ++/* Define to 1 if you have `alloca', as a function or macro. */ ++#define HAVE_ALLOCA 1 ++ ++/* Define to 1 if you have and it should be used (not on Ultrix). */ ++#define HAVE_ALLOCA_H 1 ++ ++/* Define if your assembler supports .register. */ ++/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ ++ ++/* Define if your assembler and linker support unaligned PC relative relocs. */ ++/* #undef HAVE_AS_SPARC_UA_PCREL */ ++ ++/* Define to 1 if you have the `memcpy' function. */ ++#define HAVE_MEMCPY 1 ++ ++/* Define if mmap with MAP_ANON(YMOUS) works. */ ++#define HAVE_MMAP_ANON 1 ++ ++/* Define if mmap of /dev/zero works. */ ++/* #undef HAVE_MMAP_DEV_ZERO */ ++ ++/* Define if read-only mmap of a plain file works. */ ++#define HAVE_MMAP_FILE 1 ++ ++/* Define if .eh_frame sections should be read-only. */ ++/* #undef HAVE_RO_EH_FRAME */ ++ ++/* Define to 1 if your C compiler doesn't accept -c and -o together. */ ++/* #undef NO_MINUS_C_MINUS_O */ ++ ++/* Name of package */ ++#define PACKAGE "libffi" ++ ++/* Define to the address where bug reports for this package should be sent. */ ++#define PACKAGE_BUGREPORT "http://gcc.gnu.org/bugs.html" ++ ++/* Define to the full name of this package. */ ++#define PACKAGE_NAME "libffi" ++ ++/* Define to the full name and version of this package. */ ++#define PACKAGE_STRING "libffi 2.1" ++ ++/* Define to the one symbol short name of this package. */ ++#define PACKAGE_TARNAME "libffi" ++ ++/* Define to the version of this package. */ ++#define PACKAGE_VERSION "2.1" ++ ++/* If using the C implementation of alloca, define if you know the ++ direction of stack growth for your system; otherwise it will be ++ automatically deduced at run-time. ++ STACK_DIRECTION > 0 => grows toward higher addresses ++ STACK_DIRECTION < 0 => grows toward lower addresses ++ STACK_DIRECTION = 0 => direction of growth unknown */ ++/* #undef STACK_DIRECTION */ ++ ++/* Define to 1 if you have the ANSI C header files. */ ++#define STDC_HEADERS 1 ++ ++/* Define this if you are using Purify and want to suppress spurious messages. */ ++/* #undef USING_PURIFY */ ++ ++/* Version number of package */ ++#define VERSION "2.1-pyobjc" ++ ++#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE ++# ifdef LIBFFI_ASM ++# define FFI_HIDDEN(name) .hidden name ++# else ++# define FFI_HIDDEN __attribute__((visibility ("hidden"))) ++# endif ++#else ++# ifdef LIBFFI_ASM ++# define FFI_HIDDEN(name) ++# else ++# define FFI_HIDDEN ++# endif ++#endif +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/ffitarget.h ./Modules/_ctypes/libffi_osx/include/ffitarget.h +new file mode 100644 +index 0000000..faaa30d +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ffitarget.h +@@ -0,0 +1,13 @@ ++/* Dispatch to the right ffitarget file. This file is PyObjC specific; in a ++ normal build, the build environment copies the file to the right location or ++ sets up the right include flags. We want to do neither because that would ++ make building fat binaries harder. ++*/ ++ ++#if defined(__i386__) || defined(__x86_64__) ++#include "x86-ffitarget.h" ++#elif defined(__ppc__) || defined(__ppc64__) ++#include "ppc-ffitarget.h" ++#else ++#error "Unsupported CPU type" ++#endif +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h +new file mode 100644 +index 0000000..2318421 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h +@@ -0,0 +1,104 @@ ++/* -----------------------------------------------------------------*-C-*- ++ ppc-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ Target configuration macros for PowerPC. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++/* ---- System specific configurations ----------------------------------- */ ++ ++#if (defined(POWERPC) && defined(__powerpc64__)) || \ ++ (defined(POWERPC_DARWIN) && defined(__ppc64__)) ++#define POWERPC64 ++#endif ++ ++#ifndef LIBFFI_ASM ++ ++typedef unsigned long ffi_arg; ++typedef signed long ffi_sarg; ++ ++typedef enum ffi_abi { ++ FFI_FIRST_ABI = 0, ++ ++#ifdef POWERPC ++ FFI_SYSV, ++ FFI_GCC_SYSV, ++ FFI_LINUX64, ++# ifdef POWERPC64 ++ FFI_DEFAULT_ABI = FFI_LINUX64, ++# else ++ FFI_DEFAULT_ABI = FFI_GCC_SYSV, ++# endif ++#endif ++ ++#ifdef POWERPC_AIX ++ FFI_AIX, ++ FFI_DARWIN, ++ FFI_DEFAULT_ABI = FFI_AIX, ++#endif ++ ++#ifdef POWERPC_DARWIN ++ FFI_AIX, ++ FFI_DARWIN, ++ FFI_DEFAULT_ABI = FFI_DARWIN, ++#endif ++ ++#ifdef POWERPC_FREEBSD ++ FFI_SYSV, ++ FFI_GCC_SYSV, ++ FFI_LINUX64, ++ FFI_DEFAULT_ABI = FFI_SYSV, ++#endif ++ ++ FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 ++} ffi_abi; ++ ++#endif // #ifndef LIBFFI_ASM ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#define FFI_CLOSURES 1 ++#define FFI_NATIVE_RAW_API 0 ++ ++/* Needed for FFI_SYSV small structure returns. */ ++#define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST) ++ ++#if defined(POWERPC64) /*|| defined(POWERPC_AIX)*/ ++# define FFI_TRAMPOLINE_SIZE 48 ++#elif defined(POWERPC_AIX) ++# define FFI_TRAMPOLINE_SIZE 24 ++#else ++# define FFI_TRAMPOLINE_SIZE 40 ++#endif ++ ++#ifndef LIBFFI_ASM ++# if defined(POWERPC_DARWIN) || defined(POWERPC_AIX) ++typedef struct ffi_aix_trampoline_struct { ++ void* code_pointer; /* Pointer to ffi_closure_ASM */ ++ void* toc; /* TOC */ ++ void* static_chain; /* Pointer to closure */ ++} ffi_aix_trampoline_struct; ++# endif ++#endif // #ifndef LIBFFI_ASM ++ ++#endif // #ifndef LIBFFI_TARGET_H +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h +new file mode 100644 +index 0000000..55c2b6c +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h +@@ -0,0 +1,88 @@ ++/* -----------------------------------------------------------------*-C-*- ++ x86-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ Target configuration macros for x86 and x86-64. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ++ ----------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++/* ---- System specific configurations ----------------------------------- */ ++ ++#if defined(X86_64) && defined(__i386__) ++# undef X86_64 ++# define X86 ++#endif ++ ++#if defined(__x86_64__) ++# ifndef X86_64 ++# define X86_64 ++# endif ++#endif ++ ++/* ---- Generic type definitions ----------------------------------------- */ ++ ++#ifndef LIBFFI_ASM ++ ++typedef unsigned long ffi_arg; ++typedef signed long ffi_sarg; ++ ++typedef enum ffi_abi { ++ FFI_FIRST_ABI = 0, ++ ++ /* ---- Intel x86 Win32 ---------- */ ++#ifdef X86_WIN32 ++ FFI_SYSV, ++ FFI_STDCALL, ++ /* TODO: Add fastcall support for the sake of completeness */ ++ FFI_DEFAULT_ABI = FFI_SYSV, ++#endif ++ ++ /* ---- Intel x86 and AMD x86-64 - */ ++#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__)) ++ FFI_SYSV, ++ FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ ++# ifdef __i386__ ++ FFI_DEFAULT_ABI = FFI_SYSV, ++# else ++ FFI_DEFAULT_ABI = FFI_UNIX64, ++# endif ++#endif ++ ++ FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 ++} ffi_abi; ++ ++#endif // #ifndef LIBFFI_ASM ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#define FFI_CLOSURES 1 ++ ++#if defined(X86_64) || (defined(__x86_64__) && defined(X86_DARWIN)) ++# define FFI_TRAMPOLINE_SIZE 24 ++# define FFI_NATIVE_RAW_API 0 ++#else ++# define FFI_TRAMPOLINE_SIZE 10 ++# define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ ++#endif ++ ++#endif // #ifndef LIBFFI_TARGET_H +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S +new file mode 100644 +index 0000000..f143dbd +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S +@@ -0,0 +1,365 @@ ++#if defined(__ppc__) || defined(__ppc64__) ++ ++/* ----------------------------------------------------------------------- ++ ppc-darwin.S - Copyright (c) 2000 John Hornkvist ++ Copyright (c) 2004 Free Software Foundation, Inc. ++ ++ PowerPC Assembly glue. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++ ++#include ++#include ++#include ++#include ++ ++.text ++ .align 2 ++.globl _ffi_prep_args ++ ++.text ++ .align 2 ++.globl _ffi_call_DARWIN ++ ++.text ++ .align 2 ++_ffi_call_DARWIN: ++LFB0: ++ mr r12,r8 /* We only need r12 until the call, ++ so it doesn't have to be saved. */ ++ ++LFB1: ++ /* Save the old stack pointer as AP. */ ++ mr r8,r1 ++ ++LCFI0: ++#if defined(__ppc64__) ++ /* Allocate the stack space we need. ++ r4 (size of input data) ++ 48 bytes (linkage area) ++ 40 bytes (saved registers) ++ 8 bytes (extra FPR) ++ r4 + 96 bytes total ++ */ ++ ++ addi r4,r4,-96 // Add our overhead. ++ li r0,-32 // Align to 32 bytes. ++ and r4,r4,r0 ++#endif ++ stgux r1,r1,r4 // Grow the stack. ++ mflr r9 ++ ++ /* Save registers we use. */ ++#if defined(__ppc64__) ++ std r27,-40(r8) ++#endif ++ stg r28,MODE_CHOICE(-16,-32)(r8) ++ stg r29,MODE_CHOICE(-12,-24)(r8) ++ stg r30,MODE_CHOICE(-8,-16)(r8) ++ stg r31,MODE_CHOICE(-4,-8)(r8) ++ stg r9,SF_RETURN(r8) /* return address */ ++#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ ++ stg r2,MODE_CHOICE(20,40)(r1) ++#endif ++ ++LCFI1: ++#if defined(__ppc64__) ++ mr r27,r3 // our extended_cif ++#endif ++ /* Save arguments over call. */ ++ mr r31,r5 /* flags, */ ++ mr r30,r6 /* rvalue, */ ++ mr r29,r7 /* function address, */ ++ mr r28,r8 /* our AP. */ ++ ++LCFI2: ++ /* Call ffi_prep_args. */ ++ mr r4,r1 ++ li r9,0 ++ mtctr r12 /* r12 holds address of _ffi_prep_args. */ ++ bctrl ++#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ ++ lg r2,MODE_CHOICE(20,40)(r1) ++#endif ++ ++ /* Now do the call. ++ Set up cr1 with bits 4-7 of the flags. */ ++ mtcrf 0x40,r31 ++ ++ /* Load all those argument registers. ++ We have set up a nice stack frame, just load it into registers. */ ++ lg r3,SF_ARG1(r1) ++ lg r4,SF_ARG2(r1) ++ lg r5,SF_ARG3(r1) ++ lg r6,SF_ARG4(r1) ++ nop ++ lg r7,SF_ARG5(r1) ++ lg r8,SF_ARG6(r1) ++ lg r9,SF_ARG7(r1) ++ lg r10,SF_ARG8(r1) ++ ++ /* Load all the FP registers. */ ++ bf 6,L2 /* No floats to load. */ ++#if defined(__ppc64__) ++ lfd f1,MODE_CHOICE(-16,-40)-(14*8)(r28) ++ lfd f2,MODE_CHOICE(-16,-40)-(13*8)(r28) ++ lfd f3,MODE_CHOICE(-16,-40)-(12*8)(r28) ++ lfd f4,MODE_CHOICE(-16,-40)-(11*8)(r28) ++ nop ++ lfd f5,MODE_CHOICE(-16,-40)-(10*8)(r28) ++ lfd f6,MODE_CHOICE(-16,-40)-(9*8)(r28) ++ lfd f7,MODE_CHOICE(-16,-40)-(8*8)(r28) ++ lfd f8,MODE_CHOICE(-16,-40)-(7*8)(r28) ++ nop ++ lfd f9,MODE_CHOICE(-16,-40)-(6*8)(r28) ++ lfd f10,MODE_CHOICE(-16,-40)-(5*8)(r28) ++ lfd f11,MODE_CHOICE(-16,-40)-(4*8)(r28) ++ lfd f12,MODE_CHOICE(-16,-40)-(3*8)(r28) ++ nop ++ lfd f13,MODE_CHOICE(-16,-40)-(2*8)(r28) ++ lfd f14,MODE_CHOICE(-16,-40)-(1*8)(r28) ++#elif defined(__ppc__) ++ lfd f1,MODE_CHOICE(-16,-40)-(13*8)(r28) ++ lfd f2,MODE_CHOICE(-16,-40)-(12*8)(r28) ++ lfd f3,MODE_CHOICE(-16,-40)-(11*8)(r28) ++ lfd f4,MODE_CHOICE(-16,-40)-(10*8)(r28) ++ nop ++ lfd f5,MODE_CHOICE(-16,-40)-(9*8)(r28) ++ lfd f6,MODE_CHOICE(-16,-40)-(8*8)(r28) ++ lfd f7,MODE_CHOICE(-16,-40)-(7*8)(r28) ++ lfd f8,MODE_CHOICE(-16,-40)-(6*8)(r28) ++ nop ++ lfd f9,MODE_CHOICE(-16,-40)-(5*8)(r28) ++ lfd f10,MODE_CHOICE(-16,-40)-(4*8)(r28) ++ lfd f11,MODE_CHOICE(-16,-40)-(3*8)(r28) ++ lfd f12,MODE_CHOICE(-16,-40)-(2*8)(r28) ++ nop ++ lfd f13,MODE_CHOICE(-16,-40)-(1*8)(r28) ++#else ++#error undefined architecture ++#endif ++ ++L2: ++ mr r12,r29 // Put the target address in r12 as specified. ++ mtctr r12 // Get the address to call into CTR. ++ nop ++ nop ++ bctrl // Make the call. ++ ++ // Deal with the return value. ++#if defined(__ppc64__) ++ mtcrf 0x3,r31 // flags in cr6 and cr7 ++ bt 27,L(st_return_value) ++#elif defined(__ppc__) ++ mtcrf 0x1,r31 // flags in cr7 ++#else ++#error undefined architecture ++#endif ++ ++ bt 30,L(done_return_value) ++ bt 29,L(fp_return_value) ++ stg r3,0(r30) ++#if defined(__ppc__) ++ bf 28,L(done_return_value) // Store the second long if necessary. ++ stg r4,4(r30) ++#endif ++ // Fall through ++ ++L(done_return_value): ++ lg r1,0(r1) // Restore stack pointer. ++ // Restore the registers we used. ++ lg r9,SF_RETURN(r1) // return address ++ lg r31,MODE_CHOICE(-4,-8)(r1) ++ mtlr r9 ++ lg r30,MODE_CHOICE(-8,-16)(r1) ++ lg r29,MODE_CHOICE(-12,-24)(r1) ++ lg r28,MODE_CHOICE(-16,-32)(r1) ++#if defined(__ppc64__) ++ ld r27,-40(r1) ++#endif ++ blr ++ ++#if defined(__ppc64__) ++L(st_return_value): ++ // Grow the stack enough to fit the registers. Leave room for 8 args ++ // to trample the 1st 8 slots in param area. ++ stgu r1,-SF_ROUND(280)(r1) // 64 + 104 + 48 + 64 ++ ++ // Store GPRs ++ std r3,SF_ARG9(r1) ++ std r4,SF_ARG10(r1) ++ std r5,SF_ARG11(r1) ++ std r6,SF_ARG12(r1) ++ nop ++ std r7,SF_ARG13(r1) ++ std r8,SF_ARG14(r1) ++ std r9,SF_ARG15(r1) ++ std r10,SF_ARG16(r1) ++ ++ // Store FPRs ++ nop ++ bf 26,L(call_struct_to_ram_form) ++ stfd f1,SF_ARG17(r1) ++ stfd f2,SF_ARG18(r1) ++ stfd f3,SF_ARG19(r1) ++ stfd f4,SF_ARG20(r1) ++ nop ++ stfd f5,SF_ARG21(r1) ++ stfd f6,SF_ARG22(r1) ++ stfd f7,SF_ARG23(r1) ++ stfd f8,SF_ARG24(r1) ++ nop ++ stfd f9,SF_ARG25(r1) ++ stfd f10,SF_ARG26(r1) ++ stfd f11,SF_ARG27(r1) ++ stfd f12,SF_ARG28(r1) ++ nop ++ stfd f13,SF_ARG29(r1) ++ ++L(call_struct_to_ram_form): ++ ld r3,0(r27) // extended_cif->cif* ++ ld r3,16(r3) // ffi_cif->rtype* ++ addi r4,r1,SF_ARG9 // stored GPRs ++ addi r6,r1,SF_ARG17 // stored FPRs ++ li r5,0 // GPR size ptr (NULL) ++ li r7,0 // FPR size ptr (NULL) ++ li r8,0 // FPR count ptr (NULL) ++ li r10,0 // struct offset (NULL) ++ mr r9,r30 // return area ++ bl Lffi64_struct_to_ram_form$stub ++ lg r1,0(r1) // Restore stack pointer. ++ b L(done_return_value) ++#endif ++ ++L(fp_return_value): ++ /* Do we have long double to store? */ ++ bf 31,L(fd_return_value) ++ stfd f1,0(r30) ++ stfd f2,8(r30) ++ b L(done_return_value) ++ ++L(fd_return_value): ++ /* Do we have double to store? */ ++ bf 28,L(float_return_value) ++ stfd f1,0(r30) ++ b L(done_return_value) ++ ++L(float_return_value): ++ /* We only have a float to store. */ ++ stfs f1,0(r30) ++ b L(done_return_value) ++ ++LFE1: ++/* END(_ffi_call_DARWIN) */ ++ ++/* Provide a null definition of _ffi_call_AIX. */ ++.text ++ .align 2 ++.globl _ffi_call_AIX ++.text ++ .align 2 ++_ffi_call_AIX: ++ blr ++/* END(_ffi_call_AIX) */ ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ; Length of Common Information Entry ++LSCIE1: ++ .long 0x0 ; CIE Identifier Tag ++ .byte 0x1 ; CIE Version ++ .ascii "zR\0" ; CIE Augmentation ++ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor ++ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte 0x41 ; CIE RA Column ++ .byte 0x1 ; uleb128 0x1; Augmentation size ++ .byte 0x10 ; FDE Encoding (pcrel) ++ .byte 0xc ; DW_CFA_def_cfa ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x0 ; uleb128 0x0 ++ .align LOG2_GPR_BYTES ++LECIE1: ++.globl _ffi_call_DARWIN.eh ++_ffi_call_DARWIN.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ; FDE Length ++ ++LASFDE1: ++ .long LASFDE1-EH_frame1 ; FDE CIE offset ++ .g_long LFB0-. ; FDE initial location ++ .set L$set$3,LFE1-LFB0 ++ .g_long L$set$3 ; FDE address range ++ .byte 0x0 ; uleb128 0x0; Augmentation size ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$4,LCFI0-LFB1 ++ .long L$set$4 ++ .byte 0xd ; DW_CFA_def_cfa_register ++ .byte 0x08 ; uleb128 0x08 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$5,LCFI1-LCFI0 ++ .long L$set$5 ++ .byte 0x11 ; DW_CFA_offset_extended_sf ++ .byte 0x41 ; uleb128 0x41 ++ .byte 0x7e ; sleb128 -2 ++ .byte 0x9f ; DW_CFA_offset, column 0x1f ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x9e ; DW_CFA_offset, column 0x1e ++ .byte 0x2 ; uleb128 0x2 ++ .byte 0x9d ; DW_CFA_offset, column 0x1d ++ .byte 0x3 ; uleb128 0x3 ++ .byte 0x9c ; DW_CFA_offset, column 0x1c ++ .byte 0x4 ; uleb128 0x4 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$6,LCFI2-LCFI1 ++ .long L$set$6 ++ .byte 0xd ; DW_CFA_def_cfa_register ++ .byte 0x1c ; uleb128 0x1c ++ .align LOG2_GPR_BYTES ++LEFDE1: ++ ++#if defined(__ppc64__) ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi64_struct_to_ram_form$stub: ++ .indirect_symbol _ffi64_struct_to_ram_form ++ mflr r0 ++ bcl 20,31,LO$ffi64_struct_to_ram_form ++ ++LO$ffi64_struct_to_ram_form: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form) ++ mtlr r0 ++ lgu r12,lo16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi64_struct_to_ram_form$lazy_ptr: ++ .indirect_symbol _ffi64_struct_to_ram_form ++ .g_long dyld_stub_binding_helper ++ ++#endif // __ppc64__ ++#endif // __ppc__ || __ppc64__ +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h +new file mode 100644 +index 0000000..cf4bd50 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h +@@ -0,0 +1,85 @@ ++/* ----------------------------------------------------------------------- ++ ppc-darwin.h - Copyright (c) 2002, 2003, 2004, Free Software Foundation, ++ Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define L(x) x ++ ++#define SF_ARG9 MODE_CHOICE(56,112) ++#define SF_ARG10 MODE_CHOICE(60,120) ++#define SF_ARG11 MODE_CHOICE(64,128) ++#define SF_ARG12 MODE_CHOICE(68,136) ++#define SF_ARG13 MODE_CHOICE(72,144) ++#define SF_ARG14 MODE_CHOICE(76,152) ++#define SF_ARG15 MODE_CHOICE(80,160) ++#define SF_ARG16 MODE_CHOICE(84,168) ++#define SF_ARG17 MODE_CHOICE(88,176) ++#define SF_ARG18 MODE_CHOICE(92,184) ++#define SF_ARG19 MODE_CHOICE(96,192) ++#define SF_ARG20 MODE_CHOICE(100,200) ++#define SF_ARG21 MODE_CHOICE(104,208) ++#define SF_ARG22 MODE_CHOICE(108,216) ++#define SF_ARG23 MODE_CHOICE(112,224) ++#define SF_ARG24 MODE_CHOICE(116,232) ++#define SF_ARG25 MODE_CHOICE(120,240) ++#define SF_ARG26 MODE_CHOICE(124,248) ++#define SF_ARG27 MODE_CHOICE(128,256) ++#define SF_ARG28 MODE_CHOICE(132,264) ++#define SF_ARG29 MODE_CHOICE(136,272) ++ ++#define ASM_NEEDS_REGISTERS 4 ++#define NUM_GPR_ARG_REGISTERS 8 ++#define NUM_FPR_ARG_REGISTERS 13 ++ ++#define FFI_TYPE_1_BYTE(x) ((x) == FFI_TYPE_UINT8 || (x) == FFI_TYPE_SINT8) ++#define FFI_TYPE_2_BYTE(x) ((x) == FFI_TYPE_UINT16 || (x) == FFI_TYPE_SINT16) ++#define FFI_TYPE_4_BYTE(x) \ ++ ((x) == FFI_TYPE_UINT32 || (x) == FFI_TYPE_SINT32 ||\ ++ (x) == FFI_TYPE_INT || (x) == FFI_TYPE_FLOAT) ++ ++#if !defined(LIBFFI_ASM) ++ ++enum { ++ FLAG_RETURNS_NOTHING = 1 << (31 - 30), // cr7 ++ FLAG_RETURNS_FP = 1 << (31 - 29), ++ FLAG_RETURNS_64BITS = 1 << (31 - 28), ++ FLAG_RETURNS_128BITS = 1 << (31 - 31), ++ ++ FLAG_RETURNS_STRUCT = 1 << (31 - 27), // cr6 ++ FLAG_STRUCT_CONTAINS_FP = 1 << (31 - 26), ++ ++ FLAG_ARG_NEEDS_COPY = 1 << (31 - 7), ++ FLAG_FP_ARGUMENTS = 1 << (31 - 6), // cr1.eq; specified by ABI ++ FLAG_4_GPR_ARGUMENTS = 1 << (31 - 5), ++ FLAG_RETVAL_REFERENCE = 1 << (31 - 4) ++}; ++ ++#if defined(__ppc64__) ++void ffi64_struct_to_ram_form(const ffi_type*, const char*, unsigned int*, ++ const char*, unsigned int*, unsigned int*, char*, unsigned int*); ++void ffi64_struct_to_reg_form(const ffi_type*, const char*, unsigned int*, ++ unsigned int*, char*, unsigned int*, char*, unsigned int*); ++bool ffi64_stret_needs_ptr(const ffi_type* inType, ++ unsigned short*, unsigned short*); ++#endif ++ ++#endif // !defined(LIBFFI_ASM) +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S +new file mode 100644 +index 0000000..c3d30c2 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S +@@ -0,0 +1,308 @@ ++#if defined(__ppc__) ++ ++/* ----------------------------------------------------------------------- ++ ppc-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, ++ Inc. based on ppc_closure.S ++ ++ PowerPC Assembly glue. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++ ++#include ++#include // for FFI_TRAMPOLINE_SIZE ++#include ++#include ++ ++ .file "ppc-darwin_closure.S" ++.text ++ .align LOG2_GPR_BYTES ++ .globl _ffi_closure_ASM ++ ++.text ++ .align LOG2_GPR_BYTES ++ ++_ffi_closure_ASM: ++LFB1: ++ mflr r0 // Save return address ++ stg r0,SF_RETURN(r1) ++ ++LCFI0: ++ /* 24/48 bytes (Linkage Area) ++ 32/64 bytes (outgoing parameter area, always reserved) ++ 104 bytes (13*8 from FPR) ++ 16/32 bytes (result) ++ 176/232 total bytes */ ++ ++ /* skip over caller save area and keep stack aligned to 16/32. */ ++ stgu r1,-SF_ROUND(176)(r1) ++ ++LCFI1: ++ /* We want to build up an area for the parameters passed ++ in registers. (both floating point and integer) */ ++ ++ /* 176/256 bytes (callee stack frame aligned to 16/32) ++ 24/48 bytes (caller linkage area) ++ 200/304 (start of caller parameter area aligned to 4/8) ++ */ ++ ++ /* Save GPRs 3 - 10 (aligned to 4/8) ++ in the parents outgoing area. */ ++ stg r3,200(r1) ++ stg r4,204(r1) ++ stg r5,208(r1) ++ stg r6,212(r1) ++ stg r7,216(r1) ++ stg r8,220(r1) ++ stg r9,224(r1) ++ stg r10,228(r1) ++ ++ /* Save FPRs 1 - 13. (aligned to 8) */ ++ stfd f1,56(r1) ++ stfd f2,64(r1) ++ stfd f3,72(r1) ++ stfd f4,80(r1) ++ stfd f5,88(r1) ++ stfd f6,96(r1) ++ stfd f7,104(r1) ++ stfd f8,112(r1) ++ stfd f9,120(r1) ++ stfd f10,128(r1) ++ stfd f11,136(r1) ++ stfd f12,144(r1) ++ stfd f13,152(r1) ++ ++ // Set up registers for the routine that actually does the work. ++ mr r3,r11 // context pointer from the trampoline ++ addi r4,r1,160 // result storage ++ addi r5,r1,200 // saved GPRs ++ addi r6,r1,56 // saved FPRs ++ bl Lffi_closure_helper_DARWIN$stub ++ ++ /* Now r3 contains the return type. Use it to look up in a table ++ so we know how to deal with each type. */ ++ addi r5,r1,160 // Copy result storage pointer. ++ bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. ++ mflr r4 // Move to r4. ++ slwi r3,r3,4 // Multiply return type by 16. ++ add r3,r3,r4 // Add contents of table to table address. ++ mtctr r3 ++ bctr ++ ++LFE1: ++/* Each of the ret_typeX code fragments has to be exactly 16 bytes long ++ (4 instructions). For cache effectiveness we align to a 16 byte boundary ++ first. */ ++ .align 4 ++ nop ++ nop ++ nop ++ ++Lget_ret_type0_addr: ++ blrl ++ ++/* case FFI_TYPE_VOID */ ++Lret_type0: ++ b Lfinish ++ nop ++ nop ++ nop ++ ++/* case FFI_TYPE_INT */ ++Lret_type1: ++ lwz r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_FLOAT */ ++Lret_type2: ++ lfs f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_DOUBLE */ ++Lret_type3: ++ lfd f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_LONGDOUBLE */ ++Lret_type4: ++ lfd f1,0(r5) ++ lfd f2,8(r5) ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_UINT8 */ ++Lret_type5: ++ lbz r3,3(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_SINT8 */ ++Lret_type6: ++ lbz r3,3(r5) ++ extsb r3,r3 ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_UINT16 */ ++Lret_type7: ++ lhz r3,2(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_SINT16 */ ++Lret_type8: ++ lha r3,2(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_UINT32 */ ++Lret_type9: // same as Lret_type1 ++ lwz r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_SINT32 */ ++Lret_type10: // same as Lret_type1 ++ lwz r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_UINT64 */ ++Lret_type11: ++ lwz r3,0(r5) ++ lwz r4,4(r5) ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_SINT64 */ ++Lret_type12: // same as Lret_type11 ++ lwz r3,0(r5) ++ lwz r4,4(r5) ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_STRUCT */ ++Lret_type13: ++ b Lfinish ++ nop ++ nop ++ nop ++ ++/* End 16-byte aligned cases */ ++/* case FFI_TYPE_POINTER */ ++// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types ++// are added in future, the following code will need to be updated and ++// padded to 16 bytes. ++Lret_type14: ++ lg r3,0(r5) ++ // fall through ++ ++/* case done */ ++Lfinish: ++ addi r1,r1,SF_ROUND(176) // Restore stack pointer. ++ lg r0,SF_RETURN(r1) // Restore return address. ++ mtlr r0 // Restore link register. ++ blr ++ ++/* END(ffi_closure_ASM) */ ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ; Length of Common Information Entry ++LSCIE1: ++ .long 0x0 ; CIE Identifier Tag ++ .byte 0x1 ; CIE Version ++ .ascii "zR\0" ; CIE Augmentation ++ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor ++ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte 0x41 ; CIE RA Column ++ .byte 0x1 ; uleb128 0x1; Augmentation size ++ .byte 0x10 ; FDE Encoding (pcrel) ++ .byte 0xc ; DW_CFA_def_cfa ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x0 ; uleb128 0x0 ++ .align LOG2_GPR_BYTES ++LECIE1: ++.globl _ffi_closure_ASM.eh ++_ffi_closure_ASM.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ; FDE Length ++ ++LASFDE1: ++ .long LASFDE1-EH_frame1 ; FDE CIE offset ++ .g_long LFB1-. ; FDE initial location ++ .set L$set$3,LFE1-LFB1 ++ .g_long L$set$3 ; FDE address range ++ .byte 0x0 ; uleb128 0x0; Augmentation size ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$3,LCFI1-LCFI0 ++ .long L$set$3 ++ .byte 0xe ; DW_CFA_def_cfa_offset ++ .byte 176,1 ; uleb128 176 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$4,LCFI0-LFB1 ++ .long L$set$4 ++ .byte 0x11 ; DW_CFA_offset_extended_sf ++ .byte 0x41 ; uleb128 0x41 ++ .byte 0x7e ; sleb128 -2 ++ .align LOG2_GPR_BYTES ++ ++LEFDE1: ++.data ++ .align LOG2_GPR_BYTES ++LDFCM0: ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi_closure_helper_DARWIN$stub: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ mflr r0 ++ bcl 20,31,LO$ffi_closure_helper_DARWIN ++ ++LO$ffi_closure_helper_DARWIN: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) ++ mtlr r0 ++ lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi_closure_helper_DARWIN$lazy_ptr: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ .g_long dyld_stub_binding_helper ++ ++ ++#endif // __ppc__ +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c +new file mode 100644 +index 0000000..8953d5f +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c +@@ -0,0 +1,1776 @@ ++#if defined(__ppc__) || defined(__ppc64__) ++ ++/* ----------------------------------------------------------------------- ++ ffi.c - Copyright (c) 1998 Geoffrey Keating ++ ++ PowerPC Foreign Function Interface ++ ++ Darwin ABI support (c) 2001 John Hornkvist ++ AIX ABI support (c) 2002 Free Software Foundation, Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#if 0 ++#if defined(POWERPC_DARWIN) ++#include // for sys_icache_invalidate() ++#endif ++ ++#else ++ ++#pragma weak sys_icache_invalidate ++extern void sys_icache_invalidate(void *start, size_t len); ++ ++#endif ++ ++ ++extern void ffi_closure_ASM(void); ++ ++// The layout of a function descriptor. A C function pointer really ++// points to one of these. ++typedef struct aix_fd_struct { ++ void* code_pointer; ++ void* toc; ++} aix_fd; ++ ++/* ffi_prep_args is called by the assembly routine once stack space ++ has been allocated for the function's arguments. ++ ++ The stack layout we want looks like this: ++ ++ | Return address from ffi_call_DARWIN | higher addresses ++ |--------------------------------------------| ++ | Previous backchain pointer 4/8 | stack pointer here ++ |--------------------------------------------|-\ <<< on entry to ++ | Saved r28-r31 (4/8)*4 | | ffi_call_DARWIN ++ |--------------------------------------------| | ++ | Parameters (at least 8*(4/8)=32/64) | | (176) +112 - +288 ++ |--------------------------------------------| | ++ | Space for GPR2 4/8 | | ++ |--------------------------------------------| | stack | ++ | Reserved (4/8)*2 | | grows | ++ |--------------------------------------------| | down V ++ | Space for callee's LR 4/8 | | ++ |--------------------------------------------| | lower addresses ++ | Saved CR 4/8 | | ++ |--------------------------------------------| | stack pointer here ++ | Current backchain pointer 4/8 | | during ++ |--------------------------------------------|-/ <<< ffi_call_DARWIN ++ ++ Note: ppc64 CR is saved in the low word of a long on the stack. ++*/ ++ ++/*@-exportheader@*/ ++void ++ffi_prep_args( ++ extended_cif* inEcif, ++ unsigned *const stack) ++/*@=exportheader@*/ ++{ ++ /* Copy the ecif to a local var so we can trample the arg. ++ BC note: test this with GP later for possible problems... */ ++ volatile extended_cif* ecif = inEcif; ++ ++ const unsigned bytes = ecif->cif->bytes; ++ const unsigned flags = ecif->cif->flags; ++ ++ /* Cast the stack arg from int* to long*. sizeof(long) == 4 in 32-bit mode ++ and 8 in 64-bit mode. */ ++ unsigned long *const longStack = (unsigned long *const)stack; ++ ++ /* 'stacktop' points at the previous backchain pointer. */ ++#if defined(__ppc64__) ++ // In ppc-darwin.s, an extra 96 bytes is reserved for the linkage area, ++ // saved registers, and an extra FPR. ++ unsigned long *const stacktop = ++ (unsigned long *)(unsigned long)((char*)longStack + bytes + 96); ++#elif defined(__ppc__) ++ unsigned long *const stacktop = longStack + (bytes / sizeof(long)); ++#else ++#error undefined architecture ++#endif ++ ++ /* 'fpr_base' points at the space for fpr1, and grows upwards as ++ we use FPR registers. */ ++ double* fpr_base = (double*)(stacktop - ASM_NEEDS_REGISTERS) - ++ NUM_FPR_ARG_REGISTERS; ++ ++#if defined(__ppc64__) ++ // 64-bit saves an extra register, and uses an extra FPR. Knock fpr_base ++ // down a couple pegs. ++ fpr_base -= 2; ++#endif ++ ++ unsigned int fparg_count = 0; ++ ++ /* 'next_arg' grows up as we put parameters in it. */ ++ unsigned long* next_arg = longStack + 6; /* 6 reserved positions. */ ++ ++ int i; ++ double double_tmp; ++ void** p_argv = ecif->avalue; ++ unsigned long gprvalue; ++ ffi_type** ptr = ecif->cif->arg_types; ++ ++ /* Check that everything starts aligned properly. */ ++ FFI_ASSERT(stack == SF_ROUND(stack)); ++ FFI_ASSERT(stacktop == SF_ROUND(stacktop)); ++ FFI_ASSERT(bytes == SF_ROUND(bytes)); ++ ++ /* Deal with return values that are actually pass-by-reference. ++ Rule: ++ Return values are referenced by r3, so r4 is the first parameter. */ ++ ++ if (flags & FLAG_RETVAL_REFERENCE) ++ *next_arg++ = (unsigned long)(char*)ecif->rvalue; ++ ++ /* Now for the arguments. */ ++ for (i = ecif->cif->nargs; i > 0; i--, ptr++, p_argv++) ++ { ++ switch ((*ptr)->type) ++ { ++ /* If a floating-point parameter appears before all of the general- ++ purpose registers are filled, the corresponding GPRs that match ++ the size of the floating-point parameter are shadowed for the ++ benefit of vararg and pre-ANSI functions. */ ++ case FFI_TYPE_FLOAT: ++ double_tmp = *(float*)*p_argv; ++ ++ if (fparg_count < NUM_FPR_ARG_REGISTERS) ++ *fpr_base++ = double_tmp; ++ ++ *(double*)next_arg = double_tmp; ++ ++ next_arg++; ++ fparg_count++; ++ FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); ++ ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ double_tmp = *(double*)*p_argv; ++ ++ if (fparg_count < NUM_FPR_ARG_REGISTERS) ++ *fpr_base++ = double_tmp; ++ ++ *(double*)next_arg = double_tmp; ++ ++ next_arg += MODE_CHOICE(2,1); ++ fparg_count++; ++ FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); ++ ++ break; ++ ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++#if defined(__ppc64__) ++ if (fparg_count < NUM_FPR_ARG_REGISTERS) ++ *(long double*)fpr_base = *(long double*)*p_argv; ++#elif defined(__ppc__) ++ if (fparg_count < NUM_FPR_ARG_REGISTERS - 1) ++ *(long double*)fpr_base = *(long double*)*p_argv; ++ else if (fparg_count == NUM_FPR_ARG_REGISTERS - 1) ++ *(double*)fpr_base = *(double*)*p_argv; ++#else ++#error undefined architecture ++#endif ++ ++ *(long double*)next_arg = *(long double*)*p_argv; ++ fparg_count += 2; ++ fpr_base += 2; ++ next_arg += MODE_CHOICE(4,2); ++ FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); ++ ++ break; ++#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++#if defined(__ppc64__) ++ gprvalue = *(long long*)*p_argv; ++ goto putgpr; ++#elif defined(__ppc__) ++ *(long long*)next_arg = *(long long*)*p_argv; ++ next_arg += 2; ++ break; ++#else ++#error undefined architecture ++#endif ++ ++ case FFI_TYPE_POINTER: ++ gprvalue = *(unsigned long*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_UINT8: ++ gprvalue = *(unsigned char*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_SINT8: ++ gprvalue = *(signed char*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_UINT16: ++ gprvalue = *(unsigned short*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_SINT16: ++ gprvalue = *(signed short*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_STRUCT: ++ { ++#if defined(__ppc64__) ++ unsigned int gprSize = 0; ++ unsigned int fprSize = 0; ++ ++ ffi64_struct_to_reg_form(*ptr, (char*)*p_argv, NULL, &fparg_count, ++ (char*)next_arg, &gprSize, (char*)fpr_base, &fprSize); ++ next_arg += gprSize / sizeof(long); ++ fpr_base += fprSize / sizeof(double); ++ ++#elif defined(__ppc__) ++ char* dest_cpy = (char*)next_arg; ++ ++ /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, ++ SI 4 bytes) are aligned as if they were those modes. ++ Structures with 3 byte in size are padded upwards. */ ++ unsigned size_al = (*ptr)->size; ++ ++ /* If the first member of the struct is a double, then align ++ the struct to double-word. */ ++ if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) ++ size_al = ALIGN((*ptr)->size, 8); ++ ++ if (ecif->cif->abi == FFI_DARWIN) ++ { ++ if (size_al < 3) ++ dest_cpy += 4 - size_al; ++ } ++ ++ memcpy((char*)dest_cpy, (char*)*p_argv, size_al); ++ next_arg += (size_al + 3) / 4; ++#else ++#error undefined architecture ++#endif ++ break; ++ } ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ gprvalue = *(unsigned*)*p_argv; ++ ++putgpr: ++ *next_arg++ = gprvalue; ++ break; ++ ++ default: ++ break; ++ } ++ } ++ ++ /* Check that we didn't overrun the stack... */ ++ //FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS); ++ //FFI_ASSERT((unsigned *)fpr_base ++ // <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); ++ //FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); ++} ++ ++#if defined(__ppc64__) ++ ++bool ++ffi64_struct_contains_fp( ++ const ffi_type* inType) ++{ ++ bool containsFP = false; ++ unsigned int i; ++ ++ for (i = 0; inType->elements[i] != NULL && !containsFP; i++) ++ { ++ if (inType->elements[i]->type == FFI_TYPE_FLOAT || ++ inType->elements[i]->type == FFI_TYPE_DOUBLE || ++ inType->elements[i]->type == FFI_TYPE_LONGDOUBLE) ++ containsFP = true; ++ else if (inType->elements[i]->type == FFI_TYPE_STRUCT) ++ containsFP = ffi64_struct_contains_fp(inType->elements[i]); ++ } ++ ++ return containsFP; ++} ++ ++#endif // defined(__ppc64__) ++ ++/* Perform machine dependent cif processing. */ ++ffi_status ++ffi_prep_cif_machdep( ++ ffi_cif* cif) ++{ ++ /* All this is for the DARWIN ABI. */ ++ int i; ++ ffi_type** ptr; ++ int intarg_count = 0; ++ int fparg_count = 0; ++ unsigned int flags = 0; ++ unsigned int size_al = 0; ++ ++ /* All the machine-independent calculation of cif->bytes will be wrong. ++ Redo the calculation for DARWIN. */ ++ ++ /* Space for the frame pointer, callee's LR, CR, etc, and for ++ the asm's temp regs. */ ++ unsigned int bytes = (6 + ASM_NEEDS_REGISTERS) * sizeof(long); ++ ++ /* Return value handling. The rules are as follows: ++ - 32-bit (or less) integer values are returned in gpr3; ++ - Structures of size <= 4 bytes also returned in gpr3; ++ - 64-bit integer values and structures between 5 and 8 bytes are ++ returned in gpr3 and gpr4; ++ - Single/double FP values are returned in fpr1; ++ - Long double FP (if not equivalent to double) values are returned in ++ fpr1 and fpr2; ++ - Larger structures values are allocated space and a pointer is passed ++ as the first argument. */ ++ switch (cif->rtype->type) ++ { ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ flags |= FLAG_RETURNS_128BITS; ++ flags |= FLAG_RETURNS_FP; ++ break; ++#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_DOUBLE: ++ flags |= FLAG_RETURNS_64BITS; ++ /* Fall through. */ ++ case FFI_TYPE_FLOAT: ++ flags |= FLAG_RETURNS_FP; ++ break; ++ ++#if defined(__ppc64__) ++ case FFI_TYPE_POINTER: ++#endif ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ flags |= FLAG_RETURNS_64BITS; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ { ++#if defined(__ppc64__) ++ ++ if (ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) ++ { ++ flags |= FLAG_RETVAL_REFERENCE; ++ flags |= FLAG_RETURNS_NOTHING; ++ intarg_count++; ++ } ++ else ++ { ++ flags |= FLAG_RETURNS_STRUCT; ++ ++ if (ffi64_struct_contains_fp(cif->rtype)) ++ flags |= FLAG_STRUCT_CONTAINS_FP; ++ } ++ ++#elif defined(__ppc__) ++ ++ flags |= FLAG_RETVAL_REFERENCE; ++ flags |= FLAG_RETURNS_NOTHING; ++ intarg_count++; ++ ++#else ++#error undefined architecture ++#endif ++ break; ++ } ++ ++ case FFI_TYPE_VOID: ++ flags |= FLAG_RETURNS_NOTHING; ++ break; ++ ++ default: ++ /* Returns 32-bit integer, or similar. Nothing to do here. */ ++ break; ++ } ++ ++ /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the ++ first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest ++ goes on the stack. Structures are passed as a pointer to a copy of ++ the structure. Stuff on the stack needs to keep proper alignment. */ ++ for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) ++ { ++ switch ((*ptr)->type) ++ { ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ fparg_count++; ++ /* If this FP arg is going on the stack, it must be ++ 8-byte-aligned. */ ++ if (fparg_count > NUM_FPR_ARG_REGISTERS ++ && intarg_count % 2 != 0) ++ intarg_count++; ++ break; ++ ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ fparg_count += 2; ++ /* If this FP arg is going on the stack, it must be ++ 8-byte-aligned. */ ++ ++ if ( ++#if defined(__ppc64__) ++ fparg_count > NUM_FPR_ARG_REGISTERS + 1 ++#elif defined(__ppc__) ++ fparg_count > NUM_FPR_ARG_REGISTERS ++#else ++#error undefined architecture ++#endif ++ && intarg_count % 2 != 0) ++ intarg_count++; ++ ++ intarg_count += 2; ++ break; ++#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ /* 'long long' arguments are passed as two words, but ++ either both words must fit in registers or both go ++ on the stack. If they go on the stack, they must ++ be 8-byte-aligned. */ ++ if (intarg_count == NUM_GPR_ARG_REGISTERS - 1 ++ || (intarg_count >= NUM_GPR_ARG_REGISTERS ++ && intarg_count % 2 != 0)) ++ intarg_count++; ++ ++ intarg_count += MODE_CHOICE(2,1); ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ size_al = (*ptr)->size; ++ /* If the first member of the struct is a double, then align ++ the struct to double-word. */ ++ if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) ++ size_al = ALIGN((*ptr)->size, 8); ++ ++#if defined(__ppc64__) ++ // Look for FP struct members. ++ unsigned int j; ++ ++ for (j = 0; (*ptr)->elements[j] != NULL; j++) ++ { ++ if ((*ptr)->elements[j]->type == FFI_TYPE_FLOAT || ++ (*ptr)->elements[j]->type == FFI_TYPE_DOUBLE) ++ { ++ fparg_count++; ++ ++ if (fparg_count > NUM_FPR_ARG_REGISTERS) ++ intarg_count++; ++ } ++ else if ((*ptr)->elements[j]->type == FFI_TYPE_LONGDOUBLE) ++ { ++ fparg_count += 2; ++ ++ if (fparg_count > NUM_FPR_ARG_REGISTERS + 1) ++ intarg_count += 2; ++ } ++ else ++ intarg_count++; ++ } ++#elif defined(__ppc__) ++ intarg_count += (size_al + 3) / 4; ++#else ++#error undefined architecture ++#endif ++ ++ break; ++ ++ default: ++ /* Everything else is passed as a 4/8-byte word in a GPR, either ++ the object itself or a pointer to it. */ ++ intarg_count++; ++ break; ++ } ++ } ++ ++ /* Space for the FPR registers, if needed. */ ++ if (fparg_count != 0) ++ { ++ flags |= FLAG_FP_ARGUMENTS; ++#if defined(__ppc64__) ++ bytes += (NUM_FPR_ARG_REGISTERS + 1) * sizeof(double); ++#elif defined(__ppc__) ++ bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); ++#else ++#error undefined architecture ++#endif ++ } ++ ++ /* Stack space. */ ++#if defined(__ppc64__) ++ if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS) ++ bytes += (intarg_count + fparg_count) * sizeof(long); ++#elif defined(__ppc__) ++ if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS) ++ bytes += (intarg_count + 2 * fparg_count) * sizeof(long); ++#else ++#error undefined architecture ++#endif ++ else ++ bytes += NUM_GPR_ARG_REGISTERS * sizeof(long); ++ ++ /* The stack space allocated needs to be a multiple of 16/32 bytes. */ ++ bytes = SF_ROUND(bytes); ++ ++ cif->flags = flags; ++ cif->bytes = bytes; ++ ++ return FFI_OK; ++} ++ ++/*@-declundef@*/ ++/*@-exportheader@*/ ++extern void ++ffi_call_AIX( ++/*@out@*/ extended_cif*, ++ unsigned, ++ unsigned, ++/*@out@*/ unsigned*, ++ void (*fn)(void), ++ void (*fn2)(extended_cif*, unsigned *const)); ++ ++extern void ++ffi_call_DARWIN( ++/*@out@*/ extended_cif*, ++ unsigned long, ++ unsigned, ++/*@out@*/ unsigned*, ++ void (*fn)(void), ++ void (*fn2)(extended_cif*, unsigned *const)); ++/*@=declundef@*/ ++/*@=exportheader@*/ ++ ++void ++ffi_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ void** avalue) ++{ ++ extended_cif ecif; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return ++ value address then we need to make one. */ ++ if ((rvalue == NULL) && ++ (cif->rtype->type == FFI_TYPE_STRUCT)) ++ { ++ /*@-sysunrecog@*/ ++ ecif.rvalue = alloca(cif->rtype->size); ++ /*@=sysunrecog@*/ ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ switch (cif->abi) ++ { ++ case FFI_AIX: ++ /*@-usedef@*/ ++ ffi_call_AIX(&ecif, -cif->bytes, ++ cif->flags, ecif.rvalue, fn, ffi_prep_args); ++ /*@=usedef@*/ ++ break; ++ ++ case FFI_DARWIN: ++ /*@-usedef@*/ ++ ffi_call_DARWIN(&ecif, -(long)cif->bytes, ++ cif->flags, ecif.rvalue, fn, ffi_prep_args); ++ /*@=usedef@*/ ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++/* here I'd like to add the stack frame layout we use in darwin_closure.S ++ and aix_clsoure.S ++ ++ SP previous -> +---------------------------------------+ <--- child frame ++ | back chain to caller 4 | ++ +---------------------------------------+ 4 ++ | saved CR 4 | ++ +---------------------------------------+ 8 ++ | saved LR 4 | ++ +---------------------------------------+ 12 ++ | reserved for compilers 4 | ++ +---------------------------------------+ 16 ++ | reserved for binders 4 | ++ +---------------------------------------+ 20 ++ | saved TOC pointer 4 | ++ +---------------------------------------+ 24 ++ | always reserved 8*4=32 (previous GPRs)| ++ | according to the linkage convention | ++ | from AIX | ++ +---------------------------------------+ 56 ++ | our FPR area 13*8=104 | ++ | f1 | ++ | . | ++ | f13 | ++ +---------------------------------------+ 160 ++ | result area 8 | ++ +---------------------------------------+ 168 ++ | alignement to the next multiple of 16 | ++SP current --> +---------------------------------------+ 176 <- parent frame ++ | back chain to caller 4 | ++ +---------------------------------------+ 180 ++ | saved CR 4 | ++ +---------------------------------------+ 184 ++ | saved LR 4 | ++ +---------------------------------------+ 188 ++ | reserved for compilers 4 | ++ +---------------------------------------+ 192 ++ | reserved for binders 4 | ++ +---------------------------------------+ 196 ++ | saved TOC pointer 4 | ++ +---------------------------------------+ 200 ++ | always reserved 8*4=32 we store our | ++ | GPRs here | ++ | r3 | ++ | . | ++ | r10 | ++ +---------------------------------------+ 232 ++ | overflow part | ++ +---------------------------------------+ xxx ++ | ???? | ++ +---------------------------------------+ xxx ++*/ ++ ++#if !defined(POWERPC_DARWIN) ++ ++#define MIN_LINE_SIZE 32 ++ ++static void ++flush_icache( ++ char* addr) ++{ ++#ifndef _AIX ++ __asm__ volatile ( ++ "dcbf 0,%0\n" ++ "sync\n" ++ "icbi 0,%0\n" ++ "sync\n" ++ "isync" ++ : : "r" (addr) : "memory"); ++#endif ++} ++ ++static void ++flush_range( ++ char* addr, ++ int size) ++{ ++ int i; ++ ++ for (i = 0; i < size; i += MIN_LINE_SIZE) ++ flush_icache(addr + i); ++ ++ flush_icache(addr + size - 1); ++} ++ ++#endif // !defined(POWERPC_DARWIN) ++ ++ffi_status ++ffi_prep_closure( ++ ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*, void*, void**, void*), ++ void* user_data) ++{ ++ switch (cif->abi) ++ { ++ case FFI_DARWIN: ++ { ++ FFI_ASSERT (cif->abi == FFI_DARWIN); ++ ++ unsigned int* tramp = (unsigned int*)&closure->tramp[0]; ++ ++#if defined(__ppc64__) ++ tramp[0] = 0x7c0802a6; // mflr r0 ++ tramp[1] = 0x429f0005; // bcl 20,31,+0x8 ++ tramp[2] = 0x7d6802a6; // mflr r11 ++ tramp[3] = 0x7c0803a6; // mtlr r0 ++ tramp[4] = 0xe98b0018; // ld r12,24(r11) ++ tramp[5] = 0x7d8903a6; // mtctr r12 ++ tramp[6] = 0xe96b0020; // ld r11,32(r11) ++ tramp[7] = 0x4e800420; // bctr ++ *(unsigned long*)&tramp[8] = (unsigned long)ffi_closure_ASM; ++ *(unsigned long*)&tramp[10] = (unsigned long)closure; ++#elif defined(__ppc__) ++ tramp[0] = 0x7c0802a6; // mflr r0 ++ tramp[1] = 0x429f0005; // bcl 20,31,+0x8 ++ tramp[2] = 0x7d6802a6; // mflr r11 ++ tramp[3] = 0x7c0803a6; // mtlr r0 ++ tramp[4] = 0x818b0018; // lwz r12,24(r11) ++ tramp[5] = 0x7d8903a6; // mtctr r12 ++ tramp[6] = 0x816b001c; // lwz r11,28(r11) ++ tramp[7] = 0x4e800420; // bctr ++ tramp[8] = (unsigned long)ffi_closure_ASM; ++ tramp[9] = (unsigned long)closure; ++#else ++#error undefined architecture ++#endif ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ ++ // Flush the icache. Only necessary on Darwin. ++#if defined(POWERPC_DARWIN) ++ sys_icache_invalidate(closure->tramp, FFI_TRAMPOLINE_SIZE); ++#else ++ flush_range(closure->tramp, FFI_TRAMPOLINE_SIZE); ++#endif ++ ++ break; ++ } ++ ++ case FFI_AIX: ++ { ++ FFI_ASSERT (cif->abi == FFI_AIX); ++ ++ ffi_aix_trampoline_struct* tramp_aix = ++ (ffi_aix_trampoline_struct*)(closure->tramp); ++ aix_fd* fd = (aix_fd*)(void*)ffi_closure_ASM; ++ ++ tramp_aix->code_pointer = fd->code_pointer; ++ tramp_aix->toc = fd->toc; ++ tramp_aix->static_chain = closure; ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ break; ++ } ++ ++ default: ++ return FFI_BAD_ABI; ++ } ++ ++ return FFI_OK; ++} ++ ++#if defined(__ppc__) ++ typedef double ldbits[2]; ++ ++ typedef union ++ { ++ ldbits lb; ++ long double ld; ++ } ldu; ++#endif ++ ++typedef union ++{ ++ float f; ++ double d; ++} ffi_dblfl; ++ ++/* The trampoline invokes ffi_closure_ASM, and on entry, r11 holds the ++ address of the closure. After storing the registers that could possibly ++ contain parameters to be passed into the stack frame and setting up space ++ for a return value, ffi_closure_ASM invokes the following helper function ++ to do most of the work. */ ++int ++ffi_closure_helper_DARWIN( ++ ffi_closure* closure, ++ void* rvalue, ++ unsigned long* pgr, ++ ffi_dblfl* pfr) ++{ ++ /* rvalue is the pointer to space for return value in closure assembly ++ pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM ++ pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM. */ ++ ++#if defined(__ppc__) ++ ldu temp_ld; ++#endif ++ ++ double temp; ++ unsigned int i; ++ unsigned int nf = 0; /* number of FPRs already used. */ ++ unsigned int ng = 0; /* number of GPRs already used. */ ++ ffi_cif* cif = closure->cif; ++ long avn = cif->nargs; ++ void** avalue = alloca(cif->nargs * sizeof(void*)); ++ ffi_type** arg_types = cif->arg_types; ++ ++ /* Copy the caller's structure return value address so that the closure ++ returns the data directly to the caller. */ ++#if defined(__ppc64__) ++ if (cif->rtype->type == FFI_TYPE_STRUCT && ++ ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) ++#elif defined(__ppc__) ++ if (cif->rtype->type == FFI_TYPE_STRUCT) ++#else ++#error undefined architecture ++#endif ++ { ++ rvalue = (void*)*pgr; ++ pgr++; ++ ng++; ++ } ++ ++ /* Grab the addresses of the arguments from the stack frame. */ ++ for (i = 0; i < avn; i++) ++ { ++ switch (arg_types[i]->type) ++ { ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT8: ++ avalue[i] = (char*)pgr + MODE_CHOICE(3,7); ++ ng++; ++ pgr++; ++ break; ++ ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT16: ++ avalue[i] = (char*)pgr + MODE_CHOICE(2,6); ++ ng++; ++ pgr++; ++ break; ++ ++#if defined(__ppc__) ++ case FFI_TYPE_POINTER: ++#endif ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT32: ++ avalue[i] = (char*)pgr + MODE_CHOICE(0,4); ++ ng++; ++ pgr++; ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ if (cif->abi == FFI_DARWIN) ++ { ++#if defined(__ppc64__) ++ unsigned int gprSize = 0; ++ unsigned int fprSize = 0; ++ unsigned int savedFPRSize = fprSize; ++ ++ avalue[i] = alloca(arg_types[i]->size); ++ ffi64_struct_to_ram_form(arg_types[i], (const char*)pgr, ++ &gprSize, (const char*)pfr, &fprSize, &nf, avalue[i], NULL); ++ ++ ng += gprSize / sizeof(long); ++ pgr += gprSize / sizeof(long); ++ pfr += (fprSize - savedFPRSize) / sizeof(double); ++ ++#elif defined(__ppc__) ++ /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, ++ SI 4 bytes) are aligned as if they were those modes. */ ++ unsigned int size_al = size_al = arg_types[i]->size; ++ ++ /* If the first member of the struct is a double, then align ++ the struct to double-word. */ ++ if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE) ++ size_al = ALIGN(arg_types[i]->size, 8); ++ ++ if (size_al < 3) ++ avalue[i] = (void*)pgr + MODE_CHOICE(4,8) - size_al; ++ else ++ avalue[i] = (void*)pgr; ++ ++ ng += (size_al + 3) / sizeof(long); ++ pgr += (size_al + 3) / sizeof(long); ++#else ++#error undefined architecture ++#endif ++ } ++ ++ break; ++ ++#if defined(__ppc64__) ++ case FFI_TYPE_POINTER: ++#endif ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_UINT64: ++ /* Long long ints are passed in 1 or 2 GPRs. */ ++ avalue[i] = pgr; ++ ng += MODE_CHOICE(2,1); ++ pgr += MODE_CHOICE(2,1); ++ ++ break; ++ ++ case FFI_TYPE_FLOAT: ++ /* A float value consumes a GPR. ++ There are 13 64-bit floating point registers. */ ++ if (nf < NUM_FPR_ARG_REGISTERS) ++ { ++ temp = pfr->d; ++ pfr->f = (float)temp; ++ avalue[i] = pfr; ++ pfr++; ++ } ++ else ++ avalue[i] = pgr; ++ ++ nf++; ++ ng++; ++ pgr++; ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ /* A double value consumes one or two GPRs. ++ There are 13 64bit floating point registers. */ ++ if (nf < NUM_FPR_ARG_REGISTERS) ++ { ++ avalue[i] = pfr; ++ pfr++; ++ } ++ else ++ avalue[i] = pgr; ++ ++ nf++; ++ ng += MODE_CHOICE(2,1); ++ pgr += MODE_CHOICE(2,1); ++ ++ break; ++ ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_LONGDOUBLE: ++#if defined(__ppc64__) ++ if (nf < NUM_FPR_ARG_REGISTERS) ++ { ++ avalue[i] = pfr; ++ pfr += 2; ++ } ++#elif defined(__ppc__) ++ /* A long double value consumes 2/4 GPRs and 2 FPRs. ++ There are 13 64bit floating point registers. */ ++ if (nf < NUM_FPR_ARG_REGISTERS - 1) ++ { ++ avalue[i] = pfr; ++ pfr += 2; ++ } ++ /* Here we have the situation where one part of the long double ++ is stored in fpr13 and the other part is already on the stack. ++ We use a union to pass the long double to avalue[i]. */ ++ else if (nf == NUM_FPR_ARG_REGISTERS - 1) ++ { ++ memcpy (&temp_ld.lb[0], pfr, sizeof(temp_ld.lb[0])); ++ memcpy (&temp_ld.lb[1], pgr + 2, sizeof(temp_ld.lb[1])); ++ avalue[i] = &temp_ld.ld; ++ } ++#else ++#error undefined architecture ++#endif ++ else ++ avalue[i] = pgr; ++ ++ nf += 2; ++ ng += MODE_CHOICE(4,2); ++ pgr += MODE_CHOICE(4,2); ++ ++ break; ++ ++#endif /* FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE */ ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ } ++ ++ (closure->fun)(cif, rvalue, avalue, closure->user_data); ++ ++ /* Tell ffi_closure_ASM to perform return type promotions. */ ++ return cif->rtype->type; ++} ++ ++#if defined(__ppc64__) ++ ++/* ffi64_struct_to_ram_form ++ ++ Rebuild a struct's natural layout from buffers of concatenated registers. ++ Return the number of registers used. ++ inGPRs[0-7] == r3, inFPRs[0-7] == f1 ... ++*/ ++void ++ffi64_struct_to_ram_form( ++ const ffi_type* inType, ++ const char* inGPRs, ++ unsigned int* ioGPRMarker, ++ const char* inFPRs, ++ unsigned int* ioFPRMarker, ++ unsigned int* ioFPRsUsed, ++ char* outStruct, // caller-allocated ++ unsigned int* ioStructMarker) ++{ ++ unsigned int srcGMarker = 0; ++ unsigned int srcFMarker = 0; ++ unsigned int savedFMarker = 0; ++ unsigned int fprsUsed = 0; ++ unsigned int savedFPRsUsed = 0; ++ unsigned int destMarker = 0; ++ ++ static unsigned int recurseCount = 0; ++ ++ if (ioGPRMarker) ++ srcGMarker = *ioGPRMarker; ++ ++ if (ioFPRMarker) ++ { ++ srcFMarker = *ioFPRMarker; ++ savedFMarker = srcFMarker; ++ } ++ ++ if (ioFPRsUsed) ++ { ++ fprsUsed = *ioFPRsUsed; ++ savedFPRsUsed = fprsUsed; ++ } ++ ++ if (ioStructMarker) ++ destMarker = *ioStructMarker; ++ ++ size_t i; ++ ++ switch (inType->size) ++ { ++ case 1: case 2: case 4: ++ srcGMarker += 8 - inType->size; ++ break; ++ ++ default: ++ break; ++ } ++ ++ for (i = 0; inType->elements[i] != NULL; i++) ++ { ++ switch (inType->elements[i]->type) ++ { ++ case FFI_TYPE_FLOAT: ++ srcFMarker = ALIGN(srcFMarker, 4); ++ srcGMarker = ALIGN(srcGMarker, 4); ++ destMarker = ALIGN(destMarker, 4); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ *(float*)&outStruct[destMarker] = ++ (float)*(double*)&inFPRs[srcFMarker]; ++ srcFMarker += 8; ++ fprsUsed++; ++ } ++ else ++ *(float*)&outStruct[destMarker] = ++ (float)*(double*)&inGPRs[srcGMarker]; ++ ++ srcGMarker += 4; ++ destMarker += 4; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (destMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) ++ srcGMarker = ALIGN(srcGMarker, 8); ++ } ++ ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ srcFMarker = ALIGN(srcFMarker, 8); ++ destMarker = ALIGN(destMarker, 8); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ *(double*)&outStruct[destMarker] = ++ *(double*)&inFPRs[srcFMarker]; ++ srcFMarker += 8; ++ fprsUsed++; ++ } ++ else ++ *(double*)&outStruct[destMarker] = ++ *(double*)&inGPRs[srcGMarker]; ++ ++ destMarker += 8; ++ ++ // Skip next GPR ++ srcGMarker += 8; ++ srcGMarker = ALIGN(srcGMarker, 8); ++ ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ destMarker = ALIGN(destMarker, 16); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ srcFMarker = ALIGN(srcFMarker, 8); ++ srcGMarker = ALIGN(srcGMarker, 8); ++ *(long double*)&outStruct[destMarker] = ++ *(long double*)&inFPRs[srcFMarker]; ++ srcFMarker += 16; ++ fprsUsed += 2; ++ } ++ else ++ { ++ srcFMarker = ALIGN(srcFMarker, 16); ++ srcGMarker = ALIGN(srcGMarker, 16); ++ *(long double*)&outStruct[destMarker] = ++ *(long double*)&inGPRs[srcGMarker]; ++ } ++ ++ destMarker += 16; ++ ++ // Skip next 2 GPRs ++ srcGMarker += 16; ++ srcGMarker = ALIGN(srcGMarker, 8); ++ ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ { ++ if (inType->alignment == 1) // chars only ++ { ++ if (inType->size == 1) ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ else if (inType->size == 2) ++ { ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ i++; ++ } ++ else ++ { ++ memcpy(&outStruct[destMarker], ++ &inGPRs[srcGMarker], inType->size); ++ srcGMarker += inType->size; ++ destMarker += inType->size; ++ i += inType->size - 1; ++ } ++ } ++ else // chars and other stuff ++ { ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (srcGMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) ++ srcGMarker = ALIGN(srcGMarker, inType->alignment); // was 8 ++ } ++ } ++ ++ break; ++ } ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ srcGMarker = ALIGN(srcGMarker, 2); ++ destMarker = ALIGN(destMarker, 2); ++ ++ *(short*)&outStruct[destMarker] = ++ *(short*)&inGPRs[srcGMarker]; ++ srcGMarker += 2; ++ destMarker += 2; ++ ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ srcGMarker = ALIGN(srcGMarker, 4); ++ destMarker = ALIGN(destMarker, 4); ++ ++ *(int*)&outStruct[destMarker] = ++ *(int*)&inGPRs[srcGMarker]; ++ srcGMarker += 4; ++ destMarker += 4; ++ ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ srcGMarker = ALIGN(srcGMarker, 8); ++ destMarker = ALIGN(destMarker, 8); ++ ++ *(long long*)&outStruct[destMarker] = ++ *(long long*)&inGPRs[srcGMarker]; ++ srcGMarker += 8; ++ destMarker += 8; ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ recurseCount++; ++ ffi64_struct_to_ram_form(inType->elements[i], inGPRs, ++ &srcGMarker, inFPRs, &srcFMarker, &fprsUsed, ++ outStruct, &destMarker); ++ recurseCount--; ++ break; ++ ++ default: ++ FFI_ASSERT(0); // unknown element type ++ break; ++ } ++ } ++ ++ srcGMarker = ALIGN(srcGMarker, inType->alignment); ++ ++ // Take care of the special case for 16-byte structs, but not for ++ // nested structs. ++ if (recurseCount == 0 && srcGMarker == 16) ++ { ++ *(long double*)&outStruct[0] = *(long double*)&inGPRs[0]; ++ srcFMarker = savedFMarker; ++ fprsUsed = savedFPRsUsed; ++ } ++ ++ if (ioGPRMarker) ++ *ioGPRMarker = ALIGN(srcGMarker, 8); ++ ++ if (ioFPRMarker) ++ *ioFPRMarker = srcFMarker; ++ ++ if (ioFPRsUsed) ++ *ioFPRsUsed = fprsUsed; ++ ++ if (ioStructMarker) ++ *ioStructMarker = ALIGN(destMarker, 8); ++} ++ ++/* ffi64_struct_to_reg_form ++ ++ Copy a struct's elements into buffers that can be sliced into registers. ++ Return the sizes of the output buffers in bytes. Pass NULL buffer pointers ++ to calculate size only. ++ outGPRs[0-7] == r3, outFPRs[0-7] == f1 ... ++*/ ++void ++ffi64_struct_to_reg_form( ++ const ffi_type* inType, ++ const char* inStruct, ++ unsigned int* ioStructMarker, ++ unsigned int* ioFPRsUsed, ++ char* outGPRs, // caller-allocated ++ unsigned int* ioGPRSize, ++ char* outFPRs, // caller-allocated ++ unsigned int* ioFPRSize) ++{ ++ size_t i; ++ unsigned int srcMarker = 0; ++ unsigned int destGMarker = 0; ++ unsigned int destFMarker = 0; ++ unsigned int savedFMarker = 0; ++ unsigned int fprsUsed = 0; ++ unsigned int savedFPRsUsed = 0; ++ ++ static unsigned int recurseCount = 0; ++ ++ if (ioStructMarker) ++ srcMarker = *ioStructMarker; ++ ++ if (ioFPRsUsed) ++ { ++ fprsUsed = *ioFPRsUsed; ++ savedFPRsUsed = fprsUsed; ++ } ++ ++ if (ioGPRSize) ++ destGMarker = *ioGPRSize; ++ ++ if (ioFPRSize) ++ { ++ destFMarker = *ioFPRSize; ++ savedFMarker = destFMarker; ++ } ++ ++ switch (inType->size) ++ { ++ case 1: case 2: case 4: ++ destGMarker += 8 - inType->size; ++ break; ++ ++ default: ++ break; ++ } ++ ++ for (i = 0; inType->elements[i] != NULL; i++) ++ { ++ switch (inType->elements[i]->type) ++ { ++ // Shadow floating-point types in GPRs for vararg and pre-ANSI ++ // functions. ++ case FFI_TYPE_FLOAT: ++ // Nudge markers to next 4/8-byte boundary ++ srcMarker = ALIGN(srcMarker, 4); ++ destGMarker = ALIGN(destGMarker, 4); ++ destFMarker = ALIGN(destFMarker, 8); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ if (outFPRs != NULL && inStruct != NULL) ++ *(double*)&outFPRs[destFMarker] = ++ (double)*(float*)&inStruct[srcMarker]; ++ ++ destFMarker += 8; ++ fprsUsed++; ++ } ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(double*)&outGPRs[destGMarker] = ++ (double)*(float*)&inStruct[srcMarker]; ++ ++ srcMarker += 4; ++ destGMarker += 4; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (srcMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 4)) ++ destGMarker = ALIGN(destGMarker, 8); ++ } ++ ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ srcMarker = ALIGN(srcMarker, 8); ++ destFMarker = ALIGN(destFMarker, 8); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ if (outFPRs != NULL && inStruct != NULL) ++ *(double*)&outFPRs[destFMarker] = ++ *(double*)&inStruct[srcMarker]; ++ ++ destFMarker += 8; ++ fprsUsed++; ++ } ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(double*)&outGPRs[destGMarker] = ++ *(double*)&inStruct[srcMarker]; ++ ++ srcMarker += 8; ++ ++ // Skip next GPR ++ destGMarker += 8; ++ destGMarker = ALIGN(destGMarker, 8); ++ ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ srcMarker = ALIGN(srcMarker, 16); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ destFMarker = ALIGN(destFMarker, 8); ++ destGMarker = ALIGN(destGMarker, 8); ++ ++ if (outFPRs != NULL && inStruct != NULL) ++ *(long double*)&outFPRs[destFMarker] = ++ *(long double*)&inStruct[srcMarker]; ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long double*)&outGPRs[destGMarker] = ++ *(long double*)&inStruct[srcMarker]; ++ ++ destFMarker += 16; ++ fprsUsed += 2; ++ } ++ else ++ { ++ destGMarker = ALIGN(destGMarker, 16); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long double*)&outGPRs[destGMarker] = ++ *(long double*)&inStruct[srcMarker]; ++ } ++ ++ srcMarker += 16; ++ destGMarker += 16; // Skip next 2 GPRs ++ destGMarker = ALIGN(destGMarker, 8); // was 16 ++ ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ if (inType->alignment == 1) // bytes only ++ { ++ if (inType->size == 1) ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ outGPRs[destGMarker] = inStruct[srcMarker]; ++ ++ srcMarker++; ++ destGMarker++; ++ } ++ else if (inType->size == 2) ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ { ++ outGPRs[destGMarker] = inStruct[srcMarker]; ++ outGPRs[destGMarker + 1] = inStruct[srcMarker + 1]; ++ } ++ ++ srcMarker += 2; ++ destGMarker += 2; ++ ++ i++; ++ } ++ else ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ { ++ // Avoid memcpy for small chunks. ++ if (inType->size <= sizeof(long)) ++ *(long*)&outGPRs[destGMarker] = ++ *(long*)&inStruct[srcMarker]; ++ else ++ memcpy(&outGPRs[destGMarker], ++ &inStruct[srcMarker], inType->size); ++ } ++ ++ srcMarker += inType->size; ++ destGMarker += inType->size; ++ i += inType->size - 1; ++ } ++ } ++ else // bytes and other stuff ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ outGPRs[destGMarker] = inStruct[srcMarker]; ++ ++ srcMarker++; ++ destGMarker++; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (destGMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 4)) ++ destGMarker = ALIGN(destGMarker, inType->alignment); // was 8 ++ } ++ } ++ ++ break; ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ srcMarker = ALIGN(srcMarker, 2); ++ destGMarker = ALIGN(destGMarker, 2); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(short*)&outGPRs[destGMarker] = ++ *(short*)&inStruct[srcMarker]; ++ ++ srcMarker += 2; ++ destGMarker += 2; ++ ++ if (inType->elements[i + 1] == NULL) ++ destGMarker = ALIGN(destGMarker, inType->alignment); ++ ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ srcMarker = ALIGN(srcMarker, 4); ++ destGMarker = ALIGN(destGMarker, 4); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(int*)&outGPRs[destGMarker] = ++ *(int*)&inStruct[srcMarker]; ++ ++ srcMarker += 4; ++ destGMarker += 4; ++ ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ srcMarker = ALIGN(srcMarker, 8); ++ destGMarker = ALIGN(destGMarker, 8); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long long*)&outGPRs[destGMarker] = ++ *(long long*)&inStruct[srcMarker]; ++ ++ srcMarker += 8; ++ destGMarker += 8; ++ ++ if (inType->elements[i + 1] == NULL) ++ destGMarker = ALIGN(destGMarker, inType->alignment); ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ recurseCount++; ++ ffi64_struct_to_reg_form(inType->elements[i], ++ inStruct, &srcMarker, &fprsUsed, outGPRs, ++ &destGMarker, outFPRs, &destFMarker); ++ recurseCount--; ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ } ++ ++ destGMarker = ALIGN(destGMarker, inType->alignment); ++ ++ // Take care of the special case for 16-byte structs, but not for ++ // nested structs. ++ if (recurseCount == 0 && destGMarker == 16) ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long double*)&outGPRs[0] = *(long double*)&inStruct[0]; ++ ++ destFMarker = savedFMarker; ++ fprsUsed = savedFPRsUsed; ++ } ++ ++ if (ioStructMarker) ++ *ioStructMarker = ALIGN(srcMarker, 8); ++ ++ if (ioFPRsUsed) ++ *ioFPRsUsed = fprsUsed; ++ ++ if (ioGPRSize) ++ *ioGPRSize = ALIGN(destGMarker, 8); ++ ++ if (ioFPRSize) ++ *ioFPRSize = ALIGN(destFMarker, 8); ++} ++ ++/* ffi64_stret_needs_ptr ++ ++ Determine whether a returned struct needs a pointer in r3 or can fit ++ in registers. ++*/ ++ ++bool ++ffi64_stret_needs_ptr( ++ const ffi_type* inType, ++ unsigned short* ioGPRCount, ++ unsigned short* ioFPRCount) ++{ ++ // Obvious case first- struct is larger than combined FPR size. ++ if (inType->size > 14 * 8) ++ return true; ++ ++ // Now the struct can physically fit in registers, determine if it ++ // also fits logically. ++ bool needsPtr = false; ++ unsigned short gprsUsed = 0; ++ unsigned short fprsUsed = 0; ++ size_t i; ++ ++ if (ioGPRCount) ++ gprsUsed = *ioGPRCount; ++ ++ if (ioFPRCount) ++ fprsUsed = *ioFPRCount; ++ ++ for (i = 0; inType->elements[i] != NULL && !needsPtr; i++) ++ { ++ switch (inType->elements[i]->type) ++ { ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ gprsUsed++; ++ fprsUsed++; ++ ++ if (fprsUsed > 13) ++ needsPtr = true; ++ ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ gprsUsed += 2; ++ fprsUsed += 2; ++ ++ if (fprsUsed > 14) ++ needsPtr = true; ++ ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ { ++ gprsUsed++; ++ ++ if (gprsUsed > 8) ++ { ++ needsPtr = true; ++ break; ++ } ++ ++ if (inType->elements[i + 1] == NULL) // last byte in the struct ++ break; ++ ++ // Count possible contiguous bytes ahead, up to 8. ++ unsigned short j; ++ ++ for (j = 1; j < 8; j++) ++ { ++ if (inType->elements[i + j] == NULL || ++ !FFI_TYPE_1_BYTE(inType->elements[i + j]->type)) ++ break; ++ } ++ ++ i += j - 1; // allow for i++ before the test condition ++ ++ break; ++ } ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ gprsUsed++; ++ ++ if (gprsUsed > 8) ++ needsPtr = true; ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ needsPtr = ffi64_stret_needs_ptr( ++ inType->elements[i], &gprsUsed, &fprsUsed); ++ ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ } ++ ++ if (ioGPRCount) ++ *ioGPRCount = gprsUsed; ++ ++ if (ioFPRCount) ++ *ioFPRCount = fprsUsed; ++ ++ return needsPtr; ++} ++ ++/* ffi64_data_size ++ ++ Calculate the size in bytes of an ffi type. ++*/ ++ ++unsigned int ++ffi64_data_size( ++ const ffi_type* inType) ++{ ++ unsigned int size = 0; ++ ++ switch (inType->type) ++ { ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ size = 1; ++ break; ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ size = 2; ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_FLOAT: ++ size = 4; ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_DOUBLE: ++ size = 8; ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ size = 16; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ ffi64_struct_to_reg_form( ++ inType, NULL, NULL, NULL, NULL, &size, NULL, NULL); ++ break; ++ ++ case FFI_TYPE_VOID: ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ ++ return size; ++} ++ ++#endif /* defined(__ppc64__) */ ++#endif /* __ppc__ || __ppc64__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S +new file mode 100644 +index 0000000..7162fa1 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S +@@ -0,0 +1,418 @@ ++#if defined(__ppc64__) ++ ++/* ----------------------------------------------------------------------- ++ ppc64-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, ++ Inc. based on ppc_closure.S ++ ++ PowerPC Assembly glue. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++ ++#include ++#include // for FFI_TRAMPOLINE_SIZE ++#include ++#include ++ ++ .file "ppc64-darwin_closure.S" ++.text ++ .align LOG2_GPR_BYTES ++ .globl _ffi_closure_ASM ++ ++.text ++ .align LOG2_GPR_BYTES ++ ++_ffi_closure_ASM: ++LFB1: ++ mflr r0 ++ stg r0,SF_RETURN(r1) // save return address ++ ++ // Save GPRs 3 - 10 (aligned to 8) in the parents outgoing area. ++ stg r3,SF_ARG1(r1) ++ stg r4,SF_ARG2(r1) ++ stg r5,SF_ARG3(r1) ++ stg r6,SF_ARG4(r1) ++ stg r7,SF_ARG5(r1) ++ stg r8,SF_ARG6(r1) ++ stg r9,SF_ARG7(r1) ++ stg r10,SF_ARG8(r1) ++ ++LCFI0: ++/* 48 bytes (Linkage Area) ++ 64 bytes (outgoing parameter area, always reserved) ++ 112 bytes (14*8 for incoming FPR) ++ ? bytes (result) ++ 112 bytes (14*8 for outgoing FPR) ++ 16 bytes (2 saved registers) ++ 352 + ? total bytes ++*/ ++ ++ std r31,-8(r1) // Save registers we use. ++ std r30,-16(r1) ++ mr r30,r1 // Save the old SP. ++ mr r31,r11 // Save the ffi_closure around ffi64_data_size. ++ ++ // Calculate the space we need. ++ stdu r1,-SF_MINSIZE(r1) ++ ld r3,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* ++ ld r3,16(r3) // ffi_cif->rtype* ++ bl Lffi64_data_size$stub ++ ld r1,0(r1) ++ ++ addi r3,r3,352 // Add our overhead. ++ neg r3,r3 ++ li r0,-32 // Align to 32 bytes. ++ and r3,r3,r0 ++ stdux r1,r1,r3 // Grow the stack. ++ ++ mr r11,r31 // Copy the ffi_closure back. ++ ++LCFI1: ++ // We want to build up an area for the parameters passed ++ // in registers. (both floating point and integer) ++ ++/* 320 bytes (callee stack frame aligned to 32) ++ 48 bytes (caller linkage area) ++ 368 (start of caller parameter area aligned to 8) ++*/ ++ ++ // Save FPRs 1 - 14. (aligned to 8) ++ stfd f1,112(r1) ++ stfd f2,120(r1) ++ stfd f3,128(r1) ++ stfd f4,136(r1) ++ stfd f5,144(r1) ++ stfd f6,152(r1) ++ stfd f7,160(r1) ++ stfd f8,168(r1) ++ stfd f9,176(r1) ++ stfd f10,184(r1) ++ stfd f11,192(r1) ++ stfd f12,200(r1) ++ stfd f13,208(r1) ++ stfd f14,216(r1) ++ ++ // Set up registers for the routine that actually does the work. ++ mr r3,r11 // context pointer from the trampoline ++ addi r4,r1,224 // result storage ++ addi r5,r30,SF_ARG1 // saved GPRs ++ addi r6,r1,112 // saved FPRs ++ bl Lffi_closure_helper_DARWIN$stub ++ ++ // Look the proper starting point in table ++ // by using return type as an offset. ++ addi r5,r1,224 // Get pointer to results area. ++ bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. ++ mflr r4 // Move to r4. ++ slwi r3,r3,4 // Now multiply return type by 16. ++ add r3,r3,r4 // Add contents of table to table address. ++ mtctr r3 ++ bctr ++ ++LFE1: ++ // Each of the ret_typeX code fragments has to be exactly 16 bytes long ++ // (4 instructions). For cache effectiveness we align to a 16 byte ++ // boundary first. ++ .align 4 ++ nop ++ nop ++ nop ++ ++Lget_ret_type0_addr: ++ blrl ++ ++// case FFI_TYPE_VOID ++Lret_type0: ++ b Lfinish ++ nop ++ nop ++ nop ++ ++// case FFI_TYPE_INT ++Lret_type1: ++ lwz r3,4(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_FLOAT ++Lret_type2: ++ lfs f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_DOUBLE ++Lret_type3: ++ lfd f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_LONGDOUBLE ++Lret_type4: ++ lfd f1,0(r5) ++ lfd f2,8(r5) ++ b Lfinish ++ nop ++ ++// case FFI_TYPE_UINT8 ++Lret_type5: ++ lbz r3,7(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT8 ++Lret_type6: ++ lbz r3,7(r5) ++ extsb r3,r3 ++ b Lfinish ++ nop ++ ++// case FFI_TYPE_UINT16 ++Lret_type7: ++ lhz r3,6(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT16 ++Lret_type8: ++ lha r3,6(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_UINT32 ++Lret_type9: // same as Lret_type1 ++ lwz r3,4(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT32 ++Lret_type10: // same as Lret_type1 ++ lwz r3,4(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_UINT64 ++Lret_type11: ++ ld r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT64 ++Lret_type12: // same as Lret_type11 ++ ld r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_STRUCT ++Lret_type13: ++ b Lret_struct ++ nop ++ nop ++ nop ++ ++// ** End 16-byte aligned cases ** ++// case FFI_TYPE_POINTER ++// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types ++// are added in future, the following code will need to be updated and ++// padded to 16 bytes. ++Lret_type14: ++ lg r3,0(r5) ++ b Lfinish ++ ++// copy struct into registers ++Lret_struct: ++ ld r31,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* ++ ld r3,16(r31) // ffi_cif->rtype* ++ ld r31,24(r31) // ffi_cif->flags ++ mr r4,r5 // copy struct* to 2nd arg ++ addi r7,r1,SF_ARG9 // GPR return area ++ addi r9,r30,-16-(14*8) // FPR return area ++ li r5,0 // struct offset ptr (NULL) ++ li r6,0 // FPR used count ptr (NULL) ++ li r8,0 // GPR return area size ptr (NULL) ++ li r10,0 // FPR return area size ptr (NULL) ++ bl Lffi64_struct_to_reg_form$stub ++ ++ // Load GPRs ++ ld r3,SF_ARG9(r1) ++ ld r4,SF_ARG10(r1) ++ ld r5,SF_ARG11(r1) ++ ld r6,SF_ARG12(r1) ++ nop ++ ld r7,SF_ARG13(r1) ++ ld r8,SF_ARG14(r1) ++ ld r9,SF_ARG15(r1) ++ ld r10,SF_ARG16(r1) ++ nop ++ ++ // Load FPRs ++ mtcrf 0x2,r31 ++ bf 26,Lfinish ++ lfd f1,-16-(14*8)(r30) ++ lfd f2,-16-(13*8)(r30) ++ lfd f3,-16-(12*8)(r30) ++ lfd f4,-16-(11*8)(r30) ++ nop ++ lfd f5,-16-(10*8)(r30) ++ lfd f6,-16-(9*8)(r30) ++ lfd f7,-16-(8*8)(r30) ++ lfd f8,-16-(7*8)(r30) ++ nop ++ lfd f9,-16-(6*8)(r30) ++ lfd f10,-16-(5*8)(r30) ++ lfd f11,-16-(4*8)(r30) ++ lfd f12,-16-(3*8)(r30) ++ nop ++ lfd f13,-16-(2*8)(r30) ++ lfd f14,-16-(1*8)(r30) ++ // Fall through ++ ++// case done ++Lfinish: ++ lg r1,0(r1) // Restore stack pointer. ++ ld r31,-8(r1) // Restore registers we used. ++ ld r30,-16(r1) ++ lg r0,SF_RETURN(r1) // Get return address. ++ mtlr r0 // Reset link register. ++ blr ++ ++// END(ffi_closure_ASM) ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ; Length of Common Information Entry ++LSCIE1: ++ .long 0x0 ; CIE Identifier Tag ++ .byte 0x1 ; CIE Version ++ .ascii "zR\0" ; CIE Augmentation ++ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor ++ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte 0x41 ; CIE RA Column ++ .byte 0x1 ; uleb128 0x1; Augmentation size ++ .byte 0x10 ; FDE Encoding (pcrel) ++ .byte 0xc ; DW_CFA_def_cfa ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x0 ; uleb128 0x0 ++ .align LOG2_GPR_BYTES ++LECIE1: ++.globl _ffi_closure_ASM.eh ++_ffi_closure_ASM.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ; FDE Length ++ ++LASFDE1: ++ .long LASFDE1-EH_frame1 ; FDE CIE offset ++ .g_long LFB1-. ; FDE initial location ++ .set L$set$3,LFE1-LFB1 ++ .g_long L$set$3 ; FDE address range ++ .byte 0x0 ; uleb128 0x0; Augmentation size ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$3,LCFI1-LCFI0 ++ .long L$set$3 ++ .byte 0xe ; DW_CFA_def_cfa_offset ++ .byte 176,1 ; uleb128 176 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$4,LCFI0-LFB1 ++ .long L$set$4 ++ .byte 0x11 ; DW_CFA_offset_extended_sf ++ .byte 0x41 ; uleb128 0x41 ++ .byte 0x7e ; sleb128 -2 ++ .align LOG2_GPR_BYTES ++ ++LEFDE1: ++.data ++ .align LOG2_GPR_BYTES ++LDFCM0: ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi_closure_helper_DARWIN$stub: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ mflr r0 ++ bcl 20,31,LO$ffi_closure_helper_DARWIN ++ ++LO$ffi_closure_helper_DARWIN: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) ++ mtlr r0 ++ lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi_closure_helper_DARWIN$lazy_ptr: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ .g_long dyld_stub_binding_helper ++ ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi64_struct_to_reg_form$stub: ++ .indirect_symbol _ffi64_struct_to_reg_form ++ mflr r0 ++ bcl 20,31,LO$ffi64_struct_to_reg_form ++ ++LO$ffi64_struct_to_reg_form: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form) ++ mtlr r0 ++ lgu r12,lo16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form)(r11) ++ mtctr r12 ++ bctr ++ ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi64_data_size$stub: ++ .indirect_symbol _ffi64_data_size ++ mflr r0 ++ bcl 20,31,LO$ffi64_data_size ++ ++LO$ffi64_data_size: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size) ++ mtlr r0 ++ lgu r12,lo16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi64_struct_to_reg_form$lazy_ptr: ++ .indirect_symbol _ffi64_struct_to_reg_form ++ .g_long dyld_stub_binding_helper ++ ++L_ffi64_data_size$lazy_ptr: ++ .indirect_symbol _ffi64_data_size ++ .g_long dyld_stub_binding_helper ++ ++#endif // __ppc64__ +diff -r -u ./Modules/_ctypes/libffi_osx/types.c ./Modules/_ctypes/libffi_osx/types.c +new file mode 100644 +index 0000000..44806ae +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/types.c +@@ -0,0 +1,115 @@ ++/* ----------------------------------------------------------------------- ++ types.c - Copyright (c) 1996, 1998 Red Hat, Inc. ++ ++ Predefined ffi_types needed by libffi. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++/* Type definitions */ ++#define FFI_INTEGRAL_TYPEDEF(n, s, a, t) \ ++ ffi_type ffi_type_##n = { s, a, t, NULL } ++#define FFI_AGGREGATE_TYPEDEF(n, e) \ ++ ffi_type ffi_type_##n = { 0, 0, FFI_TYPE_STRUCT, e } ++ ++FFI_INTEGRAL_TYPEDEF(uint8, 1, 1, FFI_TYPE_UINT8); ++FFI_INTEGRAL_TYPEDEF(sint8, 1, 1, FFI_TYPE_SINT8); ++FFI_INTEGRAL_TYPEDEF(uint16, 2, 2, FFI_TYPE_UINT16); ++FFI_INTEGRAL_TYPEDEF(sint16, 2, 2, FFI_TYPE_SINT16); ++FFI_INTEGRAL_TYPEDEF(uint32, 4, 4, FFI_TYPE_UINT32); ++FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32); ++FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT); ++ ++/* Size and alignment are fake here. They must not be 0. */ ++FFI_INTEGRAL_TYPEDEF(void, 1, 1, FFI_TYPE_VOID); ++ ++#if defined ALPHA || defined SPARC64 || defined X86_64 || \ ++ defined S390X || defined IA64 || defined POWERPC64 ++FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER); ++#else ++FFI_INTEGRAL_TYPEDEF(pointer, 4, 4, FFI_TYPE_POINTER); ++#endif ++ ++#if defined X86 || defined ARM || defined M68K || defined(X86_DARWIN) ++ ++# ifdef X86_64 ++ FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); ++ FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); ++# else ++ FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); ++ FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); ++# endif ++ ++#elif defined(POWERPC_DARWIN) ++FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); ++FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); ++#elif defined SH ++FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); ++FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); ++#else ++FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); ++FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); ++#endif ++ ++#if defined X86 || defined X86_WIN32 || defined M68K || defined(X86_DARWIN) ++ ++# if defined X86_WIN32 || defined X86_64 ++ FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); ++# endif ++ ++# ifdef X86_DARWIN ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE); ++# endif ++ ++#elif defined ARM || defined SH || defined POWERPC_AIX ++FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); ++FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE); ++#elif defined POWERPC_DARWIN ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++ ++# if __GNUC__ >= 4 ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); ++# endif ++ ++#elif defined SPARC ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++ ++# ifdef SPARC64 ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE); ++# endif ++ ++#elif defined X86_64 || defined POWERPC64 ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++#else ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); ++#endif +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/x86/darwin64.S ./Modules/_ctypes/libffi_osx/x86/darwin64.S +new file mode 100644 +index 0000000..165d469 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/darwin64.S +@@ -0,0 +1,417 @@ ++/* ----------------------------------------------------------------------- ++ darwin64.S - Copyright (c) 2006 Free Software Foundation, Inc. ++ derived from unix64.S ++ ++ x86-64 Foreign Function Interface for Darwin. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#ifdef __x86_64__ ++#define LIBFFI_ASM ++#include ++#include ++ ++ .file "darwin64.S" ++.text ++ ++/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, ++ void *raddr, void (*fnaddr)()); ++ ++ Bit o trickiness here -- ARGS+BYTES is the base of the stack frame ++ for this function. This has been allocated by ffi_call. We also ++ deallocate some of the stack that has been alloca'd. */ ++ ++ .align 3 ++ .globl _ffi_call_unix64 ++ ++_ffi_call_unix64: ++LUW0: ++ movq (%rsp), %r10 /* Load return address. */ ++ movq %rdi, %r12 /* Save a copy of the register area. */ ++ leaq (%rdi, %rsi), %rax /* Find local stack base. */ ++ movq %rdx, (%rax) /* Save flags. */ ++ movq %rcx, 8(%rax) /* Save raddr. */ ++ movq %rbp, 16(%rax) /* Save old frame pointer. */ ++ movq %r10, 24(%rax) /* Relocate return address. */ ++ movq %rax, %rbp /* Finalize local stack frame. */ ++LUW1: ++ /* movq %rdi, %r10 // Save a copy of the register area. */ ++ movq %r12, %r10 ++ movq %r8, %r11 /* Save a copy of the target fn. */ ++ movl %r9d, %eax /* Set number of SSE registers. */ ++ ++ /* Load up all argument registers. */ ++ movq (%r10), %rdi ++ movq 8(%r10), %rsi ++ movq 16(%r10), %rdx ++ movq 24(%r10), %rcx ++ movq 32(%r10), %r8 ++ movq 40(%r10), %r9 ++ testl %eax, %eax ++ jnz Lload_sse ++Lret_from_load_sse: ++ ++ /* Deallocate the reg arg area. */ ++ leaq 176(%r10), %rsp ++ ++ /* Call the user function. */ ++ call *%r11 ++ ++ /* Deallocate stack arg area; local stack frame in redzone. */ ++ leaq 24(%rbp), %rsp ++ ++ movq 0(%rbp), %rcx /* Reload flags. */ ++ movq 8(%rbp), %rdi /* Reload raddr. */ ++ movq 16(%rbp), %rbp /* Reload old frame pointer. */ ++LUW2: ++ ++ /* The first byte of the flags contains the FFI_TYPE. */ ++ movzbl %cl, %r10d ++ leaq Lstore_table(%rip), %r11 ++ movslq (%r11, %r10, 4), %r10 ++ addq %r11, %r10 ++ jmp *%r10 ++ ++Lstore_table: ++ .long Lst_void-Lstore_table /* FFI_TYPE_VOID */ ++ .long Lst_sint32-Lstore_table /* FFI_TYPE_INT */ ++ .long Lst_float-Lstore_table /* FFI_TYPE_FLOAT */ ++ .long Lst_double-Lstore_table /* FFI_TYPE_DOUBLE */ ++ .long Lst_ldouble-Lstore_table /* FFI_TYPE_LONGDOUBLE */ ++ .long Lst_uint8-Lstore_table /* FFI_TYPE_UINT8 */ ++ .long Lst_sint8-Lstore_table /* FFI_TYPE_SINT8 */ ++ .long Lst_uint16-Lstore_table /* FFI_TYPE_UINT16 */ ++ .long Lst_sint16-Lstore_table /* FFI_TYPE_SINT16 */ ++ .long Lst_uint32-Lstore_table /* FFI_TYPE_UINT32 */ ++ .long Lst_sint32-Lstore_table /* FFI_TYPE_SINT32 */ ++ .long Lst_int64-Lstore_table /* FFI_TYPE_UINT64 */ ++ .long Lst_int64-Lstore_table /* FFI_TYPE_SINT64 */ ++ .long Lst_struct-Lstore_table /* FFI_TYPE_STRUCT */ ++ .long Lst_int64-Lstore_table /* FFI_TYPE_POINTER */ ++ ++ .text ++ .align 3 ++Lst_void: ++ ret ++ .align 3 ++Lst_uint8: ++ movzbq %al, %rax ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_sint8: ++ movsbq %al, %rax ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_uint16: ++ movzwq %ax, %rax ++ movq %rax, (%rdi) ++ .align 3 ++Lst_sint16: ++ movswq %ax, %rax ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_uint32: ++ movl %eax, %eax ++ movq %rax, (%rdi) ++ .align 3 ++Lst_sint32: ++ cltq ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_int64: ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_float: ++ movss %xmm0, (%rdi) ++ ret ++ .align 3 ++Lst_double: ++ movsd %xmm0, (%rdi) ++ ret ++Lst_ldouble: ++ fstpt (%rdi) ++ ret ++ .align 3 ++Lst_struct: ++ leaq -20(%rsp), %rsi /* Scratch area in redzone. */ ++ ++ /* We have to locate the values now, and since we don't want to ++ write too much data into the user's return value, we spill the ++ value to a 16 byte scratch area first. Bits 8, 9, and 10 ++ control where the values are located. Only one of the three ++ bits will be set; see ffi_prep_cif_machdep for the pattern. */ ++ movd %xmm0, %r10 ++ movd %xmm1, %r11 ++ testl $0x100, %ecx ++ cmovnz %rax, %rdx ++ cmovnz %r10, %rax ++ testl $0x200, %ecx ++ cmovnz %r10, %rdx ++ testl $0x400, %ecx ++ cmovnz %r10, %rax ++ cmovnz %r11, %rdx ++ movq %rax, (%rsi) ++ movq %rdx, 8(%rsi) ++ ++ /* Bits 12-31 contain the true size of the structure. Copy from ++ the scratch area to the true destination. */ ++ shrl $12, %ecx ++ rep movsb ++ ret ++ ++ /* Many times we can avoid loading any SSE registers at all. ++ It's not worth an indirect jump to load the exact set of ++ SSE registers needed; zero or all is a good compromise. */ ++ .align 3 ++LUW3: ++Lload_sse: ++ movdqa 48(%r10), %xmm0 ++ movdqa 64(%r10), %xmm1 ++ movdqa 80(%r10), %xmm2 ++ movdqa 96(%r10), %xmm3 ++ movdqa 112(%r10), %xmm4 ++ movdqa 128(%r10), %xmm5 ++ movdqa 144(%r10), %xmm6 ++ movdqa 160(%r10), %xmm7 ++ jmp Lret_from_load_sse ++ ++LUW4: ++ .align 3 ++ .globl _ffi_closure_unix64 ++ ++_ffi_closure_unix64: ++LUW5: ++ /* The carry flag is set by the trampoline iff SSE registers ++ are used. Don't clobber it before the branch instruction. */ ++ leaq -200(%rsp), %rsp ++LUW6: ++ movq %rdi, (%rsp) ++ movq %rsi, 8(%rsp) ++ movq %rdx, 16(%rsp) ++ movq %rcx, 24(%rsp) ++ movq %r8, 32(%rsp) ++ movq %r9, 40(%rsp) ++ jc Lsave_sse ++Lret_from_save_sse: ++ ++ movq %r10, %rdi ++ leaq 176(%rsp), %rsi ++ movq %rsp, %rdx ++ leaq 208(%rsp), %rcx ++ call _ffi_closure_unix64_inner ++ ++ /* Deallocate stack frame early; return value is now in redzone. */ ++ addq $200, %rsp ++LUW7: ++ ++ /* The first byte of the return value contains the FFI_TYPE. */ ++ movzbl %al, %r10d ++ leaq Lload_table(%rip), %r11 ++ movslq (%r11, %r10, 4), %r10 ++ addq %r11, %r10 ++ jmp *%r10 ++ ++Lload_table: ++ .long Lld_void-Lload_table /* FFI_TYPE_VOID */ ++ .long Lld_int32-Lload_table /* FFI_TYPE_INT */ ++ .long Lld_float-Lload_table /* FFI_TYPE_FLOAT */ ++ .long Lld_double-Lload_table /* FFI_TYPE_DOUBLE */ ++ .long Lld_ldouble-Lload_table /* FFI_TYPE_LONGDOUBLE */ ++ .long Lld_int8-Lload_table /* FFI_TYPE_UINT8 */ ++ .long Lld_int8-Lload_table /* FFI_TYPE_SINT8 */ ++ .long Lld_int16-Lload_table /* FFI_TYPE_UINT16 */ ++ .long Lld_int16-Lload_table /* FFI_TYPE_SINT16 */ ++ .long Lld_int32-Lload_table /* FFI_TYPE_UINT32 */ ++ .long Lld_int32-Lload_table /* FFI_TYPE_SINT32 */ ++ .long Lld_int64-Lload_table /* FFI_TYPE_UINT64 */ ++ .long Lld_int64-Lload_table /* FFI_TYPE_SINT64 */ ++ .long Lld_struct-Lload_table /* FFI_TYPE_STRUCT */ ++ .long Lld_int64-Lload_table /* FFI_TYPE_POINTER */ ++ ++ .text ++ .align 3 ++Lld_void: ++ ret ++ .align 3 ++Lld_int8: ++ movzbl -24(%rsp), %eax ++ ret ++ .align 3 ++Lld_int16: ++ movzwl -24(%rsp), %eax ++ ret ++ .align 3 ++Lld_int32: ++ movl -24(%rsp), %eax ++ ret ++ .align 3 ++Lld_int64: ++ movq -24(%rsp), %rax ++ ret ++ .align 3 ++Lld_float: ++ movss -24(%rsp), %xmm0 ++ ret ++ .align 3 ++Lld_double: ++ movsd -24(%rsp), %xmm0 ++ ret ++ .align 3 ++Lld_ldouble: ++ fldt -24(%rsp) ++ ret ++ .align 3 ++Lld_struct: ++ /* There are four possibilities here, %rax/%rdx, %xmm0/%rax, ++ %rax/%xmm0, %xmm0/%xmm1. We collapse two by always loading ++ both rdx and xmm1 with the second word. For the remaining, ++ bit 8 set means xmm0 gets the second word, and bit 9 means ++ that rax gets the second word. */ ++ movq -24(%rsp), %rcx ++ movq -16(%rsp), %rdx ++ movq -16(%rsp), %xmm1 ++ testl $0x100, %eax ++ cmovnz %rdx, %rcx ++ movd %rcx, %xmm0 ++ testl $0x200, %eax ++ movq -24(%rsp), %rax ++ cmovnz %rdx, %rax ++ ret ++ ++ /* See the comment above Lload_sse; the same logic applies here. */ ++ .align 3 ++LUW8: ++Lsave_sse: ++ movdqa %xmm0, 48(%rsp) ++ movdqa %xmm1, 64(%rsp) ++ movdqa %xmm2, 80(%rsp) ++ movdqa %xmm3, 96(%rsp) ++ movdqa %xmm4, 112(%rsp) ++ movdqa %xmm5, 128(%rsp) ++ movdqa %xmm6, 144(%rsp) ++ movdqa %xmm7, 160(%rsp) ++ jmp Lret_from_save_sse ++ ++LUW9: ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 /* CIE Length */ ++ .long L$set$0 ++LSCIE1: ++ .long 0x0 /* CIE Identifier Tag */ ++ .byte 0x1 /* CIE Version */ ++ .ascii "zR\0" /* CIE Augmentation */ ++ .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ ++ .byte 0x78 /* sleb128 -8; CIE Data Alignment Factor */ ++ .byte 0x10 /* CIE RA Column */ ++ .byte 0x1 /* uleb128 0x1; Augmentation size */ ++ .byte 0x10 /* FDE Encoding (pcrel sdata4) */ ++ .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ ++ .byte 0x7 /* uleb128 0x7 */ ++ .byte 0x8 /* uleb128 0x8 */ ++ .byte 0x90 /* DW_CFA_offset, column 0x10 */ ++ .byte 0x1 ++ .align 3 ++LECIE1: ++ .globl _ffi_call_unix64.eh ++_ffi_call_unix64.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 /* FDE Length */ ++ .long L$set$1 ++LASFDE1: ++ .long LASFDE1-EH_frame1 /* FDE CIE offset */ ++ .quad LUW0-. /* FDE initial location */ ++ .set L$set$2,LUW4-LUW0 /* FDE address range */ ++ .quad L$set$2 ++ .byte 0x0 /* Augmentation size */ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$3,LUW1-LUW0 ++ .long L$set$3 ++ ++ /* New stack frame based off rbp. This is a itty bit of unwind ++ trickery in that the CFA *has* changed. There is no easy way ++ to describe it correctly on entry to the function. Fortunately, ++ it doesn't matter too much since at all points we can correctly ++ unwind back to ffi_call. Note that the location to which we ++ moved the return address is (the new) CFA-8, so from the ++ perspective of the unwind info, it hasn't moved. */ ++ .byte 0xc /* DW_CFA_def_cfa, %rbp offset 32 */ ++ .byte 0x6 ++ .byte 0x20 ++ .byte 0x80+6 /* DW_CFA_offset, %rbp offset 2*-8 */ ++ .byte 0x2 ++ .byte 0xa /* DW_CFA_remember_state */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$4,LUW2-LUW1 ++ .long L$set$4 ++ .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ ++ .byte 0x7 ++ .byte 0x8 ++ .byte 0xc0+6 /* DW_CFA_restore, %rbp */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$5,LUW3-LUW2 ++ .long L$set$5 ++ .byte 0xb /* DW_CFA_restore_state */ ++ ++ .align 3 ++LEFDE1: ++ .globl _ffi_closure_unix64.eh ++_ffi_closure_unix64.eh: ++LSFDE3: ++ .set L$set$6,LEFDE3-LASFDE3 /* FDE Length */ ++ .long L$set$6 ++LASFDE3: ++ .long LASFDE3-EH_frame1 /* FDE CIE offset */ ++ .quad LUW5-. /* FDE initial location */ ++ .set L$set$7,LUW9-LUW5 /* FDE address range */ ++ .quad L$set$7 ++ .byte 0x0 /* Augmentation size */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$8,LUW6-LUW5 ++ .long L$set$8 ++ .byte 0xe /* DW_CFA_def_cfa_offset */ ++ .byte 208,1 /* uleb128 208 */ ++ .byte 0xa /* DW_CFA_remember_state */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$9,LUW7-LUW6 ++ .long L$set$9 ++ .byte 0xe /* DW_CFA_def_cfa_offset */ ++ .byte 0x8 ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$10,LUW8-LUW7 ++ .long L$set$10 ++ .byte 0xb /* DW_CFA_restore_state */ ++ ++ .align 3 ++LEFDE3: ++ .subsections_via_symbols ++ ++#endif /* __x86_64__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S +new file mode 100644 +index 0000000..925a841 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S +@@ -0,0 +1,422 @@ ++#ifdef __i386__ ++/* ----------------------------------------------------------------------- ++ darwin.S - Copyright (c) 1996, 1998, 2001, 2002, 2003 Red Hat, Inc. ++ ++ X86 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++/* ++ * This file is based on sysv.S and then hacked up by Ronald who hasn't done ++ * assembly programming in 8 years. ++ */ ++ ++#ifndef __x86_64__ ++ ++#define LIBFFI_ASM ++#include ++#include ++ ++#ifdef PyObjC_STRICT_DEBUGGING ++ /* XXX: Debugging of stack alignment, to be removed */ ++#define ASSERT_STACK_ALIGNED movdqa -16(%esp), %xmm0 ++#else ++#define ASSERT_STACK_ALIGNED ++#endif ++ ++.text ++ ++.globl _ffi_prep_args ++ ++ .align 4 ++.globl _ffi_call_SYSV ++ ++_ffi_call_SYSV: ++LFB1: ++ pushl %ebp ++LCFI0: ++ movl %esp,%ebp ++LCFI1: ++ subl $8,%esp ++ /* Make room for all of the new args. */ ++ movl 16(%ebp),%ecx ++ subl %ecx,%esp ++ ++ movl %esp,%eax ++ ++ /* Place all of the ffi_prep_args in position */ ++ subl $8,%esp ++ pushl 12(%ebp) ++ pushl %eax ++ call *8(%ebp) ++ ++ /* Return stack to previous state and call the function */ ++ addl $16,%esp ++ ++ call *28(%ebp) ++ ++ /* Remove the space we pushed for the args */ ++ movl 16(%ebp),%ecx ++ addl %ecx,%esp ++ ++ /* Load %ecx with the return type code */ ++ movl 20(%ebp),%ecx ++ ++ /* If the return value pointer is NULL, assume no return value. */ ++ cmpl $0,24(%ebp) ++ jne Lretint ++ ++ /* Even if there is no space for the return value, we are ++ obliged to handle floating-point values. */ ++ cmpl $FFI_TYPE_FLOAT,%ecx ++ jne Lnoretval ++ fstp %st(0) ++ ++ jmp Lepilogue ++ ++Lretint: ++ cmpl $FFI_TYPE_INT,%ecx ++ jne Lretfloat ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movl %eax,0(%ecx) ++ jmp Lepilogue ++ ++Lretfloat: ++ cmpl $FFI_TYPE_FLOAT,%ecx ++ jne Lretdouble ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ fstps (%ecx) ++ jmp Lepilogue ++ ++Lretdouble: ++ cmpl $FFI_TYPE_DOUBLE,%ecx ++ jne Lretlongdouble ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ fstpl (%ecx) ++ jmp Lepilogue ++ ++Lretlongdouble: ++ cmpl $FFI_TYPE_LONGDOUBLE,%ecx ++ jne Lretint64 ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ fstpt (%ecx) ++ jmp Lepilogue ++ ++Lretint64: ++ cmpl $FFI_TYPE_SINT64,%ecx ++ jne Lretstruct1b ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movl %eax,0(%ecx) ++ movl %edx,4(%ecx) ++ jmp Lepilogue ++ ++Lretstruct1b: ++ cmpl $FFI_TYPE_SINT8,%ecx ++ jne Lretstruct2b ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movb %al,0(%ecx) ++ jmp Lepilogue ++ ++Lretstruct2b: ++ cmpl $FFI_TYPE_SINT16,%ecx ++ jne Lretstruct ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movw %ax,0(%ecx) ++ jmp Lepilogue ++ ++Lretstruct: ++ cmpl $FFI_TYPE_STRUCT,%ecx ++ jne Lnoretval ++ /* Nothing to do! */ ++ addl $4,%esp ++ popl %ebp ++ ret ++ ++Lnoretval: ++Lepilogue: ++ addl $8,%esp ++ movl %ebp,%esp ++ popl %ebp ++ ret ++LFE1: ++.ffi_call_SYSV_end: ++ ++ .align 4 ++FFI_HIDDEN (ffi_closure_SYSV) ++.globl _ffi_closure_SYSV ++ ++_ffi_closure_SYSV: ++LFB2: ++ pushl %ebp ++LCFI2: ++ movl %esp, %ebp ++LCFI3: ++ subl $56, %esp ++ leal -40(%ebp), %edx ++ movl %edx, -12(%ebp) /* resp */ ++ leal 8(%ebp), %edx ++ movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ ++ leal -12(%ebp), %edx ++ movl %edx, (%esp) /* &resp */ ++ movl %ebx, 8(%esp) ++LCFI7: ++ call L_ffi_closure_SYSV_inner$stub ++ movl 8(%esp), %ebx ++ movl -12(%ebp), %ecx ++ cmpl $FFI_TYPE_INT, %eax ++ je Lcls_retint ++ cmpl $FFI_TYPE_FLOAT, %eax ++ je Lcls_retfloat ++ cmpl $FFI_TYPE_DOUBLE, %eax ++ je Lcls_retdouble ++ cmpl $FFI_TYPE_LONGDOUBLE, %eax ++ je Lcls_retldouble ++ cmpl $FFI_TYPE_SINT64, %eax ++ je Lcls_retllong ++ cmpl $FFI_TYPE_UINT8, %eax ++ je Lcls_retstruct1 ++ cmpl $FFI_TYPE_SINT8, %eax ++ je Lcls_retstruct1 ++ cmpl $FFI_TYPE_UINT16, %eax ++ je Lcls_retstruct2 ++ cmpl $FFI_TYPE_SINT16, %eax ++ je Lcls_retstruct2 ++ cmpl $FFI_TYPE_STRUCT, %eax ++ je Lcls_retstruct ++Lcls_epilogue: ++ movl %ebp, %esp ++ popl %ebp ++ ret ++Lcls_retint: ++ movl (%ecx), %eax ++ jmp Lcls_epilogue ++Lcls_retfloat: ++ flds (%ecx) ++ jmp Lcls_epilogue ++Lcls_retdouble: ++ fldl (%ecx) ++ jmp Lcls_epilogue ++Lcls_retldouble: ++ fldt (%ecx) ++ jmp Lcls_epilogue ++Lcls_retllong: ++ movl (%ecx), %eax ++ movl 4(%ecx), %edx ++ jmp Lcls_epilogue ++Lcls_retstruct1: ++ movsbl (%ecx), %eax ++ jmp Lcls_epilogue ++Lcls_retstruct2: ++ movswl (%ecx), %eax ++ jmp Lcls_epilogue ++Lcls_retstruct: ++ lea -8(%ebp),%esp ++ movl %ebp, %esp ++ popl %ebp ++ ret $4 ++LFE2: ++ ++#if !FFI_NO_RAW_API ++ ++#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) ++#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) ++#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) ++#define CIF_FLAGS_OFFSET 20 ++ ++ .align 4 ++FFI_HIDDEN (ffi_closure_raw_SYSV) ++.globl _ffi_closure_raw_SYSV ++ ++_ffi_closure_raw_SYSV: ++LFB3: ++ pushl %ebp ++LCFI4: ++ movl %esp, %ebp ++LCFI5: ++ pushl %esi ++LCFI6: ++ subl $36, %esp ++ movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ ++ movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ ++ movl %edx, 12(%esp) /* user_data */ ++ leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ ++ movl %edx, 8(%esp) /* raw_args */ ++ leal -24(%ebp), %edx ++ movl %edx, 4(%esp) /* &res */ ++ movl %esi, (%esp) /* cif */ ++ call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ ++ movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ ++ cmpl $FFI_TYPE_INT, %eax ++ je Lrcls_retint ++ cmpl $FFI_TYPE_FLOAT, %eax ++ je Lrcls_retfloat ++ cmpl $FFI_TYPE_DOUBLE, %eax ++ je Lrcls_retdouble ++ cmpl $FFI_TYPE_LONGDOUBLE, %eax ++ je Lrcls_retldouble ++ cmpl $FFI_TYPE_SINT64, %eax ++ je Lrcls_retllong ++Lrcls_epilogue: ++ addl $36, %esp ++ popl %esi ++ popl %ebp ++ ret ++Lrcls_retint: ++ movl -24(%ebp), %eax ++ jmp Lrcls_epilogue ++Lrcls_retfloat: ++ flds -24(%ebp) ++ jmp Lrcls_epilogue ++Lrcls_retdouble: ++ fldl -24(%ebp) ++ jmp Lrcls_epilogue ++Lrcls_retldouble: ++ fldt -24(%ebp) ++ jmp Lrcls_epilogue ++Lrcls_retllong: ++ movl -24(%ebp), %eax ++ movl -20(%ebp), %edx ++ jmp Lrcls_epilogue ++LFE3: ++#endif ++ ++.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5 ++L_ffi_closure_SYSV_inner$stub: ++ .indirect_symbol _ffi_closure_SYSV_inner ++ hlt ; hlt ; hlt ; hlt ; hlt ++ ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ++LSCIE1: ++ .long 0x0 ++ .byte 0x1 ++ .ascii "zR\0" ++ .byte 0x1 ++ .byte 0x7c ++ .byte 0x8 ++ .byte 0x1 ++ .byte 0x10 ++ .byte 0xc ++ .byte 0x5 ++ .byte 0x4 ++ .byte 0x88 ++ .byte 0x1 ++ .align 2 ++LECIE1: ++.globl _ffi_call_SYSV.eh ++_ffi_call_SYSV.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ++LASFDE1: ++ .long LASFDE1-EH_frame1 ++ .long LFB1-. ++ .set L$set$2,LFE1-LFB1 ++ .long L$set$2 ++ .byte 0x0 ++ .byte 0x4 ++ .set L$set$3,LCFI0-LFB1 ++ .long L$set$3 ++ .byte 0xe ++ .byte 0x8 ++ .byte 0x84 ++ .byte 0x2 ++ .byte 0x4 ++ .set L$set$4,LCFI1-LCFI0 ++ .long L$set$4 ++ .byte 0xd ++ .byte 0x4 ++ .align 2 ++LEFDE1: ++.globl _ffi_closure_SYSV.eh ++_ffi_closure_SYSV.eh: ++LSFDE2: ++ .set L$set$5,LEFDE2-LASFDE2 ++ .long L$set$5 ++LASFDE2: ++ .long LASFDE2-EH_frame1 ++ .long LFB2-. ++ .set L$set$6,LFE2-LFB2 ++ .long L$set$6 ++ .byte 0x0 ++ .byte 0x4 ++ .set L$set$7,LCFI2-LFB2 ++ .long L$set$7 ++ .byte 0xe ++ .byte 0x8 ++ .byte 0x84 ++ .byte 0x2 ++ .byte 0x4 ++ .set L$set$8,LCFI3-LCFI2 ++ .long L$set$8 ++ .byte 0xd ++ .byte 0x4 ++ .align 2 ++LEFDE2: ++ ++#if !FFI_NO_RAW_API ++ ++.globl _ffi_closure_raw_SYSV.eh ++_ffi_closure_raw_SYSV.eh: ++LSFDE3: ++ .set L$set$10,LEFDE3-LASFDE3 ++ .long L$set$10 ++LASFDE3: ++ .long LASFDE3-EH_frame1 ++ .long LFB3-. ++ .set L$set$11,LFE3-LFB3 ++ .long L$set$11 ++ .byte 0x0 ++ .byte 0x4 ++ .set L$set$12,LCFI4-LFB3 ++ .long L$set$12 ++ .byte 0xe ++ .byte 0x8 ++ .byte 0x84 ++ .byte 0x2 ++ .byte 0x4 ++ .set L$set$13,LCFI5-LCFI4 ++ .long L$set$13 ++ .byte 0xd ++ .byte 0x4 ++ .byte 0x4 ++ .set L$set$14,LCFI6-LCFI5 ++ .long L$set$14 ++ .byte 0x85 ++ .byte 0x3 ++ .align 2 ++LEFDE3: ++ ++#endif ++ ++#endif /* ifndef __x86_64__ */ ++ ++#endif /* defined __i386__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c +new file mode 100644 +index 0000000..06feaf2 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c +@@ -0,0 +1,734 @@ ++#ifdef __x86_64__ ++ ++/* ----------------------------------------------------------------------- ++ x86-ffi64.c - Copyright (c) 2002 Bo Thorsen ++ ++ x86-64 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++#include ++ ++#define MAX_GPR_REGS 6 ++#define MAX_SSE_REGS 8 ++ ++typedef struct RegisterArgs { ++ /* Registers for argument passing. */ ++ UINT64 gpr[MAX_GPR_REGS]; ++ __int128_t sse[MAX_SSE_REGS]; ++} RegisterArgs; ++ ++extern void ++ffi_call_unix64( ++ void* args, ++ unsigned long bytes, ++ unsigned flags, ++ void* raddr, ++ void (*fnaddr)(), ++ unsigned ssecount); ++ ++/* All reference to register classes here is identical to the code in ++ gcc/config/i386/i386.c. Do *not* change one without the other. */ ++ ++/* Register class used for passing given 64bit part of the argument. ++ These represent classes as documented by the PS ABI, with the exception ++ of SSESF, SSEDF classes, that are basically SSE class, just gcc will ++ use SF or DFmode move instead of DImode to avoid reformating penalties. ++ ++ Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves ++ whenever possible (upper half does contain padding). */ ++enum x86_64_reg_class ++{ ++ X86_64_NO_CLASS, ++ X86_64_INTEGER_CLASS, ++ X86_64_INTEGERSI_CLASS, ++ X86_64_SSE_CLASS, ++ X86_64_SSESF_CLASS, ++ X86_64_SSEDF_CLASS, ++ X86_64_SSEUP_CLASS, ++ X86_64_X87_CLASS, ++ X86_64_X87UP_CLASS, ++ X86_64_COMPLEX_X87_CLASS, ++ X86_64_MEMORY_CLASS ++}; ++ ++#define MAX_CLASSES 4 ++#define SSE_CLASS_P(X) ((X) >= X86_64_SSE_CLASS && X <= X86_64_SSEUP_CLASS) ++ ++/* x86-64 register passing implementation. See x86-64 ABI for details. Goal ++ of this code is to classify each 8bytes of incoming argument by the register ++ class and assign registers accordingly. */ ++ ++/* Return the union class of CLASS1 and CLASS2. ++ See the x86-64 PS ABI for details. */ ++static enum x86_64_reg_class ++merge_classes( ++ enum x86_64_reg_class class1, ++ enum x86_64_reg_class class2) ++{ ++ /* Rule #1: If both classes are equal, this is the resulting class. */ ++ if (class1 == class2) ++ return class1; ++ ++ /* Rule #2: If one of the classes is NO_CLASS, the resulting class is ++ the other class. */ ++ if (class1 == X86_64_NO_CLASS) ++ return class2; ++ ++ if (class2 == X86_64_NO_CLASS) ++ return class1; ++ ++ /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */ ++ if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS) ++ return X86_64_MEMORY_CLASS; ++ ++ /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */ ++ if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS) ++ || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS)) ++ return X86_64_INTEGERSI_CLASS; ++ ++ if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS ++ || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS) ++ return X86_64_INTEGER_CLASS; ++ ++ /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class, ++ MEMORY is used. */ ++ if (class1 == X86_64_X87_CLASS ++ || class1 == X86_64_X87UP_CLASS ++ || class1 == X86_64_COMPLEX_X87_CLASS ++ || class2 == X86_64_X87_CLASS ++ || class2 == X86_64_X87UP_CLASS ++ || class2 == X86_64_COMPLEX_X87_CLASS) ++ return X86_64_MEMORY_CLASS; ++ ++ /* Rule #6: Otherwise class SSE is used. */ ++ return X86_64_SSE_CLASS; ++} ++ ++/* Classify the argument of type TYPE and mode MODE. ++ CLASSES will be filled by the register class used to pass each word ++ of the operand. The number of words is returned. In case the parameter ++ should be passed in memory, 0 is returned. As a special case for zero ++ sized containers, classes[0] will be NO_CLASS and 1 is returned. ++ ++ See the x86-64 PS ABI for details. */ ++ ++static int ++classify_argument( ++ ffi_type* type, ++ enum x86_64_reg_class classes[], ++ size_t byte_offset) ++{ ++ switch (type->type) ++ { ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_POINTER: ++#if 0 ++ if (byte_offset + type->size <= 4) ++ classes[0] = X86_64_INTEGERSI_CLASS; ++ else ++ classes[0] = X86_64_INTEGER_CLASS; ++ ++ return 1; ++#else ++ { ++ int size = byte_offset + type->size; ++ ++ if (size <= 4) ++ { ++ classes[0] = X86_64_INTEGERSI_CLASS; ++ return 1; ++ } ++ else if (size <= 8) ++ { ++ classes[0] = X86_64_INTEGER_CLASS; ++ return 1; ++ } ++ else if (size <= 12) ++ { ++ classes[0] = X86_64_INTEGER_CLASS; ++ classes[1] = X86_64_INTEGERSI_CLASS; ++ return 2; ++ } ++ else if (size <= 16) ++ { ++ classes[0] = classes[1] = X86_64_INTEGERSI_CLASS; ++ return 2; ++ } ++ else ++ FFI_ASSERT (0); ++ } ++#endif ++ ++ case FFI_TYPE_FLOAT: ++ if (byte_offset == 0) ++ classes[0] = X86_64_SSESF_CLASS; ++ else ++ classes[0] = X86_64_SSE_CLASS; ++ ++ return 1; ++ ++ case FFI_TYPE_DOUBLE: ++ classes[0] = X86_64_SSEDF_CLASS; ++ return 1; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ classes[0] = X86_64_X87_CLASS; ++ classes[1] = X86_64_X87UP_CLASS; ++ return 2; ++ ++ case FFI_TYPE_STRUCT: ++ { ++ ffi_type** ptr; ++ int i; ++ enum x86_64_reg_class subclasses[MAX_CLASSES]; ++ const int UNITS_PER_WORD = 8; ++ int words = ++ (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; ++ ++ /* If the struct is larger than 16 bytes, pass it on the stack. */ ++ if (type->size > 16) ++ return 0; ++ ++ for (i = 0; i < words; i++) ++ classes[i] = X86_64_NO_CLASS; ++ ++ /* Merge the fields of structure. */ ++ for (ptr = type->elements; *ptr != NULL; ptr++) ++ { ++ byte_offset = ALIGN(byte_offset, (*ptr)->alignment); ++ ++ int num = classify_argument(*ptr, subclasses, byte_offset % 8); ++ ++ if (num == 0) ++ return 0; ++ ++ int pos = byte_offset / 8; ++ ++ for (i = 0; i < num; i++) ++ { ++ classes[i + pos] = ++ merge_classes(subclasses[i], classes[i + pos]); ++ } ++ ++ byte_offset += (*ptr)->size; ++ } ++ ++ if (words > 2) ++ { ++ /* When size > 16 bytes, if the first one isn't ++ X86_64_SSE_CLASS or any other ones aren't ++ X86_64_SSEUP_CLASS, everything should be passed in ++ memory. */ ++ if (classes[0] != X86_64_SSE_CLASS) ++ return 0; ++ ++ for (i = 1; i < words; i++) ++ if (classes[i] != X86_64_SSEUP_CLASS) ++ return 0; ++ } ++ ++ ++ /* Final merger cleanup. */ ++ for (i = 0; i < words; i++) ++ { ++ /* If one class is MEMORY, everything should be passed in ++ memory. */ ++ if (classes[i] == X86_64_MEMORY_CLASS) ++ return 0; ++ ++ /* The X86_64_SSEUP_CLASS should be always preceded by ++ X86_64_SSE_CLASS. */ ++ if (classes[i] == X86_64_SSEUP_CLASS ++ && classes[i - 1] != X86_64_SSE_CLASS ++ && classes[i - 1] != X86_64_SSEUP_CLASS) ++ { ++ FFI_ASSERT(i != 0); ++ classes[i] = X86_64_SSE_CLASS; ++ } ++ ++ /* X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS. */ ++ if (classes[i] == X86_64_X87UP_CLASS ++ && classes[i - 1] != X86_64_X87_CLASS) ++ { ++ FFI_ASSERT(i != 0); ++ classes[i] = X86_64_SSE_CLASS; ++ } ++ } ++ ++ return words; ++ } ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ ++ return 0; /* Never reached. */ ++} ++ ++/* Examine the argument and return set number of register required in each ++ class. Return zero if parameter should be passed in memory, otherwise ++ the number of registers. */ ++static int ++examine_argument( ++ ffi_type* type, ++ enum x86_64_reg_class classes[MAX_CLASSES], ++ _Bool in_return, ++ int* pngpr, ++ int* pnsse) ++{ ++ int n = classify_argument(type, classes, 0); ++ int ngpr = 0; ++ int nsse = 0; ++ int i; ++ ++ if (n == 0) ++ return 0; ++ ++ for (i = 0; i < n; ++i) ++ { ++ switch (classes[i]) ++ { ++ case X86_64_INTEGER_CLASS: ++ case X86_64_INTEGERSI_CLASS: ++ ngpr++; ++ break; ++ ++ case X86_64_SSE_CLASS: ++ case X86_64_SSESF_CLASS: ++ case X86_64_SSEDF_CLASS: ++ nsse++; ++ break; ++ ++ case X86_64_NO_CLASS: ++ case X86_64_SSEUP_CLASS: ++ break; ++ ++ case X86_64_X87_CLASS: ++ case X86_64_X87UP_CLASS: ++ case X86_64_COMPLEX_X87_CLASS: ++ return in_return != 0; ++ ++ default: ++ abort(); ++ } ++ } ++ ++ *pngpr = ngpr; ++ *pnsse = nsse; ++ ++ return n; ++} ++ ++/* Perform machine dependent cif processing. */ ++ffi_status ++ffi_prep_cif_machdep( ++ ffi_cif* cif) ++{ ++ int gprcount = 0; ++ int ssecount = 0; ++ int flags = cif->rtype->type; ++ int i, avn, n, ngpr, nsse; ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ size_t bytes; ++ ++ if (flags != FFI_TYPE_VOID) ++ { ++ n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); ++ ++ if (n == 0) ++ { ++ /* The return value is passed in memory. A pointer to that ++ memory is the first argument. Allocate a register for it. */ ++ gprcount++; ++ ++ /* We don't have to do anything in asm for the return. */ ++ flags = FFI_TYPE_VOID; ++ } ++ else if (flags == FFI_TYPE_STRUCT) ++ { ++ /* Mark which registers the result appears in. */ ++ _Bool sse0 = SSE_CLASS_P(classes[0]); ++ _Bool sse1 = n == 2 && SSE_CLASS_P(classes[1]); ++ ++ if (sse0 && !sse1) ++ flags |= 1 << 8; ++ else if (!sse0 && sse1) ++ flags |= 1 << 9; ++ else if (sse0 && sse1) ++ flags |= 1 << 10; ++ ++ /* Mark the true size of the structure. */ ++ flags |= cif->rtype->size << 12; ++ } ++ } ++ ++ /* Go over all arguments and determine the way they should be passed. ++ If it's in a register and there is space for it, let that be so. If ++ not, add it's size to the stack byte count. */ ++ for (bytes = 0, i = 0, avn = cif->nargs; i < avn; i++) ++ { ++ if (examine_argument(cif->arg_types[i], classes, 0, &ngpr, &nsse) == 0 ++ || gprcount + ngpr > MAX_GPR_REGS ++ || ssecount + nsse > MAX_SSE_REGS) ++ { ++ long align = cif->arg_types[i]->alignment; ++ ++ if (align < 8) ++ align = 8; ++ ++ bytes = ALIGN(bytes, align); ++ bytes += cif->arg_types[i]->size; ++ } ++ else ++ { ++ gprcount += ngpr; ++ ssecount += nsse; ++ } ++ } ++ ++ if (ssecount) ++ flags |= 1 << 11; ++ ++ cif->flags = flags; ++ cif->bytes = bytes; ++ cif->bytes = ALIGN(bytes,8); ++ ++ return FFI_OK; ++} ++ ++void ++ffi_call( ++ ffi_cif* cif, ++ void (*fn)(), ++ void* rvalue, ++ void** avalue) ++{ ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ char* stack; ++ char* argp; ++ ffi_type** arg_types; ++ int gprcount, ssecount, ngpr, nsse, i, avn; ++ _Bool ret_in_memory; ++ RegisterArgs* reg_args; ++ ++ /* Can't call 32-bit mode from 64-bit mode. */ ++ FFI_ASSERT(cif->abi == FFI_UNIX64); ++ ++ /* If the return value is a struct and we don't have a return value ++ address then we need to make one. Note the setting of flags to ++ VOID above in ffi_prep_cif_machdep. */ ++ ret_in_memory = (cif->rtype->type == FFI_TYPE_STRUCT ++ && (cif->flags & 0xff) == FFI_TYPE_VOID); ++ ++ if (rvalue == NULL && ret_in_memory) ++ rvalue = alloca (cif->rtype->size); ++ ++ /* Allocate the space for the arguments, plus 4 words of temp space. */ ++ stack = alloca(sizeof(RegisterArgs) + cif->bytes + 4 * 8); ++ reg_args = (RegisterArgs*)stack; ++ argp = stack + sizeof(RegisterArgs); ++ ++ gprcount = ssecount = 0; ++ ++ /* If the return value is passed in memory, add the pointer as the ++ first integer argument. */ ++ if (ret_in_memory) ++ reg_args->gpr[gprcount++] = (long) rvalue; ++ ++ avn = cif->nargs; ++ arg_types = cif->arg_types; ++ ++ for (i = 0; i < avn; ++i) ++ { ++ size_t size = arg_types[i]->size; ++ int n; ++ ++ n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); ++ ++ if (n == 0 ++ || gprcount + ngpr > MAX_GPR_REGS ++ || ssecount + nsse > MAX_SSE_REGS) ++ { ++ long align = arg_types[i]->alignment; ++ ++ /* Stack arguments are *always* at least 8 byte aligned. */ ++ if (align < 8) ++ align = 8; ++ ++ /* Pass this argument in memory. */ ++ argp = (void *) ALIGN (argp, align); ++ memcpy (argp, avalue[i], size); ++ argp += size; ++ } ++ else ++ { /* The argument is passed entirely in registers. */ ++ char *a = (char *) avalue[i]; ++ int j; ++ ++ for (j = 0; j < n; j++, a += 8, size -= 8) ++ { ++ switch (classes[j]) ++ { ++ case X86_64_INTEGER_CLASS: ++ case X86_64_INTEGERSI_CLASS: ++ reg_args->gpr[gprcount] = 0; ++ switch (arg_types[i]->type) { ++ case FFI_TYPE_SINT8: ++ { ++ int8_t shortval = *(int8_t*)a; ++ int64_t actval = (int64_t)shortval; ++ reg_args->gpr[gprcount] = actval; ++ /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ ++ break; ++ } ++ ++ case FFI_TYPE_SINT16: ++ { ++ int16_t shortval = *(int16_t*)a; ++ int64_t actval = (int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ case FFI_TYPE_SINT32: ++ { ++ int32_t shortval = *(int32_t*)a; ++ int64_t actval = (int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ case FFI_TYPE_UINT8: ++ { ++ u_int8_t shortval = *(u_int8_t*)a; ++ u_int64_t actval = (u_int64_t)shortval; ++ /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ ++ reg_args->gpr[gprcount] = actval; ++ break; ++ } ++ ++ case FFI_TYPE_UINT16: ++ { ++ u_int16_t shortval = *(u_int16_t*)a; ++ u_int64_t actval = (u_int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ case FFI_TYPE_UINT32: ++ { ++ u_int32_t shortval = *(u_int32_t*)a; ++ u_int64_t actval = (u_int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ default: ++ //memcpy (®_args->gpr[gprcount], a, size < 8 ? size : 8); ++ reg_args->gpr[gprcount] = *(int64_t*)a; ++ } ++ gprcount++; ++ break; ++ ++ case X86_64_SSE_CLASS: ++ case X86_64_SSEDF_CLASS: ++ reg_args->sse[ssecount++] = *(UINT64 *) a; ++ break; ++ ++ case X86_64_SSESF_CLASS: ++ reg_args->sse[ssecount++] = *(UINT32 *) a; ++ break; ++ ++ default: ++ abort(); ++ } ++ } ++ } ++ } ++ ++ ffi_call_unix64 (stack, cif->bytes + sizeof(RegisterArgs), ++ cif->flags, rvalue, fn, ssecount); ++} ++ ++extern void ffi_closure_unix64(void); ++ ++ffi_status ++ffi_prep_closure( ++ ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*, void*, void**, void*), ++ void* user_data) ++{ ++ if (cif->abi != FFI_UNIX64) ++ return FFI_BAD_ABI; ++ ++ volatile unsigned short* tramp = ++ (volatile unsigned short*)&closure->tramp[0]; ++ ++ tramp[0] = 0xbb49; /* mov , %r11 */ ++ *(void* volatile*)&tramp[1] = ffi_closure_unix64; ++ tramp[5] = 0xba49; /* mov , %r10 */ ++ *(void* volatile*)&tramp[6] = closure; ++ ++ /* Set the carry bit if the function uses any sse registers. ++ This is clc or stc, together with the first byte of the jmp. */ ++ tramp[10] = cif->flags & (1 << 11) ? 0x49f9 : 0x49f8; ++ tramp[11] = 0xe3ff; /* jmp *%r11 */ ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ ++ return FFI_OK; ++} ++ ++#pragma clang diagnostic push ++#pragma clang diagnostic ignored "-Wmissing-prototypes" ++int ++ffi_closure_unix64_inner( ++ ffi_closure* closure, ++ void* rvalue, ++ RegisterArgs* reg_args, ++ char* argp) ++#pragma clang diagnostic pop ++{ ++ ffi_cif* cif = closure->cif; ++ void** avalue = alloca(cif->nargs * sizeof(void *)); ++ ffi_type** arg_types; ++ long i, avn; ++ int gprcount = 0; ++ int ssecount = 0; ++ int ngpr, nsse; ++ int ret; ++ ++ ret = cif->rtype->type; ++ ++ if (ret != FFI_TYPE_VOID) ++ { ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ int n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); ++ ++ if (n == 0) ++ { ++ /* The return value goes in memory. Arrange for the closure ++ return value to go directly back to the original caller. */ ++ rvalue = (void *) reg_args->gpr[gprcount++]; ++ ++ /* We don't have to do anything in asm for the return. */ ++ ret = FFI_TYPE_VOID; ++ } ++ else if (ret == FFI_TYPE_STRUCT && n == 2) ++ { ++ /* Mark which register the second word of the structure goes in. */ ++ _Bool sse0 = SSE_CLASS_P (classes[0]); ++ _Bool sse1 = SSE_CLASS_P (classes[1]); ++ ++ if (!sse0 && sse1) ++ ret |= 1 << 8; ++ else if (sse0 && !sse1) ++ ret |= 1 << 9; ++ } ++ } ++ ++ avn = cif->nargs; ++ arg_types = cif->arg_types; ++ ++ for (i = 0; i < avn; ++i) ++ { ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ int n; ++ ++ n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); ++ ++ if (n == 0 ++ || gprcount + ngpr > MAX_GPR_REGS ++ || ssecount + nsse > MAX_SSE_REGS) ++ { ++ long align = arg_types[i]->alignment; ++ ++ /* Stack arguments are *always* at least 8 byte aligned. */ ++ if (align < 8) ++ align = 8; ++ ++ /* Pass this argument in memory. */ ++ argp = (void *) ALIGN (argp, align); ++ avalue[i] = argp; ++ argp += arg_types[i]->size; ++ } ++ ++#if !defined(X86_DARWIN) ++ /* If the argument is in a single register, or two consecutive ++ registers, then we can use that address directly. */ ++ else if (n == 1 || (n == 2 && ++ SSE_CLASS_P (classes[0]) == SSE_CLASS_P (classes[1]))) ++ { ++ // The argument is in a single register. ++ if (SSE_CLASS_P (classes[0])) ++ { ++ avalue[i] = ®_args->sse[ssecount]; ++ ssecount += n; ++ } ++ else ++ { ++ avalue[i] = ®_args->gpr[gprcount]; ++ gprcount += n; ++ } ++ } ++#endif ++ ++ /* Otherwise, allocate space to make them consecutive. */ ++ else ++ { ++ char *a = alloca (16); ++ int j; ++ ++ avalue[i] = a; ++ ++ for (j = 0; j < n; j++, a += 8) ++ { ++ if (SSE_CLASS_P (classes[j])) ++ memcpy (a, ®_args->sse[ssecount++], 8); ++ else ++ memcpy (a, ®_args->gpr[gprcount++], 8); ++ } ++ } ++ } ++ ++ /* Invoke the closure. */ ++ closure->fun (cif, rvalue, avalue, closure->user_data); ++ ++ /* Tell assembly how to perform return type promotions. */ ++ return ret; ++} ++ ++#endif /* __x86_64__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c +new file mode 100644 +index 0000000..706ea0f +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c +@@ -0,0 +1,438 @@ ++#ifdef __i386__ ++/* ----------------------------------------------------------------------- ++ ffi.c - Copyright (c) 1996, 1998, 1999, 2001 Red Hat, Inc. ++ Copyright (c) 2002 Ranjit Mathew ++ Copyright (c) 2002 Bo Thorsen ++ Copyright (c) 2002 Roger Sayle ++ ++ x86 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++ ++/* ffi_prep_args is called by the assembly routine once stack space ++ has been allocated for the function's arguments */ ++ ++void ffi_prep_args(char *stack, extended_cif *ecif); ++ ++void ffi_prep_args(char *stack, extended_cif *ecif) ++{ ++ register unsigned int i; ++ register void **p_argv; ++ register char *argp; ++ register ffi_type **p_arg; ++ ++ argp = stack; ++ ++ if (ecif->cif->flags == FFI_TYPE_STRUCT) ++ { ++ *(void **) argp = ecif->rvalue; ++ argp += 4; ++ } ++ ++ p_argv = ecif->avalue; ++ ++ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; ++ i != 0; ++ i--, p_arg++) ++ { ++ size_t z; ++ ++ /* Align if necessary */ ++ if ((sizeof(int) - 1) & (unsigned) argp) ++ argp = (char *) ALIGN(argp, sizeof(int)); ++ ++ z = (*p_arg)->size; ++ if (z < sizeof(int)) ++ { ++ z = sizeof(int); ++ switch ((*p_arg)->type) ++ { ++ case FFI_TYPE_SINT8: ++ *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT8: ++ *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_SINT16: ++ *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT16: ++ *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_SINT32: ++ *(signed int *) argp = (signed int)*(SINT32 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT32: ++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ } ++ else ++ { ++ memcpy(argp, *p_argv, z); ++ } ++ p_argv++; ++ argp += z; ++ } ++ ++ return; ++} ++ ++/* Perform machine dependent cif processing */ ++ffi_status ffi_prep_cif_machdep(ffi_cif *cif) ++{ ++ /* Set the return type flag */ ++ switch (cif->rtype->type) ++ { ++ case FFI_TYPE_VOID: ++#ifdef X86 ++ case FFI_TYPE_STRUCT: ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_SINT16: ++#endif ++ ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ case FFI_TYPE_LONGDOUBLE: ++ cif->flags = (unsigned) cif->rtype->type; ++ break; ++ ++ case FFI_TYPE_UINT64: ++ cif->flags = FFI_TYPE_SINT64; ++ break; ++ ++#ifndef X86 ++ case FFI_TYPE_STRUCT: ++ if (cif->rtype->size == 1) ++ { ++ cif->flags = FFI_TYPE_SINT8; /* same as char size */ ++ } ++ else if (cif->rtype->size == 2) ++ { ++ cif->flags = FFI_TYPE_SINT16; /* same as short size */ ++ } ++ else if (cif->rtype->size == 4) ++ { ++ cif->flags = FFI_TYPE_INT; /* same as int type */ ++ } ++ else if (cif->rtype->size == 8) ++ { ++ cif->flags = FFI_TYPE_SINT64; /* same as int64 type */ ++ } ++ else ++ { ++ cif->flags = FFI_TYPE_STRUCT; ++ } ++ break; ++#endif ++ ++ default: ++ cif->flags = FFI_TYPE_INT; ++ break; ++ } ++ ++#ifdef X86_DARWIN ++ cif->bytes = (cif->bytes + 15) & ~0xF; ++#endif ++ ++ return FFI_OK; ++} ++ ++extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, ++ unsigned, unsigned, unsigned *, void (*fn)()); ++ ++#ifdef X86_WIN32 ++extern void ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, ++ unsigned, unsigned, unsigned *, void (*fn)()); ++ ++#endif /* X86_WIN32 */ ++ ++void ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue) ++{ ++ extended_cif ecif; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return */ ++ /* value address then we need to make one */ ++ ++ if ((rvalue == NULL) && ++ (cif->flags == FFI_TYPE_STRUCT)) ++ { ++ ecif.rvalue = alloca(cif->rtype->size); ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ ++ switch (cif->abi) ++ { ++ case FFI_SYSV: ++ ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, ++ fn); ++ break; ++#ifdef X86_WIN32 ++ case FFI_STDCALL: ++ ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ break; ++#endif /* X86_WIN32 */ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++ ++/** private members **/ ++ ++static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, ++ void** args, ffi_cif* cif); ++void FFI_HIDDEN ffi_closure_SYSV (ffi_closure *) ++__attribute__ ((regparm(1))); ++unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *) ++__attribute__ ((regparm(1))); ++void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *) ++__attribute__ ((regparm(1))); ++ ++/* This function is jumped to by the trampoline */ ++ ++unsigned int FFI_HIDDEN ++ffi_closure_SYSV_inner (closure, respp, args) ++ffi_closure *closure; ++void **respp; ++void *args; ++{ ++ // our various things... ++ ffi_cif *cif; ++ void **arg_area; ++ ++ cif = closure->cif; ++ arg_area = (void**) alloca (cif->nargs * sizeof (void*)); ++ ++ /* this call will initialize ARG_AREA, such that each ++ * element in that array points to the corresponding ++ * value on the stack; and if the function returns ++ * a structure, it will re-set RESP to point to the ++ * structure return address. */ ++ ++ ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); ++ ++ (closure->fun) (cif, *respp, arg_area, closure->user_data); ++ ++ return cif->flags; ++} ++ ++static void ++ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue, ++ ffi_cif *cif) ++{ ++ register unsigned int i; ++ register void **p_argv; ++ register char *argp; ++ register ffi_type **p_arg; ++ ++ argp = stack; ++ ++ if ( cif->flags == FFI_TYPE_STRUCT ) { ++ *rvalue = *(void **) argp; ++ argp += 4; ++ } ++ ++ p_argv = avalue; ++ ++ for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) ++ { ++ size_t z; ++ ++ /* Align if necessary */ ++ if ((sizeof(int) - 1) & (unsigned) argp) { ++ argp = (char *) ALIGN(argp, sizeof(int)); ++ } ++ ++ z = (*p_arg)->size; ++ ++ /* because we're little endian, this is what it turns into. */ ++ ++ *p_argv = (void*) argp; ++ ++ p_argv++; ++ argp += z; ++ } ++ ++ return; ++} ++ ++/* How to make a trampoline. Derived from gcc/config/i386/i386.c. */ ++ ++#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ ++({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ ++unsigned int __fun = (unsigned int)(FUN); \ ++unsigned int __ctx = (unsigned int)(CTX); \ ++unsigned int __dis = __fun - (__ctx + FFI_TRAMPOLINE_SIZE); \ ++*(unsigned char*) &__tramp[0] = 0xb8; \ ++*(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \ ++*(unsigned char *) &__tramp[5] = 0xe9; \ ++*(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \ ++}) ++ ++ ++/* the cif must already be prep'ed */ ++ffi_status ++ffi_prep_closure (ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,void**,void*), ++ void *user_data) ++{ ++ if (cif->abi != FFI_SYSV) ++ return FFI_BAD_ABI; ++ ++ FFI_INIT_TRAMPOLINE (&closure->tramp[0], \ ++ &ffi_closure_SYSV, \ ++ (void*)closure); ++ ++ closure->cif = cif; ++ closure->user_data = user_data; ++ closure->fun = fun; ++ ++ return FFI_OK; ++} ++ ++/* ------- Native raw API support -------------------------------- */ ++ ++#if !FFI_NO_RAW_API ++ ++ffi_status ++ffi_prep_raw_closure_loc (ffi_raw_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), ++ void *user_data, ++ void *codeloc) ++{ ++ int i; ++ ++ FFI_ASSERT (cif->abi == FFI_SYSV); ++ ++ // we currently don't support certain kinds of arguments for raw ++ // closures. This should be implemented by a separate assembly language ++ // routine, since it would require argument processing, something we ++ // don't do now for performance. ++ ++ for (i = cif->nargs-1; i >= 0; i--) ++ { ++ FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_STRUCT); ++ FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_LONGDOUBLE); ++ } ++ ++ ++ FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_raw_SYSV, ++ codeloc); ++ ++ closure->cif = cif; ++ closure->user_data = user_data; ++ closure->fun = fun; ++ ++ return FFI_OK; ++} ++ ++static void ++ffi_prep_args_raw(char *stack, extended_cif *ecif) ++{ ++ memcpy (stack, ecif->avalue, ecif->cif->bytes); ++} ++ ++/* we borrow this routine from libffi (it must be changed, though, to ++ * actually call the function passed in the first argument. as of ++ * libffi-1.20, this is not the case.) ++ */ ++ ++extern void ++ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, unsigned, ++ unsigned, unsigned *, void (*fn)()); ++ ++#ifdef X86_WIN32 ++extern void ++ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, unsigned, ++ unsigned, unsigned *, void (*fn)()); ++#endif /* X86_WIN32 */ ++ ++void ++ffi_raw_call(ffi_cif *cif, void (*fn)(), void *rvalue, ffi_raw *fake_avalue) ++{ ++ extended_cif ecif; ++ void **avalue = (void **)fake_avalue; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return */ ++ /* value address then we need to make one */ ++ ++ if ((rvalue == NULL) && ++ (cif->rtype->type == FFI_TYPE_STRUCT)) ++ { ++ ecif.rvalue = alloca(cif->rtype->size); ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ ++ switch (cif->abi) ++ { ++ case FFI_SYSV: ++ ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ break; ++#ifdef X86_WIN32 ++ case FFI_STDCALL: ++ ffi_call_STDCALL(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ break; ++#endif /* X86_WIN32 */ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++#endif ++#endif // __i386__ +diff -r -u ./setup.py ./setup.py +index 46b92fe..2bf6b4b 100644 +--- ./setup.py ++++ ./setup.py +@@ -98,8 +98,14 @@ class PyBuildExt(build_ext): + self.detect_modules() + + # Remove modules that are present on the disabled list +- self.extensions = [ext for ext in self.extensions +- if ext.name not in disabled_module_list] ++ extensions = [ext for ext in self.extensions ++ if ext.name not in disabled_module_list] ++ # move ctypes to the end, it depends on other modules ++ ext_map = dict((ext.name, i) for i, ext in enumerate(extensions)) ++ if "_ctypes" in ext_map: ++ ctypes = extensions.pop(ext_map["_ctypes"]) ++ extensions.append(ctypes) ++ self.extensions = extensions + + # Fix up the autodetected modules, prefixing all the source files + # with Modules/ and adding Python's include directory to the path. +@@ -1330,9 +1336,39 @@ class PyBuildExt(build_ext): + # *** Uncomment these for TOGL extension only: + # -lGL -lGLU -lXext -lXmu \ + ++ def configure_ctypes_darwin(self, ext): ++ # Darwin (OS X) uses preconfigured files, in ++ # the Modules/_ctypes/libffi_osx directory. ++ srcdir = sysconfig.get_config_var('srcdir') ++ ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', ++ '_ctypes', 'libffi_osx')) ++ sources = [os.path.join(ffi_srcdir, p) ++ for p in ['ffi.c', ++ 'x86/darwin64.S', ++ 'x86/x86-darwin.S', ++ 'x86/x86-ffi_darwin.c', ++ 'x86/x86-ffi64.c', ++ 'powerpc/ppc-darwin.S', ++ 'powerpc/ppc-darwin_closure.S', ++ 'powerpc/ppc-ffi_darwin.c', ++ 'powerpc/ppc64-darwin_closure.S', ++ ]] ++ ++ # Add .S (preprocessed assembly) to C compiler source extensions. ++ self.compiler.src_extensions.append('.S') ++ ++ include_dirs = [os.path.join(ffi_srcdir, 'include'), ++ os.path.join(ffi_srcdir, 'powerpc')] ++ ext.include_dirs.extend(include_dirs) ++ ext.sources.extend(sources) ++ return True ++ + def configure_ctypes(self, ext): + if not self.use_system_libffi: +- (srcdir,) = sysconfig.get_config_vars('srcdir') ++ if sys.platform == 'darwin': ++ return self.configure_ctypes_darwin(ext) ++ ++ srcdir = sysconfig.get_config_var('srcdir') + ffi_builddir = os.path.join(self.build_temp, 'libffi') + ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', + '_ctypes', 'libffi')) +@@ -1347,7 +1383,10 @@ class PyBuildExt(build_ext): + ffi_configfile): + from distutils.dir_util import mkpath + mkpath(ffi_builddir) +- config_args = [] ++ config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split() ++ if (('--host=' in arg) or ('--build=' in arg))] ++ if not self.verbose: ++ config_args.append("-q") + + # Pass empty CFLAGS because we'll just append the resulting + # CFLAGS to Python's; -g or -O2 is to be avoided. +@@ -1367,10 +1406,12 @@ class PyBuildExt(build_ext): + self.compiler.src_extensions.append('.S') + + include_dirs = [os.path.join(ffi_builddir, 'include'), +- ffi_builddir, ffi_srcdir] ++ ffi_builddir, ++ os.path.join(ffi_srcdir, 'src')] + extra_compile_args = fficonfig['ffi_cflags'].split() + +- ext.sources.extend(fficonfig['ffi_sources']) ++ ext.sources.extend(os.path.join(ffi_srcdir, f) for f in ++ fficonfig['ffi_sources']) + ext.include_dirs.extend(include_dirs) + ext.extra_compile_args.extend(extra_compile_args) + return True +@@ -1390,6 +1431,7 @@ class PyBuildExt(build_ext): + + if sys.platform == 'darwin': + sources.append('_ctypes/darwin/dlfcn_simple.c') ++ extra_compile_args.append('-DMACOSX') + include_dirs.append('_ctypes/darwin') + # XXX Is this still needed? + ## extra_link_args.extend(['-read_only_relocs', 'warning']) +@@ -1419,7 +1461,14 @@ class PyBuildExt(build_ext): + if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"): + return + +- ffi_inc = find_file('ffi.h', [], inc_dirs) ++ if sys.platform == 'darwin': ++ # OS X 10.5 comes with libffi.dylib; the include files are ++ # in /usr/include/ffi ++ inc_dirs.append('/usr/include/ffi') ++ ++ ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] ++ if not ffi_inc or ffi_inc[0] == '': ++ ffi_inc = find_file('ffi.h', [], inc_dirs) + if ffi_inc is not None: + ffi_h = ffi_inc[0] + '/ffi.h' + fp = open(ffi_h) diff --git a/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/005_osx_failed_modules.patch b/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/005_osx_failed_modules.patch new file mode 100644 index 0000000..5ccfe9c --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/005_osx_failed_modules.patch @@ -0,0 +1,124 @@ +diff -r -u ./Mac/Modules/cg/_CGmodule.c ./Mac/Modules/cg/_CGmodule.c +index 8115614..e36fce9 100755 +--- ./Mac/Modules/cg/_CGmodule.c ++++ ./Mac/Modules/cg/_CGmodule.c +@@ -1025,6 +1025,7 @@ static PyObject *CGContextRefObj_CGContextSetShouldAntialias(CGContextRefObject + return _res; + } + ++#ifndef __LP64__ + static PyObject *CGContextRefObj_SyncCGContextOriginWithPort(CGContextRefObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1055,6 +1056,7 @@ static PyObject *CGContextRefObj_ClipCGContextToRegion(CGContextRefObject *_self + _res = Py_None; + return _res; + } ++#endif + + static PyMethodDef CGContextRefObj_methods[] = { + {"CGContextSaveGState", (PyCFunction)CGContextRefObj_CGContextSaveGState, 1, +@@ -1173,10 +1175,12 @@ static PyMethodDef CGContextRefObj_methods[] = { + PyDoc_STR("() -> None")}, + {"CGContextSetShouldAntialias", (PyCFunction)CGContextRefObj_CGContextSetShouldAntialias, 1, + PyDoc_STR("(int shouldAntialias) -> None")}, ++#ifndef __LP64__ + {"SyncCGContextOriginWithPort", (PyCFunction)CGContextRefObj_SyncCGContextOriginWithPort, 1, + PyDoc_STR("(CGrafPtr port) -> None")}, + {"ClipCGContextToRegion", (PyCFunction)CGContextRefObj_ClipCGContextToRegion, 1, + PyDoc_STR("(Rect portRect, RgnHandle region) -> None")}, ++#endif + {NULL, NULL, 0} + }; + +@@ -1254,6 +1258,7 @@ PyTypeObject CGContextRef_Type = { + /* ------------------ End object type CGContextRef ------------------ */ + + ++#ifndef __LP64__ + static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1271,10 +1276,13 @@ static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) + return _res; + + } ++#endif + + static PyMethodDef CG_methods[] = { ++#ifndef __LP64__ + {"CreateCGContextForPort", (PyCFunction)CG_CreateCGContextForPort, 1, + PyDoc_STR("(CGrafPtr) -> CGContextRef")}, ++#endif + {NULL, NULL, 0} + }; + +diff -r -u ./Modules/_curses_panel.c ./Modules/_curses_panel.c +index 0acf3fd..1728b59 100644 +--- ./Modules/_curses_panel.c ++++ ./Modules/_curses_panel.c +@@ -56,7 +56,7 @@ typedef struct { + + PyTypeObject PyCursesPanel_Type; + +-#define PyCursesPanel_Check(v) ((v)->ob_type == &PyCursesPanel_Type) ++#define PyCursesPanel_Check(v) (Py_TYPE(v) == &PyCursesPanel_Type) + + /* Some helper functions. The problem is that there's always a window + associated with a panel. To ensure that Python's GC doesn't pull +@@ -178,12 +178,13 @@ PyCursesPanel_New(PANEL *pan, PyCursesWindowObject *wo) + po = PyObject_NEW(PyCursesPanelObject, &PyCursesPanel_Type); + if (po == NULL) return NULL; + po->pan = pan; +- po->wo = wo; +- Py_INCREF(wo); + if (insert_lop(po) < 0) { +- PyObject_DEL(po); +- return NULL; ++ po->wo = NULL; ++ Py_DECREF(po); ++ return NULL; + } ++ po->wo = wo; ++ Py_INCREF(wo); + return (PyObject *)po; + } + +@@ -191,8 +192,10 @@ static void + PyCursesPanel_Dealloc(PyCursesPanelObject *po) + { + (void)del_panel(po->pan); +- Py_DECREF(po->wo); +- remove_lop(po); ++ if (po->wo != NULL) { ++ Py_DECREF(po->wo); ++ remove_lop(po); ++ } + PyObject_DEL(po); + } + +@@ -338,11 +341,10 @@ PyCursesPanel_GetAttr(PyCursesPanelObject *self, char *name) + /* -------------------------------------------------------*/ + + PyTypeObject PyCursesPanel_Type = { +- PyObject_HEAD_INIT(NULL) +- 0, /*ob_size*/ +- "_curses_panel.curses panel", /*tp_name*/ +- sizeof(PyCursesPanelObject), /*tp_basicsize*/ +- 0, /*tp_itemsize*/ ++ PyVarObject_HEAD_INIT(NULL, 0) ++ "_curses_panel.curses panel", /*tp_name*/ ++ sizeof(PyCursesPanelObject), /*tp_basicsize*/ ++ 0, /*tp_itemsize*/ + /* methods */ + (destructor)PyCursesPanel_Dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ +@@ -458,7 +460,7 @@ init_curses_panel(void) + PyObject *m, *d, *v; + + /* Initialize object type */ +- PyCursesPanel_Type.ob_type = &PyType_Type; ++ Py_TYPE(&PyCursesPanel_Type) = &PyType_Type; + + import_curses(); + diff --git a/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/000_patch-setup.py.diff new file mode 100644 index 0000000..ffe4b0d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/000_patch-setup.py.diff @@ -0,0 +1,45 @@ +--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 ++++ setup.py 2011-07-07 19:25:04.548416377 +0900 +@@ -13,6 +13,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -242,10 +243,34 @@ + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ fp = open(tmpfile) ++ multiarch_path_component = fp.readline().strip() ++ fp.close() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. diff --git a/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/001_patch-svnversion.patch b/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/001_patch-svnversion.patch new file mode 100644 index 0000000..5ee39e9 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/001_patch-svnversion.patch @@ -0,0 +1,42 @@ +--- configure.in ++++ configure.in +@@ -767,7 +767,7 @@ + then + SVNVERSION="svnversion \$(srcdir)" + else +- SVNVERSION="echo exported" ++ SVNVERSION="echo Unversioned directory" + fi + + case $MACHDEP in +--- Makefile.pre.in ++++ Makefile.pre.in +@@ -501,7 +501,7 @@ + $(SIGNAL_OBJS) \ + $(MODOBJS) \ + $(srcdir)/Modules/getbuildinfo.c +- $(CC) -c $(PY_CFLAGS) -DSVNVERSION=\"`LC_ALL=C $(SVNVERSION)`\" -o $@ $(srcdir)/Modules/getbuildinfo.c ++ $(CC) -c $(PY_CFLAGS) -DSVNVERSION="\"`LC_ALL=C $(SVNVERSION)`\"" -o $@ $(srcdir)/Modules/getbuildinfo.c + + Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile + $(CC) -c $(PY_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ +--- Modules/getbuildinfo.c ++++ Modules/getbuildinfo.c +@@ -48,5 +48,5 @@ + static const char svnversion[] = SVNVERSION; + if (svnversion[0] != '$') + return svnversion; /* it was interpolated, or passed on command line */ +- return "exported"; ++ return "Unversioned directory"; + } +--- Python/sysmodule.c ++++ Python/sysmodule.c +@@ -1161,7 +1161,7 @@ + + + svnversion = _Py_svnversion(); +- if (strcmp(svnversion, "exported") != 0) ++ if (strcmp(svnversion, "Unversioned directory") != 0 && strcmp(svnversion, "exported") != 0) + svn_revision = svnversion; + else if (istag) { + len = strlen(_patchlevel_revision); diff --git a/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/002_darwin_c_source.patch b/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/002_darwin_c_source.patch new file mode 100644 index 0000000..8cef44a --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/002_darwin_c_source.patch @@ -0,0 +1,166 @@ +diff -r -u ./configure ../Python-2.5/configure +--- ./configure 2006-09-05 11:54:42.000000000 +0900 ++++ ../Python-2.5/configure 2013-07-19 15:27:46.000000000 +0900 +@@ -1396,6 +1396,16 @@ + _ACEOF + + ++# The later defininition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables ++# certain features on Mac OS X, so we need _DARWIN_C_SOURCE to re-enable ++# them. ++ ++cat >>confdefs.h <<\_ACEOF ++#define _DARWIN_C_SOURCE 1 ++_ACEOF ++ ++ ++ + define_xopen_source=yes + + # Arguments passed to configure. +@@ -3885,11 +3895,110 @@ + ;; + # is there any other compiler on Darwin besides gcc? + Darwin*) +- BASECFLAGS="$BASECFLAGS -Wno-long-double -no-cpp-precomp -mno-fused-madd" ++ # -Wno-long-double, -no-cpp-precomp, and -mno-fused-madd ++ # used to be here, but non-Apple gcc doesn't accept them. ++ if test "${CC}" = gcc ++ then ++ { echo "$as_me:${as_lineno-$LINENO}: checking which compiler should be used" >&5 ++echo -n "checking which compiler should be used... " >&6; } ++ case "${UNIVERSALSDK}" in ++ */MacOSX10.4u.sdk) ++ # Build using 10.4 SDK, force usage of gcc when the ++ # compiler is gcc, otherwise the user will get very ++ # confusing error messages when building on OSX 10.6 ++ CC=gcc-4.0 ++ CPP=cpp-4.0 ++ ;; ++ esac ++ { echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 ++echo "$CC" >&6; } ++ fi ++ ++ + if test "${enable_universalsdk}"; then +- BASECFLAGS="-arch ppc -arch i386 -isysroot ${UNIVERSALSDK} ${BASECFLAGS}" ++ UNIVERSAL_ARCH_FLAGS="" ++ if test "$UNIVERSAL_ARCHS" = "32-bit" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch ppc -arch i386" ++ ARCH_RUN_32BIT="" ++ LIPO_32BIT_FLAGS="" ++ elif test "$UNIVERSAL_ARCHS" = "64-bit" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64" ++ LIPO_32BIT_FLAGS="" ++ ARCH_RUN_32BIT="true" ++ ++ elif test "$UNIVERSAL_ARCHS" = "all" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64" ++ LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" ++ ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" ++ ++ elif test "$UNIVERSAL_ARCHS" = "intel" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64" ++ LIPO_32BIT_FLAGS="-extract i386" ++ ARCH_RUN_32BIT="/usr/bin/arch -i386" ++ ++ elif test "$UNIVERSAL_ARCHS" = "3-way" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch x86_64" ++ LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" ++ ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" ++ ++ else ++ as_fn_error $? "proper usage is --with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5 ++ ++ fi ++ ++ ++ CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" ++ if test "${UNIVERSALSDK}" != "/" ++ then ++ CFLAGS="-isysroot ${UNIVERSALSDK} ${CFLAGS}" ++ LDFLAGS="-isysroot ${UNIVERSALSDK} ${LDFLAGS}" ++ CPPFLAGS="-isysroot ${UNIVERSALSDK} ${CPPFLAGS}" ++ fi + fi + ++ # Calculate the right deployment target for this build. ++ # ++ cur_target=`sw_vers -productVersion | sed 's/\(10\.[0-9]*\).*/\1/'` ++ if test ${cur_target} '>' 10.2 && \ ++ test ${cur_target} '<' 10.6 ++ then ++ cur_target=10.3 ++ if test ${enable_universalsdk}; then ++ if test "${UNIVERSAL_ARCHS}" = "all"; then ++ # Ensure that the default platform for a ++ # 4-way universal build is OSX 10.5, ++ # that's the first OS release where ++ # 4-way builds make sense. ++ cur_target='10.5' ++ ++ elif test "${UNIVERSAL_ARCHS}" = "3-way"; then ++ cur_target='10.5' ++ ++ elif test "${UNIVERSAL_ARCHS}" = "intel"; then ++ cur_target='10.5' ++ ++ elif test "${UNIVERSAL_ARCHS}" = "64-bit"; then ++ cur_target='10.5' ++ fi ++ else ++ if test `/usr/bin/arch` = "i386"; then ++ # On Intel macs default to a deployment ++ # target of 10.4, that's the first OSX ++ # release with Intel support. ++ cur_target="10.4" ++ fi ++ fi ++ fi ++ CONFIGURE_MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET-${cur_target}} ++ ++ # Make sure that MACOSX_DEPLOYMENT_TARGET is set in the ++ # environment with a value that is the same as what we'll use ++ # in the Makefile to ensure that we'll get the same compiler ++ # environment during configure and build time. ++ MACOSX_DEPLOYMENT_TARGET="$CONFIGURE_MACOSX_DEPLOYMENT_TARGET" ++ export MACOSX_DEPLOYMENT_TARGET ++ EXPORT_MACOSX_DEPLOYMENT_TARGET='' ++ + ;; + OSF*) + BASECFLAGS="$BASECFLAGS -mieee" +@@ -10851,7 +10960,7 @@ + if test "${enable_universalsdk}"; then + : + else +- LIBTOOL_CRUFT="${LIBTOOL_CRUFT} -arch_only `arch`" ++ LIBTOOL_CRUFT="${LIBTOOL_CRUFT}" + fi + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; +@@ -10863,7 +10972,7 @@ + else + LIBTOOL_CRUFT="" + fi +- LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs -arch_only `arch`" ++ LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs" + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; + esac +diff -r -u ./pyconfig.h.in ../Python-2.5/pyconfig.h.in +--- ./pyconfig.h.in 2006-07-30 23:09:47.000000000 +0900 ++++ ../Python-2.5/pyconfig.h.in 2013-07-17 23:12:31.000000000 +0900 +@@ -912,6 +912,11 @@ + /* Define on Irix to enable u_int */ + #undef _BSD_TYPES + ++/* Define on Darwin to activate all library features */ ++#ifndef _DARWIN_C_SOURCE ++#define _DARWIN_C_SOURCE ++#endif ++ + /* This must be set to 64 on some systems to enable large file support. */ + #undef _FILE_OFFSET_BITS + diff --git a/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/003_osx_lp64.patch b/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/003_osx_lp64.patch new file mode 100644 index 0000000..fc07fc1 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/003_osx_lp64.patch @@ -0,0 +1,271 @@ +diff -r -u ./Include/pymactoolbox.h ../Python-2.5/Include/pymactoolbox.h +--- ./Include/pymactoolbox.h 2004-11-05 16:02:59.000000000 +0900 ++++ ../Python-2.5/Include/pymactoolbox.h 2013-07-17 23:38:51.000000000 +0900 +@@ -8,7 +8,10 @@ + #endif + + #include ++ ++#ifndef __LP64__ + #include ++#endif /* !__LP64__ */ + + /* + ** Helper routines for error codes and such. +@@ -18,8 +21,11 @@ + PyObject *PyMac_GetOSErrException(void); /* Initialize & return it */ + PyObject *PyErr_Mac(PyObject *, int); /* Exception with a mac error */ + PyObject *PyMac_Error(OSErr); /* Uses PyMac_GetOSErrException */ ++#ifndef __LP64__ + extern OSErr PyMac_GetFullPathname(FSSpec *, char *, int); /* convert + fsspec->path */ ++#endif /* __LP64__ */ ++ + /* + ** These conversion routines are defined in mactoolboxglue.c itself. + */ +@@ -83,8 +89,10 @@ + #endif /* USE_TOOLBOX_OBJECT_GLUE */ + + /* macfs exports */ ++#ifndef __LP64__ + int PyMac_GetFSSpec(PyObject *, FSSpec *); /* argument parser for FSSpec */ + PyObject *PyMac_BuildFSSpec(FSSpec *); /* Convert FSSpec to PyObject */ ++#endif /* !__LP64__ */ + + int PyMac_GetFSRef(PyObject *, FSRef *); /* argument parser for FSRef */ + PyObject *PyMac_BuildFSRef(FSRef *); /* Convert FSRef to PyObject */ +@@ -101,39 +109,54 @@ + extern int CmpInstObj_Convert(PyObject *, ComponentInstance *); + + /* Ctl exports */ ++#ifndef __LP64__ + extern PyObject *CtlObj_New(ControlHandle); + extern int CtlObj_Convert(PyObject *, ControlHandle *); ++#endif /* !__LP64__ */ + + /* Dlg exports */ ++#ifndef __LP64__ + extern PyObject *DlgObj_New(DialogPtr); + extern int DlgObj_Convert(PyObject *, DialogPtr *); + extern PyObject *DlgObj_WhichDialog(DialogPtr); ++#endif /* !__LP64__ */ + + /* Drag exports */ ++#ifndef __LP64__ + extern PyObject *DragObj_New(DragReference); + extern int DragObj_Convert(PyObject *, DragReference *); ++#endif /* !__LP64__ */ + + /* List exports */ ++#ifndef __LP64__ + extern PyObject *ListObj_New(ListHandle); + extern int ListObj_Convert(PyObject *, ListHandle *); ++#endif /* !__LP64__ */ + + /* Menu exports */ ++#ifndef __LP64__ + extern PyObject *MenuObj_New(MenuHandle); + extern int MenuObj_Convert(PyObject *, MenuHandle *); ++#endif /* !__LP64__ */ + + /* Qd exports */ ++#ifndef __LP64__ + extern PyObject *GrafObj_New(GrafPtr); + extern int GrafObj_Convert(PyObject *, GrafPtr *); + extern PyObject *BMObj_New(BitMapPtr); + extern int BMObj_Convert(PyObject *, BitMapPtr *); + extern PyObject *QdRGB_New(RGBColor *); + extern int QdRGB_Convert(PyObject *, RGBColor *); ++#endif /* !__LP64__ */ + + /* Qdoffs exports */ ++#ifndef __LP64__ + extern PyObject *GWorldObj_New(GWorldPtr); + extern int GWorldObj_Convert(PyObject *, GWorldPtr *); ++#endif /* !__LP64__ */ + + /* Qt exports */ ++#ifndef __LP64__ + extern PyObject *TrackObj_New(Track); + extern int TrackObj_Convert(PyObject *, Track *); + extern PyObject *MovieObj_New(Movie); +@@ -146,6 +169,7 @@ + extern int UserDataObj_Convert(PyObject *, UserData *); + extern PyObject *MediaObj_New(Media); + extern int MediaObj_Convert(PyObject *, Media *); ++#endif /* !__LP64__ */ + + /* Res exports */ + extern PyObject *ResObj_New(Handle); +@@ -154,13 +178,17 @@ + extern int OptResObj_Convert(PyObject *, Handle *); + + /* TE exports */ ++#ifndef __LP64__ + extern PyObject *TEObj_New(TEHandle); + extern int TEObj_Convert(PyObject *, TEHandle *); ++#endif /* !__LP64__ */ + + /* Win exports */ ++#ifndef __LP64__ + extern PyObject *WinObj_New(WindowPtr); + extern int WinObj_Convert(PyObject *, WindowPtr *); + extern PyObject *WinObj_WhichWindow(WindowPtr); ++#endif /* !__LP64__ */ + + /* CF exports */ + extern PyObject *CFObj_New(CFTypeRef); +diff -r -u ./Mac/Modules/res/_Resmodule.c ../Python-2.5/Mac/Modules/res/_Resmodule.c +--- ./Mac/Modules/res/_Resmodule.c 2005-07-04 05:59:44.000000000 +0900 ++++ ../Python-2.5/Mac/Modules/res/_Resmodule.c 2013-07-17 23:38:51.000000000 +0900 +@@ -414,6 +414,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *ResObj_as_Control(ResourceObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -431,6 +432,7 @@ + return _res; + + } ++#endif /* !__LP64__ */ + + static PyObject *ResObj_LoadResource(ResourceObject *_self, PyObject *_args) + { +@@ -1152,6 +1154,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *Res_OpenRFPerm(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1287,6 +1290,7 @@ + _res = Py_None; + return _res; + } ++#endif /* !__LP64__ */ + + static PyObject *Res_InsertResourceFile(PyObject *_self, PyObject *_args) + { +@@ -1327,6 +1331,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *Res_FSpResourceFileAlreadyOpen(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1413,6 +1418,7 @@ + nextRefNum); + return _res; + } ++#endif /* !__LP64__ */ + + static PyObject *Res_FSOpenResFile(PyObject *_self, PyObject *_args) + { +@@ -1438,6 +1444,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *Res_FSCreateResFile(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1534,6 +1541,7 @@ + PyMac_BuildFSSpec, &newSpec); + return _res; + } ++#endif /* __LP64__ */ + + static PyObject *Res_FSOpenResourceFile(PyObject *_self, PyObject *_args) + { +@@ -1637,6 +1645,7 @@ + PyDoc_STR("(short refNum) -> (short _rv)")}, + {"SetResFileAttrs", (PyCFunction)Res_SetResFileAttrs, 1, + PyDoc_STR("(short refNum, short attrs) -> None")}, ++#ifndef __LP64__ + {"OpenRFPerm", (PyCFunction)Res_OpenRFPerm, 1, + PyDoc_STR("(Str255 fileName, short vRefNum, SignedByte permission) -> (short _rv)")}, + {"HOpenResFile", (PyCFunction)Res_HOpenResFile, 1, +@@ -1647,10 +1656,12 @@ + PyDoc_STR("(FSSpec spec, SignedByte permission) -> (short _rv)")}, + {"FSpCreateResFile", (PyCFunction)Res_FSpCreateResFile, 1, + PyDoc_STR("(FSSpec spec, OSType creator, OSType fileType, ScriptCode scriptTag) -> None")}, ++#endif /* !__LP64__ */ + {"InsertResourceFile", (PyCFunction)Res_InsertResourceFile, 1, + PyDoc_STR("(SInt16 refNum, RsrcChainLocation where) -> None")}, + {"DetachResourceFile", (PyCFunction)Res_DetachResourceFile, 1, + PyDoc_STR("(SInt16 refNum) -> None")}, ++#ifndef __LP64__ + {"FSpResourceFileAlreadyOpen", (PyCFunction)Res_FSpResourceFileAlreadyOpen, 1, + PyDoc_STR("(FSSpec resourceFile) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, + {"FSpOpenOrphanResFile", (PyCFunction)Res_FSpOpenOrphanResFile, 1, +@@ -1659,14 +1670,17 @@ + PyDoc_STR("() -> (SInt16 refNum)")}, + {"GetNextResourceFile", (PyCFunction)Res_GetNextResourceFile, 1, + PyDoc_STR("(SInt16 curRefNum) -> (SInt16 nextRefNum)")}, ++#endif /* __LP64__ */ + {"FSOpenResFile", (PyCFunction)Res_FSOpenResFile, 1, + PyDoc_STR("(FSRef ref, SignedByte permission) -> (short _rv)")}, ++#ifndef __LP64__ + {"FSCreateResFile", (PyCFunction)Res_FSCreateResFile, 1, + PyDoc_STR("(FSRef parentRef, Buffer nameLength) -> (FSRef newRef, FSSpec newSpec)")}, + {"FSResourceFileAlreadyOpen", (PyCFunction)Res_FSResourceFileAlreadyOpen, 1, + PyDoc_STR("(FSRef resourceFileRef) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, + {"FSCreateResourceFile", (PyCFunction)Res_FSCreateResourceFile, 1, + PyDoc_STR("(FSRef parentRef, Buffer nameLength, Buffer forkNameLength) -> (FSRef newRef, FSSpec newSpec)")}, ++#endif /* __LP64__ */ + {"FSOpenResourceFile", (PyCFunction)Res_FSOpenResourceFile, 1, + PyDoc_STR("(FSRef ref, Buffer forkNameLength, SignedByte permissions) -> (SInt16 refNum)")}, + {"Handle", (PyCFunction)Res_Handle, 1, +diff -r -u ./Modules/_ctypes/libffi/src/darwin/ffitarget.h ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h +--- ./Modules/_ctypes/libffi/src/darwin/ffitarget.h 2006-05-26 06:58:05.000000000 +0900 ++++ ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h 2013-07-17 23:38:51.000000000 +0900 +@@ -4,7 +4,7 @@ + * created by configure). This makes is possible to build a univeral binary + * of ctypes in one go. + */ +-#if defined(__i386__) ++#if defined(__i386__) || defined(__x86_64__) + + #ifndef X86_DARWIN + #define X86_DARWIN +diff -r -u ./Python/mactoolboxglue.c ../Python-2.5/Python/mactoolboxglue.c +--- ./Python/mactoolboxglue.c 2006-07-12 01:44:25.000000000 +0900 ++++ ../Python-2.5/Python/mactoolboxglue.c 2013-07-17 23:39:09.000000000 +0900 +@@ -106,6 +106,7 @@ + } + + ++#ifndef __LP64__ + OSErr + PyMac_GetFullPathname(FSSpec *fss, char *path, int len) + { +@@ -153,6 +154,7 @@ + Py_XDECREF(fs); + return err; + } ++#endif /* !__LP64__ */ + + /* Convert a 4-char string object argument to an OSType value */ + int +@@ -417,6 +419,7 @@ + GLUE_NEW(GWorldPtr, GWorldObj_New, "Carbon.Qdoffs") + GLUE_CONVERT(GWorldPtr, GWorldObj_Convert, "Carbon.Qdoffs") + ++#ifndef __LP64__ + GLUE_NEW(Track, TrackObj_New, "Carbon.Qt") + GLUE_CONVERT(Track, TrackObj_Convert, "Carbon.Qt") + GLUE_NEW(Movie, MovieObj_New, "Carbon.Qt") +@@ -429,6 +432,7 @@ + GLUE_CONVERT(UserData, UserDataObj_Convert, "Carbon.Qt") + GLUE_NEW(Media, MediaObj_New, "Carbon.Qt") + GLUE_CONVERT(Media, MediaObj_Convert, "Carbon.Qt") ++#endif /* !__LP64__ */ + + GLUE_NEW(Handle, ResObj_New, "Carbon.Res") + GLUE_CONVERT(Handle, ResObj_Convert, "Carbon.Res") diff --git a/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/004_osx_libffi.patch b/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/004_osx_libffi.patch new file mode 100644 index 0000000..8318432 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/004_osx_libffi.patch @@ -0,0 +1,6881 @@ +diff -r -u ./Modules/_ctypes/libffi_osx/LICENSE ./Modules/_ctypes/libffi_osx/LICENSE +new file mode 100644 +index 0000000..f591795 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/LICENSE +@@ -0,0 +1,20 @@ ++libffi - Copyright (c) 1996-2003 Red Hat, Inc. ++ ++Permission is hereby granted, free of charge, to any person obtaining ++a copy of this software and associated documentation files (the ++``Software''), to deal in the Software without restriction, including ++without limitation the rights to use, copy, modify, merge, publish, ++distribute, sublicense, and/or sell copies of the Software, and to ++permit persons to whom the Software is furnished to do so, subject to ++the following conditions: ++ ++The above copyright notice and this permission notice shall be included ++in all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++OTHER DEALINGS IN THE SOFTWARE. +diff -r -u ./Modules/_ctypes/libffi_osx/README ./Modules/_ctypes/libffi_osx/README +new file mode 100644 +index 0000000..1fc2747 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/README +@@ -0,0 +1,500 @@ ++This directory contains the libffi package, which is not part of GCC but ++shipped with GCC as convenience. ++ ++Status ++====== ++ ++libffi-2.00 has not been released yet! This is a development snapshot! ++ ++libffi-1.20 was released on October 5, 1998. Check the libffi web ++page for updates: . ++ ++ ++What is libffi? ++=============== ++ ++Compilers for high level languages generate code that follow certain ++conventions. These conventions are necessary, in part, for separate ++compilation to work. One such convention is the "calling ++convention". The "calling convention" is essentially a set of ++assumptions made by the compiler about where function arguments will ++be found on entry to a function. A "calling convention" also specifies ++where the return value for a function is found. ++ ++Some programs may not know at the time of compilation what arguments ++are to be passed to a function. For instance, an interpreter may be ++told at run-time about the number and types of arguments used to call ++a given function. Libffi can be used in such programs to provide a ++bridge from the interpreter program to compiled code. ++ ++The libffi library provides a portable, high level programming ++interface to various calling conventions. This allows a programmer to ++call any function specified by a call interface description at run ++time. ++ ++Ffi stands for Foreign Function Interface. A foreign function ++interface is the popular name for the interface that allows code ++written in one language to call code written in another language. The ++libffi library really only provides the lowest, machine dependent ++layer of a fully featured foreign function interface. A layer must ++exist above libffi that handles type conversions for values passed ++between the two languages. ++ ++ ++Supported Platforms and Prerequisites ++===================================== ++ ++Libffi has been ported to: ++ ++ SunOS 4.1.3 & Solaris 2.x (SPARC-V8, SPARC-V9) ++ ++ Irix 5.3 & 6.2 (System V/o32 & n32) ++ ++ Intel x86 - Linux (System V ABI) ++ ++ Alpha - Linux and OSF/1 ++ ++ m68k - Linux (System V ABI) ++ ++ PowerPC - Linux (System V ABI, Darwin, AIX) ++ ++ ARM - Linux (System V ABI) ++ ++Libffi has been tested with the egcs 1.0.2 gcc compiler. Chances are ++that other versions will work. Libffi has also been built and tested ++with the SGI compiler tools. ++ ++On PowerPC, the tests failed (see the note below). ++ ++You must use GNU make to build libffi. SGI's make will not work. ++Sun's probably won't either. ++ ++If you port libffi to another platform, please let me know! I assume ++that some will be easy (x86 NetBSD), and others will be more difficult ++(HP). ++ ++ ++Installing libffi ++================= ++ ++[Note: before actually performing any of these installation steps, ++ you may wish to read the "Platform Specific Notes" below.] ++ ++First you must configure the distribution for your particular ++system. Go to the directory you wish to build libffi in and run the ++"configure" program found in the root directory of the libffi source ++distribution. ++ ++You may want to tell configure where to install the libffi library and ++header files. To do that, use the --prefix configure switch. Libffi ++will install under /usr/local by default. ++ ++If you want to enable extra run-time debugging checks use the the ++--enable-debug configure switch. This is useful when your program dies ++mysteriously while using libffi. ++ ++Another useful configure switch is --enable-purify-safety. Using this ++will add some extra code which will suppress certain warnings when you ++are using Purify with libffi. Only use this switch when using ++Purify, as it will slow down the library. ++ ++Configure has many other options. Use "configure --help" to see them all. ++ ++Once configure has finished, type "make". Note that you must be using ++GNU make. SGI's make will not work. Sun's probably won't either. ++You can ftp GNU make from prep.ai.mit.edu:/pub/gnu. ++ ++To ensure that libffi is working as advertised, type "make test". ++ ++To install the library and header files, type "make install". ++ ++ ++Using libffi ++============ ++ ++ The Basics ++ ---------- ++ ++Libffi assumes that you have a pointer to the function you wish to ++call and that you know the number and types of arguments to pass it, ++as well as the return type of the function. ++ ++The first thing you must do is create an ffi_cif object that matches ++the signature of the function you wish to call. The cif in ffi_cif ++stands for Call InterFace. To prepare a call interface object, use the ++following function: ++ ++ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, ++ unsigned int nargs, ++ ffi_type *rtype, ffi_type **atypes); ++ ++ CIF is a pointer to the call interface object you wish ++ to initialize. ++ ++ ABI is an enum that specifies the calling convention ++ to use for the call. FFI_DEFAULT_ABI defaults ++ to the system's native calling convention. Other ++ ABI's may be used with care. They are system ++ specific. ++ ++ NARGS is the number of arguments this function accepts. ++ libffi does not yet support vararg functions. ++ ++ RTYPE is a pointer to an ffi_type structure that represents ++ the return type of the function. Ffi_type objects ++ describe the types of values. libffi provides ++ ffi_type objects for many of the native C types: ++ signed int, unsigned int, signed char, unsigned char, ++ etc. There is also a pointer ffi_type object and ++ a void ffi_type. Use &ffi_type_void for functions that ++ don't return values. ++ ++ ATYPES is a vector of ffi_type pointers. ARGS must be NARGS long. ++ If NARGS is 0, this is ignored. ++ ++ ++ffi_prep_cif will return a status code that you are responsible ++for checking. It will be one of the following: ++ ++ FFI_OK - All is good. ++ ++ FFI_BAD_TYPEDEF - One of the ffi_type objects that ffi_prep_cif ++ came across is bad. ++ ++ ++Before making the call, the VALUES vector should be initialized ++with pointers to the appropriate argument values. ++ ++To call the function using the initialized ffi_cif, use the ++ffi_call function: ++ ++void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues); ++ ++ CIF is a pointer to the ffi_cif initialized specifically ++ for this function. ++ ++ FN is a pointer to the function you want to call. ++ ++ RVALUE is a pointer to a chunk of memory that is to hold the ++ result of the function call. Currently, it must be ++ at least one word in size (except for the n32 version ++ under Irix 6.x, which must be a pointer to an 8 byte ++ aligned value (a long long). It must also be at least ++ word aligned (depending on the return type, and the ++ system's alignment requirements). If RTYPE is ++ &ffi_type_void, this is ignored. If RVALUE is NULL, ++ the return value is discarded. ++ ++ AVALUES is a vector of void* that point to the memory locations ++ holding the argument values for a call. ++ If NARGS is 0, this is ignored. ++ ++ ++If you are expecting a return value from FN it will have been stored ++at RVALUE. ++ ++ ++ ++ An Example ++ ---------- ++ ++Here is a trivial example that calls puts() a few times. ++ ++ #include ++ #include ++ ++ int main() ++ { ++ ffi_cif cif; ++ ffi_type *args[1]; ++ void *values[1]; ++ char *s; ++ int rc; ++ ++ /* Initialize the argument info vectors */ ++ args[0] = &ffi_type_uint; ++ values[0] = &s; ++ ++ /* Initialize the cif */ ++ if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, ++ &ffi_type_uint, args) == FFI_OK) ++ { ++ s = "Hello World!"; ++ ffi_call(&cif, puts, &rc, values); ++ /* rc now holds the result of the call to puts */ ++ ++ /* values holds a pointer to the function's arg, so to ++ call puts() again all we need to do is change the ++ value of s */ ++ s = "This is cool!"; ++ ffi_call(&cif, puts, &rc, values); ++ } ++ ++ return 0; ++ } ++ ++ ++ ++ Aggregate Types ++ --------------- ++ ++Although libffi has no special support for unions or bit-fields, it is ++perfectly happy passing structures back and forth. You must first ++describe the structure to libffi by creating a new ffi_type object ++for it. Here is the definition of ffi_type: ++ ++ typedef struct _ffi_type ++ { ++ unsigned size; ++ short alignment; ++ short type; ++ struct _ffi_type **elements; ++ } ffi_type; ++ ++All structures must have type set to FFI_TYPE_STRUCT. You may set ++size and alignment to 0. These will be calculated and reset to the ++appropriate values by ffi_prep_cif(). ++ ++elements is a NULL terminated array of pointers to ffi_type objects ++that describe the type of the structure elements. These may, in turn, ++be structure elements. ++ ++The following example initializes a ffi_type object representing the ++tm struct from Linux's time.h: ++ ++ struct tm { ++ int tm_sec; ++ int tm_min; ++ int tm_hour; ++ int tm_mday; ++ int tm_mon; ++ int tm_year; ++ int tm_wday; ++ int tm_yday; ++ int tm_isdst; ++ /* Those are for future use. */ ++ long int __tm_gmtoff__; ++ __const char *__tm_zone__; ++ }; ++ ++ { ++ ffi_type tm_type; ++ ffi_type *tm_type_elements[12]; ++ int i; ++ ++ tm_type.size = tm_type.alignment = 0; ++ tm_type.elements = &tm_type_elements; ++ ++ for (i = 0; i < 9; i++) ++ tm_type_elements[i] = &ffi_type_sint; ++ ++ tm_type_elements[9] = &ffi_type_slong; ++ tm_type_elements[10] = &ffi_type_pointer; ++ tm_type_elements[11] = NULL; ++ ++ /* tm_type can now be used to represent tm argument types and ++ return types for ffi_prep_cif() */ ++ } ++ ++ ++ ++Platform Specific Notes ++======================= ++ ++ Intel x86 ++ --------- ++ ++There are no known problems with the x86 port. ++ ++ Sun SPARC - SunOS 4.1.3 & Solaris 2.x ++ ------------------------------------- ++ ++You must use GNU Make to build libffi on Sun platforms. ++ ++ MIPS - Irix 5.3 & 6.x ++ --------------------- ++ ++Irix 6.2 and better supports three different calling conventions: o32, ++n32 and n64. Currently, libffi only supports both o32 and n32 under ++Irix 6.x, but only o32 under Irix 5.3. Libffi will automatically be ++configured for whichever calling convention it was built for. ++ ++By default, the configure script will try to build libffi with the GNU ++development tools. To build libffi with the SGI development tools, set ++the environment variable CC to either "cc -32" or "cc -n32" before ++running configure under Irix 6.x (depending on whether you want an o32 ++or n32 library), or just "cc" for Irix 5.3. ++ ++With the n32 calling convention, when returning structures smaller ++than 16 bytes, be sure to provide an RVALUE that is 8 byte aligned. ++Here's one way of forcing this: ++ ++ double struct_storage[2]; ++ my_small_struct *s = (my_small_struct *) struct_storage; ++ /* Use s for RVALUE */ ++ ++If you don't do this you are liable to get spurious bus errors. ++ ++"long long" values are not supported yet. ++ ++You must use GNU Make to build libffi on SGI platforms. ++ ++ ARM - System V ABI ++ ------------------ ++ ++The ARM port was performed on a NetWinder running ARM Linux ELF ++(2.0.31) and gcc 2.8.1. ++ ++ ++ ++ PowerPC System V ABI ++ -------------------- ++ ++There are two `System V ABI's which libffi implements for PowerPC. ++They differ only in how small structures are returned from functions. ++ ++In the FFI_SYSV version, structures that are 8 bytes or smaller are ++returned in registers. This is what GCC does when it is configured ++for solaris, and is what the System V ABI I have (dated September ++1995) says. ++ ++In the FFI_GCC_SYSV version, all structures are returned the same way: ++by passing a pointer as the first argument to the function. This is ++what GCC does when it is configured for linux or a generic sysv ++target. ++ ++EGCS 1.0.1 (and probably other versions of EGCS/GCC) also has a ++inconsistency with the SysV ABI: When a procedure is called with many ++floating-point arguments, some of them get put on the stack. They are ++all supposed to be stored in double-precision format, even if they are ++only single-precision, but EGCS stores single-precision arguments as ++single-precision anyway. This causes one test to fail (the `many ++arguments' test). ++ ++ ++What's With The Crazy Comments? ++=============================== ++ ++You might notice a number of cryptic comments in the code, delimited ++by /*@ and @*/. These are annotations read by the program LCLint, a ++tool for statically checking C programs. You can read all about it at ++. ++ ++ ++History ++======= ++ ++1.20 Oct-5-98 ++ Raffaele Sena produces ARM port. ++ ++1.19 Oct-5-98 ++ Fixed x86 long double and long long return support. ++ m68k bug fixes from Andreas Schwab. ++ Patch for DU assembler compatibility for the Alpha from Richard ++ Henderson. ++ ++1.18 Apr-17-98 ++ Bug fixes and MIPS configuration changes. ++ ++1.17 Feb-24-98 ++ Bug fixes and m68k port from Andreas Schwab. PowerPC port from ++ Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes. ++ ++1.16 Feb-11-98 ++ Richard Henderson produces Alpha port. ++ ++1.15 Dec-4-97 ++ Fixed an n32 ABI bug. New libtool, auto* support. ++ ++1.14 May-13-97 ++ libtool is now used to generate shared and static libraries. ++ Fixed a minor portability problem reported by Russ McManus ++ . ++ ++1.13 Dec-2-96 ++ Added --enable-purify-safety to keep Purify from complaining ++ about certain low level code. ++ Sparc fix for calling functions with < 6 args. ++ Linux x86 a.out fix. ++ ++1.12 Nov-22-96 ++ Added missing ffi_type_void, needed for supporting void return ++ types. Fixed test case for non MIPS machines. Cygnus Support ++ is now Cygnus Solutions. ++ ++1.11 Oct-30-96 ++ Added notes about GNU make. ++ ++1.10 Oct-29-96 ++ Added configuration fix for non GNU compilers. ++ ++1.09 Oct-29-96 ++ Added --enable-debug configure switch. Clean-ups based on LCLint ++ feedback. ffi_mips.h is always installed. Many configuration ++ fixes. Fixed ffitest.c for sparc builds. ++ ++1.08 Oct-15-96 ++ Fixed n32 problem. Many clean-ups. ++ ++1.07 Oct-14-96 ++ Gordon Irlam rewrites v8.S again. Bug fixes. ++ ++1.06 Oct-14-96 ++ Gordon Irlam improved the sparc port. ++ ++1.05 Oct-14-96 ++ Interface changes based on feedback. ++ ++1.04 Oct-11-96 ++ Sparc port complete (modulo struct passing bug). ++ ++1.03 Oct-10-96 ++ Passing struct args, and returning struct values works for ++ all architectures/calling conventions. Expanded tests. ++ ++1.02 Oct-9-96 ++ Added SGI n32 support. Fixed bugs in both o32 and Linux support. ++ Added "make test". ++ ++1.01 Oct-8-96 ++ Fixed float passing bug in mips version. Restructured some ++ of the code. Builds cleanly with SGI tools. ++ ++1.00 Oct-7-96 ++ First release. No public announcement. ++ ++ ++Authors & Credits ++================= ++ ++libffi was written by Anthony Green . ++ ++Portions of libffi were derived from Gianni Mariani's free gencall ++library for Silicon Graphics machines. ++ ++The closure mechanism was designed and implemented by Kresten Krab ++Thorup. ++ ++The Sparc port was derived from code contributed by the fine folks at ++Visible Decisions Inc . Further enhancements were ++made by Gordon Irlam at Cygnus Solutions . ++ ++The Alpha port was written by Richard Henderson at Cygnus Solutions. ++ ++Andreas Schwab ported libffi to m68k Linux and provided a number of ++bug fixes. ++ ++Geoffrey Keating ported libffi to the PowerPC. ++ ++Raffaele Sena ported libffi to the ARM. ++ ++Jesper Skov and Andrew Haley both did more than their fair share of ++stepping through the code and tracking down bugs. ++ ++Thanks also to Tom Tromey for bug fixes and configuration help. ++ ++Thanks to Jim Blandy, who provided some useful feedback on the libffi ++interface. ++ ++If you have a problem, or have found a bug, please send a note to ++green@cygnus.com. +diff -r -u ./Modules/_ctypes/libffi_osx/README.pyobjc ./Modules/_ctypes/libffi_osx/README.pyobjc +new file mode 100644 +index 0000000..405d85f +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/README.pyobjc +@@ -0,0 +1,5 @@ ++This directory contains a slightly modified version of libffi, extracted from ++the GCC source-tree. ++ ++The only modifications are those that are necessary to compile libffi using ++the Apple provided compiler and outside of the GCC source tree. +diff -r -u ./Modules/_ctypes/libffi_osx/ffi.c ./Modules/_ctypes/libffi_osx/ffi.c +new file mode 100644 +index 0000000..bf42093 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/ffi.c +@@ -0,0 +1,226 @@ ++/* ----------------------------------------------------------------------- ++ prep_cif.c - Copyright (c) 1996, 1998 Red Hat, Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++#include ++ ++/* Round up to FFI_SIZEOF_ARG. */ ++#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG) ++ ++/* Perform machine independent initialization of aggregate type ++ specifications. */ ++ ++static ffi_status ++initialize_aggregate( ++/*@out@*/ ffi_type* arg) ++{ ++/*@-usedef@*/ ++ ++ if (arg == NULL || arg->elements == NULL || ++ arg->size != 0 || arg->alignment != 0) ++ return FFI_BAD_TYPEDEF; ++ ++ ffi_type** ptr = &(arg->elements[0]); ++ ++ while ((*ptr) != NULL) ++ { ++ if (((*ptr)->size == 0) && (initialize_aggregate(*ptr) != FFI_OK)) ++ return FFI_BAD_TYPEDEF; ++ ++ /* Perform a sanity check on the argument type */ ++ FFI_ASSERT_VALID_TYPE(*ptr); ++ ++#ifdef POWERPC_DARWIN ++ int curalign = (*ptr)->alignment; ++ ++ if (ptr != &(arg->elements[0])) ++ { ++ if (curalign > 4 && curalign != 16) ++ curalign = 4; ++ } ++ ++ arg->size = ALIGN(arg->size, curalign); ++ arg->size += (*ptr)->size; ++ arg->alignment = (arg->alignment > curalign) ? ++ arg->alignment : curalign; ++#else ++ arg->size = ALIGN(arg->size, (*ptr)->alignment); ++ arg->size += (*ptr)->size; ++ arg->alignment = (arg->alignment > (*ptr)->alignment) ? ++ arg->alignment : (*ptr)->alignment; ++#endif ++ ++ ptr++; ++ } ++ ++ /* Structure size includes tail padding. This is important for ++ structures that fit in one register on ABIs like the PowerPC64 ++ Linux ABI that right justify small structs in a register. ++ It's also needed for nested structure layout, for example ++ struct A { long a; char b; }; struct B { struct A x; char y; }; ++ should find y at an offset of 2*sizeof(long) and result in a ++ total size of 3*sizeof(long). */ ++ arg->size = ALIGN(arg->size, arg->alignment); ++ ++ if (arg->size == 0) ++ return FFI_BAD_TYPEDEF; ++ ++ return FFI_OK; ++ ++/*@=usedef@*/ ++} ++ ++#ifndef __CRIS__ ++/* The CRIS ABI specifies structure elements to have byte ++ alignment only, so it completely overrides this functions, ++ which assumes "natural" alignment and padding. */ ++ ++/* Perform machine independent ffi_cif preparation, then call ++ machine dependent routine. */ ++ ++#if defined(X86_DARWIN) ++ ++static inline bool ++struct_on_stack( ++ int size) ++{ ++ if (size > 8) ++ return true; ++ ++ /* This is not what the ABI says, but is what is really implemented */ ++ switch (size) ++ { ++ case 1: ++ case 2: ++ case 4: ++ case 8: ++ return false; ++ ++ default: ++ return true; ++ } ++} ++ ++#endif // defined(X86_DARWIN) ++ ++// Arguments' ffi_type->alignment must be nonzero. ++ffi_status ++ffi_prep_cif( ++/*@out@*/ /*@partial@*/ ffi_cif* cif, ++ ffi_abi abi, ++ unsigned int nargs, ++/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, ++/*@dependent@*/ ffi_type** atypes) ++{ ++ if (cif == NULL) ++ return FFI_BAD_TYPEDEF; ++ ++ if (abi <= FFI_FIRST_ABI || abi > FFI_DEFAULT_ABI) ++ return FFI_BAD_ABI; ++ ++ unsigned int bytes = 0; ++ unsigned int i; ++ ffi_type** ptr; ++ ++ cif->abi = abi; ++ cif->arg_types = atypes; ++ cif->nargs = nargs; ++ cif->rtype = rtype; ++ cif->flags = 0; ++ ++ /* Initialize the return type if necessary */ ++ /*@-usedef@*/ ++ if ((cif->rtype->size == 0) && (initialize_aggregate(cif->rtype) != FFI_OK)) ++ return FFI_BAD_TYPEDEF; ++ /*@=usedef@*/ ++ ++ /* Perform a sanity check on the return type */ ++ FFI_ASSERT_VALID_TYPE(cif->rtype); ++ ++ /* x86-64 and s390 stack space allocation is handled in prep_machdep. */ ++#if !defined M68K && !defined __x86_64__ && !defined S390 && !defined PA ++ /* Make space for the return structure pointer */ ++ if (cif->rtype->type == FFI_TYPE_STRUCT ++#ifdef SPARC ++ && (cif->abi != FFI_V9 || cif->rtype->size > 32) ++#endif ++#ifdef X86_DARWIN ++ && (struct_on_stack(cif->rtype->size)) ++#endif ++ ) ++ bytes = STACK_ARG_SIZE(sizeof(void*)); ++#endif ++ ++ for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) ++ { ++ /* Initialize any uninitialized aggregate type definitions */ ++ if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) ++ return FFI_BAD_TYPEDEF; ++ ++ if ((*ptr)->alignment == 0) ++ return FFI_BAD_TYPEDEF; ++ ++ /* Perform a sanity check on the argument type, do this ++ check after the initialization. */ ++ FFI_ASSERT_VALID_TYPE(*ptr); ++ ++#if defined(X86_DARWIN) ++ { ++ int align = (*ptr)->alignment; ++ ++ if (align > 4) ++ align = 4; ++ ++ if ((align - 1) & bytes) ++ bytes = ALIGN(bytes, align); ++ ++ bytes += STACK_ARG_SIZE((*ptr)->size); ++ } ++#elif !defined __x86_64__ && !defined S390 && !defined PA ++#ifdef SPARC ++ if (((*ptr)->type == FFI_TYPE_STRUCT ++ && ((*ptr)->size > 16 || cif->abi != FFI_V9)) ++ || ((*ptr)->type == FFI_TYPE_LONGDOUBLE ++ && cif->abi != FFI_V9)) ++ bytes += sizeof(void*); ++ else ++#endif ++ { ++ /* Add any padding if necessary */ ++ if (((*ptr)->alignment - 1) & bytes) ++ bytes = ALIGN(bytes, (*ptr)->alignment); ++ ++ bytes += STACK_ARG_SIZE((*ptr)->size); ++ } ++#endif ++ } ++ ++ cif->bytes = bytes; ++ ++ /* Perform machine dependent cif processing */ ++ return ffi_prep_cif_machdep(cif); ++} ++#endif /* not __CRIS__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi.h ./Modules/_ctypes/libffi_osx/include/ffi.h +new file mode 100644 +index 0000000..c104a5c +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ffi.h +@@ -0,0 +1,355 @@ ++/* -----------------------------------------------------------------*-C-*- ++ libffi PyOBJC - Copyright (c) 1996-2003 Red Hat, Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ++ ----------------------------------------------------------------------- */ ++ ++/* ------------------------------------------------------------------- ++ The basic API is described in the README file. ++ ++ The raw API is designed to bypass some of the argument packing ++ and unpacking on architectures for which it can be avoided. ++ ++ The closure API allows interpreted functions to be packaged up ++ inside a C function pointer, so that they can be called as C functions, ++ with no understanding on the client side that they are interpreted. ++ It can also be used in other cases in which it is necessary to package ++ up a user specified parameter and a function pointer as a single ++ function pointer. ++ ++ The closure API must be implemented in order to get its functionality, ++ e.g. for use by gij. Routines are provided to emulate the raw API ++ if the underlying platform doesn't allow faster implementation. ++ ++ More details on the raw and closure API can be found in: ++ ++ http://gcc.gnu.org/ml/java/1999-q3/msg00138.html ++ ++ and ++ ++ http://gcc.gnu.org/ml/java/1999-q3/msg00174.html ++ -------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_H ++#define LIBFFI_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/* Specify which architecture libffi is configured for. */ ++#ifdef MACOSX ++# if defined(__i386__) || defined(__x86_64__) ++# define X86_DARWIN ++# elif defined(__ppc__) || defined(__ppc64__) ++# define POWERPC_DARWIN ++# else ++# error "Unsupported MacOS X CPU type" ++# endif ++#else ++#error "Unsupported OS type" ++#endif ++ ++/* ---- System configuration information --------------------------------- */ ++ ++#include "ffitarget.h" ++#include "fficonfig.h" ++ ++#ifndef LIBFFI_ASM ++ ++#include ++#include ++ ++/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). ++ But we can find it either under the correct ANSI name, or under GNU ++ C's internal name. */ ++#ifdef LONG_LONG_MAX ++# define FFI_LONG_LONG_MAX LONG_LONG_MAX ++#else ++# ifdef LLONG_MAX ++# define FFI_LONG_LONG_MAX LLONG_MAX ++# else ++# ifdef __GNUC__ ++# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ ++# endif ++# endif ++#endif ++ ++#if SCHAR_MAX == 127 ++# define ffi_type_uchar ffi_type_uint8 ++# define ffi_type_schar ffi_type_sint8 ++#else ++#error "char size not supported" ++#endif ++ ++#if SHRT_MAX == 32767 ++# define ffi_type_ushort ffi_type_uint16 ++# define ffi_type_sshort ffi_type_sint16 ++#elif SHRT_MAX == 2147483647 ++# define ffi_type_ushort ffi_type_uint32 ++# define ffi_type_sshort ffi_type_sint32 ++#else ++#error "short size not supported" ++#endif ++ ++#if INT_MAX == 32767 ++# define ffi_type_uint ffi_type_uint16 ++# define ffi_type_sint ffi_type_sint16 ++#elif INT_MAX == 2147483647 ++# define ffi_type_uint ffi_type_uint32 ++# define ffi_type_sint ffi_type_sint32 ++#elif INT_MAX == 9223372036854775807 ++# define ffi_type_uint ffi_type_uint64 ++# define ffi_type_sint ffi_type_sint64 ++#else ++#error "int size not supported" ++#endif ++ ++#define ffi_type_ulong ffi_type_uint64 ++#define ffi_type_slong ffi_type_sint64 ++ ++#if LONG_MAX == 2147483647 ++# if FFI_LONG_LONG_MAX != 9223372036854775807 ++# error "no 64-bit data type supported" ++# endif ++#elif LONG_MAX != 9223372036854775807 ++#error "long size not supported" ++#endif ++ ++/* The closure code assumes that this works on pointers, i.e. a size_t ++ can hold a pointer. */ ++ ++typedef struct _ffi_type { ++ size_t size; ++ unsigned short alignment; ++ unsigned short type; ++/*@null@*/ struct _ffi_type** elements; ++} ffi_type; ++ ++/* These are defined in types.c */ ++extern ffi_type ffi_type_void; ++extern ffi_type ffi_type_uint8; ++extern ffi_type ffi_type_sint8; ++extern ffi_type ffi_type_uint16; ++extern ffi_type ffi_type_sint16; ++extern ffi_type ffi_type_uint32; ++extern ffi_type ffi_type_sint32; ++extern ffi_type ffi_type_uint64; ++extern ffi_type ffi_type_sint64; ++extern ffi_type ffi_type_float; ++extern ffi_type ffi_type_double; ++extern ffi_type ffi_type_longdouble; ++extern ffi_type ffi_type_pointer; ++ ++typedef enum ffi_status { ++ FFI_OK = 0, ++ FFI_BAD_TYPEDEF, ++ FFI_BAD_ABI ++} ffi_status; ++ ++typedef unsigned FFI_TYPE; ++ ++typedef struct ffi_cif { ++ ffi_abi abi; ++ unsigned nargs; ++/*@dependent@*/ ffi_type** arg_types; ++/*@dependent@*/ ffi_type* rtype; ++ unsigned bytes; ++ unsigned flags; ++#ifdef FFI_EXTRA_CIF_FIELDS ++ FFI_EXTRA_CIF_FIELDS; ++#endif ++} ffi_cif; ++ ++/* ---- Definitions for the raw API -------------------------------------- */ ++ ++#ifndef FFI_SIZEOF_ARG ++# if LONG_MAX == 2147483647 ++# define FFI_SIZEOF_ARG 4 ++# elif LONG_MAX == 9223372036854775807 ++# define FFI_SIZEOF_ARG 8 ++# endif ++#endif ++ ++typedef union { ++ ffi_sarg sint; ++ ffi_arg uint; ++ float flt; ++ char data[FFI_SIZEOF_ARG]; ++ void* ptr; ++} ffi_raw; ++ ++void ++ffi_raw_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ ffi_raw* avalue); ++ ++void ++ffi_ptrarray_to_raw( ++ ffi_cif* cif, ++ void** args, ++ ffi_raw* raw); ++ ++void ++ffi_raw_to_ptrarray( ++ ffi_cif* cif, ++ ffi_raw* raw, ++ void** args); ++ ++size_t ++ffi_raw_size( ++ ffi_cif* cif); ++ ++/* This is analogous to the raw API, except it uses Java parameter ++ packing, even on 64-bit machines. I.e. on 64-bit machines ++ longs and doubles are followed by an empty 64-bit word. */ ++void ++ffi_java_raw_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ ffi_raw* avalue); ++ ++void ++ffi_java_ptrarray_to_raw( ++ ffi_cif* cif, ++ void** args, ++ ffi_raw* raw); ++ ++void ++ffi_java_raw_to_ptrarray( ++ ffi_cif* cif, ++ ffi_raw* raw, ++ void** args); ++ ++size_t ++ffi_java_raw_size( ++ ffi_cif* cif); ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#if FFI_CLOSURES ++ ++typedef struct ffi_closure { ++ char tramp[FFI_TRAMPOLINE_SIZE]; ++ ffi_cif* cif; ++ void (*fun)(ffi_cif*,void*,void**,void*); ++ void* user_data; ++} ffi_closure; ++ ++ffi_status ++ffi_prep_closure( ++ ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,void**,void*), ++ void* user_data); ++ ++void ffi_closure_free(void *); ++void *ffi_closure_alloc (size_t size, void **code); ++ ++typedef struct ffi_raw_closure { ++ char tramp[FFI_TRAMPOLINE_SIZE]; ++ ffi_cif* cif; ++ ++#if !FFI_NATIVE_RAW_API ++ /* if this is enabled, then a raw closure has the same layout ++ as a regular closure. We use this to install an intermediate ++ handler to do the transaltion, void** -> ffi_raw*. */ ++ void (*translate_args)(ffi_cif*,void*,void**,void*); ++ void* this_closure; ++#endif ++ ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*); ++ void* user_data; ++} ffi_raw_closure; ++ ++ffi_status ++ffi_prep_raw_closure( ++ ffi_raw_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), ++ void* user_data); ++ ++ffi_status ++ffi_prep_java_raw_closure( ++ ffi_raw_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), ++ void* user_data); ++ ++#endif // FFI_CLOSURES ++ ++/* ---- Public interface definition -------------------------------------- */ ++ ++ffi_status ++ffi_prep_cif( ++/*@out@*/ /*@partial@*/ ffi_cif* cif, ++ ffi_abi abi, ++ unsigned int nargs, ++/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, ++/*@dependent@*/ ffi_type** atypes); ++ ++void ++ffi_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ void** avalue); ++ ++/* Useful for eliminating compiler warnings */ ++#define FFI_FN(f) ((void (*)(void))f) ++ ++#endif // #ifndef LIBFFI_ASM ++/* ---- Definitions shared with assembly code ---------------------------- */ ++ ++/* If these change, update src/mips/ffitarget.h. */ ++#define FFI_TYPE_VOID 0 ++#define FFI_TYPE_INT 1 ++#define FFI_TYPE_FLOAT 2 ++#define FFI_TYPE_DOUBLE 3 ++ ++#ifdef HAVE_LONG_DOUBLE ++# define FFI_TYPE_LONGDOUBLE 4 ++#else ++# define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE ++#endif ++ ++#define FFI_TYPE_UINT8 5 ++#define FFI_TYPE_SINT8 6 ++#define FFI_TYPE_UINT16 7 ++#define FFI_TYPE_SINT16 8 ++#define FFI_TYPE_UINT32 9 ++#define FFI_TYPE_SINT32 10 ++#define FFI_TYPE_UINT64 11 ++#define FFI_TYPE_SINT64 12 ++#define FFI_TYPE_STRUCT 13 ++#define FFI_TYPE_POINTER 14 ++ ++/* This should always refer to the last type code (for sanity checks) */ ++#define FFI_TYPE_LAST FFI_TYPE_POINTER ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif // #ifndef LIBFFI_H +diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi_common.h ./Modules/_ctypes/libffi_osx/include/ffi_common.h +new file mode 100644 +index 0000000..685a358 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ffi_common.h +@@ -0,0 +1,102 @@ ++/* ----------------------------------------------------------------------- ++ ffi_common.h - Copyright (c) 1996 Red Hat, Inc. ++ ++ Common internal definitions and macros. Only necessary for building ++ libffi. ++ ----------------------------------------------------------------------- */ ++ ++#ifndef FFI_COMMON_H ++#define FFI_COMMON_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include "fficonfig.h" ++ ++/* Do not move this. Some versions of AIX are very picky about where ++ this is positioned. */ ++#ifdef __GNUC__ ++# define alloca __builtin_alloca ++#else ++# if HAVE_ALLOCA_H ++# include ++# else ++# ifdef _AIX ++# pragma alloca ++# else ++# ifndef alloca /* predefined by HP cc +Olibcalls */ ++char* alloca(); ++# endif ++# endif ++# endif ++#endif ++ ++/* Check for the existence of memcpy. */ ++#if STDC_HEADERS ++# include ++#else ++# ifndef HAVE_MEMCPY ++# define memcpy(d, s, n) bcopy((s), (d), (n)) ++# endif ++#endif ++ ++/*#if defined(FFI_DEBUG) ++#include ++#endif*/ ++ ++#ifdef FFI_DEBUG ++#include ++ ++/*@exits@*/ void ++ffi_assert( ++/*@temp@*/ char* expr, ++/*@temp@*/ char* file, ++ int line); ++void ++ffi_stop_here(void); ++void ++ffi_type_test( ++/*@temp@*/ /*@out@*/ ffi_type* a, ++/*@temp@*/ char* file, ++ int line); ++ ++# define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) ++# define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) ++# define FFI_ASSERT_VALID_TYPE(x) ffi_type_test(x, __FILE__, __LINE__) ++#else ++# define FFI_ASSERT(x) ++# define FFI_ASSERT_AT(x, f, l) ++# define FFI_ASSERT_VALID_TYPE(x) ++#endif // #ifdef FFI_DEBUG ++ ++#define ALIGN(v, a) (((size_t)(v) + (a) - 1) & ~((a) - 1)) ++ ++/* Perform machine dependent cif processing */ ++ffi_status ++ffi_prep_cif_machdep( ++ ffi_cif* cif); ++ ++/* Extended cif, used in callback from assembly routine */ ++typedef struct extended_cif { ++/*@dependent@*/ ffi_cif* cif; ++/*@dependent@*/ void* rvalue; ++/*@dependent@*/ void** avalue; ++} extended_cif; ++ ++/* Terse sized type definitions. */ ++typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); ++typedef signed int SINT8 __attribute__((__mode__(__QI__))); ++typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); ++typedef signed int SINT16 __attribute__((__mode__(__HI__))); ++typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); ++typedef signed int SINT32 __attribute__((__mode__(__SI__))); ++typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); ++typedef signed int SINT64 __attribute__((__mode__(__DI__))); ++typedef float FLOAT32; ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif // #ifndef FFI_COMMON_H +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/fficonfig.h ./Modules/_ctypes/libffi_osx/include/fficonfig.h +new file mode 100644 +index 0000000..2172490 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/fficonfig.h +@@ -0,0 +1,150 @@ ++/* Manually created fficonfig.h for Darwin on PowerPC or Intel ++ ++ This file is manually generated to do away with the need for autoconf and ++ therefore make it easier to cross-compile and build fat binaries. ++ ++ NOTE: This file was added by PyObjC. ++*/ ++ ++#ifndef MACOSX ++#error "This file is only supported on Mac OS X" ++#endif ++ ++#if defined(__i386__) ++# define BYTEORDER 1234 ++# undef HOST_WORDS_BIG_ENDIAN ++# undef WORDS_BIGENDIAN ++# define SIZEOF_DOUBLE 8 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++ ++#elif defined(__x86_64__) ++# define BYTEORDER 1234 ++# undef HOST_WORDS_BIG_ENDIAN ++# undef WORDS_BIGENDIAN ++# define SIZEOF_DOUBLE 8 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++ ++#elif defined(__ppc__) ++# define BYTEORDER 4321 ++# define HOST_WORDS_BIG_ENDIAN 1 ++# define WORDS_BIGENDIAN 1 ++# define SIZEOF_DOUBLE 8 ++# if __GNUC__ >= 4 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++# else ++# undef HAVE_LONG_DOUBLE ++# define SIZEOF_LONG_DOUBLE 8 ++# endif ++ ++#elif defined(__ppc64__) ++# define BYTEORDER 4321 ++# define HOST_WORDS_BIG_ENDIAN 1 ++# define WORDS_BIGENDIAN 1 ++# define SIZEOF_DOUBLE 8 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++ ++#else ++#error "Unknown CPU type" ++#endif ++ ++/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP ++ systems. This function is required for `alloca.c' support on those systems. */ ++#undef CRAY_STACKSEG_END ++ ++/* Define to 1 if using `alloca.c'. */ ++/* #undef C_ALLOCA */ ++ ++/* Define to the flags needed for the .section .eh_frame directive. */ ++#define EH_FRAME_FLAGS "aw" ++ ++/* Define this if you want extra debugging. */ ++/* #undef FFI_DEBUG */ ++ ++/* Define this is you do not want support for the raw API. */ ++#define FFI_NO_RAW_API 1 ++ ++/* Define this if you do not want support for aggregate types. */ ++/* #undef FFI_NO_STRUCTS */ ++ ++/* Define to 1 if you have `alloca', as a function or macro. */ ++#define HAVE_ALLOCA 1 ++ ++/* Define to 1 if you have and it should be used (not on Ultrix). */ ++#define HAVE_ALLOCA_H 1 ++ ++/* Define if your assembler supports .register. */ ++/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ ++ ++/* Define if your assembler and linker support unaligned PC relative relocs. */ ++/* #undef HAVE_AS_SPARC_UA_PCREL */ ++ ++/* Define to 1 if you have the `memcpy' function. */ ++#define HAVE_MEMCPY 1 ++ ++/* Define if mmap with MAP_ANON(YMOUS) works. */ ++#define HAVE_MMAP_ANON 1 ++ ++/* Define if mmap of /dev/zero works. */ ++/* #undef HAVE_MMAP_DEV_ZERO */ ++ ++/* Define if read-only mmap of a plain file works. */ ++#define HAVE_MMAP_FILE 1 ++ ++/* Define if .eh_frame sections should be read-only. */ ++/* #undef HAVE_RO_EH_FRAME */ ++ ++/* Define to 1 if your C compiler doesn't accept -c and -o together. */ ++/* #undef NO_MINUS_C_MINUS_O */ ++ ++/* Name of package */ ++#define PACKAGE "libffi" ++ ++/* Define to the address where bug reports for this package should be sent. */ ++#define PACKAGE_BUGREPORT "http://gcc.gnu.org/bugs.html" ++ ++/* Define to the full name of this package. */ ++#define PACKAGE_NAME "libffi" ++ ++/* Define to the full name and version of this package. */ ++#define PACKAGE_STRING "libffi 2.1" ++ ++/* Define to the one symbol short name of this package. */ ++#define PACKAGE_TARNAME "libffi" ++ ++/* Define to the version of this package. */ ++#define PACKAGE_VERSION "2.1" ++ ++/* If using the C implementation of alloca, define if you know the ++ direction of stack growth for your system; otherwise it will be ++ automatically deduced at run-time. ++ STACK_DIRECTION > 0 => grows toward higher addresses ++ STACK_DIRECTION < 0 => grows toward lower addresses ++ STACK_DIRECTION = 0 => direction of growth unknown */ ++/* #undef STACK_DIRECTION */ ++ ++/* Define to 1 if you have the ANSI C header files. */ ++#define STDC_HEADERS 1 ++ ++/* Define this if you are using Purify and want to suppress spurious messages. */ ++/* #undef USING_PURIFY */ ++ ++/* Version number of package */ ++#define VERSION "2.1-pyobjc" ++ ++#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE ++# ifdef LIBFFI_ASM ++# define FFI_HIDDEN(name) .hidden name ++# else ++# define FFI_HIDDEN __attribute__((visibility ("hidden"))) ++# endif ++#else ++# ifdef LIBFFI_ASM ++# define FFI_HIDDEN(name) ++# else ++# define FFI_HIDDEN ++# endif ++#endif +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/ffitarget.h ./Modules/_ctypes/libffi_osx/include/ffitarget.h +new file mode 100644 +index 0000000..faaa30d +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ffitarget.h +@@ -0,0 +1,13 @@ ++/* Dispatch to the right ffitarget file. This file is PyObjC specific; in a ++ normal build, the build environment copies the file to the right location or ++ sets up the right include flags. We want to do neither because that would ++ make building fat binaries harder. ++*/ ++ ++#if defined(__i386__) || defined(__x86_64__) ++#include "x86-ffitarget.h" ++#elif defined(__ppc__) || defined(__ppc64__) ++#include "ppc-ffitarget.h" ++#else ++#error "Unsupported CPU type" ++#endif +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h +new file mode 100644 +index 0000000..2318421 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h +@@ -0,0 +1,104 @@ ++/* -----------------------------------------------------------------*-C-*- ++ ppc-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ Target configuration macros for PowerPC. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++/* ---- System specific configurations ----------------------------------- */ ++ ++#if (defined(POWERPC) && defined(__powerpc64__)) || \ ++ (defined(POWERPC_DARWIN) && defined(__ppc64__)) ++#define POWERPC64 ++#endif ++ ++#ifndef LIBFFI_ASM ++ ++typedef unsigned long ffi_arg; ++typedef signed long ffi_sarg; ++ ++typedef enum ffi_abi { ++ FFI_FIRST_ABI = 0, ++ ++#ifdef POWERPC ++ FFI_SYSV, ++ FFI_GCC_SYSV, ++ FFI_LINUX64, ++# ifdef POWERPC64 ++ FFI_DEFAULT_ABI = FFI_LINUX64, ++# else ++ FFI_DEFAULT_ABI = FFI_GCC_SYSV, ++# endif ++#endif ++ ++#ifdef POWERPC_AIX ++ FFI_AIX, ++ FFI_DARWIN, ++ FFI_DEFAULT_ABI = FFI_AIX, ++#endif ++ ++#ifdef POWERPC_DARWIN ++ FFI_AIX, ++ FFI_DARWIN, ++ FFI_DEFAULT_ABI = FFI_DARWIN, ++#endif ++ ++#ifdef POWERPC_FREEBSD ++ FFI_SYSV, ++ FFI_GCC_SYSV, ++ FFI_LINUX64, ++ FFI_DEFAULT_ABI = FFI_SYSV, ++#endif ++ ++ FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 ++} ffi_abi; ++ ++#endif // #ifndef LIBFFI_ASM ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#define FFI_CLOSURES 1 ++#define FFI_NATIVE_RAW_API 0 ++ ++/* Needed for FFI_SYSV small structure returns. */ ++#define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST) ++ ++#if defined(POWERPC64) /*|| defined(POWERPC_AIX)*/ ++# define FFI_TRAMPOLINE_SIZE 48 ++#elif defined(POWERPC_AIX) ++# define FFI_TRAMPOLINE_SIZE 24 ++#else ++# define FFI_TRAMPOLINE_SIZE 40 ++#endif ++ ++#ifndef LIBFFI_ASM ++# if defined(POWERPC_DARWIN) || defined(POWERPC_AIX) ++typedef struct ffi_aix_trampoline_struct { ++ void* code_pointer; /* Pointer to ffi_closure_ASM */ ++ void* toc; /* TOC */ ++ void* static_chain; /* Pointer to closure */ ++} ffi_aix_trampoline_struct; ++# endif ++#endif // #ifndef LIBFFI_ASM ++ ++#endif // #ifndef LIBFFI_TARGET_H +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h +new file mode 100644 +index 0000000..55c2b6c +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h +@@ -0,0 +1,88 @@ ++/* -----------------------------------------------------------------*-C-*- ++ x86-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ Target configuration macros for x86 and x86-64. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ++ ----------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++/* ---- System specific configurations ----------------------------------- */ ++ ++#if defined(X86_64) && defined(__i386__) ++# undef X86_64 ++# define X86 ++#endif ++ ++#if defined(__x86_64__) ++# ifndef X86_64 ++# define X86_64 ++# endif ++#endif ++ ++/* ---- Generic type definitions ----------------------------------------- */ ++ ++#ifndef LIBFFI_ASM ++ ++typedef unsigned long ffi_arg; ++typedef signed long ffi_sarg; ++ ++typedef enum ffi_abi { ++ FFI_FIRST_ABI = 0, ++ ++ /* ---- Intel x86 Win32 ---------- */ ++#ifdef X86_WIN32 ++ FFI_SYSV, ++ FFI_STDCALL, ++ /* TODO: Add fastcall support for the sake of completeness */ ++ FFI_DEFAULT_ABI = FFI_SYSV, ++#endif ++ ++ /* ---- Intel x86 and AMD x86-64 - */ ++#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__)) ++ FFI_SYSV, ++ FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ ++# ifdef __i386__ ++ FFI_DEFAULT_ABI = FFI_SYSV, ++# else ++ FFI_DEFAULT_ABI = FFI_UNIX64, ++# endif ++#endif ++ ++ FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 ++} ffi_abi; ++ ++#endif // #ifndef LIBFFI_ASM ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#define FFI_CLOSURES 1 ++ ++#if defined(X86_64) || (defined(__x86_64__) && defined(X86_DARWIN)) ++# define FFI_TRAMPOLINE_SIZE 24 ++# define FFI_NATIVE_RAW_API 0 ++#else ++# define FFI_TRAMPOLINE_SIZE 10 ++# define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ ++#endif ++ ++#endif // #ifndef LIBFFI_TARGET_H +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S +new file mode 100644 +index 0000000..f143dbd +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S +@@ -0,0 +1,365 @@ ++#if defined(__ppc__) || defined(__ppc64__) ++ ++/* ----------------------------------------------------------------------- ++ ppc-darwin.S - Copyright (c) 2000 John Hornkvist ++ Copyright (c) 2004 Free Software Foundation, Inc. ++ ++ PowerPC Assembly glue. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++ ++#include ++#include ++#include ++#include ++ ++.text ++ .align 2 ++.globl _ffi_prep_args ++ ++.text ++ .align 2 ++.globl _ffi_call_DARWIN ++ ++.text ++ .align 2 ++_ffi_call_DARWIN: ++LFB0: ++ mr r12,r8 /* We only need r12 until the call, ++ so it doesn't have to be saved. */ ++ ++LFB1: ++ /* Save the old stack pointer as AP. */ ++ mr r8,r1 ++ ++LCFI0: ++#if defined(__ppc64__) ++ /* Allocate the stack space we need. ++ r4 (size of input data) ++ 48 bytes (linkage area) ++ 40 bytes (saved registers) ++ 8 bytes (extra FPR) ++ r4 + 96 bytes total ++ */ ++ ++ addi r4,r4,-96 // Add our overhead. ++ li r0,-32 // Align to 32 bytes. ++ and r4,r4,r0 ++#endif ++ stgux r1,r1,r4 // Grow the stack. ++ mflr r9 ++ ++ /* Save registers we use. */ ++#if defined(__ppc64__) ++ std r27,-40(r8) ++#endif ++ stg r28,MODE_CHOICE(-16,-32)(r8) ++ stg r29,MODE_CHOICE(-12,-24)(r8) ++ stg r30,MODE_CHOICE(-8,-16)(r8) ++ stg r31,MODE_CHOICE(-4,-8)(r8) ++ stg r9,SF_RETURN(r8) /* return address */ ++#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ ++ stg r2,MODE_CHOICE(20,40)(r1) ++#endif ++ ++LCFI1: ++#if defined(__ppc64__) ++ mr r27,r3 // our extended_cif ++#endif ++ /* Save arguments over call. */ ++ mr r31,r5 /* flags, */ ++ mr r30,r6 /* rvalue, */ ++ mr r29,r7 /* function address, */ ++ mr r28,r8 /* our AP. */ ++ ++LCFI2: ++ /* Call ffi_prep_args. */ ++ mr r4,r1 ++ li r9,0 ++ mtctr r12 /* r12 holds address of _ffi_prep_args. */ ++ bctrl ++#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ ++ lg r2,MODE_CHOICE(20,40)(r1) ++#endif ++ ++ /* Now do the call. ++ Set up cr1 with bits 4-7 of the flags. */ ++ mtcrf 0x40,r31 ++ ++ /* Load all those argument registers. ++ We have set up a nice stack frame, just load it into registers. */ ++ lg r3,SF_ARG1(r1) ++ lg r4,SF_ARG2(r1) ++ lg r5,SF_ARG3(r1) ++ lg r6,SF_ARG4(r1) ++ nop ++ lg r7,SF_ARG5(r1) ++ lg r8,SF_ARG6(r1) ++ lg r9,SF_ARG7(r1) ++ lg r10,SF_ARG8(r1) ++ ++ /* Load all the FP registers. */ ++ bf 6,L2 /* No floats to load. */ ++#if defined(__ppc64__) ++ lfd f1,MODE_CHOICE(-16,-40)-(14*8)(r28) ++ lfd f2,MODE_CHOICE(-16,-40)-(13*8)(r28) ++ lfd f3,MODE_CHOICE(-16,-40)-(12*8)(r28) ++ lfd f4,MODE_CHOICE(-16,-40)-(11*8)(r28) ++ nop ++ lfd f5,MODE_CHOICE(-16,-40)-(10*8)(r28) ++ lfd f6,MODE_CHOICE(-16,-40)-(9*8)(r28) ++ lfd f7,MODE_CHOICE(-16,-40)-(8*8)(r28) ++ lfd f8,MODE_CHOICE(-16,-40)-(7*8)(r28) ++ nop ++ lfd f9,MODE_CHOICE(-16,-40)-(6*8)(r28) ++ lfd f10,MODE_CHOICE(-16,-40)-(5*8)(r28) ++ lfd f11,MODE_CHOICE(-16,-40)-(4*8)(r28) ++ lfd f12,MODE_CHOICE(-16,-40)-(3*8)(r28) ++ nop ++ lfd f13,MODE_CHOICE(-16,-40)-(2*8)(r28) ++ lfd f14,MODE_CHOICE(-16,-40)-(1*8)(r28) ++#elif defined(__ppc__) ++ lfd f1,MODE_CHOICE(-16,-40)-(13*8)(r28) ++ lfd f2,MODE_CHOICE(-16,-40)-(12*8)(r28) ++ lfd f3,MODE_CHOICE(-16,-40)-(11*8)(r28) ++ lfd f4,MODE_CHOICE(-16,-40)-(10*8)(r28) ++ nop ++ lfd f5,MODE_CHOICE(-16,-40)-(9*8)(r28) ++ lfd f6,MODE_CHOICE(-16,-40)-(8*8)(r28) ++ lfd f7,MODE_CHOICE(-16,-40)-(7*8)(r28) ++ lfd f8,MODE_CHOICE(-16,-40)-(6*8)(r28) ++ nop ++ lfd f9,MODE_CHOICE(-16,-40)-(5*8)(r28) ++ lfd f10,MODE_CHOICE(-16,-40)-(4*8)(r28) ++ lfd f11,MODE_CHOICE(-16,-40)-(3*8)(r28) ++ lfd f12,MODE_CHOICE(-16,-40)-(2*8)(r28) ++ nop ++ lfd f13,MODE_CHOICE(-16,-40)-(1*8)(r28) ++#else ++#error undefined architecture ++#endif ++ ++L2: ++ mr r12,r29 // Put the target address in r12 as specified. ++ mtctr r12 // Get the address to call into CTR. ++ nop ++ nop ++ bctrl // Make the call. ++ ++ // Deal with the return value. ++#if defined(__ppc64__) ++ mtcrf 0x3,r31 // flags in cr6 and cr7 ++ bt 27,L(st_return_value) ++#elif defined(__ppc__) ++ mtcrf 0x1,r31 // flags in cr7 ++#else ++#error undefined architecture ++#endif ++ ++ bt 30,L(done_return_value) ++ bt 29,L(fp_return_value) ++ stg r3,0(r30) ++#if defined(__ppc__) ++ bf 28,L(done_return_value) // Store the second long if necessary. ++ stg r4,4(r30) ++#endif ++ // Fall through ++ ++L(done_return_value): ++ lg r1,0(r1) // Restore stack pointer. ++ // Restore the registers we used. ++ lg r9,SF_RETURN(r1) // return address ++ lg r31,MODE_CHOICE(-4,-8)(r1) ++ mtlr r9 ++ lg r30,MODE_CHOICE(-8,-16)(r1) ++ lg r29,MODE_CHOICE(-12,-24)(r1) ++ lg r28,MODE_CHOICE(-16,-32)(r1) ++#if defined(__ppc64__) ++ ld r27,-40(r1) ++#endif ++ blr ++ ++#if defined(__ppc64__) ++L(st_return_value): ++ // Grow the stack enough to fit the registers. Leave room for 8 args ++ // to trample the 1st 8 slots in param area. ++ stgu r1,-SF_ROUND(280)(r1) // 64 + 104 + 48 + 64 ++ ++ // Store GPRs ++ std r3,SF_ARG9(r1) ++ std r4,SF_ARG10(r1) ++ std r5,SF_ARG11(r1) ++ std r6,SF_ARG12(r1) ++ nop ++ std r7,SF_ARG13(r1) ++ std r8,SF_ARG14(r1) ++ std r9,SF_ARG15(r1) ++ std r10,SF_ARG16(r1) ++ ++ // Store FPRs ++ nop ++ bf 26,L(call_struct_to_ram_form) ++ stfd f1,SF_ARG17(r1) ++ stfd f2,SF_ARG18(r1) ++ stfd f3,SF_ARG19(r1) ++ stfd f4,SF_ARG20(r1) ++ nop ++ stfd f5,SF_ARG21(r1) ++ stfd f6,SF_ARG22(r1) ++ stfd f7,SF_ARG23(r1) ++ stfd f8,SF_ARG24(r1) ++ nop ++ stfd f9,SF_ARG25(r1) ++ stfd f10,SF_ARG26(r1) ++ stfd f11,SF_ARG27(r1) ++ stfd f12,SF_ARG28(r1) ++ nop ++ stfd f13,SF_ARG29(r1) ++ ++L(call_struct_to_ram_form): ++ ld r3,0(r27) // extended_cif->cif* ++ ld r3,16(r3) // ffi_cif->rtype* ++ addi r4,r1,SF_ARG9 // stored GPRs ++ addi r6,r1,SF_ARG17 // stored FPRs ++ li r5,0 // GPR size ptr (NULL) ++ li r7,0 // FPR size ptr (NULL) ++ li r8,0 // FPR count ptr (NULL) ++ li r10,0 // struct offset (NULL) ++ mr r9,r30 // return area ++ bl Lffi64_struct_to_ram_form$stub ++ lg r1,0(r1) // Restore stack pointer. ++ b L(done_return_value) ++#endif ++ ++L(fp_return_value): ++ /* Do we have long double to store? */ ++ bf 31,L(fd_return_value) ++ stfd f1,0(r30) ++ stfd f2,8(r30) ++ b L(done_return_value) ++ ++L(fd_return_value): ++ /* Do we have double to store? */ ++ bf 28,L(float_return_value) ++ stfd f1,0(r30) ++ b L(done_return_value) ++ ++L(float_return_value): ++ /* We only have a float to store. */ ++ stfs f1,0(r30) ++ b L(done_return_value) ++ ++LFE1: ++/* END(_ffi_call_DARWIN) */ ++ ++/* Provide a null definition of _ffi_call_AIX. */ ++.text ++ .align 2 ++.globl _ffi_call_AIX ++.text ++ .align 2 ++_ffi_call_AIX: ++ blr ++/* END(_ffi_call_AIX) */ ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ; Length of Common Information Entry ++LSCIE1: ++ .long 0x0 ; CIE Identifier Tag ++ .byte 0x1 ; CIE Version ++ .ascii "zR\0" ; CIE Augmentation ++ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor ++ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte 0x41 ; CIE RA Column ++ .byte 0x1 ; uleb128 0x1; Augmentation size ++ .byte 0x10 ; FDE Encoding (pcrel) ++ .byte 0xc ; DW_CFA_def_cfa ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x0 ; uleb128 0x0 ++ .align LOG2_GPR_BYTES ++LECIE1: ++.globl _ffi_call_DARWIN.eh ++_ffi_call_DARWIN.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ; FDE Length ++ ++LASFDE1: ++ .long LASFDE1-EH_frame1 ; FDE CIE offset ++ .g_long LFB0-. ; FDE initial location ++ .set L$set$3,LFE1-LFB0 ++ .g_long L$set$3 ; FDE address range ++ .byte 0x0 ; uleb128 0x0; Augmentation size ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$4,LCFI0-LFB1 ++ .long L$set$4 ++ .byte 0xd ; DW_CFA_def_cfa_register ++ .byte 0x08 ; uleb128 0x08 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$5,LCFI1-LCFI0 ++ .long L$set$5 ++ .byte 0x11 ; DW_CFA_offset_extended_sf ++ .byte 0x41 ; uleb128 0x41 ++ .byte 0x7e ; sleb128 -2 ++ .byte 0x9f ; DW_CFA_offset, column 0x1f ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x9e ; DW_CFA_offset, column 0x1e ++ .byte 0x2 ; uleb128 0x2 ++ .byte 0x9d ; DW_CFA_offset, column 0x1d ++ .byte 0x3 ; uleb128 0x3 ++ .byte 0x9c ; DW_CFA_offset, column 0x1c ++ .byte 0x4 ; uleb128 0x4 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$6,LCFI2-LCFI1 ++ .long L$set$6 ++ .byte 0xd ; DW_CFA_def_cfa_register ++ .byte 0x1c ; uleb128 0x1c ++ .align LOG2_GPR_BYTES ++LEFDE1: ++ ++#if defined(__ppc64__) ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi64_struct_to_ram_form$stub: ++ .indirect_symbol _ffi64_struct_to_ram_form ++ mflr r0 ++ bcl 20,31,LO$ffi64_struct_to_ram_form ++ ++LO$ffi64_struct_to_ram_form: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form) ++ mtlr r0 ++ lgu r12,lo16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi64_struct_to_ram_form$lazy_ptr: ++ .indirect_symbol _ffi64_struct_to_ram_form ++ .g_long dyld_stub_binding_helper ++ ++#endif // __ppc64__ ++#endif // __ppc__ || __ppc64__ +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h +new file mode 100644 +index 0000000..cf4bd50 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h +@@ -0,0 +1,85 @@ ++/* ----------------------------------------------------------------------- ++ ppc-darwin.h - Copyright (c) 2002, 2003, 2004, Free Software Foundation, ++ Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define L(x) x ++ ++#define SF_ARG9 MODE_CHOICE(56,112) ++#define SF_ARG10 MODE_CHOICE(60,120) ++#define SF_ARG11 MODE_CHOICE(64,128) ++#define SF_ARG12 MODE_CHOICE(68,136) ++#define SF_ARG13 MODE_CHOICE(72,144) ++#define SF_ARG14 MODE_CHOICE(76,152) ++#define SF_ARG15 MODE_CHOICE(80,160) ++#define SF_ARG16 MODE_CHOICE(84,168) ++#define SF_ARG17 MODE_CHOICE(88,176) ++#define SF_ARG18 MODE_CHOICE(92,184) ++#define SF_ARG19 MODE_CHOICE(96,192) ++#define SF_ARG20 MODE_CHOICE(100,200) ++#define SF_ARG21 MODE_CHOICE(104,208) ++#define SF_ARG22 MODE_CHOICE(108,216) ++#define SF_ARG23 MODE_CHOICE(112,224) ++#define SF_ARG24 MODE_CHOICE(116,232) ++#define SF_ARG25 MODE_CHOICE(120,240) ++#define SF_ARG26 MODE_CHOICE(124,248) ++#define SF_ARG27 MODE_CHOICE(128,256) ++#define SF_ARG28 MODE_CHOICE(132,264) ++#define SF_ARG29 MODE_CHOICE(136,272) ++ ++#define ASM_NEEDS_REGISTERS 4 ++#define NUM_GPR_ARG_REGISTERS 8 ++#define NUM_FPR_ARG_REGISTERS 13 ++ ++#define FFI_TYPE_1_BYTE(x) ((x) == FFI_TYPE_UINT8 || (x) == FFI_TYPE_SINT8) ++#define FFI_TYPE_2_BYTE(x) ((x) == FFI_TYPE_UINT16 || (x) == FFI_TYPE_SINT16) ++#define FFI_TYPE_4_BYTE(x) \ ++ ((x) == FFI_TYPE_UINT32 || (x) == FFI_TYPE_SINT32 ||\ ++ (x) == FFI_TYPE_INT || (x) == FFI_TYPE_FLOAT) ++ ++#if !defined(LIBFFI_ASM) ++ ++enum { ++ FLAG_RETURNS_NOTHING = 1 << (31 - 30), // cr7 ++ FLAG_RETURNS_FP = 1 << (31 - 29), ++ FLAG_RETURNS_64BITS = 1 << (31 - 28), ++ FLAG_RETURNS_128BITS = 1 << (31 - 31), ++ ++ FLAG_RETURNS_STRUCT = 1 << (31 - 27), // cr6 ++ FLAG_STRUCT_CONTAINS_FP = 1 << (31 - 26), ++ ++ FLAG_ARG_NEEDS_COPY = 1 << (31 - 7), ++ FLAG_FP_ARGUMENTS = 1 << (31 - 6), // cr1.eq; specified by ABI ++ FLAG_4_GPR_ARGUMENTS = 1 << (31 - 5), ++ FLAG_RETVAL_REFERENCE = 1 << (31 - 4) ++}; ++ ++#if defined(__ppc64__) ++void ffi64_struct_to_ram_form(const ffi_type*, const char*, unsigned int*, ++ const char*, unsigned int*, unsigned int*, char*, unsigned int*); ++void ffi64_struct_to_reg_form(const ffi_type*, const char*, unsigned int*, ++ unsigned int*, char*, unsigned int*, char*, unsigned int*); ++bool ffi64_stret_needs_ptr(const ffi_type* inType, ++ unsigned short*, unsigned short*); ++#endif ++ ++#endif // !defined(LIBFFI_ASM) +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S +new file mode 100644 +index 0000000..c3d30c2 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S +@@ -0,0 +1,308 @@ ++#if defined(__ppc__) ++ ++/* ----------------------------------------------------------------------- ++ ppc-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, ++ Inc. based on ppc_closure.S ++ ++ PowerPC Assembly glue. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++ ++#include ++#include // for FFI_TRAMPOLINE_SIZE ++#include ++#include ++ ++ .file "ppc-darwin_closure.S" ++.text ++ .align LOG2_GPR_BYTES ++ .globl _ffi_closure_ASM ++ ++.text ++ .align LOG2_GPR_BYTES ++ ++_ffi_closure_ASM: ++LFB1: ++ mflr r0 // Save return address ++ stg r0,SF_RETURN(r1) ++ ++LCFI0: ++ /* 24/48 bytes (Linkage Area) ++ 32/64 bytes (outgoing parameter area, always reserved) ++ 104 bytes (13*8 from FPR) ++ 16/32 bytes (result) ++ 176/232 total bytes */ ++ ++ /* skip over caller save area and keep stack aligned to 16/32. */ ++ stgu r1,-SF_ROUND(176)(r1) ++ ++LCFI1: ++ /* We want to build up an area for the parameters passed ++ in registers. (both floating point and integer) */ ++ ++ /* 176/256 bytes (callee stack frame aligned to 16/32) ++ 24/48 bytes (caller linkage area) ++ 200/304 (start of caller parameter area aligned to 4/8) ++ */ ++ ++ /* Save GPRs 3 - 10 (aligned to 4/8) ++ in the parents outgoing area. */ ++ stg r3,200(r1) ++ stg r4,204(r1) ++ stg r5,208(r1) ++ stg r6,212(r1) ++ stg r7,216(r1) ++ stg r8,220(r1) ++ stg r9,224(r1) ++ stg r10,228(r1) ++ ++ /* Save FPRs 1 - 13. (aligned to 8) */ ++ stfd f1,56(r1) ++ stfd f2,64(r1) ++ stfd f3,72(r1) ++ stfd f4,80(r1) ++ stfd f5,88(r1) ++ stfd f6,96(r1) ++ stfd f7,104(r1) ++ stfd f8,112(r1) ++ stfd f9,120(r1) ++ stfd f10,128(r1) ++ stfd f11,136(r1) ++ stfd f12,144(r1) ++ stfd f13,152(r1) ++ ++ // Set up registers for the routine that actually does the work. ++ mr r3,r11 // context pointer from the trampoline ++ addi r4,r1,160 // result storage ++ addi r5,r1,200 // saved GPRs ++ addi r6,r1,56 // saved FPRs ++ bl Lffi_closure_helper_DARWIN$stub ++ ++ /* Now r3 contains the return type. Use it to look up in a table ++ so we know how to deal with each type. */ ++ addi r5,r1,160 // Copy result storage pointer. ++ bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. ++ mflr r4 // Move to r4. ++ slwi r3,r3,4 // Multiply return type by 16. ++ add r3,r3,r4 // Add contents of table to table address. ++ mtctr r3 ++ bctr ++ ++LFE1: ++/* Each of the ret_typeX code fragments has to be exactly 16 bytes long ++ (4 instructions). For cache effectiveness we align to a 16 byte boundary ++ first. */ ++ .align 4 ++ nop ++ nop ++ nop ++ ++Lget_ret_type0_addr: ++ blrl ++ ++/* case FFI_TYPE_VOID */ ++Lret_type0: ++ b Lfinish ++ nop ++ nop ++ nop ++ ++/* case FFI_TYPE_INT */ ++Lret_type1: ++ lwz r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_FLOAT */ ++Lret_type2: ++ lfs f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_DOUBLE */ ++Lret_type3: ++ lfd f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_LONGDOUBLE */ ++Lret_type4: ++ lfd f1,0(r5) ++ lfd f2,8(r5) ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_UINT8 */ ++Lret_type5: ++ lbz r3,3(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_SINT8 */ ++Lret_type6: ++ lbz r3,3(r5) ++ extsb r3,r3 ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_UINT16 */ ++Lret_type7: ++ lhz r3,2(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_SINT16 */ ++Lret_type8: ++ lha r3,2(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_UINT32 */ ++Lret_type9: // same as Lret_type1 ++ lwz r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_SINT32 */ ++Lret_type10: // same as Lret_type1 ++ lwz r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_UINT64 */ ++Lret_type11: ++ lwz r3,0(r5) ++ lwz r4,4(r5) ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_SINT64 */ ++Lret_type12: // same as Lret_type11 ++ lwz r3,0(r5) ++ lwz r4,4(r5) ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_STRUCT */ ++Lret_type13: ++ b Lfinish ++ nop ++ nop ++ nop ++ ++/* End 16-byte aligned cases */ ++/* case FFI_TYPE_POINTER */ ++// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types ++// are added in future, the following code will need to be updated and ++// padded to 16 bytes. ++Lret_type14: ++ lg r3,0(r5) ++ // fall through ++ ++/* case done */ ++Lfinish: ++ addi r1,r1,SF_ROUND(176) // Restore stack pointer. ++ lg r0,SF_RETURN(r1) // Restore return address. ++ mtlr r0 // Restore link register. ++ blr ++ ++/* END(ffi_closure_ASM) */ ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ; Length of Common Information Entry ++LSCIE1: ++ .long 0x0 ; CIE Identifier Tag ++ .byte 0x1 ; CIE Version ++ .ascii "zR\0" ; CIE Augmentation ++ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor ++ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte 0x41 ; CIE RA Column ++ .byte 0x1 ; uleb128 0x1; Augmentation size ++ .byte 0x10 ; FDE Encoding (pcrel) ++ .byte 0xc ; DW_CFA_def_cfa ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x0 ; uleb128 0x0 ++ .align LOG2_GPR_BYTES ++LECIE1: ++.globl _ffi_closure_ASM.eh ++_ffi_closure_ASM.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ; FDE Length ++ ++LASFDE1: ++ .long LASFDE1-EH_frame1 ; FDE CIE offset ++ .g_long LFB1-. ; FDE initial location ++ .set L$set$3,LFE1-LFB1 ++ .g_long L$set$3 ; FDE address range ++ .byte 0x0 ; uleb128 0x0; Augmentation size ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$3,LCFI1-LCFI0 ++ .long L$set$3 ++ .byte 0xe ; DW_CFA_def_cfa_offset ++ .byte 176,1 ; uleb128 176 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$4,LCFI0-LFB1 ++ .long L$set$4 ++ .byte 0x11 ; DW_CFA_offset_extended_sf ++ .byte 0x41 ; uleb128 0x41 ++ .byte 0x7e ; sleb128 -2 ++ .align LOG2_GPR_BYTES ++ ++LEFDE1: ++.data ++ .align LOG2_GPR_BYTES ++LDFCM0: ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi_closure_helper_DARWIN$stub: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ mflr r0 ++ bcl 20,31,LO$ffi_closure_helper_DARWIN ++ ++LO$ffi_closure_helper_DARWIN: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) ++ mtlr r0 ++ lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi_closure_helper_DARWIN$lazy_ptr: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ .g_long dyld_stub_binding_helper ++ ++ ++#endif // __ppc__ +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c +new file mode 100644 +index 0000000..8953d5f +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c +@@ -0,0 +1,1776 @@ ++#if defined(__ppc__) || defined(__ppc64__) ++ ++/* ----------------------------------------------------------------------- ++ ffi.c - Copyright (c) 1998 Geoffrey Keating ++ ++ PowerPC Foreign Function Interface ++ ++ Darwin ABI support (c) 2001 John Hornkvist ++ AIX ABI support (c) 2002 Free Software Foundation, Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#if 0 ++#if defined(POWERPC_DARWIN) ++#include // for sys_icache_invalidate() ++#endif ++ ++#else ++ ++#pragma weak sys_icache_invalidate ++extern void sys_icache_invalidate(void *start, size_t len); ++ ++#endif ++ ++ ++extern void ffi_closure_ASM(void); ++ ++// The layout of a function descriptor. A C function pointer really ++// points to one of these. ++typedef struct aix_fd_struct { ++ void* code_pointer; ++ void* toc; ++} aix_fd; ++ ++/* ffi_prep_args is called by the assembly routine once stack space ++ has been allocated for the function's arguments. ++ ++ The stack layout we want looks like this: ++ ++ | Return address from ffi_call_DARWIN | higher addresses ++ |--------------------------------------------| ++ | Previous backchain pointer 4/8 | stack pointer here ++ |--------------------------------------------|-\ <<< on entry to ++ | Saved r28-r31 (4/8)*4 | | ffi_call_DARWIN ++ |--------------------------------------------| | ++ | Parameters (at least 8*(4/8)=32/64) | | (176) +112 - +288 ++ |--------------------------------------------| | ++ | Space for GPR2 4/8 | | ++ |--------------------------------------------| | stack | ++ | Reserved (4/8)*2 | | grows | ++ |--------------------------------------------| | down V ++ | Space for callee's LR 4/8 | | ++ |--------------------------------------------| | lower addresses ++ | Saved CR 4/8 | | ++ |--------------------------------------------| | stack pointer here ++ | Current backchain pointer 4/8 | | during ++ |--------------------------------------------|-/ <<< ffi_call_DARWIN ++ ++ Note: ppc64 CR is saved in the low word of a long on the stack. ++*/ ++ ++/*@-exportheader@*/ ++void ++ffi_prep_args( ++ extended_cif* inEcif, ++ unsigned *const stack) ++/*@=exportheader@*/ ++{ ++ /* Copy the ecif to a local var so we can trample the arg. ++ BC note: test this with GP later for possible problems... */ ++ volatile extended_cif* ecif = inEcif; ++ ++ const unsigned bytes = ecif->cif->bytes; ++ const unsigned flags = ecif->cif->flags; ++ ++ /* Cast the stack arg from int* to long*. sizeof(long) == 4 in 32-bit mode ++ and 8 in 64-bit mode. */ ++ unsigned long *const longStack = (unsigned long *const)stack; ++ ++ /* 'stacktop' points at the previous backchain pointer. */ ++#if defined(__ppc64__) ++ // In ppc-darwin.s, an extra 96 bytes is reserved for the linkage area, ++ // saved registers, and an extra FPR. ++ unsigned long *const stacktop = ++ (unsigned long *)(unsigned long)((char*)longStack + bytes + 96); ++#elif defined(__ppc__) ++ unsigned long *const stacktop = longStack + (bytes / sizeof(long)); ++#else ++#error undefined architecture ++#endif ++ ++ /* 'fpr_base' points at the space for fpr1, and grows upwards as ++ we use FPR registers. */ ++ double* fpr_base = (double*)(stacktop - ASM_NEEDS_REGISTERS) - ++ NUM_FPR_ARG_REGISTERS; ++ ++#if defined(__ppc64__) ++ // 64-bit saves an extra register, and uses an extra FPR. Knock fpr_base ++ // down a couple pegs. ++ fpr_base -= 2; ++#endif ++ ++ unsigned int fparg_count = 0; ++ ++ /* 'next_arg' grows up as we put parameters in it. */ ++ unsigned long* next_arg = longStack + 6; /* 6 reserved positions. */ ++ ++ int i; ++ double double_tmp; ++ void** p_argv = ecif->avalue; ++ unsigned long gprvalue; ++ ffi_type** ptr = ecif->cif->arg_types; ++ ++ /* Check that everything starts aligned properly. */ ++ FFI_ASSERT(stack == SF_ROUND(stack)); ++ FFI_ASSERT(stacktop == SF_ROUND(stacktop)); ++ FFI_ASSERT(bytes == SF_ROUND(bytes)); ++ ++ /* Deal with return values that are actually pass-by-reference. ++ Rule: ++ Return values are referenced by r3, so r4 is the first parameter. */ ++ ++ if (flags & FLAG_RETVAL_REFERENCE) ++ *next_arg++ = (unsigned long)(char*)ecif->rvalue; ++ ++ /* Now for the arguments. */ ++ for (i = ecif->cif->nargs; i > 0; i--, ptr++, p_argv++) ++ { ++ switch ((*ptr)->type) ++ { ++ /* If a floating-point parameter appears before all of the general- ++ purpose registers are filled, the corresponding GPRs that match ++ the size of the floating-point parameter are shadowed for the ++ benefit of vararg and pre-ANSI functions. */ ++ case FFI_TYPE_FLOAT: ++ double_tmp = *(float*)*p_argv; ++ ++ if (fparg_count < NUM_FPR_ARG_REGISTERS) ++ *fpr_base++ = double_tmp; ++ ++ *(double*)next_arg = double_tmp; ++ ++ next_arg++; ++ fparg_count++; ++ FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); ++ ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ double_tmp = *(double*)*p_argv; ++ ++ if (fparg_count < NUM_FPR_ARG_REGISTERS) ++ *fpr_base++ = double_tmp; ++ ++ *(double*)next_arg = double_tmp; ++ ++ next_arg += MODE_CHOICE(2,1); ++ fparg_count++; ++ FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); ++ ++ break; ++ ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++#if defined(__ppc64__) ++ if (fparg_count < NUM_FPR_ARG_REGISTERS) ++ *(long double*)fpr_base = *(long double*)*p_argv; ++#elif defined(__ppc__) ++ if (fparg_count < NUM_FPR_ARG_REGISTERS - 1) ++ *(long double*)fpr_base = *(long double*)*p_argv; ++ else if (fparg_count == NUM_FPR_ARG_REGISTERS - 1) ++ *(double*)fpr_base = *(double*)*p_argv; ++#else ++#error undefined architecture ++#endif ++ ++ *(long double*)next_arg = *(long double*)*p_argv; ++ fparg_count += 2; ++ fpr_base += 2; ++ next_arg += MODE_CHOICE(4,2); ++ FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); ++ ++ break; ++#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++#if defined(__ppc64__) ++ gprvalue = *(long long*)*p_argv; ++ goto putgpr; ++#elif defined(__ppc__) ++ *(long long*)next_arg = *(long long*)*p_argv; ++ next_arg += 2; ++ break; ++#else ++#error undefined architecture ++#endif ++ ++ case FFI_TYPE_POINTER: ++ gprvalue = *(unsigned long*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_UINT8: ++ gprvalue = *(unsigned char*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_SINT8: ++ gprvalue = *(signed char*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_UINT16: ++ gprvalue = *(unsigned short*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_SINT16: ++ gprvalue = *(signed short*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_STRUCT: ++ { ++#if defined(__ppc64__) ++ unsigned int gprSize = 0; ++ unsigned int fprSize = 0; ++ ++ ffi64_struct_to_reg_form(*ptr, (char*)*p_argv, NULL, &fparg_count, ++ (char*)next_arg, &gprSize, (char*)fpr_base, &fprSize); ++ next_arg += gprSize / sizeof(long); ++ fpr_base += fprSize / sizeof(double); ++ ++#elif defined(__ppc__) ++ char* dest_cpy = (char*)next_arg; ++ ++ /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, ++ SI 4 bytes) are aligned as if they were those modes. ++ Structures with 3 byte in size are padded upwards. */ ++ unsigned size_al = (*ptr)->size; ++ ++ /* If the first member of the struct is a double, then align ++ the struct to double-word. */ ++ if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) ++ size_al = ALIGN((*ptr)->size, 8); ++ ++ if (ecif->cif->abi == FFI_DARWIN) ++ { ++ if (size_al < 3) ++ dest_cpy += 4 - size_al; ++ } ++ ++ memcpy((char*)dest_cpy, (char*)*p_argv, size_al); ++ next_arg += (size_al + 3) / 4; ++#else ++#error undefined architecture ++#endif ++ break; ++ } ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ gprvalue = *(unsigned*)*p_argv; ++ ++putgpr: ++ *next_arg++ = gprvalue; ++ break; ++ ++ default: ++ break; ++ } ++ } ++ ++ /* Check that we didn't overrun the stack... */ ++ //FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS); ++ //FFI_ASSERT((unsigned *)fpr_base ++ // <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); ++ //FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); ++} ++ ++#if defined(__ppc64__) ++ ++bool ++ffi64_struct_contains_fp( ++ const ffi_type* inType) ++{ ++ bool containsFP = false; ++ unsigned int i; ++ ++ for (i = 0; inType->elements[i] != NULL && !containsFP; i++) ++ { ++ if (inType->elements[i]->type == FFI_TYPE_FLOAT || ++ inType->elements[i]->type == FFI_TYPE_DOUBLE || ++ inType->elements[i]->type == FFI_TYPE_LONGDOUBLE) ++ containsFP = true; ++ else if (inType->elements[i]->type == FFI_TYPE_STRUCT) ++ containsFP = ffi64_struct_contains_fp(inType->elements[i]); ++ } ++ ++ return containsFP; ++} ++ ++#endif // defined(__ppc64__) ++ ++/* Perform machine dependent cif processing. */ ++ffi_status ++ffi_prep_cif_machdep( ++ ffi_cif* cif) ++{ ++ /* All this is for the DARWIN ABI. */ ++ int i; ++ ffi_type** ptr; ++ int intarg_count = 0; ++ int fparg_count = 0; ++ unsigned int flags = 0; ++ unsigned int size_al = 0; ++ ++ /* All the machine-independent calculation of cif->bytes will be wrong. ++ Redo the calculation for DARWIN. */ ++ ++ /* Space for the frame pointer, callee's LR, CR, etc, and for ++ the asm's temp regs. */ ++ unsigned int bytes = (6 + ASM_NEEDS_REGISTERS) * sizeof(long); ++ ++ /* Return value handling. The rules are as follows: ++ - 32-bit (or less) integer values are returned in gpr3; ++ - Structures of size <= 4 bytes also returned in gpr3; ++ - 64-bit integer values and structures between 5 and 8 bytes are ++ returned in gpr3 and gpr4; ++ - Single/double FP values are returned in fpr1; ++ - Long double FP (if not equivalent to double) values are returned in ++ fpr1 and fpr2; ++ - Larger structures values are allocated space and a pointer is passed ++ as the first argument. */ ++ switch (cif->rtype->type) ++ { ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ flags |= FLAG_RETURNS_128BITS; ++ flags |= FLAG_RETURNS_FP; ++ break; ++#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_DOUBLE: ++ flags |= FLAG_RETURNS_64BITS; ++ /* Fall through. */ ++ case FFI_TYPE_FLOAT: ++ flags |= FLAG_RETURNS_FP; ++ break; ++ ++#if defined(__ppc64__) ++ case FFI_TYPE_POINTER: ++#endif ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ flags |= FLAG_RETURNS_64BITS; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ { ++#if defined(__ppc64__) ++ ++ if (ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) ++ { ++ flags |= FLAG_RETVAL_REFERENCE; ++ flags |= FLAG_RETURNS_NOTHING; ++ intarg_count++; ++ } ++ else ++ { ++ flags |= FLAG_RETURNS_STRUCT; ++ ++ if (ffi64_struct_contains_fp(cif->rtype)) ++ flags |= FLAG_STRUCT_CONTAINS_FP; ++ } ++ ++#elif defined(__ppc__) ++ ++ flags |= FLAG_RETVAL_REFERENCE; ++ flags |= FLAG_RETURNS_NOTHING; ++ intarg_count++; ++ ++#else ++#error undefined architecture ++#endif ++ break; ++ } ++ ++ case FFI_TYPE_VOID: ++ flags |= FLAG_RETURNS_NOTHING; ++ break; ++ ++ default: ++ /* Returns 32-bit integer, or similar. Nothing to do here. */ ++ break; ++ } ++ ++ /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the ++ first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest ++ goes on the stack. Structures are passed as a pointer to a copy of ++ the structure. Stuff on the stack needs to keep proper alignment. */ ++ for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) ++ { ++ switch ((*ptr)->type) ++ { ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ fparg_count++; ++ /* If this FP arg is going on the stack, it must be ++ 8-byte-aligned. */ ++ if (fparg_count > NUM_FPR_ARG_REGISTERS ++ && intarg_count % 2 != 0) ++ intarg_count++; ++ break; ++ ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ fparg_count += 2; ++ /* If this FP arg is going on the stack, it must be ++ 8-byte-aligned. */ ++ ++ if ( ++#if defined(__ppc64__) ++ fparg_count > NUM_FPR_ARG_REGISTERS + 1 ++#elif defined(__ppc__) ++ fparg_count > NUM_FPR_ARG_REGISTERS ++#else ++#error undefined architecture ++#endif ++ && intarg_count % 2 != 0) ++ intarg_count++; ++ ++ intarg_count += 2; ++ break; ++#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ /* 'long long' arguments are passed as two words, but ++ either both words must fit in registers or both go ++ on the stack. If they go on the stack, they must ++ be 8-byte-aligned. */ ++ if (intarg_count == NUM_GPR_ARG_REGISTERS - 1 ++ || (intarg_count >= NUM_GPR_ARG_REGISTERS ++ && intarg_count % 2 != 0)) ++ intarg_count++; ++ ++ intarg_count += MODE_CHOICE(2,1); ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ size_al = (*ptr)->size; ++ /* If the first member of the struct is a double, then align ++ the struct to double-word. */ ++ if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) ++ size_al = ALIGN((*ptr)->size, 8); ++ ++#if defined(__ppc64__) ++ // Look for FP struct members. ++ unsigned int j; ++ ++ for (j = 0; (*ptr)->elements[j] != NULL; j++) ++ { ++ if ((*ptr)->elements[j]->type == FFI_TYPE_FLOAT || ++ (*ptr)->elements[j]->type == FFI_TYPE_DOUBLE) ++ { ++ fparg_count++; ++ ++ if (fparg_count > NUM_FPR_ARG_REGISTERS) ++ intarg_count++; ++ } ++ else if ((*ptr)->elements[j]->type == FFI_TYPE_LONGDOUBLE) ++ { ++ fparg_count += 2; ++ ++ if (fparg_count > NUM_FPR_ARG_REGISTERS + 1) ++ intarg_count += 2; ++ } ++ else ++ intarg_count++; ++ } ++#elif defined(__ppc__) ++ intarg_count += (size_al + 3) / 4; ++#else ++#error undefined architecture ++#endif ++ ++ break; ++ ++ default: ++ /* Everything else is passed as a 4/8-byte word in a GPR, either ++ the object itself or a pointer to it. */ ++ intarg_count++; ++ break; ++ } ++ } ++ ++ /* Space for the FPR registers, if needed. */ ++ if (fparg_count != 0) ++ { ++ flags |= FLAG_FP_ARGUMENTS; ++#if defined(__ppc64__) ++ bytes += (NUM_FPR_ARG_REGISTERS + 1) * sizeof(double); ++#elif defined(__ppc__) ++ bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); ++#else ++#error undefined architecture ++#endif ++ } ++ ++ /* Stack space. */ ++#if defined(__ppc64__) ++ if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS) ++ bytes += (intarg_count + fparg_count) * sizeof(long); ++#elif defined(__ppc__) ++ if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS) ++ bytes += (intarg_count + 2 * fparg_count) * sizeof(long); ++#else ++#error undefined architecture ++#endif ++ else ++ bytes += NUM_GPR_ARG_REGISTERS * sizeof(long); ++ ++ /* The stack space allocated needs to be a multiple of 16/32 bytes. */ ++ bytes = SF_ROUND(bytes); ++ ++ cif->flags = flags; ++ cif->bytes = bytes; ++ ++ return FFI_OK; ++} ++ ++/*@-declundef@*/ ++/*@-exportheader@*/ ++extern void ++ffi_call_AIX( ++/*@out@*/ extended_cif*, ++ unsigned, ++ unsigned, ++/*@out@*/ unsigned*, ++ void (*fn)(void), ++ void (*fn2)(extended_cif*, unsigned *const)); ++ ++extern void ++ffi_call_DARWIN( ++/*@out@*/ extended_cif*, ++ unsigned long, ++ unsigned, ++/*@out@*/ unsigned*, ++ void (*fn)(void), ++ void (*fn2)(extended_cif*, unsigned *const)); ++/*@=declundef@*/ ++/*@=exportheader@*/ ++ ++void ++ffi_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ void** avalue) ++{ ++ extended_cif ecif; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return ++ value address then we need to make one. */ ++ if ((rvalue == NULL) && ++ (cif->rtype->type == FFI_TYPE_STRUCT)) ++ { ++ /*@-sysunrecog@*/ ++ ecif.rvalue = alloca(cif->rtype->size); ++ /*@=sysunrecog@*/ ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ switch (cif->abi) ++ { ++ case FFI_AIX: ++ /*@-usedef@*/ ++ ffi_call_AIX(&ecif, -cif->bytes, ++ cif->flags, ecif.rvalue, fn, ffi_prep_args); ++ /*@=usedef@*/ ++ break; ++ ++ case FFI_DARWIN: ++ /*@-usedef@*/ ++ ffi_call_DARWIN(&ecif, -(long)cif->bytes, ++ cif->flags, ecif.rvalue, fn, ffi_prep_args); ++ /*@=usedef@*/ ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++/* here I'd like to add the stack frame layout we use in darwin_closure.S ++ and aix_clsoure.S ++ ++ SP previous -> +---------------------------------------+ <--- child frame ++ | back chain to caller 4 | ++ +---------------------------------------+ 4 ++ | saved CR 4 | ++ +---------------------------------------+ 8 ++ | saved LR 4 | ++ +---------------------------------------+ 12 ++ | reserved for compilers 4 | ++ +---------------------------------------+ 16 ++ | reserved for binders 4 | ++ +---------------------------------------+ 20 ++ | saved TOC pointer 4 | ++ +---------------------------------------+ 24 ++ | always reserved 8*4=32 (previous GPRs)| ++ | according to the linkage convention | ++ | from AIX | ++ +---------------------------------------+ 56 ++ | our FPR area 13*8=104 | ++ | f1 | ++ | . | ++ | f13 | ++ +---------------------------------------+ 160 ++ | result area 8 | ++ +---------------------------------------+ 168 ++ | alignement to the next multiple of 16 | ++SP current --> +---------------------------------------+ 176 <- parent frame ++ | back chain to caller 4 | ++ +---------------------------------------+ 180 ++ | saved CR 4 | ++ +---------------------------------------+ 184 ++ | saved LR 4 | ++ +---------------------------------------+ 188 ++ | reserved for compilers 4 | ++ +---------------------------------------+ 192 ++ | reserved for binders 4 | ++ +---------------------------------------+ 196 ++ | saved TOC pointer 4 | ++ +---------------------------------------+ 200 ++ | always reserved 8*4=32 we store our | ++ | GPRs here | ++ | r3 | ++ | . | ++ | r10 | ++ +---------------------------------------+ 232 ++ | overflow part | ++ +---------------------------------------+ xxx ++ | ???? | ++ +---------------------------------------+ xxx ++*/ ++ ++#if !defined(POWERPC_DARWIN) ++ ++#define MIN_LINE_SIZE 32 ++ ++static void ++flush_icache( ++ char* addr) ++{ ++#ifndef _AIX ++ __asm__ volatile ( ++ "dcbf 0,%0\n" ++ "sync\n" ++ "icbi 0,%0\n" ++ "sync\n" ++ "isync" ++ : : "r" (addr) : "memory"); ++#endif ++} ++ ++static void ++flush_range( ++ char* addr, ++ int size) ++{ ++ int i; ++ ++ for (i = 0; i < size; i += MIN_LINE_SIZE) ++ flush_icache(addr + i); ++ ++ flush_icache(addr + size - 1); ++} ++ ++#endif // !defined(POWERPC_DARWIN) ++ ++ffi_status ++ffi_prep_closure( ++ ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*, void*, void**, void*), ++ void* user_data) ++{ ++ switch (cif->abi) ++ { ++ case FFI_DARWIN: ++ { ++ FFI_ASSERT (cif->abi == FFI_DARWIN); ++ ++ unsigned int* tramp = (unsigned int*)&closure->tramp[0]; ++ ++#if defined(__ppc64__) ++ tramp[0] = 0x7c0802a6; // mflr r0 ++ tramp[1] = 0x429f0005; // bcl 20,31,+0x8 ++ tramp[2] = 0x7d6802a6; // mflr r11 ++ tramp[3] = 0x7c0803a6; // mtlr r0 ++ tramp[4] = 0xe98b0018; // ld r12,24(r11) ++ tramp[5] = 0x7d8903a6; // mtctr r12 ++ tramp[6] = 0xe96b0020; // ld r11,32(r11) ++ tramp[7] = 0x4e800420; // bctr ++ *(unsigned long*)&tramp[8] = (unsigned long)ffi_closure_ASM; ++ *(unsigned long*)&tramp[10] = (unsigned long)closure; ++#elif defined(__ppc__) ++ tramp[0] = 0x7c0802a6; // mflr r0 ++ tramp[1] = 0x429f0005; // bcl 20,31,+0x8 ++ tramp[2] = 0x7d6802a6; // mflr r11 ++ tramp[3] = 0x7c0803a6; // mtlr r0 ++ tramp[4] = 0x818b0018; // lwz r12,24(r11) ++ tramp[5] = 0x7d8903a6; // mtctr r12 ++ tramp[6] = 0x816b001c; // lwz r11,28(r11) ++ tramp[7] = 0x4e800420; // bctr ++ tramp[8] = (unsigned long)ffi_closure_ASM; ++ tramp[9] = (unsigned long)closure; ++#else ++#error undefined architecture ++#endif ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ ++ // Flush the icache. Only necessary on Darwin. ++#if defined(POWERPC_DARWIN) ++ sys_icache_invalidate(closure->tramp, FFI_TRAMPOLINE_SIZE); ++#else ++ flush_range(closure->tramp, FFI_TRAMPOLINE_SIZE); ++#endif ++ ++ break; ++ } ++ ++ case FFI_AIX: ++ { ++ FFI_ASSERT (cif->abi == FFI_AIX); ++ ++ ffi_aix_trampoline_struct* tramp_aix = ++ (ffi_aix_trampoline_struct*)(closure->tramp); ++ aix_fd* fd = (aix_fd*)(void*)ffi_closure_ASM; ++ ++ tramp_aix->code_pointer = fd->code_pointer; ++ tramp_aix->toc = fd->toc; ++ tramp_aix->static_chain = closure; ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ break; ++ } ++ ++ default: ++ return FFI_BAD_ABI; ++ } ++ ++ return FFI_OK; ++} ++ ++#if defined(__ppc__) ++ typedef double ldbits[2]; ++ ++ typedef union ++ { ++ ldbits lb; ++ long double ld; ++ } ldu; ++#endif ++ ++typedef union ++{ ++ float f; ++ double d; ++} ffi_dblfl; ++ ++/* The trampoline invokes ffi_closure_ASM, and on entry, r11 holds the ++ address of the closure. After storing the registers that could possibly ++ contain parameters to be passed into the stack frame and setting up space ++ for a return value, ffi_closure_ASM invokes the following helper function ++ to do most of the work. */ ++int ++ffi_closure_helper_DARWIN( ++ ffi_closure* closure, ++ void* rvalue, ++ unsigned long* pgr, ++ ffi_dblfl* pfr) ++{ ++ /* rvalue is the pointer to space for return value in closure assembly ++ pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM ++ pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM. */ ++ ++#if defined(__ppc__) ++ ldu temp_ld; ++#endif ++ ++ double temp; ++ unsigned int i; ++ unsigned int nf = 0; /* number of FPRs already used. */ ++ unsigned int ng = 0; /* number of GPRs already used. */ ++ ffi_cif* cif = closure->cif; ++ long avn = cif->nargs; ++ void** avalue = alloca(cif->nargs * sizeof(void*)); ++ ffi_type** arg_types = cif->arg_types; ++ ++ /* Copy the caller's structure return value address so that the closure ++ returns the data directly to the caller. */ ++#if defined(__ppc64__) ++ if (cif->rtype->type == FFI_TYPE_STRUCT && ++ ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) ++#elif defined(__ppc__) ++ if (cif->rtype->type == FFI_TYPE_STRUCT) ++#else ++#error undefined architecture ++#endif ++ { ++ rvalue = (void*)*pgr; ++ pgr++; ++ ng++; ++ } ++ ++ /* Grab the addresses of the arguments from the stack frame. */ ++ for (i = 0; i < avn; i++) ++ { ++ switch (arg_types[i]->type) ++ { ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT8: ++ avalue[i] = (char*)pgr + MODE_CHOICE(3,7); ++ ng++; ++ pgr++; ++ break; ++ ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT16: ++ avalue[i] = (char*)pgr + MODE_CHOICE(2,6); ++ ng++; ++ pgr++; ++ break; ++ ++#if defined(__ppc__) ++ case FFI_TYPE_POINTER: ++#endif ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT32: ++ avalue[i] = (char*)pgr + MODE_CHOICE(0,4); ++ ng++; ++ pgr++; ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ if (cif->abi == FFI_DARWIN) ++ { ++#if defined(__ppc64__) ++ unsigned int gprSize = 0; ++ unsigned int fprSize = 0; ++ unsigned int savedFPRSize = fprSize; ++ ++ avalue[i] = alloca(arg_types[i]->size); ++ ffi64_struct_to_ram_form(arg_types[i], (const char*)pgr, ++ &gprSize, (const char*)pfr, &fprSize, &nf, avalue[i], NULL); ++ ++ ng += gprSize / sizeof(long); ++ pgr += gprSize / sizeof(long); ++ pfr += (fprSize - savedFPRSize) / sizeof(double); ++ ++#elif defined(__ppc__) ++ /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, ++ SI 4 bytes) are aligned as if they were those modes. */ ++ unsigned int size_al = size_al = arg_types[i]->size; ++ ++ /* If the first member of the struct is a double, then align ++ the struct to double-word. */ ++ if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE) ++ size_al = ALIGN(arg_types[i]->size, 8); ++ ++ if (size_al < 3) ++ avalue[i] = (void*)pgr + MODE_CHOICE(4,8) - size_al; ++ else ++ avalue[i] = (void*)pgr; ++ ++ ng += (size_al + 3) / sizeof(long); ++ pgr += (size_al + 3) / sizeof(long); ++#else ++#error undefined architecture ++#endif ++ } ++ ++ break; ++ ++#if defined(__ppc64__) ++ case FFI_TYPE_POINTER: ++#endif ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_UINT64: ++ /* Long long ints are passed in 1 or 2 GPRs. */ ++ avalue[i] = pgr; ++ ng += MODE_CHOICE(2,1); ++ pgr += MODE_CHOICE(2,1); ++ ++ break; ++ ++ case FFI_TYPE_FLOAT: ++ /* A float value consumes a GPR. ++ There are 13 64-bit floating point registers. */ ++ if (nf < NUM_FPR_ARG_REGISTERS) ++ { ++ temp = pfr->d; ++ pfr->f = (float)temp; ++ avalue[i] = pfr; ++ pfr++; ++ } ++ else ++ avalue[i] = pgr; ++ ++ nf++; ++ ng++; ++ pgr++; ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ /* A double value consumes one or two GPRs. ++ There are 13 64bit floating point registers. */ ++ if (nf < NUM_FPR_ARG_REGISTERS) ++ { ++ avalue[i] = pfr; ++ pfr++; ++ } ++ else ++ avalue[i] = pgr; ++ ++ nf++; ++ ng += MODE_CHOICE(2,1); ++ pgr += MODE_CHOICE(2,1); ++ ++ break; ++ ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_LONGDOUBLE: ++#if defined(__ppc64__) ++ if (nf < NUM_FPR_ARG_REGISTERS) ++ { ++ avalue[i] = pfr; ++ pfr += 2; ++ } ++#elif defined(__ppc__) ++ /* A long double value consumes 2/4 GPRs and 2 FPRs. ++ There are 13 64bit floating point registers. */ ++ if (nf < NUM_FPR_ARG_REGISTERS - 1) ++ { ++ avalue[i] = pfr; ++ pfr += 2; ++ } ++ /* Here we have the situation where one part of the long double ++ is stored in fpr13 and the other part is already on the stack. ++ We use a union to pass the long double to avalue[i]. */ ++ else if (nf == NUM_FPR_ARG_REGISTERS - 1) ++ { ++ memcpy (&temp_ld.lb[0], pfr, sizeof(temp_ld.lb[0])); ++ memcpy (&temp_ld.lb[1], pgr + 2, sizeof(temp_ld.lb[1])); ++ avalue[i] = &temp_ld.ld; ++ } ++#else ++#error undefined architecture ++#endif ++ else ++ avalue[i] = pgr; ++ ++ nf += 2; ++ ng += MODE_CHOICE(4,2); ++ pgr += MODE_CHOICE(4,2); ++ ++ break; ++ ++#endif /* FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE */ ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ } ++ ++ (closure->fun)(cif, rvalue, avalue, closure->user_data); ++ ++ /* Tell ffi_closure_ASM to perform return type promotions. */ ++ return cif->rtype->type; ++} ++ ++#if defined(__ppc64__) ++ ++/* ffi64_struct_to_ram_form ++ ++ Rebuild a struct's natural layout from buffers of concatenated registers. ++ Return the number of registers used. ++ inGPRs[0-7] == r3, inFPRs[0-7] == f1 ... ++*/ ++void ++ffi64_struct_to_ram_form( ++ const ffi_type* inType, ++ const char* inGPRs, ++ unsigned int* ioGPRMarker, ++ const char* inFPRs, ++ unsigned int* ioFPRMarker, ++ unsigned int* ioFPRsUsed, ++ char* outStruct, // caller-allocated ++ unsigned int* ioStructMarker) ++{ ++ unsigned int srcGMarker = 0; ++ unsigned int srcFMarker = 0; ++ unsigned int savedFMarker = 0; ++ unsigned int fprsUsed = 0; ++ unsigned int savedFPRsUsed = 0; ++ unsigned int destMarker = 0; ++ ++ static unsigned int recurseCount = 0; ++ ++ if (ioGPRMarker) ++ srcGMarker = *ioGPRMarker; ++ ++ if (ioFPRMarker) ++ { ++ srcFMarker = *ioFPRMarker; ++ savedFMarker = srcFMarker; ++ } ++ ++ if (ioFPRsUsed) ++ { ++ fprsUsed = *ioFPRsUsed; ++ savedFPRsUsed = fprsUsed; ++ } ++ ++ if (ioStructMarker) ++ destMarker = *ioStructMarker; ++ ++ size_t i; ++ ++ switch (inType->size) ++ { ++ case 1: case 2: case 4: ++ srcGMarker += 8 - inType->size; ++ break; ++ ++ default: ++ break; ++ } ++ ++ for (i = 0; inType->elements[i] != NULL; i++) ++ { ++ switch (inType->elements[i]->type) ++ { ++ case FFI_TYPE_FLOAT: ++ srcFMarker = ALIGN(srcFMarker, 4); ++ srcGMarker = ALIGN(srcGMarker, 4); ++ destMarker = ALIGN(destMarker, 4); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ *(float*)&outStruct[destMarker] = ++ (float)*(double*)&inFPRs[srcFMarker]; ++ srcFMarker += 8; ++ fprsUsed++; ++ } ++ else ++ *(float*)&outStruct[destMarker] = ++ (float)*(double*)&inGPRs[srcGMarker]; ++ ++ srcGMarker += 4; ++ destMarker += 4; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (destMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) ++ srcGMarker = ALIGN(srcGMarker, 8); ++ } ++ ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ srcFMarker = ALIGN(srcFMarker, 8); ++ destMarker = ALIGN(destMarker, 8); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ *(double*)&outStruct[destMarker] = ++ *(double*)&inFPRs[srcFMarker]; ++ srcFMarker += 8; ++ fprsUsed++; ++ } ++ else ++ *(double*)&outStruct[destMarker] = ++ *(double*)&inGPRs[srcGMarker]; ++ ++ destMarker += 8; ++ ++ // Skip next GPR ++ srcGMarker += 8; ++ srcGMarker = ALIGN(srcGMarker, 8); ++ ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ destMarker = ALIGN(destMarker, 16); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ srcFMarker = ALIGN(srcFMarker, 8); ++ srcGMarker = ALIGN(srcGMarker, 8); ++ *(long double*)&outStruct[destMarker] = ++ *(long double*)&inFPRs[srcFMarker]; ++ srcFMarker += 16; ++ fprsUsed += 2; ++ } ++ else ++ { ++ srcFMarker = ALIGN(srcFMarker, 16); ++ srcGMarker = ALIGN(srcGMarker, 16); ++ *(long double*)&outStruct[destMarker] = ++ *(long double*)&inGPRs[srcGMarker]; ++ } ++ ++ destMarker += 16; ++ ++ // Skip next 2 GPRs ++ srcGMarker += 16; ++ srcGMarker = ALIGN(srcGMarker, 8); ++ ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ { ++ if (inType->alignment == 1) // chars only ++ { ++ if (inType->size == 1) ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ else if (inType->size == 2) ++ { ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ i++; ++ } ++ else ++ { ++ memcpy(&outStruct[destMarker], ++ &inGPRs[srcGMarker], inType->size); ++ srcGMarker += inType->size; ++ destMarker += inType->size; ++ i += inType->size - 1; ++ } ++ } ++ else // chars and other stuff ++ { ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (srcGMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) ++ srcGMarker = ALIGN(srcGMarker, inType->alignment); // was 8 ++ } ++ } ++ ++ break; ++ } ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ srcGMarker = ALIGN(srcGMarker, 2); ++ destMarker = ALIGN(destMarker, 2); ++ ++ *(short*)&outStruct[destMarker] = ++ *(short*)&inGPRs[srcGMarker]; ++ srcGMarker += 2; ++ destMarker += 2; ++ ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ srcGMarker = ALIGN(srcGMarker, 4); ++ destMarker = ALIGN(destMarker, 4); ++ ++ *(int*)&outStruct[destMarker] = ++ *(int*)&inGPRs[srcGMarker]; ++ srcGMarker += 4; ++ destMarker += 4; ++ ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ srcGMarker = ALIGN(srcGMarker, 8); ++ destMarker = ALIGN(destMarker, 8); ++ ++ *(long long*)&outStruct[destMarker] = ++ *(long long*)&inGPRs[srcGMarker]; ++ srcGMarker += 8; ++ destMarker += 8; ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ recurseCount++; ++ ffi64_struct_to_ram_form(inType->elements[i], inGPRs, ++ &srcGMarker, inFPRs, &srcFMarker, &fprsUsed, ++ outStruct, &destMarker); ++ recurseCount--; ++ break; ++ ++ default: ++ FFI_ASSERT(0); // unknown element type ++ break; ++ } ++ } ++ ++ srcGMarker = ALIGN(srcGMarker, inType->alignment); ++ ++ // Take care of the special case for 16-byte structs, but not for ++ // nested structs. ++ if (recurseCount == 0 && srcGMarker == 16) ++ { ++ *(long double*)&outStruct[0] = *(long double*)&inGPRs[0]; ++ srcFMarker = savedFMarker; ++ fprsUsed = savedFPRsUsed; ++ } ++ ++ if (ioGPRMarker) ++ *ioGPRMarker = ALIGN(srcGMarker, 8); ++ ++ if (ioFPRMarker) ++ *ioFPRMarker = srcFMarker; ++ ++ if (ioFPRsUsed) ++ *ioFPRsUsed = fprsUsed; ++ ++ if (ioStructMarker) ++ *ioStructMarker = ALIGN(destMarker, 8); ++} ++ ++/* ffi64_struct_to_reg_form ++ ++ Copy a struct's elements into buffers that can be sliced into registers. ++ Return the sizes of the output buffers in bytes. Pass NULL buffer pointers ++ to calculate size only. ++ outGPRs[0-7] == r3, outFPRs[0-7] == f1 ... ++*/ ++void ++ffi64_struct_to_reg_form( ++ const ffi_type* inType, ++ const char* inStruct, ++ unsigned int* ioStructMarker, ++ unsigned int* ioFPRsUsed, ++ char* outGPRs, // caller-allocated ++ unsigned int* ioGPRSize, ++ char* outFPRs, // caller-allocated ++ unsigned int* ioFPRSize) ++{ ++ size_t i; ++ unsigned int srcMarker = 0; ++ unsigned int destGMarker = 0; ++ unsigned int destFMarker = 0; ++ unsigned int savedFMarker = 0; ++ unsigned int fprsUsed = 0; ++ unsigned int savedFPRsUsed = 0; ++ ++ static unsigned int recurseCount = 0; ++ ++ if (ioStructMarker) ++ srcMarker = *ioStructMarker; ++ ++ if (ioFPRsUsed) ++ { ++ fprsUsed = *ioFPRsUsed; ++ savedFPRsUsed = fprsUsed; ++ } ++ ++ if (ioGPRSize) ++ destGMarker = *ioGPRSize; ++ ++ if (ioFPRSize) ++ { ++ destFMarker = *ioFPRSize; ++ savedFMarker = destFMarker; ++ } ++ ++ switch (inType->size) ++ { ++ case 1: case 2: case 4: ++ destGMarker += 8 - inType->size; ++ break; ++ ++ default: ++ break; ++ } ++ ++ for (i = 0; inType->elements[i] != NULL; i++) ++ { ++ switch (inType->elements[i]->type) ++ { ++ // Shadow floating-point types in GPRs for vararg and pre-ANSI ++ // functions. ++ case FFI_TYPE_FLOAT: ++ // Nudge markers to next 4/8-byte boundary ++ srcMarker = ALIGN(srcMarker, 4); ++ destGMarker = ALIGN(destGMarker, 4); ++ destFMarker = ALIGN(destFMarker, 8); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ if (outFPRs != NULL && inStruct != NULL) ++ *(double*)&outFPRs[destFMarker] = ++ (double)*(float*)&inStruct[srcMarker]; ++ ++ destFMarker += 8; ++ fprsUsed++; ++ } ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(double*)&outGPRs[destGMarker] = ++ (double)*(float*)&inStruct[srcMarker]; ++ ++ srcMarker += 4; ++ destGMarker += 4; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (srcMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 4)) ++ destGMarker = ALIGN(destGMarker, 8); ++ } ++ ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ srcMarker = ALIGN(srcMarker, 8); ++ destFMarker = ALIGN(destFMarker, 8); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ if (outFPRs != NULL && inStruct != NULL) ++ *(double*)&outFPRs[destFMarker] = ++ *(double*)&inStruct[srcMarker]; ++ ++ destFMarker += 8; ++ fprsUsed++; ++ } ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(double*)&outGPRs[destGMarker] = ++ *(double*)&inStruct[srcMarker]; ++ ++ srcMarker += 8; ++ ++ // Skip next GPR ++ destGMarker += 8; ++ destGMarker = ALIGN(destGMarker, 8); ++ ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ srcMarker = ALIGN(srcMarker, 16); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ destFMarker = ALIGN(destFMarker, 8); ++ destGMarker = ALIGN(destGMarker, 8); ++ ++ if (outFPRs != NULL && inStruct != NULL) ++ *(long double*)&outFPRs[destFMarker] = ++ *(long double*)&inStruct[srcMarker]; ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long double*)&outGPRs[destGMarker] = ++ *(long double*)&inStruct[srcMarker]; ++ ++ destFMarker += 16; ++ fprsUsed += 2; ++ } ++ else ++ { ++ destGMarker = ALIGN(destGMarker, 16); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long double*)&outGPRs[destGMarker] = ++ *(long double*)&inStruct[srcMarker]; ++ } ++ ++ srcMarker += 16; ++ destGMarker += 16; // Skip next 2 GPRs ++ destGMarker = ALIGN(destGMarker, 8); // was 16 ++ ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ if (inType->alignment == 1) // bytes only ++ { ++ if (inType->size == 1) ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ outGPRs[destGMarker] = inStruct[srcMarker]; ++ ++ srcMarker++; ++ destGMarker++; ++ } ++ else if (inType->size == 2) ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ { ++ outGPRs[destGMarker] = inStruct[srcMarker]; ++ outGPRs[destGMarker + 1] = inStruct[srcMarker + 1]; ++ } ++ ++ srcMarker += 2; ++ destGMarker += 2; ++ ++ i++; ++ } ++ else ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ { ++ // Avoid memcpy for small chunks. ++ if (inType->size <= sizeof(long)) ++ *(long*)&outGPRs[destGMarker] = ++ *(long*)&inStruct[srcMarker]; ++ else ++ memcpy(&outGPRs[destGMarker], ++ &inStruct[srcMarker], inType->size); ++ } ++ ++ srcMarker += inType->size; ++ destGMarker += inType->size; ++ i += inType->size - 1; ++ } ++ } ++ else // bytes and other stuff ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ outGPRs[destGMarker] = inStruct[srcMarker]; ++ ++ srcMarker++; ++ destGMarker++; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (destGMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 4)) ++ destGMarker = ALIGN(destGMarker, inType->alignment); // was 8 ++ } ++ } ++ ++ break; ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ srcMarker = ALIGN(srcMarker, 2); ++ destGMarker = ALIGN(destGMarker, 2); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(short*)&outGPRs[destGMarker] = ++ *(short*)&inStruct[srcMarker]; ++ ++ srcMarker += 2; ++ destGMarker += 2; ++ ++ if (inType->elements[i + 1] == NULL) ++ destGMarker = ALIGN(destGMarker, inType->alignment); ++ ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ srcMarker = ALIGN(srcMarker, 4); ++ destGMarker = ALIGN(destGMarker, 4); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(int*)&outGPRs[destGMarker] = ++ *(int*)&inStruct[srcMarker]; ++ ++ srcMarker += 4; ++ destGMarker += 4; ++ ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ srcMarker = ALIGN(srcMarker, 8); ++ destGMarker = ALIGN(destGMarker, 8); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long long*)&outGPRs[destGMarker] = ++ *(long long*)&inStruct[srcMarker]; ++ ++ srcMarker += 8; ++ destGMarker += 8; ++ ++ if (inType->elements[i + 1] == NULL) ++ destGMarker = ALIGN(destGMarker, inType->alignment); ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ recurseCount++; ++ ffi64_struct_to_reg_form(inType->elements[i], ++ inStruct, &srcMarker, &fprsUsed, outGPRs, ++ &destGMarker, outFPRs, &destFMarker); ++ recurseCount--; ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ } ++ ++ destGMarker = ALIGN(destGMarker, inType->alignment); ++ ++ // Take care of the special case for 16-byte structs, but not for ++ // nested structs. ++ if (recurseCount == 0 && destGMarker == 16) ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long double*)&outGPRs[0] = *(long double*)&inStruct[0]; ++ ++ destFMarker = savedFMarker; ++ fprsUsed = savedFPRsUsed; ++ } ++ ++ if (ioStructMarker) ++ *ioStructMarker = ALIGN(srcMarker, 8); ++ ++ if (ioFPRsUsed) ++ *ioFPRsUsed = fprsUsed; ++ ++ if (ioGPRSize) ++ *ioGPRSize = ALIGN(destGMarker, 8); ++ ++ if (ioFPRSize) ++ *ioFPRSize = ALIGN(destFMarker, 8); ++} ++ ++/* ffi64_stret_needs_ptr ++ ++ Determine whether a returned struct needs a pointer in r3 or can fit ++ in registers. ++*/ ++ ++bool ++ffi64_stret_needs_ptr( ++ const ffi_type* inType, ++ unsigned short* ioGPRCount, ++ unsigned short* ioFPRCount) ++{ ++ // Obvious case first- struct is larger than combined FPR size. ++ if (inType->size > 14 * 8) ++ return true; ++ ++ // Now the struct can physically fit in registers, determine if it ++ // also fits logically. ++ bool needsPtr = false; ++ unsigned short gprsUsed = 0; ++ unsigned short fprsUsed = 0; ++ size_t i; ++ ++ if (ioGPRCount) ++ gprsUsed = *ioGPRCount; ++ ++ if (ioFPRCount) ++ fprsUsed = *ioFPRCount; ++ ++ for (i = 0; inType->elements[i] != NULL && !needsPtr; i++) ++ { ++ switch (inType->elements[i]->type) ++ { ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ gprsUsed++; ++ fprsUsed++; ++ ++ if (fprsUsed > 13) ++ needsPtr = true; ++ ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ gprsUsed += 2; ++ fprsUsed += 2; ++ ++ if (fprsUsed > 14) ++ needsPtr = true; ++ ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ { ++ gprsUsed++; ++ ++ if (gprsUsed > 8) ++ { ++ needsPtr = true; ++ break; ++ } ++ ++ if (inType->elements[i + 1] == NULL) // last byte in the struct ++ break; ++ ++ // Count possible contiguous bytes ahead, up to 8. ++ unsigned short j; ++ ++ for (j = 1; j < 8; j++) ++ { ++ if (inType->elements[i + j] == NULL || ++ !FFI_TYPE_1_BYTE(inType->elements[i + j]->type)) ++ break; ++ } ++ ++ i += j - 1; // allow for i++ before the test condition ++ ++ break; ++ } ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ gprsUsed++; ++ ++ if (gprsUsed > 8) ++ needsPtr = true; ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ needsPtr = ffi64_stret_needs_ptr( ++ inType->elements[i], &gprsUsed, &fprsUsed); ++ ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ } ++ ++ if (ioGPRCount) ++ *ioGPRCount = gprsUsed; ++ ++ if (ioFPRCount) ++ *ioFPRCount = fprsUsed; ++ ++ return needsPtr; ++} ++ ++/* ffi64_data_size ++ ++ Calculate the size in bytes of an ffi type. ++*/ ++ ++unsigned int ++ffi64_data_size( ++ const ffi_type* inType) ++{ ++ unsigned int size = 0; ++ ++ switch (inType->type) ++ { ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ size = 1; ++ break; ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ size = 2; ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_FLOAT: ++ size = 4; ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_DOUBLE: ++ size = 8; ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ size = 16; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ ffi64_struct_to_reg_form( ++ inType, NULL, NULL, NULL, NULL, &size, NULL, NULL); ++ break; ++ ++ case FFI_TYPE_VOID: ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ ++ return size; ++} ++ ++#endif /* defined(__ppc64__) */ ++#endif /* __ppc__ || __ppc64__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S +new file mode 100644 +index 0000000..7162fa1 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S +@@ -0,0 +1,418 @@ ++#if defined(__ppc64__) ++ ++/* ----------------------------------------------------------------------- ++ ppc64-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, ++ Inc. based on ppc_closure.S ++ ++ PowerPC Assembly glue. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++ ++#include ++#include // for FFI_TRAMPOLINE_SIZE ++#include ++#include ++ ++ .file "ppc64-darwin_closure.S" ++.text ++ .align LOG2_GPR_BYTES ++ .globl _ffi_closure_ASM ++ ++.text ++ .align LOG2_GPR_BYTES ++ ++_ffi_closure_ASM: ++LFB1: ++ mflr r0 ++ stg r0,SF_RETURN(r1) // save return address ++ ++ // Save GPRs 3 - 10 (aligned to 8) in the parents outgoing area. ++ stg r3,SF_ARG1(r1) ++ stg r4,SF_ARG2(r1) ++ stg r5,SF_ARG3(r1) ++ stg r6,SF_ARG4(r1) ++ stg r7,SF_ARG5(r1) ++ stg r8,SF_ARG6(r1) ++ stg r9,SF_ARG7(r1) ++ stg r10,SF_ARG8(r1) ++ ++LCFI0: ++/* 48 bytes (Linkage Area) ++ 64 bytes (outgoing parameter area, always reserved) ++ 112 bytes (14*8 for incoming FPR) ++ ? bytes (result) ++ 112 bytes (14*8 for outgoing FPR) ++ 16 bytes (2 saved registers) ++ 352 + ? total bytes ++*/ ++ ++ std r31,-8(r1) // Save registers we use. ++ std r30,-16(r1) ++ mr r30,r1 // Save the old SP. ++ mr r31,r11 // Save the ffi_closure around ffi64_data_size. ++ ++ // Calculate the space we need. ++ stdu r1,-SF_MINSIZE(r1) ++ ld r3,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* ++ ld r3,16(r3) // ffi_cif->rtype* ++ bl Lffi64_data_size$stub ++ ld r1,0(r1) ++ ++ addi r3,r3,352 // Add our overhead. ++ neg r3,r3 ++ li r0,-32 // Align to 32 bytes. ++ and r3,r3,r0 ++ stdux r1,r1,r3 // Grow the stack. ++ ++ mr r11,r31 // Copy the ffi_closure back. ++ ++LCFI1: ++ // We want to build up an area for the parameters passed ++ // in registers. (both floating point and integer) ++ ++/* 320 bytes (callee stack frame aligned to 32) ++ 48 bytes (caller linkage area) ++ 368 (start of caller parameter area aligned to 8) ++*/ ++ ++ // Save FPRs 1 - 14. (aligned to 8) ++ stfd f1,112(r1) ++ stfd f2,120(r1) ++ stfd f3,128(r1) ++ stfd f4,136(r1) ++ stfd f5,144(r1) ++ stfd f6,152(r1) ++ stfd f7,160(r1) ++ stfd f8,168(r1) ++ stfd f9,176(r1) ++ stfd f10,184(r1) ++ stfd f11,192(r1) ++ stfd f12,200(r1) ++ stfd f13,208(r1) ++ stfd f14,216(r1) ++ ++ // Set up registers for the routine that actually does the work. ++ mr r3,r11 // context pointer from the trampoline ++ addi r4,r1,224 // result storage ++ addi r5,r30,SF_ARG1 // saved GPRs ++ addi r6,r1,112 // saved FPRs ++ bl Lffi_closure_helper_DARWIN$stub ++ ++ // Look the proper starting point in table ++ // by using return type as an offset. ++ addi r5,r1,224 // Get pointer to results area. ++ bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. ++ mflr r4 // Move to r4. ++ slwi r3,r3,4 // Now multiply return type by 16. ++ add r3,r3,r4 // Add contents of table to table address. ++ mtctr r3 ++ bctr ++ ++LFE1: ++ // Each of the ret_typeX code fragments has to be exactly 16 bytes long ++ // (4 instructions). For cache effectiveness we align to a 16 byte ++ // boundary first. ++ .align 4 ++ nop ++ nop ++ nop ++ ++Lget_ret_type0_addr: ++ blrl ++ ++// case FFI_TYPE_VOID ++Lret_type0: ++ b Lfinish ++ nop ++ nop ++ nop ++ ++// case FFI_TYPE_INT ++Lret_type1: ++ lwz r3,4(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_FLOAT ++Lret_type2: ++ lfs f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_DOUBLE ++Lret_type3: ++ lfd f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_LONGDOUBLE ++Lret_type4: ++ lfd f1,0(r5) ++ lfd f2,8(r5) ++ b Lfinish ++ nop ++ ++// case FFI_TYPE_UINT8 ++Lret_type5: ++ lbz r3,7(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT8 ++Lret_type6: ++ lbz r3,7(r5) ++ extsb r3,r3 ++ b Lfinish ++ nop ++ ++// case FFI_TYPE_UINT16 ++Lret_type7: ++ lhz r3,6(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT16 ++Lret_type8: ++ lha r3,6(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_UINT32 ++Lret_type9: // same as Lret_type1 ++ lwz r3,4(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT32 ++Lret_type10: // same as Lret_type1 ++ lwz r3,4(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_UINT64 ++Lret_type11: ++ ld r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT64 ++Lret_type12: // same as Lret_type11 ++ ld r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_STRUCT ++Lret_type13: ++ b Lret_struct ++ nop ++ nop ++ nop ++ ++// ** End 16-byte aligned cases ** ++// case FFI_TYPE_POINTER ++// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types ++// are added in future, the following code will need to be updated and ++// padded to 16 bytes. ++Lret_type14: ++ lg r3,0(r5) ++ b Lfinish ++ ++// copy struct into registers ++Lret_struct: ++ ld r31,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* ++ ld r3,16(r31) // ffi_cif->rtype* ++ ld r31,24(r31) // ffi_cif->flags ++ mr r4,r5 // copy struct* to 2nd arg ++ addi r7,r1,SF_ARG9 // GPR return area ++ addi r9,r30,-16-(14*8) // FPR return area ++ li r5,0 // struct offset ptr (NULL) ++ li r6,0 // FPR used count ptr (NULL) ++ li r8,0 // GPR return area size ptr (NULL) ++ li r10,0 // FPR return area size ptr (NULL) ++ bl Lffi64_struct_to_reg_form$stub ++ ++ // Load GPRs ++ ld r3,SF_ARG9(r1) ++ ld r4,SF_ARG10(r1) ++ ld r5,SF_ARG11(r1) ++ ld r6,SF_ARG12(r1) ++ nop ++ ld r7,SF_ARG13(r1) ++ ld r8,SF_ARG14(r1) ++ ld r9,SF_ARG15(r1) ++ ld r10,SF_ARG16(r1) ++ nop ++ ++ // Load FPRs ++ mtcrf 0x2,r31 ++ bf 26,Lfinish ++ lfd f1,-16-(14*8)(r30) ++ lfd f2,-16-(13*8)(r30) ++ lfd f3,-16-(12*8)(r30) ++ lfd f4,-16-(11*8)(r30) ++ nop ++ lfd f5,-16-(10*8)(r30) ++ lfd f6,-16-(9*8)(r30) ++ lfd f7,-16-(8*8)(r30) ++ lfd f8,-16-(7*8)(r30) ++ nop ++ lfd f9,-16-(6*8)(r30) ++ lfd f10,-16-(5*8)(r30) ++ lfd f11,-16-(4*8)(r30) ++ lfd f12,-16-(3*8)(r30) ++ nop ++ lfd f13,-16-(2*8)(r30) ++ lfd f14,-16-(1*8)(r30) ++ // Fall through ++ ++// case done ++Lfinish: ++ lg r1,0(r1) // Restore stack pointer. ++ ld r31,-8(r1) // Restore registers we used. ++ ld r30,-16(r1) ++ lg r0,SF_RETURN(r1) // Get return address. ++ mtlr r0 // Reset link register. ++ blr ++ ++// END(ffi_closure_ASM) ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ; Length of Common Information Entry ++LSCIE1: ++ .long 0x0 ; CIE Identifier Tag ++ .byte 0x1 ; CIE Version ++ .ascii "zR\0" ; CIE Augmentation ++ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor ++ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte 0x41 ; CIE RA Column ++ .byte 0x1 ; uleb128 0x1; Augmentation size ++ .byte 0x10 ; FDE Encoding (pcrel) ++ .byte 0xc ; DW_CFA_def_cfa ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x0 ; uleb128 0x0 ++ .align LOG2_GPR_BYTES ++LECIE1: ++.globl _ffi_closure_ASM.eh ++_ffi_closure_ASM.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ; FDE Length ++ ++LASFDE1: ++ .long LASFDE1-EH_frame1 ; FDE CIE offset ++ .g_long LFB1-. ; FDE initial location ++ .set L$set$3,LFE1-LFB1 ++ .g_long L$set$3 ; FDE address range ++ .byte 0x0 ; uleb128 0x0; Augmentation size ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$3,LCFI1-LCFI0 ++ .long L$set$3 ++ .byte 0xe ; DW_CFA_def_cfa_offset ++ .byte 176,1 ; uleb128 176 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$4,LCFI0-LFB1 ++ .long L$set$4 ++ .byte 0x11 ; DW_CFA_offset_extended_sf ++ .byte 0x41 ; uleb128 0x41 ++ .byte 0x7e ; sleb128 -2 ++ .align LOG2_GPR_BYTES ++ ++LEFDE1: ++.data ++ .align LOG2_GPR_BYTES ++LDFCM0: ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi_closure_helper_DARWIN$stub: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ mflr r0 ++ bcl 20,31,LO$ffi_closure_helper_DARWIN ++ ++LO$ffi_closure_helper_DARWIN: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) ++ mtlr r0 ++ lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi_closure_helper_DARWIN$lazy_ptr: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ .g_long dyld_stub_binding_helper ++ ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi64_struct_to_reg_form$stub: ++ .indirect_symbol _ffi64_struct_to_reg_form ++ mflr r0 ++ bcl 20,31,LO$ffi64_struct_to_reg_form ++ ++LO$ffi64_struct_to_reg_form: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form) ++ mtlr r0 ++ lgu r12,lo16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form)(r11) ++ mtctr r12 ++ bctr ++ ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi64_data_size$stub: ++ .indirect_symbol _ffi64_data_size ++ mflr r0 ++ bcl 20,31,LO$ffi64_data_size ++ ++LO$ffi64_data_size: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size) ++ mtlr r0 ++ lgu r12,lo16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi64_struct_to_reg_form$lazy_ptr: ++ .indirect_symbol _ffi64_struct_to_reg_form ++ .g_long dyld_stub_binding_helper ++ ++L_ffi64_data_size$lazy_ptr: ++ .indirect_symbol _ffi64_data_size ++ .g_long dyld_stub_binding_helper ++ ++#endif // __ppc64__ +diff -r -u ./Modules/_ctypes/libffi_osx/types.c ./Modules/_ctypes/libffi_osx/types.c +new file mode 100644 +index 0000000..44806ae +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/types.c +@@ -0,0 +1,115 @@ ++/* ----------------------------------------------------------------------- ++ types.c - Copyright (c) 1996, 1998 Red Hat, Inc. ++ ++ Predefined ffi_types needed by libffi. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++/* Type definitions */ ++#define FFI_INTEGRAL_TYPEDEF(n, s, a, t) \ ++ ffi_type ffi_type_##n = { s, a, t, NULL } ++#define FFI_AGGREGATE_TYPEDEF(n, e) \ ++ ffi_type ffi_type_##n = { 0, 0, FFI_TYPE_STRUCT, e } ++ ++FFI_INTEGRAL_TYPEDEF(uint8, 1, 1, FFI_TYPE_UINT8); ++FFI_INTEGRAL_TYPEDEF(sint8, 1, 1, FFI_TYPE_SINT8); ++FFI_INTEGRAL_TYPEDEF(uint16, 2, 2, FFI_TYPE_UINT16); ++FFI_INTEGRAL_TYPEDEF(sint16, 2, 2, FFI_TYPE_SINT16); ++FFI_INTEGRAL_TYPEDEF(uint32, 4, 4, FFI_TYPE_UINT32); ++FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32); ++FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT); ++ ++/* Size and alignment are fake here. They must not be 0. */ ++FFI_INTEGRAL_TYPEDEF(void, 1, 1, FFI_TYPE_VOID); ++ ++#if defined ALPHA || defined SPARC64 || defined X86_64 || \ ++ defined S390X || defined IA64 || defined POWERPC64 ++FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER); ++#else ++FFI_INTEGRAL_TYPEDEF(pointer, 4, 4, FFI_TYPE_POINTER); ++#endif ++ ++#if defined X86 || defined ARM || defined M68K || defined(X86_DARWIN) ++ ++# ifdef X86_64 ++ FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); ++ FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); ++# else ++ FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); ++ FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); ++# endif ++ ++#elif defined(POWERPC_DARWIN) ++FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); ++FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); ++#elif defined SH ++FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); ++FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); ++#else ++FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); ++FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); ++#endif ++ ++#if defined X86 || defined X86_WIN32 || defined M68K || defined(X86_DARWIN) ++ ++# if defined X86_WIN32 || defined X86_64 ++ FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); ++# endif ++ ++# ifdef X86_DARWIN ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE); ++# endif ++ ++#elif defined ARM || defined SH || defined POWERPC_AIX ++FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); ++FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE); ++#elif defined POWERPC_DARWIN ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++ ++# if __GNUC__ >= 4 ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); ++# endif ++ ++#elif defined SPARC ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++ ++# ifdef SPARC64 ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE); ++# endif ++ ++#elif defined X86_64 || defined POWERPC64 ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++#else ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); ++#endif +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/x86/darwin64.S ./Modules/_ctypes/libffi_osx/x86/darwin64.S +new file mode 100644 +index 0000000..165d469 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/darwin64.S +@@ -0,0 +1,417 @@ ++/* ----------------------------------------------------------------------- ++ darwin64.S - Copyright (c) 2006 Free Software Foundation, Inc. ++ derived from unix64.S ++ ++ x86-64 Foreign Function Interface for Darwin. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#ifdef __x86_64__ ++#define LIBFFI_ASM ++#include ++#include ++ ++ .file "darwin64.S" ++.text ++ ++/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, ++ void *raddr, void (*fnaddr)()); ++ ++ Bit o trickiness here -- ARGS+BYTES is the base of the stack frame ++ for this function. This has been allocated by ffi_call. We also ++ deallocate some of the stack that has been alloca'd. */ ++ ++ .align 3 ++ .globl _ffi_call_unix64 ++ ++_ffi_call_unix64: ++LUW0: ++ movq (%rsp), %r10 /* Load return address. */ ++ movq %rdi, %r12 /* Save a copy of the register area. */ ++ leaq (%rdi, %rsi), %rax /* Find local stack base. */ ++ movq %rdx, (%rax) /* Save flags. */ ++ movq %rcx, 8(%rax) /* Save raddr. */ ++ movq %rbp, 16(%rax) /* Save old frame pointer. */ ++ movq %r10, 24(%rax) /* Relocate return address. */ ++ movq %rax, %rbp /* Finalize local stack frame. */ ++LUW1: ++ /* movq %rdi, %r10 // Save a copy of the register area. */ ++ movq %r12, %r10 ++ movq %r8, %r11 /* Save a copy of the target fn. */ ++ movl %r9d, %eax /* Set number of SSE registers. */ ++ ++ /* Load up all argument registers. */ ++ movq (%r10), %rdi ++ movq 8(%r10), %rsi ++ movq 16(%r10), %rdx ++ movq 24(%r10), %rcx ++ movq 32(%r10), %r8 ++ movq 40(%r10), %r9 ++ testl %eax, %eax ++ jnz Lload_sse ++Lret_from_load_sse: ++ ++ /* Deallocate the reg arg area. */ ++ leaq 176(%r10), %rsp ++ ++ /* Call the user function. */ ++ call *%r11 ++ ++ /* Deallocate stack arg area; local stack frame in redzone. */ ++ leaq 24(%rbp), %rsp ++ ++ movq 0(%rbp), %rcx /* Reload flags. */ ++ movq 8(%rbp), %rdi /* Reload raddr. */ ++ movq 16(%rbp), %rbp /* Reload old frame pointer. */ ++LUW2: ++ ++ /* The first byte of the flags contains the FFI_TYPE. */ ++ movzbl %cl, %r10d ++ leaq Lstore_table(%rip), %r11 ++ movslq (%r11, %r10, 4), %r10 ++ addq %r11, %r10 ++ jmp *%r10 ++ ++Lstore_table: ++ .long Lst_void-Lstore_table /* FFI_TYPE_VOID */ ++ .long Lst_sint32-Lstore_table /* FFI_TYPE_INT */ ++ .long Lst_float-Lstore_table /* FFI_TYPE_FLOAT */ ++ .long Lst_double-Lstore_table /* FFI_TYPE_DOUBLE */ ++ .long Lst_ldouble-Lstore_table /* FFI_TYPE_LONGDOUBLE */ ++ .long Lst_uint8-Lstore_table /* FFI_TYPE_UINT8 */ ++ .long Lst_sint8-Lstore_table /* FFI_TYPE_SINT8 */ ++ .long Lst_uint16-Lstore_table /* FFI_TYPE_UINT16 */ ++ .long Lst_sint16-Lstore_table /* FFI_TYPE_SINT16 */ ++ .long Lst_uint32-Lstore_table /* FFI_TYPE_UINT32 */ ++ .long Lst_sint32-Lstore_table /* FFI_TYPE_SINT32 */ ++ .long Lst_int64-Lstore_table /* FFI_TYPE_UINT64 */ ++ .long Lst_int64-Lstore_table /* FFI_TYPE_SINT64 */ ++ .long Lst_struct-Lstore_table /* FFI_TYPE_STRUCT */ ++ .long Lst_int64-Lstore_table /* FFI_TYPE_POINTER */ ++ ++ .text ++ .align 3 ++Lst_void: ++ ret ++ .align 3 ++Lst_uint8: ++ movzbq %al, %rax ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_sint8: ++ movsbq %al, %rax ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_uint16: ++ movzwq %ax, %rax ++ movq %rax, (%rdi) ++ .align 3 ++Lst_sint16: ++ movswq %ax, %rax ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_uint32: ++ movl %eax, %eax ++ movq %rax, (%rdi) ++ .align 3 ++Lst_sint32: ++ cltq ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_int64: ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_float: ++ movss %xmm0, (%rdi) ++ ret ++ .align 3 ++Lst_double: ++ movsd %xmm0, (%rdi) ++ ret ++Lst_ldouble: ++ fstpt (%rdi) ++ ret ++ .align 3 ++Lst_struct: ++ leaq -20(%rsp), %rsi /* Scratch area in redzone. */ ++ ++ /* We have to locate the values now, and since we don't want to ++ write too much data into the user's return value, we spill the ++ value to a 16 byte scratch area first. Bits 8, 9, and 10 ++ control where the values are located. Only one of the three ++ bits will be set; see ffi_prep_cif_machdep for the pattern. */ ++ movd %xmm0, %r10 ++ movd %xmm1, %r11 ++ testl $0x100, %ecx ++ cmovnz %rax, %rdx ++ cmovnz %r10, %rax ++ testl $0x200, %ecx ++ cmovnz %r10, %rdx ++ testl $0x400, %ecx ++ cmovnz %r10, %rax ++ cmovnz %r11, %rdx ++ movq %rax, (%rsi) ++ movq %rdx, 8(%rsi) ++ ++ /* Bits 12-31 contain the true size of the structure. Copy from ++ the scratch area to the true destination. */ ++ shrl $12, %ecx ++ rep movsb ++ ret ++ ++ /* Many times we can avoid loading any SSE registers at all. ++ It's not worth an indirect jump to load the exact set of ++ SSE registers needed; zero or all is a good compromise. */ ++ .align 3 ++LUW3: ++Lload_sse: ++ movdqa 48(%r10), %xmm0 ++ movdqa 64(%r10), %xmm1 ++ movdqa 80(%r10), %xmm2 ++ movdqa 96(%r10), %xmm3 ++ movdqa 112(%r10), %xmm4 ++ movdqa 128(%r10), %xmm5 ++ movdqa 144(%r10), %xmm6 ++ movdqa 160(%r10), %xmm7 ++ jmp Lret_from_load_sse ++ ++LUW4: ++ .align 3 ++ .globl _ffi_closure_unix64 ++ ++_ffi_closure_unix64: ++LUW5: ++ /* The carry flag is set by the trampoline iff SSE registers ++ are used. Don't clobber it before the branch instruction. */ ++ leaq -200(%rsp), %rsp ++LUW6: ++ movq %rdi, (%rsp) ++ movq %rsi, 8(%rsp) ++ movq %rdx, 16(%rsp) ++ movq %rcx, 24(%rsp) ++ movq %r8, 32(%rsp) ++ movq %r9, 40(%rsp) ++ jc Lsave_sse ++Lret_from_save_sse: ++ ++ movq %r10, %rdi ++ leaq 176(%rsp), %rsi ++ movq %rsp, %rdx ++ leaq 208(%rsp), %rcx ++ call _ffi_closure_unix64_inner ++ ++ /* Deallocate stack frame early; return value is now in redzone. */ ++ addq $200, %rsp ++LUW7: ++ ++ /* The first byte of the return value contains the FFI_TYPE. */ ++ movzbl %al, %r10d ++ leaq Lload_table(%rip), %r11 ++ movslq (%r11, %r10, 4), %r10 ++ addq %r11, %r10 ++ jmp *%r10 ++ ++Lload_table: ++ .long Lld_void-Lload_table /* FFI_TYPE_VOID */ ++ .long Lld_int32-Lload_table /* FFI_TYPE_INT */ ++ .long Lld_float-Lload_table /* FFI_TYPE_FLOAT */ ++ .long Lld_double-Lload_table /* FFI_TYPE_DOUBLE */ ++ .long Lld_ldouble-Lload_table /* FFI_TYPE_LONGDOUBLE */ ++ .long Lld_int8-Lload_table /* FFI_TYPE_UINT8 */ ++ .long Lld_int8-Lload_table /* FFI_TYPE_SINT8 */ ++ .long Lld_int16-Lload_table /* FFI_TYPE_UINT16 */ ++ .long Lld_int16-Lload_table /* FFI_TYPE_SINT16 */ ++ .long Lld_int32-Lload_table /* FFI_TYPE_UINT32 */ ++ .long Lld_int32-Lload_table /* FFI_TYPE_SINT32 */ ++ .long Lld_int64-Lload_table /* FFI_TYPE_UINT64 */ ++ .long Lld_int64-Lload_table /* FFI_TYPE_SINT64 */ ++ .long Lld_struct-Lload_table /* FFI_TYPE_STRUCT */ ++ .long Lld_int64-Lload_table /* FFI_TYPE_POINTER */ ++ ++ .text ++ .align 3 ++Lld_void: ++ ret ++ .align 3 ++Lld_int8: ++ movzbl -24(%rsp), %eax ++ ret ++ .align 3 ++Lld_int16: ++ movzwl -24(%rsp), %eax ++ ret ++ .align 3 ++Lld_int32: ++ movl -24(%rsp), %eax ++ ret ++ .align 3 ++Lld_int64: ++ movq -24(%rsp), %rax ++ ret ++ .align 3 ++Lld_float: ++ movss -24(%rsp), %xmm0 ++ ret ++ .align 3 ++Lld_double: ++ movsd -24(%rsp), %xmm0 ++ ret ++ .align 3 ++Lld_ldouble: ++ fldt -24(%rsp) ++ ret ++ .align 3 ++Lld_struct: ++ /* There are four possibilities here, %rax/%rdx, %xmm0/%rax, ++ %rax/%xmm0, %xmm0/%xmm1. We collapse two by always loading ++ both rdx and xmm1 with the second word. For the remaining, ++ bit 8 set means xmm0 gets the second word, and bit 9 means ++ that rax gets the second word. */ ++ movq -24(%rsp), %rcx ++ movq -16(%rsp), %rdx ++ movq -16(%rsp), %xmm1 ++ testl $0x100, %eax ++ cmovnz %rdx, %rcx ++ movd %rcx, %xmm0 ++ testl $0x200, %eax ++ movq -24(%rsp), %rax ++ cmovnz %rdx, %rax ++ ret ++ ++ /* See the comment above Lload_sse; the same logic applies here. */ ++ .align 3 ++LUW8: ++Lsave_sse: ++ movdqa %xmm0, 48(%rsp) ++ movdqa %xmm1, 64(%rsp) ++ movdqa %xmm2, 80(%rsp) ++ movdqa %xmm3, 96(%rsp) ++ movdqa %xmm4, 112(%rsp) ++ movdqa %xmm5, 128(%rsp) ++ movdqa %xmm6, 144(%rsp) ++ movdqa %xmm7, 160(%rsp) ++ jmp Lret_from_save_sse ++ ++LUW9: ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 /* CIE Length */ ++ .long L$set$0 ++LSCIE1: ++ .long 0x0 /* CIE Identifier Tag */ ++ .byte 0x1 /* CIE Version */ ++ .ascii "zR\0" /* CIE Augmentation */ ++ .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ ++ .byte 0x78 /* sleb128 -8; CIE Data Alignment Factor */ ++ .byte 0x10 /* CIE RA Column */ ++ .byte 0x1 /* uleb128 0x1; Augmentation size */ ++ .byte 0x10 /* FDE Encoding (pcrel sdata4) */ ++ .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ ++ .byte 0x7 /* uleb128 0x7 */ ++ .byte 0x8 /* uleb128 0x8 */ ++ .byte 0x90 /* DW_CFA_offset, column 0x10 */ ++ .byte 0x1 ++ .align 3 ++LECIE1: ++ .globl _ffi_call_unix64.eh ++_ffi_call_unix64.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 /* FDE Length */ ++ .long L$set$1 ++LASFDE1: ++ .long LASFDE1-EH_frame1 /* FDE CIE offset */ ++ .quad LUW0-. /* FDE initial location */ ++ .set L$set$2,LUW4-LUW0 /* FDE address range */ ++ .quad L$set$2 ++ .byte 0x0 /* Augmentation size */ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$3,LUW1-LUW0 ++ .long L$set$3 ++ ++ /* New stack frame based off rbp. This is a itty bit of unwind ++ trickery in that the CFA *has* changed. There is no easy way ++ to describe it correctly on entry to the function. Fortunately, ++ it doesn't matter too much since at all points we can correctly ++ unwind back to ffi_call. Note that the location to which we ++ moved the return address is (the new) CFA-8, so from the ++ perspective of the unwind info, it hasn't moved. */ ++ .byte 0xc /* DW_CFA_def_cfa, %rbp offset 32 */ ++ .byte 0x6 ++ .byte 0x20 ++ .byte 0x80+6 /* DW_CFA_offset, %rbp offset 2*-8 */ ++ .byte 0x2 ++ .byte 0xa /* DW_CFA_remember_state */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$4,LUW2-LUW1 ++ .long L$set$4 ++ .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ ++ .byte 0x7 ++ .byte 0x8 ++ .byte 0xc0+6 /* DW_CFA_restore, %rbp */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$5,LUW3-LUW2 ++ .long L$set$5 ++ .byte 0xb /* DW_CFA_restore_state */ ++ ++ .align 3 ++LEFDE1: ++ .globl _ffi_closure_unix64.eh ++_ffi_closure_unix64.eh: ++LSFDE3: ++ .set L$set$6,LEFDE3-LASFDE3 /* FDE Length */ ++ .long L$set$6 ++LASFDE3: ++ .long LASFDE3-EH_frame1 /* FDE CIE offset */ ++ .quad LUW5-. /* FDE initial location */ ++ .set L$set$7,LUW9-LUW5 /* FDE address range */ ++ .quad L$set$7 ++ .byte 0x0 /* Augmentation size */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$8,LUW6-LUW5 ++ .long L$set$8 ++ .byte 0xe /* DW_CFA_def_cfa_offset */ ++ .byte 208,1 /* uleb128 208 */ ++ .byte 0xa /* DW_CFA_remember_state */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$9,LUW7-LUW6 ++ .long L$set$9 ++ .byte 0xe /* DW_CFA_def_cfa_offset */ ++ .byte 0x8 ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$10,LUW8-LUW7 ++ .long L$set$10 ++ .byte 0xb /* DW_CFA_restore_state */ ++ ++ .align 3 ++LEFDE3: ++ .subsections_via_symbols ++ ++#endif /* __x86_64__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S +new file mode 100644 +index 0000000..925a841 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S +@@ -0,0 +1,422 @@ ++#ifdef __i386__ ++/* ----------------------------------------------------------------------- ++ darwin.S - Copyright (c) 1996, 1998, 2001, 2002, 2003 Red Hat, Inc. ++ ++ X86 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++/* ++ * This file is based on sysv.S and then hacked up by Ronald who hasn't done ++ * assembly programming in 8 years. ++ */ ++ ++#ifndef __x86_64__ ++ ++#define LIBFFI_ASM ++#include ++#include ++ ++#ifdef PyObjC_STRICT_DEBUGGING ++ /* XXX: Debugging of stack alignment, to be removed */ ++#define ASSERT_STACK_ALIGNED movdqa -16(%esp), %xmm0 ++#else ++#define ASSERT_STACK_ALIGNED ++#endif ++ ++.text ++ ++.globl _ffi_prep_args ++ ++ .align 4 ++.globl _ffi_call_SYSV ++ ++_ffi_call_SYSV: ++LFB1: ++ pushl %ebp ++LCFI0: ++ movl %esp,%ebp ++LCFI1: ++ subl $8,%esp ++ /* Make room for all of the new args. */ ++ movl 16(%ebp),%ecx ++ subl %ecx,%esp ++ ++ movl %esp,%eax ++ ++ /* Place all of the ffi_prep_args in position */ ++ subl $8,%esp ++ pushl 12(%ebp) ++ pushl %eax ++ call *8(%ebp) ++ ++ /* Return stack to previous state and call the function */ ++ addl $16,%esp ++ ++ call *28(%ebp) ++ ++ /* Remove the space we pushed for the args */ ++ movl 16(%ebp),%ecx ++ addl %ecx,%esp ++ ++ /* Load %ecx with the return type code */ ++ movl 20(%ebp),%ecx ++ ++ /* If the return value pointer is NULL, assume no return value. */ ++ cmpl $0,24(%ebp) ++ jne Lretint ++ ++ /* Even if there is no space for the return value, we are ++ obliged to handle floating-point values. */ ++ cmpl $FFI_TYPE_FLOAT,%ecx ++ jne Lnoretval ++ fstp %st(0) ++ ++ jmp Lepilogue ++ ++Lretint: ++ cmpl $FFI_TYPE_INT,%ecx ++ jne Lretfloat ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movl %eax,0(%ecx) ++ jmp Lepilogue ++ ++Lretfloat: ++ cmpl $FFI_TYPE_FLOAT,%ecx ++ jne Lretdouble ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ fstps (%ecx) ++ jmp Lepilogue ++ ++Lretdouble: ++ cmpl $FFI_TYPE_DOUBLE,%ecx ++ jne Lretlongdouble ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ fstpl (%ecx) ++ jmp Lepilogue ++ ++Lretlongdouble: ++ cmpl $FFI_TYPE_LONGDOUBLE,%ecx ++ jne Lretint64 ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ fstpt (%ecx) ++ jmp Lepilogue ++ ++Lretint64: ++ cmpl $FFI_TYPE_SINT64,%ecx ++ jne Lretstruct1b ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movl %eax,0(%ecx) ++ movl %edx,4(%ecx) ++ jmp Lepilogue ++ ++Lretstruct1b: ++ cmpl $FFI_TYPE_SINT8,%ecx ++ jne Lretstruct2b ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movb %al,0(%ecx) ++ jmp Lepilogue ++ ++Lretstruct2b: ++ cmpl $FFI_TYPE_SINT16,%ecx ++ jne Lretstruct ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movw %ax,0(%ecx) ++ jmp Lepilogue ++ ++Lretstruct: ++ cmpl $FFI_TYPE_STRUCT,%ecx ++ jne Lnoretval ++ /* Nothing to do! */ ++ addl $4,%esp ++ popl %ebp ++ ret ++ ++Lnoretval: ++Lepilogue: ++ addl $8,%esp ++ movl %ebp,%esp ++ popl %ebp ++ ret ++LFE1: ++.ffi_call_SYSV_end: ++ ++ .align 4 ++FFI_HIDDEN (ffi_closure_SYSV) ++.globl _ffi_closure_SYSV ++ ++_ffi_closure_SYSV: ++LFB2: ++ pushl %ebp ++LCFI2: ++ movl %esp, %ebp ++LCFI3: ++ subl $56, %esp ++ leal -40(%ebp), %edx ++ movl %edx, -12(%ebp) /* resp */ ++ leal 8(%ebp), %edx ++ movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ ++ leal -12(%ebp), %edx ++ movl %edx, (%esp) /* &resp */ ++ movl %ebx, 8(%esp) ++LCFI7: ++ call L_ffi_closure_SYSV_inner$stub ++ movl 8(%esp), %ebx ++ movl -12(%ebp), %ecx ++ cmpl $FFI_TYPE_INT, %eax ++ je Lcls_retint ++ cmpl $FFI_TYPE_FLOAT, %eax ++ je Lcls_retfloat ++ cmpl $FFI_TYPE_DOUBLE, %eax ++ je Lcls_retdouble ++ cmpl $FFI_TYPE_LONGDOUBLE, %eax ++ je Lcls_retldouble ++ cmpl $FFI_TYPE_SINT64, %eax ++ je Lcls_retllong ++ cmpl $FFI_TYPE_UINT8, %eax ++ je Lcls_retstruct1 ++ cmpl $FFI_TYPE_SINT8, %eax ++ je Lcls_retstruct1 ++ cmpl $FFI_TYPE_UINT16, %eax ++ je Lcls_retstruct2 ++ cmpl $FFI_TYPE_SINT16, %eax ++ je Lcls_retstruct2 ++ cmpl $FFI_TYPE_STRUCT, %eax ++ je Lcls_retstruct ++Lcls_epilogue: ++ movl %ebp, %esp ++ popl %ebp ++ ret ++Lcls_retint: ++ movl (%ecx), %eax ++ jmp Lcls_epilogue ++Lcls_retfloat: ++ flds (%ecx) ++ jmp Lcls_epilogue ++Lcls_retdouble: ++ fldl (%ecx) ++ jmp Lcls_epilogue ++Lcls_retldouble: ++ fldt (%ecx) ++ jmp Lcls_epilogue ++Lcls_retllong: ++ movl (%ecx), %eax ++ movl 4(%ecx), %edx ++ jmp Lcls_epilogue ++Lcls_retstruct1: ++ movsbl (%ecx), %eax ++ jmp Lcls_epilogue ++Lcls_retstruct2: ++ movswl (%ecx), %eax ++ jmp Lcls_epilogue ++Lcls_retstruct: ++ lea -8(%ebp),%esp ++ movl %ebp, %esp ++ popl %ebp ++ ret $4 ++LFE2: ++ ++#if !FFI_NO_RAW_API ++ ++#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) ++#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) ++#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) ++#define CIF_FLAGS_OFFSET 20 ++ ++ .align 4 ++FFI_HIDDEN (ffi_closure_raw_SYSV) ++.globl _ffi_closure_raw_SYSV ++ ++_ffi_closure_raw_SYSV: ++LFB3: ++ pushl %ebp ++LCFI4: ++ movl %esp, %ebp ++LCFI5: ++ pushl %esi ++LCFI6: ++ subl $36, %esp ++ movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ ++ movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ ++ movl %edx, 12(%esp) /* user_data */ ++ leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ ++ movl %edx, 8(%esp) /* raw_args */ ++ leal -24(%ebp), %edx ++ movl %edx, 4(%esp) /* &res */ ++ movl %esi, (%esp) /* cif */ ++ call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ ++ movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ ++ cmpl $FFI_TYPE_INT, %eax ++ je Lrcls_retint ++ cmpl $FFI_TYPE_FLOAT, %eax ++ je Lrcls_retfloat ++ cmpl $FFI_TYPE_DOUBLE, %eax ++ je Lrcls_retdouble ++ cmpl $FFI_TYPE_LONGDOUBLE, %eax ++ je Lrcls_retldouble ++ cmpl $FFI_TYPE_SINT64, %eax ++ je Lrcls_retllong ++Lrcls_epilogue: ++ addl $36, %esp ++ popl %esi ++ popl %ebp ++ ret ++Lrcls_retint: ++ movl -24(%ebp), %eax ++ jmp Lrcls_epilogue ++Lrcls_retfloat: ++ flds -24(%ebp) ++ jmp Lrcls_epilogue ++Lrcls_retdouble: ++ fldl -24(%ebp) ++ jmp Lrcls_epilogue ++Lrcls_retldouble: ++ fldt -24(%ebp) ++ jmp Lrcls_epilogue ++Lrcls_retllong: ++ movl -24(%ebp), %eax ++ movl -20(%ebp), %edx ++ jmp Lrcls_epilogue ++LFE3: ++#endif ++ ++.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5 ++L_ffi_closure_SYSV_inner$stub: ++ .indirect_symbol _ffi_closure_SYSV_inner ++ hlt ; hlt ; hlt ; hlt ; hlt ++ ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ++LSCIE1: ++ .long 0x0 ++ .byte 0x1 ++ .ascii "zR\0" ++ .byte 0x1 ++ .byte 0x7c ++ .byte 0x8 ++ .byte 0x1 ++ .byte 0x10 ++ .byte 0xc ++ .byte 0x5 ++ .byte 0x4 ++ .byte 0x88 ++ .byte 0x1 ++ .align 2 ++LECIE1: ++.globl _ffi_call_SYSV.eh ++_ffi_call_SYSV.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ++LASFDE1: ++ .long LASFDE1-EH_frame1 ++ .long LFB1-. ++ .set L$set$2,LFE1-LFB1 ++ .long L$set$2 ++ .byte 0x0 ++ .byte 0x4 ++ .set L$set$3,LCFI0-LFB1 ++ .long L$set$3 ++ .byte 0xe ++ .byte 0x8 ++ .byte 0x84 ++ .byte 0x2 ++ .byte 0x4 ++ .set L$set$4,LCFI1-LCFI0 ++ .long L$set$4 ++ .byte 0xd ++ .byte 0x4 ++ .align 2 ++LEFDE1: ++.globl _ffi_closure_SYSV.eh ++_ffi_closure_SYSV.eh: ++LSFDE2: ++ .set L$set$5,LEFDE2-LASFDE2 ++ .long L$set$5 ++LASFDE2: ++ .long LASFDE2-EH_frame1 ++ .long LFB2-. ++ .set L$set$6,LFE2-LFB2 ++ .long L$set$6 ++ .byte 0x0 ++ .byte 0x4 ++ .set L$set$7,LCFI2-LFB2 ++ .long L$set$7 ++ .byte 0xe ++ .byte 0x8 ++ .byte 0x84 ++ .byte 0x2 ++ .byte 0x4 ++ .set L$set$8,LCFI3-LCFI2 ++ .long L$set$8 ++ .byte 0xd ++ .byte 0x4 ++ .align 2 ++LEFDE2: ++ ++#if !FFI_NO_RAW_API ++ ++.globl _ffi_closure_raw_SYSV.eh ++_ffi_closure_raw_SYSV.eh: ++LSFDE3: ++ .set L$set$10,LEFDE3-LASFDE3 ++ .long L$set$10 ++LASFDE3: ++ .long LASFDE3-EH_frame1 ++ .long LFB3-. ++ .set L$set$11,LFE3-LFB3 ++ .long L$set$11 ++ .byte 0x0 ++ .byte 0x4 ++ .set L$set$12,LCFI4-LFB3 ++ .long L$set$12 ++ .byte 0xe ++ .byte 0x8 ++ .byte 0x84 ++ .byte 0x2 ++ .byte 0x4 ++ .set L$set$13,LCFI5-LCFI4 ++ .long L$set$13 ++ .byte 0xd ++ .byte 0x4 ++ .byte 0x4 ++ .set L$set$14,LCFI6-LCFI5 ++ .long L$set$14 ++ .byte 0x85 ++ .byte 0x3 ++ .align 2 ++LEFDE3: ++ ++#endif ++ ++#endif /* ifndef __x86_64__ */ ++ ++#endif /* defined __i386__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c +new file mode 100644 +index 0000000..06feaf2 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c +@@ -0,0 +1,734 @@ ++#ifdef __x86_64__ ++ ++/* ----------------------------------------------------------------------- ++ x86-ffi64.c - Copyright (c) 2002 Bo Thorsen ++ ++ x86-64 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++#include ++ ++#define MAX_GPR_REGS 6 ++#define MAX_SSE_REGS 8 ++ ++typedef struct RegisterArgs { ++ /* Registers for argument passing. */ ++ UINT64 gpr[MAX_GPR_REGS]; ++ __int128_t sse[MAX_SSE_REGS]; ++} RegisterArgs; ++ ++extern void ++ffi_call_unix64( ++ void* args, ++ unsigned long bytes, ++ unsigned flags, ++ void* raddr, ++ void (*fnaddr)(), ++ unsigned ssecount); ++ ++/* All reference to register classes here is identical to the code in ++ gcc/config/i386/i386.c. Do *not* change one without the other. */ ++ ++/* Register class used for passing given 64bit part of the argument. ++ These represent classes as documented by the PS ABI, with the exception ++ of SSESF, SSEDF classes, that are basically SSE class, just gcc will ++ use SF or DFmode move instead of DImode to avoid reformating penalties. ++ ++ Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves ++ whenever possible (upper half does contain padding). */ ++enum x86_64_reg_class ++{ ++ X86_64_NO_CLASS, ++ X86_64_INTEGER_CLASS, ++ X86_64_INTEGERSI_CLASS, ++ X86_64_SSE_CLASS, ++ X86_64_SSESF_CLASS, ++ X86_64_SSEDF_CLASS, ++ X86_64_SSEUP_CLASS, ++ X86_64_X87_CLASS, ++ X86_64_X87UP_CLASS, ++ X86_64_COMPLEX_X87_CLASS, ++ X86_64_MEMORY_CLASS ++}; ++ ++#define MAX_CLASSES 4 ++#define SSE_CLASS_P(X) ((X) >= X86_64_SSE_CLASS && X <= X86_64_SSEUP_CLASS) ++ ++/* x86-64 register passing implementation. See x86-64 ABI for details. Goal ++ of this code is to classify each 8bytes of incoming argument by the register ++ class and assign registers accordingly. */ ++ ++/* Return the union class of CLASS1 and CLASS2. ++ See the x86-64 PS ABI for details. */ ++static enum x86_64_reg_class ++merge_classes( ++ enum x86_64_reg_class class1, ++ enum x86_64_reg_class class2) ++{ ++ /* Rule #1: If both classes are equal, this is the resulting class. */ ++ if (class1 == class2) ++ return class1; ++ ++ /* Rule #2: If one of the classes is NO_CLASS, the resulting class is ++ the other class. */ ++ if (class1 == X86_64_NO_CLASS) ++ return class2; ++ ++ if (class2 == X86_64_NO_CLASS) ++ return class1; ++ ++ /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */ ++ if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS) ++ return X86_64_MEMORY_CLASS; ++ ++ /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */ ++ if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS) ++ || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS)) ++ return X86_64_INTEGERSI_CLASS; ++ ++ if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS ++ || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS) ++ return X86_64_INTEGER_CLASS; ++ ++ /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class, ++ MEMORY is used. */ ++ if (class1 == X86_64_X87_CLASS ++ || class1 == X86_64_X87UP_CLASS ++ || class1 == X86_64_COMPLEX_X87_CLASS ++ || class2 == X86_64_X87_CLASS ++ || class2 == X86_64_X87UP_CLASS ++ || class2 == X86_64_COMPLEX_X87_CLASS) ++ return X86_64_MEMORY_CLASS; ++ ++ /* Rule #6: Otherwise class SSE is used. */ ++ return X86_64_SSE_CLASS; ++} ++ ++/* Classify the argument of type TYPE and mode MODE. ++ CLASSES will be filled by the register class used to pass each word ++ of the operand. The number of words is returned. In case the parameter ++ should be passed in memory, 0 is returned. As a special case for zero ++ sized containers, classes[0] will be NO_CLASS and 1 is returned. ++ ++ See the x86-64 PS ABI for details. */ ++ ++static int ++classify_argument( ++ ffi_type* type, ++ enum x86_64_reg_class classes[], ++ size_t byte_offset) ++{ ++ switch (type->type) ++ { ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_POINTER: ++#if 0 ++ if (byte_offset + type->size <= 4) ++ classes[0] = X86_64_INTEGERSI_CLASS; ++ else ++ classes[0] = X86_64_INTEGER_CLASS; ++ ++ return 1; ++#else ++ { ++ int size = byte_offset + type->size; ++ ++ if (size <= 4) ++ { ++ classes[0] = X86_64_INTEGERSI_CLASS; ++ return 1; ++ } ++ else if (size <= 8) ++ { ++ classes[0] = X86_64_INTEGER_CLASS; ++ return 1; ++ } ++ else if (size <= 12) ++ { ++ classes[0] = X86_64_INTEGER_CLASS; ++ classes[1] = X86_64_INTEGERSI_CLASS; ++ return 2; ++ } ++ else if (size <= 16) ++ { ++ classes[0] = classes[1] = X86_64_INTEGERSI_CLASS; ++ return 2; ++ } ++ else ++ FFI_ASSERT (0); ++ } ++#endif ++ ++ case FFI_TYPE_FLOAT: ++ if (byte_offset == 0) ++ classes[0] = X86_64_SSESF_CLASS; ++ else ++ classes[0] = X86_64_SSE_CLASS; ++ ++ return 1; ++ ++ case FFI_TYPE_DOUBLE: ++ classes[0] = X86_64_SSEDF_CLASS; ++ return 1; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ classes[0] = X86_64_X87_CLASS; ++ classes[1] = X86_64_X87UP_CLASS; ++ return 2; ++ ++ case FFI_TYPE_STRUCT: ++ { ++ ffi_type** ptr; ++ int i; ++ enum x86_64_reg_class subclasses[MAX_CLASSES]; ++ const int UNITS_PER_WORD = 8; ++ int words = ++ (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; ++ ++ /* If the struct is larger than 16 bytes, pass it on the stack. */ ++ if (type->size > 16) ++ return 0; ++ ++ for (i = 0; i < words; i++) ++ classes[i] = X86_64_NO_CLASS; ++ ++ /* Merge the fields of structure. */ ++ for (ptr = type->elements; *ptr != NULL; ptr++) ++ { ++ byte_offset = ALIGN(byte_offset, (*ptr)->alignment); ++ ++ int num = classify_argument(*ptr, subclasses, byte_offset % 8); ++ ++ if (num == 0) ++ return 0; ++ ++ int pos = byte_offset / 8; ++ ++ for (i = 0; i < num; i++) ++ { ++ classes[i + pos] = ++ merge_classes(subclasses[i], classes[i + pos]); ++ } ++ ++ byte_offset += (*ptr)->size; ++ } ++ ++ if (words > 2) ++ { ++ /* When size > 16 bytes, if the first one isn't ++ X86_64_SSE_CLASS or any other ones aren't ++ X86_64_SSEUP_CLASS, everything should be passed in ++ memory. */ ++ if (classes[0] != X86_64_SSE_CLASS) ++ return 0; ++ ++ for (i = 1; i < words; i++) ++ if (classes[i] != X86_64_SSEUP_CLASS) ++ return 0; ++ } ++ ++ ++ /* Final merger cleanup. */ ++ for (i = 0; i < words; i++) ++ { ++ /* If one class is MEMORY, everything should be passed in ++ memory. */ ++ if (classes[i] == X86_64_MEMORY_CLASS) ++ return 0; ++ ++ /* The X86_64_SSEUP_CLASS should be always preceded by ++ X86_64_SSE_CLASS. */ ++ if (classes[i] == X86_64_SSEUP_CLASS ++ && classes[i - 1] != X86_64_SSE_CLASS ++ && classes[i - 1] != X86_64_SSEUP_CLASS) ++ { ++ FFI_ASSERT(i != 0); ++ classes[i] = X86_64_SSE_CLASS; ++ } ++ ++ /* X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS. */ ++ if (classes[i] == X86_64_X87UP_CLASS ++ && classes[i - 1] != X86_64_X87_CLASS) ++ { ++ FFI_ASSERT(i != 0); ++ classes[i] = X86_64_SSE_CLASS; ++ } ++ } ++ ++ return words; ++ } ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ ++ return 0; /* Never reached. */ ++} ++ ++/* Examine the argument and return set number of register required in each ++ class. Return zero if parameter should be passed in memory, otherwise ++ the number of registers. */ ++static int ++examine_argument( ++ ffi_type* type, ++ enum x86_64_reg_class classes[MAX_CLASSES], ++ _Bool in_return, ++ int* pngpr, ++ int* pnsse) ++{ ++ int n = classify_argument(type, classes, 0); ++ int ngpr = 0; ++ int nsse = 0; ++ int i; ++ ++ if (n == 0) ++ return 0; ++ ++ for (i = 0; i < n; ++i) ++ { ++ switch (classes[i]) ++ { ++ case X86_64_INTEGER_CLASS: ++ case X86_64_INTEGERSI_CLASS: ++ ngpr++; ++ break; ++ ++ case X86_64_SSE_CLASS: ++ case X86_64_SSESF_CLASS: ++ case X86_64_SSEDF_CLASS: ++ nsse++; ++ break; ++ ++ case X86_64_NO_CLASS: ++ case X86_64_SSEUP_CLASS: ++ break; ++ ++ case X86_64_X87_CLASS: ++ case X86_64_X87UP_CLASS: ++ case X86_64_COMPLEX_X87_CLASS: ++ return in_return != 0; ++ ++ default: ++ abort(); ++ } ++ } ++ ++ *pngpr = ngpr; ++ *pnsse = nsse; ++ ++ return n; ++} ++ ++/* Perform machine dependent cif processing. */ ++ffi_status ++ffi_prep_cif_machdep( ++ ffi_cif* cif) ++{ ++ int gprcount = 0; ++ int ssecount = 0; ++ int flags = cif->rtype->type; ++ int i, avn, n, ngpr, nsse; ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ size_t bytes; ++ ++ if (flags != FFI_TYPE_VOID) ++ { ++ n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); ++ ++ if (n == 0) ++ { ++ /* The return value is passed in memory. A pointer to that ++ memory is the first argument. Allocate a register for it. */ ++ gprcount++; ++ ++ /* We don't have to do anything in asm for the return. */ ++ flags = FFI_TYPE_VOID; ++ } ++ else if (flags == FFI_TYPE_STRUCT) ++ { ++ /* Mark which registers the result appears in. */ ++ _Bool sse0 = SSE_CLASS_P(classes[0]); ++ _Bool sse1 = n == 2 && SSE_CLASS_P(classes[1]); ++ ++ if (sse0 && !sse1) ++ flags |= 1 << 8; ++ else if (!sse0 && sse1) ++ flags |= 1 << 9; ++ else if (sse0 && sse1) ++ flags |= 1 << 10; ++ ++ /* Mark the true size of the structure. */ ++ flags |= cif->rtype->size << 12; ++ } ++ } ++ ++ /* Go over all arguments and determine the way they should be passed. ++ If it's in a register and there is space for it, let that be so. If ++ not, add it's size to the stack byte count. */ ++ for (bytes = 0, i = 0, avn = cif->nargs; i < avn; i++) ++ { ++ if (examine_argument(cif->arg_types[i], classes, 0, &ngpr, &nsse) == 0 ++ || gprcount + ngpr > MAX_GPR_REGS ++ || ssecount + nsse > MAX_SSE_REGS) ++ { ++ long align = cif->arg_types[i]->alignment; ++ ++ if (align < 8) ++ align = 8; ++ ++ bytes = ALIGN(bytes, align); ++ bytes += cif->arg_types[i]->size; ++ } ++ else ++ { ++ gprcount += ngpr; ++ ssecount += nsse; ++ } ++ } ++ ++ if (ssecount) ++ flags |= 1 << 11; ++ ++ cif->flags = flags; ++ cif->bytes = bytes; ++ cif->bytes = ALIGN(bytes,8); ++ ++ return FFI_OK; ++} ++ ++void ++ffi_call( ++ ffi_cif* cif, ++ void (*fn)(), ++ void* rvalue, ++ void** avalue) ++{ ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ char* stack; ++ char* argp; ++ ffi_type** arg_types; ++ int gprcount, ssecount, ngpr, nsse, i, avn; ++ _Bool ret_in_memory; ++ RegisterArgs* reg_args; ++ ++ /* Can't call 32-bit mode from 64-bit mode. */ ++ FFI_ASSERT(cif->abi == FFI_UNIX64); ++ ++ /* If the return value is a struct and we don't have a return value ++ address then we need to make one. Note the setting of flags to ++ VOID above in ffi_prep_cif_machdep. */ ++ ret_in_memory = (cif->rtype->type == FFI_TYPE_STRUCT ++ && (cif->flags & 0xff) == FFI_TYPE_VOID); ++ ++ if (rvalue == NULL && ret_in_memory) ++ rvalue = alloca (cif->rtype->size); ++ ++ /* Allocate the space for the arguments, plus 4 words of temp space. */ ++ stack = alloca(sizeof(RegisterArgs) + cif->bytes + 4 * 8); ++ reg_args = (RegisterArgs*)stack; ++ argp = stack + sizeof(RegisterArgs); ++ ++ gprcount = ssecount = 0; ++ ++ /* If the return value is passed in memory, add the pointer as the ++ first integer argument. */ ++ if (ret_in_memory) ++ reg_args->gpr[gprcount++] = (long) rvalue; ++ ++ avn = cif->nargs; ++ arg_types = cif->arg_types; ++ ++ for (i = 0; i < avn; ++i) ++ { ++ size_t size = arg_types[i]->size; ++ int n; ++ ++ n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); ++ ++ if (n == 0 ++ || gprcount + ngpr > MAX_GPR_REGS ++ || ssecount + nsse > MAX_SSE_REGS) ++ { ++ long align = arg_types[i]->alignment; ++ ++ /* Stack arguments are *always* at least 8 byte aligned. */ ++ if (align < 8) ++ align = 8; ++ ++ /* Pass this argument in memory. */ ++ argp = (void *) ALIGN (argp, align); ++ memcpy (argp, avalue[i], size); ++ argp += size; ++ } ++ else ++ { /* The argument is passed entirely in registers. */ ++ char *a = (char *) avalue[i]; ++ int j; ++ ++ for (j = 0; j < n; j++, a += 8, size -= 8) ++ { ++ switch (classes[j]) ++ { ++ case X86_64_INTEGER_CLASS: ++ case X86_64_INTEGERSI_CLASS: ++ reg_args->gpr[gprcount] = 0; ++ switch (arg_types[i]->type) { ++ case FFI_TYPE_SINT8: ++ { ++ int8_t shortval = *(int8_t*)a; ++ int64_t actval = (int64_t)shortval; ++ reg_args->gpr[gprcount] = actval; ++ /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ ++ break; ++ } ++ ++ case FFI_TYPE_SINT16: ++ { ++ int16_t shortval = *(int16_t*)a; ++ int64_t actval = (int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ case FFI_TYPE_SINT32: ++ { ++ int32_t shortval = *(int32_t*)a; ++ int64_t actval = (int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ case FFI_TYPE_UINT8: ++ { ++ u_int8_t shortval = *(u_int8_t*)a; ++ u_int64_t actval = (u_int64_t)shortval; ++ /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ ++ reg_args->gpr[gprcount] = actval; ++ break; ++ } ++ ++ case FFI_TYPE_UINT16: ++ { ++ u_int16_t shortval = *(u_int16_t*)a; ++ u_int64_t actval = (u_int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ case FFI_TYPE_UINT32: ++ { ++ u_int32_t shortval = *(u_int32_t*)a; ++ u_int64_t actval = (u_int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ default: ++ //memcpy (®_args->gpr[gprcount], a, size < 8 ? size : 8); ++ reg_args->gpr[gprcount] = *(int64_t*)a; ++ } ++ gprcount++; ++ break; ++ ++ case X86_64_SSE_CLASS: ++ case X86_64_SSEDF_CLASS: ++ reg_args->sse[ssecount++] = *(UINT64 *) a; ++ break; ++ ++ case X86_64_SSESF_CLASS: ++ reg_args->sse[ssecount++] = *(UINT32 *) a; ++ break; ++ ++ default: ++ abort(); ++ } ++ } ++ } ++ } ++ ++ ffi_call_unix64 (stack, cif->bytes + sizeof(RegisterArgs), ++ cif->flags, rvalue, fn, ssecount); ++} ++ ++extern void ffi_closure_unix64(void); ++ ++ffi_status ++ffi_prep_closure( ++ ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*, void*, void**, void*), ++ void* user_data) ++{ ++ if (cif->abi != FFI_UNIX64) ++ return FFI_BAD_ABI; ++ ++ volatile unsigned short* tramp = ++ (volatile unsigned short*)&closure->tramp[0]; ++ ++ tramp[0] = 0xbb49; /* mov , %r11 */ ++ *(void* volatile*)&tramp[1] = ffi_closure_unix64; ++ tramp[5] = 0xba49; /* mov , %r10 */ ++ *(void* volatile*)&tramp[6] = closure; ++ ++ /* Set the carry bit if the function uses any sse registers. ++ This is clc or stc, together with the first byte of the jmp. */ ++ tramp[10] = cif->flags & (1 << 11) ? 0x49f9 : 0x49f8; ++ tramp[11] = 0xe3ff; /* jmp *%r11 */ ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ ++ return FFI_OK; ++} ++ ++#pragma clang diagnostic push ++#pragma clang diagnostic ignored "-Wmissing-prototypes" ++int ++ffi_closure_unix64_inner( ++ ffi_closure* closure, ++ void* rvalue, ++ RegisterArgs* reg_args, ++ char* argp) ++#pragma clang diagnostic pop ++{ ++ ffi_cif* cif = closure->cif; ++ void** avalue = alloca(cif->nargs * sizeof(void *)); ++ ffi_type** arg_types; ++ long i, avn; ++ int gprcount = 0; ++ int ssecount = 0; ++ int ngpr, nsse; ++ int ret; ++ ++ ret = cif->rtype->type; ++ ++ if (ret != FFI_TYPE_VOID) ++ { ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ int n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); ++ ++ if (n == 0) ++ { ++ /* The return value goes in memory. Arrange for the closure ++ return value to go directly back to the original caller. */ ++ rvalue = (void *) reg_args->gpr[gprcount++]; ++ ++ /* We don't have to do anything in asm for the return. */ ++ ret = FFI_TYPE_VOID; ++ } ++ else if (ret == FFI_TYPE_STRUCT && n == 2) ++ { ++ /* Mark which register the second word of the structure goes in. */ ++ _Bool sse0 = SSE_CLASS_P (classes[0]); ++ _Bool sse1 = SSE_CLASS_P (classes[1]); ++ ++ if (!sse0 && sse1) ++ ret |= 1 << 8; ++ else if (sse0 && !sse1) ++ ret |= 1 << 9; ++ } ++ } ++ ++ avn = cif->nargs; ++ arg_types = cif->arg_types; ++ ++ for (i = 0; i < avn; ++i) ++ { ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ int n; ++ ++ n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); ++ ++ if (n == 0 ++ || gprcount + ngpr > MAX_GPR_REGS ++ || ssecount + nsse > MAX_SSE_REGS) ++ { ++ long align = arg_types[i]->alignment; ++ ++ /* Stack arguments are *always* at least 8 byte aligned. */ ++ if (align < 8) ++ align = 8; ++ ++ /* Pass this argument in memory. */ ++ argp = (void *) ALIGN (argp, align); ++ avalue[i] = argp; ++ argp += arg_types[i]->size; ++ } ++ ++#if !defined(X86_DARWIN) ++ /* If the argument is in a single register, or two consecutive ++ registers, then we can use that address directly. */ ++ else if (n == 1 || (n == 2 && ++ SSE_CLASS_P (classes[0]) == SSE_CLASS_P (classes[1]))) ++ { ++ // The argument is in a single register. ++ if (SSE_CLASS_P (classes[0])) ++ { ++ avalue[i] = ®_args->sse[ssecount]; ++ ssecount += n; ++ } ++ else ++ { ++ avalue[i] = ®_args->gpr[gprcount]; ++ gprcount += n; ++ } ++ } ++#endif ++ ++ /* Otherwise, allocate space to make them consecutive. */ ++ else ++ { ++ char *a = alloca (16); ++ int j; ++ ++ avalue[i] = a; ++ ++ for (j = 0; j < n; j++, a += 8) ++ { ++ if (SSE_CLASS_P (classes[j])) ++ memcpy (a, ®_args->sse[ssecount++], 8); ++ else ++ memcpy (a, ®_args->gpr[gprcount++], 8); ++ } ++ } ++ } ++ ++ /* Invoke the closure. */ ++ closure->fun (cif, rvalue, avalue, closure->user_data); ++ ++ /* Tell assembly how to perform return type promotions. */ ++ return ret; ++} ++ ++#endif /* __x86_64__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c +new file mode 100644 +index 0000000..706ea0f +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c +@@ -0,0 +1,438 @@ ++#ifdef __i386__ ++/* ----------------------------------------------------------------------- ++ ffi.c - Copyright (c) 1996, 1998, 1999, 2001 Red Hat, Inc. ++ Copyright (c) 2002 Ranjit Mathew ++ Copyright (c) 2002 Bo Thorsen ++ Copyright (c) 2002 Roger Sayle ++ ++ x86 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++ ++/* ffi_prep_args is called by the assembly routine once stack space ++ has been allocated for the function's arguments */ ++ ++void ffi_prep_args(char *stack, extended_cif *ecif); ++ ++void ffi_prep_args(char *stack, extended_cif *ecif) ++{ ++ register unsigned int i; ++ register void **p_argv; ++ register char *argp; ++ register ffi_type **p_arg; ++ ++ argp = stack; ++ ++ if (ecif->cif->flags == FFI_TYPE_STRUCT) ++ { ++ *(void **) argp = ecif->rvalue; ++ argp += 4; ++ } ++ ++ p_argv = ecif->avalue; ++ ++ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; ++ i != 0; ++ i--, p_arg++) ++ { ++ size_t z; ++ ++ /* Align if necessary */ ++ if ((sizeof(int) - 1) & (unsigned) argp) ++ argp = (char *) ALIGN(argp, sizeof(int)); ++ ++ z = (*p_arg)->size; ++ if (z < sizeof(int)) ++ { ++ z = sizeof(int); ++ switch ((*p_arg)->type) ++ { ++ case FFI_TYPE_SINT8: ++ *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT8: ++ *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_SINT16: ++ *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT16: ++ *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_SINT32: ++ *(signed int *) argp = (signed int)*(SINT32 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT32: ++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ } ++ else ++ { ++ memcpy(argp, *p_argv, z); ++ } ++ p_argv++; ++ argp += z; ++ } ++ ++ return; ++} ++ ++/* Perform machine dependent cif processing */ ++ffi_status ffi_prep_cif_machdep(ffi_cif *cif) ++{ ++ /* Set the return type flag */ ++ switch (cif->rtype->type) ++ { ++ case FFI_TYPE_VOID: ++#ifdef X86 ++ case FFI_TYPE_STRUCT: ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_SINT16: ++#endif ++ ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ case FFI_TYPE_LONGDOUBLE: ++ cif->flags = (unsigned) cif->rtype->type; ++ break; ++ ++ case FFI_TYPE_UINT64: ++ cif->flags = FFI_TYPE_SINT64; ++ break; ++ ++#ifndef X86 ++ case FFI_TYPE_STRUCT: ++ if (cif->rtype->size == 1) ++ { ++ cif->flags = FFI_TYPE_SINT8; /* same as char size */ ++ } ++ else if (cif->rtype->size == 2) ++ { ++ cif->flags = FFI_TYPE_SINT16; /* same as short size */ ++ } ++ else if (cif->rtype->size == 4) ++ { ++ cif->flags = FFI_TYPE_INT; /* same as int type */ ++ } ++ else if (cif->rtype->size == 8) ++ { ++ cif->flags = FFI_TYPE_SINT64; /* same as int64 type */ ++ } ++ else ++ { ++ cif->flags = FFI_TYPE_STRUCT; ++ } ++ break; ++#endif ++ ++ default: ++ cif->flags = FFI_TYPE_INT; ++ break; ++ } ++ ++#ifdef X86_DARWIN ++ cif->bytes = (cif->bytes + 15) & ~0xF; ++#endif ++ ++ return FFI_OK; ++} ++ ++extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, ++ unsigned, unsigned, unsigned *, void (*fn)()); ++ ++#ifdef X86_WIN32 ++extern void ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, ++ unsigned, unsigned, unsigned *, void (*fn)()); ++ ++#endif /* X86_WIN32 */ ++ ++void ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue) ++{ ++ extended_cif ecif; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return */ ++ /* value address then we need to make one */ ++ ++ if ((rvalue == NULL) && ++ (cif->flags == FFI_TYPE_STRUCT)) ++ { ++ ecif.rvalue = alloca(cif->rtype->size); ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ ++ switch (cif->abi) ++ { ++ case FFI_SYSV: ++ ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, ++ fn); ++ break; ++#ifdef X86_WIN32 ++ case FFI_STDCALL: ++ ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ break; ++#endif /* X86_WIN32 */ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++ ++/** private members **/ ++ ++static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, ++ void** args, ffi_cif* cif); ++void FFI_HIDDEN ffi_closure_SYSV (ffi_closure *) ++__attribute__ ((regparm(1))); ++unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *) ++__attribute__ ((regparm(1))); ++void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *) ++__attribute__ ((regparm(1))); ++ ++/* This function is jumped to by the trampoline */ ++ ++unsigned int FFI_HIDDEN ++ffi_closure_SYSV_inner (closure, respp, args) ++ffi_closure *closure; ++void **respp; ++void *args; ++{ ++ // our various things... ++ ffi_cif *cif; ++ void **arg_area; ++ ++ cif = closure->cif; ++ arg_area = (void**) alloca (cif->nargs * sizeof (void*)); ++ ++ /* this call will initialize ARG_AREA, such that each ++ * element in that array points to the corresponding ++ * value on the stack; and if the function returns ++ * a structure, it will re-set RESP to point to the ++ * structure return address. */ ++ ++ ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); ++ ++ (closure->fun) (cif, *respp, arg_area, closure->user_data); ++ ++ return cif->flags; ++} ++ ++static void ++ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue, ++ ffi_cif *cif) ++{ ++ register unsigned int i; ++ register void **p_argv; ++ register char *argp; ++ register ffi_type **p_arg; ++ ++ argp = stack; ++ ++ if ( cif->flags == FFI_TYPE_STRUCT ) { ++ *rvalue = *(void **) argp; ++ argp += 4; ++ } ++ ++ p_argv = avalue; ++ ++ for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) ++ { ++ size_t z; ++ ++ /* Align if necessary */ ++ if ((sizeof(int) - 1) & (unsigned) argp) { ++ argp = (char *) ALIGN(argp, sizeof(int)); ++ } ++ ++ z = (*p_arg)->size; ++ ++ /* because we're little endian, this is what it turns into. */ ++ ++ *p_argv = (void*) argp; ++ ++ p_argv++; ++ argp += z; ++ } ++ ++ return; ++} ++ ++/* How to make a trampoline. Derived from gcc/config/i386/i386.c. */ ++ ++#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ ++({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ ++unsigned int __fun = (unsigned int)(FUN); \ ++unsigned int __ctx = (unsigned int)(CTX); \ ++unsigned int __dis = __fun - (__ctx + FFI_TRAMPOLINE_SIZE); \ ++*(unsigned char*) &__tramp[0] = 0xb8; \ ++*(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \ ++*(unsigned char *) &__tramp[5] = 0xe9; \ ++*(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \ ++}) ++ ++ ++/* the cif must already be prep'ed */ ++ffi_status ++ffi_prep_closure (ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,void**,void*), ++ void *user_data) ++{ ++ if (cif->abi != FFI_SYSV) ++ return FFI_BAD_ABI; ++ ++ FFI_INIT_TRAMPOLINE (&closure->tramp[0], \ ++ &ffi_closure_SYSV, \ ++ (void*)closure); ++ ++ closure->cif = cif; ++ closure->user_data = user_data; ++ closure->fun = fun; ++ ++ return FFI_OK; ++} ++ ++/* ------- Native raw API support -------------------------------- */ ++ ++#if !FFI_NO_RAW_API ++ ++ffi_status ++ffi_prep_raw_closure_loc (ffi_raw_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), ++ void *user_data, ++ void *codeloc) ++{ ++ int i; ++ ++ FFI_ASSERT (cif->abi == FFI_SYSV); ++ ++ // we currently don't support certain kinds of arguments for raw ++ // closures. This should be implemented by a separate assembly language ++ // routine, since it would require argument processing, something we ++ // don't do now for performance. ++ ++ for (i = cif->nargs-1; i >= 0; i--) ++ { ++ FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_STRUCT); ++ FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_LONGDOUBLE); ++ } ++ ++ ++ FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_raw_SYSV, ++ codeloc); ++ ++ closure->cif = cif; ++ closure->user_data = user_data; ++ closure->fun = fun; ++ ++ return FFI_OK; ++} ++ ++static void ++ffi_prep_args_raw(char *stack, extended_cif *ecif) ++{ ++ memcpy (stack, ecif->avalue, ecif->cif->bytes); ++} ++ ++/* we borrow this routine from libffi (it must be changed, though, to ++ * actually call the function passed in the first argument. as of ++ * libffi-1.20, this is not the case.) ++ */ ++ ++extern void ++ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, unsigned, ++ unsigned, unsigned *, void (*fn)()); ++ ++#ifdef X86_WIN32 ++extern void ++ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, unsigned, ++ unsigned, unsigned *, void (*fn)()); ++#endif /* X86_WIN32 */ ++ ++void ++ffi_raw_call(ffi_cif *cif, void (*fn)(), void *rvalue, ffi_raw *fake_avalue) ++{ ++ extended_cif ecif; ++ void **avalue = (void **)fake_avalue; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return */ ++ /* value address then we need to make one */ ++ ++ if ((rvalue == NULL) && ++ (cif->rtype->type == FFI_TYPE_STRUCT)) ++ { ++ ecif.rvalue = alloca(cif->rtype->size); ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ ++ switch (cif->abi) ++ { ++ case FFI_SYSV: ++ ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ break; ++#ifdef X86_WIN32 ++ case FFI_STDCALL: ++ ffi_call_STDCALL(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ break; ++#endif /* X86_WIN32 */ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++#endif ++#endif // __i386__ +diff -r -u ./setup.py ./setup.py +index 46b92fe..2bf6b4b 100644 +--- ./setup.py ++++ ./setup.py +@@ -98,8 +98,14 @@ class PyBuildExt(build_ext): + self.detect_modules() + + # Remove modules that are present on the disabled list +- self.extensions = [ext for ext in self.extensions +- if ext.name not in disabled_module_list] ++ extensions = [ext for ext in self.extensions ++ if ext.name not in disabled_module_list] ++ # move ctypes to the end, it depends on other modules ++ ext_map = dict((ext.name, i) for i, ext in enumerate(extensions)) ++ if "_ctypes" in ext_map: ++ ctypes = extensions.pop(ext_map["_ctypes"]) ++ extensions.append(ctypes) ++ self.extensions = extensions + + # Fix up the autodetected modules, prefixing all the source files + # with Modules/ and adding Python's include directory to the path. +@@ -1330,9 +1336,39 @@ class PyBuildExt(build_ext): + # *** Uncomment these for TOGL extension only: + # -lGL -lGLU -lXext -lXmu \ + ++ def configure_ctypes_darwin(self, ext): ++ # Darwin (OS X) uses preconfigured files, in ++ # the Modules/_ctypes/libffi_osx directory. ++ srcdir = sysconfig.get_config_var('srcdir') ++ ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', ++ '_ctypes', 'libffi_osx')) ++ sources = [os.path.join(ffi_srcdir, p) ++ for p in ['ffi.c', ++ 'x86/darwin64.S', ++ 'x86/x86-darwin.S', ++ 'x86/x86-ffi_darwin.c', ++ 'x86/x86-ffi64.c', ++ 'powerpc/ppc-darwin.S', ++ 'powerpc/ppc-darwin_closure.S', ++ 'powerpc/ppc-ffi_darwin.c', ++ 'powerpc/ppc64-darwin_closure.S', ++ ]] ++ ++ # Add .S (preprocessed assembly) to C compiler source extensions. ++ self.compiler.src_extensions.append('.S') ++ ++ include_dirs = [os.path.join(ffi_srcdir, 'include'), ++ os.path.join(ffi_srcdir, 'powerpc')] ++ ext.include_dirs.extend(include_dirs) ++ ext.sources.extend(sources) ++ return True ++ + def configure_ctypes(self, ext): + if not self.use_system_libffi: +- (srcdir,) = sysconfig.get_config_vars('srcdir') ++ if sys.platform == 'darwin': ++ return self.configure_ctypes_darwin(ext) ++ ++ srcdir = sysconfig.get_config_var('srcdir') + ffi_builddir = os.path.join(self.build_temp, 'libffi') + ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', + '_ctypes', 'libffi')) +@@ -1347,7 +1383,10 @@ class PyBuildExt(build_ext): + ffi_configfile): + from distutils.dir_util import mkpath + mkpath(ffi_builddir) +- config_args = [] ++ config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split() ++ if (('--host=' in arg) or ('--build=' in arg))] ++ if not self.verbose: ++ config_args.append("-q") + + # Pass empty CFLAGS because we'll just append the resulting + # CFLAGS to Python's; -g or -O2 is to be avoided. +@@ -1367,10 +1406,12 @@ class PyBuildExt(build_ext): + self.compiler.src_extensions.append('.S') + + include_dirs = [os.path.join(ffi_builddir, 'include'), +- ffi_builddir, ffi_srcdir] ++ ffi_builddir, ++ os.path.join(ffi_srcdir, 'src')] + extra_compile_args = fficonfig['ffi_cflags'].split() + +- ext.sources.extend(fficonfig['ffi_sources']) ++ ext.sources.extend(os.path.join(ffi_srcdir, f) for f in ++ fficonfig['ffi_sources']) + ext.include_dirs.extend(include_dirs) + ext.extra_compile_args.extend(extra_compile_args) + return True +@@ -1390,6 +1431,7 @@ class PyBuildExt(build_ext): + + if sys.platform == 'darwin': + sources.append('_ctypes/darwin/dlfcn_simple.c') ++ extra_compile_args.append('-DMACOSX') + include_dirs.append('_ctypes/darwin') + # XXX Is this still needed? + ## extra_link_args.extend(['-read_only_relocs', 'warning']) +@@ -1419,7 +1461,14 @@ class PyBuildExt(build_ext): + if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"): + return + +- ffi_inc = find_file('ffi.h', [], inc_dirs) ++ if sys.platform == 'darwin': ++ # OS X 10.5 comes with libffi.dylib; the include files are ++ # in /usr/include/ffi ++ inc_dirs.append('/usr/include/ffi') ++ ++ ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] ++ if not ffi_inc or ffi_inc[0] == '': ++ ffi_inc = find_file('ffi.h', [], inc_dirs) + if ffi_inc is not None: + ffi_h = ffi_inc[0] + '/ffi.h' + fp = open(ffi_h) diff --git a/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/005_osx_failed_modules.patch b/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/005_osx_failed_modules.patch new file mode 100644 index 0000000..5ccfe9c --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/005_osx_failed_modules.patch @@ -0,0 +1,124 @@ +diff -r -u ./Mac/Modules/cg/_CGmodule.c ./Mac/Modules/cg/_CGmodule.c +index 8115614..e36fce9 100755 +--- ./Mac/Modules/cg/_CGmodule.c ++++ ./Mac/Modules/cg/_CGmodule.c +@@ -1025,6 +1025,7 @@ static PyObject *CGContextRefObj_CGContextSetShouldAntialias(CGContextRefObject + return _res; + } + ++#ifndef __LP64__ + static PyObject *CGContextRefObj_SyncCGContextOriginWithPort(CGContextRefObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1055,6 +1056,7 @@ static PyObject *CGContextRefObj_ClipCGContextToRegion(CGContextRefObject *_self + _res = Py_None; + return _res; + } ++#endif + + static PyMethodDef CGContextRefObj_methods[] = { + {"CGContextSaveGState", (PyCFunction)CGContextRefObj_CGContextSaveGState, 1, +@@ -1173,10 +1175,12 @@ static PyMethodDef CGContextRefObj_methods[] = { + PyDoc_STR("() -> None")}, + {"CGContextSetShouldAntialias", (PyCFunction)CGContextRefObj_CGContextSetShouldAntialias, 1, + PyDoc_STR("(int shouldAntialias) -> None")}, ++#ifndef __LP64__ + {"SyncCGContextOriginWithPort", (PyCFunction)CGContextRefObj_SyncCGContextOriginWithPort, 1, + PyDoc_STR("(CGrafPtr port) -> None")}, + {"ClipCGContextToRegion", (PyCFunction)CGContextRefObj_ClipCGContextToRegion, 1, + PyDoc_STR("(Rect portRect, RgnHandle region) -> None")}, ++#endif + {NULL, NULL, 0} + }; + +@@ -1254,6 +1258,7 @@ PyTypeObject CGContextRef_Type = { + /* ------------------ End object type CGContextRef ------------------ */ + + ++#ifndef __LP64__ + static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1271,10 +1276,13 @@ static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) + return _res; + + } ++#endif + + static PyMethodDef CG_methods[] = { ++#ifndef __LP64__ + {"CreateCGContextForPort", (PyCFunction)CG_CreateCGContextForPort, 1, + PyDoc_STR("(CGrafPtr) -> CGContextRef")}, ++#endif + {NULL, NULL, 0} + }; + +diff -r -u ./Modules/_curses_panel.c ./Modules/_curses_panel.c +index 0acf3fd..1728b59 100644 +--- ./Modules/_curses_panel.c ++++ ./Modules/_curses_panel.c +@@ -56,7 +56,7 @@ typedef struct { + + PyTypeObject PyCursesPanel_Type; + +-#define PyCursesPanel_Check(v) ((v)->ob_type == &PyCursesPanel_Type) ++#define PyCursesPanel_Check(v) (Py_TYPE(v) == &PyCursesPanel_Type) + + /* Some helper functions. The problem is that there's always a window + associated with a panel. To ensure that Python's GC doesn't pull +@@ -178,12 +178,13 @@ PyCursesPanel_New(PANEL *pan, PyCursesWindowObject *wo) + po = PyObject_NEW(PyCursesPanelObject, &PyCursesPanel_Type); + if (po == NULL) return NULL; + po->pan = pan; +- po->wo = wo; +- Py_INCREF(wo); + if (insert_lop(po) < 0) { +- PyObject_DEL(po); +- return NULL; ++ po->wo = NULL; ++ Py_DECREF(po); ++ return NULL; + } ++ po->wo = wo; ++ Py_INCREF(wo); + return (PyObject *)po; + } + +@@ -191,8 +192,10 @@ static void + PyCursesPanel_Dealloc(PyCursesPanelObject *po) + { + (void)del_panel(po->pan); +- Py_DECREF(po->wo); +- remove_lop(po); ++ if (po->wo != NULL) { ++ Py_DECREF(po->wo); ++ remove_lop(po); ++ } + PyObject_DEL(po); + } + +@@ -338,11 +341,10 @@ PyCursesPanel_GetAttr(PyCursesPanelObject *self, char *name) + /* -------------------------------------------------------*/ + + PyTypeObject PyCursesPanel_Type = { +- PyObject_HEAD_INIT(NULL) +- 0, /*ob_size*/ +- "_curses_panel.curses panel", /*tp_name*/ +- sizeof(PyCursesPanelObject), /*tp_basicsize*/ +- 0, /*tp_itemsize*/ ++ PyVarObject_HEAD_INIT(NULL, 0) ++ "_curses_panel.curses panel", /*tp_name*/ ++ sizeof(PyCursesPanelObject), /*tp_basicsize*/ ++ 0, /*tp_itemsize*/ + /* methods */ + (destructor)PyCursesPanel_Dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ +@@ -458,7 +460,7 @@ init_curses_panel(void) + PyObject *m, *d, *v; + + /* Initialize object type */ +- PyCursesPanel_Type.ob_type = &PyType_Type; ++ Py_TYPE(&PyCursesPanel_Type) = &PyType_Type; + + import_curses(); + diff --git a/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/000_patch-setup.py.diff new file mode 100644 index 0000000..ffe4b0d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/000_patch-setup.py.diff @@ -0,0 +1,45 @@ +--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 ++++ setup.py 2011-07-07 19:25:04.548416377 +0900 +@@ -13,6 +13,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -242,10 +243,34 @@ + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ fp = open(tmpfile) ++ multiarch_path_component = fp.readline().strip() ++ fp.close() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. diff --git a/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/001_patch-svnversion.patch b/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/001_patch-svnversion.patch new file mode 100644 index 0000000..5ee39e9 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/001_patch-svnversion.patch @@ -0,0 +1,42 @@ +--- configure.in ++++ configure.in +@@ -767,7 +767,7 @@ + then + SVNVERSION="svnversion \$(srcdir)" + else +- SVNVERSION="echo exported" ++ SVNVERSION="echo Unversioned directory" + fi + + case $MACHDEP in +--- Makefile.pre.in ++++ Makefile.pre.in +@@ -501,7 +501,7 @@ + $(SIGNAL_OBJS) \ + $(MODOBJS) \ + $(srcdir)/Modules/getbuildinfo.c +- $(CC) -c $(PY_CFLAGS) -DSVNVERSION=\"`LC_ALL=C $(SVNVERSION)`\" -o $@ $(srcdir)/Modules/getbuildinfo.c ++ $(CC) -c $(PY_CFLAGS) -DSVNVERSION="\"`LC_ALL=C $(SVNVERSION)`\"" -o $@ $(srcdir)/Modules/getbuildinfo.c + + Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile + $(CC) -c $(PY_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ +--- Modules/getbuildinfo.c ++++ Modules/getbuildinfo.c +@@ -48,5 +48,5 @@ + static const char svnversion[] = SVNVERSION; + if (svnversion[0] != '$') + return svnversion; /* it was interpolated, or passed on command line */ +- return "exported"; ++ return "Unversioned directory"; + } +--- Python/sysmodule.c ++++ Python/sysmodule.c +@@ -1161,7 +1161,7 @@ + + + svnversion = _Py_svnversion(); +- if (strcmp(svnversion, "exported") != 0) ++ if (strcmp(svnversion, "Unversioned directory") != 0 && strcmp(svnversion, "exported") != 0) + svn_revision = svnversion; + else if (istag) { + len = strlen(_patchlevel_revision); diff --git a/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/002_darwin_c_source.patch b/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/002_darwin_c_source.patch new file mode 100644 index 0000000..8cef44a --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/002_darwin_c_source.patch @@ -0,0 +1,166 @@ +diff -r -u ./configure ../Python-2.5/configure +--- ./configure 2006-09-05 11:54:42.000000000 +0900 ++++ ../Python-2.5/configure 2013-07-19 15:27:46.000000000 +0900 +@@ -1396,6 +1396,16 @@ + _ACEOF + + ++# The later defininition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables ++# certain features on Mac OS X, so we need _DARWIN_C_SOURCE to re-enable ++# them. ++ ++cat >>confdefs.h <<\_ACEOF ++#define _DARWIN_C_SOURCE 1 ++_ACEOF ++ ++ ++ + define_xopen_source=yes + + # Arguments passed to configure. +@@ -3885,11 +3895,110 @@ + ;; + # is there any other compiler on Darwin besides gcc? + Darwin*) +- BASECFLAGS="$BASECFLAGS -Wno-long-double -no-cpp-precomp -mno-fused-madd" ++ # -Wno-long-double, -no-cpp-precomp, and -mno-fused-madd ++ # used to be here, but non-Apple gcc doesn't accept them. ++ if test "${CC}" = gcc ++ then ++ { echo "$as_me:${as_lineno-$LINENO}: checking which compiler should be used" >&5 ++echo -n "checking which compiler should be used... " >&6; } ++ case "${UNIVERSALSDK}" in ++ */MacOSX10.4u.sdk) ++ # Build using 10.4 SDK, force usage of gcc when the ++ # compiler is gcc, otherwise the user will get very ++ # confusing error messages when building on OSX 10.6 ++ CC=gcc-4.0 ++ CPP=cpp-4.0 ++ ;; ++ esac ++ { echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 ++echo "$CC" >&6; } ++ fi ++ ++ + if test "${enable_universalsdk}"; then +- BASECFLAGS="-arch ppc -arch i386 -isysroot ${UNIVERSALSDK} ${BASECFLAGS}" ++ UNIVERSAL_ARCH_FLAGS="" ++ if test "$UNIVERSAL_ARCHS" = "32-bit" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch ppc -arch i386" ++ ARCH_RUN_32BIT="" ++ LIPO_32BIT_FLAGS="" ++ elif test "$UNIVERSAL_ARCHS" = "64-bit" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64" ++ LIPO_32BIT_FLAGS="" ++ ARCH_RUN_32BIT="true" ++ ++ elif test "$UNIVERSAL_ARCHS" = "all" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64" ++ LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" ++ ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" ++ ++ elif test "$UNIVERSAL_ARCHS" = "intel" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64" ++ LIPO_32BIT_FLAGS="-extract i386" ++ ARCH_RUN_32BIT="/usr/bin/arch -i386" ++ ++ elif test "$UNIVERSAL_ARCHS" = "3-way" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch x86_64" ++ LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" ++ ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" ++ ++ else ++ as_fn_error $? "proper usage is --with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5 ++ ++ fi ++ ++ ++ CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" ++ if test "${UNIVERSALSDK}" != "/" ++ then ++ CFLAGS="-isysroot ${UNIVERSALSDK} ${CFLAGS}" ++ LDFLAGS="-isysroot ${UNIVERSALSDK} ${LDFLAGS}" ++ CPPFLAGS="-isysroot ${UNIVERSALSDK} ${CPPFLAGS}" ++ fi + fi + ++ # Calculate the right deployment target for this build. ++ # ++ cur_target=`sw_vers -productVersion | sed 's/\(10\.[0-9]*\).*/\1/'` ++ if test ${cur_target} '>' 10.2 && \ ++ test ${cur_target} '<' 10.6 ++ then ++ cur_target=10.3 ++ if test ${enable_universalsdk}; then ++ if test "${UNIVERSAL_ARCHS}" = "all"; then ++ # Ensure that the default platform for a ++ # 4-way universal build is OSX 10.5, ++ # that's the first OS release where ++ # 4-way builds make sense. ++ cur_target='10.5' ++ ++ elif test "${UNIVERSAL_ARCHS}" = "3-way"; then ++ cur_target='10.5' ++ ++ elif test "${UNIVERSAL_ARCHS}" = "intel"; then ++ cur_target='10.5' ++ ++ elif test "${UNIVERSAL_ARCHS}" = "64-bit"; then ++ cur_target='10.5' ++ fi ++ else ++ if test `/usr/bin/arch` = "i386"; then ++ # On Intel macs default to a deployment ++ # target of 10.4, that's the first OSX ++ # release with Intel support. ++ cur_target="10.4" ++ fi ++ fi ++ fi ++ CONFIGURE_MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET-${cur_target}} ++ ++ # Make sure that MACOSX_DEPLOYMENT_TARGET is set in the ++ # environment with a value that is the same as what we'll use ++ # in the Makefile to ensure that we'll get the same compiler ++ # environment during configure and build time. ++ MACOSX_DEPLOYMENT_TARGET="$CONFIGURE_MACOSX_DEPLOYMENT_TARGET" ++ export MACOSX_DEPLOYMENT_TARGET ++ EXPORT_MACOSX_DEPLOYMENT_TARGET='' ++ + ;; + OSF*) + BASECFLAGS="$BASECFLAGS -mieee" +@@ -10851,7 +10960,7 @@ + if test "${enable_universalsdk}"; then + : + else +- LIBTOOL_CRUFT="${LIBTOOL_CRUFT} -arch_only `arch`" ++ LIBTOOL_CRUFT="${LIBTOOL_CRUFT}" + fi + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; +@@ -10863,7 +10972,7 @@ + else + LIBTOOL_CRUFT="" + fi +- LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs -arch_only `arch`" ++ LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs" + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; + esac +diff -r -u ./pyconfig.h.in ../Python-2.5/pyconfig.h.in +--- ./pyconfig.h.in 2006-07-30 23:09:47.000000000 +0900 ++++ ../Python-2.5/pyconfig.h.in 2013-07-17 23:12:31.000000000 +0900 +@@ -912,6 +912,11 @@ + /* Define on Irix to enable u_int */ + #undef _BSD_TYPES + ++/* Define on Darwin to activate all library features */ ++#ifndef _DARWIN_C_SOURCE ++#define _DARWIN_C_SOURCE ++#endif ++ + /* This must be set to 64 on some systems to enable large file support. */ + #undef _FILE_OFFSET_BITS + diff --git a/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/003_osx_lp64.patch b/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/003_osx_lp64.patch new file mode 100644 index 0000000..fc07fc1 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/003_osx_lp64.patch @@ -0,0 +1,271 @@ +diff -r -u ./Include/pymactoolbox.h ../Python-2.5/Include/pymactoolbox.h +--- ./Include/pymactoolbox.h 2004-11-05 16:02:59.000000000 +0900 ++++ ../Python-2.5/Include/pymactoolbox.h 2013-07-17 23:38:51.000000000 +0900 +@@ -8,7 +8,10 @@ + #endif + + #include ++ ++#ifndef __LP64__ + #include ++#endif /* !__LP64__ */ + + /* + ** Helper routines for error codes and such. +@@ -18,8 +21,11 @@ + PyObject *PyMac_GetOSErrException(void); /* Initialize & return it */ + PyObject *PyErr_Mac(PyObject *, int); /* Exception with a mac error */ + PyObject *PyMac_Error(OSErr); /* Uses PyMac_GetOSErrException */ ++#ifndef __LP64__ + extern OSErr PyMac_GetFullPathname(FSSpec *, char *, int); /* convert + fsspec->path */ ++#endif /* __LP64__ */ ++ + /* + ** These conversion routines are defined in mactoolboxglue.c itself. + */ +@@ -83,8 +89,10 @@ + #endif /* USE_TOOLBOX_OBJECT_GLUE */ + + /* macfs exports */ ++#ifndef __LP64__ + int PyMac_GetFSSpec(PyObject *, FSSpec *); /* argument parser for FSSpec */ + PyObject *PyMac_BuildFSSpec(FSSpec *); /* Convert FSSpec to PyObject */ ++#endif /* !__LP64__ */ + + int PyMac_GetFSRef(PyObject *, FSRef *); /* argument parser for FSRef */ + PyObject *PyMac_BuildFSRef(FSRef *); /* Convert FSRef to PyObject */ +@@ -101,39 +109,54 @@ + extern int CmpInstObj_Convert(PyObject *, ComponentInstance *); + + /* Ctl exports */ ++#ifndef __LP64__ + extern PyObject *CtlObj_New(ControlHandle); + extern int CtlObj_Convert(PyObject *, ControlHandle *); ++#endif /* !__LP64__ */ + + /* Dlg exports */ ++#ifndef __LP64__ + extern PyObject *DlgObj_New(DialogPtr); + extern int DlgObj_Convert(PyObject *, DialogPtr *); + extern PyObject *DlgObj_WhichDialog(DialogPtr); ++#endif /* !__LP64__ */ + + /* Drag exports */ ++#ifndef __LP64__ + extern PyObject *DragObj_New(DragReference); + extern int DragObj_Convert(PyObject *, DragReference *); ++#endif /* !__LP64__ */ + + /* List exports */ ++#ifndef __LP64__ + extern PyObject *ListObj_New(ListHandle); + extern int ListObj_Convert(PyObject *, ListHandle *); ++#endif /* !__LP64__ */ + + /* Menu exports */ ++#ifndef __LP64__ + extern PyObject *MenuObj_New(MenuHandle); + extern int MenuObj_Convert(PyObject *, MenuHandle *); ++#endif /* !__LP64__ */ + + /* Qd exports */ ++#ifndef __LP64__ + extern PyObject *GrafObj_New(GrafPtr); + extern int GrafObj_Convert(PyObject *, GrafPtr *); + extern PyObject *BMObj_New(BitMapPtr); + extern int BMObj_Convert(PyObject *, BitMapPtr *); + extern PyObject *QdRGB_New(RGBColor *); + extern int QdRGB_Convert(PyObject *, RGBColor *); ++#endif /* !__LP64__ */ + + /* Qdoffs exports */ ++#ifndef __LP64__ + extern PyObject *GWorldObj_New(GWorldPtr); + extern int GWorldObj_Convert(PyObject *, GWorldPtr *); ++#endif /* !__LP64__ */ + + /* Qt exports */ ++#ifndef __LP64__ + extern PyObject *TrackObj_New(Track); + extern int TrackObj_Convert(PyObject *, Track *); + extern PyObject *MovieObj_New(Movie); +@@ -146,6 +169,7 @@ + extern int UserDataObj_Convert(PyObject *, UserData *); + extern PyObject *MediaObj_New(Media); + extern int MediaObj_Convert(PyObject *, Media *); ++#endif /* !__LP64__ */ + + /* Res exports */ + extern PyObject *ResObj_New(Handle); +@@ -154,13 +178,17 @@ + extern int OptResObj_Convert(PyObject *, Handle *); + + /* TE exports */ ++#ifndef __LP64__ + extern PyObject *TEObj_New(TEHandle); + extern int TEObj_Convert(PyObject *, TEHandle *); ++#endif /* !__LP64__ */ + + /* Win exports */ ++#ifndef __LP64__ + extern PyObject *WinObj_New(WindowPtr); + extern int WinObj_Convert(PyObject *, WindowPtr *); + extern PyObject *WinObj_WhichWindow(WindowPtr); ++#endif /* !__LP64__ */ + + /* CF exports */ + extern PyObject *CFObj_New(CFTypeRef); +diff -r -u ./Mac/Modules/res/_Resmodule.c ../Python-2.5/Mac/Modules/res/_Resmodule.c +--- ./Mac/Modules/res/_Resmodule.c 2005-07-04 05:59:44.000000000 +0900 ++++ ../Python-2.5/Mac/Modules/res/_Resmodule.c 2013-07-17 23:38:51.000000000 +0900 +@@ -414,6 +414,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *ResObj_as_Control(ResourceObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -431,6 +432,7 @@ + return _res; + + } ++#endif /* !__LP64__ */ + + static PyObject *ResObj_LoadResource(ResourceObject *_self, PyObject *_args) + { +@@ -1152,6 +1154,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *Res_OpenRFPerm(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1287,6 +1290,7 @@ + _res = Py_None; + return _res; + } ++#endif /* !__LP64__ */ + + static PyObject *Res_InsertResourceFile(PyObject *_self, PyObject *_args) + { +@@ -1327,6 +1331,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *Res_FSpResourceFileAlreadyOpen(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1413,6 +1418,7 @@ + nextRefNum); + return _res; + } ++#endif /* !__LP64__ */ + + static PyObject *Res_FSOpenResFile(PyObject *_self, PyObject *_args) + { +@@ -1438,6 +1444,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *Res_FSCreateResFile(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1534,6 +1541,7 @@ + PyMac_BuildFSSpec, &newSpec); + return _res; + } ++#endif /* __LP64__ */ + + static PyObject *Res_FSOpenResourceFile(PyObject *_self, PyObject *_args) + { +@@ -1637,6 +1645,7 @@ + PyDoc_STR("(short refNum) -> (short _rv)")}, + {"SetResFileAttrs", (PyCFunction)Res_SetResFileAttrs, 1, + PyDoc_STR("(short refNum, short attrs) -> None")}, ++#ifndef __LP64__ + {"OpenRFPerm", (PyCFunction)Res_OpenRFPerm, 1, + PyDoc_STR("(Str255 fileName, short vRefNum, SignedByte permission) -> (short _rv)")}, + {"HOpenResFile", (PyCFunction)Res_HOpenResFile, 1, +@@ -1647,10 +1656,12 @@ + PyDoc_STR("(FSSpec spec, SignedByte permission) -> (short _rv)")}, + {"FSpCreateResFile", (PyCFunction)Res_FSpCreateResFile, 1, + PyDoc_STR("(FSSpec spec, OSType creator, OSType fileType, ScriptCode scriptTag) -> None")}, ++#endif /* !__LP64__ */ + {"InsertResourceFile", (PyCFunction)Res_InsertResourceFile, 1, + PyDoc_STR("(SInt16 refNum, RsrcChainLocation where) -> None")}, + {"DetachResourceFile", (PyCFunction)Res_DetachResourceFile, 1, + PyDoc_STR("(SInt16 refNum) -> None")}, ++#ifndef __LP64__ + {"FSpResourceFileAlreadyOpen", (PyCFunction)Res_FSpResourceFileAlreadyOpen, 1, + PyDoc_STR("(FSSpec resourceFile) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, + {"FSpOpenOrphanResFile", (PyCFunction)Res_FSpOpenOrphanResFile, 1, +@@ -1659,14 +1670,17 @@ + PyDoc_STR("() -> (SInt16 refNum)")}, + {"GetNextResourceFile", (PyCFunction)Res_GetNextResourceFile, 1, + PyDoc_STR("(SInt16 curRefNum) -> (SInt16 nextRefNum)")}, ++#endif /* __LP64__ */ + {"FSOpenResFile", (PyCFunction)Res_FSOpenResFile, 1, + PyDoc_STR("(FSRef ref, SignedByte permission) -> (short _rv)")}, ++#ifndef __LP64__ + {"FSCreateResFile", (PyCFunction)Res_FSCreateResFile, 1, + PyDoc_STR("(FSRef parentRef, Buffer nameLength) -> (FSRef newRef, FSSpec newSpec)")}, + {"FSResourceFileAlreadyOpen", (PyCFunction)Res_FSResourceFileAlreadyOpen, 1, + PyDoc_STR("(FSRef resourceFileRef) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, + {"FSCreateResourceFile", (PyCFunction)Res_FSCreateResourceFile, 1, + PyDoc_STR("(FSRef parentRef, Buffer nameLength, Buffer forkNameLength) -> (FSRef newRef, FSSpec newSpec)")}, ++#endif /* __LP64__ */ + {"FSOpenResourceFile", (PyCFunction)Res_FSOpenResourceFile, 1, + PyDoc_STR("(FSRef ref, Buffer forkNameLength, SignedByte permissions) -> (SInt16 refNum)")}, + {"Handle", (PyCFunction)Res_Handle, 1, +diff -r -u ./Modules/_ctypes/libffi/src/darwin/ffitarget.h ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h +--- ./Modules/_ctypes/libffi/src/darwin/ffitarget.h 2006-05-26 06:58:05.000000000 +0900 ++++ ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h 2013-07-17 23:38:51.000000000 +0900 +@@ -4,7 +4,7 @@ + * created by configure). This makes is possible to build a univeral binary + * of ctypes in one go. + */ +-#if defined(__i386__) ++#if defined(__i386__) || defined(__x86_64__) + + #ifndef X86_DARWIN + #define X86_DARWIN +diff -r -u ./Python/mactoolboxglue.c ../Python-2.5/Python/mactoolboxglue.c +--- ./Python/mactoolboxglue.c 2006-07-12 01:44:25.000000000 +0900 ++++ ../Python-2.5/Python/mactoolboxglue.c 2013-07-17 23:39:09.000000000 +0900 +@@ -106,6 +106,7 @@ + } + + ++#ifndef __LP64__ + OSErr + PyMac_GetFullPathname(FSSpec *fss, char *path, int len) + { +@@ -153,6 +154,7 @@ + Py_XDECREF(fs); + return err; + } ++#endif /* !__LP64__ */ + + /* Convert a 4-char string object argument to an OSType value */ + int +@@ -417,6 +419,7 @@ + GLUE_NEW(GWorldPtr, GWorldObj_New, "Carbon.Qdoffs") + GLUE_CONVERT(GWorldPtr, GWorldObj_Convert, "Carbon.Qdoffs") + ++#ifndef __LP64__ + GLUE_NEW(Track, TrackObj_New, "Carbon.Qt") + GLUE_CONVERT(Track, TrackObj_Convert, "Carbon.Qt") + GLUE_NEW(Movie, MovieObj_New, "Carbon.Qt") +@@ -429,6 +432,7 @@ + GLUE_CONVERT(UserData, UserDataObj_Convert, "Carbon.Qt") + GLUE_NEW(Media, MediaObj_New, "Carbon.Qt") + GLUE_CONVERT(Media, MediaObj_Convert, "Carbon.Qt") ++#endif /* !__LP64__ */ + + GLUE_NEW(Handle, ResObj_New, "Carbon.Res") + GLUE_CONVERT(Handle, ResObj_Convert, "Carbon.Res") diff --git a/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/004_osx_libffi.patch b/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/004_osx_libffi.patch new file mode 100644 index 0000000..8318432 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/004_osx_libffi.patch @@ -0,0 +1,6881 @@ +diff -r -u ./Modules/_ctypes/libffi_osx/LICENSE ./Modules/_ctypes/libffi_osx/LICENSE +new file mode 100644 +index 0000000..f591795 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/LICENSE +@@ -0,0 +1,20 @@ ++libffi - Copyright (c) 1996-2003 Red Hat, Inc. ++ ++Permission is hereby granted, free of charge, to any person obtaining ++a copy of this software and associated documentation files (the ++``Software''), to deal in the Software without restriction, including ++without limitation the rights to use, copy, modify, merge, publish, ++distribute, sublicense, and/or sell copies of the Software, and to ++permit persons to whom the Software is furnished to do so, subject to ++the following conditions: ++ ++The above copyright notice and this permission notice shall be included ++in all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++OTHER DEALINGS IN THE SOFTWARE. +diff -r -u ./Modules/_ctypes/libffi_osx/README ./Modules/_ctypes/libffi_osx/README +new file mode 100644 +index 0000000..1fc2747 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/README +@@ -0,0 +1,500 @@ ++This directory contains the libffi package, which is not part of GCC but ++shipped with GCC as convenience. ++ ++Status ++====== ++ ++libffi-2.00 has not been released yet! This is a development snapshot! ++ ++libffi-1.20 was released on October 5, 1998. Check the libffi web ++page for updates: . ++ ++ ++What is libffi? ++=============== ++ ++Compilers for high level languages generate code that follow certain ++conventions. These conventions are necessary, in part, for separate ++compilation to work. One such convention is the "calling ++convention". The "calling convention" is essentially a set of ++assumptions made by the compiler about where function arguments will ++be found on entry to a function. A "calling convention" also specifies ++where the return value for a function is found. ++ ++Some programs may not know at the time of compilation what arguments ++are to be passed to a function. For instance, an interpreter may be ++told at run-time about the number and types of arguments used to call ++a given function. Libffi can be used in such programs to provide a ++bridge from the interpreter program to compiled code. ++ ++The libffi library provides a portable, high level programming ++interface to various calling conventions. This allows a programmer to ++call any function specified by a call interface description at run ++time. ++ ++Ffi stands for Foreign Function Interface. A foreign function ++interface is the popular name for the interface that allows code ++written in one language to call code written in another language. The ++libffi library really only provides the lowest, machine dependent ++layer of a fully featured foreign function interface. A layer must ++exist above libffi that handles type conversions for values passed ++between the two languages. ++ ++ ++Supported Platforms and Prerequisites ++===================================== ++ ++Libffi has been ported to: ++ ++ SunOS 4.1.3 & Solaris 2.x (SPARC-V8, SPARC-V9) ++ ++ Irix 5.3 & 6.2 (System V/o32 & n32) ++ ++ Intel x86 - Linux (System V ABI) ++ ++ Alpha - Linux and OSF/1 ++ ++ m68k - Linux (System V ABI) ++ ++ PowerPC - Linux (System V ABI, Darwin, AIX) ++ ++ ARM - Linux (System V ABI) ++ ++Libffi has been tested with the egcs 1.0.2 gcc compiler. Chances are ++that other versions will work. Libffi has also been built and tested ++with the SGI compiler tools. ++ ++On PowerPC, the tests failed (see the note below). ++ ++You must use GNU make to build libffi. SGI's make will not work. ++Sun's probably won't either. ++ ++If you port libffi to another platform, please let me know! I assume ++that some will be easy (x86 NetBSD), and others will be more difficult ++(HP). ++ ++ ++Installing libffi ++================= ++ ++[Note: before actually performing any of these installation steps, ++ you may wish to read the "Platform Specific Notes" below.] ++ ++First you must configure the distribution for your particular ++system. Go to the directory you wish to build libffi in and run the ++"configure" program found in the root directory of the libffi source ++distribution. ++ ++You may want to tell configure where to install the libffi library and ++header files. To do that, use the --prefix configure switch. Libffi ++will install under /usr/local by default. ++ ++If you want to enable extra run-time debugging checks use the the ++--enable-debug configure switch. This is useful when your program dies ++mysteriously while using libffi. ++ ++Another useful configure switch is --enable-purify-safety. Using this ++will add some extra code which will suppress certain warnings when you ++are using Purify with libffi. Only use this switch when using ++Purify, as it will slow down the library. ++ ++Configure has many other options. Use "configure --help" to see them all. ++ ++Once configure has finished, type "make". Note that you must be using ++GNU make. SGI's make will not work. Sun's probably won't either. ++You can ftp GNU make from prep.ai.mit.edu:/pub/gnu. ++ ++To ensure that libffi is working as advertised, type "make test". ++ ++To install the library and header files, type "make install". ++ ++ ++Using libffi ++============ ++ ++ The Basics ++ ---------- ++ ++Libffi assumes that you have a pointer to the function you wish to ++call and that you know the number and types of arguments to pass it, ++as well as the return type of the function. ++ ++The first thing you must do is create an ffi_cif object that matches ++the signature of the function you wish to call. The cif in ffi_cif ++stands for Call InterFace. To prepare a call interface object, use the ++following function: ++ ++ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, ++ unsigned int nargs, ++ ffi_type *rtype, ffi_type **atypes); ++ ++ CIF is a pointer to the call interface object you wish ++ to initialize. ++ ++ ABI is an enum that specifies the calling convention ++ to use for the call. FFI_DEFAULT_ABI defaults ++ to the system's native calling convention. Other ++ ABI's may be used with care. They are system ++ specific. ++ ++ NARGS is the number of arguments this function accepts. ++ libffi does not yet support vararg functions. ++ ++ RTYPE is a pointer to an ffi_type structure that represents ++ the return type of the function. Ffi_type objects ++ describe the types of values. libffi provides ++ ffi_type objects for many of the native C types: ++ signed int, unsigned int, signed char, unsigned char, ++ etc. There is also a pointer ffi_type object and ++ a void ffi_type. Use &ffi_type_void for functions that ++ don't return values. ++ ++ ATYPES is a vector of ffi_type pointers. ARGS must be NARGS long. ++ If NARGS is 0, this is ignored. ++ ++ ++ffi_prep_cif will return a status code that you are responsible ++for checking. It will be one of the following: ++ ++ FFI_OK - All is good. ++ ++ FFI_BAD_TYPEDEF - One of the ffi_type objects that ffi_prep_cif ++ came across is bad. ++ ++ ++Before making the call, the VALUES vector should be initialized ++with pointers to the appropriate argument values. ++ ++To call the function using the initialized ffi_cif, use the ++ffi_call function: ++ ++void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues); ++ ++ CIF is a pointer to the ffi_cif initialized specifically ++ for this function. ++ ++ FN is a pointer to the function you want to call. ++ ++ RVALUE is a pointer to a chunk of memory that is to hold the ++ result of the function call. Currently, it must be ++ at least one word in size (except for the n32 version ++ under Irix 6.x, which must be a pointer to an 8 byte ++ aligned value (a long long). It must also be at least ++ word aligned (depending on the return type, and the ++ system's alignment requirements). If RTYPE is ++ &ffi_type_void, this is ignored. If RVALUE is NULL, ++ the return value is discarded. ++ ++ AVALUES is a vector of void* that point to the memory locations ++ holding the argument values for a call. ++ If NARGS is 0, this is ignored. ++ ++ ++If you are expecting a return value from FN it will have been stored ++at RVALUE. ++ ++ ++ ++ An Example ++ ---------- ++ ++Here is a trivial example that calls puts() a few times. ++ ++ #include ++ #include ++ ++ int main() ++ { ++ ffi_cif cif; ++ ffi_type *args[1]; ++ void *values[1]; ++ char *s; ++ int rc; ++ ++ /* Initialize the argument info vectors */ ++ args[0] = &ffi_type_uint; ++ values[0] = &s; ++ ++ /* Initialize the cif */ ++ if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, ++ &ffi_type_uint, args) == FFI_OK) ++ { ++ s = "Hello World!"; ++ ffi_call(&cif, puts, &rc, values); ++ /* rc now holds the result of the call to puts */ ++ ++ /* values holds a pointer to the function's arg, so to ++ call puts() again all we need to do is change the ++ value of s */ ++ s = "This is cool!"; ++ ffi_call(&cif, puts, &rc, values); ++ } ++ ++ return 0; ++ } ++ ++ ++ ++ Aggregate Types ++ --------------- ++ ++Although libffi has no special support for unions or bit-fields, it is ++perfectly happy passing structures back and forth. You must first ++describe the structure to libffi by creating a new ffi_type object ++for it. Here is the definition of ffi_type: ++ ++ typedef struct _ffi_type ++ { ++ unsigned size; ++ short alignment; ++ short type; ++ struct _ffi_type **elements; ++ } ffi_type; ++ ++All structures must have type set to FFI_TYPE_STRUCT. You may set ++size and alignment to 0. These will be calculated and reset to the ++appropriate values by ffi_prep_cif(). ++ ++elements is a NULL terminated array of pointers to ffi_type objects ++that describe the type of the structure elements. These may, in turn, ++be structure elements. ++ ++The following example initializes a ffi_type object representing the ++tm struct from Linux's time.h: ++ ++ struct tm { ++ int tm_sec; ++ int tm_min; ++ int tm_hour; ++ int tm_mday; ++ int tm_mon; ++ int tm_year; ++ int tm_wday; ++ int tm_yday; ++ int tm_isdst; ++ /* Those are for future use. */ ++ long int __tm_gmtoff__; ++ __const char *__tm_zone__; ++ }; ++ ++ { ++ ffi_type tm_type; ++ ffi_type *tm_type_elements[12]; ++ int i; ++ ++ tm_type.size = tm_type.alignment = 0; ++ tm_type.elements = &tm_type_elements; ++ ++ for (i = 0; i < 9; i++) ++ tm_type_elements[i] = &ffi_type_sint; ++ ++ tm_type_elements[9] = &ffi_type_slong; ++ tm_type_elements[10] = &ffi_type_pointer; ++ tm_type_elements[11] = NULL; ++ ++ /* tm_type can now be used to represent tm argument types and ++ return types for ffi_prep_cif() */ ++ } ++ ++ ++ ++Platform Specific Notes ++======================= ++ ++ Intel x86 ++ --------- ++ ++There are no known problems with the x86 port. ++ ++ Sun SPARC - SunOS 4.1.3 & Solaris 2.x ++ ------------------------------------- ++ ++You must use GNU Make to build libffi on Sun platforms. ++ ++ MIPS - Irix 5.3 & 6.x ++ --------------------- ++ ++Irix 6.2 and better supports three different calling conventions: o32, ++n32 and n64. Currently, libffi only supports both o32 and n32 under ++Irix 6.x, but only o32 under Irix 5.3. Libffi will automatically be ++configured for whichever calling convention it was built for. ++ ++By default, the configure script will try to build libffi with the GNU ++development tools. To build libffi with the SGI development tools, set ++the environment variable CC to either "cc -32" or "cc -n32" before ++running configure under Irix 6.x (depending on whether you want an o32 ++or n32 library), or just "cc" for Irix 5.3. ++ ++With the n32 calling convention, when returning structures smaller ++than 16 bytes, be sure to provide an RVALUE that is 8 byte aligned. ++Here's one way of forcing this: ++ ++ double struct_storage[2]; ++ my_small_struct *s = (my_small_struct *) struct_storage; ++ /* Use s for RVALUE */ ++ ++If you don't do this you are liable to get spurious bus errors. ++ ++"long long" values are not supported yet. ++ ++You must use GNU Make to build libffi on SGI platforms. ++ ++ ARM - System V ABI ++ ------------------ ++ ++The ARM port was performed on a NetWinder running ARM Linux ELF ++(2.0.31) and gcc 2.8.1. ++ ++ ++ ++ PowerPC System V ABI ++ -------------------- ++ ++There are two `System V ABI's which libffi implements for PowerPC. ++They differ only in how small structures are returned from functions. ++ ++In the FFI_SYSV version, structures that are 8 bytes or smaller are ++returned in registers. This is what GCC does when it is configured ++for solaris, and is what the System V ABI I have (dated September ++1995) says. ++ ++In the FFI_GCC_SYSV version, all structures are returned the same way: ++by passing a pointer as the first argument to the function. This is ++what GCC does when it is configured for linux or a generic sysv ++target. ++ ++EGCS 1.0.1 (and probably other versions of EGCS/GCC) also has a ++inconsistency with the SysV ABI: When a procedure is called with many ++floating-point arguments, some of them get put on the stack. They are ++all supposed to be stored in double-precision format, even if they are ++only single-precision, but EGCS stores single-precision arguments as ++single-precision anyway. This causes one test to fail (the `many ++arguments' test). ++ ++ ++What's With The Crazy Comments? ++=============================== ++ ++You might notice a number of cryptic comments in the code, delimited ++by /*@ and @*/. These are annotations read by the program LCLint, a ++tool for statically checking C programs. You can read all about it at ++. ++ ++ ++History ++======= ++ ++1.20 Oct-5-98 ++ Raffaele Sena produces ARM port. ++ ++1.19 Oct-5-98 ++ Fixed x86 long double and long long return support. ++ m68k bug fixes from Andreas Schwab. ++ Patch for DU assembler compatibility for the Alpha from Richard ++ Henderson. ++ ++1.18 Apr-17-98 ++ Bug fixes and MIPS configuration changes. ++ ++1.17 Feb-24-98 ++ Bug fixes and m68k port from Andreas Schwab. PowerPC port from ++ Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes. ++ ++1.16 Feb-11-98 ++ Richard Henderson produces Alpha port. ++ ++1.15 Dec-4-97 ++ Fixed an n32 ABI bug. New libtool, auto* support. ++ ++1.14 May-13-97 ++ libtool is now used to generate shared and static libraries. ++ Fixed a minor portability problem reported by Russ McManus ++ . ++ ++1.13 Dec-2-96 ++ Added --enable-purify-safety to keep Purify from complaining ++ about certain low level code. ++ Sparc fix for calling functions with < 6 args. ++ Linux x86 a.out fix. ++ ++1.12 Nov-22-96 ++ Added missing ffi_type_void, needed for supporting void return ++ types. Fixed test case for non MIPS machines. Cygnus Support ++ is now Cygnus Solutions. ++ ++1.11 Oct-30-96 ++ Added notes about GNU make. ++ ++1.10 Oct-29-96 ++ Added configuration fix for non GNU compilers. ++ ++1.09 Oct-29-96 ++ Added --enable-debug configure switch. Clean-ups based on LCLint ++ feedback. ffi_mips.h is always installed. Many configuration ++ fixes. Fixed ffitest.c for sparc builds. ++ ++1.08 Oct-15-96 ++ Fixed n32 problem. Many clean-ups. ++ ++1.07 Oct-14-96 ++ Gordon Irlam rewrites v8.S again. Bug fixes. ++ ++1.06 Oct-14-96 ++ Gordon Irlam improved the sparc port. ++ ++1.05 Oct-14-96 ++ Interface changes based on feedback. ++ ++1.04 Oct-11-96 ++ Sparc port complete (modulo struct passing bug). ++ ++1.03 Oct-10-96 ++ Passing struct args, and returning struct values works for ++ all architectures/calling conventions. Expanded tests. ++ ++1.02 Oct-9-96 ++ Added SGI n32 support. Fixed bugs in both o32 and Linux support. ++ Added "make test". ++ ++1.01 Oct-8-96 ++ Fixed float passing bug in mips version. Restructured some ++ of the code. Builds cleanly with SGI tools. ++ ++1.00 Oct-7-96 ++ First release. No public announcement. ++ ++ ++Authors & Credits ++================= ++ ++libffi was written by Anthony Green . ++ ++Portions of libffi were derived from Gianni Mariani's free gencall ++library for Silicon Graphics machines. ++ ++The closure mechanism was designed and implemented by Kresten Krab ++Thorup. ++ ++The Sparc port was derived from code contributed by the fine folks at ++Visible Decisions Inc . Further enhancements were ++made by Gordon Irlam at Cygnus Solutions . ++ ++The Alpha port was written by Richard Henderson at Cygnus Solutions. ++ ++Andreas Schwab ported libffi to m68k Linux and provided a number of ++bug fixes. ++ ++Geoffrey Keating ported libffi to the PowerPC. ++ ++Raffaele Sena ported libffi to the ARM. ++ ++Jesper Skov and Andrew Haley both did more than their fair share of ++stepping through the code and tracking down bugs. ++ ++Thanks also to Tom Tromey for bug fixes and configuration help. ++ ++Thanks to Jim Blandy, who provided some useful feedback on the libffi ++interface. ++ ++If you have a problem, or have found a bug, please send a note to ++green@cygnus.com. +diff -r -u ./Modules/_ctypes/libffi_osx/README.pyobjc ./Modules/_ctypes/libffi_osx/README.pyobjc +new file mode 100644 +index 0000000..405d85f +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/README.pyobjc +@@ -0,0 +1,5 @@ ++This directory contains a slightly modified version of libffi, extracted from ++the GCC source-tree. ++ ++The only modifications are those that are necessary to compile libffi using ++the Apple provided compiler and outside of the GCC source tree. +diff -r -u ./Modules/_ctypes/libffi_osx/ffi.c ./Modules/_ctypes/libffi_osx/ffi.c +new file mode 100644 +index 0000000..bf42093 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/ffi.c +@@ -0,0 +1,226 @@ ++/* ----------------------------------------------------------------------- ++ prep_cif.c - Copyright (c) 1996, 1998 Red Hat, Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++#include ++ ++/* Round up to FFI_SIZEOF_ARG. */ ++#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG) ++ ++/* Perform machine independent initialization of aggregate type ++ specifications. */ ++ ++static ffi_status ++initialize_aggregate( ++/*@out@*/ ffi_type* arg) ++{ ++/*@-usedef@*/ ++ ++ if (arg == NULL || arg->elements == NULL || ++ arg->size != 0 || arg->alignment != 0) ++ return FFI_BAD_TYPEDEF; ++ ++ ffi_type** ptr = &(arg->elements[0]); ++ ++ while ((*ptr) != NULL) ++ { ++ if (((*ptr)->size == 0) && (initialize_aggregate(*ptr) != FFI_OK)) ++ return FFI_BAD_TYPEDEF; ++ ++ /* Perform a sanity check on the argument type */ ++ FFI_ASSERT_VALID_TYPE(*ptr); ++ ++#ifdef POWERPC_DARWIN ++ int curalign = (*ptr)->alignment; ++ ++ if (ptr != &(arg->elements[0])) ++ { ++ if (curalign > 4 && curalign != 16) ++ curalign = 4; ++ } ++ ++ arg->size = ALIGN(arg->size, curalign); ++ arg->size += (*ptr)->size; ++ arg->alignment = (arg->alignment > curalign) ? ++ arg->alignment : curalign; ++#else ++ arg->size = ALIGN(arg->size, (*ptr)->alignment); ++ arg->size += (*ptr)->size; ++ arg->alignment = (arg->alignment > (*ptr)->alignment) ? ++ arg->alignment : (*ptr)->alignment; ++#endif ++ ++ ptr++; ++ } ++ ++ /* Structure size includes tail padding. This is important for ++ structures that fit in one register on ABIs like the PowerPC64 ++ Linux ABI that right justify small structs in a register. ++ It's also needed for nested structure layout, for example ++ struct A { long a; char b; }; struct B { struct A x; char y; }; ++ should find y at an offset of 2*sizeof(long) and result in a ++ total size of 3*sizeof(long). */ ++ arg->size = ALIGN(arg->size, arg->alignment); ++ ++ if (arg->size == 0) ++ return FFI_BAD_TYPEDEF; ++ ++ return FFI_OK; ++ ++/*@=usedef@*/ ++} ++ ++#ifndef __CRIS__ ++/* The CRIS ABI specifies structure elements to have byte ++ alignment only, so it completely overrides this functions, ++ which assumes "natural" alignment and padding. */ ++ ++/* Perform machine independent ffi_cif preparation, then call ++ machine dependent routine. */ ++ ++#if defined(X86_DARWIN) ++ ++static inline bool ++struct_on_stack( ++ int size) ++{ ++ if (size > 8) ++ return true; ++ ++ /* This is not what the ABI says, but is what is really implemented */ ++ switch (size) ++ { ++ case 1: ++ case 2: ++ case 4: ++ case 8: ++ return false; ++ ++ default: ++ return true; ++ } ++} ++ ++#endif // defined(X86_DARWIN) ++ ++// Arguments' ffi_type->alignment must be nonzero. ++ffi_status ++ffi_prep_cif( ++/*@out@*/ /*@partial@*/ ffi_cif* cif, ++ ffi_abi abi, ++ unsigned int nargs, ++/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, ++/*@dependent@*/ ffi_type** atypes) ++{ ++ if (cif == NULL) ++ return FFI_BAD_TYPEDEF; ++ ++ if (abi <= FFI_FIRST_ABI || abi > FFI_DEFAULT_ABI) ++ return FFI_BAD_ABI; ++ ++ unsigned int bytes = 0; ++ unsigned int i; ++ ffi_type** ptr; ++ ++ cif->abi = abi; ++ cif->arg_types = atypes; ++ cif->nargs = nargs; ++ cif->rtype = rtype; ++ cif->flags = 0; ++ ++ /* Initialize the return type if necessary */ ++ /*@-usedef@*/ ++ if ((cif->rtype->size == 0) && (initialize_aggregate(cif->rtype) != FFI_OK)) ++ return FFI_BAD_TYPEDEF; ++ /*@=usedef@*/ ++ ++ /* Perform a sanity check on the return type */ ++ FFI_ASSERT_VALID_TYPE(cif->rtype); ++ ++ /* x86-64 and s390 stack space allocation is handled in prep_machdep. */ ++#if !defined M68K && !defined __x86_64__ && !defined S390 && !defined PA ++ /* Make space for the return structure pointer */ ++ if (cif->rtype->type == FFI_TYPE_STRUCT ++#ifdef SPARC ++ && (cif->abi != FFI_V9 || cif->rtype->size > 32) ++#endif ++#ifdef X86_DARWIN ++ && (struct_on_stack(cif->rtype->size)) ++#endif ++ ) ++ bytes = STACK_ARG_SIZE(sizeof(void*)); ++#endif ++ ++ for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) ++ { ++ /* Initialize any uninitialized aggregate type definitions */ ++ if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) ++ return FFI_BAD_TYPEDEF; ++ ++ if ((*ptr)->alignment == 0) ++ return FFI_BAD_TYPEDEF; ++ ++ /* Perform a sanity check on the argument type, do this ++ check after the initialization. */ ++ FFI_ASSERT_VALID_TYPE(*ptr); ++ ++#if defined(X86_DARWIN) ++ { ++ int align = (*ptr)->alignment; ++ ++ if (align > 4) ++ align = 4; ++ ++ if ((align - 1) & bytes) ++ bytes = ALIGN(bytes, align); ++ ++ bytes += STACK_ARG_SIZE((*ptr)->size); ++ } ++#elif !defined __x86_64__ && !defined S390 && !defined PA ++#ifdef SPARC ++ if (((*ptr)->type == FFI_TYPE_STRUCT ++ && ((*ptr)->size > 16 || cif->abi != FFI_V9)) ++ || ((*ptr)->type == FFI_TYPE_LONGDOUBLE ++ && cif->abi != FFI_V9)) ++ bytes += sizeof(void*); ++ else ++#endif ++ { ++ /* Add any padding if necessary */ ++ if (((*ptr)->alignment - 1) & bytes) ++ bytes = ALIGN(bytes, (*ptr)->alignment); ++ ++ bytes += STACK_ARG_SIZE((*ptr)->size); ++ } ++#endif ++ } ++ ++ cif->bytes = bytes; ++ ++ /* Perform machine dependent cif processing */ ++ return ffi_prep_cif_machdep(cif); ++} ++#endif /* not __CRIS__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi.h ./Modules/_ctypes/libffi_osx/include/ffi.h +new file mode 100644 +index 0000000..c104a5c +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ffi.h +@@ -0,0 +1,355 @@ ++/* -----------------------------------------------------------------*-C-*- ++ libffi PyOBJC - Copyright (c) 1996-2003 Red Hat, Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ++ ----------------------------------------------------------------------- */ ++ ++/* ------------------------------------------------------------------- ++ The basic API is described in the README file. ++ ++ The raw API is designed to bypass some of the argument packing ++ and unpacking on architectures for which it can be avoided. ++ ++ The closure API allows interpreted functions to be packaged up ++ inside a C function pointer, so that they can be called as C functions, ++ with no understanding on the client side that they are interpreted. ++ It can also be used in other cases in which it is necessary to package ++ up a user specified parameter and a function pointer as a single ++ function pointer. ++ ++ The closure API must be implemented in order to get its functionality, ++ e.g. for use by gij. Routines are provided to emulate the raw API ++ if the underlying platform doesn't allow faster implementation. ++ ++ More details on the raw and closure API can be found in: ++ ++ http://gcc.gnu.org/ml/java/1999-q3/msg00138.html ++ ++ and ++ ++ http://gcc.gnu.org/ml/java/1999-q3/msg00174.html ++ -------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_H ++#define LIBFFI_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/* Specify which architecture libffi is configured for. */ ++#ifdef MACOSX ++# if defined(__i386__) || defined(__x86_64__) ++# define X86_DARWIN ++# elif defined(__ppc__) || defined(__ppc64__) ++# define POWERPC_DARWIN ++# else ++# error "Unsupported MacOS X CPU type" ++# endif ++#else ++#error "Unsupported OS type" ++#endif ++ ++/* ---- System configuration information --------------------------------- */ ++ ++#include "ffitarget.h" ++#include "fficonfig.h" ++ ++#ifndef LIBFFI_ASM ++ ++#include ++#include ++ ++/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). ++ But we can find it either under the correct ANSI name, or under GNU ++ C's internal name. */ ++#ifdef LONG_LONG_MAX ++# define FFI_LONG_LONG_MAX LONG_LONG_MAX ++#else ++# ifdef LLONG_MAX ++# define FFI_LONG_LONG_MAX LLONG_MAX ++# else ++# ifdef __GNUC__ ++# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ ++# endif ++# endif ++#endif ++ ++#if SCHAR_MAX == 127 ++# define ffi_type_uchar ffi_type_uint8 ++# define ffi_type_schar ffi_type_sint8 ++#else ++#error "char size not supported" ++#endif ++ ++#if SHRT_MAX == 32767 ++# define ffi_type_ushort ffi_type_uint16 ++# define ffi_type_sshort ffi_type_sint16 ++#elif SHRT_MAX == 2147483647 ++# define ffi_type_ushort ffi_type_uint32 ++# define ffi_type_sshort ffi_type_sint32 ++#else ++#error "short size not supported" ++#endif ++ ++#if INT_MAX == 32767 ++# define ffi_type_uint ffi_type_uint16 ++# define ffi_type_sint ffi_type_sint16 ++#elif INT_MAX == 2147483647 ++# define ffi_type_uint ffi_type_uint32 ++# define ffi_type_sint ffi_type_sint32 ++#elif INT_MAX == 9223372036854775807 ++# define ffi_type_uint ffi_type_uint64 ++# define ffi_type_sint ffi_type_sint64 ++#else ++#error "int size not supported" ++#endif ++ ++#define ffi_type_ulong ffi_type_uint64 ++#define ffi_type_slong ffi_type_sint64 ++ ++#if LONG_MAX == 2147483647 ++# if FFI_LONG_LONG_MAX != 9223372036854775807 ++# error "no 64-bit data type supported" ++# endif ++#elif LONG_MAX != 9223372036854775807 ++#error "long size not supported" ++#endif ++ ++/* The closure code assumes that this works on pointers, i.e. a size_t ++ can hold a pointer. */ ++ ++typedef struct _ffi_type { ++ size_t size; ++ unsigned short alignment; ++ unsigned short type; ++/*@null@*/ struct _ffi_type** elements; ++} ffi_type; ++ ++/* These are defined in types.c */ ++extern ffi_type ffi_type_void; ++extern ffi_type ffi_type_uint8; ++extern ffi_type ffi_type_sint8; ++extern ffi_type ffi_type_uint16; ++extern ffi_type ffi_type_sint16; ++extern ffi_type ffi_type_uint32; ++extern ffi_type ffi_type_sint32; ++extern ffi_type ffi_type_uint64; ++extern ffi_type ffi_type_sint64; ++extern ffi_type ffi_type_float; ++extern ffi_type ffi_type_double; ++extern ffi_type ffi_type_longdouble; ++extern ffi_type ffi_type_pointer; ++ ++typedef enum ffi_status { ++ FFI_OK = 0, ++ FFI_BAD_TYPEDEF, ++ FFI_BAD_ABI ++} ffi_status; ++ ++typedef unsigned FFI_TYPE; ++ ++typedef struct ffi_cif { ++ ffi_abi abi; ++ unsigned nargs; ++/*@dependent@*/ ffi_type** arg_types; ++/*@dependent@*/ ffi_type* rtype; ++ unsigned bytes; ++ unsigned flags; ++#ifdef FFI_EXTRA_CIF_FIELDS ++ FFI_EXTRA_CIF_FIELDS; ++#endif ++} ffi_cif; ++ ++/* ---- Definitions for the raw API -------------------------------------- */ ++ ++#ifndef FFI_SIZEOF_ARG ++# if LONG_MAX == 2147483647 ++# define FFI_SIZEOF_ARG 4 ++# elif LONG_MAX == 9223372036854775807 ++# define FFI_SIZEOF_ARG 8 ++# endif ++#endif ++ ++typedef union { ++ ffi_sarg sint; ++ ffi_arg uint; ++ float flt; ++ char data[FFI_SIZEOF_ARG]; ++ void* ptr; ++} ffi_raw; ++ ++void ++ffi_raw_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ ffi_raw* avalue); ++ ++void ++ffi_ptrarray_to_raw( ++ ffi_cif* cif, ++ void** args, ++ ffi_raw* raw); ++ ++void ++ffi_raw_to_ptrarray( ++ ffi_cif* cif, ++ ffi_raw* raw, ++ void** args); ++ ++size_t ++ffi_raw_size( ++ ffi_cif* cif); ++ ++/* This is analogous to the raw API, except it uses Java parameter ++ packing, even on 64-bit machines. I.e. on 64-bit machines ++ longs and doubles are followed by an empty 64-bit word. */ ++void ++ffi_java_raw_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ ffi_raw* avalue); ++ ++void ++ffi_java_ptrarray_to_raw( ++ ffi_cif* cif, ++ void** args, ++ ffi_raw* raw); ++ ++void ++ffi_java_raw_to_ptrarray( ++ ffi_cif* cif, ++ ffi_raw* raw, ++ void** args); ++ ++size_t ++ffi_java_raw_size( ++ ffi_cif* cif); ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#if FFI_CLOSURES ++ ++typedef struct ffi_closure { ++ char tramp[FFI_TRAMPOLINE_SIZE]; ++ ffi_cif* cif; ++ void (*fun)(ffi_cif*,void*,void**,void*); ++ void* user_data; ++} ffi_closure; ++ ++ffi_status ++ffi_prep_closure( ++ ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,void**,void*), ++ void* user_data); ++ ++void ffi_closure_free(void *); ++void *ffi_closure_alloc (size_t size, void **code); ++ ++typedef struct ffi_raw_closure { ++ char tramp[FFI_TRAMPOLINE_SIZE]; ++ ffi_cif* cif; ++ ++#if !FFI_NATIVE_RAW_API ++ /* if this is enabled, then a raw closure has the same layout ++ as a regular closure. We use this to install an intermediate ++ handler to do the transaltion, void** -> ffi_raw*. */ ++ void (*translate_args)(ffi_cif*,void*,void**,void*); ++ void* this_closure; ++#endif ++ ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*); ++ void* user_data; ++} ffi_raw_closure; ++ ++ffi_status ++ffi_prep_raw_closure( ++ ffi_raw_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), ++ void* user_data); ++ ++ffi_status ++ffi_prep_java_raw_closure( ++ ffi_raw_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), ++ void* user_data); ++ ++#endif // FFI_CLOSURES ++ ++/* ---- Public interface definition -------------------------------------- */ ++ ++ffi_status ++ffi_prep_cif( ++/*@out@*/ /*@partial@*/ ffi_cif* cif, ++ ffi_abi abi, ++ unsigned int nargs, ++/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, ++/*@dependent@*/ ffi_type** atypes); ++ ++void ++ffi_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ void** avalue); ++ ++/* Useful for eliminating compiler warnings */ ++#define FFI_FN(f) ((void (*)(void))f) ++ ++#endif // #ifndef LIBFFI_ASM ++/* ---- Definitions shared with assembly code ---------------------------- */ ++ ++/* If these change, update src/mips/ffitarget.h. */ ++#define FFI_TYPE_VOID 0 ++#define FFI_TYPE_INT 1 ++#define FFI_TYPE_FLOAT 2 ++#define FFI_TYPE_DOUBLE 3 ++ ++#ifdef HAVE_LONG_DOUBLE ++# define FFI_TYPE_LONGDOUBLE 4 ++#else ++# define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE ++#endif ++ ++#define FFI_TYPE_UINT8 5 ++#define FFI_TYPE_SINT8 6 ++#define FFI_TYPE_UINT16 7 ++#define FFI_TYPE_SINT16 8 ++#define FFI_TYPE_UINT32 9 ++#define FFI_TYPE_SINT32 10 ++#define FFI_TYPE_UINT64 11 ++#define FFI_TYPE_SINT64 12 ++#define FFI_TYPE_STRUCT 13 ++#define FFI_TYPE_POINTER 14 ++ ++/* This should always refer to the last type code (for sanity checks) */ ++#define FFI_TYPE_LAST FFI_TYPE_POINTER ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif // #ifndef LIBFFI_H +diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi_common.h ./Modules/_ctypes/libffi_osx/include/ffi_common.h +new file mode 100644 +index 0000000..685a358 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ffi_common.h +@@ -0,0 +1,102 @@ ++/* ----------------------------------------------------------------------- ++ ffi_common.h - Copyright (c) 1996 Red Hat, Inc. ++ ++ Common internal definitions and macros. Only necessary for building ++ libffi. ++ ----------------------------------------------------------------------- */ ++ ++#ifndef FFI_COMMON_H ++#define FFI_COMMON_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include "fficonfig.h" ++ ++/* Do not move this. Some versions of AIX are very picky about where ++ this is positioned. */ ++#ifdef __GNUC__ ++# define alloca __builtin_alloca ++#else ++# if HAVE_ALLOCA_H ++# include ++# else ++# ifdef _AIX ++# pragma alloca ++# else ++# ifndef alloca /* predefined by HP cc +Olibcalls */ ++char* alloca(); ++# endif ++# endif ++# endif ++#endif ++ ++/* Check for the existence of memcpy. */ ++#if STDC_HEADERS ++# include ++#else ++# ifndef HAVE_MEMCPY ++# define memcpy(d, s, n) bcopy((s), (d), (n)) ++# endif ++#endif ++ ++/*#if defined(FFI_DEBUG) ++#include ++#endif*/ ++ ++#ifdef FFI_DEBUG ++#include ++ ++/*@exits@*/ void ++ffi_assert( ++/*@temp@*/ char* expr, ++/*@temp@*/ char* file, ++ int line); ++void ++ffi_stop_here(void); ++void ++ffi_type_test( ++/*@temp@*/ /*@out@*/ ffi_type* a, ++/*@temp@*/ char* file, ++ int line); ++ ++# define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) ++# define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) ++# define FFI_ASSERT_VALID_TYPE(x) ffi_type_test(x, __FILE__, __LINE__) ++#else ++# define FFI_ASSERT(x) ++# define FFI_ASSERT_AT(x, f, l) ++# define FFI_ASSERT_VALID_TYPE(x) ++#endif // #ifdef FFI_DEBUG ++ ++#define ALIGN(v, a) (((size_t)(v) + (a) - 1) & ~((a) - 1)) ++ ++/* Perform machine dependent cif processing */ ++ffi_status ++ffi_prep_cif_machdep( ++ ffi_cif* cif); ++ ++/* Extended cif, used in callback from assembly routine */ ++typedef struct extended_cif { ++/*@dependent@*/ ffi_cif* cif; ++/*@dependent@*/ void* rvalue; ++/*@dependent@*/ void** avalue; ++} extended_cif; ++ ++/* Terse sized type definitions. */ ++typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); ++typedef signed int SINT8 __attribute__((__mode__(__QI__))); ++typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); ++typedef signed int SINT16 __attribute__((__mode__(__HI__))); ++typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); ++typedef signed int SINT32 __attribute__((__mode__(__SI__))); ++typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); ++typedef signed int SINT64 __attribute__((__mode__(__DI__))); ++typedef float FLOAT32; ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif // #ifndef FFI_COMMON_H +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/fficonfig.h ./Modules/_ctypes/libffi_osx/include/fficonfig.h +new file mode 100644 +index 0000000..2172490 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/fficonfig.h +@@ -0,0 +1,150 @@ ++/* Manually created fficonfig.h for Darwin on PowerPC or Intel ++ ++ This file is manually generated to do away with the need for autoconf and ++ therefore make it easier to cross-compile and build fat binaries. ++ ++ NOTE: This file was added by PyObjC. ++*/ ++ ++#ifndef MACOSX ++#error "This file is only supported on Mac OS X" ++#endif ++ ++#if defined(__i386__) ++# define BYTEORDER 1234 ++# undef HOST_WORDS_BIG_ENDIAN ++# undef WORDS_BIGENDIAN ++# define SIZEOF_DOUBLE 8 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++ ++#elif defined(__x86_64__) ++# define BYTEORDER 1234 ++# undef HOST_WORDS_BIG_ENDIAN ++# undef WORDS_BIGENDIAN ++# define SIZEOF_DOUBLE 8 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++ ++#elif defined(__ppc__) ++# define BYTEORDER 4321 ++# define HOST_WORDS_BIG_ENDIAN 1 ++# define WORDS_BIGENDIAN 1 ++# define SIZEOF_DOUBLE 8 ++# if __GNUC__ >= 4 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++# else ++# undef HAVE_LONG_DOUBLE ++# define SIZEOF_LONG_DOUBLE 8 ++# endif ++ ++#elif defined(__ppc64__) ++# define BYTEORDER 4321 ++# define HOST_WORDS_BIG_ENDIAN 1 ++# define WORDS_BIGENDIAN 1 ++# define SIZEOF_DOUBLE 8 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++ ++#else ++#error "Unknown CPU type" ++#endif ++ ++/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP ++ systems. This function is required for `alloca.c' support on those systems. */ ++#undef CRAY_STACKSEG_END ++ ++/* Define to 1 if using `alloca.c'. */ ++/* #undef C_ALLOCA */ ++ ++/* Define to the flags needed for the .section .eh_frame directive. */ ++#define EH_FRAME_FLAGS "aw" ++ ++/* Define this if you want extra debugging. */ ++/* #undef FFI_DEBUG */ ++ ++/* Define this is you do not want support for the raw API. */ ++#define FFI_NO_RAW_API 1 ++ ++/* Define this if you do not want support for aggregate types. */ ++/* #undef FFI_NO_STRUCTS */ ++ ++/* Define to 1 if you have `alloca', as a function or macro. */ ++#define HAVE_ALLOCA 1 ++ ++/* Define to 1 if you have and it should be used (not on Ultrix). */ ++#define HAVE_ALLOCA_H 1 ++ ++/* Define if your assembler supports .register. */ ++/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ ++ ++/* Define if your assembler and linker support unaligned PC relative relocs. */ ++/* #undef HAVE_AS_SPARC_UA_PCREL */ ++ ++/* Define to 1 if you have the `memcpy' function. */ ++#define HAVE_MEMCPY 1 ++ ++/* Define if mmap with MAP_ANON(YMOUS) works. */ ++#define HAVE_MMAP_ANON 1 ++ ++/* Define if mmap of /dev/zero works. */ ++/* #undef HAVE_MMAP_DEV_ZERO */ ++ ++/* Define if read-only mmap of a plain file works. */ ++#define HAVE_MMAP_FILE 1 ++ ++/* Define if .eh_frame sections should be read-only. */ ++/* #undef HAVE_RO_EH_FRAME */ ++ ++/* Define to 1 if your C compiler doesn't accept -c and -o together. */ ++/* #undef NO_MINUS_C_MINUS_O */ ++ ++/* Name of package */ ++#define PACKAGE "libffi" ++ ++/* Define to the address where bug reports for this package should be sent. */ ++#define PACKAGE_BUGREPORT "http://gcc.gnu.org/bugs.html" ++ ++/* Define to the full name of this package. */ ++#define PACKAGE_NAME "libffi" ++ ++/* Define to the full name and version of this package. */ ++#define PACKAGE_STRING "libffi 2.1" ++ ++/* Define to the one symbol short name of this package. */ ++#define PACKAGE_TARNAME "libffi" ++ ++/* Define to the version of this package. */ ++#define PACKAGE_VERSION "2.1" ++ ++/* If using the C implementation of alloca, define if you know the ++ direction of stack growth for your system; otherwise it will be ++ automatically deduced at run-time. ++ STACK_DIRECTION > 0 => grows toward higher addresses ++ STACK_DIRECTION < 0 => grows toward lower addresses ++ STACK_DIRECTION = 0 => direction of growth unknown */ ++/* #undef STACK_DIRECTION */ ++ ++/* Define to 1 if you have the ANSI C header files. */ ++#define STDC_HEADERS 1 ++ ++/* Define this if you are using Purify and want to suppress spurious messages. */ ++/* #undef USING_PURIFY */ ++ ++/* Version number of package */ ++#define VERSION "2.1-pyobjc" ++ ++#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE ++# ifdef LIBFFI_ASM ++# define FFI_HIDDEN(name) .hidden name ++# else ++# define FFI_HIDDEN __attribute__((visibility ("hidden"))) ++# endif ++#else ++# ifdef LIBFFI_ASM ++# define FFI_HIDDEN(name) ++# else ++# define FFI_HIDDEN ++# endif ++#endif +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/ffitarget.h ./Modules/_ctypes/libffi_osx/include/ffitarget.h +new file mode 100644 +index 0000000..faaa30d +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ffitarget.h +@@ -0,0 +1,13 @@ ++/* Dispatch to the right ffitarget file. This file is PyObjC specific; in a ++ normal build, the build environment copies the file to the right location or ++ sets up the right include flags. We want to do neither because that would ++ make building fat binaries harder. ++*/ ++ ++#if defined(__i386__) || defined(__x86_64__) ++#include "x86-ffitarget.h" ++#elif defined(__ppc__) || defined(__ppc64__) ++#include "ppc-ffitarget.h" ++#else ++#error "Unsupported CPU type" ++#endif +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h +new file mode 100644 +index 0000000..2318421 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h +@@ -0,0 +1,104 @@ ++/* -----------------------------------------------------------------*-C-*- ++ ppc-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ Target configuration macros for PowerPC. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++/* ---- System specific configurations ----------------------------------- */ ++ ++#if (defined(POWERPC) && defined(__powerpc64__)) || \ ++ (defined(POWERPC_DARWIN) && defined(__ppc64__)) ++#define POWERPC64 ++#endif ++ ++#ifndef LIBFFI_ASM ++ ++typedef unsigned long ffi_arg; ++typedef signed long ffi_sarg; ++ ++typedef enum ffi_abi { ++ FFI_FIRST_ABI = 0, ++ ++#ifdef POWERPC ++ FFI_SYSV, ++ FFI_GCC_SYSV, ++ FFI_LINUX64, ++# ifdef POWERPC64 ++ FFI_DEFAULT_ABI = FFI_LINUX64, ++# else ++ FFI_DEFAULT_ABI = FFI_GCC_SYSV, ++# endif ++#endif ++ ++#ifdef POWERPC_AIX ++ FFI_AIX, ++ FFI_DARWIN, ++ FFI_DEFAULT_ABI = FFI_AIX, ++#endif ++ ++#ifdef POWERPC_DARWIN ++ FFI_AIX, ++ FFI_DARWIN, ++ FFI_DEFAULT_ABI = FFI_DARWIN, ++#endif ++ ++#ifdef POWERPC_FREEBSD ++ FFI_SYSV, ++ FFI_GCC_SYSV, ++ FFI_LINUX64, ++ FFI_DEFAULT_ABI = FFI_SYSV, ++#endif ++ ++ FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 ++} ffi_abi; ++ ++#endif // #ifndef LIBFFI_ASM ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#define FFI_CLOSURES 1 ++#define FFI_NATIVE_RAW_API 0 ++ ++/* Needed for FFI_SYSV small structure returns. */ ++#define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST) ++ ++#if defined(POWERPC64) /*|| defined(POWERPC_AIX)*/ ++# define FFI_TRAMPOLINE_SIZE 48 ++#elif defined(POWERPC_AIX) ++# define FFI_TRAMPOLINE_SIZE 24 ++#else ++# define FFI_TRAMPOLINE_SIZE 40 ++#endif ++ ++#ifndef LIBFFI_ASM ++# if defined(POWERPC_DARWIN) || defined(POWERPC_AIX) ++typedef struct ffi_aix_trampoline_struct { ++ void* code_pointer; /* Pointer to ffi_closure_ASM */ ++ void* toc; /* TOC */ ++ void* static_chain; /* Pointer to closure */ ++} ffi_aix_trampoline_struct; ++# endif ++#endif // #ifndef LIBFFI_ASM ++ ++#endif // #ifndef LIBFFI_TARGET_H +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h +new file mode 100644 +index 0000000..55c2b6c +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h +@@ -0,0 +1,88 @@ ++/* -----------------------------------------------------------------*-C-*- ++ x86-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ Target configuration macros for x86 and x86-64. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ++ ----------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++/* ---- System specific configurations ----------------------------------- */ ++ ++#if defined(X86_64) && defined(__i386__) ++# undef X86_64 ++# define X86 ++#endif ++ ++#if defined(__x86_64__) ++# ifndef X86_64 ++# define X86_64 ++# endif ++#endif ++ ++/* ---- Generic type definitions ----------------------------------------- */ ++ ++#ifndef LIBFFI_ASM ++ ++typedef unsigned long ffi_arg; ++typedef signed long ffi_sarg; ++ ++typedef enum ffi_abi { ++ FFI_FIRST_ABI = 0, ++ ++ /* ---- Intel x86 Win32 ---------- */ ++#ifdef X86_WIN32 ++ FFI_SYSV, ++ FFI_STDCALL, ++ /* TODO: Add fastcall support for the sake of completeness */ ++ FFI_DEFAULT_ABI = FFI_SYSV, ++#endif ++ ++ /* ---- Intel x86 and AMD x86-64 - */ ++#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__)) ++ FFI_SYSV, ++ FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ ++# ifdef __i386__ ++ FFI_DEFAULT_ABI = FFI_SYSV, ++# else ++ FFI_DEFAULT_ABI = FFI_UNIX64, ++# endif ++#endif ++ ++ FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 ++} ffi_abi; ++ ++#endif // #ifndef LIBFFI_ASM ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#define FFI_CLOSURES 1 ++ ++#if defined(X86_64) || (defined(__x86_64__) && defined(X86_DARWIN)) ++# define FFI_TRAMPOLINE_SIZE 24 ++# define FFI_NATIVE_RAW_API 0 ++#else ++# define FFI_TRAMPOLINE_SIZE 10 ++# define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ ++#endif ++ ++#endif // #ifndef LIBFFI_TARGET_H +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S +new file mode 100644 +index 0000000..f143dbd +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S +@@ -0,0 +1,365 @@ ++#if defined(__ppc__) || defined(__ppc64__) ++ ++/* ----------------------------------------------------------------------- ++ ppc-darwin.S - Copyright (c) 2000 John Hornkvist ++ Copyright (c) 2004 Free Software Foundation, Inc. ++ ++ PowerPC Assembly glue. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++ ++#include ++#include ++#include ++#include ++ ++.text ++ .align 2 ++.globl _ffi_prep_args ++ ++.text ++ .align 2 ++.globl _ffi_call_DARWIN ++ ++.text ++ .align 2 ++_ffi_call_DARWIN: ++LFB0: ++ mr r12,r8 /* We only need r12 until the call, ++ so it doesn't have to be saved. */ ++ ++LFB1: ++ /* Save the old stack pointer as AP. */ ++ mr r8,r1 ++ ++LCFI0: ++#if defined(__ppc64__) ++ /* Allocate the stack space we need. ++ r4 (size of input data) ++ 48 bytes (linkage area) ++ 40 bytes (saved registers) ++ 8 bytes (extra FPR) ++ r4 + 96 bytes total ++ */ ++ ++ addi r4,r4,-96 // Add our overhead. ++ li r0,-32 // Align to 32 bytes. ++ and r4,r4,r0 ++#endif ++ stgux r1,r1,r4 // Grow the stack. ++ mflr r9 ++ ++ /* Save registers we use. */ ++#if defined(__ppc64__) ++ std r27,-40(r8) ++#endif ++ stg r28,MODE_CHOICE(-16,-32)(r8) ++ stg r29,MODE_CHOICE(-12,-24)(r8) ++ stg r30,MODE_CHOICE(-8,-16)(r8) ++ stg r31,MODE_CHOICE(-4,-8)(r8) ++ stg r9,SF_RETURN(r8) /* return address */ ++#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ ++ stg r2,MODE_CHOICE(20,40)(r1) ++#endif ++ ++LCFI1: ++#if defined(__ppc64__) ++ mr r27,r3 // our extended_cif ++#endif ++ /* Save arguments over call. */ ++ mr r31,r5 /* flags, */ ++ mr r30,r6 /* rvalue, */ ++ mr r29,r7 /* function address, */ ++ mr r28,r8 /* our AP. */ ++ ++LCFI2: ++ /* Call ffi_prep_args. */ ++ mr r4,r1 ++ li r9,0 ++ mtctr r12 /* r12 holds address of _ffi_prep_args. */ ++ bctrl ++#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ ++ lg r2,MODE_CHOICE(20,40)(r1) ++#endif ++ ++ /* Now do the call. ++ Set up cr1 with bits 4-7 of the flags. */ ++ mtcrf 0x40,r31 ++ ++ /* Load all those argument registers. ++ We have set up a nice stack frame, just load it into registers. */ ++ lg r3,SF_ARG1(r1) ++ lg r4,SF_ARG2(r1) ++ lg r5,SF_ARG3(r1) ++ lg r6,SF_ARG4(r1) ++ nop ++ lg r7,SF_ARG5(r1) ++ lg r8,SF_ARG6(r1) ++ lg r9,SF_ARG7(r1) ++ lg r10,SF_ARG8(r1) ++ ++ /* Load all the FP registers. */ ++ bf 6,L2 /* No floats to load. */ ++#if defined(__ppc64__) ++ lfd f1,MODE_CHOICE(-16,-40)-(14*8)(r28) ++ lfd f2,MODE_CHOICE(-16,-40)-(13*8)(r28) ++ lfd f3,MODE_CHOICE(-16,-40)-(12*8)(r28) ++ lfd f4,MODE_CHOICE(-16,-40)-(11*8)(r28) ++ nop ++ lfd f5,MODE_CHOICE(-16,-40)-(10*8)(r28) ++ lfd f6,MODE_CHOICE(-16,-40)-(9*8)(r28) ++ lfd f7,MODE_CHOICE(-16,-40)-(8*8)(r28) ++ lfd f8,MODE_CHOICE(-16,-40)-(7*8)(r28) ++ nop ++ lfd f9,MODE_CHOICE(-16,-40)-(6*8)(r28) ++ lfd f10,MODE_CHOICE(-16,-40)-(5*8)(r28) ++ lfd f11,MODE_CHOICE(-16,-40)-(4*8)(r28) ++ lfd f12,MODE_CHOICE(-16,-40)-(3*8)(r28) ++ nop ++ lfd f13,MODE_CHOICE(-16,-40)-(2*8)(r28) ++ lfd f14,MODE_CHOICE(-16,-40)-(1*8)(r28) ++#elif defined(__ppc__) ++ lfd f1,MODE_CHOICE(-16,-40)-(13*8)(r28) ++ lfd f2,MODE_CHOICE(-16,-40)-(12*8)(r28) ++ lfd f3,MODE_CHOICE(-16,-40)-(11*8)(r28) ++ lfd f4,MODE_CHOICE(-16,-40)-(10*8)(r28) ++ nop ++ lfd f5,MODE_CHOICE(-16,-40)-(9*8)(r28) ++ lfd f6,MODE_CHOICE(-16,-40)-(8*8)(r28) ++ lfd f7,MODE_CHOICE(-16,-40)-(7*8)(r28) ++ lfd f8,MODE_CHOICE(-16,-40)-(6*8)(r28) ++ nop ++ lfd f9,MODE_CHOICE(-16,-40)-(5*8)(r28) ++ lfd f10,MODE_CHOICE(-16,-40)-(4*8)(r28) ++ lfd f11,MODE_CHOICE(-16,-40)-(3*8)(r28) ++ lfd f12,MODE_CHOICE(-16,-40)-(2*8)(r28) ++ nop ++ lfd f13,MODE_CHOICE(-16,-40)-(1*8)(r28) ++#else ++#error undefined architecture ++#endif ++ ++L2: ++ mr r12,r29 // Put the target address in r12 as specified. ++ mtctr r12 // Get the address to call into CTR. ++ nop ++ nop ++ bctrl // Make the call. ++ ++ // Deal with the return value. ++#if defined(__ppc64__) ++ mtcrf 0x3,r31 // flags in cr6 and cr7 ++ bt 27,L(st_return_value) ++#elif defined(__ppc__) ++ mtcrf 0x1,r31 // flags in cr7 ++#else ++#error undefined architecture ++#endif ++ ++ bt 30,L(done_return_value) ++ bt 29,L(fp_return_value) ++ stg r3,0(r30) ++#if defined(__ppc__) ++ bf 28,L(done_return_value) // Store the second long if necessary. ++ stg r4,4(r30) ++#endif ++ // Fall through ++ ++L(done_return_value): ++ lg r1,0(r1) // Restore stack pointer. ++ // Restore the registers we used. ++ lg r9,SF_RETURN(r1) // return address ++ lg r31,MODE_CHOICE(-4,-8)(r1) ++ mtlr r9 ++ lg r30,MODE_CHOICE(-8,-16)(r1) ++ lg r29,MODE_CHOICE(-12,-24)(r1) ++ lg r28,MODE_CHOICE(-16,-32)(r1) ++#if defined(__ppc64__) ++ ld r27,-40(r1) ++#endif ++ blr ++ ++#if defined(__ppc64__) ++L(st_return_value): ++ // Grow the stack enough to fit the registers. Leave room for 8 args ++ // to trample the 1st 8 slots in param area. ++ stgu r1,-SF_ROUND(280)(r1) // 64 + 104 + 48 + 64 ++ ++ // Store GPRs ++ std r3,SF_ARG9(r1) ++ std r4,SF_ARG10(r1) ++ std r5,SF_ARG11(r1) ++ std r6,SF_ARG12(r1) ++ nop ++ std r7,SF_ARG13(r1) ++ std r8,SF_ARG14(r1) ++ std r9,SF_ARG15(r1) ++ std r10,SF_ARG16(r1) ++ ++ // Store FPRs ++ nop ++ bf 26,L(call_struct_to_ram_form) ++ stfd f1,SF_ARG17(r1) ++ stfd f2,SF_ARG18(r1) ++ stfd f3,SF_ARG19(r1) ++ stfd f4,SF_ARG20(r1) ++ nop ++ stfd f5,SF_ARG21(r1) ++ stfd f6,SF_ARG22(r1) ++ stfd f7,SF_ARG23(r1) ++ stfd f8,SF_ARG24(r1) ++ nop ++ stfd f9,SF_ARG25(r1) ++ stfd f10,SF_ARG26(r1) ++ stfd f11,SF_ARG27(r1) ++ stfd f12,SF_ARG28(r1) ++ nop ++ stfd f13,SF_ARG29(r1) ++ ++L(call_struct_to_ram_form): ++ ld r3,0(r27) // extended_cif->cif* ++ ld r3,16(r3) // ffi_cif->rtype* ++ addi r4,r1,SF_ARG9 // stored GPRs ++ addi r6,r1,SF_ARG17 // stored FPRs ++ li r5,0 // GPR size ptr (NULL) ++ li r7,0 // FPR size ptr (NULL) ++ li r8,0 // FPR count ptr (NULL) ++ li r10,0 // struct offset (NULL) ++ mr r9,r30 // return area ++ bl Lffi64_struct_to_ram_form$stub ++ lg r1,0(r1) // Restore stack pointer. ++ b L(done_return_value) ++#endif ++ ++L(fp_return_value): ++ /* Do we have long double to store? */ ++ bf 31,L(fd_return_value) ++ stfd f1,0(r30) ++ stfd f2,8(r30) ++ b L(done_return_value) ++ ++L(fd_return_value): ++ /* Do we have double to store? */ ++ bf 28,L(float_return_value) ++ stfd f1,0(r30) ++ b L(done_return_value) ++ ++L(float_return_value): ++ /* We only have a float to store. */ ++ stfs f1,0(r30) ++ b L(done_return_value) ++ ++LFE1: ++/* END(_ffi_call_DARWIN) */ ++ ++/* Provide a null definition of _ffi_call_AIX. */ ++.text ++ .align 2 ++.globl _ffi_call_AIX ++.text ++ .align 2 ++_ffi_call_AIX: ++ blr ++/* END(_ffi_call_AIX) */ ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ; Length of Common Information Entry ++LSCIE1: ++ .long 0x0 ; CIE Identifier Tag ++ .byte 0x1 ; CIE Version ++ .ascii "zR\0" ; CIE Augmentation ++ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor ++ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte 0x41 ; CIE RA Column ++ .byte 0x1 ; uleb128 0x1; Augmentation size ++ .byte 0x10 ; FDE Encoding (pcrel) ++ .byte 0xc ; DW_CFA_def_cfa ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x0 ; uleb128 0x0 ++ .align LOG2_GPR_BYTES ++LECIE1: ++.globl _ffi_call_DARWIN.eh ++_ffi_call_DARWIN.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ; FDE Length ++ ++LASFDE1: ++ .long LASFDE1-EH_frame1 ; FDE CIE offset ++ .g_long LFB0-. ; FDE initial location ++ .set L$set$3,LFE1-LFB0 ++ .g_long L$set$3 ; FDE address range ++ .byte 0x0 ; uleb128 0x0; Augmentation size ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$4,LCFI0-LFB1 ++ .long L$set$4 ++ .byte 0xd ; DW_CFA_def_cfa_register ++ .byte 0x08 ; uleb128 0x08 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$5,LCFI1-LCFI0 ++ .long L$set$5 ++ .byte 0x11 ; DW_CFA_offset_extended_sf ++ .byte 0x41 ; uleb128 0x41 ++ .byte 0x7e ; sleb128 -2 ++ .byte 0x9f ; DW_CFA_offset, column 0x1f ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x9e ; DW_CFA_offset, column 0x1e ++ .byte 0x2 ; uleb128 0x2 ++ .byte 0x9d ; DW_CFA_offset, column 0x1d ++ .byte 0x3 ; uleb128 0x3 ++ .byte 0x9c ; DW_CFA_offset, column 0x1c ++ .byte 0x4 ; uleb128 0x4 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$6,LCFI2-LCFI1 ++ .long L$set$6 ++ .byte 0xd ; DW_CFA_def_cfa_register ++ .byte 0x1c ; uleb128 0x1c ++ .align LOG2_GPR_BYTES ++LEFDE1: ++ ++#if defined(__ppc64__) ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi64_struct_to_ram_form$stub: ++ .indirect_symbol _ffi64_struct_to_ram_form ++ mflr r0 ++ bcl 20,31,LO$ffi64_struct_to_ram_form ++ ++LO$ffi64_struct_to_ram_form: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form) ++ mtlr r0 ++ lgu r12,lo16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi64_struct_to_ram_form$lazy_ptr: ++ .indirect_symbol _ffi64_struct_to_ram_form ++ .g_long dyld_stub_binding_helper ++ ++#endif // __ppc64__ ++#endif // __ppc__ || __ppc64__ +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h +new file mode 100644 +index 0000000..cf4bd50 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h +@@ -0,0 +1,85 @@ ++/* ----------------------------------------------------------------------- ++ ppc-darwin.h - Copyright (c) 2002, 2003, 2004, Free Software Foundation, ++ Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define L(x) x ++ ++#define SF_ARG9 MODE_CHOICE(56,112) ++#define SF_ARG10 MODE_CHOICE(60,120) ++#define SF_ARG11 MODE_CHOICE(64,128) ++#define SF_ARG12 MODE_CHOICE(68,136) ++#define SF_ARG13 MODE_CHOICE(72,144) ++#define SF_ARG14 MODE_CHOICE(76,152) ++#define SF_ARG15 MODE_CHOICE(80,160) ++#define SF_ARG16 MODE_CHOICE(84,168) ++#define SF_ARG17 MODE_CHOICE(88,176) ++#define SF_ARG18 MODE_CHOICE(92,184) ++#define SF_ARG19 MODE_CHOICE(96,192) ++#define SF_ARG20 MODE_CHOICE(100,200) ++#define SF_ARG21 MODE_CHOICE(104,208) ++#define SF_ARG22 MODE_CHOICE(108,216) ++#define SF_ARG23 MODE_CHOICE(112,224) ++#define SF_ARG24 MODE_CHOICE(116,232) ++#define SF_ARG25 MODE_CHOICE(120,240) ++#define SF_ARG26 MODE_CHOICE(124,248) ++#define SF_ARG27 MODE_CHOICE(128,256) ++#define SF_ARG28 MODE_CHOICE(132,264) ++#define SF_ARG29 MODE_CHOICE(136,272) ++ ++#define ASM_NEEDS_REGISTERS 4 ++#define NUM_GPR_ARG_REGISTERS 8 ++#define NUM_FPR_ARG_REGISTERS 13 ++ ++#define FFI_TYPE_1_BYTE(x) ((x) == FFI_TYPE_UINT8 || (x) == FFI_TYPE_SINT8) ++#define FFI_TYPE_2_BYTE(x) ((x) == FFI_TYPE_UINT16 || (x) == FFI_TYPE_SINT16) ++#define FFI_TYPE_4_BYTE(x) \ ++ ((x) == FFI_TYPE_UINT32 || (x) == FFI_TYPE_SINT32 ||\ ++ (x) == FFI_TYPE_INT || (x) == FFI_TYPE_FLOAT) ++ ++#if !defined(LIBFFI_ASM) ++ ++enum { ++ FLAG_RETURNS_NOTHING = 1 << (31 - 30), // cr7 ++ FLAG_RETURNS_FP = 1 << (31 - 29), ++ FLAG_RETURNS_64BITS = 1 << (31 - 28), ++ FLAG_RETURNS_128BITS = 1 << (31 - 31), ++ ++ FLAG_RETURNS_STRUCT = 1 << (31 - 27), // cr6 ++ FLAG_STRUCT_CONTAINS_FP = 1 << (31 - 26), ++ ++ FLAG_ARG_NEEDS_COPY = 1 << (31 - 7), ++ FLAG_FP_ARGUMENTS = 1 << (31 - 6), // cr1.eq; specified by ABI ++ FLAG_4_GPR_ARGUMENTS = 1 << (31 - 5), ++ FLAG_RETVAL_REFERENCE = 1 << (31 - 4) ++}; ++ ++#if defined(__ppc64__) ++void ffi64_struct_to_ram_form(const ffi_type*, const char*, unsigned int*, ++ const char*, unsigned int*, unsigned int*, char*, unsigned int*); ++void ffi64_struct_to_reg_form(const ffi_type*, const char*, unsigned int*, ++ unsigned int*, char*, unsigned int*, char*, unsigned int*); ++bool ffi64_stret_needs_ptr(const ffi_type* inType, ++ unsigned short*, unsigned short*); ++#endif ++ ++#endif // !defined(LIBFFI_ASM) +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S +new file mode 100644 +index 0000000..c3d30c2 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S +@@ -0,0 +1,308 @@ ++#if defined(__ppc__) ++ ++/* ----------------------------------------------------------------------- ++ ppc-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, ++ Inc. based on ppc_closure.S ++ ++ PowerPC Assembly glue. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++ ++#include ++#include // for FFI_TRAMPOLINE_SIZE ++#include ++#include ++ ++ .file "ppc-darwin_closure.S" ++.text ++ .align LOG2_GPR_BYTES ++ .globl _ffi_closure_ASM ++ ++.text ++ .align LOG2_GPR_BYTES ++ ++_ffi_closure_ASM: ++LFB1: ++ mflr r0 // Save return address ++ stg r0,SF_RETURN(r1) ++ ++LCFI0: ++ /* 24/48 bytes (Linkage Area) ++ 32/64 bytes (outgoing parameter area, always reserved) ++ 104 bytes (13*8 from FPR) ++ 16/32 bytes (result) ++ 176/232 total bytes */ ++ ++ /* skip over caller save area and keep stack aligned to 16/32. */ ++ stgu r1,-SF_ROUND(176)(r1) ++ ++LCFI1: ++ /* We want to build up an area for the parameters passed ++ in registers. (both floating point and integer) */ ++ ++ /* 176/256 bytes (callee stack frame aligned to 16/32) ++ 24/48 bytes (caller linkage area) ++ 200/304 (start of caller parameter area aligned to 4/8) ++ */ ++ ++ /* Save GPRs 3 - 10 (aligned to 4/8) ++ in the parents outgoing area. */ ++ stg r3,200(r1) ++ stg r4,204(r1) ++ stg r5,208(r1) ++ stg r6,212(r1) ++ stg r7,216(r1) ++ stg r8,220(r1) ++ stg r9,224(r1) ++ stg r10,228(r1) ++ ++ /* Save FPRs 1 - 13. (aligned to 8) */ ++ stfd f1,56(r1) ++ stfd f2,64(r1) ++ stfd f3,72(r1) ++ stfd f4,80(r1) ++ stfd f5,88(r1) ++ stfd f6,96(r1) ++ stfd f7,104(r1) ++ stfd f8,112(r1) ++ stfd f9,120(r1) ++ stfd f10,128(r1) ++ stfd f11,136(r1) ++ stfd f12,144(r1) ++ stfd f13,152(r1) ++ ++ // Set up registers for the routine that actually does the work. ++ mr r3,r11 // context pointer from the trampoline ++ addi r4,r1,160 // result storage ++ addi r5,r1,200 // saved GPRs ++ addi r6,r1,56 // saved FPRs ++ bl Lffi_closure_helper_DARWIN$stub ++ ++ /* Now r3 contains the return type. Use it to look up in a table ++ so we know how to deal with each type. */ ++ addi r5,r1,160 // Copy result storage pointer. ++ bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. ++ mflr r4 // Move to r4. ++ slwi r3,r3,4 // Multiply return type by 16. ++ add r3,r3,r4 // Add contents of table to table address. ++ mtctr r3 ++ bctr ++ ++LFE1: ++/* Each of the ret_typeX code fragments has to be exactly 16 bytes long ++ (4 instructions). For cache effectiveness we align to a 16 byte boundary ++ first. */ ++ .align 4 ++ nop ++ nop ++ nop ++ ++Lget_ret_type0_addr: ++ blrl ++ ++/* case FFI_TYPE_VOID */ ++Lret_type0: ++ b Lfinish ++ nop ++ nop ++ nop ++ ++/* case FFI_TYPE_INT */ ++Lret_type1: ++ lwz r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_FLOAT */ ++Lret_type2: ++ lfs f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_DOUBLE */ ++Lret_type3: ++ lfd f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_LONGDOUBLE */ ++Lret_type4: ++ lfd f1,0(r5) ++ lfd f2,8(r5) ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_UINT8 */ ++Lret_type5: ++ lbz r3,3(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_SINT8 */ ++Lret_type6: ++ lbz r3,3(r5) ++ extsb r3,r3 ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_UINT16 */ ++Lret_type7: ++ lhz r3,2(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_SINT16 */ ++Lret_type8: ++ lha r3,2(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_UINT32 */ ++Lret_type9: // same as Lret_type1 ++ lwz r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_SINT32 */ ++Lret_type10: // same as Lret_type1 ++ lwz r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_UINT64 */ ++Lret_type11: ++ lwz r3,0(r5) ++ lwz r4,4(r5) ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_SINT64 */ ++Lret_type12: // same as Lret_type11 ++ lwz r3,0(r5) ++ lwz r4,4(r5) ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_STRUCT */ ++Lret_type13: ++ b Lfinish ++ nop ++ nop ++ nop ++ ++/* End 16-byte aligned cases */ ++/* case FFI_TYPE_POINTER */ ++// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types ++// are added in future, the following code will need to be updated and ++// padded to 16 bytes. ++Lret_type14: ++ lg r3,0(r5) ++ // fall through ++ ++/* case done */ ++Lfinish: ++ addi r1,r1,SF_ROUND(176) // Restore stack pointer. ++ lg r0,SF_RETURN(r1) // Restore return address. ++ mtlr r0 // Restore link register. ++ blr ++ ++/* END(ffi_closure_ASM) */ ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ; Length of Common Information Entry ++LSCIE1: ++ .long 0x0 ; CIE Identifier Tag ++ .byte 0x1 ; CIE Version ++ .ascii "zR\0" ; CIE Augmentation ++ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor ++ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte 0x41 ; CIE RA Column ++ .byte 0x1 ; uleb128 0x1; Augmentation size ++ .byte 0x10 ; FDE Encoding (pcrel) ++ .byte 0xc ; DW_CFA_def_cfa ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x0 ; uleb128 0x0 ++ .align LOG2_GPR_BYTES ++LECIE1: ++.globl _ffi_closure_ASM.eh ++_ffi_closure_ASM.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ; FDE Length ++ ++LASFDE1: ++ .long LASFDE1-EH_frame1 ; FDE CIE offset ++ .g_long LFB1-. ; FDE initial location ++ .set L$set$3,LFE1-LFB1 ++ .g_long L$set$3 ; FDE address range ++ .byte 0x0 ; uleb128 0x0; Augmentation size ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$3,LCFI1-LCFI0 ++ .long L$set$3 ++ .byte 0xe ; DW_CFA_def_cfa_offset ++ .byte 176,1 ; uleb128 176 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$4,LCFI0-LFB1 ++ .long L$set$4 ++ .byte 0x11 ; DW_CFA_offset_extended_sf ++ .byte 0x41 ; uleb128 0x41 ++ .byte 0x7e ; sleb128 -2 ++ .align LOG2_GPR_BYTES ++ ++LEFDE1: ++.data ++ .align LOG2_GPR_BYTES ++LDFCM0: ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi_closure_helper_DARWIN$stub: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ mflr r0 ++ bcl 20,31,LO$ffi_closure_helper_DARWIN ++ ++LO$ffi_closure_helper_DARWIN: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) ++ mtlr r0 ++ lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi_closure_helper_DARWIN$lazy_ptr: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ .g_long dyld_stub_binding_helper ++ ++ ++#endif // __ppc__ +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c +new file mode 100644 +index 0000000..8953d5f +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c +@@ -0,0 +1,1776 @@ ++#if defined(__ppc__) || defined(__ppc64__) ++ ++/* ----------------------------------------------------------------------- ++ ffi.c - Copyright (c) 1998 Geoffrey Keating ++ ++ PowerPC Foreign Function Interface ++ ++ Darwin ABI support (c) 2001 John Hornkvist ++ AIX ABI support (c) 2002 Free Software Foundation, Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#if 0 ++#if defined(POWERPC_DARWIN) ++#include // for sys_icache_invalidate() ++#endif ++ ++#else ++ ++#pragma weak sys_icache_invalidate ++extern void sys_icache_invalidate(void *start, size_t len); ++ ++#endif ++ ++ ++extern void ffi_closure_ASM(void); ++ ++// The layout of a function descriptor. A C function pointer really ++// points to one of these. ++typedef struct aix_fd_struct { ++ void* code_pointer; ++ void* toc; ++} aix_fd; ++ ++/* ffi_prep_args is called by the assembly routine once stack space ++ has been allocated for the function's arguments. ++ ++ The stack layout we want looks like this: ++ ++ | Return address from ffi_call_DARWIN | higher addresses ++ |--------------------------------------------| ++ | Previous backchain pointer 4/8 | stack pointer here ++ |--------------------------------------------|-\ <<< on entry to ++ | Saved r28-r31 (4/8)*4 | | ffi_call_DARWIN ++ |--------------------------------------------| | ++ | Parameters (at least 8*(4/8)=32/64) | | (176) +112 - +288 ++ |--------------------------------------------| | ++ | Space for GPR2 4/8 | | ++ |--------------------------------------------| | stack | ++ | Reserved (4/8)*2 | | grows | ++ |--------------------------------------------| | down V ++ | Space for callee's LR 4/8 | | ++ |--------------------------------------------| | lower addresses ++ | Saved CR 4/8 | | ++ |--------------------------------------------| | stack pointer here ++ | Current backchain pointer 4/8 | | during ++ |--------------------------------------------|-/ <<< ffi_call_DARWIN ++ ++ Note: ppc64 CR is saved in the low word of a long on the stack. ++*/ ++ ++/*@-exportheader@*/ ++void ++ffi_prep_args( ++ extended_cif* inEcif, ++ unsigned *const stack) ++/*@=exportheader@*/ ++{ ++ /* Copy the ecif to a local var so we can trample the arg. ++ BC note: test this with GP later for possible problems... */ ++ volatile extended_cif* ecif = inEcif; ++ ++ const unsigned bytes = ecif->cif->bytes; ++ const unsigned flags = ecif->cif->flags; ++ ++ /* Cast the stack arg from int* to long*. sizeof(long) == 4 in 32-bit mode ++ and 8 in 64-bit mode. */ ++ unsigned long *const longStack = (unsigned long *const)stack; ++ ++ /* 'stacktop' points at the previous backchain pointer. */ ++#if defined(__ppc64__) ++ // In ppc-darwin.s, an extra 96 bytes is reserved for the linkage area, ++ // saved registers, and an extra FPR. ++ unsigned long *const stacktop = ++ (unsigned long *)(unsigned long)((char*)longStack + bytes + 96); ++#elif defined(__ppc__) ++ unsigned long *const stacktop = longStack + (bytes / sizeof(long)); ++#else ++#error undefined architecture ++#endif ++ ++ /* 'fpr_base' points at the space for fpr1, and grows upwards as ++ we use FPR registers. */ ++ double* fpr_base = (double*)(stacktop - ASM_NEEDS_REGISTERS) - ++ NUM_FPR_ARG_REGISTERS; ++ ++#if defined(__ppc64__) ++ // 64-bit saves an extra register, and uses an extra FPR. Knock fpr_base ++ // down a couple pegs. ++ fpr_base -= 2; ++#endif ++ ++ unsigned int fparg_count = 0; ++ ++ /* 'next_arg' grows up as we put parameters in it. */ ++ unsigned long* next_arg = longStack + 6; /* 6 reserved positions. */ ++ ++ int i; ++ double double_tmp; ++ void** p_argv = ecif->avalue; ++ unsigned long gprvalue; ++ ffi_type** ptr = ecif->cif->arg_types; ++ ++ /* Check that everything starts aligned properly. */ ++ FFI_ASSERT(stack == SF_ROUND(stack)); ++ FFI_ASSERT(stacktop == SF_ROUND(stacktop)); ++ FFI_ASSERT(bytes == SF_ROUND(bytes)); ++ ++ /* Deal with return values that are actually pass-by-reference. ++ Rule: ++ Return values are referenced by r3, so r4 is the first parameter. */ ++ ++ if (flags & FLAG_RETVAL_REFERENCE) ++ *next_arg++ = (unsigned long)(char*)ecif->rvalue; ++ ++ /* Now for the arguments. */ ++ for (i = ecif->cif->nargs; i > 0; i--, ptr++, p_argv++) ++ { ++ switch ((*ptr)->type) ++ { ++ /* If a floating-point parameter appears before all of the general- ++ purpose registers are filled, the corresponding GPRs that match ++ the size of the floating-point parameter are shadowed for the ++ benefit of vararg and pre-ANSI functions. */ ++ case FFI_TYPE_FLOAT: ++ double_tmp = *(float*)*p_argv; ++ ++ if (fparg_count < NUM_FPR_ARG_REGISTERS) ++ *fpr_base++ = double_tmp; ++ ++ *(double*)next_arg = double_tmp; ++ ++ next_arg++; ++ fparg_count++; ++ FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); ++ ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ double_tmp = *(double*)*p_argv; ++ ++ if (fparg_count < NUM_FPR_ARG_REGISTERS) ++ *fpr_base++ = double_tmp; ++ ++ *(double*)next_arg = double_tmp; ++ ++ next_arg += MODE_CHOICE(2,1); ++ fparg_count++; ++ FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); ++ ++ break; ++ ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++#if defined(__ppc64__) ++ if (fparg_count < NUM_FPR_ARG_REGISTERS) ++ *(long double*)fpr_base = *(long double*)*p_argv; ++#elif defined(__ppc__) ++ if (fparg_count < NUM_FPR_ARG_REGISTERS - 1) ++ *(long double*)fpr_base = *(long double*)*p_argv; ++ else if (fparg_count == NUM_FPR_ARG_REGISTERS - 1) ++ *(double*)fpr_base = *(double*)*p_argv; ++#else ++#error undefined architecture ++#endif ++ ++ *(long double*)next_arg = *(long double*)*p_argv; ++ fparg_count += 2; ++ fpr_base += 2; ++ next_arg += MODE_CHOICE(4,2); ++ FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); ++ ++ break; ++#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++#if defined(__ppc64__) ++ gprvalue = *(long long*)*p_argv; ++ goto putgpr; ++#elif defined(__ppc__) ++ *(long long*)next_arg = *(long long*)*p_argv; ++ next_arg += 2; ++ break; ++#else ++#error undefined architecture ++#endif ++ ++ case FFI_TYPE_POINTER: ++ gprvalue = *(unsigned long*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_UINT8: ++ gprvalue = *(unsigned char*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_SINT8: ++ gprvalue = *(signed char*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_UINT16: ++ gprvalue = *(unsigned short*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_SINT16: ++ gprvalue = *(signed short*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_STRUCT: ++ { ++#if defined(__ppc64__) ++ unsigned int gprSize = 0; ++ unsigned int fprSize = 0; ++ ++ ffi64_struct_to_reg_form(*ptr, (char*)*p_argv, NULL, &fparg_count, ++ (char*)next_arg, &gprSize, (char*)fpr_base, &fprSize); ++ next_arg += gprSize / sizeof(long); ++ fpr_base += fprSize / sizeof(double); ++ ++#elif defined(__ppc__) ++ char* dest_cpy = (char*)next_arg; ++ ++ /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, ++ SI 4 bytes) are aligned as if they were those modes. ++ Structures with 3 byte in size are padded upwards. */ ++ unsigned size_al = (*ptr)->size; ++ ++ /* If the first member of the struct is a double, then align ++ the struct to double-word. */ ++ if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) ++ size_al = ALIGN((*ptr)->size, 8); ++ ++ if (ecif->cif->abi == FFI_DARWIN) ++ { ++ if (size_al < 3) ++ dest_cpy += 4 - size_al; ++ } ++ ++ memcpy((char*)dest_cpy, (char*)*p_argv, size_al); ++ next_arg += (size_al + 3) / 4; ++#else ++#error undefined architecture ++#endif ++ break; ++ } ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ gprvalue = *(unsigned*)*p_argv; ++ ++putgpr: ++ *next_arg++ = gprvalue; ++ break; ++ ++ default: ++ break; ++ } ++ } ++ ++ /* Check that we didn't overrun the stack... */ ++ //FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS); ++ //FFI_ASSERT((unsigned *)fpr_base ++ // <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); ++ //FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); ++} ++ ++#if defined(__ppc64__) ++ ++bool ++ffi64_struct_contains_fp( ++ const ffi_type* inType) ++{ ++ bool containsFP = false; ++ unsigned int i; ++ ++ for (i = 0; inType->elements[i] != NULL && !containsFP; i++) ++ { ++ if (inType->elements[i]->type == FFI_TYPE_FLOAT || ++ inType->elements[i]->type == FFI_TYPE_DOUBLE || ++ inType->elements[i]->type == FFI_TYPE_LONGDOUBLE) ++ containsFP = true; ++ else if (inType->elements[i]->type == FFI_TYPE_STRUCT) ++ containsFP = ffi64_struct_contains_fp(inType->elements[i]); ++ } ++ ++ return containsFP; ++} ++ ++#endif // defined(__ppc64__) ++ ++/* Perform machine dependent cif processing. */ ++ffi_status ++ffi_prep_cif_machdep( ++ ffi_cif* cif) ++{ ++ /* All this is for the DARWIN ABI. */ ++ int i; ++ ffi_type** ptr; ++ int intarg_count = 0; ++ int fparg_count = 0; ++ unsigned int flags = 0; ++ unsigned int size_al = 0; ++ ++ /* All the machine-independent calculation of cif->bytes will be wrong. ++ Redo the calculation for DARWIN. */ ++ ++ /* Space for the frame pointer, callee's LR, CR, etc, and for ++ the asm's temp regs. */ ++ unsigned int bytes = (6 + ASM_NEEDS_REGISTERS) * sizeof(long); ++ ++ /* Return value handling. The rules are as follows: ++ - 32-bit (or less) integer values are returned in gpr3; ++ - Structures of size <= 4 bytes also returned in gpr3; ++ - 64-bit integer values and structures between 5 and 8 bytes are ++ returned in gpr3 and gpr4; ++ - Single/double FP values are returned in fpr1; ++ - Long double FP (if not equivalent to double) values are returned in ++ fpr1 and fpr2; ++ - Larger structures values are allocated space and a pointer is passed ++ as the first argument. */ ++ switch (cif->rtype->type) ++ { ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ flags |= FLAG_RETURNS_128BITS; ++ flags |= FLAG_RETURNS_FP; ++ break; ++#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_DOUBLE: ++ flags |= FLAG_RETURNS_64BITS; ++ /* Fall through. */ ++ case FFI_TYPE_FLOAT: ++ flags |= FLAG_RETURNS_FP; ++ break; ++ ++#if defined(__ppc64__) ++ case FFI_TYPE_POINTER: ++#endif ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ flags |= FLAG_RETURNS_64BITS; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ { ++#if defined(__ppc64__) ++ ++ if (ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) ++ { ++ flags |= FLAG_RETVAL_REFERENCE; ++ flags |= FLAG_RETURNS_NOTHING; ++ intarg_count++; ++ } ++ else ++ { ++ flags |= FLAG_RETURNS_STRUCT; ++ ++ if (ffi64_struct_contains_fp(cif->rtype)) ++ flags |= FLAG_STRUCT_CONTAINS_FP; ++ } ++ ++#elif defined(__ppc__) ++ ++ flags |= FLAG_RETVAL_REFERENCE; ++ flags |= FLAG_RETURNS_NOTHING; ++ intarg_count++; ++ ++#else ++#error undefined architecture ++#endif ++ break; ++ } ++ ++ case FFI_TYPE_VOID: ++ flags |= FLAG_RETURNS_NOTHING; ++ break; ++ ++ default: ++ /* Returns 32-bit integer, or similar. Nothing to do here. */ ++ break; ++ } ++ ++ /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the ++ first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest ++ goes on the stack. Structures are passed as a pointer to a copy of ++ the structure. Stuff on the stack needs to keep proper alignment. */ ++ for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) ++ { ++ switch ((*ptr)->type) ++ { ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ fparg_count++; ++ /* If this FP arg is going on the stack, it must be ++ 8-byte-aligned. */ ++ if (fparg_count > NUM_FPR_ARG_REGISTERS ++ && intarg_count % 2 != 0) ++ intarg_count++; ++ break; ++ ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ fparg_count += 2; ++ /* If this FP arg is going on the stack, it must be ++ 8-byte-aligned. */ ++ ++ if ( ++#if defined(__ppc64__) ++ fparg_count > NUM_FPR_ARG_REGISTERS + 1 ++#elif defined(__ppc__) ++ fparg_count > NUM_FPR_ARG_REGISTERS ++#else ++#error undefined architecture ++#endif ++ && intarg_count % 2 != 0) ++ intarg_count++; ++ ++ intarg_count += 2; ++ break; ++#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ /* 'long long' arguments are passed as two words, but ++ either both words must fit in registers or both go ++ on the stack. If they go on the stack, they must ++ be 8-byte-aligned. */ ++ if (intarg_count == NUM_GPR_ARG_REGISTERS - 1 ++ || (intarg_count >= NUM_GPR_ARG_REGISTERS ++ && intarg_count % 2 != 0)) ++ intarg_count++; ++ ++ intarg_count += MODE_CHOICE(2,1); ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ size_al = (*ptr)->size; ++ /* If the first member of the struct is a double, then align ++ the struct to double-word. */ ++ if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) ++ size_al = ALIGN((*ptr)->size, 8); ++ ++#if defined(__ppc64__) ++ // Look for FP struct members. ++ unsigned int j; ++ ++ for (j = 0; (*ptr)->elements[j] != NULL; j++) ++ { ++ if ((*ptr)->elements[j]->type == FFI_TYPE_FLOAT || ++ (*ptr)->elements[j]->type == FFI_TYPE_DOUBLE) ++ { ++ fparg_count++; ++ ++ if (fparg_count > NUM_FPR_ARG_REGISTERS) ++ intarg_count++; ++ } ++ else if ((*ptr)->elements[j]->type == FFI_TYPE_LONGDOUBLE) ++ { ++ fparg_count += 2; ++ ++ if (fparg_count > NUM_FPR_ARG_REGISTERS + 1) ++ intarg_count += 2; ++ } ++ else ++ intarg_count++; ++ } ++#elif defined(__ppc__) ++ intarg_count += (size_al + 3) / 4; ++#else ++#error undefined architecture ++#endif ++ ++ break; ++ ++ default: ++ /* Everything else is passed as a 4/8-byte word in a GPR, either ++ the object itself or a pointer to it. */ ++ intarg_count++; ++ break; ++ } ++ } ++ ++ /* Space for the FPR registers, if needed. */ ++ if (fparg_count != 0) ++ { ++ flags |= FLAG_FP_ARGUMENTS; ++#if defined(__ppc64__) ++ bytes += (NUM_FPR_ARG_REGISTERS + 1) * sizeof(double); ++#elif defined(__ppc__) ++ bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); ++#else ++#error undefined architecture ++#endif ++ } ++ ++ /* Stack space. */ ++#if defined(__ppc64__) ++ if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS) ++ bytes += (intarg_count + fparg_count) * sizeof(long); ++#elif defined(__ppc__) ++ if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS) ++ bytes += (intarg_count + 2 * fparg_count) * sizeof(long); ++#else ++#error undefined architecture ++#endif ++ else ++ bytes += NUM_GPR_ARG_REGISTERS * sizeof(long); ++ ++ /* The stack space allocated needs to be a multiple of 16/32 bytes. */ ++ bytes = SF_ROUND(bytes); ++ ++ cif->flags = flags; ++ cif->bytes = bytes; ++ ++ return FFI_OK; ++} ++ ++/*@-declundef@*/ ++/*@-exportheader@*/ ++extern void ++ffi_call_AIX( ++/*@out@*/ extended_cif*, ++ unsigned, ++ unsigned, ++/*@out@*/ unsigned*, ++ void (*fn)(void), ++ void (*fn2)(extended_cif*, unsigned *const)); ++ ++extern void ++ffi_call_DARWIN( ++/*@out@*/ extended_cif*, ++ unsigned long, ++ unsigned, ++/*@out@*/ unsigned*, ++ void (*fn)(void), ++ void (*fn2)(extended_cif*, unsigned *const)); ++/*@=declundef@*/ ++/*@=exportheader@*/ ++ ++void ++ffi_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ void** avalue) ++{ ++ extended_cif ecif; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return ++ value address then we need to make one. */ ++ if ((rvalue == NULL) && ++ (cif->rtype->type == FFI_TYPE_STRUCT)) ++ { ++ /*@-sysunrecog@*/ ++ ecif.rvalue = alloca(cif->rtype->size); ++ /*@=sysunrecog@*/ ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ switch (cif->abi) ++ { ++ case FFI_AIX: ++ /*@-usedef@*/ ++ ffi_call_AIX(&ecif, -cif->bytes, ++ cif->flags, ecif.rvalue, fn, ffi_prep_args); ++ /*@=usedef@*/ ++ break; ++ ++ case FFI_DARWIN: ++ /*@-usedef@*/ ++ ffi_call_DARWIN(&ecif, -(long)cif->bytes, ++ cif->flags, ecif.rvalue, fn, ffi_prep_args); ++ /*@=usedef@*/ ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++/* here I'd like to add the stack frame layout we use in darwin_closure.S ++ and aix_clsoure.S ++ ++ SP previous -> +---------------------------------------+ <--- child frame ++ | back chain to caller 4 | ++ +---------------------------------------+ 4 ++ | saved CR 4 | ++ +---------------------------------------+ 8 ++ | saved LR 4 | ++ +---------------------------------------+ 12 ++ | reserved for compilers 4 | ++ +---------------------------------------+ 16 ++ | reserved for binders 4 | ++ +---------------------------------------+ 20 ++ | saved TOC pointer 4 | ++ +---------------------------------------+ 24 ++ | always reserved 8*4=32 (previous GPRs)| ++ | according to the linkage convention | ++ | from AIX | ++ +---------------------------------------+ 56 ++ | our FPR area 13*8=104 | ++ | f1 | ++ | . | ++ | f13 | ++ +---------------------------------------+ 160 ++ | result area 8 | ++ +---------------------------------------+ 168 ++ | alignement to the next multiple of 16 | ++SP current --> +---------------------------------------+ 176 <- parent frame ++ | back chain to caller 4 | ++ +---------------------------------------+ 180 ++ | saved CR 4 | ++ +---------------------------------------+ 184 ++ | saved LR 4 | ++ +---------------------------------------+ 188 ++ | reserved for compilers 4 | ++ +---------------------------------------+ 192 ++ | reserved for binders 4 | ++ +---------------------------------------+ 196 ++ | saved TOC pointer 4 | ++ +---------------------------------------+ 200 ++ | always reserved 8*4=32 we store our | ++ | GPRs here | ++ | r3 | ++ | . | ++ | r10 | ++ +---------------------------------------+ 232 ++ | overflow part | ++ +---------------------------------------+ xxx ++ | ???? | ++ +---------------------------------------+ xxx ++*/ ++ ++#if !defined(POWERPC_DARWIN) ++ ++#define MIN_LINE_SIZE 32 ++ ++static void ++flush_icache( ++ char* addr) ++{ ++#ifndef _AIX ++ __asm__ volatile ( ++ "dcbf 0,%0\n" ++ "sync\n" ++ "icbi 0,%0\n" ++ "sync\n" ++ "isync" ++ : : "r" (addr) : "memory"); ++#endif ++} ++ ++static void ++flush_range( ++ char* addr, ++ int size) ++{ ++ int i; ++ ++ for (i = 0; i < size; i += MIN_LINE_SIZE) ++ flush_icache(addr + i); ++ ++ flush_icache(addr + size - 1); ++} ++ ++#endif // !defined(POWERPC_DARWIN) ++ ++ffi_status ++ffi_prep_closure( ++ ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*, void*, void**, void*), ++ void* user_data) ++{ ++ switch (cif->abi) ++ { ++ case FFI_DARWIN: ++ { ++ FFI_ASSERT (cif->abi == FFI_DARWIN); ++ ++ unsigned int* tramp = (unsigned int*)&closure->tramp[0]; ++ ++#if defined(__ppc64__) ++ tramp[0] = 0x7c0802a6; // mflr r0 ++ tramp[1] = 0x429f0005; // bcl 20,31,+0x8 ++ tramp[2] = 0x7d6802a6; // mflr r11 ++ tramp[3] = 0x7c0803a6; // mtlr r0 ++ tramp[4] = 0xe98b0018; // ld r12,24(r11) ++ tramp[5] = 0x7d8903a6; // mtctr r12 ++ tramp[6] = 0xe96b0020; // ld r11,32(r11) ++ tramp[7] = 0x4e800420; // bctr ++ *(unsigned long*)&tramp[8] = (unsigned long)ffi_closure_ASM; ++ *(unsigned long*)&tramp[10] = (unsigned long)closure; ++#elif defined(__ppc__) ++ tramp[0] = 0x7c0802a6; // mflr r0 ++ tramp[1] = 0x429f0005; // bcl 20,31,+0x8 ++ tramp[2] = 0x7d6802a6; // mflr r11 ++ tramp[3] = 0x7c0803a6; // mtlr r0 ++ tramp[4] = 0x818b0018; // lwz r12,24(r11) ++ tramp[5] = 0x7d8903a6; // mtctr r12 ++ tramp[6] = 0x816b001c; // lwz r11,28(r11) ++ tramp[7] = 0x4e800420; // bctr ++ tramp[8] = (unsigned long)ffi_closure_ASM; ++ tramp[9] = (unsigned long)closure; ++#else ++#error undefined architecture ++#endif ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ ++ // Flush the icache. Only necessary on Darwin. ++#if defined(POWERPC_DARWIN) ++ sys_icache_invalidate(closure->tramp, FFI_TRAMPOLINE_SIZE); ++#else ++ flush_range(closure->tramp, FFI_TRAMPOLINE_SIZE); ++#endif ++ ++ break; ++ } ++ ++ case FFI_AIX: ++ { ++ FFI_ASSERT (cif->abi == FFI_AIX); ++ ++ ffi_aix_trampoline_struct* tramp_aix = ++ (ffi_aix_trampoline_struct*)(closure->tramp); ++ aix_fd* fd = (aix_fd*)(void*)ffi_closure_ASM; ++ ++ tramp_aix->code_pointer = fd->code_pointer; ++ tramp_aix->toc = fd->toc; ++ tramp_aix->static_chain = closure; ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ break; ++ } ++ ++ default: ++ return FFI_BAD_ABI; ++ } ++ ++ return FFI_OK; ++} ++ ++#if defined(__ppc__) ++ typedef double ldbits[2]; ++ ++ typedef union ++ { ++ ldbits lb; ++ long double ld; ++ } ldu; ++#endif ++ ++typedef union ++{ ++ float f; ++ double d; ++} ffi_dblfl; ++ ++/* The trampoline invokes ffi_closure_ASM, and on entry, r11 holds the ++ address of the closure. After storing the registers that could possibly ++ contain parameters to be passed into the stack frame and setting up space ++ for a return value, ffi_closure_ASM invokes the following helper function ++ to do most of the work. */ ++int ++ffi_closure_helper_DARWIN( ++ ffi_closure* closure, ++ void* rvalue, ++ unsigned long* pgr, ++ ffi_dblfl* pfr) ++{ ++ /* rvalue is the pointer to space for return value in closure assembly ++ pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM ++ pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM. */ ++ ++#if defined(__ppc__) ++ ldu temp_ld; ++#endif ++ ++ double temp; ++ unsigned int i; ++ unsigned int nf = 0; /* number of FPRs already used. */ ++ unsigned int ng = 0; /* number of GPRs already used. */ ++ ffi_cif* cif = closure->cif; ++ long avn = cif->nargs; ++ void** avalue = alloca(cif->nargs * sizeof(void*)); ++ ffi_type** arg_types = cif->arg_types; ++ ++ /* Copy the caller's structure return value address so that the closure ++ returns the data directly to the caller. */ ++#if defined(__ppc64__) ++ if (cif->rtype->type == FFI_TYPE_STRUCT && ++ ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) ++#elif defined(__ppc__) ++ if (cif->rtype->type == FFI_TYPE_STRUCT) ++#else ++#error undefined architecture ++#endif ++ { ++ rvalue = (void*)*pgr; ++ pgr++; ++ ng++; ++ } ++ ++ /* Grab the addresses of the arguments from the stack frame. */ ++ for (i = 0; i < avn; i++) ++ { ++ switch (arg_types[i]->type) ++ { ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT8: ++ avalue[i] = (char*)pgr + MODE_CHOICE(3,7); ++ ng++; ++ pgr++; ++ break; ++ ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT16: ++ avalue[i] = (char*)pgr + MODE_CHOICE(2,6); ++ ng++; ++ pgr++; ++ break; ++ ++#if defined(__ppc__) ++ case FFI_TYPE_POINTER: ++#endif ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT32: ++ avalue[i] = (char*)pgr + MODE_CHOICE(0,4); ++ ng++; ++ pgr++; ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ if (cif->abi == FFI_DARWIN) ++ { ++#if defined(__ppc64__) ++ unsigned int gprSize = 0; ++ unsigned int fprSize = 0; ++ unsigned int savedFPRSize = fprSize; ++ ++ avalue[i] = alloca(arg_types[i]->size); ++ ffi64_struct_to_ram_form(arg_types[i], (const char*)pgr, ++ &gprSize, (const char*)pfr, &fprSize, &nf, avalue[i], NULL); ++ ++ ng += gprSize / sizeof(long); ++ pgr += gprSize / sizeof(long); ++ pfr += (fprSize - savedFPRSize) / sizeof(double); ++ ++#elif defined(__ppc__) ++ /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, ++ SI 4 bytes) are aligned as if they were those modes. */ ++ unsigned int size_al = size_al = arg_types[i]->size; ++ ++ /* If the first member of the struct is a double, then align ++ the struct to double-word. */ ++ if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE) ++ size_al = ALIGN(arg_types[i]->size, 8); ++ ++ if (size_al < 3) ++ avalue[i] = (void*)pgr + MODE_CHOICE(4,8) - size_al; ++ else ++ avalue[i] = (void*)pgr; ++ ++ ng += (size_al + 3) / sizeof(long); ++ pgr += (size_al + 3) / sizeof(long); ++#else ++#error undefined architecture ++#endif ++ } ++ ++ break; ++ ++#if defined(__ppc64__) ++ case FFI_TYPE_POINTER: ++#endif ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_UINT64: ++ /* Long long ints are passed in 1 or 2 GPRs. */ ++ avalue[i] = pgr; ++ ng += MODE_CHOICE(2,1); ++ pgr += MODE_CHOICE(2,1); ++ ++ break; ++ ++ case FFI_TYPE_FLOAT: ++ /* A float value consumes a GPR. ++ There are 13 64-bit floating point registers. */ ++ if (nf < NUM_FPR_ARG_REGISTERS) ++ { ++ temp = pfr->d; ++ pfr->f = (float)temp; ++ avalue[i] = pfr; ++ pfr++; ++ } ++ else ++ avalue[i] = pgr; ++ ++ nf++; ++ ng++; ++ pgr++; ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ /* A double value consumes one or two GPRs. ++ There are 13 64bit floating point registers. */ ++ if (nf < NUM_FPR_ARG_REGISTERS) ++ { ++ avalue[i] = pfr; ++ pfr++; ++ } ++ else ++ avalue[i] = pgr; ++ ++ nf++; ++ ng += MODE_CHOICE(2,1); ++ pgr += MODE_CHOICE(2,1); ++ ++ break; ++ ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_LONGDOUBLE: ++#if defined(__ppc64__) ++ if (nf < NUM_FPR_ARG_REGISTERS) ++ { ++ avalue[i] = pfr; ++ pfr += 2; ++ } ++#elif defined(__ppc__) ++ /* A long double value consumes 2/4 GPRs and 2 FPRs. ++ There are 13 64bit floating point registers. */ ++ if (nf < NUM_FPR_ARG_REGISTERS - 1) ++ { ++ avalue[i] = pfr; ++ pfr += 2; ++ } ++ /* Here we have the situation where one part of the long double ++ is stored in fpr13 and the other part is already on the stack. ++ We use a union to pass the long double to avalue[i]. */ ++ else if (nf == NUM_FPR_ARG_REGISTERS - 1) ++ { ++ memcpy (&temp_ld.lb[0], pfr, sizeof(temp_ld.lb[0])); ++ memcpy (&temp_ld.lb[1], pgr + 2, sizeof(temp_ld.lb[1])); ++ avalue[i] = &temp_ld.ld; ++ } ++#else ++#error undefined architecture ++#endif ++ else ++ avalue[i] = pgr; ++ ++ nf += 2; ++ ng += MODE_CHOICE(4,2); ++ pgr += MODE_CHOICE(4,2); ++ ++ break; ++ ++#endif /* FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE */ ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ } ++ ++ (closure->fun)(cif, rvalue, avalue, closure->user_data); ++ ++ /* Tell ffi_closure_ASM to perform return type promotions. */ ++ return cif->rtype->type; ++} ++ ++#if defined(__ppc64__) ++ ++/* ffi64_struct_to_ram_form ++ ++ Rebuild a struct's natural layout from buffers of concatenated registers. ++ Return the number of registers used. ++ inGPRs[0-7] == r3, inFPRs[0-7] == f1 ... ++*/ ++void ++ffi64_struct_to_ram_form( ++ const ffi_type* inType, ++ const char* inGPRs, ++ unsigned int* ioGPRMarker, ++ const char* inFPRs, ++ unsigned int* ioFPRMarker, ++ unsigned int* ioFPRsUsed, ++ char* outStruct, // caller-allocated ++ unsigned int* ioStructMarker) ++{ ++ unsigned int srcGMarker = 0; ++ unsigned int srcFMarker = 0; ++ unsigned int savedFMarker = 0; ++ unsigned int fprsUsed = 0; ++ unsigned int savedFPRsUsed = 0; ++ unsigned int destMarker = 0; ++ ++ static unsigned int recurseCount = 0; ++ ++ if (ioGPRMarker) ++ srcGMarker = *ioGPRMarker; ++ ++ if (ioFPRMarker) ++ { ++ srcFMarker = *ioFPRMarker; ++ savedFMarker = srcFMarker; ++ } ++ ++ if (ioFPRsUsed) ++ { ++ fprsUsed = *ioFPRsUsed; ++ savedFPRsUsed = fprsUsed; ++ } ++ ++ if (ioStructMarker) ++ destMarker = *ioStructMarker; ++ ++ size_t i; ++ ++ switch (inType->size) ++ { ++ case 1: case 2: case 4: ++ srcGMarker += 8 - inType->size; ++ break; ++ ++ default: ++ break; ++ } ++ ++ for (i = 0; inType->elements[i] != NULL; i++) ++ { ++ switch (inType->elements[i]->type) ++ { ++ case FFI_TYPE_FLOAT: ++ srcFMarker = ALIGN(srcFMarker, 4); ++ srcGMarker = ALIGN(srcGMarker, 4); ++ destMarker = ALIGN(destMarker, 4); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ *(float*)&outStruct[destMarker] = ++ (float)*(double*)&inFPRs[srcFMarker]; ++ srcFMarker += 8; ++ fprsUsed++; ++ } ++ else ++ *(float*)&outStruct[destMarker] = ++ (float)*(double*)&inGPRs[srcGMarker]; ++ ++ srcGMarker += 4; ++ destMarker += 4; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (destMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) ++ srcGMarker = ALIGN(srcGMarker, 8); ++ } ++ ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ srcFMarker = ALIGN(srcFMarker, 8); ++ destMarker = ALIGN(destMarker, 8); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ *(double*)&outStruct[destMarker] = ++ *(double*)&inFPRs[srcFMarker]; ++ srcFMarker += 8; ++ fprsUsed++; ++ } ++ else ++ *(double*)&outStruct[destMarker] = ++ *(double*)&inGPRs[srcGMarker]; ++ ++ destMarker += 8; ++ ++ // Skip next GPR ++ srcGMarker += 8; ++ srcGMarker = ALIGN(srcGMarker, 8); ++ ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ destMarker = ALIGN(destMarker, 16); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ srcFMarker = ALIGN(srcFMarker, 8); ++ srcGMarker = ALIGN(srcGMarker, 8); ++ *(long double*)&outStruct[destMarker] = ++ *(long double*)&inFPRs[srcFMarker]; ++ srcFMarker += 16; ++ fprsUsed += 2; ++ } ++ else ++ { ++ srcFMarker = ALIGN(srcFMarker, 16); ++ srcGMarker = ALIGN(srcGMarker, 16); ++ *(long double*)&outStruct[destMarker] = ++ *(long double*)&inGPRs[srcGMarker]; ++ } ++ ++ destMarker += 16; ++ ++ // Skip next 2 GPRs ++ srcGMarker += 16; ++ srcGMarker = ALIGN(srcGMarker, 8); ++ ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ { ++ if (inType->alignment == 1) // chars only ++ { ++ if (inType->size == 1) ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ else if (inType->size == 2) ++ { ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ i++; ++ } ++ else ++ { ++ memcpy(&outStruct[destMarker], ++ &inGPRs[srcGMarker], inType->size); ++ srcGMarker += inType->size; ++ destMarker += inType->size; ++ i += inType->size - 1; ++ } ++ } ++ else // chars and other stuff ++ { ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (srcGMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) ++ srcGMarker = ALIGN(srcGMarker, inType->alignment); // was 8 ++ } ++ } ++ ++ break; ++ } ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ srcGMarker = ALIGN(srcGMarker, 2); ++ destMarker = ALIGN(destMarker, 2); ++ ++ *(short*)&outStruct[destMarker] = ++ *(short*)&inGPRs[srcGMarker]; ++ srcGMarker += 2; ++ destMarker += 2; ++ ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ srcGMarker = ALIGN(srcGMarker, 4); ++ destMarker = ALIGN(destMarker, 4); ++ ++ *(int*)&outStruct[destMarker] = ++ *(int*)&inGPRs[srcGMarker]; ++ srcGMarker += 4; ++ destMarker += 4; ++ ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ srcGMarker = ALIGN(srcGMarker, 8); ++ destMarker = ALIGN(destMarker, 8); ++ ++ *(long long*)&outStruct[destMarker] = ++ *(long long*)&inGPRs[srcGMarker]; ++ srcGMarker += 8; ++ destMarker += 8; ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ recurseCount++; ++ ffi64_struct_to_ram_form(inType->elements[i], inGPRs, ++ &srcGMarker, inFPRs, &srcFMarker, &fprsUsed, ++ outStruct, &destMarker); ++ recurseCount--; ++ break; ++ ++ default: ++ FFI_ASSERT(0); // unknown element type ++ break; ++ } ++ } ++ ++ srcGMarker = ALIGN(srcGMarker, inType->alignment); ++ ++ // Take care of the special case for 16-byte structs, but not for ++ // nested structs. ++ if (recurseCount == 0 && srcGMarker == 16) ++ { ++ *(long double*)&outStruct[0] = *(long double*)&inGPRs[0]; ++ srcFMarker = savedFMarker; ++ fprsUsed = savedFPRsUsed; ++ } ++ ++ if (ioGPRMarker) ++ *ioGPRMarker = ALIGN(srcGMarker, 8); ++ ++ if (ioFPRMarker) ++ *ioFPRMarker = srcFMarker; ++ ++ if (ioFPRsUsed) ++ *ioFPRsUsed = fprsUsed; ++ ++ if (ioStructMarker) ++ *ioStructMarker = ALIGN(destMarker, 8); ++} ++ ++/* ffi64_struct_to_reg_form ++ ++ Copy a struct's elements into buffers that can be sliced into registers. ++ Return the sizes of the output buffers in bytes. Pass NULL buffer pointers ++ to calculate size only. ++ outGPRs[0-7] == r3, outFPRs[0-7] == f1 ... ++*/ ++void ++ffi64_struct_to_reg_form( ++ const ffi_type* inType, ++ const char* inStruct, ++ unsigned int* ioStructMarker, ++ unsigned int* ioFPRsUsed, ++ char* outGPRs, // caller-allocated ++ unsigned int* ioGPRSize, ++ char* outFPRs, // caller-allocated ++ unsigned int* ioFPRSize) ++{ ++ size_t i; ++ unsigned int srcMarker = 0; ++ unsigned int destGMarker = 0; ++ unsigned int destFMarker = 0; ++ unsigned int savedFMarker = 0; ++ unsigned int fprsUsed = 0; ++ unsigned int savedFPRsUsed = 0; ++ ++ static unsigned int recurseCount = 0; ++ ++ if (ioStructMarker) ++ srcMarker = *ioStructMarker; ++ ++ if (ioFPRsUsed) ++ { ++ fprsUsed = *ioFPRsUsed; ++ savedFPRsUsed = fprsUsed; ++ } ++ ++ if (ioGPRSize) ++ destGMarker = *ioGPRSize; ++ ++ if (ioFPRSize) ++ { ++ destFMarker = *ioFPRSize; ++ savedFMarker = destFMarker; ++ } ++ ++ switch (inType->size) ++ { ++ case 1: case 2: case 4: ++ destGMarker += 8 - inType->size; ++ break; ++ ++ default: ++ break; ++ } ++ ++ for (i = 0; inType->elements[i] != NULL; i++) ++ { ++ switch (inType->elements[i]->type) ++ { ++ // Shadow floating-point types in GPRs for vararg and pre-ANSI ++ // functions. ++ case FFI_TYPE_FLOAT: ++ // Nudge markers to next 4/8-byte boundary ++ srcMarker = ALIGN(srcMarker, 4); ++ destGMarker = ALIGN(destGMarker, 4); ++ destFMarker = ALIGN(destFMarker, 8); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ if (outFPRs != NULL && inStruct != NULL) ++ *(double*)&outFPRs[destFMarker] = ++ (double)*(float*)&inStruct[srcMarker]; ++ ++ destFMarker += 8; ++ fprsUsed++; ++ } ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(double*)&outGPRs[destGMarker] = ++ (double)*(float*)&inStruct[srcMarker]; ++ ++ srcMarker += 4; ++ destGMarker += 4; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (srcMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 4)) ++ destGMarker = ALIGN(destGMarker, 8); ++ } ++ ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ srcMarker = ALIGN(srcMarker, 8); ++ destFMarker = ALIGN(destFMarker, 8); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ if (outFPRs != NULL && inStruct != NULL) ++ *(double*)&outFPRs[destFMarker] = ++ *(double*)&inStruct[srcMarker]; ++ ++ destFMarker += 8; ++ fprsUsed++; ++ } ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(double*)&outGPRs[destGMarker] = ++ *(double*)&inStruct[srcMarker]; ++ ++ srcMarker += 8; ++ ++ // Skip next GPR ++ destGMarker += 8; ++ destGMarker = ALIGN(destGMarker, 8); ++ ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ srcMarker = ALIGN(srcMarker, 16); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ destFMarker = ALIGN(destFMarker, 8); ++ destGMarker = ALIGN(destGMarker, 8); ++ ++ if (outFPRs != NULL && inStruct != NULL) ++ *(long double*)&outFPRs[destFMarker] = ++ *(long double*)&inStruct[srcMarker]; ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long double*)&outGPRs[destGMarker] = ++ *(long double*)&inStruct[srcMarker]; ++ ++ destFMarker += 16; ++ fprsUsed += 2; ++ } ++ else ++ { ++ destGMarker = ALIGN(destGMarker, 16); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long double*)&outGPRs[destGMarker] = ++ *(long double*)&inStruct[srcMarker]; ++ } ++ ++ srcMarker += 16; ++ destGMarker += 16; // Skip next 2 GPRs ++ destGMarker = ALIGN(destGMarker, 8); // was 16 ++ ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ if (inType->alignment == 1) // bytes only ++ { ++ if (inType->size == 1) ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ outGPRs[destGMarker] = inStruct[srcMarker]; ++ ++ srcMarker++; ++ destGMarker++; ++ } ++ else if (inType->size == 2) ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ { ++ outGPRs[destGMarker] = inStruct[srcMarker]; ++ outGPRs[destGMarker + 1] = inStruct[srcMarker + 1]; ++ } ++ ++ srcMarker += 2; ++ destGMarker += 2; ++ ++ i++; ++ } ++ else ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ { ++ // Avoid memcpy for small chunks. ++ if (inType->size <= sizeof(long)) ++ *(long*)&outGPRs[destGMarker] = ++ *(long*)&inStruct[srcMarker]; ++ else ++ memcpy(&outGPRs[destGMarker], ++ &inStruct[srcMarker], inType->size); ++ } ++ ++ srcMarker += inType->size; ++ destGMarker += inType->size; ++ i += inType->size - 1; ++ } ++ } ++ else // bytes and other stuff ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ outGPRs[destGMarker] = inStruct[srcMarker]; ++ ++ srcMarker++; ++ destGMarker++; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (destGMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 4)) ++ destGMarker = ALIGN(destGMarker, inType->alignment); // was 8 ++ } ++ } ++ ++ break; ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ srcMarker = ALIGN(srcMarker, 2); ++ destGMarker = ALIGN(destGMarker, 2); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(short*)&outGPRs[destGMarker] = ++ *(short*)&inStruct[srcMarker]; ++ ++ srcMarker += 2; ++ destGMarker += 2; ++ ++ if (inType->elements[i + 1] == NULL) ++ destGMarker = ALIGN(destGMarker, inType->alignment); ++ ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ srcMarker = ALIGN(srcMarker, 4); ++ destGMarker = ALIGN(destGMarker, 4); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(int*)&outGPRs[destGMarker] = ++ *(int*)&inStruct[srcMarker]; ++ ++ srcMarker += 4; ++ destGMarker += 4; ++ ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ srcMarker = ALIGN(srcMarker, 8); ++ destGMarker = ALIGN(destGMarker, 8); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long long*)&outGPRs[destGMarker] = ++ *(long long*)&inStruct[srcMarker]; ++ ++ srcMarker += 8; ++ destGMarker += 8; ++ ++ if (inType->elements[i + 1] == NULL) ++ destGMarker = ALIGN(destGMarker, inType->alignment); ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ recurseCount++; ++ ffi64_struct_to_reg_form(inType->elements[i], ++ inStruct, &srcMarker, &fprsUsed, outGPRs, ++ &destGMarker, outFPRs, &destFMarker); ++ recurseCount--; ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ } ++ ++ destGMarker = ALIGN(destGMarker, inType->alignment); ++ ++ // Take care of the special case for 16-byte structs, but not for ++ // nested structs. ++ if (recurseCount == 0 && destGMarker == 16) ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long double*)&outGPRs[0] = *(long double*)&inStruct[0]; ++ ++ destFMarker = savedFMarker; ++ fprsUsed = savedFPRsUsed; ++ } ++ ++ if (ioStructMarker) ++ *ioStructMarker = ALIGN(srcMarker, 8); ++ ++ if (ioFPRsUsed) ++ *ioFPRsUsed = fprsUsed; ++ ++ if (ioGPRSize) ++ *ioGPRSize = ALIGN(destGMarker, 8); ++ ++ if (ioFPRSize) ++ *ioFPRSize = ALIGN(destFMarker, 8); ++} ++ ++/* ffi64_stret_needs_ptr ++ ++ Determine whether a returned struct needs a pointer in r3 or can fit ++ in registers. ++*/ ++ ++bool ++ffi64_stret_needs_ptr( ++ const ffi_type* inType, ++ unsigned short* ioGPRCount, ++ unsigned short* ioFPRCount) ++{ ++ // Obvious case first- struct is larger than combined FPR size. ++ if (inType->size > 14 * 8) ++ return true; ++ ++ // Now the struct can physically fit in registers, determine if it ++ // also fits logically. ++ bool needsPtr = false; ++ unsigned short gprsUsed = 0; ++ unsigned short fprsUsed = 0; ++ size_t i; ++ ++ if (ioGPRCount) ++ gprsUsed = *ioGPRCount; ++ ++ if (ioFPRCount) ++ fprsUsed = *ioFPRCount; ++ ++ for (i = 0; inType->elements[i] != NULL && !needsPtr; i++) ++ { ++ switch (inType->elements[i]->type) ++ { ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ gprsUsed++; ++ fprsUsed++; ++ ++ if (fprsUsed > 13) ++ needsPtr = true; ++ ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ gprsUsed += 2; ++ fprsUsed += 2; ++ ++ if (fprsUsed > 14) ++ needsPtr = true; ++ ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ { ++ gprsUsed++; ++ ++ if (gprsUsed > 8) ++ { ++ needsPtr = true; ++ break; ++ } ++ ++ if (inType->elements[i + 1] == NULL) // last byte in the struct ++ break; ++ ++ // Count possible contiguous bytes ahead, up to 8. ++ unsigned short j; ++ ++ for (j = 1; j < 8; j++) ++ { ++ if (inType->elements[i + j] == NULL || ++ !FFI_TYPE_1_BYTE(inType->elements[i + j]->type)) ++ break; ++ } ++ ++ i += j - 1; // allow for i++ before the test condition ++ ++ break; ++ } ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ gprsUsed++; ++ ++ if (gprsUsed > 8) ++ needsPtr = true; ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ needsPtr = ffi64_stret_needs_ptr( ++ inType->elements[i], &gprsUsed, &fprsUsed); ++ ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ } ++ ++ if (ioGPRCount) ++ *ioGPRCount = gprsUsed; ++ ++ if (ioFPRCount) ++ *ioFPRCount = fprsUsed; ++ ++ return needsPtr; ++} ++ ++/* ffi64_data_size ++ ++ Calculate the size in bytes of an ffi type. ++*/ ++ ++unsigned int ++ffi64_data_size( ++ const ffi_type* inType) ++{ ++ unsigned int size = 0; ++ ++ switch (inType->type) ++ { ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ size = 1; ++ break; ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ size = 2; ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_FLOAT: ++ size = 4; ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_DOUBLE: ++ size = 8; ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ size = 16; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ ffi64_struct_to_reg_form( ++ inType, NULL, NULL, NULL, NULL, &size, NULL, NULL); ++ break; ++ ++ case FFI_TYPE_VOID: ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ ++ return size; ++} ++ ++#endif /* defined(__ppc64__) */ ++#endif /* __ppc__ || __ppc64__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S +new file mode 100644 +index 0000000..7162fa1 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S +@@ -0,0 +1,418 @@ ++#if defined(__ppc64__) ++ ++/* ----------------------------------------------------------------------- ++ ppc64-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, ++ Inc. based on ppc_closure.S ++ ++ PowerPC Assembly glue. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++ ++#include ++#include // for FFI_TRAMPOLINE_SIZE ++#include ++#include ++ ++ .file "ppc64-darwin_closure.S" ++.text ++ .align LOG2_GPR_BYTES ++ .globl _ffi_closure_ASM ++ ++.text ++ .align LOG2_GPR_BYTES ++ ++_ffi_closure_ASM: ++LFB1: ++ mflr r0 ++ stg r0,SF_RETURN(r1) // save return address ++ ++ // Save GPRs 3 - 10 (aligned to 8) in the parents outgoing area. ++ stg r3,SF_ARG1(r1) ++ stg r4,SF_ARG2(r1) ++ stg r5,SF_ARG3(r1) ++ stg r6,SF_ARG4(r1) ++ stg r7,SF_ARG5(r1) ++ stg r8,SF_ARG6(r1) ++ stg r9,SF_ARG7(r1) ++ stg r10,SF_ARG8(r1) ++ ++LCFI0: ++/* 48 bytes (Linkage Area) ++ 64 bytes (outgoing parameter area, always reserved) ++ 112 bytes (14*8 for incoming FPR) ++ ? bytes (result) ++ 112 bytes (14*8 for outgoing FPR) ++ 16 bytes (2 saved registers) ++ 352 + ? total bytes ++*/ ++ ++ std r31,-8(r1) // Save registers we use. ++ std r30,-16(r1) ++ mr r30,r1 // Save the old SP. ++ mr r31,r11 // Save the ffi_closure around ffi64_data_size. ++ ++ // Calculate the space we need. ++ stdu r1,-SF_MINSIZE(r1) ++ ld r3,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* ++ ld r3,16(r3) // ffi_cif->rtype* ++ bl Lffi64_data_size$stub ++ ld r1,0(r1) ++ ++ addi r3,r3,352 // Add our overhead. ++ neg r3,r3 ++ li r0,-32 // Align to 32 bytes. ++ and r3,r3,r0 ++ stdux r1,r1,r3 // Grow the stack. ++ ++ mr r11,r31 // Copy the ffi_closure back. ++ ++LCFI1: ++ // We want to build up an area for the parameters passed ++ // in registers. (both floating point and integer) ++ ++/* 320 bytes (callee stack frame aligned to 32) ++ 48 bytes (caller linkage area) ++ 368 (start of caller parameter area aligned to 8) ++*/ ++ ++ // Save FPRs 1 - 14. (aligned to 8) ++ stfd f1,112(r1) ++ stfd f2,120(r1) ++ stfd f3,128(r1) ++ stfd f4,136(r1) ++ stfd f5,144(r1) ++ stfd f6,152(r1) ++ stfd f7,160(r1) ++ stfd f8,168(r1) ++ stfd f9,176(r1) ++ stfd f10,184(r1) ++ stfd f11,192(r1) ++ stfd f12,200(r1) ++ stfd f13,208(r1) ++ stfd f14,216(r1) ++ ++ // Set up registers for the routine that actually does the work. ++ mr r3,r11 // context pointer from the trampoline ++ addi r4,r1,224 // result storage ++ addi r5,r30,SF_ARG1 // saved GPRs ++ addi r6,r1,112 // saved FPRs ++ bl Lffi_closure_helper_DARWIN$stub ++ ++ // Look the proper starting point in table ++ // by using return type as an offset. ++ addi r5,r1,224 // Get pointer to results area. ++ bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. ++ mflr r4 // Move to r4. ++ slwi r3,r3,4 // Now multiply return type by 16. ++ add r3,r3,r4 // Add contents of table to table address. ++ mtctr r3 ++ bctr ++ ++LFE1: ++ // Each of the ret_typeX code fragments has to be exactly 16 bytes long ++ // (4 instructions). For cache effectiveness we align to a 16 byte ++ // boundary first. ++ .align 4 ++ nop ++ nop ++ nop ++ ++Lget_ret_type0_addr: ++ blrl ++ ++// case FFI_TYPE_VOID ++Lret_type0: ++ b Lfinish ++ nop ++ nop ++ nop ++ ++// case FFI_TYPE_INT ++Lret_type1: ++ lwz r3,4(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_FLOAT ++Lret_type2: ++ lfs f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_DOUBLE ++Lret_type3: ++ lfd f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_LONGDOUBLE ++Lret_type4: ++ lfd f1,0(r5) ++ lfd f2,8(r5) ++ b Lfinish ++ nop ++ ++// case FFI_TYPE_UINT8 ++Lret_type5: ++ lbz r3,7(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT8 ++Lret_type6: ++ lbz r3,7(r5) ++ extsb r3,r3 ++ b Lfinish ++ nop ++ ++// case FFI_TYPE_UINT16 ++Lret_type7: ++ lhz r3,6(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT16 ++Lret_type8: ++ lha r3,6(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_UINT32 ++Lret_type9: // same as Lret_type1 ++ lwz r3,4(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT32 ++Lret_type10: // same as Lret_type1 ++ lwz r3,4(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_UINT64 ++Lret_type11: ++ ld r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT64 ++Lret_type12: // same as Lret_type11 ++ ld r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_STRUCT ++Lret_type13: ++ b Lret_struct ++ nop ++ nop ++ nop ++ ++// ** End 16-byte aligned cases ** ++// case FFI_TYPE_POINTER ++// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types ++// are added in future, the following code will need to be updated and ++// padded to 16 bytes. ++Lret_type14: ++ lg r3,0(r5) ++ b Lfinish ++ ++// copy struct into registers ++Lret_struct: ++ ld r31,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* ++ ld r3,16(r31) // ffi_cif->rtype* ++ ld r31,24(r31) // ffi_cif->flags ++ mr r4,r5 // copy struct* to 2nd arg ++ addi r7,r1,SF_ARG9 // GPR return area ++ addi r9,r30,-16-(14*8) // FPR return area ++ li r5,0 // struct offset ptr (NULL) ++ li r6,0 // FPR used count ptr (NULL) ++ li r8,0 // GPR return area size ptr (NULL) ++ li r10,0 // FPR return area size ptr (NULL) ++ bl Lffi64_struct_to_reg_form$stub ++ ++ // Load GPRs ++ ld r3,SF_ARG9(r1) ++ ld r4,SF_ARG10(r1) ++ ld r5,SF_ARG11(r1) ++ ld r6,SF_ARG12(r1) ++ nop ++ ld r7,SF_ARG13(r1) ++ ld r8,SF_ARG14(r1) ++ ld r9,SF_ARG15(r1) ++ ld r10,SF_ARG16(r1) ++ nop ++ ++ // Load FPRs ++ mtcrf 0x2,r31 ++ bf 26,Lfinish ++ lfd f1,-16-(14*8)(r30) ++ lfd f2,-16-(13*8)(r30) ++ lfd f3,-16-(12*8)(r30) ++ lfd f4,-16-(11*8)(r30) ++ nop ++ lfd f5,-16-(10*8)(r30) ++ lfd f6,-16-(9*8)(r30) ++ lfd f7,-16-(8*8)(r30) ++ lfd f8,-16-(7*8)(r30) ++ nop ++ lfd f9,-16-(6*8)(r30) ++ lfd f10,-16-(5*8)(r30) ++ lfd f11,-16-(4*8)(r30) ++ lfd f12,-16-(3*8)(r30) ++ nop ++ lfd f13,-16-(2*8)(r30) ++ lfd f14,-16-(1*8)(r30) ++ // Fall through ++ ++// case done ++Lfinish: ++ lg r1,0(r1) // Restore stack pointer. ++ ld r31,-8(r1) // Restore registers we used. ++ ld r30,-16(r1) ++ lg r0,SF_RETURN(r1) // Get return address. ++ mtlr r0 // Reset link register. ++ blr ++ ++// END(ffi_closure_ASM) ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ; Length of Common Information Entry ++LSCIE1: ++ .long 0x0 ; CIE Identifier Tag ++ .byte 0x1 ; CIE Version ++ .ascii "zR\0" ; CIE Augmentation ++ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor ++ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte 0x41 ; CIE RA Column ++ .byte 0x1 ; uleb128 0x1; Augmentation size ++ .byte 0x10 ; FDE Encoding (pcrel) ++ .byte 0xc ; DW_CFA_def_cfa ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x0 ; uleb128 0x0 ++ .align LOG2_GPR_BYTES ++LECIE1: ++.globl _ffi_closure_ASM.eh ++_ffi_closure_ASM.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ; FDE Length ++ ++LASFDE1: ++ .long LASFDE1-EH_frame1 ; FDE CIE offset ++ .g_long LFB1-. ; FDE initial location ++ .set L$set$3,LFE1-LFB1 ++ .g_long L$set$3 ; FDE address range ++ .byte 0x0 ; uleb128 0x0; Augmentation size ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$3,LCFI1-LCFI0 ++ .long L$set$3 ++ .byte 0xe ; DW_CFA_def_cfa_offset ++ .byte 176,1 ; uleb128 176 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$4,LCFI0-LFB1 ++ .long L$set$4 ++ .byte 0x11 ; DW_CFA_offset_extended_sf ++ .byte 0x41 ; uleb128 0x41 ++ .byte 0x7e ; sleb128 -2 ++ .align LOG2_GPR_BYTES ++ ++LEFDE1: ++.data ++ .align LOG2_GPR_BYTES ++LDFCM0: ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi_closure_helper_DARWIN$stub: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ mflr r0 ++ bcl 20,31,LO$ffi_closure_helper_DARWIN ++ ++LO$ffi_closure_helper_DARWIN: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) ++ mtlr r0 ++ lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi_closure_helper_DARWIN$lazy_ptr: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ .g_long dyld_stub_binding_helper ++ ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi64_struct_to_reg_form$stub: ++ .indirect_symbol _ffi64_struct_to_reg_form ++ mflr r0 ++ bcl 20,31,LO$ffi64_struct_to_reg_form ++ ++LO$ffi64_struct_to_reg_form: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form) ++ mtlr r0 ++ lgu r12,lo16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form)(r11) ++ mtctr r12 ++ bctr ++ ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi64_data_size$stub: ++ .indirect_symbol _ffi64_data_size ++ mflr r0 ++ bcl 20,31,LO$ffi64_data_size ++ ++LO$ffi64_data_size: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size) ++ mtlr r0 ++ lgu r12,lo16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi64_struct_to_reg_form$lazy_ptr: ++ .indirect_symbol _ffi64_struct_to_reg_form ++ .g_long dyld_stub_binding_helper ++ ++L_ffi64_data_size$lazy_ptr: ++ .indirect_symbol _ffi64_data_size ++ .g_long dyld_stub_binding_helper ++ ++#endif // __ppc64__ +diff -r -u ./Modules/_ctypes/libffi_osx/types.c ./Modules/_ctypes/libffi_osx/types.c +new file mode 100644 +index 0000000..44806ae +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/types.c +@@ -0,0 +1,115 @@ ++/* ----------------------------------------------------------------------- ++ types.c - Copyright (c) 1996, 1998 Red Hat, Inc. ++ ++ Predefined ffi_types needed by libffi. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++/* Type definitions */ ++#define FFI_INTEGRAL_TYPEDEF(n, s, a, t) \ ++ ffi_type ffi_type_##n = { s, a, t, NULL } ++#define FFI_AGGREGATE_TYPEDEF(n, e) \ ++ ffi_type ffi_type_##n = { 0, 0, FFI_TYPE_STRUCT, e } ++ ++FFI_INTEGRAL_TYPEDEF(uint8, 1, 1, FFI_TYPE_UINT8); ++FFI_INTEGRAL_TYPEDEF(sint8, 1, 1, FFI_TYPE_SINT8); ++FFI_INTEGRAL_TYPEDEF(uint16, 2, 2, FFI_TYPE_UINT16); ++FFI_INTEGRAL_TYPEDEF(sint16, 2, 2, FFI_TYPE_SINT16); ++FFI_INTEGRAL_TYPEDEF(uint32, 4, 4, FFI_TYPE_UINT32); ++FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32); ++FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT); ++ ++/* Size and alignment are fake here. They must not be 0. */ ++FFI_INTEGRAL_TYPEDEF(void, 1, 1, FFI_TYPE_VOID); ++ ++#if defined ALPHA || defined SPARC64 || defined X86_64 || \ ++ defined S390X || defined IA64 || defined POWERPC64 ++FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER); ++#else ++FFI_INTEGRAL_TYPEDEF(pointer, 4, 4, FFI_TYPE_POINTER); ++#endif ++ ++#if defined X86 || defined ARM || defined M68K || defined(X86_DARWIN) ++ ++# ifdef X86_64 ++ FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); ++ FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); ++# else ++ FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); ++ FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); ++# endif ++ ++#elif defined(POWERPC_DARWIN) ++FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); ++FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); ++#elif defined SH ++FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); ++FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); ++#else ++FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); ++FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); ++#endif ++ ++#if defined X86 || defined X86_WIN32 || defined M68K || defined(X86_DARWIN) ++ ++# if defined X86_WIN32 || defined X86_64 ++ FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); ++# endif ++ ++# ifdef X86_DARWIN ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE); ++# endif ++ ++#elif defined ARM || defined SH || defined POWERPC_AIX ++FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); ++FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE); ++#elif defined POWERPC_DARWIN ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++ ++# if __GNUC__ >= 4 ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); ++# endif ++ ++#elif defined SPARC ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++ ++# ifdef SPARC64 ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE); ++# endif ++ ++#elif defined X86_64 || defined POWERPC64 ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++#else ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); ++#endif +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/x86/darwin64.S ./Modules/_ctypes/libffi_osx/x86/darwin64.S +new file mode 100644 +index 0000000..165d469 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/darwin64.S +@@ -0,0 +1,417 @@ ++/* ----------------------------------------------------------------------- ++ darwin64.S - Copyright (c) 2006 Free Software Foundation, Inc. ++ derived from unix64.S ++ ++ x86-64 Foreign Function Interface for Darwin. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#ifdef __x86_64__ ++#define LIBFFI_ASM ++#include ++#include ++ ++ .file "darwin64.S" ++.text ++ ++/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, ++ void *raddr, void (*fnaddr)()); ++ ++ Bit o trickiness here -- ARGS+BYTES is the base of the stack frame ++ for this function. This has been allocated by ffi_call. We also ++ deallocate some of the stack that has been alloca'd. */ ++ ++ .align 3 ++ .globl _ffi_call_unix64 ++ ++_ffi_call_unix64: ++LUW0: ++ movq (%rsp), %r10 /* Load return address. */ ++ movq %rdi, %r12 /* Save a copy of the register area. */ ++ leaq (%rdi, %rsi), %rax /* Find local stack base. */ ++ movq %rdx, (%rax) /* Save flags. */ ++ movq %rcx, 8(%rax) /* Save raddr. */ ++ movq %rbp, 16(%rax) /* Save old frame pointer. */ ++ movq %r10, 24(%rax) /* Relocate return address. */ ++ movq %rax, %rbp /* Finalize local stack frame. */ ++LUW1: ++ /* movq %rdi, %r10 // Save a copy of the register area. */ ++ movq %r12, %r10 ++ movq %r8, %r11 /* Save a copy of the target fn. */ ++ movl %r9d, %eax /* Set number of SSE registers. */ ++ ++ /* Load up all argument registers. */ ++ movq (%r10), %rdi ++ movq 8(%r10), %rsi ++ movq 16(%r10), %rdx ++ movq 24(%r10), %rcx ++ movq 32(%r10), %r8 ++ movq 40(%r10), %r9 ++ testl %eax, %eax ++ jnz Lload_sse ++Lret_from_load_sse: ++ ++ /* Deallocate the reg arg area. */ ++ leaq 176(%r10), %rsp ++ ++ /* Call the user function. */ ++ call *%r11 ++ ++ /* Deallocate stack arg area; local stack frame in redzone. */ ++ leaq 24(%rbp), %rsp ++ ++ movq 0(%rbp), %rcx /* Reload flags. */ ++ movq 8(%rbp), %rdi /* Reload raddr. */ ++ movq 16(%rbp), %rbp /* Reload old frame pointer. */ ++LUW2: ++ ++ /* The first byte of the flags contains the FFI_TYPE. */ ++ movzbl %cl, %r10d ++ leaq Lstore_table(%rip), %r11 ++ movslq (%r11, %r10, 4), %r10 ++ addq %r11, %r10 ++ jmp *%r10 ++ ++Lstore_table: ++ .long Lst_void-Lstore_table /* FFI_TYPE_VOID */ ++ .long Lst_sint32-Lstore_table /* FFI_TYPE_INT */ ++ .long Lst_float-Lstore_table /* FFI_TYPE_FLOAT */ ++ .long Lst_double-Lstore_table /* FFI_TYPE_DOUBLE */ ++ .long Lst_ldouble-Lstore_table /* FFI_TYPE_LONGDOUBLE */ ++ .long Lst_uint8-Lstore_table /* FFI_TYPE_UINT8 */ ++ .long Lst_sint8-Lstore_table /* FFI_TYPE_SINT8 */ ++ .long Lst_uint16-Lstore_table /* FFI_TYPE_UINT16 */ ++ .long Lst_sint16-Lstore_table /* FFI_TYPE_SINT16 */ ++ .long Lst_uint32-Lstore_table /* FFI_TYPE_UINT32 */ ++ .long Lst_sint32-Lstore_table /* FFI_TYPE_SINT32 */ ++ .long Lst_int64-Lstore_table /* FFI_TYPE_UINT64 */ ++ .long Lst_int64-Lstore_table /* FFI_TYPE_SINT64 */ ++ .long Lst_struct-Lstore_table /* FFI_TYPE_STRUCT */ ++ .long Lst_int64-Lstore_table /* FFI_TYPE_POINTER */ ++ ++ .text ++ .align 3 ++Lst_void: ++ ret ++ .align 3 ++Lst_uint8: ++ movzbq %al, %rax ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_sint8: ++ movsbq %al, %rax ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_uint16: ++ movzwq %ax, %rax ++ movq %rax, (%rdi) ++ .align 3 ++Lst_sint16: ++ movswq %ax, %rax ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_uint32: ++ movl %eax, %eax ++ movq %rax, (%rdi) ++ .align 3 ++Lst_sint32: ++ cltq ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_int64: ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_float: ++ movss %xmm0, (%rdi) ++ ret ++ .align 3 ++Lst_double: ++ movsd %xmm0, (%rdi) ++ ret ++Lst_ldouble: ++ fstpt (%rdi) ++ ret ++ .align 3 ++Lst_struct: ++ leaq -20(%rsp), %rsi /* Scratch area in redzone. */ ++ ++ /* We have to locate the values now, and since we don't want to ++ write too much data into the user's return value, we spill the ++ value to a 16 byte scratch area first. Bits 8, 9, and 10 ++ control where the values are located. Only one of the three ++ bits will be set; see ffi_prep_cif_machdep for the pattern. */ ++ movd %xmm0, %r10 ++ movd %xmm1, %r11 ++ testl $0x100, %ecx ++ cmovnz %rax, %rdx ++ cmovnz %r10, %rax ++ testl $0x200, %ecx ++ cmovnz %r10, %rdx ++ testl $0x400, %ecx ++ cmovnz %r10, %rax ++ cmovnz %r11, %rdx ++ movq %rax, (%rsi) ++ movq %rdx, 8(%rsi) ++ ++ /* Bits 12-31 contain the true size of the structure. Copy from ++ the scratch area to the true destination. */ ++ shrl $12, %ecx ++ rep movsb ++ ret ++ ++ /* Many times we can avoid loading any SSE registers at all. ++ It's not worth an indirect jump to load the exact set of ++ SSE registers needed; zero or all is a good compromise. */ ++ .align 3 ++LUW3: ++Lload_sse: ++ movdqa 48(%r10), %xmm0 ++ movdqa 64(%r10), %xmm1 ++ movdqa 80(%r10), %xmm2 ++ movdqa 96(%r10), %xmm3 ++ movdqa 112(%r10), %xmm4 ++ movdqa 128(%r10), %xmm5 ++ movdqa 144(%r10), %xmm6 ++ movdqa 160(%r10), %xmm7 ++ jmp Lret_from_load_sse ++ ++LUW4: ++ .align 3 ++ .globl _ffi_closure_unix64 ++ ++_ffi_closure_unix64: ++LUW5: ++ /* The carry flag is set by the trampoline iff SSE registers ++ are used. Don't clobber it before the branch instruction. */ ++ leaq -200(%rsp), %rsp ++LUW6: ++ movq %rdi, (%rsp) ++ movq %rsi, 8(%rsp) ++ movq %rdx, 16(%rsp) ++ movq %rcx, 24(%rsp) ++ movq %r8, 32(%rsp) ++ movq %r9, 40(%rsp) ++ jc Lsave_sse ++Lret_from_save_sse: ++ ++ movq %r10, %rdi ++ leaq 176(%rsp), %rsi ++ movq %rsp, %rdx ++ leaq 208(%rsp), %rcx ++ call _ffi_closure_unix64_inner ++ ++ /* Deallocate stack frame early; return value is now in redzone. */ ++ addq $200, %rsp ++LUW7: ++ ++ /* The first byte of the return value contains the FFI_TYPE. */ ++ movzbl %al, %r10d ++ leaq Lload_table(%rip), %r11 ++ movslq (%r11, %r10, 4), %r10 ++ addq %r11, %r10 ++ jmp *%r10 ++ ++Lload_table: ++ .long Lld_void-Lload_table /* FFI_TYPE_VOID */ ++ .long Lld_int32-Lload_table /* FFI_TYPE_INT */ ++ .long Lld_float-Lload_table /* FFI_TYPE_FLOAT */ ++ .long Lld_double-Lload_table /* FFI_TYPE_DOUBLE */ ++ .long Lld_ldouble-Lload_table /* FFI_TYPE_LONGDOUBLE */ ++ .long Lld_int8-Lload_table /* FFI_TYPE_UINT8 */ ++ .long Lld_int8-Lload_table /* FFI_TYPE_SINT8 */ ++ .long Lld_int16-Lload_table /* FFI_TYPE_UINT16 */ ++ .long Lld_int16-Lload_table /* FFI_TYPE_SINT16 */ ++ .long Lld_int32-Lload_table /* FFI_TYPE_UINT32 */ ++ .long Lld_int32-Lload_table /* FFI_TYPE_SINT32 */ ++ .long Lld_int64-Lload_table /* FFI_TYPE_UINT64 */ ++ .long Lld_int64-Lload_table /* FFI_TYPE_SINT64 */ ++ .long Lld_struct-Lload_table /* FFI_TYPE_STRUCT */ ++ .long Lld_int64-Lload_table /* FFI_TYPE_POINTER */ ++ ++ .text ++ .align 3 ++Lld_void: ++ ret ++ .align 3 ++Lld_int8: ++ movzbl -24(%rsp), %eax ++ ret ++ .align 3 ++Lld_int16: ++ movzwl -24(%rsp), %eax ++ ret ++ .align 3 ++Lld_int32: ++ movl -24(%rsp), %eax ++ ret ++ .align 3 ++Lld_int64: ++ movq -24(%rsp), %rax ++ ret ++ .align 3 ++Lld_float: ++ movss -24(%rsp), %xmm0 ++ ret ++ .align 3 ++Lld_double: ++ movsd -24(%rsp), %xmm0 ++ ret ++ .align 3 ++Lld_ldouble: ++ fldt -24(%rsp) ++ ret ++ .align 3 ++Lld_struct: ++ /* There are four possibilities here, %rax/%rdx, %xmm0/%rax, ++ %rax/%xmm0, %xmm0/%xmm1. We collapse two by always loading ++ both rdx and xmm1 with the second word. For the remaining, ++ bit 8 set means xmm0 gets the second word, and bit 9 means ++ that rax gets the second word. */ ++ movq -24(%rsp), %rcx ++ movq -16(%rsp), %rdx ++ movq -16(%rsp), %xmm1 ++ testl $0x100, %eax ++ cmovnz %rdx, %rcx ++ movd %rcx, %xmm0 ++ testl $0x200, %eax ++ movq -24(%rsp), %rax ++ cmovnz %rdx, %rax ++ ret ++ ++ /* See the comment above Lload_sse; the same logic applies here. */ ++ .align 3 ++LUW8: ++Lsave_sse: ++ movdqa %xmm0, 48(%rsp) ++ movdqa %xmm1, 64(%rsp) ++ movdqa %xmm2, 80(%rsp) ++ movdqa %xmm3, 96(%rsp) ++ movdqa %xmm4, 112(%rsp) ++ movdqa %xmm5, 128(%rsp) ++ movdqa %xmm6, 144(%rsp) ++ movdqa %xmm7, 160(%rsp) ++ jmp Lret_from_save_sse ++ ++LUW9: ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 /* CIE Length */ ++ .long L$set$0 ++LSCIE1: ++ .long 0x0 /* CIE Identifier Tag */ ++ .byte 0x1 /* CIE Version */ ++ .ascii "zR\0" /* CIE Augmentation */ ++ .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ ++ .byte 0x78 /* sleb128 -8; CIE Data Alignment Factor */ ++ .byte 0x10 /* CIE RA Column */ ++ .byte 0x1 /* uleb128 0x1; Augmentation size */ ++ .byte 0x10 /* FDE Encoding (pcrel sdata4) */ ++ .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ ++ .byte 0x7 /* uleb128 0x7 */ ++ .byte 0x8 /* uleb128 0x8 */ ++ .byte 0x90 /* DW_CFA_offset, column 0x10 */ ++ .byte 0x1 ++ .align 3 ++LECIE1: ++ .globl _ffi_call_unix64.eh ++_ffi_call_unix64.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 /* FDE Length */ ++ .long L$set$1 ++LASFDE1: ++ .long LASFDE1-EH_frame1 /* FDE CIE offset */ ++ .quad LUW0-. /* FDE initial location */ ++ .set L$set$2,LUW4-LUW0 /* FDE address range */ ++ .quad L$set$2 ++ .byte 0x0 /* Augmentation size */ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$3,LUW1-LUW0 ++ .long L$set$3 ++ ++ /* New stack frame based off rbp. This is a itty bit of unwind ++ trickery in that the CFA *has* changed. There is no easy way ++ to describe it correctly on entry to the function. Fortunately, ++ it doesn't matter too much since at all points we can correctly ++ unwind back to ffi_call. Note that the location to which we ++ moved the return address is (the new) CFA-8, so from the ++ perspective of the unwind info, it hasn't moved. */ ++ .byte 0xc /* DW_CFA_def_cfa, %rbp offset 32 */ ++ .byte 0x6 ++ .byte 0x20 ++ .byte 0x80+6 /* DW_CFA_offset, %rbp offset 2*-8 */ ++ .byte 0x2 ++ .byte 0xa /* DW_CFA_remember_state */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$4,LUW2-LUW1 ++ .long L$set$4 ++ .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ ++ .byte 0x7 ++ .byte 0x8 ++ .byte 0xc0+6 /* DW_CFA_restore, %rbp */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$5,LUW3-LUW2 ++ .long L$set$5 ++ .byte 0xb /* DW_CFA_restore_state */ ++ ++ .align 3 ++LEFDE1: ++ .globl _ffi_closure_unix64.eh ++_ffi_closure_unix64.eh: ++LSFDE3: ++ .set L$set$6,LEFDE3-LASFDE3 /* FDE Length */ ++ .long L$set$6 ++LASFDE3: ++ .long LASFDE3-EH_frame1 /* FDE CIE offset */ ++ .quad LUW5-. /* FDE initial location */ ++ .set L$set$7,LUW9-LUW5 /* FDE address range */ ++ .quad L$set$7 ++ .byte 0x0 /* Augmentation size */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$8,LUW6-LUW5 ++ .long L$set$8 ++ .byte 0xe /* DW_CFA_def_cfa_offset */ ++ .byte 208,1 /* uleb128 208 */ ++ .byte 0xa /* DW_CFA_remember_state */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$9,LUW7-LUW6 ++ .long L$set$9 ++ .byte 0xe /* DW_CFA_def_cfa_offset */ ++ .byte 0x8 ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$10,LUW8-LUW7 ++ .long L$set$10 ++ .byte 0xb /* DW_CFA_restore_state */ ++ ++ .align 3 ++LEFDE3: ++ .subsections_via_symbols ++ ++#endif /* __x86_64__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S +new file mode 100644 +index 0000000..925a841 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S +@@ -0,0 +1,422 @@ ++#ifdef __i386__ ++/* ----------------------------------------------------------------------- ++ darwin.S - Copyright (c) 1996, 1998, 2001, 2002, 2003 Red Hat, Inc. ++ ++ X86 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++/* ++ * This file is based on sysv.S and then hacked up by Ronald who hasn't done ++ * assembly programming in 8 years. ++ */ ++ ++#ifndef __x86_64__ ++ ++#define LIBFFI_ASM ++#include ++#include ++ ++#ifdef PyObjC_STRICT_DEBUGGING ++ /* XXX: Debugging of stack alignment, to be removed */ ++#define ASSERT_STACK_ALIGNED movdqa -16(%esp), %xmm0 ++#else ++#define ASSERT_STACK_ALIGNED ++#endif ++ ++.text ++ ++.globl _ffi_prep_args ++ ++ .align 4 ++.globl _ffi_call_SYSV ++ ++_ffi_call_SYSV: ++LFB1: ++ pushl %ebp ++LCFI0: ++ movl %esp,%ebp ++LCFI1: ++ subl $8,%esp ++ /* Make room for all of the new args. */ ++ movl 16(%ebp),%ecx ++ subl %ecx,%esp ++ ++ movl %esp,%eax ++ ++ /* Place all of the ffi_prep_args in position */ ++ subl $8,%esp ++ pushl 12(%ebp) ++ pushl %eax ++ call *8(%ebp) ++ ++ /* Return stack to previous state and call the function */ ++ addl $16,%esp ++ ++ call *28(%ebp) ++ ++ /* Remove the space we pushed for the args */ ++ movl 16(%ebp),%ecx ++ addl %ecx,%esp ++ ++ /* Load %ecx with the return type code */ ++ movl 20(%ebp),%ecx ++ ++ /* If the return value pointer is NULL, assume no return value. */ ++ cmpl $0,24(%ebp) ++ jne Lretint ++ ++ /* Even if there is no space for the return value, we are ++ obliged to handle floating-point values. */ ++ cmpl $FFI_TYPE_FLOAT,%ecx ++ jne Lnoretval ++ fstp %st(0) ++ ++ jmp Lepilogue ++ ++Lretint: ++ cmpl $FFI_TYPE_INT,%ecx ++ jne Lretfloat ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movl %eax,0(%ecx) ++ jmp Lepilogue ++ ++Lretfloat: ++ cmpl $FFI_TYPE_FLOAT,%ecx ++ jne Lretdouble ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ fstps (%ecx) ++ jmp Lepilogue ++ ++Lretdouble: ++ cmpl $FFI_TYPE_DOUBLE,%ecx ++ jne Lretlongdouble ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ fstpl (%ecx) ++ jmp Lepilogue ++ ++Lretlongdouble: ++ cmpl $FFI_TYPE_LONGDOUBLE,%ecx ++ jne Lretint64 ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ fstpt (%ecx) ++ jmp Lepilogue ++ ++Lretint64: ++ cmpl $FFI_TYPE_SINT64,%ecx ++ jne Lretstruct1b ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movl %eax,0(%ecx) ++ movl %edx,4(%ecx) ++ jmp Lepilogue ++ ++Lretstruct1b: ++ cmpl $FFI_TYPE_SINT8,%ecx ++ jne Lretstruct2b ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movb %al,0(%ecx) ++ jmp Lepilogue ++ ++Lretstruct2b: ++ cmpl $FFI_TYPE_SINT16,%ecx ++ jne Lretstruct ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movw %ax,0(%ecx) ++ jmp Lepilogue ++ ++Lretstruct: ++ cmpl $FFI_TYPE_STRUCT,%ecx ++ jne Lnoretval ++ /* Nothing to do! */ ++ addl $4,%esp ++ popl %ebp ++ ret ++ ++Lnoretval: ++Lepilogue: ++ addl $8,%esp ++ movl %ebp,%esp ++ popl %ebp ++ ret ++LFE1: ++.ffi_call_SYSV_end: ++ ++ .align 4 ++FFI_HIDDEN (ffi_closure_SYSV) ++.globl _ffi_closure_SYSV ++ ++_ffi_closure_SYSV: ++LFB2: ++ pushl %ebp ++LCFI2: ++ movl %esp, %ebp ++LCFI3: ++ subl $56, %esp ++ leal -40(%ebp), %edx ++ movl %edx, -12(%ebp) /* resp */ ++ leal 8(%ebp), %edx ++ movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ ++ leal -12(%ebp), %edx ++ movl %edx, (%esp) /* &resp */ ++ movl %ebx, 8(%esp) ++LCFI7: ++ call L_ffi_closure_SYSV_inner$stub ++ movl 8(%esp), %ebx ++ movl -12(%ebp), %ecx ++ cmpl $FFI_TYPE_INT, %eax ++ je Lcls_retint ++ cmpl $FFI_TYPE_FLOAT, %eax ++ je Lcls_retfloat ++ cmpl $FFI_TYPE_DOUBLE, %eax ++ je Lcls_retdouble ++ cmpl $FFI_TYPE_LONGDOUBLE, %eax ++ je Lcls_retldouble ++ cmpl $FFI_TYPE_SINT64, %eax ++ je Lcls_retllong ++ cmpl $FFI_TYPE_UINT8, %eax ++ je Lcls_retstruct1 ++ cmpl $FFI_TYPE_SINT8, %eax ++ je Lcls_retstruct1 ++ cmpl $FFI_TYPE_UINT16, %eax ++ je Lcls_retstruct2 ++ cmpl $FFI_TYPE_SINT16, %eax ++ je Lcls_retstruct2 ++ cmpl $FFI_TYPE_STRUCT, %eax ++ je Lcls_retstruct ++Lcls_epilogue: ++ movl %ebp, %esp ++ popl %ebp ++ ret ++Lcls_retint: ++ movl (%ecx), %eax ++ jmp Lcls_epilogue ++Lcls_retfloat: ++ flds (%ecx) ++ jmp Lcls_epilogue ++Lcls_retdouble: ++ fldl (%ecx) ++ jmp Lcls_epilogue ++Lcls_retldouble: ++ fldt (%ecx) ++ jmp Lcls_epilogue ++Lcls_retllong: ++ movl (%ecx), %eax ++ movl 4(%ecx), %edx ++ jmp Lcls_epilogue ++Lcls_retstruct1: ++ movsbl (%ecx), %eax ++ jmp Lcls_epilogue ++Lcls_retstruct2: ++ movswl (%ecx), %eax ++ jmp Lcls_epilogue ++Lcls_retstruct: ++ lea -8(%ebp),%esp ++ movl %ebp, %esp ++ popl %ebp ++ ret $4 ++LFE2: ++ ++#if !FFI_NO_RAW_API ++ ++#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) ++#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) ++#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) ++#define CIF_FLAGS_OFFSET 20 ++ ++ .align 4 ++FFI_HIDDEN (ffi_closure_raw_SYSV) ++.globl _ffi_closure_raw_SYSV ++ ++_ffi_closure_raw_SYSV: ++LFB3: ++ pushl %ebp ++LCFI4: ++ movl %esp, %ebp ++LCFI5: ++ pushl %esi ++LCFI6: ++ subl $36, %esp ++ movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ ++ movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ ++ movl %edx, 12(%esp) /* user_data */ ++ leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ ++ movl %edx, 8(%esp) /* raw_args */ ++ leal -24(%ebp), %edx ++ movl %edx, 4(%esp) /* &res */ ++ movl %esi, (%esp) /* cif */ ++ call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ ++ movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ ++ cmpl $FFI_TYPE_INT, %eax ++ je Lrcls_retint ++ cmpl $FFI_TYPE_FLOAT, %eax ++ je Lrcls_retfloat ++ cmpl $FFI_TYPE_DOUBLE, %eax ++ je Lrcls_retdouble ++ cmpl $FFI_TYPE_LONGDOUBLE, %eax ++ je Lrcls_retldouble ++ cmpl $FFI_TYPE_SINT64, %eax ++ je Lrcls_retllong ++Lrcls_epilogue: ++ addl $36, %esp ++ popl %esi ++ popl %ebp ++ ret ++Lrcls_retint: ++ movl -24(%ebp), %eax ++ jmp Lrcls_epilogue ++Lrcls_retfloat: ++ flds -24(%ebp) ++ jmp Lrcls_epilogue ++Lrcls_retdouble: ++ fldl -24(%ebp) ++ jmp Lrcls_epilogue ++Lrcls_retldouble: ++ fldt -24(%ebp) ++ jmp Lrcls_epilogue ++Lrcls_retllong: ++ movl -24(%ebp), %eax ++ movl -20(%ebp), %edx ++ jmp Lrcls_epilogue ++LFE3: ++#endif ++ ++.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5 ++L_ffi_closure_SYSV_inner$stub: ++ .indirect_symbol _ffi_closure_SYSV_inner ++ hlt ; hlt ; hlt ; hlt ; hlt ++ ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ++LSCIE1: ++ .long 0x0 ++ .byte 0x1 ++ .ascii "zR\0" ++ .byte 0x1 ++ .byte 0x7c ++ .byte 0x8 ++ .byte 0x1 ++ .byte 0x10 ++ .byte 0xc ++ .byte 0x5 ++ .byte 0x4 ++ .byte 0x88 ++ .byte 0x1 ++ .align 2 ++LECIE1: ++.globl _ffi_call_SYSV.eh ++_ffi_call_SYSV.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ++LASFDE1: ++ .long LASFDE1-EH_frame1 ++ .long LFB1-. ++ .set L$set$2,LFE1-LFB1 ++ .long L$set$2 ++ .byte 0x0 ++ .byte 0x4 ++ .set L$set$3,LCFI0-LFB1 ++ .long L$set$3 ++ .byte 0xe ++ .byte 0x8 ++ .byte 0x84 ++ .byte 0x2 ++ .byte 0x4 ++ .set L$set$4,LCFI1-LCFI0 ++ .long L$set$4 ++ .byte 0xd ++ .byte 0x4 ++ .align 2 ++LEFDE1: ++.globl _ffi_closure_SYSV.eh ++_ffi_closure_SYSV.eh: ++LSFDE2: ++ .set L$set$5,LEFDE2-LASFDE2 ++ .long L$set$5 ++LASFDE2: ++ .long LASFDE2-EH_frame1 ++ .long LFB2-. ++ .set L$set$6,LFE2-LFB2 ++ .long L$set$6 ++ .byte 0x0 ++ .byte 0x4 ++ .set L$set$7,LCFI2-LFB2 ++ .long L$set$7 ++ .byte 0xe ++ .byte 0x8 ++ .byte 0x84 ++ .byte 0x2 ++ .byte 0x4 ++ .set L$set$8,LCFI3-LCFI2 ++ .long L$set$8 ++ .byte 0xd ++ .byte 0x4 ++ .align 2 ++LEFDE2: ++ ++#if !FFI_NO_RAW_API ++ ++.globl _ffi_closure_raw_SYSV.eh ++_ffi_closure_raw_SYSV.eh: ++LSFDE3: ++ .set L$set$10,LEFDE3-LASFDE3 ++ .long L$set$10 ++LASFDE3: ++ .long LASFDE3-EH_frame1 ++ .long LFB3-. ++ .set L$set$11,LFE3-LFB3 ++ .long L$set$11 ++ .byte 0x0 ++ .byte 0x4 ++ .set L$set$12,LCFI4-LFB3 ++ .long L$set$12 ++ .byte 0xe ++ .byte 0x8 ++ .byte 0x84 ++ .byte 0x2 ++ .byte 0x4 ++ .set L$set$13,LCFI5-LCFI4 ++ .long L$set$13 ++ .byte 0xd ++ .byte 0x4 ++ .byte 0x4 ++ .set L$set$14,LCFI6-LCFI5 ++ .long L$set$14 ++ .byte 0x85 ++ .byte 0x3 ++ .align 2 ++LEFDE3: ++ ++#endif ++ ++#endif /* ifndef __x86_64__ */ ++ ++#endif /* defined __i386__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c +new file mode 100644 +index 0000000..06feaf2 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c +@@ -0,0 +1,734 @@ ++#ifdef __x86_64__ ++ ++/* ----------------------------------------------------------------------- ++ x86-ffi64.c - Copyright (c) 2002 Bo Thorsen ++ ++ x86-64 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++#include ++ ++#define MAX_GPR_REGS 6 ++#define MAX_SSE_REGS 8 ++ ++typedef struct RegisterArgs { ++ /* Registers for argument passing. */ ++ UINT64 gpr[MAX_GPR_REGS]; ++ __int128_t sse[MAX_SSE_REGS]; ++} RegisterArgs; ++ ++extern void ++ffi_call_unix64( ++ void* args, ++ unsigned long bytes, ++ unsigned flags, ++ void* raddr, ++ void (*fnaddr)(), ++ unsigned ssecount); ++ ++/* All reference to register classes here is identical to the code in ++ gcc/config/i386/i386.c. Do *not* change one without the other. */ ++ ++/* Register class used for passing given 64bit part of the argument. ++ These represent classes as documented by the PS ABI, with the exception ++ of SSESF, SSEDF classes, that are basically SSE class, just gcc will ++ use SF or DFmode move instead of DImode to avoid reformating penalties. ++ ++ Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves ++ whenever possible (upper half does contain padding). */ ++enum x86_64_reg_class ++{ ++ X86_64_NO_CLASS, ++ X86_64_INTEGER_CLASS, ++ X86_64_INTEGERSI_CLASS, ++ X86_64_SSE_CLASS, ++ X86_64_SSESF_CLASS, ++ X86_64_SSEDF_CLASS, ++ X86_64_SSEUP_CLASS, ++ X86_64_X87_CLASS, ++ X86_64_X87UP_CLASS, ++ X86_64_COMPLEX_X87_CLASS, ++ X86_64_MEMORY_CLASS ++}; ++ ++#define MAX_CLASSES 4 ++#define SSE_CLASS_P(X) ((X) >= X86_64_SSE_CLASS && X <= X86_64_SSEUP_CLASS) ++ ++/* x86-64 register passing implementation. See x86-64 ABI for details. Goal ++ of this code is to classify each 8bytes of incoming argument by the register ++ class and assign registers accordingly. */ ++ ++/* Return the union class of CLASS1 and CLASS2. ++ See the x86-64 PS ABI for details. */ ++static enum x86_64_reg_class ++merge_classes( ++ enum x86_64_reg_class class1, ++ enum x86_64_reg_class class2) ++{ ++ /* Rule #1: If both classes are equal, this is the resulting class. */ ++ if (class1 == class2) ++ return class1; ++ ++ /* Rule #2: If one of the classes is NO_CLASS, the resulting class is ++ the other class. */ ++ if (class1 == X86_64_NO_CLASS) ++ return class2; ++ ++ if (class2 == X86_64_NO_CLASS) ++ return class1; ++ ++ /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */ ++ if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS) ++ return X86_64_MEMORY_CLASS; ++ ++ /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */ ++ if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS) ++ || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS)) ++ return X86_64_INTEGERSI_CLASS; ++ ++ if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS ++ || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS) ++ return X86_64_INTEGER_CLASS; ++ ++ /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class, ++ MEMORY is used. */ ++ if (class1 == X86_64_X87_CLASS ++ || class1 == X86_64_X87UP_CLASS ++ || class1 == X86_64_COMPLEX_X87_CLASS ++ || class2 == X86_64_X87_CLASS ++ || class2 == X86_64_X87UP_CLASS ++ || class2 == X86_64_COMPLEX_X87_CLASS) ++ return X86_64_MEMORY_CLASS; ++ ++ /* Rule #6: Otherwise class SSE is used. */ ++ return X86_64_SSE_CLASS; ++} ++ ++/* Classify the argument of type TYPE and mode MODE. ++ CLASSES will be filled by the register class used to pass each word ++ of the operand. The number of words is returned. In case the parameter ++ should be passed in memory, 0 is returned. As a special case for zero ++ sized containers, classes[0] will be NO_CLASS and 1 is returned. ++ ++ See the x86-64 PS ABI for details. */ ++ ++static int ++classify_argument( ++ ffi_type* type, ++ enum x86_64_reg_class classes[], ++ size_t byte_offset) ++{ ++ switch (type->type) ++ { ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_POINTER: ++#if 0 ++ if (byte_offset + type->size <= 4) ++ classes[0] = X86_64_INTEGERSI_CLASS; ++ else ++ classes[0] = X86_64_INTEGER_CLASS; ++ ++ return 1; ++#else ++ { ++ int size = byte_offset + type->size; ++ ++ if (size <= 4) ++ { ++ classes[0] = X86_64_INTEGERSI_CLASS; ++ return 1; ++ } ++ else if (size <= 8) ++ { ++ classes[0] = X86_64_INTEGER_CLASS; ++ return 1; ++ } ++ else if (size <= 12) ++ { ++ classes[0] = X86_64_INTEGER_CLASS; ++ classes[1] = X86_64_INTEGERSI_CLASS; ++ return 2; ++ } ++ else if (size <= 16) ++ { ++ classes[0] = classes[1] = X86_64_INTEGERSI_CLASS; ++ return 2; ++ } ++ else ++ FFI_ASSERT (0); ++ } ++#endif ++ ++ case FFI_TYPE_FLOAT: ++ if (byte_offset == 0) ++ classes[0] = X86_64_SSESF_CLASS; ++ else ++ classes[0] = X86_64_SSE_CLASS; ++ ++ return 1; ++ ++ case FFI_TYPE_DOUBLE: ++ classes[0] = X86_64_SSEDF_CLASS; ++ return 1; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ classes[0] = X86_64_X87_CLASS; ++ classes[1] = X86_64_X87UP_CLASS; ++ return 2; ++ ++ case FFI_TYPE_STRUCT: ++ { ++ ffi_type** ptr; ++ int i; ++ enum x86_64_reg_class subclasses[MAX_CLASSES]; ++ const int UNITS_PER_WORD = 8; ++ int words = ++ (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; ++ ++ /* If the struct is larger than 16 bytes, pass it on the stack. */ ++ if (type->size > 16) ++ return 0; ++ ++ for (i = 0; i < words; i++) ++ classes[i] = X86_64_NO_CLASS; ++ ++ /* Merge the fields of structure. */ ++ for (ptr = type->elements; *ptr != NULL; ptr++) ++ { ++ byte_offset = ALIGN(byte_offset, (*ptr)->alignment); ++ ++ int num = classify_argument(*ptr, subclasses, byte_offset % 8); ++ ++ if (num == 0) ++ return 0; ++ ++ int pos = byte_offset / 8; ++ ++ for (i = 0; i < num; i++) ++ { ++ classes[i + pos] = ++ merge_classes(subclasses[i], classes[i + pos]); ++ } ++ ++ byte_offset += (*ptr)->size; ++ } ++ ++ if (words > 2) ++ { ++ /* When size > 16 bytes, if the first one isn't ++ X86_64_SSE_CLASS or any other ones aren't ++ X86_64_SSEUP_CLASS, everything should be passed in ++ memory. */ ++ if (classes[0] != X86_64_SSE_CLASS) ++ return 0; ++ ++ for (i = 1; i < words; i++) ++ if (classes[i] != X86_64_SSEUP_CLASS) ++ return 0; ++ } ++ ++ ++ /* Final merger cleanup. */ ++ for (i = 0; i < words; i++) ++ { ++ /* If one class is MEMORY, everything should be passed in ++ memory. */ ++ if (classes[i] == X86_64_MEMORY_CLASS) ++ return 0; ++ ++ /* The X86_64_SSEUP_CLASS should be always preceded by ++ X86_64_SSE_CLASS. */ ++ if (classes[i] == X86_64_SSEUP_CLASS ++ && classes[i - 1] != X86_64_SSE_CLASS ++ && classes[i - 1] != X86_64_SSEUP_CLASS) ++ { ++ FFI_ASSERT(i != 0); ++ classes[i] = X86_64_SSE_CLASS; ++ } ++ ++ /* X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS. */ ++ if (classes[i] == X86_64_X87UP_CLASS ++ && classes[i - 1] != X86_64_X87_CLASS) ++ { ++ FFI_ASSERT(i != 0); ++ classes[i] = X86_64_SSE_CLASS; ++ } ++ } ++ ++ return words; ++ } ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ ++ return 0; /* Never reached. */ ++} ++ ++/* Examine the argument and return set number of register required in each ++ class. Return zero if parameter should be passed in memory, otherwise ++ the number of registers. */ ++static int ++examine_argument( ++ ffi_type* type, ++ enum x86_64_reg_class classes[MAX_CLASSES], ++ _Bool in_return, ++ int* pngpr, ++ int* pnsse) ++{ ++ int n = classify_argument(type, classes, 0); ++ int ngpr = 0; ++ int nsse = 0; ++ int i; ++ ++ if (n == 0) ++ return 0; ++ ++ for (i = 0; i < n; ++i) ++ { ++ switch (classes[i]) ++ { ++ case X86_64_INTEGER_CLASS: ++ case X86_64_INTEGERSI_CLASS: ++ ngpr++; ++ break; ++ ++ case X86_64_SSE_CLASS: ++ case X86_64_SSESF_CLASS: ++ case X86_64_SSEDF_CLASS: ++ nsse++; ++ break; ++ ++ case X86_64_NO_CLASS: ++ case X86_64_SSEUP_CLASS: ++ break; ++ ++ case X86_64_X87_CLASS: ++ case X86_64_X87UP_CLASS: ++ case X86_64_COMPLEX_X87_CLASS: ++ return in_return != 0; ++ ++ default: ++ abort(); ++ } ++ } ++ ++ *pngpr = ngpr; ++ *pnsse = nsse; ++ ++ return n; ++} ++ ++/* Perform machine dependent cif processing. */ ++ffi_status ++ffi_prep_cif_machdep( ++ ffi_cif* cif) ++{ ++ int gprcount = 0; ++ int ssecount = 0; ++ int flags = cif->rtype->type; ++ int i, avn, n, ngpr, nsse; ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ size_t bytes; ++ ++ if (flags != FFI_TYPE_VOID) ++ { ++ n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); ++ ++ if (n == 0) ++ { ++ /* The return value is passed in memory. A pointer to that ++ memory is the first argument. Allocate a register for it. */ ++ gprcount++; ++ ++ /* We don't have to do anything in asm for the return. */ ++ flags = FFI_TYPE_VOID; ++ } ++ else if (flags == FFI_TYPE_STRUCT) ++ { ++ /* Mark which registers the result appears in. */ ++ _Bool sse0 = SSE_CLASS_P(classes[0]); ++ _Bool sse1 = n == 2 && SSE_CLASS_P(classes[1]); ++ ++ if (sse0 && !sse1) ++ flags |= 1 << 8; ++ else if (!sse0 && sse1) ++ flags |= 1 << 9; ++ else if (sse0 && sse1) ++ flags |= 1 << 10; ++ ++ /* Mark the true size of the structure. */ ++ flags |= cif->rtype->size << 12; ++ } ++ } ++ ++ /* Go over all arguments and determine the way they should be passed. ++ If it's in a register and there is space for it, let that be so. If ++ not, add it's size to the stack byte count. */ ++ for (bytes = 0, i = 0, avn = cif->nargs; i < avn; i++) ++ { ++ if (examine_argument(cif->arg_types[i], classes, 0, &ngpr, &nsse) == 0 ++ || gprcount + ngpr > MAX_GPR_REGS ++ || ssecount + nsse > MAX_SSE_REGS) ++ { ++ long align = cif->arg_types[i]->alignment; ++ ++ if (align < 8) ++ align = 8; ++ ++ bytes = ALIGN(bytes, align); ++ bytes += cif->arg_types[i]->size; ++ } ++ else ++ { ++ gprcount += ngpr; ++ ssecount += nsse; ++ } ++ } ++ ++ if (ssecount) ++ flags |= 1 << 11; ++ ++ cif->flags = flags; ++ cif->bytes = bytes; ++ cif->bytes = ALIGN(bytes,8); ++ ++ return FFI_OK; ++} ++ ++void ++ffi_call( ++ ffi_cif* cif, ++ void (*fn)(), ++ void* rvalue, ++ void** avalue) ++{ ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ char* stack; ++ char* argp; ++ ffi_type** arg_types; ++ int gprcount, ssecount, ngpr, nsse, i, avn; ++ _Bool ret_in_memory; ++ RegisterArgs* reg_args; ++ ++ /* Can't call 32-bit mode from 64-bit mode. */ ++ FFI_ASSERT(cif->abi == FFI_UNIX64); ++ ++ /* If the return value is a struct and we don't have a return value ++ address then we need to make one. Note the setting of flags to ++ VOID above in ffi_prep_cif_machdep. */ ++ ret_in_memory = (cif->rtype->type == FFI_TYPE_STRUCT ++ && (cif->flags & 0xff) == FFI_TYPE_VOID); ++ ++ if (rvalue == NULL && ret_in_memory) ++ rvalue = alloca (cif->rtype->size); ++ ++ /* Allocate the space for the arguments, plus 4 words of temp space. */ ++ stack = alloca(sizeof(RegisterArgs) + cif->bytes + 4 * 8); ++ reg_args = (RegisterArgs*)stack; ++ argp = stack + sizeof(RegisterArgs); ++ ++ gprcount = ssecount = 0; ++ ++ /* If the return value is passed in memory, add the pointer as the ++ first integer argument. */ ++ if (ret_in_memory) ++ reg_args->gpr[gprcount++] = (long) rvalue; ++ ++ avn = cif->nargs; ++ arg_types = cif->arg_types; ++ ++ for (i = 0; i < avn; ++i) ++ { ++ size_t size = arg_types[i]->size; ++ int n; ++ ++ n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); ++ ++ if (n == 0 ++ || gprcount + ngpr > MAX_GPR_REGS ++ || ssecount + nsse > MAX_SSE_REGS) ++ { ++ long align = arg_types[i]->alignment; ++ ++ /* Stack arguments are *always* at least 8 byte aligned. */ ++ if (align < 8) ++ align = 8; ++ ++ /* Pass this argument in memory. */ ++ argp = (void *) ALIGN (argp, align); ++ memcpy (argp, avalue[i], size); ++ argp += size; ++ } ++ else ++ { /* The argument is passed entirely in registers. */ ++ char *a = (char *) avalue[i]; ++ int j; ++ ++ for (j = 0; j < n; j++, a += 8, size -= 8) ++ { ++ switch (classes[j]) ++ { ++ case X86_64_INTEGER_CLASS: ++ case X86_64_INTEGERSI_CLASS: ++ reg_args->gpr[gprcount] = 0; ++ switch (arg_types[i]->type) { ++ case FFI_TYPE_SINT8: ++ { ++ int8_t shortval = *(int8_t*)a; ++ int64_t actval = (int64_t)shortval; ++ reg_args->gpr[gprcount] = actval; ++ /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ ++ break; ++ } ++ ++ case FFI_TYPE_SINT16: ++ { ++ int16_t shortval = *(int16_t*)a; ++ int64_t actval = (int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ case FFI_TYPE_SINT32: ++ { ++ int32_t shortval = *(int32_t*)a; ++ int64_t actval = (int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ case FFI_TYPE_UINT8: ++ { ++ u_int8_t shortval = *(u_int8_t*)a; ++ u_int64_t actval = (u_int64_t)shortval; ++ /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ ++ reg_args->gpr[gprcount] = actval; ++ break; ++ } ++ ++ case FFI_TYPE_UINT16: ++ { ++ u_int16_t shortval = *(u_int16_t*)a; ++ u_int64_t actval = (u_int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ case FFI_TYPE_UINT32: ++ { ++ u_int32_t shortval = *(u_int32_t*)a; ++ u_int64_t actval = (u_int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ default: ++ //memcpy (®_args->gpr[gprcount], a, size < 8 ? size : 8); ++ reg_args->gpr[gprcount] = *(int64_t*)a; ++ } ++ gprcount++; ++ break; ++ ++ case X86_64_SSE_CLASS: ++ case X86_64_SSEDF_CLASS: ++ reg_args->sse[ssecount++] = *(UINT64 *) a; ++ break; ++ ++ case X86_64_SSESF_CLASS: ++ reg_args->sse[ssecount++] = *(UINT32 *) a; ++ break; ++ ++ default: ++ abort(); ++ } ++ } ++ } ++ } ++ ++ ffi_call_unix64 (stack, cif->bytes + sizeof(RegisterArgs), ++ cif->flags, rvalue, fn, ssecount); ++} ++ ++extern void ffi_closure_unix64(void); ++ ++ffi_status ++ffi_prep_closure( ++ ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*, void*, void**, void*), ++ void* user_data) ++{ ++ if (cif->abi != FFI_UNIX64) ++ return FFI_BAD_ABI; ++ ++ volatile unsigned short* tramp = ++ (volatile unsigned short*)&closure->tramp[0]; ++ ++ tramp[0] = 0xbb49; /* mov , %r11 */ ++ *(void* volatile*)&tramp[1] = ffi_closure_unix64; ++ tramp[5] = 0xba49; /* mov , %r10 */ ++ *(void* volatile*)&tramp[6] = closure; ++ ++ /* Set the carry bit if the function uses any sse registers. ++ This is clc or stc, together with the first byte of the jmp. */ ++ tramp[10] = cif->flags & (1 << 11) ? 0x49f9 : 0x49f8; ++ tramp[11] = 0xe3ff; /* jmp *%r11 */ ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ ++ return FFI_OK; ++} ++ ++#pragma clang diagnostic push ++#pragma clang diagnostic ignored "-Wmissing-prototypes" ++int ++ffi_closure_unix64_inner( ++ ffi_closure* closure, ++ void* rvalue, ++ RegisterArgs* reg_args, ++ char* argp) ++#pragma clang diagnostic pop ++{ ++ ffi_cif* cif = closure->cif; ++ void** avalue = alloca(cif->nargs * sizeof(void *)); ++ ffi_type** arg_types; ++ long i, avn; ++ int gprcount = 0; ++ int ssecount = 0; ++ int ngpr, nsse; ++ int ret; ++ ++ ret = cif->rtype->type; ++ ++ if (ret != FFI_TYPE_VOID) ++ { ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ int n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); ++ ++ if (n == 0) ++ { ++ /* The return value goes in memory. Arrange for the closure ++ return value to go directly back to the original caller. */ ++ rvalue = (void *) reg_args->gpr[gprcount++]; ++ ++ /* We don't have to do anything in asm for the return. */ ++ ret = FFI_TYPE_VOID; ++ } ++ else if (ret == FFI_TYPE_STRUCT && n == 2) ++ { ++ /* Mark which register the second word of the structure goes in. */ ++ _Bool sse0 = SSE_CLASS_P (classes[0]); ++ _Bool sse1 = SSE_CLASS_P (classes[1]); ++ ++ if (!sse0 && sse1) ++ ret |= 1 << 8; ++ else if (sse0 && !sse1) ++ ret |= 1 << 9; ++ } ++ } ++ ++ avn = cif->nargs; ++ arg_types = cif->arg_types; ++ ++ for (i = 0; i < avn; ++i) ++ { ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ int n; ++ ++ n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); ++ ++ if (n == 0 ++ || gprcount + ngpr > MAX_GPR_REGS ++ || ssecount + nsse > MAX_SSE_REGS) ++ { ++ long align = arg_types[i]->alignment; ++ ++ /* Stack arguments are *always* at least 8 byte aligned. */ ++ if (align < 8) ++ align = 8; ++ ++ /* Pass this argument in memory. */ ++ argp = (void *) ALIGN (argp, align); ++ avalue[i] = argp; ++ argp += arg_types[i]->size; ++ } ++ ++#if !defined(X86_DARWIN) ++ /* If the argument is in a single register, or two consecutive ++ registers, then we can use that address directly. */ ++ else if (n == 1 || (n == 2 && ++ SSE_CLASS_P (classes[0]) == SSE_CLASS_P (classes[1]))) ++ { ++ // The argument is in a single register. ++ if (SSE_CLASS_P (classes[0])) ++ { ++ avalue[i] = ®_args->sse[ssecount]; ++ ssecount += n; ++ } ++ else ++ { ++ avalue[i] = ®_args->gpr[gprcount]; ++ gprcount += n; ++ } ++ } ++#endif ++ ++ /* Otherwise, allocate space to make them consecutive. */ ++ else ++ { ++ char *a = alloca (16); ++ int j; ++ ++ avalue[i] = a; ++ ++ for (j = 0; j < n; j++, a += 8) ++ { ++ if (SSE_CLASS_P (classes[j])) ++ memcpy (a, ®_args->sse[ssecount++], 8); ++ else ++ memcpy (a, ®_args->gpr[gprcount++], 8); ++ } ++ } ++ } ++ ++ /* Invoke the closure. */ ++ closure->fun (cif, rvalue, avalue, closure->user_data); ++ ++ /* Tell assembly how to perform return type promotions. */ ++ return ret; ++} ++ ++#endif /* __x86_64__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c +new file mode 100644 +index 0000000..706ea0f +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c +@@ -0,0 +1,438 @@ ++#ifdef __i386__ ++/* ----------------------------------------------------------------------- ++ ffi.c - Copyright (c) 1996, 1998, 1999, 2001 Red Hat, Inc. ++ Copyright (c) 2002 Ranjit Mathew ++ Copyright (c) 2002 Bo Thorsen ++ Copyright (c) 2002 Roger Sayle ++ ++ x86 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++ ++/* ffi_prep_args is called by the assembly routine once stack space ++ has been allocated for the function's arguments */ ++ ++void ffi_prep_args(char *stack, extended_cif *ecif); ++ ++void ffi_prep_args(char *stack, extended_cif *ecif) ++{ ++ register unsigned int i; ++ register void **p_argv; ++ register char *argp; ++ register ffi_type **p_arg; ++ ++ argp = stack; ++ ++ if (ecif->cif->flags == FFI_TYPE_STRUCT) ++ { ++ *(void **) argp = ecif->rvalue; ++ argp += 4; ++ } ++ ++ p_argv = ecif->avalue; ++ ++ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; ++ i != 0; ++ i--, p_arg++) ++ { ++ size_t z; ++ ++ /* Align if necessary */ ++ if ((sizeof(int) - 1) & (unsigned) argp) ++ argp = (char *) ALIGN(argp, sizeof(int)); ++ ++ z = (*p_arg)->size; ++ if (z < sizeof(int)) ++ { ++ z = sizeof(int); ++ switch ((*p_arg)->type) ++ { ++ case FFI_TYPE_SINT8: ++ *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT8: ++ *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_SINT16: ++ *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT16: ++ *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_SINT32: ++ *(signed int *) argp = (signed int)*(SINT32 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT32: ++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ } ++ else ++ { ++ memcpy(argp, *p_argv, z); ++ } ++ p_argv++; ++ argp += z; ++ } ++ ++ return; ++} ++ ++/* Perform machine dependent cif processing */ ++ffi_status ffi_prep_cif_machdep(ffi_cif *cif) ++{ ++ /* Set the return type flag */ ++ switch (cif->rtype->type) ++ { ++ case FFI_TYPE_VOID: ++#ifdef X86 ++ case FFI_TYPE_STRUCT: ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_SINT16: ++#endif ++ ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ case FFI_TYPE_LONGDOUBLE: ++ cif->flags = (unsigned) cif->rtype->type; ++ break; ++ ++ case FFI_TYPE_UINT64: ++ cif->flags = FFI_TYPE_SINT64; ++ break; ++ ++#ifndef X86 ++ case FFI_TYPE_STRUCT: ++ if (cif->rtype->size == 1) ++ { ++ cif->flags = FFI_TYPE_SINT8; /* same as char size */ ++ } ++ else if (cif->rtype->size == 2) ++ { ++ cif->flags = FFI_TYPE_SINT16; /* same as short size */ ++ } ++ else if (cif->rtype->size == 4) ++ { ++ cif->flags = FFI_TYPE_INT; /* same as int type */ ++ } ++ else if (cif->rtype->size == 8) ++ { ++ cif->flags = FFI_TYPE_SINT64; /* same as int64 type */ ++ } ++ else ++ { ++ cif->flags = FFI_TYPE_STRUCT; ++ } ++ break; ++#endif ++ ++ default: ++ cif->flags = FFI_TYPE_INT; ++ break; ++ } ++ ++#ifdef X86_DARWIN ++ cif->bytes = (cif->bytes + 15) & ~0xF; ++#endif ++ ++ return FFI_OK; ++} ++ ++extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, ++ unsigned, unsigned, unsigned *, void (*fn)()); ++ ++#ifdef X86_WIN32 ++extern void ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, ++ unsigned, unsigned, unsigned *, void (*fn)()); ++ ++#endif /* X86_WIN32 */ ++ ++void ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue) ++{ ++ extended_cif ecif; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return */ ++ /* value address then we need to make one */ ++ ++ if ((rvalue == NULL) && ++ (cif->flags == FFI_TYPE_STRUCT)) ++ { ++ ecif.rvalue = alloca(cif->rtype->size); ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ ++ switch (cif->abi) ++ { ++ case FFI_SYSV: ++ ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, ++ fn); ++ break; ++#ifdef X86_WIN32 ++ case FFI_STDCALL: ++ ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ break; ++#endif /* X86_WIN32 */ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++ ++/** private members **/ ++ ++static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, ++ void** args, ffi_cif* cif); ++void FFI_HIDDEN ffi_closure_SYSV (ffi_closure *) ++__attribute__ ((regparm(1))); ++unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *) ++__attribute__ ((regparm(1))); ++void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *) ++__attribute__ ((regparm(1))); ++ ++/* This function is jumped to by the trampoline */ ++ ++unsigned int FFI_HIDDEN ++ffi_closure_SYSV_inner (closure, respp, args) ++ffi_closure *closure; ++void **respp; ++void *args; ++{ ++ // our various things... ++ ffi_cif *cif; ++ void **arg_area; ++ ++ cif = closure->cif; ++ arg_area = (void**) alloca (cif->nargs * sizeof (void*)); ++ ++ /* this call will initialize ARG_AREA, such that each ++ * element in that array points to the corresponding ++ * value on the stack; and if the function returns ++ * a structure, it will re-set RESP to point to the ++ * structure return address. */ ++ ++ ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); ++ ++ (closure->fun) (cif, *respp, arg_area, closure->user_data); ++ ++ return cif->flags; ++} ++ ++static void ++ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue, ++ ffi_cif *cif) ++{ ++ register unsigned int i; ++ register void **p_argv; ++ register char *argp; ++ register ffi_type **p_arg; ++ ++ argp = stack; ++ ++ if ( cif->flags == FFI_TYPE_STRUCT ) { ++ *rvalue = *(void **) argp; ++ argp += 4; ++ } ++ ++ p_argv = avalue; ++ ++ for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) ++ { ++ size_t z; ++ ++ /* Align if necessary */ ++ if ((sizeof(int) - 1) & (unsigned) argp) { ++ argp = (char *) ALIGN(argp, sizeof(int)); ++ } ++ ++ z = (*p_arg)->size; ++ ++ /* because we're little endian, this is what it turns into. */ ++ ++ *p_argv = (void*) argp; ++ ++ p_argv++; ++ argp += z; ++ } ++ ++ return; ++} ++ ++/* How to make a trampoline. Derived from gcc/config/i386/i386.c. */ ++ ++#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ ++({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ ++unsigned int __fun = (unsigned int)(FUN); \ ++unsigned int __ctx = (unsigned int)(CTX); \ ++unsigned int __dis = __fun - (__ctx + FFI_TRAMPOLINE_SIZE); \ ++*(unsigned char*) &__tramp[0] = 0xb8; \ ++*(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \ ++*(unsigned char *) &__tramp[5] = 0xe9; \ ++*(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \ ++}) ++ ++ ++/* the cif must already be prep'ed */ ++ffi_status ++ffi_prep_closure (ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,void**,void*), ++ void *user_data) ++{ ++ if (cif->abi != FFI_SYSV) ++ return FFI_BAD_ABI; ++ ++ FFI_INIT_TRAMPOLINE (&closure->tramp[0], \ ++ &ffi_closure_SYSV, \ ++ (void*)closure); ++ ++ closure->cif = cif; ++ closure->user_data = user_data; ++ closure->fun = fun; ++ ++ return FFI_OK; ++} ++ ++/* ------- Native raw API support -------------------------------- */ ++ ++#if !FFI_NO_RAW_API ++ ++ffi_status ++ffi_prep_raw_closure_loc (ffi_raw_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), ++ void *user_data, ++ void *codeloc) ++{ ++ int i; ++ ++ FFI_ASSERT (cif->abi == FFI_SYSV); ++ ++ // we currently don't support certain kinds of arguments for raw ++ // closures. This should be implemented by a separate assembly language ++ // routine, since it would require argument processing, something we ++ // don't do now for performance. ++ ++ for (i = cif->nargs-1; i >= 0; i--) ++ { ++ FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_STRUCT); ++ FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_LONGDOUBLE); ++ } ++ ++ ++ FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_raw_SYSV, ++ codeloc); ++ ++ closure->cif = cif; ++ closure->user_data = user_data; ++ closure->fun = fun; ++ ++ return FFI_OK; ++} ++ ++static void ++ffi_prep_args_raw(char *stack, extended_cif *ecif) ++{ ++ memcpy (stack, ecif->avalue, ecif->cif->bytes); ++} ++ ++/* we borrow this routine from libffi (it must be changed, though, to ++ * actually call the function passed in the first argument. as of ++ * libffi-1.20, this is not the case.) ++ */ ++ ++extern void ++ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, unsigned, ++ unsigned, unsigned *, void (*fn)()); ++ ++#ifdef X86_WIN32 ++extern void ++ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, unsigned, ++ unsigned, unsigned *, void (*fn)()); ++#endif /* X86_WIN32 */ ++ ++void ++ffi_raw_call(ffi_cif *cif, void (*fn)(), void *rvalue, ffi_raw *fake_avalue) ++{ ++ extended_cif ecif; ++ void **avalue = (void **)fake_avalue; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return */ ++ /* value address then we need to make one */ ++ ++ if ((rvalue == NULL) && ++ (cif->rtype->type == FFI_TYPE_STRUCT)) ++ { ++ ecif.rvalue = alloca(cif->rtype->size); ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ ++ switch (cif->abi) ++ { ++ case FFI_SYSV: ++ ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ break; ++#ifdef X86_WIN32 ++ case FFI_STDCALL: ++ ffi_call_STDCALL(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ break; ++#endif /* X86_WIN32 */ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++#endif ++#endif // __i386__ +diff -r -u ./setup.py ./setup.py +index 46b92fe..2bf6b4b 100644 +--- ./setup.py ++++ ./setup.py +@@ -98,8 +98,14 @@ class PyBuildExt(build_ext): + self.detect_modules() + + # Remove modules that are present on the disabled list +- self.extensions = [ext for ext in self.extensions +- if ext.name not in disabled_module_list] ++ extensions = [ext for ext in self.extensions ++ if ext.name not in disabled_module_list] ++ # move ctypes to the end, it depends on other modules ++ ext_map = dict((ext.name, i) for i, ext in enumerate(extensions)) ++ if "_ctypes" in ext_map: ++ ctypes = extensions.pop(ext_map["_ctypes"]) ++ extensions.append(ctypes) ++ self.extensions = extensions + + # Fix up the autodetected modules, prefixing all the source files + # with Modules/ and adding Python's include directory to the path. +@@ -1330,9 +1336,39 @@ class PyBuildExt(build_ext): + # *** Uncomment these for TOGL extension only: + # -lGL -lGLU -lXext -lXmu \ + ++ def configure_ctypes_darwin(self, ext): ++ # Darwin (OS X) uses preconfigured files, in ++ # the Modules/_ctypes/libffi_osx directory. ++ srcdir = sysconfig.get_config_var('srcdir') ++ ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', ++ '_ctypes', 'libffi_osx')) ++ sources = [os.path.join(ffi_srcdir, p) ++ for p in ['ffi.c', ++ 'x86/darwin64.S', ++ 'x86/x86-darwin.S', ++ 'x86/x86-ffi_darwin.c', ++ 'x86/x86-ffi64.c', ++ 'powerpc/ppc-darwin.S', ++ 'powerpc/ppc-darwin_closure.S', ++ 'powerpc/ppc-ffi_darwin.c', ++ 'powerpc/ppc64-darwin_closure.S', ++ ]] ++ ++ # Add .S (preprocessed assembly) to C compiler source extensions. ++ self.compiler.src_extensions.append('.S') ++ ++ include_dirs = [os.path.join(ffi_srcdir, 'include'), ++ os.path.join(ffi_srcdir, 'powerpc')] ++ ext.include_dirs.extend(include_dirs) ++ ext.sources.extend(sources) ++ return True ++ + def configure_ctypes(self, ext): + if not self.use_system_libffi: +- (srcdir,) = sysconfig.get_config_vars('srcdir') ++ if sys.platform == 'darwin': ++ return self.configure_ctypes_darwin(ext) ++ ++ srcdir = sysconfig.get_config_var('srcdir') + ffi_builddir = os.path.join(self.build_temp, 'libffi') + ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', + '_ctypes', 'libffi')) +@@ -1347,7 +1383,10 @@ class PyBuildExt(build_ext): + ffi_configfile): + from distutils.dir_util import mkpath + mkpath(ffi_builddir) +- config_args = [] ++ config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split() ++ if (('--host=' in arg) or ('--build=' in arg))] ++ if not self.verbose: ++ config_args.append("-q") + + # Pass empty CFLAGS because we'll just append the resulting + # CFLAGS to Python's; -g or -O2 is to be avoided. +@@ -1367,10 +1406,12 @@ class PyBuildExt(build_ext): + self.compiler.src_extensions.append('.S') + + include_dirs = [os.path.join(ffi_builddir, 'include'), +- ffi_builddir, ffi_srcdir] ++ ffi_builddir, ++ os.path.join(ffi_srcdir, 'src')] + extra_compile_args = fficonfig['ffi_cflags'].split() + +- ext.sources.extend(fficonfig['ffi_sources']) ++ ext.sources.extend(os.path.join(ffi_srcdir, f) for f in ++ fficonfig['ffi_sources']) + ext.include_dirs.extend(include_dirs) + ext.extra_compile_args.extend(extra_compile_args) + return True +@@ -1390,6 +1431,7 @@ class PyBuildExt(build_ext): + + if sys.platform == 'darwin': + sources.append('_ctypes/darwin/dlfcn_simple.c') ++ extra_compile_args.append('-DMACOSX') + include_dirs.append('_ctypes/darwin') + # XXX Is this still needed? + ## extra_link_args.extend(['-read_only_relocs', 'warning']) +@@ -1419,7 +1461,14 @@ class PyBuildExt(build_ext): + if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"): + return + +- ffi_inc = find_file('ffi.h', [], inc_dirs) ++ if sys.platform == 'darwin': ++ # OS X 10.5 comes with libffi.dylib; the include files are ++ # in /usr/include/ffi ++ inc_dirs.append('/usr/include/ffi') ++ ++ ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] ++ if not ffi_inc or ffi_inc[0] == '': ++ ffi_inc = find_file('ffi.h', [], inc_dirs) + if ffi_inc is not None: + ffi_h = ffi_inc[0] + '/ffi.h' + fp = open(ffi_h) diff --git a/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/005_osx_failed_modules.patch b/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/005_osx_failed_modules.patch new file mode 100644 index 0000000..5ccfe9c --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/005_osx_failed_modules.patch @@ -0,0 +1,124 @@ +diff -r -u ./Mac/Modules/cg/_CGmodule.c ./Mac/Modules/cg/_CGmodule.c +index 8115614..e36fce9 100755 +--- ./Mac/Modules/cg/_CGmodule.c ++++ ./Mac/Modules/cg/_CGmodule.c +@@ -1025,6 +1025,7 @@ static PyObject *CGContextRefObj_CGContextSetShouldAntialias(CGContextRefObject + return _res; + } + ++#ifndef __LP64__ + static PyObject *CGContextRefObj_SyncCGContextOriginWithPort(CGContextRefObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1055,6 +1056,7 @@ static PyObject *CGContextRefObj_ClipCGContextToRegion(CGContextRefObject *_self + _res = Py_None; + return _res; + } ++#endif + + static PyMethodDef CGContextRefObj_methods[] = { + {"CGContextSaveGState", (PyCFunction)CGContextRefObj_CGContextSaveGState, 1, +@@ -1173,10 +1175,12 @@ static PyMethodDef CGContextRefObj_methods[] = { + PyDoc_STR("() -> None")}, + {"CGContextSetShouldAntialias", (PyCFunction)CGContextRefObj_CGContextSetShouldAntialias, 1, + PyDoc_STR("(int shouldAntialias) -> None")}, ++#ifndef __LP64__ + {"SyncCGContextOriginWithPort", (PyCFunction)CGContextRefObj_SyncCGContextOriginWithPort, 1, + PyDoc_STR("(CGrafPtr port) -> None")}, + {"ClipCGContextToRegion", (PyCFunction)CGContextRefObj_ClipCGContextToRegion, 1, + PyDoc_STR("(Rect portRect, RgnHandle region) -> None")}, ++#endif + {NULL, NULL, 0} + }; + +@@ -1254,6 +1258,7 @@ PyTypeObject CGContextRef_Type = { + /* ------------------ End object type CGContextRef ------------------ */ + + ++#ifndef __LP64__ + static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1271,10 +1276,13 @@ static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) + return _res; + + } ++#endif + + static PyMethodDef CG_methods[] = { ++#ifndef __LP64__ + {"CreateCGContextForPort", (PyCFunction)CG_CreateCGContextForPort, 1, + PyDoc_STR("(CGrafPtr) -> CGContextRef")}, ++#endif + {NULL, NULL, 0} + }; + +diff -r -u ./Modules/_curses_panel.c ./Modules/_curses_panel.c +index 0acf3fd..1728b59 100644 +--- ./Modules/_curses_panel.c ++++ ./Modules/_curses_panel.c +@@ -56,7 +56,7 @@ typedef struct { + + PyTypeObject PyCursesPanel_Type; + +-#define PyCursesPanel_Check(v) ((v)->ob_type == &PyCursesPanel_Type) ++#define PyCursesPanel_Check(v) (Py_TYPE(v) == &PyCursesPanel_Type) + + /* Some helper functions. The problem is that there's always a window + associated with a panel. To ensure that Python's GC doesn't pull +@@ -178,12 +178,13 @@ PyCursesPanel_New(PANEL *pan, PyCursesWindowObject *wo) + po = PyObject_NEW(PyCursesPanelObject, &PyCursesPanel_Type); + if (po == NULL) return NULL; + po->pan = pan; +- po->wo = wo; +- Py_INCREF(wo); + if (insert_lop(po) < 0) { +- PyObject_DEL(po); +- return NULL; ++ po->wo = NULL; ++ Py_DECREF(po); ++ return NULL; + } ++ po->wo = wo; ++ Py_INCREF(wo); + return (PyObject *)po; + } + +@@ -191,8 +192,10 @@ static void + PyCursesPanel_Dealloc(PyCursesPanelObject *po) + { + (void)del_panel(po->pan); +- Py_DECREF(po->wo); +- remove_lop(po); ++ if (po->wo != NULL) { ++ Py_DECREF(po->wo); ++ remove_lop(po); ++ } + PyObject_DEL(po); + } + +@@ -338,11 +341,10 @@ PyCursesPanel_GetAttr(PyCursesPanelObject *self, char *name) + /* -------------------------------------------------------*/ + + PyTypeObject PyCursesPanel_Type = { +- PyObject_HEAD_INIT(NULL) +- 0, /*ob_size*/ +- "_curses_panel.curses panel", /*tp_name*/ +- sizeof(PyCursesPanelObject), /*tp_basicsize*/ +- 0, /*tp_itemsize*/ ++ PyVarObject_HEAD_INIT(NULL, 0) ++ "_curses_panel.curses panel", /*tp_name*/ ++ sizeof(PyCursesPanelObject), /*tp_basicsize*/ ++ 0, /*tp_itemsize*/ + /* methods */ + (destructor)PyCursesPanel_Dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ +@@ -458,7 +460,7 @@ init_curses_panel(void) + PyObject *m, *d, *v; + + /* Initialize object type */ +- PyCursesPanel_Type.ob_type = &PyType_Type; ++ Py_TYPE(&PyCursesPanel_Type) = &PyType_Type; + + import_curses(); + diff --git a/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/000_patch-setup.py.diff new file mode 100644 index 0000000..ffe4b0d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/000_patch-setup.py.diff @@ -0,0 +1,45 @@ +--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 ++++ setup.py 2011-07-07 19:25:04.548416377 +0900 +@@ -13,6 +13,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -242,10 +243,34 @@ + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ fp = open(tmpfile) ++ multiarch_path_component = fp.readline().strip() ++ fp.close() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. diff --git a/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/001_patch-svnversion.patch b/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/001_patch-svnversion.patch new file mode 100644 index 0000000..5ee39e9 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/001_patch-svnversion.patch @@ -0,0 +1,42 @@ +--- configure.in ++++ configure.in +@@ -767,7 +767,7 @@ + then + SVNVERSION="svnversion \$(srcdir)" + else +- SVNVERSION="echo exported" ++ SVNVERSION="echo Unversioned directory" + fi + + case $MACHDEP in +--- Makefile.pre.in ++++ Makefile.pre.in +@@ -501,7 +501,7 @@ + $(SIGNAL_OBJS) \ + $(MODOBJS) \ + $(srcdir)/Modules/getbuildinfo.c +- $(CC) -c $(PY_CFLAGS) -DSVNVERSION=\"`LC_ALL=C $(SVNVERSION)`\" -o $@ $(srcdir)/Modules/getbuildinfo.c ++ $(CC) -c $(PY_CFLAGS) -DSVNVERSION="\"`LC_ALL=C $(SVNVERSION)`\"" -o $@ $(srcdir)/Modules/getbuildinfo.c + + Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile + $(CC) -c $(PY_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ +--- Modules/getbuildinfo.c ++++ Modules/getbuildinfo.c +@@ -48,5 +48,5 @@ + static const char svnversion[] = SVNVERSION; + if (svnversion[0] != '$') + return svnversion; /* it was interpolated, or passed on command line */ +- return "exported"; ++ return "Unversioned directory"; + } +--- Python/sysmodule.c ++++ Python/sysmodule.c +@@ -1161,7 +1161,7 @@ + + + svnversion = _Py_svnversion(); +- if (strcmp(svnversion, "exported") != 0) ++ if (strcmp(svnversion, "Unversioned directory") != 0 && strcmp(svnversion, "exported") != 0) + svn_revision = svnversion; + else if (istag) { + len = strlen(_patchlevel_revision); diff --git a/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/002_darwin_c_source.patch b/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/002_darwin_c_source.patch new file mode 100644 index 0000000..8cef44a --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/002_darwin_c_source.patch @@ -0,0 +1,166 @@ +diff -r -u ./configure ../Python-2.5/configure +--- ./configure 2006-09-05 11:54:42.000000000 +0900 ++++ ../Python-2.5/configure 2013-07-19 15:27:46.000000000 +0900 +@@ -1396,6 +1396,16 @@ + _ACEOF + + ++# The later defininition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables ++# certain features on Mac OS X, so we need _DARWIN_C_SOURCE to re-enable ++# them. ++ ++cat >>confdefs.h <<\_ACEOF ++#define _DARWIN_C_SOURCE 1 ++_ACEOF ++ ++ ++ + define_xopen_source=yes + + # Arguments passed to configure. +@@ -3885,11 +3895,110 @@ + ;; + # is there any other compiler on Darwin besides gcc? + Darwin*) +- BASECFLAGS="$BASECFLAGS -Wno-long-double -no-cpp-precomp -mno-fused-madd" ++ # -Wno-long-double, -no-cpp-precomp, and -mno-fused-madd ++ # used to be here, but non-Apple gcc doesn't accept them. ++ if test "${CC}" = gcc ++ then ++ { echo "$as_me:${as_lineno-$LINENO}: checking which compiler should be used" >&5 ++echo -n "checking which compiler should be used... " >&6; } ++ case "${UNIVERSALSDK}" in ++ */MacOSX10.4u.sdk) ++ # Build using 10.4 SDK, force usage of gcc when the ++ # compiler is gcc, otherwise the user will get very ++ # confusing error messages when building on OSX 10.6 ++ CC=gcc-4.0 ++ CPP=cpp-4.0 ++ ;; ++ esac ++ { echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 ++echo "$CC" >&6; } ++ fi ++ ++ + if test "${enable_universalsdk}"; then +- BASECFLAGS="-arch ppc -arch i386 -isysroot ${UNIVERSALSDK} ${BASECFLAGS}" ++ UNIVERSAL_ARCH_FLAGS="" ++ if test "$UNIVERSAL_ARCHS" = "32-bit" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch ppc -arch i386" ++ ARCH_RUN_32BIT="" ++ LIPO_32BIT_FLAGS="" ++ elif test "$UNIVERSAL_ARCHS" = "64-bit" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64" ++ LIPO_32BIT_FLAGS="" ++ ARCH_RUN_32BIT="true" ++ ++ elif test "$UNIVERSAL_ARCHS" = "all" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64" ++ LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" ++ ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" ++ ++ elif test "$UNIVERSAL_ARCHS" = "intel" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64" ++ LIPO_32BIT_FLAGS="-extract i386" ++ ARCH_RUN_32BIT="/usr/bin/arch -i386" ++ ++ elif test "$UNIVERSAL_ARCHS" = "3-way" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch x86_64" ++ LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" ++ ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" ++ ++ else ++ as_fn_error $? "proper usage is --with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5 ++ ++ fi ++ ++ ++ CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" ++ if test "${UNIVERSALSDK}" != "/" ++ then ++ CFLAGS="-isysroot ${UNIVERSALSDK} ${CFLAGS}" ++ LDFLAGS="-isysroot ${UNIVERSALSDK} ${LDFLAGS}" ++ CPPFLAGS="-isysroot ${UNIVERSALSDK} ${CPPFLAGS}" ++ fi + fi + ++ # Calculate the right deployment target for this build. ++ # ++ cur_target=`sw_vers -productVersion | sed 's/\(10\.[0-9]*\).*/\1/'` ++ if test ${cur_target} '>' 10.2 && \ ++ test ${cur_target} '<' 10.6 ++ then ++ cur_target=10.3 ++ if test ${enable_universalsdk}; then ++ if test "${UNIVERSAL_ARCHS}" = "all"; then ++ # Ensure that the default platform for a ++ # 4-way universal build is OSX 10.5, ++ # that's the first OS release where ++ # 4-way builds make sense. ++ cur_target='10.5' ++ ++ elif test "${UNIVERSAL_ARCHS}" = "3-way"; then ++ cur_target='10.5' ++ ++ elif test "${UNIVERSAL_ARCHS}" = "intel"; then ++ cur_target='10.5' ++ ++ elif test "${UNIVERSAL_ARCHS}" = "64-bit"; then ++ cur_target='10.5' ++ fi ++ else ++ if test `/usr/bin/arch` = "i386"; then ++ # On Intel macs default to a deployment ++ # target of 10.4, that's the first OSX ++ # release with Intel support. ++ cur_target="10.4" ++ fi ++ fi ++ fi ++ CONFIGURE_MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET-${cur_target}} ++ ++ # Make sure that MACOSX_DEPLOYMENT_TARGET is set in the ++ # environment with a value that is the same as what we'll use ++ # in the Makefile to ensure that we'll get the same compiler ++ # environment during configure and build time. ++ MACOSX_DEPLOYMENT_TARGET="$CONFIGURE_MACOSX_DEPLOYMENT_TARGET" ++ export MACOSX_DEPLOYMENT_TARGET ++ EXPORT_MACOSX_DEPLOYMENT_TARGET='' ++ + ;; + OSF*) + BASECFLAGS="$BASECFLAGS -mieee" +@@ -10851,7 +10960,7 @@ + if test "${enable_universalsdk}"; then + : + else +- LIBTOOL_CRUFT="${LIBTOOL_CRUFT} -arch_only `arch`" ++ LIBTOOL_CRUFT="${LIBTOOL_CRUFT}" + fi + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; +@@ -10863,7 +10972,7 @@ + else + LIBTOOL_CRUFT="" + fi +- LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs -arch_only `arch`" ++ LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs" + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; + esac +diff -r -u ./pyconfig.h.in ../Python-2.5/pyconfig.h.in +--- ./pyconfig.h.in 2006-07-30 23:09:47.000000000 +0900 ++++ ../Python-2.5/pyconfig.h.in 2013-07-17 23:12:31.000000000 +0900 +@@ -912,6 +912,11 @@ + /* Define on Irix to enable u_int */ + #undef _BSD_TYPES + ++/* Define on Darwin to activate all library features */ ++#ifndef _DARWIN_C_SOURCE ++#define _DARWIN_C_SOURCE ++#endif ++ + /* This must be set to 64 on some systems to enable large file support. */ + #undef _FILE_OFFSET_BITS + diff --git a/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/003_osx_lp64.patch b/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/003_osx_lp64.patch new file mode 100644 index 0000000..fc07fc1 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/003_osx_lp64.patch @@ -0,0 +1,271 @@ +diff -r -u ./Include/pymactoolbox.h ../Python-2.5/Include/pymactoolbox.h +--- ./Include/pymactoolbox.h 2004-11-05 16:02:59.000000000 +0900 ++++ ../Python-2.5/Include/pymactoolbox.h 2013-07-17 23:38:51.000000000 +0900 +@@ -8,7 +8,10 @@ + #endif + + #include ++ ++#ifndef __LP64__ + #include ++#endif /* !__LP64__ */ + + /* + ** Helper routines for error codes and such. +@@ -18,8 +21,11 @@ + PyObject *PyMac_GetOSErrException(void); /* Initialize & return it */ + PyObject *PyErr_Mac(PyObject *, int); /* Exception with a mac error */ + PyObject *PyMac_Error(OSErr); /* Uses PyMac_GetOSErrException */ ++#ifndef __LP64__ + extern OSErr PyMac_GetFullPathname(FSSpec *, char *, int); /* convert + fsspec->path */ ++#endif /* __LP64__ */ ++ + /* + ** These conversion routines are defined in mactoolboxglue.c itself. + */ +@@ -83,8 +89,10 @@ + #endif /* USE_TOOLBOX_OBJECT_GLUE */ + + /* macfs exports */ ++#ifndef __LP64__ + int PyMac_GetFSSpec(PyObject *, FSSpec *); /* argument parser for FSSpec */ + PyObject *PyMac_BuildFSSpec(FSSpec *); /* Convert FSSpec to PyObject */ ++#endif /* !__LP64__ */ + + int PyMac_GetFSRef(PyObject *, FSRef *); /* argument parser for FSRef */ + PyObject *PyMac_BuildFSRef(FSRef *); /* Convert FSRef to PyObject */ +@@ -101,39 +109,54 @@ + extern int CmpInstObj_Convert(PyObject *, ComponentInstance *); + + /* Ctl exports */ ++#ifndef __LP64__ + extern PyObject *CtlObj_New(ControlHandle); + extern int CtlObj_Convert(PyObject *, ControlHandle *); ++#endif /* !__LP64__ */ + + /* Dlg exports */ ++#ifndef __LP64__ + extern PyObject *DlgObj_New(DialogPtr); + extern int DlgObj_Convert(PyObject *, DialogPtr *); + extern PyObject *DlgObj_WhichDialog(DialogPtr); ++#endif /* !__LP64__ */ + + /* Drag exports */ ++#ifndef __LP64__ + extern PyObject *DragObj_New(DragReference); + extern int DragObj_Convert(PyObject *, DragReference *); ++#endif /* !__LP64__ */ + + /* List exports */ ++#ifndef __LP64__ + extern PyObject *ListObj_New(ListHandle); + extern int ListObj_Convert(PyObject *, ListHandle *); ++#endif /* !__LP64__ */ + + /* Menu exports */ ++#ifndef __LP64__ + extern PyObject *MenuObj_New(MenuHandle); + extern int MenuObj_Convert(PyObject *, MenuHandle *); ++#endif /* !__LP64__ */ + + /* Qd exports */ ++#ifndef __LP64__ + extern PyObject *GrafObj_New(GrafPtr); + extern int GrafObj_Convert(PyObject *, GrafPtr *); + extern PyObject *BMObj_New(BitMapPtr); + extern int BMObj_Convert(PyObject *, BitMapPtr *); + extern PyObject *QdRGB_New(RGBColor *); + extern int QdRGB_Convert(PyObject *, RGBColor *); ++#endif /* !__LP64__ */ + + /* Qdoffs exports */ ++#ifndef __LP64__ + extern PyObject *GWorldObj_New(GWorldPtr); + extern int GWorldObj_Convert(PyObject *, GWorldPtr *); ++#endif /* !__LP64__ */ + + /* Qt exports */ ++#ifndef __LP64__ + extern PyObject *TrackObj_New(Track); + extern int TrackObj_Convert(PyObject *, Track *); + extern PyObject *MovieObj_New(Movie); +@@ -146,6 +169,7 @@ + extern int UserDataObj_Convert(PyObject *, UserData *); + extern PyObject *MediaObj_New(Media); + extern int MediaObj_Convert(PyObject *, Media *); ++#endif /* !__LP64__ */ + + /* Res exports */ + extern PyObject *ResObj_New(Handle); +@@ -154,13 +178,17 @@ + extern int OptResObj_Convert(PyObject *, Handle *); + + /* TE exports */ ++#ifndef __LP64__ + extern PyObject *TEObj_New(TEHandle); + extern int TEObj_Convert(PyObject *, TEHandle *); ++#endif /* !__LP64__ */ + + /* Win exports */ ++#ifndef __LP64__ + extern PyObject *WinObj_New(WindowPtr); + extern int WinObj_Convert(PyObject *, WindowPtr *); + extern PyObject *WinObj_WhichWindow(WindowPtr); ++#endif /* !__LP64__ */ + + /* CF exports */ + extern PyObject *CFObj_New(CFTypeRef); +diff -r -u ./Mac/Modules/res/_Resmodule.c ../Python-2.5/Mac/Modules/res/_Resmodule.c +--- ./Mac/Modules/res/_Resmodule.c 2005-07-04 05:59:44.000000000 +0900 ++++ ../Python-2.5/Mac/Modules/res/_Resmodule.c 2013-07-17 23:38:51.000000000 +0900 +@@ -414,6 +414,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *ResObj_as_Control(ResourceObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -431,6 +432,7 @@ + return _res; + + } ++#endif /* !__LP64__ */ + + static PyObject *ResObj_LoadResource(ResourceObject *_self, PyObject *_args) + { +@@ -1152,6 +1154,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *Res_OpenRFPerm(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1287,6 +1290,7 @@ + _res = Py_None; + return _res; + } ++#endif /* !__LP64__ */ + + static PyObject *Res_InsertResourceFile(PyObject *_self, PyObject *_args) + { +@@ -1327,6 +1331,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *Res_FSpResourceFileAlreadyOpen(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1413,6 +1418,7 @@ + nextRefNum); + return _res; + } ++#endif /* !__LP64__ */ + + static PyObject *Res_FSOpenResFile(PyObject *_self, PyObject *_args) + { +@@ -1438,6 +1444,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *Res_FSCreateResFile(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1534,6 +1541,7 @@ + PyMac_BuildFSSpec, &newSpec); + return _res; + } ++#endif /* __LP64__ */ + + static PyObject *Res_FSOpenResourceFile(PyObject *_self, PyObject *_args) + { +@@ -1637,6 +1645,7 @@ + PyDoc_STR("(short refNum) -> (short _rv)")}, + {"SetResFileAttrs", (PyCFunction)Res_SetResFileAttrs, 1, + PyDoc_STR("(short refNum, short attrs) -> None")}, ++#ifndef __LP64__ + {"OpenRFPerm", (PyCFunction)Res_OpenRFPerm, 1, + PyDoc_STR("(Str255 fileName, short vRefNum, SignedByte permission) -> (short _rv)")}, + {"HOpenResFile", (PyCFunction)Res_HOpenResFile, 1, +@@ -1647,10 +1656,12 @@ + PyDoc_STR("(FSSpec spec, SignedByte permission) -> (short _rv)")}, + {"FSpCreateResFile", (PyCFunction)Res_FSpCreateResFile, 1, + PyDoc_STR("(FSSpec spec, OSType creator, OSType fileType, ScriptCode scriptTag) -> None")}, ++#endif /* !__LP64__ */ + {"InsertResourceFile", (PyCFunction)Res_InsertResourceFile, 1, + PyDoc_STR("(SInt16 refNum, RsrcChainLocation where) -> None")}, + {"DetachResourceFile", (PyCFunction)Res_DetachResourceFile, 1, + PyDoc_STR("(SInt16 refNum) -> None")}, ++#ifndef __LP64__ + {"FSpResourceFileAlreadyOpen", (PyCFunction)Res_FSpResourceFileAlreadyOpen, 1, + PyDoc_STR("(FSSpec resourceFile) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, + {"FSpOpenOrphanResFile", (PyCFunction)Res_FSpOpenOrphanResFile, 1, +@@ -1659,14 +1670,17 @@ + PyDoc_STR("() -> (SInt16 refNum)")}, + {"GetNextResourceFile", (PyCFunction)Res_GetNextResourceFile, 1, + PyDoc_STR("(SInt16 curRefNum) -> (SInt16 nextRefNum)")}, ++#endif /* __LP64__ */ + {"FSOpenResFile", (PyCFunction)Res_FSOpenResFile, 1, + PyDoc_STR("(FSRef ref, SignedByte permission) -> (short _rv)")}, ++#ifndef __LP64__ + {"FSCreateResFile", (PyCFunction)Res_FSCreateResFile, 1, + PyDoc_STR("(FSRef parentRef, Buffer nameLength) -> (FSRef newRef, FSSpec newSpec)")}, + {"FSResourceFileAlreadyOpen", (PyCFunction)Res_FSResourceFileAlreadyOpen, 1, + PyDoc_STR("(FSRef resourceFileRef) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, + {"FSCreateResourceFile", (PyCFunction)Res_FSCreateResourceFile, 1, + PyDoc_STR("(FSRef parentRef, Buffer nameLength, Buffer forkNameLength) -> (FSRef newRef, FSSpec newSpec)")}, ++#endif /* __LP64__ */ + {"FSOpenResourceFile", (PyCFunction)Res_FSOpenResourceFile, 1, + PyDoc_STR("(FSRef ref, Buffer forkNameLength, SignedByte permissions) -> (SInt16 refNum)")}, + {"Handle", (PyCFunction)Res_Handle, 1, +diff -r -u ./Modules/_ctypes/libffi/src/darwin/ffitarget.h ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h +--- ./Modules/_ctypes/libffi/src/darwin/ffitarget.h 2006-05-26 06:58:05.000000000 +0900 ++++ ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h 2013-07-17 23:38:51.000000000 +0900 +@@ -4,7 +4,7 @@ + * created by configure). This makes is possible to build a univeral binary + * of ctypes in one go. + */ +-#if defined(__i386__) ++#if defined(__i386__) || defined(__x86_64__) + + #ifndef X86_DARWIN + #define X86_DARWIN +diff -r -u ./Python/mactoolboxglue.c ../Python-2.5/Python/mactoolboxglue.c +--- ./Python/mactoolboxglue.c 2006-07-12 01:44:25.000000000 +0900 ++++ ../Python-2.5/Python/mactoolboxglue.c 2013-07-17 23:39:09.000000000 +0900 +@@ -106,6 +106,7 @@ + } + + ++#ifndef __LP64__ + OSErr + PyMac_GetFullPathname(FSSpec *fss, char *path, int len) + { +@@ -153,6 +154,7 @@ + Py_XDECREF(fs); + return err; + } ++#endif /* !__LP64__ */ + + /* Convert a 4-char string object argument to an OSType value */ + int +@@ -417,6 +419,7 @@ + GLUE_NEW(GWorldPtr, GWorldObj_New, "Carbon.Qdoffs") + GLUE_CONVERT(GWorldPtr, GWorldObj_Convert, "Carbon.Qdoffs") + ++#ifndef __LP64__ + GLUE_NEW(Track, TrackObj_New, "Carbon.Qt") + GLUE_CONVERT(Track, TrackObj_Convert, "Carbon.Qt") + GLUE_NEW(Movie, MovieObj_New, "Carbon.Qt") +@@ -429,6 +432,7 @@ + GLUE_CONVERT(UserData, UserDataObj_Convert, "Carbon.Qt") + GLUE_NEW(Media, MediaObj_New, "Carbon.Qt") + GLUE_CONVERT(Media, MediaObj_Convert, "Carbon.Qt") ++#endif /* !__LP64__ */ + + GLUE_NEW(Handle, ResObj_New, "Carbon.Res") + GLUE_CONVERT(Handle, ResObj_Convert, "Carbon.Res") diff --git a/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/004_osx_libffi.patch b/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/004_osx_libffi.patch new file mode 100644 index 0000000..8318432 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/004_osx_libffi.patch @@ -0,0 +1,6881 @@ +diff -r -u ./Modules/_ctypes/libffi_osx/LICENSE ./Modules/_ctypes/libffi_osx/LICENSE +new file mode 100644 +index 0000000..f591795 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/LICENSE +@@ -0,0 +1,20 @@ ++libffi - Copyright (c) 1996-2003 Red Hat, Inc. ++ ++Permission is hereby granted, free of charge, to any person obtaining ++a copy of this software and associated documentation files (the ++``Software''), to deal in the Software without restriction, including ++without limitation the rights to use, copy, modify, merge, publish, ++distribute, sublicense, and/or sell copies of the Software, and to ++permit persons to whom the Software is furnished to do so, subject to ++the following conditions: ++ ++The above copyright notice and this permission notice shall be included ++in all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++OTHER DEALINGS IN THE SOFTWARE. +diff -r -u ./Modules/_ctypes/libffi_osx/README ./Modules/_ctypes/libffi_osx/README +new file mode 100644 +index 0000000..1fc2747 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/README +@@ -0,0 +1,500 @@ ++This directory contains the libffi package, which is not part of GCC but ++shipped with GCC as convenience. ++ ++Status ++====== ++ ++libffi-2.00 has not been released yet! This is a development snapshot! ++ ++libffi-1.20 was released on October 5, 1998. Check the libffi web ++page for updates: . ++ ++ ++What is libffi? ++=============== ++ ++Compilers for high level languages generate code that follow certain ++conventions. These conventions are necessary, in part, for separate ++compilation to work. One such convention is the "calling ++convention". The "calling convention" is essentially a set of ++assumptions made by the compiler about where function arguments will ++be found on entry to a function. A "calling convention" also specifies ++where the return value for a function is found. ++ ++Some programs may not know at the time of compilation what arguments ++are to be passed to a function. For instance, an interpreter may be ++told at run-time about the number and types of arguments used to call ++a given function. Libffi can be used in such programs to provide a ++bridge from the interpreter program to compiled code. ++ ++The libffi library provides a portable, high level programming ++interface to various calling conventions. This allows a programmer to ++call any function specified by a call interface description at run ++time. ++ ++Ffi stands for Foreign Function Interface. A foreign function ++interface is the popular name for the interface that allows code ++written in one language to call code written in another language. The ++libffi library really only provides the lowest, machine dependent ++layer of a fully featured foreign function interface. A layer must ++exist above libffi that handles type conversions for values passed ++between the two languages. ++ ++ ++Supported Platforms and Prerequisites ++===================================== ++ ++Libffi has been ported to: ++ ++ SunOS 4.1.3 & Solaris 2.x (SPARC-V8, SPARC-V9) ++ ++ Irix 5.3 & 6.2 (System V/o32 & n32) ++ ++ Intel x86 - Linux (System V ABI) ++ ++ Alpha - Linux and OSF/1 ++ ++ m68k - Linux (System V ABI) ++ ++ PowerPC - Linux (System V ABI, Darwin, AIX) ++ ++ ARM - Linux (System V ABI) ++ ++Libffi has been tested with the egcs 1.0.2 gcc compiler. Chances are ++that other versions will work. Libffi has also been built and tested ++with the SGI compiler tools. ++ ++On PowerPC, the tests failed (see the note below). ++ ++You must use GNU make to build libffi. SGI's make will not work. ++Sun's probably won't either. ++ ++If you port libffi to another platform, please let me know! I assume ++that some will be easy (x86 NetBSD), and others will be more difficult ++(HP). ++ ++ ++Installing libffi ++================= ++ ++[Note: before actually performing any of these installation steps, ++ you may wish to read the "Platform Specific Notes" below.] ++ ++First you must configure the distribution for your particular ++system. Go to the directory you wish to build libffi in and run the ++"configure" program found in the root directory of the libffi source ++distribution. ++ ++You may want to tell configure where to install the libffi library and ++header files. To do that, use the --prefix configure switch. Libffi ++will install under /usr/local by default. ++ ++If you want to enable extra run-time debugging checks use the the ++--enable-debug configure switch. This is useful when your program dies ++mysteriously while using libffi. ++ ++Another useful configure switch is --enable-purify-safety. Using this ++will add some extra code which will suppress certain warnings when you ++are using Purify with libffi. Only use this switch when using ++Purify, as it will slow down the library. ++ ++Configure has many other options. Use "configure --help" to see them all. ++ ++Once configure has finished, type "make". Note that you must be using ++GNU make. SGI's make will not work. Sun's probably won't either. ++You can ftp GNU make from prep.ai.mit.edu:/pub/gnu. ++ ++To ensure that libffi is working as advertised, type "make test". ++ ++To install the library and header files, type "make install". ++ ++ ++Using libffi ++============ ++ ++ The Basics ++ ---------- ++ ++Libffi assumes that you have a pointer to the function you wish to ++call and that you know the number and types of arguments to pass it, ++as well as the return type of the function. ++ ++The first thing you must do is create an ffi_cif object that matches ++the signature of the function you wish to call. The cif in ffi_cif ++stands for Call InterFace. To prepare a call interface object, use the ++following function: ++ ++ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, ++ unsigned int nargs, ++ ffi_type *rtype, ffi_type **atypes); ++ ++ CIF is a pointer to the call interface object you wish ++ to initialize. ++ ++ ABI is an enum that specifies the calling convention ++ to use for the call. FFI_DEFAULT_ABI defaults ++ to the system's native calling convention. Other ++ ABI's may be used with care. They are system ++ specific. ++ ++ NARGS is the number of arguments this function accepts. ++ libffi does not yet support vararg functions. ++ ++ RTYPE is a pointer to an ffi_type structure that represents ++ the return type of the function. Ffi_type objects ++ describe the types of values. libffi provides ++ ffi_type objects for many of the native C types: ++ signed int, unsigned int, signed char, unsigned char, ++ etc. There is also a pointer ffi_type object and ++ a void ffi_type. Use &ffi_type_void for functions that ++ don't return values. ++ ++ ATYPES is a vector of ffi_type pointers. ARGS must be NARGS long. ++ If NARGS is 0, this is ignored. ++ ++ ++ffi_prep_cif will return a status code that you are responsible ++for checking. It will be one of the following: ++ ++ FFI_OK - All is good. ++ ++ FFI_BAD_TYPEDEF - One of the ffi_type objects that ffi_prep_cif ++ came across is bad. ++ ++ ++Before making the call, the VALUES vector should be initialized ++with pointers to the appropriate argument values. ++ ++To call the function using the initialized ffi_cif, use the ++ffi_call function: ++ ++void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues); ++ ++ CIF is a pointer to the ffi_cif initialized specifically ++ for this function. ++ ++ FN is a pointer to the function you want to call. ++ ++ RVALUE is a pointer to a chunk of memory that is to hold the ++ result of the function call. Currently, it must be ++ at least one word in size (except for the n32 version ++ under Irix 6.x, which must be a pointer to an 8 byte ++ aligned value (a long long). It must also be at least ++ word aligned (depending on the return type, and the ++ system's alignment requirements). If RTYPE is ++ &ffi_type_void, this is ignored. If RVALUE is NULL, ++ the return value is discarded. ++ ++ AVALUES is a vector of void* that point to the memory locations ++ holding the argument values for a call. ++ If NARGS is 0, this is ignored. ++ ++ ++If you are expecting a return value from FN it will have been stored ++at RVALUE. ++ ++ ++ ++ An Example ++ ---------- ++ ++Here is a trivial example that calls puts() a few times. ++ ++ #include ++ #include ++ ++ int main() ++ { ++ ffi_cif cif; ++ ffi_type *args[1]; ++ void *values[1]; ++ char *s; ++ int rc; ++ ++ /* Initialize the argument info vectors */ ++ args[0] = &ffi_type_uint; ++ values[0] = &s; ++ ++ /* Initialize the cif */ ++ if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, ++ &ffi_type_uint, args) == FFI_OK) ++ { ++ s = "Hello World!"; ++ ffi_call(&cif, puts, &rc, values); ++ /* rc now holds the result of the call to puts */ ++ ++ /* values holds a pointer to the function's arg, so to ++ call puts() again all we need to do is change the ++ value of s */ ++ s = "This is cool!"; ++ ffi_call(&cif, puts, &rc, values); ++ } ++ ++ return 0; ++ } ++ ++ ++ ++ Aggregate Types ++ --------------- ++ ++Although libffi has no special support for unions or bit-fields, it is ++perfectly happy passing structures back and forth. You must first ++describe the structure to libffi by creating a new ffi_type object ++for it. Here is the definition of ffi_type: ++ ++ typedef struct _ffi_type ++ { ++ unsigned size; ++ short alignment; ++ short type; ++ struct _ffi_type **elements; ++ } ffi_type; ++ ++All structures must have type set to FFI_TYPE_STRUCT. You may set ++size and alignment to 0. These will be calculated and reset to the ++appropriate values by ffi_prep_cif(). ++ ++elements is a NULL terminated array of pointers to ffi_type objects ++that describe the type of the structure elements. These may, in turn, ++be structure elements. ++ ++The following example initializes a ffi_type object representing the ++tm struct from Linux's time.h: ++ ++ struct tm { ++ int tm_sec; ++ int tm_min; ++ int tm_hour; ++ int tm_mday; ++ int tm_mon; ++ int tm_year; ++ int tm_wday; ++ int tm_yday; ++ int tm_isdst; ++ /* Those are for future use. */ ++ long int __tm_gmtoff__; ++ __const char *__tm_zone__; ++ }; ++ ++ { ++ ffi_type tm_type; ++ ffi_type *tm_type_elements[12]; ++ int i; ++ ++ tm_type.size = tm_type.alignment = 0; ++ tm_type.elements = &tm_type_elements; ++ ++ for (i = 0; i < 9; i++) ++ tm_type_elements[i] = &ffi_type_sint; ++ ++ tm_type_elements[9] = &ffi_type_slong; ++ tm_type_elements[10] = &ffi_type_pointer; ++ tm_type_elements[11] = NULL; ++ ++ /* tm_type can now be used to represent tm argument types and ++ return types for ffi_prep_cif() */ ++ } ++ ++ ++ ++Platform Specific Notes ++======================= ++ ++ Intel x86 ++ --------- ++ ++There are no known problems with the x86 port. ++ ++ Sun SPARC - SunOS 4.1.3 & Solaris 2.x ++ ------------------------------------- ++ ++You must use GNU Make to build libffi on Sun platforms. ++ ++ MIPS - Irix 5.3 & 6.x ++ --------------------- ++ ++Irix 6.2 and better supports three different calling conventions: o32, ++n32 and n64. Currently, libffi only supports both o32 and n32 under ++Irix 6.x, but only o32 under Irix 5.3. Libffi will automatically be ++configured for whichever calling convention it was built for. ++ ++By default, the configure script will try to build libffi with the GNU ++development tools. To build libffi with the SGI development tools, set ++the environment variable CC to either "cc -32" or "cc -n32" before ++running configure under Irix 6.x (depending on whether you want an o32 ++or n32 library), or just "cc" for Irix 5.3. ++ ++With the n32 calling convention, when returning structures smaller ++than 16 bytes, be sure to provide an RVALUE that is 8 byte aligned. ++Here's one way of forcing this: ++ ++ double struct_storage[2]; ++ my_small_struct *s = (my_small_struct *) struct_storage; ++ /* Use s for RVALUE */ ++ ++If you don't do this you are liable to get spurious bus errors. ++ ++"long long" values are not supported yet. ++ ++You must use GNU Make to build libffi on SGI platforms. ++ ++ ARM - System V ABI ++ ------------------ ++ ++The ARM port was performed on a NetWinder running ARM Linux ELF ++(2.0.31) and gcc 2.8.1. ++ ++ ++ ++ PowerPC System V ABI ++ -------------------- ++ ++There are two `System V ABI's which libffi implements for PowerPC. ++They differ only in how small structures are returned from functions. ++ ++In the FFI_SYSV version, structures that are 8 bytes or smaller are ++returned in registers. This is what GCC does when it is configured ++for solaris, and is what the System V ABI I have (dated September ++1995) says. ++ ++In the FFI_GCC_SYSV version, all structures are returned the same way: ++by passing a pointer as the first argument to the function. This is ++what GCC does when it is configured for linux or a generic sysv ++target. ++ ++EGCS 1.0.1 (and probably other versions of EGCS/GCC) also has a ++inconsistency with the SysV ABI: When a procedure is called with many ++floating-point arguments, some of them get put on the stack. They are ++all supposed to be stored in double-precision format, even if they are ++only single-precision, but EGCS stores single-precision arguments as ++single-precision anyway. This causes one test to fail (the `many ++arguments' test). ++ ++ ++What's With The Crazy Comments? ++=============================== ++ ++You might notice a number of cryptic comments in the code, delimited ++by /*@ and @*/. These are annotations read by the program LCLint, a ++tool for statically checking C programs. You can read all about it at ++. ++ ++ ++History ++======= ++ ++1.20 Oct-5-98 ++ Raffaele Sena produces ARM port. ++ ++1.19 Oct-5-98 ++ Fixed x86 long double and long long return support. ++ m68k bug fixes from Andreas Schwab. ++ Patch for DU assembler compatibility for the Alpha from Richard ++ Henderson. ++ ++1.18 Apr-17-98 ++ Bug fixes and MIPS configuration changes. ++ ++1.17 Feb-24-98 ++ Bug fixes and m68k port from Andreas Schwab. PowerPC port from ++ Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes. ++ ++1.16 Feb-11-98 ++ Richard Henderson produces Alpha port. ++ ++1.15 Dec-4-97 ++ Fixed an n32 ABI bug. New libtool, auto* support. ++ ++1.14 May-13-97 ++ libtool is now used to generate shared and static libraries. ++ Fixed a minor portability problem reported by Russ McManus ++ . ++ ++1.13 Dec-2-96 ++ Added --enable-purify-safety to keep Purify from complaining ++ about certain low level code. ++ Sparc fix for calling functions with < 6 args. ++ Linux x86 a.out fix. ++ ++1.12 Nov-22-96 ++ Added missing ffi_type_void, needed for supporting void return ++ types. Fixed test case for non MIPS machines. Cygnus Support ++ is now Cygnus Solutions. ++ ++1.11 Oct-30-96 ++ Added notes about GNU make. ++ ++1.10 Oct-29-96 ++ Added configuration fix for non GNU compilers. ++ ++1.09 Oct-29-96 ++ Added --enable-debug configure switch. Clean-ups based on LCLint ++ feedback. ffi_mips.h is always installed. Many configuration ++ fixes. Fixed ffitest.c for sparc builds. ++ ++1.08 Oct-15-96 ++ Fixed n32 problem. Many clean-ups. ++ ++1.07 Oct-14-96 ++ Gordon Irlam rewrites v8.S again. Bug fixes. ++ ++1.06 Oct-14-96 ++ Gordon Irlam improved the sparc port. ++ ++1.05 Oct-14-96 ++ Interface changes based on feedback. ++ ++1.04 Oct-11-96 ++ Sparc port complete (modulo struct passing bug). ++ ++1.03 Oct-10-96 ++ Passing struct args, and returning struct values works for ++ all architectures/calling conventions. Expanded tests. ++ ++1.02 Oct-9-96 ++ Added SGI n32 support. Fixed bugs in both o32 and Linux support. ++ Added "make test". ++ ++1.01 Oct-8-96 ++ Fixed float passing bug in mips version. Restructured some ++ of the code. Builds cleanly with SGI tools. ++ ++1.00 Oct-7-96 ++ First release. No public announcement. ++ ++ ++Authors & Credits ++================= ++ ++libffi was written by Anthony Green . ++ ++Portions of libffi were derived from Gianni Mariani's free gencall ++library for Silicon Graphics machines. ++ ++The closure mechanism was designed and implemented by Kresten Krab ++Thorup. ++ ++The Sparc port was derived from code contributed by the fine folks at ++Visible Decisions Inc . Further enhancements were ++made by Gordon Irlam at Cygnus Solutions . ++ ++The Alpha port was written by Richard Henderson at Cygnus Solutions. ++ ++Andreas Schwab ported libffi to m68k Linux and provided a number of ++bug fixes. ++ ++Geoffrey Keating ported libffi to the PowerPC. ++ ++Raffaele Sena ported libffi to the ARM. ++ ++Jesper Skov and Andrew Haley both did more than their fair share of ++stepping through the code and tracking down bugs. ++ ++Thanks also to Tom Tromey for bug fixes and configuration help. ++ ++Thanks to Jim Blandy, who provided some useful feedback on the libffi ++interface. ++ ++If you have a problem, or have found a bug, please send a note to ++green@cygnus.com. +diff -r -u ./Modules/_ctypes/libffi_osx/README.pyobjc ./Modules/_ctypes/libffi_osx/README.pyobjc +new file mode 100644 +index 0000000..405d85f +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/README.pyobjc +@@ -0,0 +1,5 @@ ++This directory contains a slightly modified version of libffi, extracted from ++the GCC source-tree. ++ ++The only modifications are those that are necessary to compile libffi using ++the Apple provided compiler and outside of the GCC source tree. +diff -r -u ./Modules/_ctypes/libffi_osx/ffi.c ./Modules/_ctypes/libffi_osx/ffi.c +new file mode 100644 +index 0000000..bf42093 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/ffi.c +@@ -0,0 +1,226 @@ ++/* ----------------------------------------------------------------------- ++ prep_cif.c - Copyright (c) 1996, 1998 Red Hat, Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++#include ++ ++/* Round up to FFI_SIZEOF_ARG. */ ++#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG) ++ ++/* Perform machine independent initialization of aggregate type ++ specifications. */ ++ ++static ffi_status ++initialize_aggregate( ++/*@out@*/ ffi_type* arg) ++{ ++/*@-usedef@*/ ++ ++ if (arg == NULL || arg->elements == NULL || ++ arg->size != 0 || arg->alignment != 0) ++ return FFI_BAD_TYPEDEF; ++ ++ ffi_type** ptr = &(arg->elements[0]); ++ ++ while ((*ptr) != NULL) ++ { ++ if (((*ptr)->size == 0) && (initialize_aggregate(*ptr) != FFI_OK)) ++ return FFI_BAD_TYPEDEF; ++ ++ /* Perform a sanity check on the argument type */ ++ FFI_ASSERT_VALID_TYPE(*ptr); ++ ++#ifdef POWERPC_DARWIN ++ int curalign = (*ptr)->alignment; ++ ++ if (ptr != &(arg->elements[0])) ++ { ++ if (curalign > 4 && curalign != 16) ++ curalign = 4; ++ } ++ ++ arg->size = ALIGN(arg->size, curalign); ++ arg->size += (*ptr)->size; ++ arg->alignment = (arg->alignment > curalign) ? ++ arg->alignment : curalign; ++#else ++ arg->size = ALIGN(arg->size, (*ptr)->alignment); ++ arg->size += (*ptr)->size; ++ arg->alignment = (arg->alignment > (*ptr)->alignment) ? ++ arg->alignment : (*ptr)->alignment; ++#endif ++ ++ ptr++; ++ } ++ ++ /* Structure size includes tail padding. This is important for ++ structures that fit in one register on ABIs like the PowerPC64 ++ Linux ABI that right justify small structs in a register. ++ It's also needed for nested structure layout, for example ++ struct A { long a; char b; }; struct B { struct A x; char y; }; ++ should find y at an offset of 2*sizeof(long) and result in a ++ total size of 3*sizeof(long). */ ++ arg->size = ALIGN(arg->size, arg->alignment); ++ ++ if (arg->size == 0) ++ return FFI_BAD_TYPEDEF; ++ ++ return FFI_OK; ++ ++/*@=usedef@*/ ++} ++ ++#ifndef __CRIS__ ++/* The CRIS ABI specifies structure elements to have byte ++ alignment only, so it completely overrides this functions, ++ which assumes "natural" alignment and padding. */ ++ ++/* Perform machine independent ffi_cif preparation, then call ++ machine dependent routine. */ ++ ++#if defined(X86_DARWIN) ++ ++static inline bool ++struct_on_stack( ++ int size) ++{ ++ if (size > 8) ++ return true; ++ ++ /* This is not what the ABI says, but is what is really implemented */ ++ switch (size) ++ { ++ case 1: ++ case 2: ++ case 4: ++ case 8: ++ return false; ++ ++ default: ++ return true; ++ } ++} ++ ++#endif // defined(X86_DARWIN) ++ ++// Arguments' ffi_type->alignment must be nonzero. ++ffi_status ++ffi_prep_cif( ++/*@out@*/ /*@partial@*/ ffi_cif* cif, ++ ffi_abi abi, ++ unsigned int nargs, ++/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, ++/*@dependent@*/ ffi_type** atypes) ++{ ++ if (cif == NULL) ++ return FFI_BAD_TYPEDEF; ++ ++ if (abi <= FFI_FIRST_ABI || abi > FFI_DEFAULT_ABI) ++ return FFI_BAD_ABI; ++ ++ unsigned int bytes = 0; ++ unsigned int i; ++ ffi_type** ptr; ++ ++ cif->abi = abi; ++ cif->arg_types = atypes; ++ cif->nargs = nargs; ++ cif->rtype = rtype; ++ cif->flags = 0; ++ ++ /* Initialize the return type if necessary */ ++ /*@-usedef@*/ ++ if ((cif->rtype->size == 0) && (initialize_aggregate(cif->rtype) != FFI_OK)) ++ return FFI_BAD_TYPEDEF; ++ /*@=usedef@*/ ++ ++ /* Perform a sanity check on the return type */ ++ FFI_ASSERT_VALID_TYPE(cif->rtype); ++ ++ /* x86-64 and s390 stack space allocation is handled in prep_machdep. */ ++#if !defined M68K && !defined __x86_64__ && !defined S390 && !defined PA ++ /* Make space for the return structure pointer */ ++ if (cif->rtype->type == FFI_TYPE_STRUCT ++#ifdef SPARC ++ && (cif->abi != FFI_V9 || cif->rtype->size > 32) ++#endif ++#ifdef X86_DARWIN ++ && (struct_on_stack(cif->rtype->size)) ++#endif ++ ) ++ bytes = STACK_ARG_SIZE(sizeof(void*)); ++#endif ++ ++ for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) ++ { ++ /* Initialize any uninitialized aggregate type definitions */ ++ if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) ++ return FFI_BAD_TYPEDEF; ++ ++ if ((*ptr)->alignment == 0) ++ return FFI_BAD_TYPEDEF; ++ ++ /* Perform a sanity check on the argument type, do this ++ check after the initialization. */ ++ FFI_ASSERT_VALID_TYPE(*ptr); ++ ++#if defined(X86_DARWIN) ++ { ++ int align = (*ptr)->alignment; ++ ++ if (align > 4) ++ align = 4; ++ ++ if ((align - 1) & bytes) ++ bytes = ALIGN(bytes, align); ++ ++ bytes += STACK_ARG_SIZE((*ptr)->size); ++ } ++#elif !defined __x86_64__ && !defined S390 && !defined PA ++#ifdef SPARC ++ if (((*ptr)->type == FFI_TYPE_STRUCT ++ && ((*ptr)->size > 16 || cif->abi != FFI_V9)) ++ || ((*ptr)->type == FFI_TYPE_LONGDOUBLE ++ && cif->abi != FFI_V9)) ++ bytes += sizeof(void*); ++ else ++#endif ++ { ++ /* Add any padding if necessary */ ++ if (((*ptr)->alignment - 1) & bytes) ++ bytes = ALIGN(bytes, (*ptr)->alignment); ++ ++ bytes += STACK_ARG_SIZE((*ptr)->size); ++ } ++#endif ++ } ++ ++ cif->bytes = bytes; ++ ++ /* Perform machine dependent cif processing */ ++ return ffi_prep_cif_machdep(cif); ++} ++#endif /* not __CRIS__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi.h ./Modules/_ctypes/libffi_osx/include/ffi.h +new file mode 100644 +index 0000000..c104a5c +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ffi.h +@@ -0,0 +1,355 @@ ++/* -----------------------------------------------------------------*-C-*- ++ libffi PyOBJC - Copyright (c) 1996-2003 Red Hat, Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ++ ----------------------------------------------------------------------- */ ++ ++/* ------------------------------------------------------------------- ++ The basic API is described in the README file. ++ ++ The raw API is designed to bypass some of the argument packing ++ and unpacking on architectures for which it can be avoided. ++ ++ The closure API allows interpreted functions to be packaged up ++ inside a C function pointer, so that they can be called as C functions, ++ with no understanding on the client side that they are interpreted. ++ It can also be used in other cases in which it is necessary to package ++ up a user specified parameter and a function pointer as a single ++ function pointer. ++ ++ The closure API must be implemented in order to get its functionality, ++ e.g. for use by gij. Routines are provided to emulate the raw API ++ if the underlying platform doesn't allow faster implementation. ++ ++ More details on the raw and closure API can be found in: ++ ++ http://gcc.gnu.org/ml/java/1999-q3/msg00138.html ++ ++ and ++ ++ http://gcc.gnu.org/ml/java/1999-q3/msg00174.html ++ -------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_H ++#define LIBFFI_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/* Specify which architecture libffi is configured for. */ ++#ifdef MACOSX ++# if defined(__i386__) || defined(__x86_64__) ++# define X86_DARWIN ++# elif defined(__ppc__) || defined(__ppc64__) ++# define POWERPC_DARWIN ++# else ++# error "Unsupported MacOS X CPU type" ++# endif ++#else ++#error "Unsupported OS type" ++#endif ++ ++/* ---- System configuration information --------------------------------- */ ++ ++#include "ffitarget.h" ++#include "fficonfig.h" ++ ++#ifndef LIBFFI_ASM ++ ++#include ++#include ++ ++/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). ++ But we can find it either under the correct ANSI name, or under GNU ++ C's internal name. */ ++#ifdef LONG_LONG_MAX ++# define FFI_LONG_LONG_MAX LONG_LONG_MAX ++#else ++# ifdef LLONG_MAX ++# define FFI_LONG_LONG_MAX LLONG_MAX ++# else ++# ifdef __GNUC__ ++# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ ++# endif ++# endif ++#endif ++ ++#if SCHAR_MAX == 127 ++# define ffi_type_uchar ffi_type_uint8 ++# define ffi_type_schar ffi_type_sint8 ++#else ++#error "char size not supported" ++#endif ++ ++#if SHRT_MAX == 32767 ++# define ffi_type_ushort ffi_type_uint16 ++# define ffi_type_sshort ffi_type_sint16 ++#elif SHRT_MAX == 2147483647 ++# define ffi_type_ushort ffi_type_uint32 ++# define ffi_type_sshort ffi_type_sint32 ++#else ++#error "short size not supported" ++#endif ++ ++#if INT_MAX == 32767 ++# define ffi_type_uint ffi_type_uint16 ++# define ffi_type_sint ffi_type_sint16 ++#elif INT_MAX == 2147483647 ++# define ffi_type_uint ffi_type_uint32 ++# define ffi_type_sint ffi_type_sint32 ++#elif INT_MAX == 9223372036854775807 ++# define ffi_type_uint ffi_type_uint64 ++# define ffi_type_sint ffi_type_sint64 ++#else ++#error "int size not supported" ++#endif ++ ++#define ffi_type_ulong ffi_type_uint64 ++#define ffi_type_slong ffi_type_sint64 ++ ++#if LONG_MAX == 2147483647 ++# if FFI_LONG_LONG_MAX != 9223372036854775807 ++# error "no 64-bit data type supported" ++# endif ++#elif LONG_MAX != 9223372036854775807 ++#error "long size not supported" ++#endif ++ ++/* The closure code assumes that this works on pointers, i.e. a size_t ++ can hold a pointer. */ ++ ++typedef struct _ffi_type { ++ size_t size; ++ unsigned short alignment; ++ unsigned short type; ++/*@null@*/ struct _ffi_type** elements; ++} ffi_type; ++ ++/* These are defined in types.c */ ++extern ffi_type ffi_type_void; ++extern ffi_type ffi_type_uint8; ++extern ffi_type ffi_type_sint8; ++extern ffi_type ffi_type_uint16; ++extern ffi_type ffi_type_sint16; ++extern ffi_type ffi_type_uint32; ++extern ffi_type ffi_type_sint32; ++extern ffi_type ffi_type_uint64; ++extern ffi_type ffi_type_sint64; ++extern ffi_type ffi_type_float; ++extern ffi_type ffi_type_double; ++extern ffi_type ffi_type_longdouble; ++extern ffi_type ffi_type_pointer; ++ ++typedef enum ffi_status { ++ FFI_OK = 0, ++ FFI_BAD_TYPEDEF, ++ FFI_BAD_ABI ++} ffi_status; ++ ++typedef unsigned FFI_TYPE; ++ ++typedef struct ffi_cif { ++ ffi_abi abi; ++ unsigned nargs; ++/*@dependent@*/ ffi_type** arg_types; ++/*@dependent@*/ ffi_type* rtype; ++ unsigned bytes; ++ unsigned flags; ++#ifdef FFI_EXTRA_CIF_FIELDS ++ FFI_EXTRA_CIF_FIELDS; ++#endif ++} ffi_cif; ++ ++/* ---- Definitions for the raw API -------------------------------------- */ ++ ++#ifndef FFI_SIZEOF_ARG ++# if LONG_MAX == 2147483647 ++# define FFI_SIZEOF_ARG 4 ++# elif LONG_MAX == 9223372036854775807 ++# define FFI_SIZEOF_ARG 8 ++# endif ++#endif ++ ++typedef union { ++ ffi_sarg sint; ++ ffi_arg uint; ++ float flt; ++ char data[FFI_SIZEOF_ARG]; ++ void* ptr; ++} ffi_raw; ++ ++void ++ffi_raw_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ ffi_raw* avalue); ++ ++void ++ffi_ptrarray_to_raw( ++ ffi_cif* cif, ++ void** args, ++ ffi_raw* raw); ++ ++void ++ffi_raw_to_ptrarray( ++ ffi_cif* cif, ++ ffi_raw* raw, ++ void** args); ++ ++size_t ++ffi_raw_size( ++ ffi_cif* cif); ++ ++/* This is analogous to the raw API, except it uses Java parameter ++ packing, even on 64-bit machines. I.e. on 64-bit machines ++ longs and doubles are followed by an empty 64-bit word. */ ++void ++ffi_java_raw_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ ffi_raw* avalue); ++ ++void ++ffi_java_ptrarray_to_raw( ++ ffi_cif* cif, ++ void** args, ++ ffi_raw* raw); ++ ++void ++ffi_java_raw_to_ptrarray( ++ ffi_cif* cif, ++ ffi_raw* raw, ++ void** args); ++ ++size_t ++ffi_java_raw_size( ++ ffi_cif* cif); ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#if FFI_CLOSURES ++ ++typedef struct ffi_closure { ++ char tramp[FFI_TRAMPOLINE_SIZE]; ++ ffi_cif* cif; ++ void (*fun)(ffi_cif*,void*,void**,void*); ++ void* user_data; ++} ffi_closure; ++ ++ffi_status ++ffi_prep_closure( ++ ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,void**,void*), ++ void* user_data); ++ ++void ffi_closure_free(void *); ++void *ffi_closure_alloc (size_t size, void **code); ++ ++typedef struct ffi_raw_closure { ++ char tramp[FFI_TRAMPOLINE_SIZE]; ++ ffi_cif* cif; ++ ++#if !FFI_NATIVE_RAW_API ++ /* if this is enabled, then a raw closure has the same layout ++ as a regular closure. We use this to install an intermediate ++ handler to do the transaltion, void** -> ffi_raw*. */ ++ void (*translate_args)(ffi_cif*,void*,void**,void*); ++ void* this_closure; ++#endif ++ ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*); ++ void* user_data; ++} ffi_raw_closure; ++ ++ffi_status ++ffi_prep_raw_closure( ++ ffi_raw_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), ++ void* user_data); ++ ++ffi_status ++ffi_prep_java_raw_closure( ++ ffi_raw_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), ++ void* user_data); ++ ++#endif // FFI_CLOSURES ++ ++/* ---- Public interface definition -------------------------------------- */ ++ ++ffi_status ++ffi_prep_cif( ++/*@out@*/ /*@partial@*/ ffi_cif* cif, ++ ffi_abi abi, ++ unsigned int nargs, ++/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, ++/*@dependent@*/ ffi_type** atypes); ++ ++void ++ffi_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ void** avalue); ++ ++/* Useful for eliminating compiler warnings */ ++#define FFI_FN(f) ((void (*)(void))f) ++ ++#endif // #ifndef LIBFFI_ASM ++/* ---- Definitions shared with assembly code ---------------------------- */ ++ ++/* If these change, update src/mips/ffitarget.h. */ ++#define FFI_TYPE_VOID 0 ++#define FFI_TYPE_INT 1 ++#define FFI_TYPE_FLOAT 2 ++#define FFI_TYPE_DOUBLE 3 ++ ++#ifdef HAVE_LONG_DOUBLE ++# define FFI_TYPE_LONGDOUBLE 4 ++#else ++# define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE ++#endif ++ ++#define FFI_TYPE_UINT8 5 ++#define FFI_TYPE_SINT8 6 ++#define FFI_TYPE_UINT16 7 ++#define FFI_TYPE_SINT16 8 ++#define FFI_TYPE_UINT32 9 ++#define FFI_TYPE_SINT32 10 ++#define FFI_TYPE_UINT64 11 ++#define FFI_TYPE_SINT64 12 ++#define FFI_TYPE_STRUCT 13 ++#define FFI_TYPE_POINTER 14 ++ ++/* This should always refer to the last type code (for sanity checks) */ ++#define FFI_TYPE_LAST FFI_TYPE_POINTER ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif // #ifndef LIBFFI_H +diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi_common.h ./Modules/_ctypes/libffi_osx/include/ffi_common.h +new file mode 100644 +index 0000000..685a358 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ffi_common.h +@@ -0,0 +1,102 @@ ++/* ----------------------------------------------------------------------- ++ ffi_common.h - Copyright (c) 1996 Red Hat, Inc. ++ ++ Common internal definitions and macros. Only necessary for building ++ libffi. ++ ----------------------------------------------------------------------- */ ++ ++#ifndef FFI_COMMON_H ++#define FFI_COMMON_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include "fficonfig.h" ++ ++/* Do not move this. Some versions of AIX are very picky about where ++ this is positioned. */ ++#ifdef __GNUC__ ++# define alloca __builtin_alloca ++#else ++# if HAVE_ALLOCA_H ++# include ++# else ++# ifdef _AIX ++# pragma alloca ++# else ++# ifndef alloca /* predefined by HP cc +Olibcalls */ ++char* alloca(); ++# endif ++# endif ++# endif ++#endif ++ ++/* Check for the existence of memcpy. */ ++#if STDC_HEADERS ++# include ++#else ++# ifndef HAVE_MEMCPY ++# define memcpy(d, s, n) bcopy((s), (d), (n)) ++# endif ++#endif ++ ++/*#if defined(FFI_DEBUG) ++#include ++#endif*/ ++ ++#ifdef FFI_DEBUG ++#include ++ ++/*@exits@*/ void ++ffi_assert( ++/*@temp@*/ char* expr, ++/*@temp@*/ char* file, ++ int line); ++void ++ffi_stop_here(void); ++void ++ffi_type_test( ++/*@temp@*/ /*@out@*/ ffi_type* a, ++/*@temp@*/ char* file, ++ int line); ++ ++# define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) ++# define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) ++# define FFI_ASSERT_VALID_TYPE(x) ffi_type_test(x, __FILE__, __LINE__) ++#else ++# define FFI_ASSERT(x) ++# define FFI_ASSERT_AT(x, f, l) ++# define FFI_ASSERT_VALID_TYPE(x) ++#endif // #ifdef FFI_DEBUG ++ ++#define ALIGN(v, a) (((size_t)(v) + (a) - 1) & ~((a) - 1)) ++ ++/* Perform machine dependent cif processing */ ++ffi_status ++ffi_prep_cif_machdep( ++ ffi_cif* cif); ++ ++/* Extended cif, used in callback from assembly routine */ ++typedef struct extended_cif { ++/*@dependent@*/ ffi_cif* cif; ++/*@dependent@*/ void* rvalue; ++/*@dependent@*/ void** avalue; ++} extended_cif; ++ ++/* Terse sized type definitions. */ ++typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); ++typedef signed int SINT8 __attribute__((__mode__(__QI__))); ++typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); ++typedef signed int SINT16 __attribute__((__mode__(__HI__))); ++typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); ++typedef signed int SINT32 __attribute__((__mode__(__SI__))); ++typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); ++typedef signed int SINT64 __attribute__((__mode__(__DI__))); ++typedef float FLOAT32; ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif // #ifndef FFI_COMMON_H +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/fficonfig.h ./Modules/_ctypes/libffi_osx/include/fficonfig.h +new file mode 100644 +index 0000000..2172490 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/fficonfig.h +@@ -0,0 +1,150 @@ ++/* Manually created fficonfig.h for Darwin on PowerPC or Intel ++ ++ This file is manually generated to do away with the need for autoconf and ++ therefore make it easier to cross-compile and build fat binaries. ++ ++ NOTE: This file was added by PyObjC. ++*/ ++ ++#ifndef MACOSX ++#error "This file is only supported on Mac OS X" ++#endif ++ ++#if defined(__i386__) ++# define BYTEORDER 1234 ++# undef HOST_WORDS_BIG_ENDIAN ++# undef WORDS_BIGENDIAN ++# define SIZEOF_DOUBLE 8 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++ ++#elif defined(__x86_64__) ++# define BYTEORDER 1234 ++# undef HOST_WORDS_BIG_ENDIAN ++# undef WORDS_BIGENDIAN ++# define SIZEOF_DOUBLE 8 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++ ++#elif defined(__ppc__) ++# define BYTEORDER 4321 ++# define HOST_WORDS_BIG_ENDIAN 1 ++# define WORDS_BIGENDIAN 1 ++# define SIZEOF_DOUBLE 8 ++# if __GNUC__ >= 4 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++# else ++# undef HAVE_LONG_DOUBLE ++# define SIZEOF_LONG_DOUBLE 8 ++# endif ++ ++#elif defined(__ppc64__) ++# define BYTEORDER 4321 ++# define HOST_WORDS_BIG_ENDIAN 1 ++# define WORDS_BIGENDIAN 1 ++# define SIZEOF_DOUBLE 8 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++ ++#else ++#error "Unknown CPU type" ++#endif ++ ++/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP ++ systems. This function is required for `alloca.c' support on those systems. */ ++#undef CRAY_STACKSEG_END ++ ++/* Define to 1 if using `alloca.c'. */ ++/* #undef C_ALLOCA */ ++ ++/* Define to the flags needed for the .section .eh_frame directive. */ ++#define EH_FRAME_FLAGS "aw" ++ ++/* Define this if you want extra debugging. */ ++/* #undef FFI_DEBUG */ ++ ++/* Define this is you do not want support for the raw API. */ ++#define FFI_NO_RAW_API 1 ++ ++/* Define this if you do not want support for aggregate types. */ ++/* #undef FFI_NO_STRUCTS */ ++ ++/* Define to 1 if you have `alloca', as a function or macro. */ ++#define HAVE_ALLOCA 1 ++ ++/* Define to 1 if you have and it should be used (not on Ultrix). */ ++#define HAVE_ALLOCA_H 1 ++ ++/* Define if your assembler supports .register. */ ++/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ ++ ++/* Define if your assembler and linker support unaligned PC relative relocs. */ ++/* #undef HAVE_AS_SPARC_UA_PCREL */ ++ ++/* Define to 1 if you have the `memcpy' function. */ ++#define HAVE_MEMCPY 1 ++ ++/* Define if mmap with MAP_ANON(YMOUS) works. */ ++#define HAVE_MMAP_ANON 1 ++ ++/* Define if mmap of /dev/zero works. */ ++/* #undef HAVE_MMAP_DEV_ZERO */ ++ ++/* Define if read-only mmap of a plain file works. */ ++#define HAVE_MMAP_FILE 1 ++ ++/* Define if .eh_frame sections should be read-only. */ ++/* #undef HAVE_RO_EH_FRAME */ ++ ++/* Define to 1 if your C compiler doesn't accept -c and -o together. */ ++/* #undef NO_MINUS_C_MINUS_O */ ++ ++/* Name of package */ ++#define PACKAGE "libffi" ++ ++/* Define to the address where bug reports for this package should be sent. */ ++#define PACKAGE_BUGREPORT "http://gcc.gnu.org/bugs.html" ++ ++/* Define to the full name of this package. */ ++#define PACKAGE_NAME "libffi" ++ ++/* Define to the full name and version of this package. */ ++#define PACKAGE_STRING "libffi 2.1" ++ ++/* Define to the one symbol short name of this package. */ ++#define PACKAGE_TARNAME "libffi" ++ ++/* Define to the version of this package. */ ++#define PACKAGE_VERSION "2.1" ++ ++/* If using the C implementation of alloca, define if you know the ++ direction of stack growth for your system; otherwise it will be ++ automatically deduced at run-time. ++ STACK_DIRECTION > 0 => grows toward higher addresses ++ STACK_DIRECTION < 0 => grows toward lower addresses ++ STACK_DIRECTION = 0 => direction of growth unknown */ ++/* #undef STACK_DIRECTION */ ++ ++/* Define to 1 if you have the ANSI C header files. */ ++#define STDC_HEADERS 1 ++ ++/* Define this if you are using Purify and want to suppress spurious messages. */ ++/* #undef USING_PURIFY */ ++ ++/* Version number of package */ ++#define VERSION "2.1-pyobjc" ++ ++#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE ++# ifdef LIBFFI_ASM ++# define FFI_HIDDEN(name) .hidden name ++# else ++# define FFI_HIDDEN __attribute__((visibility ("hidden"))) ++# endif ++#else ++# ifdef LIBFFI_ASM ++# define FFI_HIDDEN(name) ++# else ++# define FFI_HIDDEN ++# endif ++#endif +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/ffitarget.h ./Modules/_ctypes/libffi_osx/include/ffitarget.h +new file mode 100644 +index 0000000..faaa30d +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ffitarget.h +@@ -0,0 +1,13 @@ ++/* Dispatch to the right ffitarget file. This file is PyObjC specific; in a ++ normal build, the build environment copies the file to the right location or ++ sets up the right include flags. We want to do neither because that would ++ make building fat binaries harder. ++*/ ++ ++#if defined(__i386__) || defined(__x86_64__) ++#include "x86-ffitarget.h" ++#elif defined(__ppc__) || defined(__ppc64__) ++#include "ppc-ffitarget.h" ++#else ++#error "Unsupported CPU type" ++#endif +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h +new file mode 100644 +index 0000000..2318421 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h +@@ -0,0 +1,104 @@ ++/* -----------------------------------------------------------------*-C-*- ++ ppc-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ Target configuration macros for PowerPC. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++/* ---- System specific configurations ----------------------------------- */ ++ ++#if (defined(POWERPC) && defined(__powerpc64__)) || \ ++ (defined(POWERPC_DARWIN) && defined(__ppc64__)) ++#define POWERPC64 ++#endif ++ ++#ifndef LIBFFI_ASM ++ ++typedef unsigned long ffi_arg; ++typedef signed long ffi_sarg; ++ ++typedef enum ffi_abi { ++ FFI_FIRST_ABI = 0, ++ ++#ifdef POWERPC ++ FFI_SYSV, ++ FFI_GCC_SYSV, ++ FFI_LINUX64, ++# ifdef POWERPC64 ++ FFI_DEFAULT_ABI = FFI_LINUX64, ++# else ++ FFI_DEFAULT_ABI = FFI_GCC_SYSV, ++# endif ++#endif ++ ++#ifdef POWERPC_AIX ++ FFI_AIX, ++ FFI_DARWIN, ++ FFI_DEFAULT_ABI = FFI_AIX, ++#endif ++ ++#ifdef POWERPC_DARWIN ++ FFI_AIX, ++ FFI_DARWIN, ++ FFI_DEFAULT_ABI = FFI_DARWIN, ++#endif ++ ++#ifdef POWERPC_FREEBSD ++ FFI_SYSV, ++ FFI_GCC_SYSV, ++ FFI_LINUX64, ++ FFI_DEFAULT_ABI = FFI_SYSV, ++#endif ++ ++ FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 ++} ffi_abi; ++ ++#endif // #ifndef LIBFFI_ASM ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#define FFI_CLOSURES 1 ++#define FFI_NATIVE_RAW_API 0 ++ ++/* Needed for FFI_SYSV small structure returns. */ ++#define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST) ++ ++#if defined(POWERPC64) /*|| defined(POWERPC_AIX)*/ ++# define FFI_TRAMPOLINE_SIZE 48 ++#elif defined(POWERPC_AIX) ++# define FFI_TRAMPOLINE_SIZE 24 ++#else ++# define FFI_TRAMPOLINE_SIZE 40 ++#endif ++ ++#ifndef LIBFFI_ASM ++# if defined(POWERPC_DARWIN) || defined(POWERPC_AIX) ++typedef struct ffi_aix_trampoline_struct { ++ void* code_pointer; /* Pointer to ffi_closure_ASM */ ++ void* toc; /* TOC */ ++ void* static_chain; /* Pointer to closure */ ++} ffi_aix_trampoline_struct; ++# endif ++#endif // #ifndef LIBFFI_ASM ++ ++#endif // #ifndef LIBFFI_TARGET_H +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h +new file mode 100644 +index 0000000..55c2b6c +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h +@@ -0,0 +1,88 @@ ++/* -----------------------------------------------------------------*-C-*- ++ x86-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ Target configuration macros for x86 and x86-64. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ++ ----------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++/* ---- System specific configurations ----------------------------------- */ ++ ++#if defined(X86_64) && defined(__i386__) ++# undef X86_64 ++# define X86 ++#endif ++ ++#if defined(__x86_64__) ++# ifndef X86_64 ++# define X86_64 ++# endif ++#endif ++ ++/* ---- Generic type definitions ----------------------------------------- */ ++ ++#ifndef LIBFFI_ASM ++ ++typedef unsigned long ffi_arg; ++typedef signed long ffi_sarg; ++ ++typedef enum ffi_abi { ++ FFI_FIRST_ABI = 0, ++ ++ /* ---- Intel x86 Win32 ---------- */ ++#ifdef X86_WIN32 ++ FFI_SYSV, ++ FFI_STDCALL, ++ /* TODO: Add fastcall support for the sake of completeness */ ++ FFI_DEFAULT_ABI = FFI_SYSV, ++#endif ++ ++ /* ---- Intel x86 and AMD x86-64 - */ ++#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__)) ++ FFI_SYSV, ++ FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ ++# ifdef __i386__ ++ FFI_DEFAULT_ABI = FFI_SYSV, ++# else ++ FFI_DEFAULT_ABI = FFI_UNIX64, ++# endif ++#endif ++ ++ FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 ++} ffi_abi; ++ ++#endif // #ifndef LIBFFI_ASM ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#define FFI_CLOSURES 1 ++ ++#if defined(X86_64) || (defined(__x86_64__) && defined(X86_DARWIN)) ++# define FFI_TRAMPOLINE_SIZE 24 ++# define FFI_NATIVE_RAW_API 0 ++#else ++# define FFI_TRAMPOLINE_SIZE 10 ++# define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ ++#endif ++ ++#endif // #ifndef LIBFFI_TARGET_H +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S +new file mode 100644 +index 0000000..f143dbd +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S +@@ -0,0 +1,365 @@ ++#if defined(__ppc__) || defined(__ppc64__) ++ ++/* ----------------------------------------------------------------------- ++ ppc-darwin.S - Copyright (c) 2000 John Hornkvist ++ Copyright (c) 2004 Free Software Foundation, Inc. ++ ++ PowerPC Assembly glue. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++ ++#include ++#include ++#include ++#include ++ ++.text ++ .align 2 ++.globl _ffi_prep_args ++ ++.text ++ .align 2 ++.globl _ffi_call_DARWIN ++ ++.text ++ .align 2 ++_ffi_call_DARWIN: ++LFB0: ++ mr r12,r8 /* We only need r12 until the call, ++ so it doesn't have to be saved. */ ++ ++LFB1: ++ /* Save the old stack pointer as AP. */ ++ mr r8,r1 ++ ++LCFI0: ++#if defined(__ppc64__) ++ /* Allocate the stack space we need. ++ r4 (size of input data) ++ 48 bytes (linkage area) ++ 40 bytes (saved registers) ++ 8 bytes (extra FPR) ++ r4 + 96 bytes total ++ */ ++ ++ addi r4,r4,-96 // Add our overhead. ++ li r0,-32 // Align to 32 bytes. ++ and r4,r4,r0 ++#endif ++ stgux r1,r1,r4 // Grow the stack. ++ mflr r9 ++ ++ /* Save registers we use. */ ++#if defined(__ppc64__) ++ std r27,-40(r8) ++#endif ++ stg r28,MODE_CHOICE(-16,-32)(r8) ++ stg r29,MODE_CHOICE(-12,-24)(r8) ++ stg r30,MODE_CHOICE(-8,-16)(r8) ++ stg r31,MODE_CHOICE(-4,-8)(r8) ++ stg r9,SF_RETURN(r8) /* return address */ ++#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ ++ stg r2,MODE_CHOICE(20,40)(r1) ++#endif ++ ++LCFI1: ++#if defined(__ppc64__) ++ mr r27,r3 // our extended_cif ++#endif ++ /* Save arguments over call. */ ++ mr r31,r5 /* flags, */ ++ mr r30,r6 /* rvalue, */ ++ mr r29,r7 /* function address, */ ++ mr r28,r8 /* our AP. */ ++ ++LCFI2: ++ /* Call ffi_prep_args. */ ++ mr r4,r1 ++ li r9,0 ++ mtctr r12 /* r12 holds address of _ffi_prep_args. */ ++ bctrl ++#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ ++ lg r2,MODE_CHOICE(20,40)(r1) ++#endif ++ ++ /* Now do the call. ++ Set up cr1 with bits 4-7 of the flags. */ ++ mtcrf 0x40,r31 ++ ++ /* Load all those argument registers. ++ We have set up a nice stack frame, just load it into registers. */ ++ lg r3,SF_ARG1(r1) ++ lg r4,SF_ARG2(r1) ++ lg r5,SF_ARG3(r1) ++ lg r6,SF_ARG4(r1) ++ nop ++ lg r7,SF_ARG5(r1) ++ lg r8,SF_ARG6(r1) ++ lg r9,SF_ARG7(r1) ++ lg r10,SF_ARG8(r1) ++ ++ /* Load all the FP registers. */ ++ bf 6,L2 /* No floats to load. */ ++#if defined(__ppc64__) ++ lfd f1,MODE_CHOICE(-16,-40)-(14*8)(r28) ++ lfd f2,MODE_CHOICE(-16,-40)-(13*8)(r28) ++ lfd f3,MODE_CHOICE(-16,-40)-(12*8)(r28) ++ lfd f4,MODE_CHOICE(-16,-40)-(11*8)(r28) ++ nop ++ lfd f5,MODE_CHOICE(-16,-40)-(10*8)(r28) ++ lfd f6,MODE_CHOICE(-16,-40)-(9*8)(r28) ++ lfd f7,MODE_CHOICE(-16,-40)-(8*8)(r28) ++ lfd f8,MODE_CHOICE(-16,-40)-(7*8)(r28) ++ nop ++ lfd f9,MODE_CHOICE(-16,-40)-(6*8)(r28) ++ lfd f10,MODE_CHOICE(-16,-40)-(5*8)(r28) ++ lfd f11,MODE_CHOICE(-16,-40)-(4*8)(r28) ++ lfd f12,MODE_CHOICE(-16,-40)-(3*8)(r28) ++ nop ++ lfd f13,MODE_CHOICE(-16,-40)-(2*8)(r28) ++ lfd f14,MODE_CHOICE(-16,-40)-(1*8)(r28) ++#elif defined(__ppc__) ++ lfd f1,MODE_CHOICE(-16,-40)-(13*8)(r28) ++ lfd f2,MODE_CHOICE(-16,-40)-(12*8)(r28) ++ lfd f3,MODE_CHOICE(-16,-40)-(11*8)(r28) ++ lfd f4,MODE_CHOICE(-16,-40)-(10*8)(r28) ++ nop ++ lfd f5,MODE_CHOICE(-16,-40)-(9*8)(r28) ++ lfd f6,MODE_CHOICE(-16,-40)-(8*8)(r28) ++ lfd f7,MODE_CHOICE(-16,-40)-(7*8)(r28) ++ lfd f8,MODE_CHOICE(-16,-40)-(6*8)(r28) ++ nop ++ lfd f9,MODE_CHOICE(-16,-40)-(5*8)(r28) ++ lfd f10,MODE_CHOICE(-16,-40)-(4*8)(r28) ++ lfd f11,MODE_CHOICE(-16,-40)-(3*8)(r28) ++ lfd f12,MODE_CHOICE(-16,-40)-(2*8)(r28) ++ nop ++ lfd f13,MODE_CHOICE(-16,-40)-(1*8)(r28) ++#else ++#error undefined architecture ++#endif ++ ++L2: ++ mr r12,r29 // Put the target address in r12 as specified. ++ mtctr r12 // Get the address to call into CTR. ++ nop ++ nop ++ bctrl // Make the call. ++ ++ // Deal with the return value. ++#if defined(__ppc64__) ++ mtcrf 0x3,r31 // flags in cr6 and cr7 ++ bt 27,L(st_return_value) ++#elif defined(__ppc__) ++ mtcrf 0x1,r31 // flags in cr7 ++#else ++#error undefined architecture ++#endif ++ ++ bt 30,L(done_return_value) ++ bt 29,L(fp_return_value) ++ stg r3,0(r30) ++#if defined(__ppc__) ++ bf 28,L(done_return_value) // Store the second long if necessary. ++ stg r4,4(r30) ++#endif ++ // Fall through ++ ++L(done_return_value): ++ lg r1,0(r1) // Restore stack pointer. ++ // Restore the registers we used. ++ lg r9,SF_RETURN(r1) // return address ++ lg r31,MODE_CHOICE(-4,-8)(r1) ++ mtlr r9 ++ lg r30,MODE_CHOICE(-8,-16)(r1) ++ lg r29,MODE_CHOICE(-12,-24)(r1) ++ lg r28,MODE_CHOICE(-16,-32)(r1) ++#if defined(__ppc64__) ++ ld r27,-40(r1) ++#endif ++ blr ++ ++#if defined(__ppc64__) ++L(st_return_value): ++ // Grow the stack enough to fit the registers. Leave room for 8 args ++ // to trample the 1st 8 slots in param area. ++ stgu r1,-SF_ROUND(280)(r1) // 64 + 104 + 48 + 64 ++ ++ // Store GPRs ++ std r3,SF_ARG9(r1) ++ std r4,SF_ARG10(r1) ++ std r5,SF_ARG11(r1) ++ std r6,SF_ARG12(r1) ++ nop ++ std r7,SF_ARG13(r1) ++ std r8,SF_ARG14(r1) ++ std r9,SF_ARG15(r1) ++ std r10,SF_ARG16(r1) ++ ++ // Store FPRs ++ nop ++ bf 26,L(call_struct_to_ram_form) ++ stfd f1,SF_ARG17(r1) ++ stfd f2,SF_ARG18(r1) ++ stfd f3,SF_ARG19(r1) ++ stfd f4,SF_ARG20(r1) ++ nop ++ stfd f5,SF_ARG21(r1) ++ stfd f6,SF_ARG22(r1) ++ stfd f7,SF_ARG23(r1) ++ stfd f8,SF_ARG24(r1) ++ nop ++ stfd f9,SF_ARG25(r1) ++ stfd f10,SF_ARG26(r1) ++ stfd f11,SF_ARG27(r1) ++ stfd f12,SF_ARG28(r1) ++ nop ++ stfd f13,SF_ARG29(r1) ++ ++L(call_struct_to_ram_form): ++ ld r3,0(r27) // extended_cif->cif* ++ ld r3,16(r3) // ffi_cif->rtype* ++ addi r4,r1,SF_ARG9 // stored GPRs ++ addi r6,r1,SF_ARG17 // stored FPRs ++ li r5,0 // GPR size ptr (NULL) ++ li r7,0 // FPR size ptr (NULL) ++ li r8,0 // FPR count ptr (NULL) ++ li r10,0 // struct offset (NULL) ++ mr r9,r30 // return area ++ bl Lffi64_struct_to_ram_form$stub ++ lg r1,0(r1) // Restore stack pointer. ++ b L(done_return_value) ++#endif ++ ++L(fp_return_value): ++ /* Do we have long double to store? */ ++ bf 31,L(fd_return_value) ++ stfd f1,0(r30) ++ stfd f2,8(r30) ++ b L(done_return_value) ++ ++L(fd_return_value): ++ /* Do we have double to store? */ ++ bf 28,L(float_return_value) ++ stfd f1,0(r30) ++ b L(done_return_value) ++ ++L(float_return_value): ++ /* We only have a float to store. */ ++ stfs f1,0(r30) ++ b L(done_return_value) ++ ++LFE1: ++/* END(_ffi_call_DARWIN) */ ++ ++/* Provide a null definition of _ffi_call_AIX. */ ++.text ++ .align 2 ++.globl _ffi_call_AIX ++.text ++ .align 2 ++_ffi_call_AIX: ++ blr ++/* END(_ffi_call_AIX) */ ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ; Length of Common Information Entry ++LSCIE1: ++ .long 0x0 ; CIE Identifier Tag ++ .byte 0x1 ; CIE Version ++ .ascii "zR\0" ; CIE Augmentation ++ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor ++ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte 0x41 ; CIE RA Column ++ .byte 0x1 ; uleb128 0x1; Augmentation size ++ .byte 0x10 ; FDE Encoding (pcrel) ++ .byte 0xc ; DW_CFA_def_cfa ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x0 ; uleb128 0x0 ++ .align LOG2_GPR_BYTES ++LECIE1: ++.globl _ffi_call_DARWIN.eh ++_ffi_call_DARWIN.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ; FDE Length ++ ++LASFDE1: ++ .long LASFDE1-EH_frame1 ; FDE CIE offset ++ .g_long LFB0-. ; FDE initial location ++ .set L$set$3,LFE1-LFB0 ++ .g_long L$set$3 ; FDE address range ++ .byte 0x0 ; uleb128 0x0; Augmentation size ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$4,LCFI0-LFB1 ++ .long L$set$4 ++ .byte 0xd ; DW_CFA_def_cfa_register ++ .byte 0x08 ; uleb128 0x08 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$5,LCFI1-LCFI0 ++ .long L$set$5 ++ .byte 0x11 ; DW_CFA_offset_extended_sf ++ .byte 0x41 ; uleb128 0x41 ++ .byte 0x7e ; sleb128 -2 ++ .byte 0x9f ; DW_CFA_offset, column 0x1f ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x9e ; DW_CFA_offset, column 0x1e ++ .byte 0x2 ; uleb128 0x2 ++ .byte 0x9d ; DW_CFA_offset, column 0x1d ++ .byte 0x3 ; uleb128 0x3 ++ .byte 0x9c ; DW_CFA_offset, column 0x1c ++ .byte 0x4 ; uleb128 0x4 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$6,LCFI2-LCFI1 ++ .long L$set$6 ++ .byte 0xd ; DW_CFA_def_cfa_register ++ .byte 0x1c ; uleb128 0x1c ++ .align LOG2_GPR_BYTES ++LEFDE1: ++ ++#if defined(__ppc64__) ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi64_struct_to_ram_form$stub: ++ .indirect_symbol _ffi64_struct_to_ram_form ++ mflr r0 ++ bcl 20,31,LO$ffi64_struct_to_ram_form ++ ++LO$ffi64_struct_to_ram_form: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form) ++ mtlr r0 ++ lgu r12,lo16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi64_struct_to_ram_form$lazy_ptr: ++ .indirect_symbol _ffi64_struct_to_ram_form ++ .g_long dyld_stub_binding_helper ++ ++#endif // __ppc64__ ++#endif // __ppc__ || __ppc64__ +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h +new file mode 100644 +index 0000000..cf4bd50 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h +@@ -0,0 +1,85 @@ ++/* ----------------------------------------------------------------------- ++ ppc-darwin.h - Copyright (c) 2002, 2003, 2004, Free Software Foundation, ++ Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define L(x) x ++ ++#define SF_ARG9 MODE_CHOICE(56,112) ++#define SF_ARG10 MODE_CHOICE(60,120) ++#define SF_ARG11 MODE_CHOICE(64,128) ++#define SF_ARG12 MODE_CHOICE(68,136) ++#define SF_ARG13 MODE_CHOICE(72,144) ++#define SF_ARG14 MODE_CHOICE(76,152) ++#define SF_ARG15 MODE_CHOICE(80,160) ++#define SF_ARG16 MODE_CHOICE(84,168) ++#define SF_ARG17 MODE_CHOICE(88,176) ++#define SF_ARG18 MODE_CHOICE(92,184) ++#define SF_ARG19 MODE_CHOICE(96,192) ++#define SF_ARG20 MODE_CHOICE(100,200) ++#define SF_ARG21 MODE_CHOICE(104,208) ++#define SF_ARG22 MODE_CHOICE(108,216) ++#define SF_ARG23 MODE_CHOICE(112,224) ++#define SF_ARG24 MODE_CHOICE(116,232) ++#define SF_ARG25 MODE_CHOICE(120,240) ++#define SF_ARG26 MODE_CHOICE(124,248) ++#define SF_ARG27 MODE_CHOICE(128,256) ++#define SF_ARG28 MODE_CHOICE(132,264) ++#define SF_ARG29 MODE_CHOICE(136,272) ++ ++#define ASM_NEEDS_REGISTERS 4 ++#define NUM_GPR_ARG_REGISTERS 8 ++#define NUM_FPR_ARG_REGISTERS 13 ++ ++#define FFI_TYPE_1_BYTE(x) ((x) == FFI_TYPE_UINT8 || (x) == FFI_TYPE_SINT8) ++#define FFI_TYPE_2_BYTE(x) ((x) == FFI_TYPE_UINT16 || (x) == FFI_TYPE_SINT16) ++#define FFI_TYPE_4_BYTE(x) \ ++ ((x) == FFI_TYPE_UINT32 || (x) == FFI_TYPE_SINT32 ||\ ++ (x) == FFI_TYPE_INT || (x) == FFI_TYPE_FLOAT) ++ ++#if !defined(LIBFFI_ASM) ++ ++enum { ++ FLAG_RETURNS_NOTHING = 1 << (31 - 30), // cr7 ++ FLAG_RETURNS_FP = 1 << (31 - 29), ++ FLAG_RETURNS_64BITS = 1 << (31 - 28), ++ FLAG_RETURNS_128BITS = 1 << (31 - 31), ++ ++ FLAG_RETURNS_STRUCT = 1 << (31 - 27), // cr6 ++ FLAG_STRUCT_CONTAINS_FP = 1 << (31 - 26), ++ ++ FLAG_ARG_NEEDS_COPY = 1 << (31 - 7), ++ FLAG_FP_ARGUMENTS = 1 << (31 - 6), // cr1.eq; specified by ABI ++ FLAG_4_GPR_ARGUMENTS = 1 << (31 - 5), ++ FLAG_RETVAL_REFERENCE = 1 << (31 - 4) ++}; ++ ++#if defined(__ppc64__) ++void ffi64_struct_to_ram_form(const ffi_type*, const char*, unsigned int*, ++ const char*, unsigned int*, unsigned int*, char*, unsigned int*); ++void ffi64_struct_to_reg_form(const ffi_type*, const char*, unsigned int*, ++ unsigned int*, char*, unsigned int*, char*, unsigned int*); ++bool ffi64_stret_needs_ptr(const ffi_type* inType, ++ unsigned short*, unsigned short*); ++#endif ++ ++#endif // !defined(LIBFFI_ASM) +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S +new file mode 100644 +index 0000000..c3d30c2 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S +@@ -0,0 +1,308 @@ ++#if defined(__ppc__) ++ ++/* ----------------------------------------------------------------------- ++ ppc-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, ++ Inc. based on ppc_closure.S ++ ++ PowerPC Assembly glue. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++ ++#include ++#include // for FFI_TRAMPOLINE_SIZE ++#include ++#include ++ ++ .file "ppc-darwin_closure.S" ++.text ++ .align LOG2_GPR_BYTES ++ .globl _ffi_closure_ASM ++ ++.text ++ .align LOG2_GPR_BYTES ++ ++_ffi_closure_ASM: ++LFB1: ++ mflr r0 // Save return address ++ stg r0,SF_RETURN(r1) ++ ++LCFI0: ++ /* 24/48 bytes (Linkage Area) ++ 32/64 bytes (outgoing parameter area, always reserved) ++ 104 bytes (13*8 from FPR) ++ 16/32 bytes (result) ++ 176/232 total bytes */ ++ ++ /* skip over caller save area and keep stack aligned to 16/32. */ ++ stgu r1,-SF_ROUND(176)(r1) ++ ++LCFI1: ++ /* We want to build up an area for the parameters passed ++ in registers. (both floating point and integer) */ ++ ++ /* 176/256 bytes (callee stack frame aligned to 16/32) ++ 24/48 bytes (caller linkage area) ++ 200/304 (start of caller parameter area aligned to 4/8) ++ */ ++ ++ /* Save GPRs 3 - 10 (aligned to 4/8) ++ in the parents outgoing area. */ ++ stg r3,200(r1) ++ stg r4,204(r1) ++ stg r5,208(r1) ++ stg r6,212(r1) ++ stg r7,216(r1) ++ stg r8,220(r1) ++ stg r9,224(r1) ++ stg r10,228(r1) ++ ++ /* Save FPRs 1 - 13. (aligned to 8) */ ++ stfd f1,56(r1) ++ stfd f2,64(r1) ++ stfd f3,72(r1) ++ stfd f4,80(r1) ++ stfd f5,88(r1) ++ stfd f6,96(r1) ++ stfd f7,104(r1) ++ stfd f8,112(r1) ++ stfd f9,120(r1) ++ stfd f10,128(r1) ++ stfd f11,136(r1) ++ stfd f12,144(r1) ++ stfd f13,152(r1) ++ ++ // Set up registers for the routine that actually does the work. ++ mr r3,r11 // context pointer from the trampoline ++ addi r4,r1,160 // result storage ++ addi r5,r1,200 // saved GPRs ++ addi r6,r1,56 // saved FPRs ++ bl Lffi_closure_helper_DARWIN$stub ++ ++ /* Now r3 contains the return type. Use it to look up in a table ++ so we know how to deal with each type. */ ++ addi r5,r1,160 // Copy result storage pointer. ++ bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. ++ mflr r4 // Move to r4. ++ slwi r3,r3,4 // Multiply return type by 16. ++ add r3,r3,r4 // Add contents of table to table address. ++ mtctr r3 ++ bctr ++ ++LFE1: ++/* Each of the ret_typeX code fragments has to be exactly 16 bytes long ++ (4 instructions). For cache effectiveness we align to a 16 byte boundary ++ first. */ ++ .align 4 ++ nop ++ nop ++ nop ++ ++Lget_ret_type0_addr: ++ blrl ++ ++/* case FFI_TYPE_VOID */ ++Lret_type0: ++ b Lfinish ++ nop ++ nop ++ nop ++ ++/* case FFI_TYPE_INT */ ++Lret_type1: ++ lwz r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_FLOAT */ ++Lret_type2: ++ lfs f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_DOUBLE */ ++Lret_type3: ++ lfd f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_LONGDOUBLE */ ++Lret_type4: ++ lfd f1,0(r5) ++ lfd f2,8(r5) ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_UINT8 */ ++Lret_type5: ++ lbz r3,3(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_SINT8 */ ++Lret_type6: ++ lbz r3,3(r5) ++ extsb r3,r3 ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_UINT16 */ ++Lret_type7: ++ lhz r3,2(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_SINT16 */ ++Lret_type8: ++ lha r3,2(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_UINT32 */ ++Lret_type9: // same as Lret_type1 ++ lwz r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_SINT32 */ ++Lret_type10: // same as Lret_type1 ++ lwz r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_UINT64 */ ++Lret_type11: ++ lwz r3,0(r5) ++ lwz r4,4(r5) ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_SINT64 */ ++Lret_type12: // same as Lret_type11 ++ lwz r3,0(r5) ++ lwz r4,4(r5) ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_STRUCT */ ++Lret_type13: ++ b Lfinish ++ nop ++ nop ++ nop ++ ++/* End 16-byte aligned cases */ ++/* case FFI_TYPE_POINTER */ ++// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types ++// are added in future, the following code will need to be updated and ++// padded to 16 bytes. ++Lret_type14: ++ lg r3,0(r5) ++ // fall through ++ ++/* case done */ ++Lfinish: ++ addi r1,r1,SF_ROUND(176) // Restore stack pointer. ++ lg r0,SF_RETURN(r1) // Restore return address. ++ mtlr r0 // Restore link register. ++ blr ++ ++/* END(ffi_closure_ASM) */ ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ; Length of Common Information Entry ++LSCIE1: ++ .long 0x0 ; CIE Identifier Tag ++ .byte 0x1 ; CIE Version ++ .ascii "zR\0" ; CIE Augmentation ++ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor ++ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte 0x41 ; CIE RA Column ++ .byte 0x1 ; uleb128 0x1; Augmentation size ++ .byte 0x10 ; FDE Encoding (pcrel) ++ .byte 0xc ; DW_CFA_def_cfa ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x0 ; uleb128 0x0 ++ .align LOG2_GPR_BYTES ++LECIE1: ++.globl _ffi_closure_ASM.eh ++_ffi_closure_ASM.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ; FDE Length ++ ++LASFDE1: ++ .long LASFDE1-EH_frame1 ; FDE CIE offset ++ .g_long LFB1-. ; FDE initial location ++ .set L$set$3,LFE1-LFB1 ++ .g_long L$set$3 ; FDE address range ++ .byte 0x0 ; uleb128 0x0; Augmentation size ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$3,LCFI1-LCFI0 ++ .long L$set$3 ++ .byte 0xe ; DW_CFA_def_cfa_offset ++ .byte 176,1 ; uleb128 176 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$4,LCFI0-LFB1 ++ .long L$set$4 ++ .byte 0x11 ; DW_CFA_offset_extended_sf ++ .byte 0x41 ; uleb128 0x41 ++ .byte 0x7e ; sleb128 -2 ++ .align LOG2_GPR_BYTES ++ ++LEFDE1: ++.data ++ .align LOG2_GPR_BYTES ++LDFCM0: ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi_closure_helper_DARWIN$stub: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ mflr r0 ++ bcl 20,31,LO$ffi_closure_helper_DARWIN ++ ++LO$ffi_closure_helper_DARWIN: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) ++ mtlr r0 ++ lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi_closure_helper_DARWIN$lazy_ptr: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ .g_long dyld_stub_binding_helper ++ ++ ++#endif // __ppc__ +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c +new file mode 100644 +index 0000000..8953d5f +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c +@@ -0,0 +1,1776 @@ ++#if defined(__ppc__) || defined(__ppc64__) ++ ++/* ----------------------------------------------------------------------- ++ ffi.c - Copyright (c) 1998 Geoffrey Keating ++ ++ PowerPC Foreign Function Interface ++ ++ Darwin ABI support (c) 2001 John Hornkvist ++ AIX ABI support (c) 2002 Free Software Foundation, Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#if 0 ++#if defined(POWERPC_DARWIN) ++#include // for sys_icache_invalidate() ++#endif ++ ++#else ++ ++#pragma weak sys_icache_invalidate ++extern void sys_icache_invalidate(void *start, size_t len); ++ ++#endif ++ ++ ++extern void ffi_closure_ASM(void); ++ ++// The layout of a function descriptor. A C function pointer really ++// points to one of these. ++typedef struct aix_fd_struct { ++ void* code_pointer; ++ void* toc; ++} aix_fd; ++ ++/* ffi_prep_args is called by the assembly routine once stack space ++ has been allocated for the function's arguments. ++ ++ The stack layout we want looks like this: ++ ++ | Return address from ffi_call_DARWIN | higher addresses ++ |--------------------------------------------| ++ | Previous backchain pointer 4/8 | stack pointer here ++ |--------------------------------------------|-\ <<< on entry to ++ | Saved r28-r31 (4/8)*4 | | ffi_call_DARWIN ++ |--------------------------------------------| | ++ | Parameters (at least 8*(4/8)=32/64) | | (176) +112 - +288 ++ |--------------------------------------------| | ++ | Space for GPR2 4/8 | | ++ |--------------------------------------------| | stack | ++ | Reserved (4/8)*2 | | grows | ++ |--------------------------------------------| | down V ++ | Space for callee's LR 4/8 | | ++ |--------------------------------------------| | lower addresses ++ | Saved CR 4/8 | | ++ |--------------------------------------------| | stack pointer here ++ | Current backchain pointer 4/8 | | during ++ |--------------------------------------------|-/ <<< ffi_call_DARWIN ++ ++ Note: ppc64 CR is saved in the low word of a long on the stack. ++*/ ++ ++/*@-exportheader@*/ ++void ++ffi_prep_args( ++ extended_cif* inEcif, ++ unsigned *const stack) ++/*@=exportheader@*/ ++{ ++ /* Copy the ecif to a local var so we can trample the arg. ++ BC note: test this with GP later for possible problems... */ ++ volatile extended_cif* ecif = inEcif; ++ ++ const unsigned bytes = ecif->cif->bytes; ++ const unsigned flags = ecif->cif->flags; ++ ++ /* Cast the stack arg from int* to long*. sizeof(long) == 4 in 32-bit mode ++ and 8 in 64-bit mode. */ ++ unsigned long *const longStack = (unsigned long *const)stack; ++ ++ /* 'stacktop' points at the previous backchain pointer. */ ++#if defined(__ppc64__) ++ // In ppc-darwin.s, an extra 96 bytes is reserved for the linkage area, ++ // saved registers, and an extra FPR. ++ unsigned long *const stacktop = ++ (unsigned long *)(unsigned long)((char*)longStack + bytes + 96); ++#elif defined(__ppc__) ++ unsigned long *const stacktop = longStack + (bytes / sizeof(long)); ++#else ++#error undefined architecture ++#endif ++ ++ /* 'fpr_base' points at the space for fpr1, and grows upwards as ++ we use FPR registers. */ ++ double* fpr_base = (double*)(stacktop - ASM_NEEDS_REGISTERS) - ++ NUM_FPR_ARG_REGISTERS; ++ ++#if defined(__ppc64__) ++ // 64-bit saves an extra register, and uses an extra FPR. Knock fpr_base ++ // down a couple pegs. ++ fpr_base -= 2; ++#endif ++ ++ unsigned int fparg_count = 0; ++ ++ /* 'next_arg' grows up as we put parameters in it. */ ++ unsigned long* next_arg = longStack + 6; /* 6 reserved positions. */ ++ ++ int i; ++ double double_tmp; ++ void** p_argv = ecif->avalue; ++ unsigned long gprvalue; ++ ffi_type** ptr = ecif->cif->arg_types; ++ ++ /* Check that everything starts aligned properly. */ ++ FFI_ASSERT(stack == SF_ROUND(stack)); ++ FFI_ASSERT(stacktop == SF_ROUND(stacktop)); ++ FFI_ASSERT(bytes == SF_ROUND(bytes)); ++ ++ /* Deal with return values that are actually pass-by-reference. ++ Rule: ++ Return values are referenced by r3, so r4 is the first parameter. */ ++ ++ if (flags & FLAG_RETVAL_REFERENCE) ++ *next_arg++ = (unsigned long)(char*)ecif->rvalue; ++ ++ /* Now for the arguments. */ ++ for (i = ecif->cif->nargs; i > 0; i--, ptr++, p_argv++) ++ { ++ switch ((*ptr)->type) ++ { ++ /* If a floating-point parameter appears before all of the general- ++ purpose registers are filled, the corresponding GPRs that match ++ the size of the floating-point parameter are shadowed for the ++ benefit of vararg and pre-ANSI functions. */ ++ case FFI_TYPE_FLOAT: ++ double_tmp = *(float*)*p_argv; ++ ++ if (fparg_count < NUM_FPR_ARG_REGISTERS) ++ *fpr_base++ = double_tmp; ++ ++ *(double*)next_arg = double_tmp; ++ ++ next_arg++; ++ fparg_count++; ++ FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); ++ ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ double_tmp = *(double*)*p_argv; ++ ++ if (fparg_count < NUM_FPR_ARG_REGISTERS) ++ *fpr_base++ = double_tmp; ++ ++ *(double*)next_arg = double_tmp; ++ ++ next_arg += MODE_CHOICE(2,1); ++ fparg_count++; ++ FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); ++ ++ break; ++ ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++#if defined(__ppc64__) ++ if (fparg_count < NUM_FPR_ARG_REGISTERS) ++ *(long double*)fpr_base = *(long double*)*p_argv; ++#elif defined(__ppc__) ++ if (fparg_count < NUM_FPR_ARG_REGISTERS - 1) ++ *(long double*)fpr_base = *(long double*)*p_argv; ++ else if (fparg_count == NUM_FPR_ARG_REGISTERS - 1) ++ *(double*)fpr_base = *(double*)*p_argv; ++#else ++#error undefined architecture ++#endif ++ ++ *(long double*)next_arg = *(long double*)*p_argv; ++ fparg_count += 2; ++ fpr_base += 2; ++ next_arg += MODE_CHOICE(4,2); ++ FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); ++ ++ break; ++#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++#if defined(__ppc64__) ++ gprvalue = *(long long*)*p_argv; ++ goto putgpr; ++#elif defined(__ppc__) ++ *(long long*)next_arg = *(long long*)*p_argv; ++ next_arg += 2; ++ break; ++#else ++#error undefined architecture ++#endif ++ ++ case FFI_TYPE_POINTER: ++ gprvalue = *(unsigned long*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_UINT8: ++ gprvalue = *(unsigned char*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_SINT8: ++ gprvalue = *(signed char*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_UINT16: ++ gprvalue = *(unsigned short*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_SINT16: ++ gprvalue = *(signed short*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_STRUCT: ++ { ++#if defined(__ppc64__) ++ unsigned int gprSize = 0; ++ unsigned int fprSize = 0; ++ ++ ffi64_struct_to_reg_form(*ptr, (char*)*p_argv, NULL, &fparg_count, ++ (char*)next_arg, &gprSize, (char*)fpr_base, &fprSize); ++ next_arg += gprSize / sizeof(long); ++ fpr_base += fprSize / sizeof(double); ++ ++#elif defined(__ppc__) ++ char* dest_cpy = (char*)next_arg; ++ ++ /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, ++ SI 4 bytes) are aligned as if they were those modes. ++ Structures with 3 byte in size are padded upwards. */ ++ unsigned size_al = (*ptr)->size; ++ ++ /* If the first member of the struct is a double, then align ++ the struct to double-word. */ ++ if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) ++ size_al = ALIGN((*ptr)->size, 8); ++ ++ if (ecif->cif->abi == FFI_DARWIN) ++ { ++ if (size_al < 3) ++ dest_cpy += 4 - size_al; ++ } ++ ++ memcpy((char*)dest_cpy, (char*)*p_argv, size_al); ++ next_arg += (size_al + 3) / 4; ++#else ++#error undefined architecture ++#endif ++ break; ++ } ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ gprvalue = *(unsigned*)*p_argv; ++ ++putgpr: ++ *next_arg++ = gprvalue; ++ break; ++ ++ default: ++ break; ++ } ++ } ++ ++ /* Check that we didn't overrun the stack... */ ++ //FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS); ++ //FFI_ASSERT((unsigned *)fpr_base ++ // <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); ++ //FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); ++} ++ ++#if defined(__ppc64__) ++ ++bool ++ffi64_struct_contains_fp( ++ const ffi_type* inType) ++{ ++ bool containsFP = false; ++ unsigned int i; ++ ++ for (i = 0; inType->elements[i] != NULL && !containsFP; i++) ++ { ++ if (inType->elements[i]->type == FFI_TYPE_FLOAT || ++ inType->elements[i]->type == FFI_TYPE_DOUBLE || ++ inType->elements[i]->type == FFI_TYPE_LONGDOUBLE) ++ containsFP = true; ++ else if (inType->elements[i]->type == FFI_TYPE_STRUCT) ++ containsFP = ffi64_struct_contains_fp(inType->elements[i]); ++ } ++ ++ return containsFP; ++} ++ ++#endif // defined(__ppc64__) ++ ++/* Perform machine dependent cif processing. */ ++ffi_status ++ffi_prep_cif_machdep( ++ ffi_cif* cif) ++{ ++ /* All this is for the DARWIN ABI. */ ++ int i; ++ ffi_type** ptr; ++ int intarg_count = 0; ++ int fparg_count = 0; ++ unsigned int flags = 0; ++ unsigned int size_al = 0; ++ ++ /* All the machine-independent calculation of cif->bytes will be wrong. ++ Redo the calculation for DARWIN. */ ++ ++ /* Space for the frame pointer, callee's LR, CR, etc, and for ++ the asm's temp regs. */ ++ unsigned int bytes = (6 + ASM_NEEDS_REGISTERS) * sizeof(long); ++ ++ /* Return value handling. The rules are as follows: ++ - 32-bit (or less) integer values are returned in gpr3; ++ - Structures of size <= 4 bytes also returned in gpr3; ++ - 64-bit integer values and structures between 5 and 8 bytes are ++ returned in gpr3 and gpr4; ++ - Single/double FP values are returned in fpr1; ++ - Long double FP (if not equivalent to double) values are returned in ++ fpr1 and fpr2; ++ - Larger structures values are allocated space and a pointer is passed ++ as the first argument. */ ++ switch (cif->rtype->type) ++ { ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ flags |= FLAG_RETURNS_128BITS; ++ flags |= FLAG_RETURNS_FP; ++ break; ++#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_DOUBLE: ++ flags |= FLAG_RETURNS_64BITS; ++ /* Fall through. */ ++ case FFI_TYPE_FLOAT: ++ flags |= FLAG_RETURNS_FP; ++ break; ++ ++#if defined(__ppc64__) ++ case FFI_TYPE_POINTER: ++#endif ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ flags |= FLAG_RETURNS_64BITS; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ { ++#if defined(__ppc64__) ++ ++ if (ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) ++ { ++ flags |= FLAG_RETVAL_REFERENCE; ++ flags |= FLAG_RETURNS_NOTHING; ++ intarg_count++; ++ } ++ else ++ { ++ flags |= FLAG_RETURNS_STRUCT; ++ ++ if (ffi64_struct_contains_fp(cif->rtype)) ++ flags |= FLAG_STRUCT_CONTAINS_FP; ++ } ++ ++#elif defined(__ppc__) ++ ++ flags |= FLAG_RETVAL_REFERENCE; ++ flags |= FLAG_RETURNS_NOTHING; ++ intarg_count++; ++ ++#else ++#error undefined architecture ++#endif ++ break; ++ } ++ ++ case FFI_TYPE_VOID: ++ flags |= FLAG_RETURNS_NOTHING; ++ break; ++ ++ default: ++ /* Returns 32-bit integer, or similar. Nothing to do here. */ ++ break; ++ } ++ ++ /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the ++ first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest ++ goes on the stack. Structures are passed as a pointer to a copy of ++ the structure. Stuff on the stack needs to keep proper alignment. */ ++ for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) ++ { ++ switch ((*ptr)->type) ++ { ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ fparg_count++; ++ /* If this FP arg is going on the stack, it must be ++ 8-byte-aligned. */ ++ if (fparg_count > NUM_FPR_ARG_REGISTERS ++ && intarg_count % 2 != 0) ++ intarg_count++; ++ break; ++ ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ fparg_count += 2; ++ /* If this FP arg is going on the stack, it must be ++ 8-byte-aligned. */ ++ ++ if ( ++#if defined(__ppc64__) ++ fparg_count > NUM_FPR_ARG_REGISTERS + 1 ++#elif defined(__ppc__) ++ fparg_count > NUM_FPR_ARG_REGISTERS ++#else ++#error undefined architecture ++#endif ++ && intarg_count % 2 != 0) ++ intarg_count++; ++ ++ intarg_count += 2; ++ break; ++#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ /* 'long long' arguments are passed as two words, but ++ either both words must fit in registers or both go ++ on the stack. If they go on the stack, they must ++ be 8-byte-aligned. */ ++ if (intarg_count == NUM_GPR_ARG_REGISTERS - 1 ++ || (intarg_count >= NUM_GPR_ARG_REGISTERS ++ && intarg_count % 2 != 0)) ++ intarg_count++; ++ ++ intarg_count += MODE_CHOICE(2,1); ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ size_al = (*ptr)->size; ++ /* If the first member of the struct is a double, then align ++ the struct to double-word. */ ++ if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) ++ size_al = ALIGN((*ptr)->size, 8); ++ ++#if defined(__ppc64__) ++ // Look for FP struct members. ++ unsigned int j; ++ ++ for (j = 0; (*ptr)->elements[j] != NULL; j++) ++ { ++ if ((*ptr)->elements[j]->type == FFI_TYPE_FLOAT || ++ (*ptr)->elements[j]->type == FFI_TYPE_DOUBLE) ++ { ++ fparg_count++; ++ ++ if (fparg_count > NUM_FPR_ARG_REGISTERS) ++ intarg_count++; ++ } ++ else if ((*ptr)->elements[j]->type == FFI_TYPE_LONGDOUBLE) ++ { ++ fparg_count += 2; ++ ++ if (fparg_count > NUM_FPR_ARG_REGISTERS + 1) ++ intarg_count += 2; ++ } ++ else ++ intarg_count++; ++ } ++#elif defined(__ppc__) ++ intarg_count += (size_al + 3) / 4; ++#else ++#error undefined architecture ++#endif ++ ++ break; ++ ++ default: ++ /* Everything else is passed as a 4/8-byte word in a GPR, either ++ the object itself or a pointer to it. */ ++ intarg_count++; ++ break; ++ } ++ } ++ ++ /* Space for the FPR registers, if needed. */ ++ if (fparg_count != 0) ++ { ++ flags |= FLAG_FP_ARGUMENTS; ++#if defined(__ppc64__) ++ bytes += (NUM_FPR_ARG_REGISTERS + 1) * sizeof(double); ++#elif defined(__ppc__) ++ bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); ++#else ++#error undefined architecture ++#endif ++ } ++ ++ /* Stack space. */ ++#if defined(__ppc64__) ++ if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS) ++ bytes += (intarg_count + fparg_count) * sizeof(long); ++#elif defined(__ppc__) ++ if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS) ++ bytes += (intarg_count + 2 * fparg_count) * sizeof(long); ++#else ++#error undefined architecture ++#endif ++ else ++ bytes += NUM_GPR_ARG_REGISTERS * sizeof(long); ++ ++ /* The stack space allocated needs to be a multiple of 16/32 bytes. */ ++ bytes = SF_ROUND(bytes); ++ ++ cif->flags = flags; ++ cif->bytes = bytes; ++ ++ return FFI_OK; ++} ++ ++/*@-declundef@*/ ++/*@-exportheader@*/ ++extern void ++ffi_call_AIX( ++/*@out@*/ extended_cif*, ++ unsigned, ++ unsigned, ++/*@out@*/ unsigned*, ++ void (*fn)(void), ++ void (*fn2)(extended_cif*, unsigned *const)); ++ ++extern void ++ffi_call_DARWIN( ++/*@out@*/ extended_cif*, ++ unsigned long, ++ unsigned, ++/*@out@*/ unsigned*, ++ void (*fn)(void), ++ void (*fn2)(extended_cif*, unsigned *const)); ++/*@=declundef@*/ ++/*@=exportheader@*/ ++ ++void ++ffi_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ void** avalue) ++{ ++ extended_cif ecif; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return ++ value address then we need to make one. */ ++ if ((rvalue == NULL) && ++ (cif->rtype->type == FFI_TYPE_STRUCT)) ++ { ++ /*@-sysunrecog@*/ ++ ecif.rvalue = alloca(cif->rtype->size); ++ /*@=sysunrecog@*/ ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ switch (cif->abi) ++ { ++ case FFI_AIX: ++ /*@-usedef@*/ ++ ffi_call_AIX(&ecif, -cif->bytes, ++ cif->flags, ecif.rvalue, fn, ffi_prep_args); ++ /*@=usedef@*/ ++ break; ++ ++ case FFI_DARWIN: ++ /*@-usedef@*/ ++ ffi_call_DARWIN(&ecif, -(long)cif->bytes, ++ cif->flags, ecif.rvalue, fn, ffi_prep_args); ++ /*@=usedef@*/ ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++/* here I'd like to add the stack frame layout we use in darwin_closure.S ++ and aix_clsoure.S ++ ++ SP previous -> +---------------------------------------+ <--- child frame ++ | back chain to caller 4 | ++ +---------------------------------------+ 4 ++ | saved CR 4 | ++ +---------------------------------------+ 8 ++ | saved LR 4 | ++ +---------------------------------------+ 12 ++ | reserved for compilers 4 | ++ +---------------------------------------+ 16 ++ | reserved for binders 4 | ++ +---------------------------------------+ 20 ++ | saved TOC pointer 4 | ++ +---------------------------------------+ 24 ++ | always reserved 8*4=32 (previous GPRs)| ++ | according to the linkage convention | ++ | from AIX | ++ +---------------------------------------+ 56 ++ | our FPR area 13*8=104 | ++ | f1 | ++ | . | ++ | f13 | ++ +---------------------------------------+ 160 ++ | result area 8 | ++ +---------------------------------------+ 168 ++ | alignement to the next multiple of 16 | ++SP current --> +---------------------------------------+ 176 <- parent frame ++ | back chain to caller 4 | ++ +---------------------------------------+ 180 ++ | saved CR 4 | ++ +---------------------------------------+ 184 ++ | saved LR 4 | ++ +---------------------------------------+ 188 ++ | reserved for compilers 4 | ++ +---------------------------------------+ 192 ++ | reserved for binders 4 | ++ +---------------------------------------+ 196 ++ | saved TOC pointer 4 | ++ +---------------------------------------+ 200 ++ | always reserved 8*4=32 we store our | ++ | GPRs here | ++ | r3 | ++ | . | ++ | r10 | ++ +---------------------------------------+ 232 ++ | overflow part | ++ +---------------------------------------+ xxx ++ | ???? | ++ +---------------------------------------+ xxx ++*/ ++ ++#if !defined(POWERPC_DARWIN) ++ ++#define MIN_LINE_SIZE 32 ++ ++static void ++flush_icache( ++ char* addr) ++{ ++#ifndef _AIX ++ __asm__ volatile ( ++ "dcbf 0,%0\n" ++ "sync\n" ++ "icbi 0,%0\n" ++ "sync\n" ++ "isync" ++ : : "r" (addr) : "memory"); ++#endif ++} ++ ++static void ++flush_range( ++ char* addr, ++ int size) ++{ ++ int i; ++ ++ for (i = 0; i < size; i += MIN_LINE_SIZE) ++ flush_icache(addr + i); ++ ++ flush_icache(addr + size - 1); ++} ++ ++#endif // !defined(POWERPC_DARWIN) ++ ++ffi_status ++ffi_prep_closure( ++ ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*, void*, void**, void*), ++ void* user_data) ++{ ++ switch (cif->abi) ++ { ++ case FFI_DARWIN: ++ { ++ FFI_ASSERT (cif->abi == FFI_DARWIN); ++ ++ unsigned int* tramp = (unsigned int*)&closure->tramp[0]; ++ ++#if defined(__ppc64__) ++ tramp[0] = 0x7c0802a6; // mflr r0 ++ tramp[1] = 0x429f0005; // bcl 20,31,+0x8 ++ tramp[2] = 0x7d6802a6; // mflr r11 ++ tramp[3] = 0x7c0803a6; // mtlr r0 ++ tramp[4] = 0xe98b0018; // ld r12,24(r11) ++ tramp[5] = 0x7d8903a6; // mtctr r12 ++ tramp[6] = 0xe96b0020; // ld r11,32(r11) ++ tramp[7] = 0x4e800420; // bctr ++ *(unsigned long*)&tramp[8] = (unsigned long)ffi_closure_ASM; ++ *(unsigned long*)&tramp[10] = (unsigned long)closure; ++#elif defined(__ppc__) ++ tramp[0] = 0x7c0802a6; // mflr r0 ++ tramp[1] = 0x429f0005; // bcl 20,31,+0x8 ++ tramp[2] = 0x7d6802a6; // mflr r11 ++ tramp[3] = 0x7c0803a6; // mtlr r0 ++ tramp[4] = 0x818b0018; // lwz r12,24(r11) ++ tramp[5] = 0x7d8903a6; // mtctr r12 ++ tramp[6] = 0x816b001c; // lwz r11,28(r11) ++ tramp[7] = 0x4e800420; // bctr ++ tramp[8] = (unsigned long)ffi_closure_ASM; ++ tramp[9] = (unsigned long)closure; ++#else ++#error undefined architecture ++#endif ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ ++ // Flush the icache. Only necessary on Darwin. ++#if defined(POWERPC_DARWIN) ++ sys_icache_invalidate(closure->tramp, FFI_TRAMPOLINE_SIZE); ++#else ++ flush_range(closure->tramp, FFI_TRAMPOLINE_SIZE); ++#endif ++ ++ break; ++ } ++ ++ case FFI_AIX: ++ { ++ FFI_ASSERT (cif->abi == FFI_AIX); ++ ++ ffi_aix_trampoline_struct* tramp_aix = ++ (ffi_aix_trampoline_struct*)(closure->tramp); ++ aix_fd* fd = (aix_fd*)(void*)ffi_closure_ASM; ++ ++ tramp_aix->code_pointer = fd->code_pointer; ++ tramp_aix->toc = fd->toc; ++ tramp_aix->static_chain = closure; ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ break; ++ } ++ ++ default: ++ return FFI_BAD_ABI; ++ } ++ ++ return FFI_OK; ++} ++ ++#if defined(__ppc__) ++ typedef double ldbits[2]; ++ ++ typedef union ++ { ++ ldbits lb; ++ long double ld; ++ } ldu; ++#endif ++ ++typedef union ++{ ++ float f; ++ double d; ++} ffi_dblfl; ++ ++/* The trampoline invokes ffi_closure_ASM, and on entry, r11 holds the ++ address of the closure. After storing the registers that could possibly ++ contain parameters to be passed into the stack frame and setting up space ++ for a return value, ffi_closure_ASM invokes the following helper function ++ to do most of the work. */ ++int ++ffi_closure_helper_DARWIN( ++ ffi_closure* closure, ++ void* rvalue, ++ unsigned long* pgr, ++ ffi_dblfl* pfr) ++{ ++ /* rvalue is the pointer to space for return value in closure assembly ++ pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM ++ pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM. */ ++ ++#if defined(__ppc__) ++ ldu temp_ld; ++#endif ++ ++ double temp; ++ unsigned int i; ++ unsigned int nf = 0; /* number of FPRs already used. */ ++ unsigned int ng = 0; /* number of GPRs already used. */ ++ ffi_cif* cif = closure->cif; ++ long avn = cif->nargs; ++ void** avalue = alloca(cif->nargs * sizeof(void*)); ++ ffi_type** arg_types = cif->arg_types; ++ ++ /* Copy the caller's structure return value address so that the closure ++ returns the data directly to the caller. */ ++#if defined(__ppc64__) ++ if (cif->rtype->type == FFI_TYPE_STRUCT && ++ ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) ++#elif defined(__ppc__) ++ if (cif->rtype->type == FFI_TYPE_STRUCT) ++#else ++#error undefined architecture ++#endif ++ { ++ rvalue = (void*)*pgr; ++ pgr++; ++ ng++; ++ } ++ ++ /* Grab the addresses of the arguments from the stack frame. */ ++ for (i = 0; i < avn; i++) ++ { ++ switch (arg_types[i]->type) ++ { ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT8: ++ avalue[i] = (char*)pgr + MODE_CHOICE(3,7); ++ ng++; ++ pgr++; ++ break; ++ ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT16: ++ avalue[i] = (char*)pgr + MODE_CHOICE(2,6); ++ ng++; ++ pgr++; ++ break; ++ ++#if defined(__ppc__) ++ case FFI_TYPE_POINTER: ++#endif ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT32: ++ avalue[i] = (char*)pgr + MODE_CHOICE(0,4); ++ ng++; ++ pgr++; ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ if (cif->abi == FFI_DARWIN) ++ { ++#if defined(__ppc64__) ++ unsigned int gprSize = 0; ++ unsigned int fprSize = 0; ++ unsigned int savedFPRSize = fprSize; ++ ++ avalue[i] = alloca(arg_types[i]->size); ++ ffi64_struct_to_ram_form(arg_types[i], (const char*)pgr, ++ &gprSize, (const char*)pfr, &fprSize, &nf, avalue[i], NULL); ++ ++ ng += gprSize / sizeof(long); ++ pgr += gprSize / sizeof(long); ++ pfr += (fprSize - savedFPRSize) / sizeof(double); ++ ++#elif defined(__ppc__) ++ /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, ++ SI 4 bytes) are aligned as if they were those modes. */ ++ unsigned int size_al = size_al = arg_types[i]->size; ++ ++ /* If the first member of the struct is a double, then align ++ the struct to double-word. */ ++ if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE) ++ size_al = ALIGN(arg_types[i]->size, 8); ++ ++ if (size_al < 3) ++ avalue[i] = (void*)pgr + MODE_CHOICE(4,8) - size_al; ++ else ++ avalue[i] = (void*)pgr; ++ ++ ng += (size_al + 3) / sizeof(long); ++ pgr += (size_al + 3) / sizeof(long); ++#else ++#error undefined architecture ++#endif ++ } ++ ++ break; ++ ++#if defined(__ppc64__) ++ case FFI_TYPE_POINTER: ++#endif ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_UINT64: ++ /* Long long ints are passed in 1 or 2 GPRs. */ ++ avalue[i] = pgr; ++ ng += MODE_CHOICE(2,1); ++ pgr += MODE_CHOICE(2,1); ++ ++ break; ++ ++ case FFI_TYPE_FLOAT: ++ /* A float value consumes a GPR. ++ There are 13 64-bit floating point registers. */ ++ if (nf < NUM_FPR_ARG_REGISTERS) ++ { ++ temp = pfr->d; ++ pfr->f = (float)temp; ++ avalue[i] = pfr; ++ pfr++; ++ } ++ else ++ avalue[i] = pgr; ++ ++ nf++; ++ ng++; ++ pgr++; ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ /* A double value consumes one or two GPRs. ++ There are 13 64bit floating point registers. */ ++ if (nf < NUM_FPR_ARG_REGISTERS) ++ { ++ avalue[i] = pfr; ++ pfr++; ++ } ++ else ++ avalue[i] = pgr; ++ ++ nf++; ++ ng += MODE_CHOICE(2,1); ++ pgr += MODE_CHOICE(2,1); ++ ++ break; ++ ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_LONGDOUBLE: ++#if defined(__ppc64__) ++ if (nf < NUM_FPR_ARG_REGISTERS) ++ { ++ avalue[i] = pfr; ++ pfr += 2; ++ } ++#elif defined(__ppc__) ++ /* A long double value consumes 2/4 GPRs and 2 FPRs. ++ There are 13 64bit floating point registers. */ ++ if (nf < NUM_FPR_ARG_REGISTERS - 1) ++ { ++ avalue[i] = pfr; ++ pfr += 2; ++ } ++ /* Here we have the situation where one part of the long double ++ is stored in fpr13 and the other part is already on the stack. ++ We use a union to pass the long double to avalue[i]. */ ++ else if (nf == NUM_FPR_ARG_REGISTERS - 1) ++ { ++ memcpy (&temp_ld.lb[0], pfr, sizeof(temp_ld.lb[0])); ++ memcpy (&temp_ld.lb[1], pgr + 2, sizeof(temp_ld.lb[1])); ++ avalue[i] = &temp_ld.ld; ++ } ++#else ++#error undefined architecture ++#endif ++ else ++ avalue[i] = pgr; ++ ++ nf += 2; ++ ng += MODE_CHOICE(4,2); ++ pgr += MODE_CHOICE(4,2); ++ ++ break; ++ ++#endif /* FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE */ ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ } ++ ++ (closure->fun)(cif, rvalue, avalue, closure->user_data); ++ ++ /* Tell ffi_closure_ASM to perform return type promotions. */ ++ return cif->rtype->type; ++} ++ ++#if defined(__ppc64__) ++ ++/* ffi64_struct_to_ram_form ++ ++ Rebuild a struct's natural layout from buffers of concatenated registers. ++ Return the number of registers used. ++ inGPRs[0-7] == r3, inFPRs[0-7] == f1 ... ++*/ ++void ++ffi64_struct_to_ram_form( ++ const ffi_type* inType, ++ const char* inGPRs, ++ unsigned int* ioGPRMarker, ++ const char* inFPRs, ++ unsigned int* ioFPRMarker, ++ unsigned int* ioFPRsUsed, ++ char* outStruct, // caller-allocated ++ unsigned int* ioStructMarker) ++{ ++ unsigned int srcGMarker = 0; ++ unsigned int srcFMarker = 0; ++ unsigned int savedFMarker = 0; ++ unsigned int fprsUsed = 0; ++ unsigned int savedFPRsUsed = 0; ++ unsigned int destMarker = 0; ++ ++ static unsigned int recurseCount = 0; ++ ++ if (ioGPRMarker) ++ srcGMarker = *ioGPRMarker; ++ ++ if (ioFPRMarker) ++ { ++ srcFMarker = *ioFPRMarker; ++ savedFMarker = srcFMarker; ++ } ++ ++ if (ioFPRsUsed) ++ { ++ fprsUsed = *ioFPRsUsed; ++ savedFPRsUsed = fprsUsed; ++ } ++ ++ if (ioStructMarker) ++ destMarker = *ioStructMarker; ++ ++ size_t i; ++ ++ switch (inType->size) ++ { ++ case 1: case 2: case 4: ++ srcGMarker += 8 - inType->size; ++ break; ++ ++ default: ++ break; ++ } ++ ++ for (i = 0; inType->elements[i] != NULL; i++) ++ { ++ switch (inType->elements[i]->type) ++ { ++ case FFI_TYPE_FLOAT: ++ srcFMarker = ALIGN(srcFMarker, 4); ++ srcGMarker = ALIGN(srcGMarker, 4); ++ destMarker = ALIGN(destMarker, 4); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ *(float*)&outStruct[destMarker] = ++ (float)*(double*)&inFPRs[srcFMarker]; ++ srcFMarker += 8; ++ fprsUsed++; ++ } ++ else ++ *(float*)&outStruct[destMarker] = ++ (float)*(double*)&inGPRs[srcGMarker]; ++ ++ srcGMarker += 4; ++ destMarker += 4; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (destMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) ++ srcGMarker = ALIGN(srcGMarker, 8); ++ } ++ ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ srcFMarker = ALIGN(srcFMarker, 8); ++ destMarker = ALIGN(destMarker, 8); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ *(double*)&outStruct[destMarker] = ++ *(double*)&inFPRs[srcFMarker]; ++ srcFMarker += 8; ++ fprsUsed++; ++ } ++ else ++ *(double*)&outStruct[destMarker] = ++ *(double*)&inGPRs[srcGMarker]; ++ ++ destMarker += 8; ++ ++ // Skip next GPR ++ srcGMarker += 8; ++ srcGMarker = ALIGN(srcGMarker, 8); ++ ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ destMarker = ALIGN(destMarker, 16); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ srcFMarker = ALIGN(srcFMarker, 8); ++ srcGMarker = ALIGN(srcGMarker, 8); ++ *(long double*)&outStruct[destMarker] = ++ *(long double*)&inFPRs[srcFMarker]; ++ srcFMarker += 16; ++ fprsUsed += 2; ++ } ++ else ++ { ++ srcFMarker = ALIGN(srcFMarker, 16); ++ srcGMarker = ALIGN(srcGMarker, 16); ++ *(long double*)&outStruct[destMarker] = ++ *(long double*)&inGPRs[srcGMarker]; ++ } ++ ++ destMarker += 16; ++ ++ // Skip next 2 GPRs ++ srcGMarker += 16; ++ srcGMarker = ALIGN(srcGMarker, 8); ++ ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ { ++ if (inType->alignment == 1) // chars only ++ { ++ if (inType->size == 1) ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ else if (inType->size == 2) ++ { ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ i++; ++ } ++ else ++ { ++ memcpy(&outStruct[destMarker], ++ &inGPRs[srcGMarker], inType->size); ++ srcGMarker += inType->size; ++ destMarker += inType->size; ++ i += inType->size - 1; ++ } ++ } ++ else // chars and other stuff ++ { ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (srcGMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) ++ srcGMarker = ALIGN(srcGMarker, inType->alignment); // was 8 ++ } ++ } ++ ++ break; ++ } ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ srcGMarker = ALIGN(srcGMarker, 2); ++ destMarker = ALIGN(destMarker, 2); ++ ++ *(short*)&outStruct[destMarker] = ++ *(short*)&inGPRs[srcGMarker]; ++ srcGMarker += 2; ++ destMarker += 2; ++ ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ srcGMarker = ALIGN(srcGMarker, 4); ++ destMarker = ALIGN(destMarker, 4); ++ ++ *(int*)&outStruct[destMarker] = ++ *(int*)&inGPRs[srcGMarker]; ++ srcGMarker += 4; ++ destMarker += 4; ++ ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ srcGMarker = ALIGN(srcGMarker, 8); ++ destMarker = ALIGN(destMarker, 8); ++ ++ *(long long*)&outStruct[destMarker] = ++ *(long long*)&inGPRs[srcGMarker]; ++ srcGMarker += 8; ++ destMarker += 8; ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ recurseCount++; ++ ffi64_struct_to_ram_form(inType->elements[i], inGPRs, ++ &srcGMarker, inFPRs, &srcFMarker, &fprsUsed, ++ outStruct, &destMarker); ++ recurseCount--; ++ break; ++ ++ default: ++ FFI_ASSERT(0); // unknown element type ++ break; ++ } ++ } ++ ++ srcGMarker = ALIGN(srcGMarker, inType->alignment); ++ ++ // Take care of the special case for 16-byte structs, but not for ++ // nested structs. ++ if (recurseCount == 0 && srcGMarker == 16) ++ { ++ *(long double*)&outStruct[0] = *(long double*)&inGPRs[0]; ++ srcFMarker = savedFMarker; ++ fprsUsed = savedFPRsUsed; ++ } ++ ++ if (ioGPRMarker) ++ *ioGPRMarker = ALIGN(srcGMarker, 8); ++ ++ if (ioFPRMarker) ++ *ioFPRMarker = srcFMarker; ++ ++ if (ioFPRsUsed) ++ *ioFPRsUsed = fprsUsed; ++ ++ if (ioStructMarker) ++ *ioStructMarker = ALIGN(destMarker, 8); ++} ++ ++/* ffi64_struct_to_reg_form ++ ++ Copy a struct's elements into buffers that can be sliced into registers. ++ Return the sizes of the output buffers in bytes. Pass NULL buffer pointers ++ to calculate size only. ++ outGPRs[0-7] == r3, outFPRs[0-7] == f1 ... ++*/ ++void ++ffi64_struct_to_reg_form( ++ const ffi_type* inType, ++ const char* inStruct, ++ unsigned int* ioStructMarker, ++ unsigned int* ioFPRsUsed, ++ char* outGPRs, // caller-allocated ++ unsigned int* ioGPRSize, ++ char* outFPRs, // caller-allocated ++ unsigned int* ioFPRSize) ++{ ++ size_t i; ++ unsigned int srcMarker = 0; ++ unsigned int destGMarker = 0; ++ unsigned int destFMarker = 0; ++ unsigned int savedFMarker = 0; ++ unsigned int fprsUsed = 0; ++ unsigned int savedFPRsUsed = 0; ++ ++ static unsigned int recurseCount = 0; ++ ++ if (ioStructMarker) ++ srcMarker = *ioStructMarker; ++ ++ if (ioFPRsUsed) ++ { ++ fprsUsed = *ioFPRsUsed; ++ savedFPRsUsed = fprsUsed; ++ } ++ ++ if (ioGPRSize) ++ destGMarker = *ioGPRSize; ++ ++ if (ioFPRSize) ++ { ++ destFMarker = *ioFPRSize; ++ savedFMarker = destFMarker; ++ } ++ ++ switch (inType->size) ++ { ++ case 1: case 2: case 4: ++ destGMarker += 8 - inType->size; ++ break; ++ ++ default: ++ break; ++ } ++ ++ for (i = 0; inType->elements[i] != NULL; i++) ++ { ++ switch (inType->elements[i]->type) ++ { ++ // Shadow floating-point types in GPRs for vararg and pre-ANSI ++ // functions. ++ case FFI_TYPE_FLOAT: ++ // Nudge markers to next 4/8-byte boundary ++ srcMarker = ALIGN(srcMarker, 4); ++ destGMarker = ALIGN(destGMarker, 4); ++ destFMarker = ALIGN(destFMarker, 8); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ if (outFPRs != NULL && inStruct != NULL) ++ *(double*)&outFPRs[destFMarker] = ++ (double)*(float*)&inStruct[srcMarker]; ++ ++ destFMarker += 8; ++ fprsUsed++; ++ } ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(double*)&outGPRs[destGMarker] = ++ (double)*(float*)&inStruct[srcMarker]; ++ ++ srcMarker += 4; ++ destGMarker += 4; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (srcMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 4)) ++ destGMarker = ALIGN(destGMarker, 8); ++ } ++ ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ srcMarker = ALIGN(srcMarker, 8); ++ destFMarker = ALIGN(destFMarker, 8); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ if (outFPRs != NULL && inStruct != NULL) ++ *(double*)&outFPRs[destFMarker] = ++ *(double*)&inStruct[srcMarker]; ++ ++ destFMarker += 8; ++ fprsUsed++; ++ } ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(double*)&outGPRs[destGMarker] = ++ *(double*)&inStruct[srcMarker]; ++ ++ srcMarker += 8; ++ ++ // Skip next GPR ++ destGMarker += 8; ++ destGMarker = ALIGN(destGMarker, 8); ++ ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ srcMarker = ALIGN(srcMarker, 16); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ destFMarker = ALIGN(destFMarker, 8); ++ destGMarker = ALIGN(destGMarker, 8); ++ ++ if (outFPRs != NULL && inStruct != NULL) ++ *(long double*)&outFPRs[destFMarker] = ++ *(long double*)&inStruct[srcMarker]; ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long double*)&outGPRs[destGMarker] = ++ *(long double*)&inStruct[srcMarker]; ++ ++ destFMarker += 16; ++ fprsUsed += 2; ++ } ++ else ++ { ++ destGMarker = ALIGN(destGMarker, 16); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long double*)&outGPRs[destGMarker] = ++ *(long double*)&inStruct[srcMarker]; ++ } ++ ++ srcMarker += 16; ++ destGMarker += 16; // Skip next 2 GPRs ++ destGMarker = ALIGN(destGMarker, 8); // was 16 ++ ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ if (inType->alignment == 1) // bytes only ++ { ++ if (inType->size == 1) ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ outGPRs[destGMarker] = inStruct[srcMarker]; ++ ++ srcMarker++; ++ destGMarker++; ++ } ++ else if (inType->size == 2) ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ { ++ outGPRs[destGMarker] = inStruct[srcMarker]; ++ outGPRs[destGMarker + 1] = inStruct[srcMarker + 1]; ++ } ++ ++ srcMarker += 2; ++ destGMarker += 2; ++ ++ i++; ++ } ++ else ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ { ++ // Avoid memcpy for small chunks. ++ if (inType->size <= sizeof(long)) ++ *(long*)&outGPRs[destGMarker] = ++ *(long*)&inStruct[srcMarker]; ++ else ++ memcpy(&outGPRs[destGMarker], ++ &inStruct[srcMarker], inType->size); ++ } ++ ++ srcMarker += inType->size; ++ destGMarker += inType->size; ++ i += inType->size - 1; ++ } ++ } ++ else // bytes and other stuff ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ outGPRs[destGMarker] = inStruct[srcMarker]; ++ ++ srcMarker++; ++ destGMarker++; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (destGMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 4)) ++ destGMarker = ALIGN(destGMarker, inType->alignment); // was 8 ++ } ++ } ++ ++ break; ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ srcMarker = ALIGN(srcMarker, 2); ++ destGMarker = ALIGN(destGMarker, 2); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(short*)&outGPRs[destGMarker] = ++ *(short*)&inStruct[srcMarker]; ++ ++ srcMarker += 2; ++ destGMarker += 2; ++ ++ if (inType->elements[i + 1] == NULL) ++ destGMarker = ALIGN(destGMarker, inType->alignment); ++ ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ srcMarker = ALIGN(srcMarker, 4); ++ destGMarker = ALIGN(destGMarker, 4); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(int*)&outGPRs[destGMarker] = ++ *(int*)&inStruct[srcMarker]; ++ ++ srcMarker += 4; ++ destGMarker += 4; ++ ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ srcMarker = ALIGN(srcMarker, 8); ++ destGMarker = ALIGN(destGMarker, 8); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long long*)&outGPRs[destGMarker] = ++ *(long long*)&inStruct[srcMarker]; ++ ++ srcMarker += 8; ++ destGMarker += 8; ++ ++ if (inType->elements[i + 1] == NULL) ++ destGMarker = ALIGN(destGMarker, inType->alignment); ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ recurseCount++; ++ ffi64_struct_to_reg_form(inType->elements[i], ++ inStruct, &srcMarker, &fprsUsed, outGPRs, ++ &destGMarker, outFPRs, &destFMarker); ++ recurseCount--; ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ } ++ ++ destGMarker = ALIGN(destGMarker, inType->alignment); ++ ++ // Take care of the special case for 16-byte structs, but not for ++ // nested structs. ++ if (recurseCount == 0 && destGMarker == 16) ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long double*)&outGPRs[0] = *(long double*)&inStruct[0]; ++ ++ destFMarker = savedFMarker; ++ fprsUsed = savedFPRsUsed; ++ } ++ ++ if (ioStructMarker) ++ *ioStructMarker = ALIGN(srcMarker, 8); ++ ++ if (ioFPRsUsed) ++ *ioFPRsUsed = fprsUsed; ++ ++ if (ioGPRSize) ++ *ioGPRSize = ALIGN(destGMarker, 8); ++ ++ if (ioFPRSize) ++ *ioFPRSize = ALIGN(destFMarker, 8); ++} ++ ++/* ffi64_stret_needs_ptr ++ ++ Determine whether a returned struct needs a pointer in r3 or can fit ++ in registers. ++*/ ++ ++bool ++ffi64_stret_needs_ptr( ++ const ffi_type* inType, ++ unsigned short* ioGPRCount, ++ unsigned short* ioFPRCount) ++{ ++ // Obvious case first- struct is larger than combined FPR size. ++ if (inType->size > 14 * 8) ++ return true; ++ ++ // Now the struct can physically fit in registers, determine if it ++ // also fits logically. ++ bool needsPtr = false; ++ unsigned short gprsUsed = 0; ++ unsigned short fprsUsed = 0; ++ size_t i; ++ ++ if (ioGPRCount) ++ gprsUsed = *ioGPRCount; ++ ++ if (ioFPRCount) ++ fprsUsed = *ioFPRCount; ++ ++ for (i = 0; inType->elements[i] != NULL && !needsPtr; i++) ++ { ++ switch (inType->elements[i]->type) ++ { ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ gprsUsed++; ++ fprsUsed++; ++ ++ if (fprsUsed > 13) ++ needsPtr = true; ++ ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ gprsUsed += 2; ++ fprsUsed += 2; ++ ++ if (fprsUsed > 14) ++ needsPtr = true; ++ ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ { ++ gprsUsed++; ++ ++ if (gprsUsed > 8) ++ { ++ needsPtr = true; ++ break; ++ } ++ ++ if (inType->elements[i + 1] == NULL) // last byte in the struct ++ break; ++ ++ // Count possible contiguous bytes ahead, up to 8. ++ unsigned short j; ++ ++ for (j = 1; j < 8; j++) ++ { ++ if (inType->elements[i + j] == NULL || ++ !FFI_TYPE_1_BYTE(inType->elements[i + j]->type)) ++ break; ++ } ++ ++ i += j - 1; // allow for i++ before the test condition ++ ++ break; ++ } ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ gprsUsed++; ++ ++ if (gprsUsed > 8) ++ needsPtr = true; ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ needsPtr = ffi64_stret_needs_ptr( ++ inType->elements[i], &gprsUsed, &fprsUsed); ++ ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ } ++ ++ if (ioGPRCount) ++ *ioGPRCount = gprsUsed; ++ ++ if (ioFPRCount) ++ *ioFPRCount = fprsUsed; ++ ++ return needsPtr; ++} ++ ++/* ffi64_data_size ++ ++ Calculate the size in bytes of an ffi type. ++*/ ++ ++unsigned int ++ffi64_data_size( ++ const ffi_type* inType) ++{ ++ unsigned int size = 0; ++ ++ switch (inType->type) ++ { ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ size = 1; ++ break; ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ size = 2; ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_FLOAT: ++ size = 4; ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_DOUBLE: ++ size = 8; ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ size = 16; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ ffi64_struct_to_reg_form( ++ inType, NULL, NULL, NULL, NULL, &size, NULL, NULL); ++ break; ++ ++ case FFI_TYPE_VOID: ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ ++ return size; ++} ++ ++#endif /* defined(__ppc64__) */ ++#endif /* __ppc__ || __ppc64__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S +new file mode 100644 +index 0000000..7162fa1 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S +@@ -0,0 +1,418 @@ ++#if defined(__ppc64__) ++ ++/* ----------------------------------------------------------------------- ++ ppc64-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, ++ Inc. based on ppc_closure.S ++ ++ PowerPC Assembly glue. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++ ++#include ++#include // for FFI_TRAMPOLINE_SIZE ++#include ++#include ++ ++ .file "ppc64-darwin_closure.S" ++.text ++ .align LOG2_GPR_BYTES ++ .globl _ffi_closure_ASM ++ ++.text ++ .align LOG2_GPR_BYTES ++ ++_ffi_closure_ASM: ++LFB1: ++ mflr r0 ++ stg r0,SF_RETURN(r1) // save return address ++ ++ // Save GPRs 3 - 10 (aligned to 8) in the parents outgoing area. ++ stg r3,SF_ARG1(r1) ++ stg r4,SF_ARG2(r1) ++ stg r5,SF_ARG3(r1) ++ stg r6,SF_ARG4(r1) ++ stg r7,SF_ARG5(r1) ++ stg r8,SF_ARG6(r1) ++ stg r9,SF_ARG7(r1) ++ stg r10,SF_ARG8(r1) ++ ++LCFI0: ++/* 48 bytes (Linkage Area) ++ 64 bytes (outgoing parameter area, always reserved) ++ 112 bytes (14*8 for incoming FPR) ++ ? bytes (result) ++ 112 bytes (14*8 for outgoing FPR) ++ 16 bytes (2 saved registers) ++ 352 + ? total bytes ++*/ ++ ++ std r31,-8(r1) // Save registers we use. ++ std r30,-16(r1) ++ mr r30,r1 // Save the old SP. ++ mr r31,r11 // Save the ffi_closure around ffi64_data_size. ++ ++ // Calculate the space we need. ++ stdu r1,-SF_MINSIZE(r1) ++ ld r3,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* ++ ld r3,16(r3) // ffi_cif->rtype* ++ bl Lffi64_data_size$stub ++ ld r1,0(r1) ++ ++ addi r3,r3,352 // Add our overhead. ++ neg r3,r3 ++ li r0,-32 // Align to 32 bytes. ++ and r3,r3,r0 ++ stdux r1,r1,r3 // Grow the stack. ++ ++ mr r11,r31 // Copy the ffi_closure back. ++ ++LCFI1: ++ // We want to build up an area for the parameters passed ++ // in registers. (both floating point and integer) ++ ++/* 320 bytes (callee stack frame aligned to 32) ++ 48 bytes (caller linkage area) ++ 368 (start of caller parameter area aligned to 8) ++*/ ++ ++ // Save FPRs 1 - 14. (aligned to 8) ++ stfd f1,112(r1) ++ stfd f2,120(r1) ++ stfd f3,128(r1) ++ stfd f4,136(r1) ++ stfd f5,144(r1) ++ stfd f6,152(r1) ++ stfd f7,160(r1) ++ stfd f8,168(r1) ++ stfd f9,176(r1) ++ stfd f10,184(r1) ++ stfd f11,192(r1) ++ stfd f12,200(r1) ++ stfd f13,208(r1) ++ stfd f14,216(r1) ++ ++ // Set up registers for the routine that actually does the work. ++ mr r3,r11 // context pointer from the trampoline ++ addi r4,r1,224 // result storage ++ addi r5,r30,SF_ARG1 // saved GPRs ++ addi r6,r1,112 // saved FPRs ++ bl Lffi_closure_helper_DARWIN$stub ++ ++ // Look the proper starting point in table ++ // by using return type as an offset. ++ addi r5,r1,224 // Get pointer to results area. ++ bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. ++ mflr r4 // Move to r4. ++ slwi r3,r3,4 // Now multiply return type by 16. ++ add r3,r3,r4 // Add contents of table to table address. ++ mtctr r3 ++ bctr ++ ++LFE1: ++ // Each of the ret_typeX code fragments has to be exactly 16 bytes long ++ // (4 instructions). For cache effectiveness we align to a 16 byte ++ // boundary first. ++ .align 4 ++ nop ++ nop ++ nop ++ ++Lget_ret_type0_addr: ++ blrl ++ ++// case FFI_TYPE_VOID ++Lret_type0: ++ b Lfinish ++ nop ++ nop ++ nop ++ ++// case FFI_TYPE_INT ++Lret_type1: ++ lwz r3,4(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_FLOAT ++Lret_type2: ++ lfs f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_DOUBLE ++Lret_type3: ++ lfd f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_LONGDOUBLE ++Lret_type4: ++ lfd f1,0(r5) ++ lfd f2,8(r5) ++ b Lfinish ++ nop ++ ++// case FFI_TYPE_UINT8 ++Lret_type5: ++ lbz r3,7(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT8 ++Lret_type6: ++ lbz r3,7(r5) ++ extsb r3,r3 ++ b Lfinish ++ nop ++ ++// case FFI_TYPE_UINT16 ++Lret_type7: ++ lhz r3,6(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT16 ++Lret_type8: ++ lha r3,6(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_UINT32 ++Lret_type9: // same as Lret_type1 ++ lwz r3,4(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT32 ++Lret_type10: // same as Lret_type1 ++ lwz r3,4(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_UINT64 ++Lret_type11: ++ ld r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT64 ++Lret_type12: // same as Lret_type11 ++ ld r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_STRUCT ++Lret_type13: ++ b Lret_struct ++ nop ++ nop ++ nop ++ ++// ** End 16-byte aligned cases ** ++// case FFI_TYPE_POINTER ++// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types ++// are added in future, the following code will need to be updated and ++// padded to 16 bytes. ++Lret_type14: ++ lg r3,0(r5) ++ b Lfinish ++ ++// copy struct into registers ++Lret_struct: ++ ld r31,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* ++ ld r3,16(r31) // ffi_cif->rtype* ++ ld r31,24(r31) // ffi_cif->flags ++ mr r4,r5 // copy struct* to 2nd arg ++ addi r7,r1,SF_ARG9 // GPR return area ++ addi r9,r30,-16-(14*8) // FPR return area ++ li r5,0 // struct offset ptr (NULL) ++ li r6,0 // FPR used count ptr (NULL) ++ li r8,0 // GPR return area size ptr (NULL) ++ li r10,0 // FPR return area size ptr (NULL) ++ bl Lffi64_struct_to_reg_form$stub ++ ++ // Load GPRs ++ ld r3,SF_ARG9(r1) ++ ld r4,SF_ARG10(r1) ++ ld r5,SF_ARG11(r1) ++ ld r6,SF_ARG12(r1) ++ nop ++ ld r7,SF_ARG13(r1) ++ ld r8,SF_ARG14(r1) ++ ld r9,SF_ARG15(r1) ++ ld r10,SF_ARG16(r1) ++ nop ++ ++ // Load FPRs ++ mtcrf 0x2,r31 ++ bf 26,Lfinish ++ lfd f1,-16-(14*8)(r30) ++ lfd f2,-16-(13*8)(r30) ++ lfd f3,-16-(12*8)(r30) ++ lfd f4,-16-(11*8)(r30) ++ nop ++ lfd f5,-16-(10*8)(r30) ++ lfd f6,-16-(9*8)(r30) ++ lfd f7,-16-(8*8)(r30) ++ lfd f8,-16-(7*8)(r30) ++ nop ++ lfd f9,-16-(6*8)(r30) ++ lfd f10,-16-(5*8)(r30) ++ lfd f11,-16-(4*8)(r30) ++ lfd f12,-16-(3*8)(r30) ++ nop ++ lfd f13,-16-(2*8)(r30) ++ lfd f14,-16-(1*8)(r30) ++ // Fall through ++ ++// case done ++Lfinish: ++ lg r1,0(r1) // Restore stack pointer. ++ ld r31,-8(r1) // Restore registers we used. ++ ld r30,-16(r1) ++ lg r0,SF_RETURN(r1) // Get return address. ++ mtlr r0 // Reset link register. ++ blr ++ ++// END(ffi_closure_ASM) ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ; Length of Common Information Entry ++LSCIE1: ++ .long 0x0 ; CIE Identifier Tag ++ .byte 0x1 ; CIE Version ++ .ascii "zR\0" ; CIE Augmentation ++ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor ++ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte 0x41 ; CIE RA Column ++ .byte 0x1 ; uleb128 0x1; Augmentation size ++ .byte 0x10 ; FDE Encoding (pcrel) ++ .byte 0xc ; DW_CFA_def_cfa ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x0 ; uleb128 0x0 ++ .align LOG2_GPR_BYTES ++LECIE1: ++.globl _ffi_closure_ASM.eh ++_ffi_closure_ASM.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ; FDE Length ++ ++LASFDE1: ++ .long LASFDE1-EH_frame1 ; FDE CIE offset ++ .g_long LFB1-. ; FDE initial location ++ .set L$set$3,LFE1-LFB1 ++ .g_long L$set$3 ; FDE address range ++ .byte 0x0 ; uleb128 0x0; Augmentation size ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$3,LCFI1-LCFI0 ++ .long L$set$3 ++ .byte 0xe ; DW_CFA_def_cfa_offset ++ .byte 176,1 ; uleb128 176 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$4,LCFI0-LFB1 ++ .long L$set$4 ++ .byte 0x11 ; DW_CFA_offset_extended_sf ++ .byte 0x41 ; uleb128 0x41 ++ .byte 0x7e ; sleb128 -2 ++ .align LOG2_GPR_BYTES ++ ++LEFDE1: ++.data ++ .align LOG2_GPR_BYTES ++LDFCM0: ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi_closure_helper_DARWIN$stub: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ mflr r0 ++ bcl 20,31,LO$ffi_closure_helper_DARWIN ++ ++LO$ffi_closure_helper_DARWIN: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) ++ mtlr r0 ++ lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi_closure_helper_DARWIN$lazy_ptr: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ .g_long dyld_stub_binding_helper ++ ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi64_struct_to_reg_form$stub: ++ .indirect_symbol _ffi64_struct_to_reg_form ++ mflr r0 ++ bcl 20,31,LO$ffi64_struct_to_reg_form ++ ++LO$ffi64_struct_to_reg_form: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form) ++ mtlr r0 ++ lgu r12,lo16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form)(r11) ++ mtctr r12 ++ bctr ++ ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi64_data_size$stub: ++ .indirect_symbol _ffi64_data_size ++ mflr r0 ++ bcl 20,31,LO$ffi64_data_size ++ ++LO$ffi64_data_size: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size) ++ mtlr r0 ++ lgu r12,lo16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi64_struct_to_reg_form$lazy_ptr: ++ .indirect_symbol _ffi64_struct_to_reg_form ++ .g_long dyld_stub_binding_helper ++ ++L_ffi64_data_size$lazy_ptr: ++ .indirect_symbol _ffi64_data_size ++ .g_long dyld_stub_binding_helper ++ ++#endif // __ppc64__ +diff -r -u ./Modules/_ctypes/libffi_osx/types.c ./Modules/_ctypes/libffi_osx/types.c +new file mode 100644 +index 0000000..44806ae +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/types.c +@@ -0,0 +1,115 @@ ++/* ----------------------------------------------------------------------- ++ types.c - Copyright (c) 1996, 1998 Red Hat, Inc. ++ ++ Predefined ffi_types needed by libffi. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++/* Type definitions */ ++#define FFI_INTEGRAL_TYPEDEF(n, s, a, t) \ ++ ffi_type ffi_type_##n = { s, a, t, NULL } ++#define FFI_AGGREGATE_TYPEDEF(n, e) \ ++ ffi_type ffi_type_##n = { 0, 0, FFI_TYPE_STRUCT, e } ++ ++FFI_INTEGRAL_TYPEDEF(uint8, 1, 1, FFI_TYPE_UINT8); ++FFI_INTEGRAL_TYPEDEF(sint8, 1, 1, FFI_TYPE_SINT8); ++FFI_INTEGRAL_TYPEDEF(uint16, 2, 2, FFI_TYPE_UINT16); ++FFI_INTEGRAL_TYPEDEF(sint16, 2, 2, FFI_TYPE_SINT16); ++FFI_INTEGRAL_TYPEDEF(uint32, 4, 4, FFI_TYPE_UINT32); ++FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32); ++FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT); ++ ++/* Size and alignment are fake here. They must not be 0. */ ++FFI_INTEGRAL_TYPEDEF(void, 1, 1, FFI_TYPE_VOID); ++ ++#if defined ALPHA || defined SPARC64 || defined X86_64 || \ ++ defined S390X || defined IA64 || defined POWERPC64 ++FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER); ++#else ++FFI_INTEGRAL_TYPEDEF(pointer, 4, 4, FFI_TYPE_POINTER); ++#endif ++ ++#if defined X86 || defined ARM || defined M68K || defined(X86_DARWIN) ++ ++# ifdef X86_64 ++ FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); ++ FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); ++# else ++ FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); ++ FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); ++# endif ++ ++#elif defined(POWERPC_DARWIN) ++FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); ++FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); ++#elif defined SH ++FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); ++FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); ++#else ++FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); ++FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); ++#endif ++ ++#if defined X86 || defined X86_WIN32 || defined M68K || defined(X86_DARWIN) ++ ++# if defined X86_WIN32 || defined X86_64 ++ FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); ++# endif ++ ++# ifdef X86_DARWIN ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE); ++# endif ++ ++#elif defined ARM || defined SH || defined POWERPC_AIX ++FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); ++FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE); ++#elif defined POWERPC_DARWIN ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++ ++# if __GNUC__ >= 4 ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); ++# endif ++ ++#elif defined SPARC ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++ ++# ifdef SPARC64 ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE); ++# endif ++ ++#elif defined X86_64 || defined POWERPC64 ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++#else ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); ++#endif +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/x86/darwin64.S ./Modules/_ctypes/libffi_osx/x86/darwin64.S +new file mode 100644 +index 0000000..165d469 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/darwin64.S +@@ -0,0 +1,417 @@ ++/* ----------------------------------------------------------------------- ++ darwin64.S - Copyright (c) 2006 Free Software Foundation, Inc. ++ derived from unix64.S ++ ++ x86-64 Foreign Function Interface for Darwin. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#ifdef __x86_64__ ++#define LIBFFI_ASM ++#include ++#include ++ ++ .file "darwin64.S" ++.text ++ ++/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, ++ void *raddr, void (*fnaddr)()); ++ ++ Bit o trickiness here -- ARGS+BYTES is the base of the stack frame ++ for this function. This has been allocated by ffi_call. We also ++ deallocate some of the stack that has been alloca'd. */ ++ ++ .align 3 ++ .globl _ffi_call_unix64 ++ ++_ffi_call_unix64: ++LUW0: ++ movq (%rsp), %r10 /* Load return address. */ ++ movq %rdi, %r12 /* Save a copy of the register area. */ ++ leaq (%rdi, %rsi), %rax /* Find local stack base. */ ++ movq %rdx, (%rax) /* Save flags. */ ++ movq %rcx, 8(%rax) /* Save raddr. */ ++ movq %rbp, 16(%rax) /* Save old frame pointer. */ ++ movq %r10, 24(%rax) /* Relocate return address. */ ++ movq %rax, %rbp /* Finalize local stack frame. */ ++LUW1: ++ /* movq %rdi, %r10 // Save a copy of the register area. */ ++ movq %r12, %r10 ++ movq %r8, %r11 /* Save a copy of the target fn. */ ++ movl %r9d, %eax /* Set number of SSE registers. */ ++ ++ /* Load up all argument registers. */ ++ movq (%r10), %rdi ++ movq 8(%r10), %rsi ++ movq 16(%r10), %rdx ++ movq 24(%r10), %rcx ++ movq 32(%r10), %r8 ++ movq 40(%r10), %r9 ++ testl %eax, %eax ++ jnz Lload_sse ++Lret_from_load_sse: ++ ++ /* Deallocate the reg arg area. */ ++ leaq 176(%r10), %rsp ++ ++ /* Call the user function. */ ++ call *%r11 ++ ++ /* Deallocate stack arg area; local stack frame in redzone. */ ++ leaq 24(%rbp), %rsp ++ ++ movq 0(%rbp), %rcx /* Reload flags. */ ++ movq 8(%rbp), %rdi /* Reload raddr. */ ++ movq 16(%rbp), %rbp /* Reload old frame pointer. */ ++LUW2: ++ ++ /* The first byte of the flags contains the FFI_TYPE. */ ++ movzbl %cl, %r10d ++ leaq Lstore_table(%rip), %r11 ++ movslq (%r11, %r10, 4), %r10 ++ addq %r11, %r10 ++ jmp *%r10 ++ ++Lstore_table: ++ .long Lst_void-Lstore_table /* FFI_TYPE_VOID */ ++ .long Lst_sint32-Lstore_table /* FFI_TYPE_INT */ ++ .long Lst_float-Lstore_table /* FFI_TYPE_FLOAT */ ++ .long Lst_double-Lstore_table /* FFI_TYPE_DOUBLE */ ++ .long Lst_ldouble-Lstore_table /* FFI_TYPE_LONGDOUBLE */ ++ .long Lst_uint8-Lstore_table /* FFI_TYPE_UINT8 */ ++ .long Lst_sint8-Lstore_table /* FFI_TYPE_SINT8 */ ++ .long Lst_uint16-Lstore_table /* FFI_TYPE_UINT16 */ ++ .long Lst_sint16-Lstore_table /* FFI_TYPE_SINT16 */ ++ .long Lst_uint32-Lstore_table /* FFI_TYPE_UINT32 */ ++ .long Lst_sint32-Lstore_table /* FFI_TYPE_SINT32 */ ++ .long Lst_int64-Lstore_table /* FFI_TYPE_UINT64 */ ++ .long Lst_int64-Lstore_table /* FFI_TYPE_SINT64 */ ++ .long Lst_struct-Lstore_table /* FFI_TYPE_STRUCT */ ++ .long Lst_int64-Lstore_table /* FFI_TYPE_POINTER */ ++ ++ .text ++ .align 3 ++Lst_void: ++ ret ++ .align 3 ++Lst_uint8: ++ movzbq %al, %rax ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_sint8: ++ movsbq %al, %rax ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_uint16: ++ movzwq %ax, %rax ++ movq %rax, (%rdi) ++ .align 3 ++Lst_sint16: ++ movswq %ax, %rax ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_uint32: ++ movl %eax, %eax ++ movq %rax, (%rdi) ++ .align 3 ++Lst_sint32: ++ cltq ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_int64: ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_float: ++ movss %xmm0, (%rdi) ++ ret ++ .align 3 ++Lst_double: ++ movsd %xmm0, (%rdi) ++ ret ++Lst_ldouble: ++ fstpt (%rdi) ++ ret ++ .align 3 ++Lst_struct: ++ leaq -20(%rsp), %rsi /* Scratch area in redzone. */ ++ ++ /* We have to locate the values now, and since we don't want to ++ write too much data into the user's return value, we spill the ++ value to a 16 byte scratch area first. Bits 8, 9, and 10 ++ control where the values are located. Only one of the three ++ bits will be set; see ffi_prep_cif_machdep for the pattern. */ ++ movd %xmm0, %r10 ++ movd %xmm1, %r11 ++ testl $0x100, %ecx ++ cmovnz %rax, %rdx ++ cmovnz %r10, %rax ++ testl $0x200, %ecx ++ cmovnz %r10, %rdx ++ testl $0x400, %ecx ++ cmovnz %r10, %rax ++ cmovnz %r11, %rdx ++ movq %rax, (%rsi) ++ movq %rdx, 8(%rsi) ++ ++ /* Bits 12-31 contain the true size of the structure. Copy from ++ the scratch area to the true destination. */ ++ shrl $12, %ecx ++ rep movsb ++ ret ++ ++ /* Many times we can avoid loading any SSE registers at all. ++ It's not worth an indirect jump to load the exact set of ++ SSE registers needed; zero or all is a good compromise. */ ++ .align 3 ++LUW3: ++Lload_sse: ++ movdqa 48(%r10), %xmm0 ++ movdqa 64(%r10), %xmm1 ++ movdqa 80(%r10), %xmm2 ++ movdqa 96(%r10), %xmm3 ++ movdqa 112(%r10), %xmm4 ++ movdqa 128(%r10), %xmm5 ++ movdqa 144(%r10), %xmm6 ++ movdqa 160(%r10), %xmm7 ++ jmp Lret_from_load_sse ++ ++LUW4: ++ .align 3 ++ .globl _ffi_closure_unix64 ++ ++_ffi_closure_unix64: ++LUW5: ++ /* The carry flag is set by the trampoline iff SSE registers ++ are used. Don't clobber it before the branch instruction. */ ++ leaq -200(%rsp), %rsp ++LUW6: ++ movq %rdi, (%rsp) ++ movq %rsi, 8(%rsp) ++ movq %rdx, 16(%rsp) ++ movq %rcx, 24(%rsp) ++ movq %r8, 32(%rsp) ++ movq %r9, 40(%rsp) ++ jc Lsave_sse ++Lret_from_save_sse: ++ ++ movq %r10, %rdi ++ leaq 176(%rsp), %rsi ++ movq %rsp, %rdx ++ leaq 208(%rsp), %rcx ++ call _ffi_closure_unix64_inner ++ ++ /* Deallocate stack frame early; return value is now in redzone. */ ++ addq $200, %rsp ++LUW7: ++ ++ /* The first byte of the return value contains the FFI_TYPE. */ ++ movzbl %al, %r10d ++ leaq Lload_table(%rip), %r11 ++ movslq (%r11, %r10, 4), %r10 ++ addq %r11, %r10 ++ jmp *%r10 ++ ++Lload_table: ++ .long Lld_void-Lload_table /* FFI_TYPE_VOID */ ++ .long Lld_int32-Lload_table /* FFI_TYPE_INT */ ++ .long Lld_float-Lload_table /* FFI_TYPE_FLOAT */ ++ .long Lld_double-Lload_table /* FFI_TYPE_DOUBLE */ ++ .long Lld_ldouble-Lload_table /* FFI_TYPE_LONGDOUBLE */ ++ .long Lld_int8-Lload_table /* FFI_TYPE_UINT8 */ ++ .long Lld_int8-Lload_table /* FFI_TYPE_SINT8 */ ++ .long Lld_int16-Lload_table /* FFI_TYPE_UINT16 */ ++ .long Lld_int16-Lload_table /* FFI_TYPE_SINT16 */ ++ .long Lld_int32-Lload_table /* FFI_TYPE_UINT32 */ ++ .long Lld_int32-Lload_table /* FFI_TYPE_SINT32 */ ++ .long Lld_int64-Lload_table /* FFI_TYPE_UINT64 */ ++ .long Lld_int64-Lload_table /* FFI_TYPE_SINT64 */ ++ .long Lld_struct-Lload_table /* FFI_TYPE_STRUCT */ ++ .long Lld_int64-Lload_table /* FFI_TYPE_POINTER */ ++ ++ .text ++ .align 3 ++Lld_void: ++ ret ++ .align 3 ++Lld_int8: ++ movzbl -24(%rsp), %eax ++ ret ++ .align 3 ++Lld_int16: ++ movzwl -24(%rsp), %eax ++ ret ++ .align 3 ++Lld_int32: ++ movl -24(%rsp), %eax ++ ret ++ .align 3 ++Lld_int64: ++ movq -24(%rsp), %rax ++ ret ++ .align 3 ++Lld_float: ++ movss -24(%rsp), %xmm0 ++ ret ++ .align 3 ++Lld_double: ++ movsd -24(%rsp), %xmm0 ++ ret ++ .align 3 ++Lld_ldouble: ++ fldt -24(%rsp) ++ ret ++ .align 3 ++Lld_struct: ++ /* There are four possibilities here, %rax/%rdx, %xmm0/%rax, ++ %rax/%xmm0, %xmm0/%xmm1. We collapse two by always loading ++ both rdx and xmm1 with the second word. For the remaining, ++ bit 8 set means xmm0 gets the second word, and bit 9 means ++ that rax gets the second word. */ ++ movq -24(%rsp), %rcx ++ movq -16(%rsp), %rdx ++ movq -16(%rsp), %xmm1 ++ testl $0x100, %eax ++ cmovnz %rdx, %rcx ++ movd %rcx, %xmm0 ++ testl $0x200, %eax ++ movq -24(%rsp), %rax ++ cmovnz %rdx, %rax ++ ret ++ ++ /* See the comment above Lload_sse; the same logic applies here. */ ++ .align 3 ++LUW8: ++Lsave_sse: ++ movdqa %xmm0, 48(%rsp) ++ movdqa %xmm1, 64(%rsp) ++ movdqa %xmm2, 80(%rsp) ++ movdqa %xmm3, 96(%rsp) ++ movdqa %xmm4, 112(%rsp) ++ movdqa %xmm5, 128(%rsp) ++ movdqa %xmm6, 144(%rsp) ++ movdqa %xmm7, 160(%rsp) ++ jmp Lret_from_save_sse ++ ++LUW9: ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 /* CIE Length */ ++ .long L$set$0 ++LSCIE1: ++ .long 0x0 /* CIE Identifier Tag */ ++ .byte 0x1 /* CIE Version */ ++ .ascii "zR\0" /* CIE Augmentation */ ++ .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ ++ .byte 0x78 /* sleb128 -8; CIE Data Alignment Factor */ ++ .byte 0x10 /* CIE RA Column */ ++ .byte 0x1 /* uleb128 0x1; Augmentation size */ ++ .byte 0x10 /* FDE Encoding (pcrel sdata4) */ ++ .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ ++ .byte 0x7 /* uleb128 0x7 */ ++ .byte 0x8 /* uleb128 0x8 */ ++ .byte 0x90 /* DW_CFA_offset, column 0x10 */ ++ .byte 0x1 ++ .align 3 ++LECIE1: ++ .globl _ffi_call_unix64.eh ++_ffi_call_unix64.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 /* FDE Length */ ++ .long L$set$1 ++LASFDE1: ++ .long LASFDE1-EH_frame1 /* FDE CIE offset */ ++ .quad LUW0-. /* FDE initial location */ ++ .set L$set$2,LUW4-LUW0 /* FDE address range */ ++ .quad L$set$2 ++ .byte 0x0 /* Augmentation size */ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$3,LUW1-LUW0 ++ .long L$set$3 ++ ++ /* New stack frame based off rbp. This is a itty bit of unwind ++ trickery in that the CFA *has* changed. There is no easy way ++ to describe it correctly on entry to the function. Fortunately, ++ it doesn't matter too much since at all points we can correctly ++ unwind back to ffi_call. Note that the location to which we ++ moved the return address is (the new) CFA-8, so from the ++ perspective of the unwind info, it hasn't moved. */ ++ .byte 0xc /* DW_CFA_def_cfa, %rbp offset 32 */ ++ .byte 0x6 ++ .byte 0x20 ++ .byte 0x80+6 /* DW_CFA_offset, %rbp offset 2*-8 */ ++ .byte 0x2 ++ .byte 0xa /* DW_CFA_remember_state */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$4,LUW2-LUW1 ++ .long L$set$4 ++ .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ ++ .byte 0x7 ++ .byte 0x8 ++ .byte 0xc0+6 /* DW_CFA_restore, %rbp */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$5,LUW3-LUW2 ++ .long L$set$5 ++ .byte 0xb /* DW_CFA_restore_state */ ++ ++ .align 3 ++LEFDE1: ++ .globl _ffi_closure_unix64.eh ++_ffi_closure_unix64.eh: ++LSFDE3: ++ .set L$set$6,LEFDE3-LASFDE3 /* FDE Length */ ++ .long L$set$6 ++LASFDE3: ++ .long LASFDE3-EH_frame1 /* FDE CIE offset */ ++ .quad LUW5-. /* FDE initial location */ ++ .set L$set$7,LUW9-LUW5 /* FDE address range */ ++ .quad L$set$7 ++ .byte 0x0 /* Augmentation size */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$8,LUW6-LUW5 ++ .long L$set$8 ++ .byte 0xe /* DW_CFA_def_cfa_offset */ ++ .byte 208,1 /* uleb128 208 */ ++ .byte 0xa /* DW_CFA_remember_state */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$9,LUW7-LUW6 ++ .long L$set$9 ++ .byte 0xe /* DW_CFA_def_cfa_offset */ ++ .byte 0x8 ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$10,LUW8-LUW7 ++ .long L$set$10 ++ .byte 0xb /* DW_CFA_restore_state */ ++ ++ .align 3 ++LEFDE3: ++ .subsections_via_symbols ++ ++#endif /* __x86_64__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S +new file mode 100644 +index 0000000..925a841 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S +@@ -0,0 +1,422 @@ ++#ifdef __i386__ ++/* ----------------------------------------------------------------------- ++ darwin.S - Copyright (c) 1996, 1998, 2001, 2002, 2003 Red Hat, Inc. ++ ++ X86 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++/* ++ * This file is based on sysv.S and then hacked up by Ronald who hasn't done ++ * assembly programming in 8 years. ++ */ ++ ++#ifndef __x86_64__ ++ ++#define LIBFFI_ASM ++#include ++#include ++ ++#ifdef PyObjC_STRICT_DEBUGGING ++ /* XXX: Debugging of stack alignment, to be removed */ ++#define ASSERT_STACK_ALIGNED movdqa -16(%esp), %xmm0 ++#else ++#define ASSERT_STACK_ALIGNED ++#endif ++ ++.text ++ ++.globl _ffi_prep_args ++ ++ .align 4 ++.globl _ffi_call_SYSV ++ ++_ffi_call_SYSV: ++LFB1: ++ pushl %ebp ++LCFI0: ++ movl %esp,%ebp ++LCFI1: ++ subl $8,%esp ++ /* Make room for all of the new args. */ ++ movl 16(%ebp),%ecx ++ subl %ecx,%esp ++ ++ movl %esp,%eax ++ ++ /* Place all of the ffi_prep_args in position */ ++ subl $8,%esp ++ pushl 12(%ebp) ++ pushl %eax ++ call *8(%ebp) ++ ++ /* Return stack to previous state and call the function */ ++ addl $16,%esp ++ ++ call *28(%ebp) ++ ++ /* Remove the space we pushed for the args */ ++ movl 16(%ebp),%ecx ++ addl %ecx,%esp ++ ++ /* Load %ecx with the return type code */ ++ movl 20(%ebp),%ecx ++ ++ /* If the return value pointer is NULL, assume no return value. */ ++ cmpl $0,24(%ebp) ++ jne Lretint ++ ++ /* Even if there is no space for the return value, we are ++ obliged to handle floating-point values. */ ++ cmpl $FFI_TYPE_FLOAT,%ecx ++ jne Lnoretval ++ fstp %st(0) ++ ++ jmp Lepilogue ++ ++Lretint: ++ cmpl $FFI_TYPE_INT,%ecx ++ jne Lretfloat ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movl %eax,0(%ecx) ++ jmp Lepilogue ++ ++Lretfloat: ++ cmpl $FFI_TYPE_FLOAT,%ecx ++ jne Lretdouble ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ fstps (%ecx) ++ jmp Lepilogue ++ ++Lretdouble: ++ cmpl $FFI_TYPE_DOUBLE,%ecx ++ jne Lretlongdouble ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ fstpl (%ecx) ++ jmp Lepilogue ++ ++Lretlongdouble: ++ cmpl $FFI_TYPE_LONGDOUBLE,%ecx ++ jne Lretint64 ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ fstpt (%ecx) ++ jmp Lepilogue ++ ++Lretint64: ++ cmpl $FFI_TYPE_SINT64,%ecx ++ jne Lretstruct1b ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movl %eax,0(%ecx) ++ movl %edx,4(%ecx) ++ jmp Lepilogue ++ ++Lretstruct1b: ++ cmpl $FFI_TYPE_SINT8,%ecx ++ jne Lretstruct2b ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movb %al,0(%ecx) ++ jmp Lepilogue ++ ++Lretstruct2b: ++ cmpl $FFI_TYPE_SINT16,%ecx ++ jne Lretstruct ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movw %ax,0(%ecx) ++ jmp Lepilogue ++ ++Lretstruct: ++ cmpl $FFI_TYPE_STRUCT,%ecx ++ jne Lnoretval ++ /* Nothing to do! */ ++ addl $4,%esp ++ popl %ebp ++ ret ++ ++Lnoretval: ++Lepilogue: ++ addl $8,%esp ++ movl %ebp,%esp ++ popl %ebp ++ ret ++LFE1: ++.ffi_call_SYSV_end: ++ ++ .align 4 ++FFI_HIDDEN (ffi_closure_SYSV) ++.globl _ffi_closure_SYSV ++ ++_ffi_closure_SYSV: ++LFB2: ++ pushl %ebp ++LCFI2: ++ movl %esp, %ebp ++LCFI3: ++ subl $56, %esp ++ leal -40(%ebp), %edx ++ movl %edx, -12(%ebp) /* resp */ ++ leal 8(%ebp), %edx ++ movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ ++ leal -12(%ebp), %edx ++ movl %edx, (%esp) /* &resp */ ++ movl %ebx, 8(%esp) ++LCFI7: ++ call L_ffi_closure_SYSV_inner$stub ++ movl 8(%esp), %ebx ++ movl -12(%ebp), %ecx ++ cmpl $FFI_TYPE_INT, %eax ++ je Lcls_retint ++ cmpl $FFI_TYPE_FLOAT, %eax ++ je Lcls_retfloat ++ cmpl $FFI_TYPE_DOUBLE, %eax ++ je Lcls_retdouble ++ cmpl $FFI_TYPE_LONGDOUBLE, %eax ++ je Lcls_retldouble ++ cmpl $FFI_TYPE_SINT64, %eax ++ je Lcls_retllong ++ cmpl $FFI_TYPE_UINT8, %eax ++ je Lcls_retstruct1 ++ cmpl $FFI_TYPE_SINT8, %eax ++ je Lcls_retstruct1 ++ cmpl $FFI_TYPE_UINT16, %eax ++ je Lcls_retstruct2 ++ cmpl $FFI_TYPE_SINT16, %eax ++ je Lcls_retstruct2 ++ cmpl $FFI_TYPE_STRUCT, %eax ++ je Lcls_retstruct ++Lcls_epilogue: ++ movl %ebp, %esp ++ popl %ebp ++ ret ++Lcls_retint: ++ movl (%ecx), %eax ++ jmp Lcls_epilogue ++Lcls_retfloat: ++ flds (%ecx) ++ jmp Lcls_epilogue ++Lcls_retdouble: ++ fldl (%ecx) ++ jmp Lcls_epilogue ++Lcls_retldouble: ++ fldt (%ecx) ++ jmp Lcls_epilogue ++Lcls_retllong: ++ movl (%ecx), %eax ++ movl 4(%ecx), %edx ++ jmp Lcls_epilogue ++Lcls_retstruct1: ++ movsbl (%ecx), %eax ++ jmp Lcls_epilogue ++Lcls_retstruct2: ++ movswl (%ecx), %eax ++ jmp Lcls_epilogue ++Lcls_retstruct: ++ lea -8(%ebp),%esp ++ movl %ebp, %esp ++ popl %ebp ++ ret $4 ++LFE2: ++ ++#if !FFI_NO_RAW_API ++ ++#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) ++#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) ++#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) ++#define CIF_FLAGS_OFFSET 20 ++ ++ .align 4 ++FFI_HIDDEN (ffi_closure_raw_SYSV) ++.globl _ffi_closure_raw_SYSV ++ ++_ffi_closure_raw_SYSV: ++LFB3: ++ pushl %ebp ++LCFI4: ++ movl %esp, %ebp ++LCFI5: ++ pushl %esi ++LCFI6: ++ subl $36, %esp ++ movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ ++ movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ ++ movl %edx, 12(%esp) /* user_data */ ++ leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ ++ movl %edx, 8(%esp) /* raw_args */ ++ leal -24(%ebp), %edx ++ movl %edx, 4(%esp) /* &res */ ++ movl %esi, (%esp) /* cif */ ++ call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ ++ movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ ++ cmpl $FFI_TYPE_INT, %eax ++ je Lrcls_retint ++ cmpl $FFI_TYPE_FLOAT, %eax ++ je Lrcls_retfloat ++ cmpl $FFI_TYPE_DOUBLE, %eax ++ je Lrcls_retdouble ++ cmpl $FFI_TYPE_LONGDOUBLE, %eax ++ je Lrcls_retldouble ++ cmpl $FFI_TYPE_SINT64, %eax ++ je Lrcls_retllong ++Lrcls_epilogue: ++ addl $36, %esp ++ popl %esi ++ popl %ebp ++ ret ++Lrcls_retint: ++ movl -24(%ebp), %eax ++ jmp Lrcls_epilogue ++Lrcls_retfloat: ++ flds -24(%ebp) ++ jmp Lrcls_epilogue ++Lrcls_retdouble: ++ fldl -24(%ebp) ++ jmp Lrcls_epilogue ++Lrcls_retldouble: ++ fldt -24(%ebp) ++ jmp Lrcls_epilogue ++Lrcls_retllong: ++ movl -24(%ebp), %eax ++ movl -20(%ebp), %edx ++ jmp Lrcls_epilogue ++LFE3: ++#endif ++ ++.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5 ++L_ffi_closure_SYSV_inner$stub: ++ .indirect_symbol _ffi_closure_SYSV_inner ++ hlt ; hlt ; hlt ; hlt ; hlt ++ ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ++LSCIE1: ++ .long 0x0 ++ .byte 0x1 ++ .ascii "zR\0" ++ .byte 0x1 ++ .byte 0x7c ++ .byte 0x8 ++ .byte 0x1 ++ .byte 0x10 ++ .byte 0xc ++ .byte 0x5 ++ .byte 0x4 ++ .byte 0x88 ++ .byte 0x1 ++ .align 2 ++LECIE1: ++.globl _ffi_call_SYSV.eh ++_ffi_call_SYSV.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ++LASFDE1: ++ .long LASFDE1-EH_frame1 ++ .long LFB1-. ++ .set L$set$2,LFE1-LFB1 ++ .long L$set$2 ++ .byte 0x0 ++ .byte 0x4 ++ .set L$set$3,LCFI0-LFB1 ++ .long L$set$3 ++ .byte 0xe ++ .byte 0x8 ++ .byte 0x84 ++ .byte 0x2 ++ .byte 0x4 ++ .set L$set$4,LCFI1-LCFI0 ++ .long L$set$4 ++ .byte 0xd ++ .byte 0x4 ++ .align 2 ++LEFDE1: ++.globl _ffi_closure_SYSV.eh ++_ffi_closure_SYSV.eh: ++LSFDE2: ++ .set L$set$5,LEFDE2-LASFDE2 ++ .long L$set$5 ++LASFDE2: ++ .long LASFDE2-EH_frame1 ++ .long LFB2-. ++ .set L$set$6,LFE2-LFB2 ++ .long L$set$6 ++ .byte 0x0 ++ .byte 0x4 ++ .set L$set$7,LCFI2-LFB2 ++ .long L$set$7 ++ .byte 0xe ++ .byte 0x8 ++ .byte 0x84 ++ .byte 0x2 ++ .byte 0x4 ++ .set L$set$8,LCFI3-LCFI2 ++ .long L$set$8 ++ .byte 0xd ++ .byte 0x4 ++ .align 2 ++LEFDE2: ++ ++#if !FFI_NO_RAW_API ++ ++.globl _ffi_closure_raw_SYSV.eh ++_ffi_closure_raw_SYSV.eh: ++LSFDE3: ++ .set L$set$10,LEFDE3-LASFDE3 ++ .long L$set$10 ++LASFDE3: ++ .long LASFDE3-EH_frame1 ++ .long LFB3-. ++ .set L$set$11,LFE3-LFB3 ++ .long L$set$11 ++ .byte 0x0 ++ .byte 0x4 ++ .set L$set$12,LCFI4-LFB3 ++ .long L$set$12 ++ .byte 0xe ++ .byte 0x8 ++ .byte 0x84 ++ .byte 0x2 ++ .byte 0x4 ++ .set L$set$13,LCFI5-LCFI4 ++ .long L$set$13 ++ .byte 0xd ++ .byte 0x4 ++ .byte 0x4 ++ .set L$set$14,LCFI6-LCFI5 ++ .long L$set$14 ++ .byte 0x85 ++ .byte 0x3 ++ .align 2 ++LEFDE3: ++ ++#endif ++ ++#endif /* ifndef __x86_64__ */ ++ ++#endif /* defined __i386__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c +new file mode 100644 +index 0000000..06feaf2 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c +@@ -0,0 +1,734 @@ ++#ifdef __x86_64__ ++ ++/* ----------------------------------------------------------------------- ++ x86-ffi64.c - Copyright (c) 2002 Bo Thorsen ++ ++ x86-64 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++#include ++ ++#define MAX_GPR_REGS 6 ++#define MAX_SSE_REGS 8 ++ ++typedef struct RegisterArgs { ++ /* Registers for argument passing. */ ++ UINT64 gpr[MAX_GPR_REGS]; ++ __int128_t sse[MAX_SSE_REGS]; ++} RegisterArgs; ++ ++extern void ++ffi_call_unix64( ++ void* args, ++ unsigned long bytes, ++ unsigned flags, ++ void* raddr, ++ void (*fnaddr)(), ++ unsigned ssecount); ++ ++/* All reference to register classes here is identical to the code in ++ gcc/config/i386/i386.c. Do *not* change one without the other. */ ++ ++/* Register class used for passing given 64bit part of the argument. ++ These represent classes as documented by the PS ABI, with the exception ++ of SSESF, SSEDF classes, that are basically SSE class, just gcc will ++ use SF or DFmode move instead of DImode to avoid reformating penalties. ++ ++ Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves ++ whenever possible (upper half does contain padding). */ ++enum x86_64_reg_class ++{ ++ X86_64_NO_CLASS, ++ X86_64_INTEGER_CLASS, ++ X86_64_INTEGERSI_CLASS, ++ X86_64_SSE_CLASS, ++ X86_64_SSESF_CLASS, ++ X86_64_SSEDF_CLASS, ++ X86_64_SSEUP_CLASS, ++ X86_64_X87_CLASS, ++ X86_64_X87UP_CLASS, ++ X86_64_COMPLEX_X87_CLASS, ++ X86_64_MEMORY_CLASS ++}; ++ ++#define MAX_CLASSES 4 ++#define SSE_CLASS_P(X) ((X) >= X86_64_SSE_CLASS && X <= X86_64_SSEUP_CLASS) ++ ++/* x86-64 register passing implementation. See x86-64 ABI for details. Goal ++ of this code is to classify each 8bytes of incoming argument by the register ++ class and assign registers accordingly. */ ++ ++/* Return the union class of CLASS1 and CLASS2. ++ See the x86-64 PS ABI for details. */ ++static enum x86_64_reg_class ++merge_classes( ++ enum x86_64_reg_class class1, ++ enum x86_64_reg_class class2) ++{ ++ /* Rule #1: If both classes are equal, this is the resulting class. */ ++ if (class1 == class2) ++ return class1; ++ ++ /* Rule #2: If one of the classes is NO_CLASS, the resulting class is ++ the other class. */ ++ if (class1 == X86_64_NO_CLASS) ++ return class2; ++ ++ if (class2 == X86_64_NO_CLASS) ++ return class1; ++ ++ /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */ ++ if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS) ++ return X86_64_MEMORY_CLASS; ++ ++ /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */ ++ if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS) ++ || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS)) ++ return X86_64_INTEGERSI_CLASS; ++ ++ if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS ++ || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS) ++ return X86_64_INTEGER_CLASS; ++ ++ /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class, ++ MEMORY is used. */ ++ if (class1 == X86_64_X87_CLASS ++ || class1 == X86_64_X87UP_CLASS ++ || class1 == X86_64_COMPLEX_X87_CLASS ++ || class2 == X86_64_X87_CLASS ++ || class2 == X86_64_X87UP_CLASS ++ || class2 == X86_64_COMPLEX_X87_CLASS) ++ return X86_64_MEMORY_CLASS; ++ ++ /* Rule #6: Otherwise class SSE is used. */ ++ return X86_64_SSE_CLASS; ++} ++ ++/* Classify the argument of type TYPE and mode MODE. ++ CLASSES will be filled by the register class used to pass each word ++ of the operand. The number of words is returned. In case the parameter ++ should be passed in memory, 0 is returned. As a special case for zero ++ sized containers, classes[0] will be NO_CLASS and 1 is returned. ++ ++ See the x86-64 PS ABI for details. */ ++ ++static int ++classify_argument( ++ ffi_type* type, ++ enum x86_64_reg_class classes[], ++ size_t byte_offset) ++{ ++ switch (type->type) ++ { ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_POINTER: ++#if 0 ++ if (byte_offset + type->size <= 4) ++ classes[0] = X86_64_INTEGERSI_CLASS; ++ else ++ classes[0] = X86_64_INTEGER_CLASS; ++ ++ return 1; ++#else ++ { ++ int size = byte_offset + type->size; ++ ++ if (size <= 4) ++ { ++ classes[0] = X86_64_INTEGERSI_CLASS; ++ return 1; ++ } ++ else if (size <= 8) ++ { ++ classes[0] = X86_64_INTEGER_CLASS; ++ return 1; ++ } ++ else if (size <= 12) ++ { ++ classes[0] = X86_64_INTEGER_CLASS; ++ classes[1] = X86_64_INTEGERSI_CLASS; ++ return 2; ++ } ++ else if (size <= 16) ++ { ++ classes[0] = classes[1] = X86_64_INTEGERSI_CLASS; ++ return 2; ++ } ++ else ++ FFI_ASSERT (0); ++ } ++#endif ++ ++ case FFI_TYPE_FLOAT: ++ if (byte_offset == 0) ++ classes[0] = X86_64_SSESF_CLASS; ++ else ++ classes[0] = X86_64_SSE_CLASS; ++ ++ return 1; ++ ++ case FFI_TYPE_DOUBLE: ++ classes[0] = X86_64_SSEDF_CLASS; ++ return 1; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ classes[0] = X86_64_X87_CLASS; ++ classes[1] = X86_64_X87UP_CLASS; ++ return 2; ++ ++ case FFI_TYPE_STRUCT: ++ { ++ ffi_type** ptr; ++ int i; ++ enum x86_64_reg_class subclasses[MAX_CLASSES]; ++ const int UNITS_PER_WORD = 8; ++ int words = ++ (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; ++ ++ /* If the struct is larger than 16 bytes, pass it on the stack. */ ++ if (type->size > 16) ++ return 0; ++ ++ for (i = 0; i < words; i++) ++ classes[i] = X86_64_NO_CLASS; ++ ++ /* Merge the fields of structure. */ ++ for (ptr = type->elements; *ptr != NULL; ptr++) ++ { ++ byte_offset = ALIGN(byte_offset, (*ptr)->alignment); ++ ++ int num = classify_argument(*ptr, subclasses, byte_offset % 8); ++ ++ if (num == 0) ++ return 0; ++ ++ int pos = byte_offset / 8; ++ ++ for (i = 0; i < num; i++) ++ { ++ classes[i + pos] = ++ merge_classes(subclasses[i], classes[i + pos]); ++ } ++ ++ byte_offset += (*ptr)->size; ++ } ++ ++ if (words > 2) ++ { ++ /* When size > 16 bytes, if the first one isn't ++ X86_64_SSE_CLASS or any other ones aren't ++ X86_64_SSEUP_CLASS, everything should be passed in ++ memory. */ ++ if (classes[0] != X86_64_SSE_CLASS) ++ return 0; ++ ++ for (i = 1; i < words; i++) ++ if (classes[i] != X86_64_SSEUP_CLASS) ++ return 0; ++ } ++ ++ ++ /* Final merger cleanup. */ ++ for (i = 0; i < words; i++) ++ { ++ /* If one class is MEMORY, everything should be passed in ++ memory. */ ++ if (classes[i] == X86_64_MEMORY_CLASS) ++ return 0; ++ ++ /* The X86_64_SSEUP_CLASS should be always preceded by ++ X86_64_SSE_CLASS. */ ++ if (classes[i] == X86_64_SSEUP_CLASS ++ && classes[i - 1] != X86_64_SSE_CLASS ++ && classes[i - 1] != X86_64_SSEUP_CLASS) ++ { ++ FFI_ASSERT(i != 0); ++ classes[i] = X86_64_SSE_CLASS; ++ } ++ ++ /* X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS. */ ++ if (classes[i] == X86_64_X87UP_CLASS ++ && classes[i - 1] != X86_64_X87_CLASS) ++ { ++ FFI_ASSERT(i != 0); ++ classes[i] = X86_64_SSE_CLASS; ++ } ++ } ++ ++ return words; ++ } ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ ++ return 0; /* Never reached. */ ++} ++ ++/* Examine the argument and return set number of register required in each ++ class. Return zero if parameter should be passed in memory, otherwise ++ the number of registers. */ ++static int ++examine_argument( ++ ffi_type* type, ++ enum x86_64_reg_class classes[MAX_CLASSES], ++ _Bool in_return, ++ int* pngpr, ++ int* pnsse) ++{ ++ int n = classify_argument(type, classes, 0); ++ int ngpr = 0; ++ int nsse = 0; ++ int i; ++ ++ if (n == 0) ++ return 0; ++ ++ for (i = 0; i < n; ++i) ++ { ++ switch (classes[i]) ++ { ++ case X86_64_INTEGER_CLASS: ++ case X86_64_INTEGERSI_CLASS: ++ ngpr++; ++ break; ++ ++ case X86_64_SSE_CLASS: ++ case X86_64_SSESF_CLASS: ++ case X86_64_SSEDF_CLASS: ++ nsse++; ++ break; ++ ++ case X86_64_NO_CLASS: ++ case X86_64_SSEUP_CLASS: ++ break; ++ ++ case X86_64_X87_CLASS: ++ case X86_64_X87UP_CLASS: ++ case X86_64_COMPLEX_X87_CLASS: ++ return in_return != 0; ++ ++ default: ++ abort(); ++ } ++ } ++ ++ *pngpr = ngpr; ++ *pnsse = nsse; ++ ++ return n; ++} ++ ++/* Perform machine dependent cif processing. */ ++ffi_status ++ffi_prep_cif_machdep( ++ ffi_cif* cif) ++{ ++ int gprcount = 0; ++ int ssecount = 0; ++ int flags = cif->rtype->type; ++ int i, avn, n, ngpr, nsse; ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ size_t bytes; ++ ++ if (flags != FFI_TYPE_VOID) ++ { ++ n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); ++ ++ if (n == 0) ++ { ++ /* The return value is passed in memory. A pointer to that ++ memory is the first argument. Allocate a register for it. */ ++ gprcount++; ++ ++ /* We don't have to do anything in asm for the return. */ ++ flags = FFI_TYPE_VOID; ++ } ++ else if (flags == FFI_TYPE_STRUCT) ++ { ++ /* Mark which registers the result appears in. */ ++ _Bool sse0 = SSE_CLASS_P(classes[0]); ++ _Bool sse1 = n == 2 && SSE_CLASS_P(classes[1]); ++ ++ if (sse0 && !sse1) ++ flags |= 1 << 8; ++ else if (!sse0 && sse1) ++ flags |= 1 << 9; ++ else if (sse0 && sse1) ++ flags |= 1 << 10; ++ ++ /* Mark the true size of the structure. */ ++ flags |= cif->rtype->size << 12; ++ } ++ } ++ ++ /* Go over all arguments and determine the way they should be passed. ++ If it's in a register and there is space for it, let that be so. If ++ not, add it's size to the stack byte count. */ ++ for (bytes = 0, i = 0, avn = cif->nargs; i < avn; i++) ++ { ++ if (examine_argument(cif->arg_types[i], classes, 0, &ngpr, &nsse) == 0 ++ || gprcount + ngpr > MAX_GPR_REGS ++ || ssecount + nsse > MAX_SSE_REGS) ++ { ++ long align = cif->arg_types[i]->alignment; ++ ++ if (align < 8) ++ align = 8; ++ ++ bytes = ALIGN(bytes, align); ++ bytes += cif->arg_types[i]->size; ++ } ++ else ++ { ++ gprcount += ngpr; ++ ssecount += nsse; ++ } ++ } ++ ++ if (ssecount) ++ flags |= 1 << 11; ++ ++ cif->flags = flags; ++ cif->bytes = bytes; ++ cif->bytes = ALIGN(bytes,8); ++ ++ return FFI_OK; ++} ++ ++void ++ffi_call( ++ ffi_cif* cif, ++ void (*fn)(), ++ void* rvalue, ++ void** avalue) ++{ ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ char* stack; ++ char* argp; ++ ffi_type** arg_types; ++ int gprcount, ssecount, ngpr, nsse, i, avn; ++ _Bool ret_in_memory; ++ RegisterArgs* reg_args; ++ ++ /* Can't call 32-bit mode from 64-bit mode. */ ++ FFI_ASSERT(cif->abi == FFI_UNIX64); ++ ++ /* If the return value is a struct and we don't have a return value ++ address then we need to make one. Note the setting of flags to ++ VOID above in ffi_prep_cif_machdep. */ ++ ret_in_memory = (cif->rtype->type == FFI_TYPE_STRUCT ++ && (cif->flags & 0xff) == FFI_TYPE_VOID); ++ ++ if (rvalue == NULL && ret_in_memory) ++ rvalue = alloca (cif->rtype->size); ++ ++ /* Allocate the space for the arguments, plus 4 words of temp space. */ ++ stack = alloca(sizeof(RegisterArgs) + cif->bytes + 4 * 8); ++ reg_args = (RegisterArgs*)stack; ++ argp = stack + sizeof(RegisterArgs); ++ ++ gprcount = ssecount = 0; ++ ++ /* If the return value is passed in memory, add the pointer as the ++ first integer argument. */ ++ if (ret_in_memory) ++ reg_args->gpr[gprcount++] = (long) rvalue; ++ ++ avn = cif->nargs; ++ arg_types = cif->arg_types; ++ ++ for (i = 0; i < avn; ++i) ++ { ++ size_t size = arg_types[i]->size; ++ int n; ++ ++ n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); ++ ++ if (n == 0 ++ || gprcount + ngpr > MAX_GPR_REGS ++ || ssecount + nsse > MAX_SSE_REGS) ++ { ++ long align = arg_types[i]->alignment; ++ ++ /* Stack arguments are *always* at least 8 byte aligned. */ ++ if (align < 8) ++ align = 8; ++ ++ /* Pass this argument in memory. */ ++ argp = (void *) ALIGN (argp, align); ++ memcpy (argp, avalue[i], size); ++ argp += size; ++ } ++ else ++ { /* The argument is passed entirely in registers. */ ++ char *a = (char *) avalue[i]; ++ int j; ++ ++ for (j = 0; j < n; j++, a += 8, size -= 8) ++ { ++ switch (classes[j]) ++ { ++ case X86_64_INTEGER_CLASS: ++ case X86_64_INTEGERSI_CLASS: ++ reg_args->gpr[gprcount] = 0; ++ switch (arg_types[i]->type) { ++ case FFI_TYPE_SINT8: ++ { ++ int8_t shortval = *(int8_t*)a; ++ int64_t actval = (int64_t)shortval; ++ reg_args->gpr[gprcount] = actval; ++ /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ ++ break; ++ } ++ ++ case FFI_TYPE_SINT16: ++ { ++ int16_t shortval = *(int16_t*)a; ++ int64_t actval = (int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ case FFI_TYPE_SINT32: ++ { ++ int32_t shortval = *(int32_t*)a; ++ int64_t actval = (int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ case FFI_TYPE_UINT8: ++ { ++ u_int8_t shortval = *(u_int8_t*)a; ++ u_int64_t actval = (u_int64_t)shortval; ++ /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ ++ reg_args->gpr[gprcount] = actval; ++ break; ++ } ++ ++ case FFI_TYPE_UINT16: ++ { ++ u_int16_t shortval = *(u_int16_t*)a; ++ u_int64_t actval = (u_int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ case FFI_TYPE_UINT32: ++ { ++ u_int32_t shortval = *(u_int32_t*)a; ++ u_int64_t actval = (u_int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ default: ++ //memcpy (®_args->gpr[gprcount], a, size < 8 ? size : 8); ++ reg_args->gpr[gprcount] = *(int64_t*)a; ++ } ++ gprcount++; ++ break; ++ ++ case X86_64_SSE_CLASS: ++ case X86_64_SSEDF_CLASS: ++ reg_args->sse[ssecount++] = *(UINT64 *) a; ++ break; ++ ++ case X86_64_SSESF_CLASS: ++ reg_args->sse[ssecount++] = *(UINT32 *) a; ++ break; ++ ++ default: ++ abort(); ++ } ++ } ++ } ++ } ++ ++ ffi_call_unix64 (stack, cif->bytes + sizeof(RegisterArgs), ++ cif->flags, rvalue, fn, ssecount); ++} ++ ++extern void ffi_closure_unix64(void); ++ ++ffi_status ++ffi_prep_closure( ++ ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*, void*, void**, void*), ++ void* user_data) ++{ ++ if (cif->abi != FFI_UNIX64) ++ return FFI_BAD_ABI; ++ ++ volatile unsigned short* tramp = ++ (volatile unsigned short*)&closure->tramp[0]; ++ ++ tramp[0] = 0xbb49; /* mov , %r11 */ ++ *(void* volatile*)&tramp[1] = ffi_closure_unix64; ++ tramp[5] = 0xba49; /* mov , %r10 */ ++ *(void* volatile*)&tramp[6] = closure; ++ ++ /* Set the carry bit if the function uses any sse registers. ++ This is clc or stc, together with the first byte of the jmp. */ ++ tramp[10] = cif->flags & (1 << 11) ? 0x49f9 : 0x49f8; ++ tramp[11] = 0xe3ff; /* jmp *%r11 */ ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ ++ return FFI_OK; ++} ++ ++#pragma clang diagnostic push ++#pragma clang diagnostic ignored "-Wmissing-prototypes" ++int ++ffi_closure_unix64_inner( ++ ffi_closure* closure, ++ void* rvalue, ++ RegisterArgs* reg_args, ++ char* argp) ++#pragma clang diagnostic pop ++{ ++ ffi_cif* cif = closure->cif; ++ void** avalue = alloca(cif->nargs * sizeof(void *)); ++ ffi_type** arg_types; ++ long i, avn; ++ int gprcount = 0; ++ int ssecount = 0; ++ int ngpr, nsse; ++ int ret; ++ ++ ret = cif->rtype->type; ++ ++ if (ret != FFI_TYPE_VOID) ++ { ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ int n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); ++ ++ if (n == 0) ++ { ++ /* The return value goes in memory. Arrange for the closure ++ return value to go directly back to the original caller. */ ++ rvalue = (void *) reg_args->gpr[gprcount++]; ++ ++ /* We don't have to do anything in asm for the return. */ ++ ret = FFI_TYPE_VOID; ++ } ++ else if (ret == FFI_TYPE_STRUCT && n == 2) ++ { ++ /* Mark which register the second word of the structure goes in. */ ++ _Bool sse0 = SSE_CLASS_P (classes[0]); ++ _Bool sse1 = SSE_CLASS_P (classes[1]); ++ ++ if (!sse0 && sse1) ++ ret |= 1 << 8; ++ else if (sse0 && !sse1) ++ ret |= 1 << 9; ++ } ++ } ++ ++ avn = cif->nargs; ++ arg_types = cif->arg_types; ++ ++ for (i = 0; i < avn; ++i) ++ { ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ int n; ++ ++ n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); ++ ++ if (n == 0 ++ || gprcount + ngpr > MAX_GPR_REGS ++ || ssecount + nsse > MAX_SSE_REGS) ++ { ++ long align = arg_types[i]->alignment; ++ ++ /* Stack arguments are *always* at least 8 byte aligned. */ ++ if (align < 8) ++ align = 8; ++ ++ /* Pass this argument in memory. */ ++ argp = (void *) ALIGN (argp, align); ++ avalue[i] = argp; ++ argp += arg_types[i]->size; ++ } ++ ++#if !defined(X86_DARWIN) ++ /* If the argument is in a single register, or two consecutive ++ registers, then we can use that address directly. */ ++ else if (n == 1 || (n == 2 && ++ SSE_CLASS_P (classes[0]) == SSE_CLASS_P (classes[1]))) ++ { ++ // The argument is in a single register. ++ if (SSE_CLASS_P (classes[0])) ++ { ++ avalue[i] = ®_args->sse[ssecount]; ++ ssecount += n; ++ } ++ else ++ { ++ avalue[i] = ®_args->gpr[gprcount]; ++ gprcount += n; ++ } ++ } ++#endif ++ ++ /* Otherwise, allocate space to make them consecutive. */ ++ else ++ { ++ char *a = alloca (16); ++ int j; ++ ++ avalue[i] = a; ++ ++ for (j = 0; j < n; j++, a += 8) ++ { ++ if (SSE_CLASS_P (classes[j])) ++ memcpy (a, ®_args->sse[ssecount++], 8); ++ else ++ memcpy (a, ®_args->gpr[gprcount++], 8); ++ } ++ } ++ } ++ ++ /* Invoke the closure. */ ++ closure->fun (cif, rvalue, avalue, closure->user_data); ++ ++ /* Tell assembly how to perform return type promotions. */ ++ return ret; ++} ++ ++#endif /* __x86_64__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c +new file mode 100644 +index 0000000..706ea0f +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c +@@ -0,0 +1,438 @@ ++#ifdef __i386__ ++/* ----------------------------------------------------------------------- ++ ffi.c - Copyright (c) 1996, 1998, 1999, 2001 Red Hat, Inc. ++ Copyright (c) 2002 Ranjit Mathew ++ Copyright (c) 2002 Bo Thorsen ++ Copyright (c) 2002 Roger Sayle ++ ++ x86 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++ ++/* ffi_prep_args is called by the assembly routine once stack space ++ has been allocated for the function's arguments */ ++ ++void ffi_prep_args(char *stack, extended_cif *ecif); ++ ++void ffi_prep_args(char *stack, extended_cif *ecif) ++{ ++ register unsigned int i; ++ register void **p_argv; ++ register char *argp; ++ register ffi_type **p_arg; ++ ++ argp = stack; ++ ++ if (ecif->cif->flags == FFI_TYPE_STRUCT) ++ { ++ *(void **) argp = ecif->rvalue; ++ argp += 4; ++ } ++ ++ p_argv = ecif->avalue; ++ ++ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; ++ i != 0; ++ i--, p_arg++) ++ { ++ size_t z; ++ ++ /* Align if necessary */ ++ if ((sizeof(int) - 1) & (unsigned) argp) ++ argp = (char *) ALIGN(argp, sizeof(int)); ++ ++ z = (*p_arg)->size; ++ if (z < sizeof(int)) ++ { ++ z = sizeof(int); ++ switch ((*p_arg)->type) ++ { ++ case FFI_TYPE_SINT8: ++ *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT8: ++ *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_SINT16: ++ *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT16: ++ *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_SINT32: ++ *(signed int *) argp = (signed int)*(SINT32 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT32: ++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ } ++ else ++ { ++ memcpy(argp, *p_argv, z); ++ } ++ p_argv++; ++ argp += z; ++ } ++ ++ return; ++} ++ ++/* Perform machine dependent cif processing */ ++ffi_status ffi_prep_cif_machdep(ffi_cif *cif) ++{ ++ /* Set the return type flag */ ++ switch (cif->rtype->type) ++ { ++ case FFI_TYPE_VOID: ++#ifdef X86 ++ case FFI_TYPE_STRUCT: ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_SINT16: ++#endif ++ ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ case FFI_TYPE_LONGDOUBLE: ++ cif->flags = (unsigned) cif->rtype->type; ++ break; ++ ++ case FFI_TYPE_UINT64: ++ cif->flags = FFI_TYPE_SINT64; ++ break; ++ ++#ifndef X86 ++ case FFI_TYPE_STRUCT: ++ if (cif->rtype->size == 1) ++ { ++ cif->flags = FFI_TYPE_SINT8; /* same as char size */ ++ } ++ else if (cif->rtype->size == 2) ++ { ++ cif->flags = FFI_TYPE_SINT16; /* same as short size */ ++ } ++ else if (cif->rtype->size == 4) ++ { ++ cif->flags = FFI_TYPE_INT; /* same as int type */ ++ } ++ else if (cif->rtype->size == 8) ++ { ++ cif->flags = FFI_TYPE_SINT64; /* same as int64 type */ ++ } ++ else ++ { ++ cif->flags = FFI_TYPE_STRUCT; ++ } ++ break; ++#endif ++ ++ default: ++ cif->flags = FFI_TYPE_INT; ++ break; ++ } ++ ++#ifdef X86_DARWIN ++ cif->bytes = (cif->bytes + 15) & ~0xF; ++#endif ++ ++ return FFI_OK; ++} ++ ++extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, ++ unsigned, unsigned, unsigned *, void (*fn)()); ++ ++#ifdef X86_WIN32 ++extern void ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, ++ unsigned, unsigned, unsigned *, void (*fn)()); ++ ++#endif /* X86_WIN32 */ ++ ++void ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue) ++{ ++ extended_cif ecif; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return */ ++ /* value address then we need to make one */ ++ ++ if ((rvalue == NULL) && ++ (cif->flags == FFI_TYPE_STRUCT)) ++ { ++ ecif.rvalue = alloca(cif->rtype->size); ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ ++ switch (cif->abi) ++ { ++ case FFI_SYSV: ++ ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, ++ fn); ++ break; ++#ifdef X86_WIN32 ++ case FFI_STDCALL: ++ ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ break; ++#endif /* X86_WIN32 */ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++ ++/** private members **/ ++ ++static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, ++ void** args, ffi_cif* cif); ++void FFI_HIDDEN ffi_closure_SYSV (ffi_closure *) ++__attribute__ ((regparm(1))); ++unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *) ++__attribute__ ((regparm(1))); ++void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *) ++__attribute__ ((regparm(1))); ++ ++/* This function is jumped to by the trampoline */ ++ ++unsigned int FFI_HIDDEN ++ffi_closure_SYSV_inner (closure, respp, args) ++ffi_closure *closure; ++void **respp; ++void *args; ++{ ++ // our various things... ++ ffi_cif *cif; ++ void **arg_area; ++ ++ cif = closure->cif; ++ arg_area = (void**) alloca (cif->nargs * sizeof (void*)); ++ ++ /* this call will initialize ARG_AREA, such that each ++ * element in that array points to the corresponding ++ * value on the stack; and if the function returns ++ * a structure, it will re-set RESP to point to the ++ * structure return address. */ ++ ++ ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); ++ ++ (closure->fun) (cif, *respp, arg_area, closure->user_data); ++ ++ return cif->flags; ++} ++ ++static void ++ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue, ++ ffi_cif *cif) ++{ ++ register unsigned int i; ++ register void **p_argv; ++ register char *argp; ++ register ffi_type **p_arg; ++ ++ argp = stack; ++ ++ if ( cif->flags == FFI_TYPE_STRUCT ) { ++ *rvalue = *(void **) argp; ++ argp += 4; ++ } ++ ++ p_argv = avalue; ++ ++ for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) ++ { ++ size_t z; ++ ++ /* Align if necessary */ ++ if ((sizeof(int) - 1) & (unsigned) argp) { ++ argp = (char *) ALIGN(argp, sizeof(int)); ++ } ++ ++ z = (*p_arg)->size; ++ ++ /* because we're little endian, this is what it turns into. */ ++ ++ *p_argv = (void*) argp; ++ ++ p_argv++; ++ argp += z; ++ } ++ ++ return; ++} ++ ++/* How to make a trampoline. Derived from gcc/config/i386/i386.c. */ ++ ++#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ ++({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ ++unsigned int __fun = (unsigned int)(FUN); \ ++unsigned int __ctx = (unsigned int)(CTX); \ ++unsigned int __dis = __fun - (__ctx + FFI_TRAMPOLINE_SIZE); \ ++*(unsigned char*) &__tramp[0] = 0xb8; \ ++*(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \ ++*(unsigned char *) &__tramp[5] = 0xe9; \ ++*(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \ ++}) ++ ++ ++/* the cif must already be prep'ed */ ++ffi_status ++ffi_prep_closure (ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,void**,void*), ++ void *user_data) ++{ ++ if (cif->abi != FFI_SYSV) ++ return FFI_BAD_ABI; ++ ++ FFI_INIT_TRAMPOLINE (&closure->tramp[0], \ ++ &ffi_closure_SYSV, \ ++ (void*)closure); ++ ++ closure->cif = cif; ++ closure->user_data = user_data; ++ closure->fun = fun; ++ ++ return FFI_OK; ++} ++ ++/* ------- Native raw API support -------------------------------- */ ++ ++#if !FFI_NO_RAW_API ++ ++ffi_status ++ffi_prep_raw_closure_loc (ffi_raw_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), ++ void *user_data, ++ void *codeloc) ++{ ++ int i; ++ ++ FFI_ASSERT (cif->abi == FFI_SYSV); ++ ++ // we currently don't support certain kinds of arguments for raw ++ // closures. This should be implemented by a separate assembly language ++ // routine, since it would require argument processing, something we ++ // don't do now for performance. ++ ++ for (i = cif->nargs-1; i >= 0; i--) ++ { ++ FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_STRUCT); ++ FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_LONGDOUBLE); ++ } ++ ++ ++ FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_raw_SYSV, ++ codeloc); ++ ++ closure->cif = cif; ++ closure->user_data = user_data; ++ closure->fun = fun; ++ ++ return FFI_OK; ++} ++ ++static void ++ffi_prep_args_raw(char *stack, extended_cif *ecif) ++{ ++ memcpy (stack, ecif->avalue, ecif->cif->bytes); ++} ++ ++/* we borrow this routine from libffi (it must be changed, though, to ++ * actually call the function passed in the first argument. as of ++ * libffi-1.20, this is not the case.) ++ */ ++ ++extern void ++ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, unsigned, ++ unsigned, unsigned *, void (*fn)()); ++ ++#ifdef X86_WIN32 ++extern void ++ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, unsigned, ++ unsigned, unsigned *, void (*fn)()); ++#endif /* X86_WIN32 */ ++ ++void ++ffi_raw_call(ffi_cif *cif, void (*fn)(), void *rvalue, ffi_raw *fake_avalue) ++{ ++ extended_cif ecif; ++ void **avalue = (void **)fake_avalue; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return */ ++ /* value address then we need to make one */ ++ ++ if ((rvalue == NULL) && ++ (cif->rtype->type == FFI_TYPE_STRUCT)) ++ { ++ ecif.rvalue = alloca(cif->rtype->size); ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ ++ switch (cif->abi) ++ { ++ case FFI_SYSV: ++ ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ break; ++#ifdef X86_WIN32 ++ case FFI_STDCALL: ++ ffi_call_STDCALL(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ break; ++#endif /* X86_WIN32 */ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++#endif ++#endif // __i386__ +diff -r -u ./setup.py ./setup.py +index 46b92fe..2bf6b4b 100644 +--- ./setup.py ++++ ./setup.py +@@ -98,8 +98,14 @@ class PyBuildExt(build_ext): + self.detect_modules() + + # Remove modules that are present on the disabled list +- self.extensions = [ext for ext in self.extensions +- if ext.name not in disabled_module_list] ++ extensions = [ext for ext in self.extensions ++ if ext.name not in disabled_module_list] ++ # move ctypes to the end, it depends on other modules ++ ext_map = dict((ext.name, i) for i, ext in enumerate(extensions)) ++ if "_ctypes" in ext_map: ++ ctypes = extensions.pop(ext_map["_ctypes"]) ++ extensions.append(ctypes) ++ self.extensions = extensions + + # Fix up the autodetected modules, prefixing all the source files + # with Modules/ and adding Python's include directory to the path. +@@ -1330,9 +1336,39 @@ class PyBuildExt(build_ext): + # *** Uncomment these for TOGL extension only: + # -lGL -lGLU -lXext -lXmu \ + ++ def configure_ctypes_darwin(self, ext): ++ # Darwin (OS X) uses preconfigured files, in ++ # the Modules/_ctypes/libffi_osx directory. ++ srcdir = sysconfig.get_config_var('srcdir') ++ ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', ++ '_ctypes', 'libffi_osx')) ++ sources = [os.path.join(ffi_srcdir, p) ++ for p in ['ffi.c', ++ 'x86/darwin64.S', ++ 'x86/x86-darwin.S', ++ 'x86/x86-ffi_darwin.c', ++ 'x86/x86-ffi64.c', ++ 'powerpc/ppc-darwin.S', ++ 'powerpc/ppc-darwin_closure.S', ++ 'powerpc/ppc-ffi_darwin.c', ++ 'powerpc/ppc64-darwin_closure.S', ++ ]] ++ ++ # Add .S (preprocessed assembly) to C compiler source extensions. ++ self.compiler.src_extensions.append('.S') ++ ++ include_dirs = [os.path.join(ffi_srcdir, 'include'), ++ os.path.join(ffi_srcdir, 'powerpc')] ++ ext.include_dirs.extend(include_dirs) ++ ext.sources.extend(sources) ++ return True ++ + def configure_ctypes(self, ext): + if not self.use_system_libffi: +- (srcdir,) = sysconfig.get_config_vars('srcdir') ++ if sys.platform == 'darwin': ++ return self.configure_ctypes_darwin(ext) ++ ++ srcdir = sysconfig.get_config_var('srcdir') + ffi_builddir = os.path.join(self.build_temp, 'libffi') + ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', + '_ctypes', 'libffi')) +@@ -1347,7 +1383,10 @@ class PyBuildExt(build_ext): + ffi_configfile): + from distutils.dir_util import mkpath + mkpath(ffi_builddir) +- config_args = [] ++ config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split() ++ if (('--host=' in arg) or ('--build=' in arg))] ++ if not self.verbose: ++ config_args.append("-q") + + # Pass empty CFLAGS because we'll just append the resulting + # CFLAGS to Python's; -g or -O2 is to be avoided. +@@ -1367,10 +1406,12 @@ class PyBuildExt(build_ext): + self.compiler.src_extensions.append('.S') + + include_dirs = [os.path.join(ffi_builddir, 'include'), +- ffi_builddir, ffi_srcdir] ++ ffi_builddir, ++ os.path.join(ffi_srcdir, 'src')] + extra_compile_args = fficonfig['ffi_cflags'].split() + +- ext.sources.extend(fficonfig['ffi_sources']) ++ ext.sources.extend(os.path.join(ffi_srcdir, f) for f in ++ fficonfig['ffi_sources']) + ext.include_dirs.extend(include_dirs) + ext.extra_compile_args.extend(extra_compile_args) + return True +@@ -1390,6 +1431,7 @@ class PyBuildExt(build_ext): + + if sys.platform == 'darwin': + sources.append('_ctypes/darwin/dlfcn_simple.c') ++ extra_compile_args.append('-DMACOSX') + include_dirs.append('_ctypes/darwin') + # XXX Is this still needed? + ## extra_link_args.extend(['-read_only_relocs', 'warning']) +@@ -1419,7 +1461,14 @@ class PyBuildExt(build_ext): + if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"): + return + +- ffi_inc = find_file('ffi.h', [], inc_dirs) ++ if sys.platform == 'darwin': ++ # OS X 10.5 comes with libffi.dylib; the include files are ++ # in /usr/include/ffi ++ inc_dirs.append('/usr/include/ffi') ++ ++ ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] ++ if not ffi_inc or ffi_inc[0] == '': ++ ffi_inc = find_file('ffi.h', [], inc_dirs) + if ffi_inc is not None: + ffi_h = ffi_inc[0] + '/ffi.h' + fp = open(ffi_h) diff --git a/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/005_osx_failed_modules.patch b/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/005_osx_failed_modules.patch new file mode 100644 index 0000000..5ccfe9c --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/005_osx_failed_modules.patch @@ -0,0 +1,124 @@ +diff -r -u ./Mac/Modules/cg/_CGmodule.c ./Mac/Modules/cg/_CGmodule.c +index 8115614..e36fce9 100755 +--- ./Mac/Modules/cg/_CGmodule.c ++++ ./Mac/Modules/cg/_CGmodule.c +@@ -1025,6 +1025,7 @@ static PyObject *CGContextRefObj_CGContextSetShouldAntialias(CGContextRefObject + return _res; + } + ++#ifndef __LP64__ + static PyObject *CGContextRefObj_SyncCGContextOriginWithPort(CGContextRefObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1055,6 +1056,7 @@ static PyObject *CGContextRefObj_ClipCGContextToRegion(CGContextRefObject *_self + _res = Py_None; + return _res; + } ++#endif + + static PyMethodDef CGContextRefObj_methods[] = { + {"CGContextSaveGState", (PyCFunction)CGContextRefObj_CGContextSaveGState, 1, +@@ -1173,10 +1175,12 @@ static PyMethodDef CGContextRefObj_methods[] = { + PyDoc_STR("() -> None")}, + {"CGContextSetShouldAntialias", (PyCFunction)CGContextRefObj_CGContextSetShouldAntialias, 1, + PyDoc_STR("(int shouldAntialias) -> None")}, ++#ifndef __LP64__ + {"SyncCGContextOriginWithPort", (PyCFunction)CGContextRefObj_SyncCGContextOriginWithPort, 1, + PyDoc_STR("(CGrafPtr port) -> None")}, + {"ClipCGContextToRegion", (PyCFunction)CGContextRefObj_ClipCGContextToRegion, 1, + PyDoc_STR("(Rect portRect, RgnHandle region) -> None")}, ++#endif + {NULL, NULL, 0} + }; + +@@ -1254,6 +1258,7 @@ PyTypeObject CGContextRef_Type = { + /* ------------------ End object type CGContextRef ------------------ */ + + ++#ifndef __LP64__ + static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1271,10 +1276,13 @@ static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) + return _res; + + } ++#endif + + static PyMethodDef CG_methods[] = { ++#ifndef __LP64__ + {"CreateCGContextForPort", (PyCFunction)CG_CreateCGContextForPort, 1, + PyDoc_STR("(CGrafPtr) -> CGContextRef")}, ++#endif + {NULL, NULL, 0} + }; + +diff -r -u ./Modules/_curses_panel.c ./Modules/_curses_panel.c +index 0acf3fd..1728b59 100644 +--- ./Modules/_curses_panel.c ++++ ./Modules/_curses_panel.c +@@ -56,7 +56,7 @@ typedef struct { + + PyTypeObject PyCursesPanel_Type; + +-#define PyCursesPanel_Check(v) ((v)->ob_type == &PyCursesPanel_Type) ++#define PyCursesPanel_Check(v) (Py_TYPE(v) == &PyCursesPanel_Type) + + /* Some helper functions. The problem is that there's always a window + associated with a panel. To ensure that Python's GC doesn't pull +@@ -178,12 +178,13 @@ PyCursesPanel_New(PANEL *pan, PyCursesWindowObject *wo) + po = PyObject_NEW(PyCursesPanelObject, &PyCursesPanel_Type); + if (po == NULL) return NULL; + po->pan = pan; +- po->wo = wo; +- Py_INCREF(wo); + if (insert_lop(po) < 0) { +- PyObject_DEL(po); +- return NULL; ++ po->wo = NULL; ++ Py_DECREF(po); ++ return NULL; + } ++ po->wo = wo; ++ Py_INCREF(wo); + return (PyObject *)po; + } + +@@ -191,8 +192,10 @@ static void + PyCursesPanel_Dealloc(PyCursesPanelObject *po) + { + (void)del_panel(po->pan); +- Py_DECREF(po->wo); +- remove_lop(po); ++ if (po->wo != NULL) { ++ Py_DECREF(po->wo); ++ remove_lop(po); ++ } + PyObject_DEL(po); + } + +@@ -338,11 +341,10 @@ PyCursesPanel_GetAttr(PyCursesPanelObject *self, char *name) + /* -------------------------------------------------------*/ + + PyTypeObject PyCursesPanel_Type = { +- PyObject_HEAD_INIT(NULL) +- 0, /*ob_size*/ +- "_curses_panel.curses panel", /*tp_name*/ +- sizeof(PyCursesPanelObject), /*tp_basicsize*/ +- 0, /*tp_itemsize*/ ++ PyVarObject_HEAD_INIT(NULL, 0) ++ "_curses_panel.curses panel", /*tp_name*/ ++ sizeof(PyCursesPanelObject), /*tp_basicsize*/ ++ 0, /*tp_itemsize*/ + /* methods */ + (destructor)PyCursesPanel_Dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ +@@ -458,7 +460,7 @@ init_curses_panel(void) + PyObject *m, *d, *v; + + /* Initialize object type */ +- PyCursesPanel_Type.ob_type = &PyType_Type; ++ Py_TYPE(&PyCursesPanel_Type) = &PyType_Type; + + import_curses(); + diff --git a/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/000_patch-setup.py.diff new file mode 100644 index 0000000..ffe4b0d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/000_patch-setup.py.diff @@ -0,0 +1,45 @@ +--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 ++++ setup.py 2011-07-07 19:25:04.548416377 +0900 +@@ -13,6 +13,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -242,10 +243,34 @@ + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ fp = open(tmpfile) ++ multiarch_path_component = fp.readline().strip() ++ fp.close() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. diff --git a/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/001_patch-svnversion.patch b/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/001_patch-svnversion.patch new file mode 100644 index 0000000..5ee39e9 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/001_patch-svnversion.patch @@ -0,0 +1,42 @@ +--- configure.in ++++ configure.in +@@ -767,7 +767,7 @@ + then + SVNVERSION="svnversion \$(srcdir)" + else +- SVNVERSION="echo exported" ++ SVNVERSION="echo Unversioned directory" + fi + + case $MACHDEP in +--- Makefile.pre.in ++++ Makefile.pre.in +@@ -501,7 +501,7 @@ + $(SIGNAL_OBJS) \ + $(MODOBJS) \ + $(srcdir)/Modules/getbuildinfo.c +- $(CC) -c $(PY_CFLAGS) -DSVNVERSION=\"`LC_ALL=C $(SVNVERSION)`\" -o $@ $(srcdir)/Modules/getbuildinfo.c ++ $(CC) -c $(PY_CFLAGS) -DSVNVERSION="\"`LC_ALL=C $(SVNVERSION)`\"" -o $@ $(srcdir)/Modules/getbuildinfo.c + + Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile + $(CC) -c $(PY_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ +--- Modules/getbuildinfo.c ++++ Modules/getbuildinfo.c +@@ -48,5 +48,5 @@ + static const char svnversion[] = SVNVERSION; + if (svnversion[0] != '$') + return svnversion; /* it was interpolated, or passed on command line */ +- return "exported"; ++ return "Unversioned directory"; + } +--- Python/sysmodule.c ++++ Python/sysmodule.c +@@ -1161,7 +1161,7 @@ + + + svnversion = _Py_svnversion(); +- if (strcmp(svnversion, "exported") != 0) ++ if (strcmp(svnversion, "Unversioned directory") != 0 && strcmp(svnversion, "exported") != 0) + svn_revision = svnversion; + else if (istag) { + len = strlen(_patchlevel_revision); diff --git a/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/002_darwin_c_source.patch b/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/002_darwin_c_source.patch new file mode 100644 index 0000000..8cef44a --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/002_darwin_c_source.patch @@ -0,0 +1,166 @@ +diff -r -u ./configure ../Python-2.5/configure +--- ./configure 2006-09-05 11:54:42.000000000 +0900 ++++ ../Python-2.5/configure 2013-07-19 15:27:46.000000000 +0900 +@@ -1396,6 +1396,16 @@ + _ACEOF + + ++# The later defininition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables ++# certain features on Mac OS X, so we need _DARWIN_C_SOURCE to re-enable ++# them. ++ ++cat >>confdefs.h <<\_ACEOF ++#define _DARWIN_C_SOURCE 1 ++_ACEOF ++ ++ ++ + define_xopen_source=yes + + # Arguments passed to configure. +@@ -3885,11 +3895,110 @@ + ;; + # is there any other compiler on Darwin besides gcc? + Darwin*) +- BASECFLAGS="$BASECFLAGS -Wno-long-double -no-cpp-precomp -mno-fused-madd" ++ # -Wno-long-double, -no-cpp-precomp, and -mno-fused-madd ++ # used to be here, but non-Apple gcc doesn't accept them. ++ if test "${CC}" = gcc ++ then ++ { echo "$as_me:${as_lineno-$LINENO}: checking which compiler should be used" >&5 ++echo -n "checking which compiler should be used... " >&6; } ++ case "${UNIVERSALSDK}" in ++ */MacOSX10.4u.sdk) ++ # Build using 10.4 SDK, force usage of gcc when the ++ # compiler is gcc, otherwise the user will get very ++ # confusing error messages when building on OSX 10.6 ++ CC=gcc-4.0 ++ CPP=cpp-4.0 ++ ;; ++ esac ++ { echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 ++echo "$CC" >&6; } ++ fi ++ ++ + if test "${enable_universalsdk}"; then +- BASECFLAGS="-arch ppc -arch i386 -isysroot ${UNIVERSALSDK} ${BASECFLAGS}" ++ UNIVERSAL_ARCH_FLAGS="" ++ if test "$UNIVERSAL_ARCHS" = "32-bit" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch ppc -arch i386" ++ ARCH_RUN_32BIT="" ++ LIPO_32BIT_FLAGS="" ++ elif test "$UNIVERSAL_ARCHS" = "64-bit" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64" ++ LIPO_32BIT_FLAGS="" ++ ARCH_RUN_32BIT="true" ++ ++ elif test "$UNIVERSAL_ARCHS" = "all" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64" ++ LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" ++ ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" ++ ++ elif test "$UNIVERSAL_ARCHS" = "intel" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64" ++ LIPO_32BIT_FLAGS="-extract i386" ++ ARCH_RUN_32BIT="/usr/bin/arch -i386" ++ ++ elif test "$UNIVERSAL_ARCHS" = "3-way" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch x86_64" ++ LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" ++ ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" ++ ++ else ++ as_fn_error $? "proper usage is --with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5 ++ ++ fi ++ ++ ++ CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" ++ if test "${UNIVERSALSDK}" != "/" ++ then ++ CFLAGS="-isysroot ${UNIVERSALSDK} ${CFLAGS}" ++ LDFLAGS="-isysroot ${UNIVERSALSDK} ${LDFLAGS}" ++ CPPFLAGS="-isysroot ${UNIVERSALSDK} ${CPPFLAGS}" ++ fi + fi + ++ # Calculate the right deployment target for this build. ++ # ++ cur_target=`sw_vers -productVersion | sed 's/\(10\.[0-9]*\).*/\1/'` ++ if test ${cur_target} '>' 10.2 && \ ++ test ${cur_target} '<' 10.6 ++ then ++ cur_target=10.3 ++ if test ${enable_universalsdk}; then ++ if test "${UNIVERSAL_ARCHS}" = "all"; then ++ # Ensure that the default platform for a ++ # 4-way universal build is OSX 10.5, ++ # that's the first OS release where ++ # 4-way builds make sense. ++ cur_target='10.5' ++ ++ elif test "${UNIVERSAL_ARCHS}" = "3-way"; then ++ cur_target='10.5' ++ ++ elif test "${UNIVERSAL_ARCHS}" = "intel"; then ++ cur_target='10.5' ++ ++ elif test "${UNIVERSAL_ARCHS}" = "64-bit"; then ++ cur_target='10.5' ++ fi ++ else ++ if test `/usr/bin/arch` = "i386"; then ++ # On Intel macs default to a deployment ++ # target of 10.4, that's the first OSX ++ # release with Intel support. ++ cur_target="10.4" ++ fi ++ fi ++ fi ++ CONFIGURE_MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET-${cur_target}} ++ ++ # Make sure that MACOSX_DEPLOYMENT_TARGET is set in the ++ # environment with a value that is the same as what we'll use ++ # in the Makefile to ensure that we'll get the same compiler ++ # environment during configure and build time. ++ MACOSX_DEPLOYMENT_TARGET="$CONFIGURE_MACOSX_DEPLOYMENT_TARGET" ++ export MACOSX_DEPLOYMENT_TARGET ++ EXPORT_MACOSX_DEPLOYMENT_TARGET='' ++ + ;; + OSF*) + BASECFLAGS="$BASECFLAGS -mieee" +@@ -10851,7 +10960,7 @@ + if test "${enable_universalsdk}"; then + : + else +- LIBTOOL_CRUFT="${LIBTOOL_CRUFT} -arch_only `arch`" ++ LIBTOOL_CRUFT="${LIBTOOL_CRUFT}" + fi + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; +@@ -10863,7 +10972,7 @@ + else + LIBTOOL_CRUFT="" + fi +- LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs -arch_only `arch`" ++ LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs" + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; + esac +diff -r -u ./pyconfig.h.in ../Python-2.5/pyconfig.h.in +--- ./pyconfig.h.in 2006-07-30 23:09:47.000000000 +0900 ++++ ../Python-2.5/pyconfig.h.in 2013-07-17 23:12:31.000000000 +0900 +@@ -912,6 +912,11 @@ + /* Define on Irix to enable u_int */ + #undef _BSD_TYPES + ++/* Define on Darwin to activate all library features */ ++#ifndef _DARWIN_C_SOURCE ++#define _DARWIN_C_SOURCE ++#endif ++ + /* This must be set to 64 on some systems to enable large file support. */ + #undef _FILE_OFFSET_BITS + diff --git a/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/003_osx_lp64.patch b/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/003_osx_lp64.patch new file mode 100644 index 0000000..fc07fc1 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/003_osx_lp64.patch @@ -0,0 +1,271 @@ +diff -r -u ./Include/pymactoolbox.h ../Python-2.5/Include/pymactoolbox.h +--- ./Include/pymactoolbox.h 2004-11-05 16:02:59.000000000 +0900 ++++ ../Python-2.5/Include/pymactoolbox.h 2013-07-17 23:38:51.000000000 +0900 +@@ -8,7 +8,10 @@ + #endif + + #include ++ ++#ifndef __LP64__ + #include ++#endif /* !__LP64__ */ + + /* + ** Helper routines for error codes and such. +@@ -18,8 +21,11 @@ + PyObject *PyMac_GetOSErrException(void); /* Initialize & return it */ + PyObject *PyErr_Mac(PyObject *, int); /* Exception with a mac error */ + PyObject *PyMac_Error(OSErr); /* Uses PyMac_GetOSErrException */ ++#ifndef __LP64__ + extern OSErr PyMac_GetFullPathname(FSSpec *, char *, int); /* convert + fsspec->path */ ++#endif /* __LP64__ */ ++ + /* + ** These conversion routines are defined in mactoolboxglue.c itself. + */ +@@ -83,8 +89,10 @@ + #endif /* USE_TOOLBOX_OBJECT_GLUE */ + + /* macfs exports */ ++#ifndef __LP64__ + int PyMac_GetFSSpec(PyObject *, FSSpec *); /* argument parser for FSSpec */ + PyObject *PyMac_BuildFSSpec(FSSpec *); /* Convert FSSpec to PyObject */ ++#endif /* !__LP64__ */ + + int PyMac_GetFSRef(PyObject *, FSRef *); /* argument parser for FSRef */ + PyObject *PyMac_BuildFSRef(FSRef *); /* Convert FSRef to PyObject */ +@@ -101,39 +109,54 @@ + extern int CmpInstObj_Convert(PyObject *, ComponentInstance *); + + /* Ctl exports */ ++#ifndef __LP64__ + extern PyObject *CtlObj_New(ControlHandle); + extern int CtlObj_Convert(PyObject *, ControlHandle *); ++#endif /* !__LP64__ */ + + /* Dlg exports */ ++#ifndef __LP64__ + extern PyObject *DlgObj_New(DialogPtr); + extern int DlgObj_Convert(PyObject *, DialogPtr *); + extern PyObject *DlgObj_WhichDialog(DialogPtr); ++#endif /* !__LP64__ */ + + /* Drag exports */ ++#ifndef __LP64__ + extern PyObject *DragObj_New(DragReference); + extern int DragObj_Convert(PyObject *, DragReference *); ++#endif /* !__LP64__ */ + + /* List exports */ ++#ifndef __LP64__ + extern PyObject *ListObj_New(ListHandle); + extern int ListObj_Convert(PyObject *, ListHandle *); ++#endif /* !__LP64__ */ + + /* Menu exports */ ++#ifndef __LP64__ + extern PyObject *MenuObj_New(MenuHandle); + extern int MenuObj_Convert(PyObject *, MenuHandle *); ++#endif /* !__LP64__ */ + + /* Qd exports */ ++#ifndef __LP64__ + extern PyObject *GrafObj_New(GrafPtr); + extern int GrafObj_Convert(PyObject *, GrafPtr *); + extern PyObject *BMObj_New(BitMapPtr); + extern int BMObj_Convert(PyObject *, BitMapPtr *); + extern PyObject *QdRGB_New(RGBColor *); + extern int QdRGB_Convert(PyObject *, RGBColor *); ++#endif /* !__LP64__ */ + + /* Qdoffs exports */ ++#ifndef __LP64__ + extern PyObject *GWorldObj_New(GWorldPtr); + extern int GWorldObj_Convert(PyObject *, GWorldPtr *); ++#endif /* !__LP64__ */ + + /* Qt exports */ ++#ifndef __LP64__ + extern PyObject *TrackObj_New(Track); + extern int TrackObj_Convert(PyObject *, Track *); + extern PyObject *MovieObj_New(Movie); +@@ -146,6 +169,7 @@ + extern int UserDataObj_Convert(PyObject *, UserData *); + extern PyObject *MediaObj_New(Media); + extern int MediaObj_Convert(PyObject *, Media *); ++#endif /* !__LP64__ */ + + /* Res exports */ + extern PyObject *ResObj_New(Handle); +@@ -154,13 +178,17 @@ + extern int OptResObj_Convert(PyObject *, Handle *); + + /* TE exports */ ++#ifndef __LP64__ + extern PyObject *TEObj_New(TEHandle); + extern int TEObj_Convert(PyObject *, TEHandle *); ++#endif /* !__LP64__ */ + + /* Win exports */ ++#ifndef __LP64__ + extern PyObject *WinObj_New(WindowPtr); + extern int WinObj_Convert(PyObject *, WindowPtr *); + extern PyObject *WinObj_WhichWindow(WindowPtr); ++#endif /* !__LP64__ */ + + /* CF exports */ + extern PyObject *CFObj_New(CFTypeRef); +diff -r -u ./Mac/Modules/res/_Resmodule.c ../Python-2.5/Mac/Modules/res/_Resmodule.c +--- ./Mac/Modules/res/_Resmodule.c 2005-07-04 05:59:44.000000000 +0900 ++++ ../Python-2.5/Mac/Modules/res/_Resmodule.c 2013-07-17 23:38:51.000000000 +0900 +@@ -414,6 +414,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *ResObj_as_Control(ResourceObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -431,6 +432,7 @@ + return _res; + + } ++#endif /* !__LP64__ */ + + static PyObject *ResObj_LoadResource(ResourceObject *_self, PyObject *_args) + { +@@ -1152,6 +1154,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *Res_OpenRFPerm(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1287,6 +1290,7 @@ + _res = Py_None; + return _res; + } ++#endif /* !__LP64__ */ + + static PyObject *Res_InsertResourceFile(PyObject *_self, PyObject *_args) + { +@@ -1327,6 +1331,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *Res_FSpResourceFileAlreadyOpen(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1413,6 +1418,7 @@ + nextRefNum); + return _res; + } ++#endif /* !__LP64__ */ + + static PyObject *Res_FSOpenResFile(PyObject *_self, PyObject *_args) + { +@@ -1438,6 +1444,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *Res_FSCreateResFile(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1534,6 +1541,7 @@ + PyMac_BuildFSSpec, &newSpec); + return _res; + } ++#endif /* __LP64__ */ + + static PyObject *Res_FSOpenResourceFile(PyObject *_self, PyObject *_args) + { +@@ -1637,6 +1645,7 @@ + PyDoc_STR("(short refNum) -> (short _rv)")}, + {"SetResFileAttrs", (PyCFunction)Res_SetResFileAttrs, 1, + PyDoc_STR("(short refNum, short attrs) -> None")}, ++#ifndef __LP64__ + {"OpenRFPerm", (PyCFunction)Res_OpenRFPerm, 1, + PyDoc_STR("(Str255 fileName, short vRefNum, SignedByte permission) -> (short _rv)")}, + {"HOpenResFile", (PyCFunction)Res_HOpenResFile, 1, +@@ -1647,10 +1656,12 @@ + PyDoc_STR("(FSSpec spec, SignedByte permission) -> (short _rv)")}, + {"FSpCreateResFile", (PyCFunction)Res_FSpCreateResFile, 1, + PyDoc_STR("(FSSpec spec, OSType creator, OSType fileType, ScriptCode scriptTag) -> None")}, ++#endif /* !__LP64__ */ + {"InsertResourceFile", (PyCFunction)Res_InsertResourceFile, 1, + PyDoc_STR("(SInt16 refNum, RsrcChainLocation where) -> None")}, + {"DetachResourceFile", (PyCFunction)Res_DetachResourceFile, 1, + PyDoc_STR("(SInt16 refNum) -> None")}, ++#ifndef __LP64__ + {"FSpResourceFileAlreadyOpen", (PyCFunction)Res_FSpResourceFileAlreadyOpen, 1, + PyDoc_STR("(FSSpec resourceFile) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, + {"FSpOpenOrphanResFile", (PyCFunction)Res_FSpOpenOrphanResFile, 1, +@@ -1659,14 +1670,17 @@ + PyDoc_STR("() -> (SInt16 refNum)")}, + {"GetNextResourceFile", (PyCFunction)Res_GetNextResourceFile, 1, + PyDoc_STR("(SInt16 curRefNum) -> (SInt16 nextRefNum)")}, ++#endif /* __LP64__ */ + {"FSOpenResFile", (PyCFunction)Res_FSOpenResFile, 1, + PyDoc_STR("(FSRef ref, SignedByte permission) -> (short _rv)")}, ++#ifndef __LP64__ + {"FSCreateResFile", (PyCFunction)Res_FSCreateResFile, 1, + PyDoc_STR("(FSRef parentRef, Buffer nameLength) -> (FSRef newRef, FSSpec newSpec)")}, + {"FSResourceFileAlreadyOpen", (PyCFunction)Res_FSResourceFileAlreadyOpen, 1, + PyDoc_STR("(FSRef resourceFileRef) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, + {"FSCreateResourceFile", (PyCFunction)Res_FSCreateResourceFile, 1, + PyDoc_STR("(FSRef parentRef, Buffer nameLength, Buffer forkNameLength) -> (FSRef newRef, FSSpec newSpec)")}, ++#endif /* __LP64__ */ + {"FSOpenResourceFile", (PyCFunction)Res_FSOpenResourceFile, 1, + PyDoc_STR("(FSRef ref, Buffer forkNameLength, SignedByte permissions) -> (SInt16 refNum)")}, + {"Handle", (PyCFunction)Res_Handle, 1, +diff -r -u ./Modules/_ctypes/libffi/src/darwin/ffitarget.h ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h +--- ./Modules/_ctypes/libffi/src/darwin/ffitarget.h 2006-05-26 06:58:05.000000000 +0900 ++++ ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h 2013-07-17 23:38:51.000000000 +0900 +@@ -4,7 +4,7 @@ + * created by configure). This makes is possible to build a univeral binary + * of ctypes in one go. + */ +-#if defined(__i386__) ++#if defined(__i386__) || defined(__x86_64__) + + #ifndef X86_DARWIN + #define X86_DARWIN +diff -r -u ./Python/mactoolboxglue.c ../Python-2.5/Python/mactoolboxglue.c +--- ./Python/mactoolboxglue.c 2006-07-12 01:44:25.000000000 +0900 ++++ ../Python-2.5/Python/mactoolboxglue.c 2013-07-17 23:39:09.000000000 +0900 +@@ -106,6 +106,7 @@ + } + + ++#ifndef __LP64__ + OSErr + PyMac_GetFullPathname(FSSpec *fss, char *path, int len) + { +@@ -153,6 +154,7 @@ + Py_XDECREF(fs); + return err; + } ++#endif /* !__LP64__ */ + + /* Convert a 4-char string object argument to an OSType value */ + int +@@ -417,6 +419,7 @@ + GLUE_NEW(GWorldPtr, GWorldObj_New, "Carbon.Qdoffs") + GLUE_CONVERT(GWorldPtr, GWorldObj_Convert, "Carbon.Qdoffs") + ++#ifndef __LP64__ + GLUE_NEW(Track, TrackObj_New, "Carbon.Qt") + GLUE_CONVERT(Track, TrackObj_Convert, "Carbon.Qt") + GLUE_NEW(Movie, MovieObj_New, "Carbon.Qt") +@@ -429,6 +432,7 @@ + GLUE_CONVERT(UserData, UserDataObj_Convert, "Carbon.Qt") + GLUE_NEW(Media, MediaObj_New, "Carbon.Qt") + GLUE_CONVERT(Media, MediaObj_Convert, "Carbon.Qt") ++#endif /* !__LP64__ */ + + GLUE_NEW(Handle, ResObj_New, "Carbon.Res") + GLUE_CONVERT(Handle, ResObj_Convert, "Carbon.Res") diff --git a/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/004_osx_libffi.patch b/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/004_osx_libffi.patch new file mode 100644 index 0000000..8318432 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/004_osx_libffi.patch @@ -0,0 +1,6881 @@ +diff -r -u ./Modules/_ctypes/libffi_osx/LICENSE ./Modules/_ctypes/libffi_osx/LICENSE +new file mode 100644 +index 0000000..f591795 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/LICENSE +@@ -0,0 +1,20 @@ ++libffi - Copyright (c) 1996-2003 Red Hat, Inc. ++ ++Permission is hereby granted, free of charge, to any person obtaining ++a copy of this software and associated documentation files (the ++``Software''), to deal in the Software without restriction, including ++without limitation the rights to use, copy, modify, merge, publish, ++distribute, sublicense, and/or sell copies of the Software, and to ++permit persons to whom the Software is furnished to do so, subject to ++the following conditions: ++ ++The above copyright notice and this permission notice shall be included ++in all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++OTHER DEALINGS IN THE SOFTWARE. +diff -r -u ./Modules/_ctypes/libffi_osx/README ./Modules/_ctypes/libffi_osx/README +new file mode 100644 +index 0000000..1fc2747 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/README +@@ -0,0 +1,500 @@ ++This directory contains the libffi package, which is not part of GCC but ++shipped with GCC as convenience. ++ ++Status ++====== ++ ++libffi-2.00 has not been released yet! This is a development snapshot! ++ ++libffi-1.20 was released on October 5, 1998. Check the libffi web ++page for updates: . ++ ++ ++What is libffi? ++=============== ++ ++Compilers for high level languages generate code that follow certain ++conventions. These conventions are necessary, in part, for separate ++compilation to work. One such convention is the "calling ++convention". The "calling convention" is essentially a set of ++assumptions made by the compiler about where function arguments will ++be found on entry to a function. A "calling convention" also specifies ++where the return value for a function is found. ++ ++Some programs may not know at the time of compilation what arguments ++are to be passed to a function. For instance, an interpreter may be ++told at run-time about the number and types of arguments used to call ++a given function. Libffi can be used in such programs to provide a ++bridge from the interpreter program to compiled code. ++ ++The libffi library provides a portable, high level programming ++interface to various calling conventions. This allows a programmer to ++call any function specified by a call interface description at run ++time. ++ ++Ffi stands for Foreign Function Interface. A foreign function ++interface is the popular name for the interface that allows code ++written in one language to call code written in another language. The ++libffi library really only provides the lowest, machine dependent ++layer of a fully featured foreign function interface. A layer must ++exist above libffi that handles type conversions for values passed ++between the two languages. ++ ++ ++Supported Platforms and Prerequisites ++===================================== ++ ++Libffi has been ported to: ++ ++ SunOS 4.1.3 & Solaris 2.x (SPARC-V8, SPARC-V9) ++ ++ Irix 5.3 & 6.2 (System V/o32 & n32) ++ ++ Intel x86 - Linux (System V ABI) ++ ++ Alpha - Linux and OSF/1 ++ ++ m68k - Linux (System V ABI) ++ ++ PowerPC - Linux (System V ABI, Darwin, AIX) ++ ++ ARM - Linux (System V ABI) ++ ++Libffi has been tested with the egcs 1.0.2 gcc compiler. Chances are ++that other versions will work. Libffi has also been built and tested ++with the SGI compiler tools. ++ ++On PowerPC, the tests failed (see the note below). ++ ++You must use GNU make to build libffi. SGI's make will not work. ++Sun's probably won't either. ++ ++If you port libffi to another platform, please let me know! I assume ++that some will be easy (x86 NetBSD), and others will be more difficult ++(HP). ++ ++ ++Installing libffi ++================= ++ ++[Note: before actually performing any of these installation steps, ++ you may wish to read the "Platform Specific Notes" below.] ++ ++First you must configure the distribution for your particular ++system. Go to the directory you wish to build libffi in and run the ++"configure" program found in the root directory of the libffi source ++distribution. ++ ++You may want to tell configure where to install the libffi library and ++header files. To do that, use the --prefix configure switch. Libffi ++will install under /usr/local by default. ++ ++If you want to enable extra run-time debugging checks use the the ++--enable-debug configure switch. This is useful when your program dies ++mysteriously while using libffi. ++ ++Another useful configure switch is --enable-purify-safety. Using this ++will add some extra code which will suppress certain warnings when you ++are using Purify with libffi. Only use this switch when using ++Purify, as it will slow down the library. ++ ++Configure has many other options. Use "configure --help" to see them all. ++ ++Once configure has finished, type "make". Note that you must be using ++GNU make. SGI's make will not work. Sun's probably won't either. ++You can ftp GNU make from prep.ai.mit.edu:/pub/gnu. ++ ++To ensure that libffi is working as advertised, type "make test". ++ ++To install the library and header files, type "make install". ++ ++ ++Using libffi ++============ ++ ++ The Basics ++ ---------- ++ ++Libffi assumes that you have a pointer to the function you wish to ++call and that you know the number and types of arguments to pass it, ++as well as the return type of the function. ++ ++The first thing you must do is create an ffi_cif object that matches ++the signature of the function you wish to call. The cif in ffi_cif ++stands for Call InterFace. To prepare a call interface object, use the ++following function: ++ ++ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, ++ unsigned int nargs, ++ ffi_type *rtype, ffi_type **atypes); ++ ++ CIF is a pointer to the call interface object you wish ++ to initialize. ++ ++ ABI is an enum that specifies the calling convention ++ to use for the call. FFI_DEFAULT_ABI defaults ++ to the system's native calling convention. Other ++ ABI's may be used with care. They are system ++ specific. ++ ++ NARGS is the number of arguments this function accepts. ++ libffi does not yet support vararg functions. ++ ++ RTYPE is a pointer to an ffi_type structure that represents ++ the return type of the function. Ffi_type objects ++ describe the types of values. libffi provides ++ ffi_type objects for many of the native C types: ++ signed int, unsigned int, signed char, unsigned char, ++ etc. There is also a pointer ffi_type object and ++ a void ffi_type. Use &ffi_type_void for functions that ++ don't return values. ++ ++ ATYPES is a vector of ffi_type pointers. ARGS must be NARGS long. ++ If NARGS is 0, this is ignored. ++ ++ ++ffi_prep_cif will return a status code that you are responsible ++for checking. It will be one of the following: ++ ++ FFI_OK - All is good. ++ ++ FFI_BAD_TYPEDEF - One of the ffi_type objects that ffi_prep_cif ++ came across is bad. ++ ++ ++Before making the call, the VALUES vector should be initialized ++with pointers to the appropriate argument values. ++ ++To call the function using the initialized ffi_cif, use the ++ffi_call function: ++ ++void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues); ++ ++ CIF is a pointer to the ffi_cif initialized specifically ++ for this function. ++ ++ FN is a pointer to the function you want to call. ++ ++ RVALUE is a pointer to a chunk of memory that is to hold the ++ result of the function call. Currently, it must be ++ at least one word in size (except for the n32 version ++ under Irix 6.x, which must be a pointer to an 8 byte ++ aligned value (a long long). It must also be at least ++ word aligned (depending on the return type, and the ++ system's alignment requirements). If RTYPE is ++ &ffi_type_void, this is ignored. If RVALUE is NULL, ++ the return value is discarded. ++ ++ AVALUES is a vector of void* that point to the memory locations ++ holding the argument values for a call. ++ If NARGS is 0, this is ignored. ++ ++ ++If you are expecting a return value from FN it will have been stored ++at RVALUE. ++ ++ ++ ++ An Example ++ ---------- ++ ++Here is a trivial example that calls puts() a few times. ++ ++ #include ++ #include ++ ++ int main() ++ { ++ ffi_cif cif; ++ ffi_type *args[1]; ++ void *values[1]; ++ char *s; ++ int rc; ++ ++ /* Initialize the argument info vectors */ ++ args[0] = &ffi_type_uint; ++ values[0] = &s; ++ ++ /* Initialize the cif */ ++ if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, ++ &ffi_type_uint, args) == FFI_OK) ++ { ++ s = "Hello World!"; ++ ffi_call(&cif, puts, &rc, values); ++ /* rc now holds the result of the call to puts */ ++ ++ /* values holds a pointer to the function's arg, so to ++ call puts() again all we need to do is change the ++ value of s */ ++ s = "This is cool!"; ++ ffi_call(&cif, puts, &rc, values); ++ } ++ ++ return 0; ++ } ++ ++ ++ ++ Aggregate Types ++ --------------- ++ ++Although libffi has no special support for unions or bit-fields, it is ++perfectly happy passing structures back and forth. You must first ++describe the structure to libffi by creating a new ffi_type object ++for it. Here is the definition of ffi_type: ++ ++ typedef struct _ffi_type ++ { ++ unsigned size; ++ short alignment; ++ short type; ++ struct _ffi_type **elements; ++ } ffi_type; ++ ++All structures must have type set to FFI_TYPE_STRUCT. You may set ++size and alignment to 0. These will be calculated and reset to the ++appropriate values by ffi_prep_cif(). ++ ++elements is a NULL terminated array of pointers to ffi_type objects ++that describe the type of the structure elements. These may, in turn, ++be structure elements. ++ ++The following example initializes a ffi_type object representing the ++tm struct from Linux's time.h: ++ ++ struct tm { ++ int tm_sec; ++ int tm_min; ++ int tm_hour; ++ int tm_mday; ++ int tm_mon; ++ int tm_year; ++ int tm_wday; ++ int tm_yday; ++ int tm_isdst; ++ /* Those are for future use. */ ++ long int __tm_gmtoff__; ++ __const char *__tm_zone__; ++ }; ++ ++ { ++ ffi_type tm_type; ++ ffi_type *tm_type_elements[12]; ++ int i; ++ ++ tm_type.size = tm_type.alignment = 0; ++ tm_type.elements = &tm_type_elements; ++ ++ for (i = 0; i < 9; i++) ++ tm_type_elements[i] = &ffi_type_sint; ++ ++ tm_type_elements[9] = &ffi_type_slong; ++ tm_type_elements[10] = &ffi_type_pointer; ++ tm_type_elements[11] = NULL; ++ ++ /* tm_type can now be used to represent tm argument types and ++ return types for ffi_prep_cif() */ ++ } ++ ++ ++ ++Platform Specific Notes ++======================= ++ ++ Intel x86 ++ --------- ++ ++There are no known problems with the x86 port. ++ ++ Sun SPARC - SunOS 4.1.3 & Solaris 2.x ++ ------------------------------------- ++ ++You must use GNU Make to build libffi on Sun platforms. ++ ++ MIPS - Irix 5.3 & 6.x ++ --------------------- ++ ++Irix 6.2 and better supports three different calling conventions: o32, ++n32 and n64. Currently, libffi only supports both o32 and n32 under ++Irix 6.x, but only o32 under Irix 5.3. Libffi will automatically be ++configured for whichever calling convention it was built for. ++ ++By default, the configure script will try to build libffi with the GNU ++development tools. To build libffi with the SGI development tools, set ++the environment variable CC to either "cc -32" or "cc -n32" before ++running configure under Irix 6.x (depending on whether you want an o32 ++or n32 library), or just "cc" for Irix 5.3. ++ ++With the n32 calling convention, when returning structures smaller ++than 16 bytes, be sure to provide an RVALUE that is 8 byte aligned. ++Here's one way of forcing this: ++ ++ double struct_storage[2]; ++ my_small_struct *s = (my_small_struct *) struct_storage; ++ /* Use s for RVALUE */ ++ ++If you don't do this you are liable to get spurious bus errors. ++ ++"long long" values are not supported yet. ++ ++You must use GNU Make to build libffi on SGI platforms. ++ ++ ARM - System V ABI ++ ------------------ ++ ++The ARM port was performed on a NetWinder running ARM Linux ELF ++(2.0.31) and gcc 2.8.1. ++ ++ ++ ++ PowerPC System V ABI ++ -------------------- ++ ++There are two `System V ABI's which libffi implements for PowerPC. ++They differ only in how small structures are returned from functions. ++ ++In the FFI_SYSV version, structures that are 8 bytes or smaller are ++returned in registers. This is what GCC does when it is configured ++for solaris, and is what the System V ABI I have (dated September ++1995) says. ++ ++In the FFI_GCC_SYSV version, all structures are returned the same way: ++by passing a pointer as the first argument to the function. This is ++what GCC does when it is configured for linux or a generic sysv ++target. ++ ++EGCS 1.0.1 (and probably other versions of EGCS/GCC) also has a ++inconsistency with the SysV ABI: When a procedure is called with many ++floating-point arguments, some of them get put on the stack. They are ++all supposed to be stored in double-precision format, even if they are ++only single-precision, but EGCS stores single-precision arguments as ++single-precision anyway. This causes one test to fail (the `many ++arguments' test). ++ ++ ++What's With The Crazy Comments? ++=============================== ++ ++You might notice a number of cryptic comments in the code, delimited ++by /*@ and @*/. These are annotations read by the program LCLint, a ++tool for statically checking C programs. You can read all about it at ++. ++ ++ ++History ++======= ++ ++1.20 Oct-5-98 ++ Raffaele Sena produces ARM port. ++ ++1.19 Oct-5-98 ++ Fixed x86 long double and long long return support. ++ m68k bug fixes from Andreas Schwab. ++ Patch for DU assembler compatibility for the Alpha from Richard ++ Henderson. ++ ++1.18 Apr-17-98 ++ Bug fixes and MIPS configuration changes. ++ ++1.17 Feb-24-98 ++ Bug fixes and m68k port from Andreas Schwab. PowerPC port from ++ Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes. ++ ++1.16 Feb-11-98 ++ Richard Henderson produces Alpha port. ++ ++1.15 Dec-4-97 ++ Fixed an n32 ABI bug. New libtool, auto* support. ++ ++1.14 May-13-97 ++ libtool is now used to generate shared and static libraries. ++ Fixed a minor portability problem reported by Russ McManus ++ . ++ ++1.13 Dec-2-96 ++ Added --enable-purify-safety to keep Purify from complaining ++ about certain low level code. ++ Sparc fix for calling functions with < 6 args. ++ Linux x86 a.out fix. ++ ++1.12 Nov-22-96 ++ Added missing ffi_type_void, needed for supporting void return ++ types. Fixed test case for non MIPS machines. Cygnus Support ++ is now Cygnus Solutions. ++ ++1.11 Oct-30-96 ++ Added notes about GNU make. ++ ++1.10 Oct-29-96 ++ Added configuration fix for non GNU compilers. ++ ++1.09 Oct-29-96 ++ Added --enable-debug configure switch. Clean-ups based on LCLint ++ feedback. ffi_mips.h is always installed. Many configuration ++ fixes. Fixed ffitest.c for sparc builds. ++ ++1.08 Oct-15-96 ++ Fixed n32 problem. Many clean-ups. ++ ++1.07 Oct-14-96 ++ Gordon Irlam rewrites v8.S again. Bug fixes. ++ ++1.06 Oct-14-96 ++ Gordon Irlam improved the sparc port. ++ ++1.05 Oct-14-96 ++ Interface changes based on feedback. ++ ++1.04 Oct-11-96 ++ Sparc port complete (modulo struct passing bug). ++ ++1.03 Oct-10-96 ++ Passing struct args, and returning struct values works for ++ all architectures/calling conventions. Expanded tests. ++ ++1.02 Oct-9-96 ++ Added SGI n32 support. Fixed bugs in both o32 and Linux support. ++ Added "make test". ++ ++1.01 Oct-8-96 ++ Fixed float passing bug in mips version. Restructured some ++ of the code. Builds cleanly with SGI tools. ++ ++1.00 Oct-7-96 ++ First release. No public announcement. ++ ++ ++Authors & Credits ++================= ++ ++libffi was written by Anthony Green . ++ ++Portions of libffi were derived from Gianni Mariani's free gencall ++library for Silicon Graphics machines. ++ ++The closure mechanism was designed and implemented by Kresten Krab ++Thorup. ++ ++The Sparc port was derived from code contributed by the fine folks at ++Visible Decisions Inc . Further enhancements were ++made by Gordon Irlam at Cygnus Solutions . ++ ++The Alpha port was written by Richard Henderson at Cygnus Solutions. ++ ++Andreas Schwab ported libffi to m68k Linux and provided a number of ++bug fixes. ++ ++Geoffrey Keating ported libffi to the PowerPC. ++ ++Raffaele Sena ported libffi to the ARM. ++ ++Jesper Skov and Andrew Haley both did more than their fair share of ++stepping through the code and tracking down bugs. ++ ++Thanks also to Tom Tromey for bug fixes and configuration help. ++ ++Thanks to Jim Blandy, who provided some useful feedback on the libffi ++interface. ++ ++If you have a problem, or have found a bug, please send a note to ++green@cygnus.com. +diff -r -u ./Modules/_ctypes/libffi_osx/README.pyobjc ./Modules/_ctypes/libffi_osx/README.pyobjc +new file mode 100644 +index 0000000..405d85f +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/README.pyobjc +@@ -0,0 +1,5 @@ ++This directory contains a slightly modified version of libffi, extracted from ++the GCC source-tree. ++ ++The only modifications are those that are necessary to compile libffi using ++the Apple provided compiler and outside of the GCC source tree. +diff -r -u ./Modules/_ctypes/libffi_osx/ffi.c ./Modules/_ctypes/libffi_osx/ffi.c +new file mode 100644 +index 0000000..bf42093 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/ffi.c +@@ -0,0 +1,226 @@ ++/* ----------------------------------------------------------------------- ++ prep_cif.c - Copyright (c) 1996, 1998 Red Hat, Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++#include ++ ++/* Round up to FFI_SIZEOF_ARG. */ ++#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG) ++ ++/* Perform machine independent initialization of aggregate type ++ specifications. */ ++ ++static ffi_status ++initialize_aggregate( ++/*@out@*/ ffi_type* arg) ++{ ++/*@-usedef@*/ ++ ++ if (arg == NULL || arg->elements == NULL || ++ arg->size != 0 || arg->alignment != 0) ++ return FFI_BAD_TYPEDEF; ++ ++ ffi_type** ptr = &(arg->elements[0]); ++ ++ while ((*ptr) != NULL) ++ { ++ if (((*ptr)->size == 0) && (initialize_aggregate(*ptr) != FFI_OK)) ++ return FFI_BAD_TYPEDEF; ++ ++ /* Perform a sanity check on the argument type */ ++ FFI_ASSERT_VALID_TYPE(*ptr); ++ ++#ifdef POWERPC_DARWIN ++ int curalign = (*ptr)->alignment; ++ ++ if (ptr != &(arg->elements[0])) ++ { ++ if (curalign > 4 && curalign != 16) ++ curalign = 4; ++ } ++ ++ arg->size = ALIGN(arg->size, curalign); ++ arg->size += (*ptr)->size; ++ arg->alignment = (arg->alignment > curalign) ? ++ arg->alignment : curalign; ++#else ++ arg->size = ALIGN(arg->size, (*ptr)->alignment); ++ arg->size += (*ptr)->size; ++ arg->alignment = (arg->alignment > (*ptr)->alignment) ? ++ arg->alignment : (*ptr)->alignment; ++#endif ++ ++ ptr++; ++ } ++ ++ /* Structure size includes tail padding. This is important for ++ structures that fit in one register on ABIs like the PowerPC64 ++ Linux ABI that right justify small structs in a register. ++ It's also needed for nested structure layout, for example ++ struct A { long a; char b; }; struct B { struct A x; char y; }; ++ should find y at an offset of 2*sizeof(long) and result in a ++ total size of 3*sizeof(long). */ ++ arg->size = ALIGN(arg->size, arg->alignment); ++ ++ if (arg->size == 0) ++ return FFI_BAD_TYPEDEF; ++ ++ return FFI_OK; ++ ++/*@=usedef@*/ ++} ++ ++#ifndef __CRIS__ ++/* The CRIS ABI specifies structure elements to have byte ++ alignment only, so it completely overrides this functions, ++ which assumes "natural" alignment and padding. */ ++ ++/* Perform machine independent ffi_cif preparation, then call ++ machine dependent routine. */ ++ ++#if defined(X86_DARWIN) ++ ++static inline bool ++struct_on_stack( ++ int size) ++{ ++ if (size > 8) ++ return true; ++ ++ /* This is not what the ABI says, but is what is really implemented */ ++ switch (size) ++ { ++ case 1: ++ case 2: ++ case 4: ++ case 8: ++ return false; ++ ++ default: ++ return true; ++ } ++} ++ ++#endif // defined(X86_DARWIN) ++ ++// Arguments' ffi_type->alignment must be nonzero. ++ffi_status ++ffi_prep_cif( ++/*@out@*/ /*@partial@*/ ffi_cif* cif, ++ ffi_abi abi, ++ unsigned int nargs, ++/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, ++/*@dependent@*/ ffi_type** atypes) ++{ ++ if (cif == NULL) ++ return FFI_BAD_TYPEDEF; ++ ++ if (abi <= FFI_FIRST_ABI || abi > FFI_DEFAULT_ABI) ++ return FFI_BAD_ABI; ++ ++ unsigned int bytes = 0; ++ unsigned int i; ++ ffi_type** ptr; ++ ++ cif->abi = abi; ++ cif->arg_types = atypes; ++ cif->nargs = nargs; ++ cif->rtype = rtype; ++ cif->flags = 0; ++ ++ /* Initialize the return type if necessary */ ++ /*@-usedef@*/ ++ if ((cif->rtype->size == 0) && (initialize_aggregate(cif->rtype) != FFI_OK)) ++ return FFI_BAD_TYPEDEF; ++ /*@=usedef@*/ ++ ++ /* Perform a sanity check on the return type */ ++ FFI_ASSERT_VALID_TYPE(cif->rtype); ++ ++ /* x86-64 and s390 stack space allocation is handled in prep_machdep. */ ++#if !defined M68K && !defined __x86_64__ && !defined S390 && !defined PA ++ /* Make space for the return structure pointer */ ++ if (cif->rtype->type == FFI_TYPE_STRUCT ++#ifdef SPARC ++ && (cif->abi != FFI_V9 || cif->rtype->size > 32) ++#endif ++#ifdef X86_DARWIN ++ && (struct_on_stack(cif->rtype->size)) ++#endif ++ ) ++ bytes = STACK_ARG_SIZE(sizeof(void*)); ++#endif ++ ++ for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) ++ { ++ /* Initialize any uninitialized aggregate type definitions */ ++ if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) ++ return FFI_BAD_TYPEDEF; ++ ++ if ((*ptr)->alignment == 0) ++ return FFI_BAD_TYPEDEF; ++ ++ /* Perform a sanity check on the argument type, do this ++ check after the initialization. */ ++ FFI_ASSERT_VALID_TYPE(*ptr); ++ ++#if defined(X86_DARWIN) ++ { ++ int align = (*ptr)->alignment; ++ ++ if (align > 4) ++ align = 4; ++ ++ if ((align - 1) & bytes) ++ bytes = ALIGN(bytes, align); ++ ++ bytes += STACK_ARG_SIZE((*ptr)->size); ++ } ++#elif !defined __x86_64__ && !defined S390 && !defined PA ++#ifdef SPARC ++ if (((*ptr)->type == FFI_TYPE_STRUCT ++ && ((*ptr)->size > 16 || cif->abi != FFI_V9)) ++ || ((*ptr)->type == FFI_TYPE_LONGDOUBLE ++ && cif->abi != FFI_V9)) ++ bytes += sizeof(void*); ++ else ++#endif ++ { ++ /* Add any padding if necessary */ ++ if (((*ptr)->alignment - 1) & bytes) ++ bytes = ALIGN(bytes, (*ptr)->alignment); ++ ++ bytes += STACK_ARG_SIZE((*ptr)->size); ++ } ++#endif ++ } ++ ++ cif->bytes = bytes; ++ ++ /* Perform machine dependent cif processing */ ++ return ffi_prep_cif_machdep(cif); ++} ++#endif /* not __CRIS__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi.h ./Modules/_ctypes/libffi_osx/include/ffi.h +new file mode 100644 +index 0000000..c104a5c +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ffi.h +@@ -0,0 +1,355 @@ ++/* -----------------------------------------------------------------*-C-*- ++ libffi PyOBJC - Copyright (c) 1996-2003 Red Hat, Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ++ ----------------------------------------------------------------------- */ ++ ++/* ------------------------------------------------------------------- ++ The basic API is described in the README file. ++ ++ The raw API is designed to bypass some of the argument packing ++ and unpacking on architectures for which it can be avoided. ++ ++ The closure API allows interpreted functions to be packaged up ++ inside a C function pointer, so that they can be called as C functions, ++ with no understanding on the client side that they are interpreted. ++ It can also be used in other cases in which it is necessary to package ++ up a user specified parameter and a function pointer as a single ++ function pointer. ++ ++ The closure API must be implemented in order to get its functionality, ++ e.g. for use by gij. Routines are provided to emulate the raw API ++ if the underlying platform doesn't allow faster implementation. ++ ++ More details on the raw and closure API can be found in: ++ ++ http://gcc.gnu.org/ml/java/1999-q3/msg00138.html ++ ++ and ++ ++ http://gcc.gnu.org/ml/java/1999-q3/msg00174.html ++ -------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_H ++#define LIBFFI_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/* Specify which architecture libffi is configured for. */ ++#ifdef MACOSX ++# if defined(__i386__) || defined(__x86_64__) ++# define X86_DARWIN ++# elif defined(__ppc__) || defined(__ppc64__) ++# define POWERPC_DARWIN ++# else ++# error "Unsupported MacOS X CPU type" ++# endif ++#else ++#error "Unsupported OS type" ++#endif ++ ++/* ---- System configuration information --------------------------------- */ ++ ++#include "ffitarget.h" ++#include "fficonfig.h" ++ ++#ifndef LIBFFI_ASM ++ ++#include ++#include ++ ++/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). ++ But we can find it either under the correct ANSI name, or under GNU ++ C's internal name. */ ++#ifdef LONG_LONG_MAX ++# define FFI_LONG_LONG_MAX LONG_LONG_MAX ++#else ++# ifdef LLONG_MAX ++# define FFI_LONG_LONG_MAX LLONG_MAX ++# else ++# ifdef __GNUC__ ++# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ ++# endif ++# endif ++#endif ++ ++#if SCHAR_MAX == 127 ++# define ffi_type_uchar ffi_type_uint8 ++# define ffi_type_schar ffi_type_sint8 ++#else ++#error "char size not supported" ++#endif ++ ++#if SHRT_MAX == 32767 ++# define ffi_type_ushort ffi_type_uint16 ++# define ffi_type_sshort ffi_type_sint16 ++#elif SHRT_MAX == 2147483647 ++# define ffi_type_ushort ffi_type_uint32 ++# define ffi_type_sshort ffi_type_sint32 ++#else ++#error "short size not supported" ++#endif ++ ++#if INT_MAX == 32767 ++# define ffi_type_uint ffi_type_uint16 ++# define ffi_type_sint ffi_type_sint16 ++#elif INT_MAX == 2147483647 ++# define ffi_type_uint ffi_type_uint32 ++# define ffi_type_sint ffi_type_sint32 ++#elif INT_MAX == 9223372036854775807 ++# define ffi_type_uint ffi_type_uint64 ++# define ffi_type_sint ffi_type_sint64 ++#else ++#error "int size not supported" ++#endif ++ ++#define ffi_type_ulong ffi_type_uint64 ++#define ffi_type_slong ffi_type_sint64 ++ ++#if LONG_MAX == 2147483647 ++# if FFI_LONG_LONG_MAX != 9223372036854775807 ++# error "no 64-bit data type supported" ++# endif ++#elif LONG_MAX != 9223372036854775807 ++#error "long size not supported" ++#endif ++ ++/* The closure code assumes that this works on pointers, i.e. a size_t ++ can hold a pointer. */ ++ ++typedef struct _ffi_type { ++ size_t size; ++ unsigned short alignment; ++ unsigned short type; ++/*@null@*/ struct _ffi_type** elements; ++} ffi_type; ++ ++/* These are defined in types.c */ ++extern ffi_type ffi_type_void; ++extern ffi_type ffi_type_uint8; ++extern ffi_type ffi_type_sint8; ++extern ffi_type ffi_type_uint16; ++extern ffi_type ffi_type_sint16; ++extern ffi_type ffi_type_uint32; ++extern ffi_type ffi_type_sint32; ++extern ffi_type ffi_type_uint64; ++extern ffi_type ffi_type_sint64; ++extern ffi_type ffi_type_float; ++extern ffi_type ffi_type_double; ++extern ffi_type ffi_type_longdouble; ++extern ffi_type ffi_type_pointer; ++ ++typedef enum ffi_status { ++ FFI_OK = 0, ++ FFI_BAD_TYPEDEF, ++ FFI_BAD_ABI ++} ffi_status; ++ ++typedef unsigned FFI_TYPE; ++ ++typedef struct ffi_cif { ++ ffi_abi abi; ++ unsigned nargs; ++/*@dependent@*/ ffi_type** arg_types; ++/*@dependent@*/ ffi_type* rtype; ++ unsigned bytes; ++ unsigned flags; ++#ifdef FFI_EXTRA_CIF_FIELDS ++ FFI_EXTRA_CIF_FIELDS; ++#endif ++} ffi_cif; ++ ++/* ---- Definitions for the raw API -------------------------------------- */ ++ ++#ifndef FFI_SIZEOF_ARG ++# if LONG_MAX == 2147483647 ++# define FFI_SIZEOF_ARG 4 ++# elif LONG_MAX == 9223372036854775807 ++# define FFI_SIZEOF_ARG 8 ++# endif ++#endif ++ ++typedef union { ++ ffi_sarg sint; ++ ffi_arg uint; ++ float flt; ++ char data[FFI_SIZEOF_ARG]; ++ void* ptr; ++} ffi_raw; ++ ++void ++ffi_raw_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ ffi_raw* avalue); ++ ++void ++ffi_ptrarray_to_raw( ++ ffi_cif* cif, ++ void** args, ++ ffi_raw* raw); ++ ++void ++ffi_raw_to_ptrarray( ++ ffi_cif* cif, ++ ffi_raw* raw, ++ void** args); ++ ++size_t ++ffi_raw_size( ++ ffi_cif* cif); ++ ++/* This is analogous to the raw API, except it uses Java parameter ++ packing, even on 64-bit machines. I.e. on 64-bit machines ++ longs and doubles are followed by an empty 64-bit word. */ ++void ++ffi_java_raw_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ ffi_raw* avalue); ++ ++void ++ffi_java_ptrarray_to_raw( ++ ffi_cif* cif, ++ void** args, ++ ffi_raw* raw); ++ ++void ++ffi_java_raw_to_ptrarray( ++ ffi_cif* cif, ++ ffi_raw* raw, ++ void** args); ++ ++size_t ++ffi_java_raw_size( ++ ffi_cif* cif); ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#if FFI_CLOSURES ++ ++typedef struct ffi_closure { ++ char tramp[FFI_TRAMPOLINE_SIZE]; ++ ffi_cif* cif; ++ void (*fun)(ffi_cif*,void*,void**,void*); ++ void* user_data; ++} ffi_closure; ++ ++ffi_status ++ffi_prep_closure( ++ ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,void**,void*), ++ void* user_data); ++ ++void ffi_closure_free(void *); ++void *ffi_closure_alloc (size_t size, void **code); ++ ++typedef struct ffi_raw_closure { ++ char tramp[FFI_TRAMPOLINE_SIZE]; ++ ffi_cif* cif; ++ ++#if !FFI_NATIVE_RAW_API ++ /* if this is enabled, then a raw closure has the same layout ++ as a regular closure. We use this to install an intermediate ++ handler to do the transaltion, void** -> ffi_raw*. */ ++ void (*translate_args)(ffi_cif*,void*,void**,void*); ++ void* this_closure; ++#endif ++ ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*); ++ void* user_data; ++} ffi_raw_closure; ++ ++ffi_status ++ffi_prep_raw_closure( ++ ffi_raw_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), ++ void* user_data); ++ ++ffi_status ++ffi_prep_java_raw_closure( ++ ffi_raw_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), ++ void* user_data); ++ ++#endif // FFI_CLOSURES ++ ++/* ---- Public interface definition -------------------------------------- */ ++ ++ffi_status ++ffi_prep_cif( ++/*@out@*/ /*@partial@*/ ffi_cif* cif, ++ ffi_abi abi, ++ unsigned int nargs, ++/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, ++/*@dependent@*/ ffi_type** atypes); ++ ++void ++ffi_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ void** avalue); ++ ++/* Useful for eliminating compiler warnings */ ++#define FFI_FN(f) ((void (*)(void))f) ++ ++#endif // #ifndef LIBFFI_ASM ++/* ---- Definitions shared with assembly code ---------------------------- */ ++ ++/* If these change, update src/mips/ffitarget.h. */ ++#define FFI_TYPE_VOID 0 ++#define FFI_TYPE_INT 1 ++#define FFI_TYPE_FLOAT 2 ++#define FFI_TYPE_DOUBLE 3 ++ ++#ifdef HAVE_LONG_DOUBLE ++# define FFI_TYPE_LONGDOUBLE 4 ++#else ++# define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE ++#endif ++ ++#define FFI_TYPE_UINT8 5 ++#define FFI_TYPE_SINT8 6 ++#define FFI_TYPE_UINT16 7 ++#define FFI_TYPE_SINT16 8 ++#define FFI_TYPE_UINT32 9 ++#define FFI_TYPE_SINT32 10 ++#define FFI_TYPE_UINT64 11 ++#define FFI_TYPE_SINT64 12 ++#define FFI_TYPE_STRUCT 13 ++#define FFI_TYPE_POINTER 14 ++ ++/* This should always refer to the last type code (for sanity checks) */ ++#define FFI_TYPE_LAST FFI_TYPE_POINTER ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif // #ifndef LIBFFI_H +diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi_common.h ./Modules/_ctypes/libffi_osx/include/ffi_common.h +new file mode 100644 +index 0000000..685a358 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ffi_common.h +@@ -0,0 +1,102 @@ ++/* ----------------------------------------------------------------------- ++ ffi_common.h - Copyright (c) 1996 Red Hat, Inc. ++ ++ Common internal definitions and macros. Only necessary for building ++ libffi. ++ ----------------------------------------------------------------------- */ ++ ++#ifndef FFI_COMMON_H ++#define FFI_COMMON_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include "fficonfig.h" ++ ++/* Do not move this. Some versions of AIX are very picky about where ++ this is positioned. */ ++#ifdef __GNUC__ ++# define alloca __builtin_alloca ++#else ++# if HAVE_ALLOCA_H ++# include ++# else ++# ifdef _AIX ++# pragma alloca ++# else ++# ifndef alloca /* predefined by HP cc +Olibcalls */ ++char* alloca(); ++# endif ++# endif ++# endif ++#endif ++ ++/* Check for the existence of memcpy. */ ++#if STDC_HEADERS ++# include ++#else ++# ifndef HAVE_MEMCPY ++# define memcpy(d, s, n) bcopy((s), (d), (n)) ++# endif ++#endif ++ ++/*#if defined(FFI_DEBUG) ++#include ++#endif*/ ++ ++#ifdef FFI_DEBUG ++#include ++ ++/*@exits@*/ void ++ffi_assert( ++/*@temp@*/ char* expr, ++/*@temp@*/ char* file, ++ int line); ++void ++ffi_stop_here(void); ++void ++ffi_type_test( ++/*@temp@*/ /*@out@*/ ffi_type* a, ++/*@temp@*/ char* file, ++ int line); ++ ++# define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) ++# define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) ++# define FFI_ASSERT_VALID_TYPE(x) ffi_type_test(x, __FILE__, __LINE__) ++#else ++# define FFI_ASSERT(x) ++# define FFI_ASSERT_AT(x, f, l) ++# define FFI_ASSERT_VALID_TYPE(x) ++#endif // #ifdef FFI_DEBUG ++ ++#define ALIGN(v, a) (((size_t)(v) + (a) - 1) & ~((a) - 1)) ++ ++/* Perform machine dependent cif processing */ ++ffi_status ++ffi_prep_cif_machdep( ++ ffi_cif* cif); ++ ++/* Extended cif, used in callback from assembly routine */ ++typedef struct extended_cif { ++/*@dependent@*/ ffi_cif* cif; ++/*@dependent@*/ void* rvalue; ++/*@dependent@*/ void** avalue; ++} extended_cif; ++ ++/* Terse sized type definitions. */ ++typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); ++typedef signed int SINT8 __attribute__((__mode__(__QI__))); ++typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); ++typedef signed int SINT16 __attribute__((__mode__(__HI__))); ++typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); ++typedef signed int SINT32 __attribute__((__mode__(__SI__))); ++typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); ++typedef signed int SINT64 __attribute__((__mode__(__DI__))); ++typedef float FLOAT32; ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif // #ifndef FFI_COMMON_H +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/fficonfig.h ./Modules/_ctypes/libffi_osx/include/fficonfig.h +new file mode 100644 +index 0000000..2172490 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/fficonfig.h +@@ -0,0 +1,150 @@ ++/* Manually created fficonfig.h for Darwin on PowerPC or Intel ++ ++ This file is manually generated to do away with the need for autoconf and ++ therefore make it easier to cross-compile and build fat binaries. ++ ++ NOTE: This file was added by PyObjC. ++*/ ++ ++#ifndef MACOSX ++#error "This file is only supported on Mac OS X" ++#endif ++ ++#if defined(__i386__) ++# define BYTEORDER 1234 ++# undef HOST_WORDS_BIG_ENDIAN ++# undef WORDS_BIGENDIAN ++# define SIZEOF_DOUBLE 8 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++ ++#elif defined(__x86_64__) ++# define BYTEORDER 1234 ++# undef HOST_WORDS_BIG_ENDIAN ++# undef WORDS_BIGENDIAN ++# define SIZEOF_DOUBLE 8 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++ ++#elif defined(__ppc__) ++# define BYTEORDER 4321 ++# define HOST_WORDS_BIG_ENDIAN 1 ++# define WORDS_BIGENDIAN 1 ++# define SIZEOF_DOUBLE 8 ++# if __GNUC__ >= 4 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++# else ++# undef HAVE_LONG_DOUBLE ++# define SIZEOF_LONG_DOUBLE 8 ++# endif ++ ++#elif defined(__ppc64__) ++# define BYTEORDER 4321 ++# define HOST_WORDS_BIG_ENDIAN 1 ++# define WORDS_BIGENDIAN 1 ++# define SIZEOF_DOUBLE 8 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++ ++#else ++#error "Unknown CPU type" ++#endif ++ ++/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP ++ systems. This function is required for `alloca.c' support on those systems. */ ++#undef CRAY_STACKSEG_END ++ ++/* Define to 1 if using `alloca.c'. */ ++/* #undef C_ALLOCA */ ++ ++/* Define to the flags needed for the .section .eh_frame directive. */ ++#define EH_FRAME_FLAGS "aw" ++ ++/* Define this if you want extra debugging. */ ++/* #undef FFI_DEBUG */ ++ ++/* Define this is you do not want support for the raw API. */ ++#define FFI_NO_RAW_API 1 ++ ++/* Define this if you do not want support for aggregate types. */ ++/* #undef FFI_NO_STRUCTS */ ++ ++/* Define to 1 if you have `alloca', as a function or macro. */ ++#define HAVE_ALLOCA 1 ++ ++/* Define to 1 if you have and it should be used (not on Ultrix). */ ++#define HAVE_ALLOCA_H 1 ++ ++/* Define if your assembler supports .register. */ ++/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ ++ ++/* Define if your assembler and linker support unaligned PC relative relocs. */ ++/* #undef HAVE_AS_SPARC_UA_PCREL */ ++ ++/* Define to 1 if you have the `memcpy' function. */ ++#define HAVE_MEMCPY 1 ++ ++/* Define if mmap with MAP_ANON(YMOUS) works. */ ++#define HAVE_MMAP_ANON 1 ++ ++/* Define if mmap of /dev/zero works. */ ++/* #undef HAVE_MMAP_DEV_ZERO */ ++ ++/* Define if read-only mmap of a plain file works. */ ++#define HAVE_MMAP_FILE 1 ++ ++/* Define if .eh_frame sections should be read-only. */ ++/* #undef HAVE_RO_EH_FRAME */ ++ ++/* Define to 1 if your C compiler doesn't accept -c and -o together. */ ++/* #undef NO_MINUS_C_MINUS_O */ ++ ++/* Name of package */ ++#define PACKAGE "libffi" ++ ++/* Define to the address where bug reports for this package should be sent. */ ++#define PACKAGE_BUGREPORT "http://gcc.gnu.org/bugs.html" ++ ++/* Define to the full name of this package. */ ++#define PACKAGE_NAME "libffi" ++ ++/* Define to the full name and version of this package. */ ++#define PACKAGE_STRING "libffi 2.1" ++ ++/* Define to the one symbol short name of this package. */ ++#define PACKAGE_TARNAME "libffi" ++ ++/* Define to the version of this package. */ ++#define PACKAGE_VERSION "2.1" ++ ++/* If using the C implementation of alloca, define if you know the ++ direction of stack growth for your system; otherwise it will be ++ automatically deduced at run-time. ++ STACK_DIRECTION > 0 => grows toward higher addresses ++ STACK_DIRECTION < 0 => grows toward lower addresses ++ STACK_DIRECTION = 0 => direction of growth unknown */ ++/* #undef STACK_DIRECTION */ ++ ++/* Define to 1 if you have the ANSI C header files. */ ++#define STDC_HEADERS 1 ++ ++/* Define this if you are using Purify and want to suppress spurious messages. */ ++/* #undef USING_PURIFY */ ++ ++/* Version number of package */ ++#define VERSION "2.1-pyobjc" ++ ++#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE ++# ifdef LIBFFI_ASM ++# define FFI_HIDDEN(name) .hidden name ++# else ++# define FFI_HIDDEN __attribute__((visibility ("hidden"))) ++# endif ++#else ++# ifdef LIBFFI_ASM ++# define FFI_HIDDEN(name) ++# else ++# define FFI_HIDDEN ++# endif ++#endif +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/ffitarget.h ./Modules/_ctypes/libffi_osx/include/ffitarget.h +new file mode 100644 +index 0000000..faaa30d +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ffitarget.h +@@ -0,0 +1,13 @@ ++/* Dispatch to the right ffitarget file. This file is PyObjC specific; in a ++ normal build, the build environment copies the file to the right location or ++ sets up the right include flags. We want to do neither because that would ++ make building fat binaries harder. ++*/ ++ ++#if defined(__i386__) || defined(__x86_64__) ++#include "x86-ffitarget.h" ++#elif defined(__ppc__) || defined(__ppc64__) ++#include "ppc-ffitarget.h" ++#else ++#error "Unsupported CPU type" ++#endif +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h +new file mode 100644 +index 0000000..2318421 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h +@@ -0,0 +1,104 @@ ++/* -----------------------------------------------------------------*-C-*- ++ ppc-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ Target configuration macros for PowerPC. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++/* ---- System specific configurations ----------------------------------- */ ++ ++#if (defined(POWERPC) && defined(__powerpc64__)) || \ ++ (defined(POWERPC_DARWIN) && defined(__ppc64__)) ++#define POWERPC64 ++#endif ++ ++#ifndef LIBFFI_ASM ++ ++typedef unsigned long ffi_arg; ++typedef signed long ffi_sarg; ++ ++typedef enum ffi_abi { ++ FFI_FIRST_ABI = 0, ++ ++#ifdef POWERPC ++ FFI_SYSV, ++ FFI_GCC_SYSV, ++ FFI_LINUX64, ++# ifdef POWERPC64 ++ FFI_DEFAULT_ABI = FFI_LINUX64, ++# else ++ FFI_DEFAULT_ABI = FFI_GCC_SYSV, ++# endif ++#endif ++ ++#ifdef POWERPC_AIX ++ FFI_AIX, ++ FFI_DARWIN, ++ FFI_DEFAULT_ABI = FFI_AIX, ++#endif ++ ++#ifdef POWERPC_DARWIN ++ FFI_AIX, ++ FFI_DARWIN, ++ FFI_DEFAULT_ABI = FFI_DARWIN, ++#endif ++ ++#ifdef POWERPC_FREEBSD ++ FFI_SYSV, ++ FFI_GCC_SYSV, ++ FFI_LINUX64, ++ FFI_DEFAULT_ABI = FFI_SYSV, ++#endif ++ ++ FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 ++} ffi_abi; ++ ++#endif // #ifndef LIBFFI_ASM ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#define FFI_CLOSURES 1 ++#define FFI_NATIVE_RAW_API 0 ++ ++/* Needed for FFI_SYSV small structure returns. */ ++#define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST) ++ ++#if defined(POWERPC64) /*|| defined(POWERPC_AIX)*/ ++# define FFI_TRAMPOLINE_SIZE 48 ++#elif defined(POWERPC_AIX) ++# define FFI_TRAMPOLINE_SIZE 24 ++#else ++# define FFI_TRAMPOLINE_SIZE 40 ++#endif ++ ++#ifndef LIBFFI_ASM ++# if defined(POWERPC_DARWIN) || defined(POWERPC_AIX) ++typedef struct ffi_aix_trampoline_struct { ++ void* code_pointer; /* Pointer to ffi_closure_ASM */ ++ void* toc; /* TOC */ ++ void* static_chain; /* Pointer to closure */ ++} ffi_aix_trampoline_struct; ++# endif ++#endif // #ifndef LIBFFI_ASM ++ ++#endif // #ifndef LIBFFI_TARGET_H +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h +new file mode 100644 +index 0000000..55c2b6c +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h +@@ -0,0 +1,88 @@ ++/* -----------------------------------------------------------------*-C-*- ++ x86-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ Target configuration macros for x86 and x86-64. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ++ ----------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++/* ---- System specific configurations ----------------------------------- */ ++ ++#if defined(X86_64) && defined(__i386__) ++# undef X86_64 ++# define X86 ++#endif ++ ++#if defined(__x86_64__) ++# ifndef X86_64 ++# define X86_64 ++# endif ++#endif ++ ++/* ---- Generic type definitions ----------------------------------------- */ ++ ++#ifndef LIBFFI_ASM ++ ++typedef unsigned long ffi_arg; ++typedef signed long ffi_sarg; ++ ++typedef enum ffi_abi { ++ FFI_FIRST_ABI = 0, ++ ++ /* ---- Intel x86 Win32 ---------- */ ++#ifdef X86_WIN32 ++ FFI_SYSV, ++ FFI_STDCALL, ++ /* TODO: Add fastcall support for the sake of completeness */ ++ FFI_DEFAULT_ABI = FFI_SYSV, ++#endif ++ ++ /* ---- Intel x86 and AMD x86-64 - */ ++#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__)) ++ FFI_SYSV, ++ FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ ++# ifdef __i386__ ++ FFI_DEFAULT_ABI = FFI_SYSV, ++# else ++ FFI_DEFAULT_ABI = FFI_UNIX64, ++# endif ++#endif ++ ++ FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 ++} ffi_abi; ++ ++#endif // #ifndef LIBFFI_ASM ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#define FFI_CLOSURES 1 ++ ++#if defined(X86_64) || (defined(__x86_64__) && defined(X86_DARWIN)) ++# define FFI_TRAMPOLINE_SIZE 24 ++# define FFI_NATIVE_RAW_API 0 ++#else ++# define FFI_TRAMPOLINE_SIZE 10 ++# define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ ++#endif ++ ++#endif // #ifndef LIBFFI_TARGET_H +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S +new file mode 100644 +index 0000000..f143dbd +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S +@@ -0,0 +1,365 @@ ++#if defined(__ppc__) || defined(__ppc64__) ++ ++/* ----------------------------------------------------------------------- ++ ppc-darwin.S - Copyright (c) 2000 John Hornkvist ++ Copyright (c) 2004 Free Software Foundation, Inc. ++ ++ PowerPC Assembly glue. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++ ++#include ++#include ++#include ++#include ++ ++.text ++ .align 2 ++.globl _ffi_prep_args ++ ++.text ++ .align 2 ++.globl _ffi_call_DARWIN ++ ++.text ++ .align 2 ++_ffi_call_DARWIN: ++LFB0: ++ mr r12,r8 /* We only need r12 until the call, ++ so it doesn't have to be saved. */ ++ ++LFB1: ++ /* Save the old stack pointer as AP. */ ++ mr r8,r1 ++ ++LCFI0: ++#if defined(__ppc64__) ++ /* Allocate the stack space we need. ++ r4 (size of input data) ++ 48 bytes (linkage area) ++ 40 bytes (saved registers) ++ 8 bytes (extra FPR) ++ r4 + 96 bytes total ++ */ ++ ++ addi r4,r4,-96 // Add our overhead. ++ li r0,-32 // Align to 32 bytes. ++ and r4,r4,r0 ++#endif ++ stgux r1,r1,r4 // Grow the stack. ++ mflr r9 ++ ++ /* Save registers we use. */ ++#if defined(__ppc64__) ++ std r27,-40(r8) ++#endif ++ stg r28,MODE_CHOICE(-16,-32)(r8) ++ stg r29,MODE_CHOICE(-12,-24)(r8) ++ stg r30,MODE_CHOICE(-8,-16)(r8) ++ stg r31,MODE_CHOICE(-4,-8)(r8) ++ stg r9,SF_RETURN(r8) /* return address */ ++#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ ++ stg r2,MODE_CHOICE(20,40)(r1) ++#endif ++ ++LCFI1: ++#if defined(__ppc64__) ++ mr r27,r3 // our extended_cif ++#endif ++ /* Save arguments over call. */ ++ mr r31,r5 /* flags, */ ++ mr r30,r6 /* rvalue, */ ++ mr r29,r7 /* function address, */ ++ mr r28,r8 /* our AP. */ ++ ++LCFI2: ++ /* Call ffi_prep_args. */ ++ mr r4,r1 ++ li r9,0 ++ mtctr r12 /* r12 holds address of _ffi_prep_args. */ ++ bctrl ++#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ ++ lg r2,MODE_CHOICE(20,40)(r1) ++#endif ++ ++ /* Now do the call. ++ Set up cr1 with bits 4-7 of the flags. */ ++ mtcrf 0x40,r31 ++ ++ /* Load all those argument registers. ++ We have set up a nice stack frame, just load it into registers. */ ++ lg r3,SF_ARG1(r1) ++ lg r4,SF_ARG2(r1) ++ lg r5,SF_ARG3(r1) ++ lg r6,SF_ARG4(r1) ++ nop ++ lg r7,SF_ARG5(r1) ++ lg r8,SF_ARG6(r1) ++ lg r9,SF_ARG7(r1) ++ lg r10,SF_ARG8(r1) ++ ++ /* Load all the FP registers. */ ++ bf 6,L2 /* No floats to load. */ ++#if defined(__ppc64__) ++ lfd f1,MODE_CHOICE(-16,-40)-(14*8)(r28) ++ lfd f2,MODE_CHOICE(-16,-40)-(13*8)(r28) ++ lfd f3,MODE_CHOICE(-16,-40)-(12*8)(r28) ++ lfd f4,MODE_CHOICE(-16,-40)-(11*8)(r28) ++ nop ++ lfd f5,MODE_CHOICE(-16,-40)-(10*8)(r28) ++ lfd f6,MODE_CHOICE(-16,-40)-(9*8)(r28) ++ lfd f7,MODE_CHOICE(-16,-40)-(8*8)(r28) ++ lfd f8,MODE_CHOICE(-16,-40)-(7*8)(r28) ++ nop ++ lfd f9,MODE_CHOICE(-16,-40)-(6*8)(r28) ++ lfd f10,MODE_CHOICE(-16,-40)-(5*8)(r28) ++ lfd f11,MODE_CHOICE(-16,-40)-(4*8)(r28) ++ lfd f12,MODE_CHOICE(-16,-40)-(3*8)(r28) ++ nop ++ lfd f13,MODE_CHOICE(-16,-40)-(2*8)(r28) ++ lfd f14,MODE_CHOICE(-16,-40)-(1*8)(r28) ++#elif defined(__ppc__) ++ lfd f1,MODE_CHOICE(-16,-40)-(13*8)(r28) ++ lfd f2,MODE_CHOICE(-16,-40)-(12*8)(r28) ++ lfd f3,MODE_CHOICE(-16,-40)-(11*8)(r28) ++ lfd f4,MODE_CHOICE(-16,-40)-(10*8)(r28) ++ nop ++ lfd f5,MODE_CHOICE(-16,-40)-(9*8)(r28) ++ lfd f6,MODE_CHOICE(-16,-40)-(8*8)(r28) ++ lfd f7,MODE_CHOICE(-16,-40)-(7*8)(r28) ++ lfd f8,MODE_CHOICE(-16,-40)-(6*8)(r28) ++ nop ++ lfd f9,MODE_CHOICE(-16,-40)-(5*8)(r28) ++ lfd f10,MODE_CHOICE(-16,-40)-(4*8)(r28) ++ lfd f11,MODE_CHOICE(-16,-40)-(3*8)(r28) ++ lfd f12,MODE_CHOICE(-16,-40)-(2*8)(r28) ++ nop ++ lfd f13,MODE_CHOICE(-16,-40)-(1*8)(r28) ++#else ++#error undefined architecture ++#endif ++ ++L2: ++ mr r12,r29 // Put the target address in r12 as specified. ++ mtctr r12 // Get the address to call into CTR. ++ nop ++ nop ++ bctrl // Make the call. ++ ++ // Deal with the return value. ++#if defined(__ppc64__) ++ mtcrf 0x3,r31 // flags in cr6 and cr7 ++ bt 27,L(st_return_value) ++#elif defined(__ppc__) ++ mtcrf 0x1,r31 // flags in cr7 ++#else ++#error undefined architecture ++#endif ++ ++ bt 30,L(done_return_value) ++ bt 29,L(fp_return_value) ++ stg r3,0(r30) ++#if defined(__ppc__) ++ bf 28,L(done_return_value) // Store the second long if necessary. ++ stg r4,4(r30) ++#endif ++ // Fall through ++ ++L(done_return_value): ++ lg r1,0(r1) // Restore stack pointer. ++ // Restore the registers we used. ++ lg r9,SF_RETURN(r1) // return address ++ lg r31,MODE_CHOICE(-4,-8)(r1) ++ mtlr r9 ++ lg r30,MODE_CHOICE(-8,-16)(r1) ++ lg r29,MODE_CHOICE(-12,-24)(r1) ++ lg r28,MODE_CHOICE(-16,-32)(r1) ++#if defined(__ppc64__) ++ ld r27,-40(r1) ++#endif ++ blr ++ ++#if defined(__ppc64__) ++L(st_return_value): ++ // Grow the stack enough to fit the registers. Leave room for 8 args ++ // to trample the 1st 8 slots in param area. ++ stgu r1,-SF_ROUND(280)(r1) // 64 + 104 + 48 + 64 ++ ++ // Store GPRs ++ std r3,SF_ARG9(r1) ++ std r4,SF_ARG10(r1) ++ std r5,SF_ARG11(r1) ++ std r6,SF_ARG12(r1) ++ nop ++ std r7,SF_ARG13(r1) ++ std r8,SF_ARG14(r1) ++ std r9,SF_ARG15(r1) ++ std r10,SF_ARG16(r1) ++ ++ // Store FPRs ++ nop ++ bf 26,L(call_struct_to_ram_form) ++ stfd f1,SF_ARG17(r1) ++ stfd f2,SF_ARG18(r1) ++ stfd f3,SF_ARG19(r1) ++ stfd f4,SF_ARG20(r1) ++ nop ++ stfd f5,SF_ARG21(r1) ++ stfd f6,SF_ARG22(r1) ++ stfd f7,SF_ARG23(r1) ++ stfd f8,SF_ARG24(r1) ++ nop ++ stfd f9,SF_ARG25(r1) ++ stfd f10,SF_ARG26(r1) ++ stfd f11,SF_ARG27(r1) ++ stfd f12,SF_ARG28(r1) ++ nop ++ stfd f13,SF_ARG29(r1) ++ ++L(call_struct_to_ram_form): ++ ld r3,0(r27) // extended_cif->cif* ++ ld r3,16(r3) // ffi_cif->rtype* ++ addi r4,r1,SF_ARG9 // stored GPRs ++ addi r6,r1,SF_ARG17 // stored FPRs ++ li r5,0 // GPR size ptr (NULL) ++ li r7,0 // FPR size ptr (NULL) ++ li r8,0 // FPR count ptr (NULL) ++ li r10,0 // struct offset (NULL) ++ mr r9,r30 // return area ++ bl Lffi64_struct_to_ram_form$stub ++ lg r1,0(r1) // Restore stack pointer. ++ b L(done_return_value) ++#endif ++ ++L(fp_return_value): ++ /* Do we have long double to store? */ ++ bf 31,L(fd_return_value) ++ stfd f1,0(r30) ++ stfd f2,8(r30) ++ b L(done_return_value) ++ ++L(fd_return_value): ++ /* Do we have double to store? */ ++ bf 28,L(float_return_value) ++ stfd f1,0(r30) ++ b L(done_return_value) ++ ++L(float_return_value): ++ /* We only have a float to store. */ ++ stfs f1,0(r30) ++ b L(done_return_value) ++ ++LFE1: ++/* END(_ffi_call_DARWIN) */ ++ ++/* Provide a null definition of _ffi_call_AIX. */ ++.text ++ .align 2 ++.globl _ffi_call_AIX ++.text ++ .align 2 ++_ffi_call_AIX: ++ blr ++/* END(_ffi_call_AIX) */ ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ; Length of Common Information Entry ++LSCIE1: ++ .long 0x0 ; CIE Identifier Tag ++ .byte 0x1 ; CIE Version ++ .ascii "zR\0" ; CIE Augmentation ++ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor ++ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte 0x41 ; CIE RA Column ++ .byte 0x1 ; uleb128 0x1; Augmentation size ++ .byte 0x10 ; FDE Encoding (pcrel) ++ .byte 0xc ; DW_CFA_def_cfa ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x0 ; uleb128 0x0 ++ .align LOG2_GPR_BYTES ++LECIE1: ++.globl _ffi_call_DARWIN.eh ++_ffi_call_DARWIN.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ; FDE Length ++ ++LASFDE1: ++ .long LASFDE1-EH_frame1 ; FDE CIE offset ++ .g_long LFB0-. ; FDE initial location ++ .set L$set$3,LFE1-LFB0 ++ .g_long L$set$3 ; FDE address range ++ .byte 0x0 ; uleb128 0x0; Augmentation size ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$4,LCFI0-LFB1 ++ .long L$set$4 ++ .byte 0xd ; DW_CFA_def_cfa_register ++ .byte 0x08 ; uleb128 0x08 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$5,LCFI1-LCFI0 ++ .long L$set$5 ++ .byte 0x11 ; DW_CFA_offset_extended_sf ++ .byte 0x41 ; uleb128 0x41 ++ .byte 0x7e ; sleb128 -2 ++ .byte 0x9f ; DW_CFA_offset, column 0x1f ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x9e ; DW_CFA_offset, column 0x1e ++ .byte 0x2 ; uleb128 0x2 ++ .byte 0x9d ; DW_CFA_offset, column 0x1d ++ .byte 0x3 ; uleb128 0x3 ++ .byte 0x9c ; DW_CFA_offset, column 0x1c ++ .byte 0x4 ; uleb128 0x4 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$6,LCFI2-LCFI1 ++ .long L$set$6 ++ .byte 0xd ; DW_CFA_def_cfa_register ++ .byte 0x1c ; uleb128 0x1c ++ .align LOG2_GPR_BYTES ++LEFDE1: ++ ++#if defined(__ppc64__) ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi64_struct_to_ram_form$stub: ++ .indirect_symbol _ffi64_struct_to_ram_form ++ mflr r0 ++ bcl 20,31,LO$ffi64_struct_to_ram_form ++ ++LO$ffi64_struct_to_ram_form: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form) ++ mtlr r0 ++ lgu r12,lo16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi64_struct_to_ram_form$lazy_ptr: ++ .indirect_symbol _ffi64_struct_to_ram_form ++ .g_long dyld_stub_binding_helper ++ ++#endif // __ppc64__ ++#endif // __ppc__ || __ppc64__ +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h +new file mode 100644 +index 0000000..cf4bd50 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h +@@ -0,0 +1,85 @@ ++/* ----------------------------------------------------------------------- ++ ppc-darwin.h - Copyright (c) 2002, 2003, 2004, Free Software Foundation, ++ Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define L(x) x ++ ++#define SF_ARG9 MODE_CHOICE(56,112) ++#define SF_ARG10 MODE_CHOICE(60,120) ++#define SF_ARG11 MODE_CHOICE(64,128) ++#define SF_ARG12 MODE_CHOICE(68,136) ++#define SF_ARG13 MODE_CHOICE(72,144) ++#define SF_ARG14 MODE_CHOICE(76,152) ++#define SF_ARG15 MODE_CHOICE(80,160) ++#define SF_ARG16 MODE_CHOICE(84,168) ++#define SF_ARG17 MODE_CHOICE(88,176) ++#define SF_ARG18 MODE_CHOICE(92,184) ++#define SF_ARG19 MODE_CHOICE(96,192) ++#define SF_ARG20 MODE_CHOICE(100,200) ++#define SF_ARG21 MODE_CHOICE(104,208) ++#define SF_ARG22 MODE_CHOICE(108,216) ++#define SF_ARG23 MODE_CHOICE(112,224) ++#define SF_ARG24 MODE_CHOICE(116,232) ++#define SF_ARG25 MODE_CHOICE(120,240) ++#define SF_ARG26 MODE_CHOICE(124,248) ++#define SF_ARG27 MODE_CHOICE(128,256) ++#define SF_ARG28 MODE_CHOICE(132,264) ++#define SF_ARG29 MODE_CHOICE(136,272) ++ ++#define ASM_NEEDS_REGISTERS 4 ++#define NUM_GPR_ARG_REGISTERS 8 ++#define NUM_FPR_ARG_REGISTERS 13 ++ ++#define FFI_TYPE_1_BYTE(x) ((x) == FFI_TYPE_UINT8 || (x) == FFI_TYPE_SINT8) ++#define FFI_TYPE_2_BYTE(x) ((x) == FFI_TYPE_UINT16 || (x) == FFI_TYPE_SINT16) ++#define FFI_TYPE_4_BYTE(x) \ ++ ((x) == FFI_TYPE_UINT32 || (x) == FFI_TYPE_SINT32 ||\ ++ (x) == FFI_TYPE_INT || (x) == FFI_TYPE_FLOAT) ++ ++#if !defined(LIBFFI_ASM) ++ ++enum { ++ FLAG_RETURNS_NOTHING = 1 << (31 - 30), // cr7 ++ FLAG_RETURNS_FP = 1 << (31 - 29), ++ FLAG_RETURNS_64BITS = 1 << (31 - 28), ++ FLAG_RETURNS_128BITS = 1 << (31 - 31), ++ ++ FLAG_RETURNS_STRUCT = 1 << (31 - 27), // cr6 ++ FLAG_STRUCT_CONTAINS_FP = 1 << (31 - 26), ++ ++ FLAG_ARG_NEEDS_COPY = 1 << (31 - 7), ++ FLAG_FP_ARGUMENTS = 1 << (31 - 6), // cr1.eq; specified by ABI ++ FLAG_4_GPR_ARGUMENTS = 1 << (31 - 5), ++ FLAG_RETVAL_REFERENCE = 1 << (31 - 4) ++}; ++ ++#if defined(__ppc64__) ++void ffi64_struct_to_ram_form(const ffi_type*, const char*, unsigned int*, ++ const char*, unsigned int*, unsigned int*, char*, unsigned int*); ++void ffi64_struct_to_reg_form(const ffi_type*, const char*, unsigned int*, ++ unsigned int*, char*, unsigned int*, char*, unsigned int*); ++bool ffi64_stret_needs_ptr(const ffi_type* inType, ++ unsigned short*, unsigned short*); ++#endif ++ ++#endif // !defined(LIBFFI_ASM) +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S +new file mode 100644 +index 0000000..c3d30c2 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S +@@ -0,0 +1,308 @@ ++#if defined(__ppc__) ++ ++/* ----------------------------------------------------------------------- ++ ppc-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, ++ Inc. based on ppc_closure.S ++ ++ PowerPC Assembly glue. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++ ++#include ++#include // for FFI_TRAMPOLINE_SIZE ++#include ++#include ++ ++ .file "ppc-darwin_closure.S" ++.text ++ .align LOG2_GPR_BYTES ++ .globl _ffi_closure_ASM ++ ++.text ++ .align LOG2_GPR_BYTES ++ ++_ffi_closure_ASM: ++LFB1: ++ mflr r0 // Save return address ++ stg r0,SF_RETURN(r1) ++ ++LCFI0: ++ /* 24/48 bytes (Linkage Area) ++ 32/64 bytes (outgoing parameter area, always reserved) ++ 104 bytes (13*8 from FPR) ++ 16/32 bytes (result) ++ 176/232 total bytes */ ++ ++ /* skip over caller save area and keep stack aligned to 16/32. */ ++ stgu r1,-SF_ROUND(176)(r1) ++ ++LCFI1: ++ /* We want to build up an area for the parameters passed ++ in registers. (both floating point and integer) */ ++ ++ /* 176/256 bytes (callee stack frame aligned to 16/32) ++ 24/48 bytes (caller linkage area) ++ 200/304 (start of caller parameter area aligned to 4/8) ++ */ ++ ++ /* Save GPRs 3 - 10 (aligned to 4/8) ++ in the parents outgoing area. */ ++ stg r3,200(r1) ++ stg r4,204(r1) ++ stg r5,208(r1) ++ stg r6,212(r1) ++ stg r7,216(r1) ++ stg r8,220(r1) ++ stg r9,224(r1) ++ stg r10,228(r1) ++ ++ /* Save FPRs 1 - 13. (aligned to 8) */ ++ stfd f1,56(r1) ++ stfd f2,64(r1) ++ stfd f3,72(r1) ++ stfd f4,80(r1) ++ stfd f5,88(r1) ++ stfd f6,96(r1) ++ stfd f7,104(r1) ++ stfd f8,112(r1) ++ stfd f9,120(r1) ++ stfd f10,128(r1) ++ stfd f11,136(r1) ++ stfd f12,144(r1) ++ stfd f13,152(r1) ++ ++ // Set up registers for the routine that actually does the work. ++ mr r3,r11 // context pointer from the trampoline ++ addi r4,r1,160 // result storage ++ addi r5,r1,200 // saved GPRs ++ addi r6,r1,56 // saved FPRs ++ bl Lffi_closure_helper_DARWIN$stub ++ ++ /* Now r3 contains the return type. Use it to look up in a table ++ so we know how to deal with each type. */ ++ addi r5,r1,160 // Copy result storage pointer. ++ bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. ++ mflr r4 // Move to r4. ++ slwi r3,r3,4 // Multiply return type by 16. ++ add r3,r3,r4 // Add contents of table to table address. ++ mtctr r3 ++ bctr ++ ++LFE1: ++/* Each of the ret_typeX code fragments has to be exactly 16 bytes long ++ (4 instructions). For cache effectiveness we align to a 16 byte boundary ++ first. */ ++ .align 4 ++ nop ++ nop ++ nop ++ ++Lget_ret_type0_addr: ++ blrl ++ ++/* case FFI_TYPE_VOID */ ++Lret_type0: ++ b Lfinish ++ nop ++ nop ++ nop ++ ++/* case FFI_TYPE_INT */ ++Lret_type1: ++ lwz r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_FLOAT */ ++Lret_type2: ++ lfs f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_DOUBLE */ ++Lret_type3: ++ lfd f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_LONGDOUBLE */ ++Lret_type4: ++ lfd f1,0(r5) ++ lfd f2,8(r5) ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_UINT8 */ ++Lret_type5: ++ lbz r3,3(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_SINT8 */ ++Lret_type6: ++ lbz r3,3(r5) ++ extsb r3,r3 ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_UINT16 */ ++Lret_type7: ++ lhz r3,2(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_SINT16 */ ++Lret_type8: ++ lha r3,2(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_UINT32 */ ++Lret_type9: // same as Lret_type1 ++ lwz r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_SINT32 */ ++Lret_type10: // same as Lret_type1 ++ lwz r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_UINT64 */ ++Lret_type11: ++ lwz r3,0(r5) ++ lwz r4,4(r5) ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_SINT64 */ ++Lret_type12: // same as Lret_type11 ++ lwz r3,0(r5) ++ lwz r4,4(r5) ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_STRUCT */ ++Lret_type13: ++ b Lfinish ++ nop ++ nop ++ nop ++ ++/* End 16-byte aligned cases */ ++/* case FFI_TYPE_POINTER */ ++// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types ++// are added in future, the following code will need to be updated and ++// padded to 16 bytes. ++Lret_type14: ++ lg r3,0(r5) ++ // fall through ++ ++/* case done */ ++Lfinish: ++ addi r1,r1,SF_ROUND(176) // Restore stack pointer. ++ lg r0,SF_RETURN(r1) // Restore return address. ++ mtlr r0 // Restore link register. ++ blr ++ ++/* END(ffi_closure_ASM) */ ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ; Length of Common Information Entry ++LSCIE1: ++ .long 0x0 ; CIE Identifier Tag ++ .byte 0x1 ; CIE Version ++ .ascii "zR\0" ; CIE Augmentation ++ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor ++ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte 0x41 ; CIE RA Column ++ .byte 0x1 ; uleb128 0x1; Augmentation size ++ .byte 0x10 ; FDE Encoding (pcrel) ++ .byte 0xc ; DW_CFA_def_cfa ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x0 ; uleb128 0x0 ++ .align LOG2_GPR_BYTES ++LECIE1: ++.globl _ffi_closure_ASM.eh ++_ffi_closure_ASM.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ; FDE Length ++ ++LASFDE1: ++ .long LASFDE1-EH_frame1 ; FDE CIE offset ++ .g_long LFB1-. ; FDE initial location ++ .set L$set$3,LFE1-LFB1 ++ .g_long L$set$3 ; FDE address range ++ .byte 0x0 ; uleb128 0x0; Augmentation size ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$3,LCFI1-LCFI0 ++ .long L$set$3 ++ .byte 0xe ; DW_CFA_def_cfa_offset ++ .byte 176,1 ; uleb128 176 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$4,LCFI0-LFB1 ++ .long L$set$4 ++ .byte 0x11 ; DW_CFA_offset_extended_sf ++ .byte 0x41 ; uleb128 0x41 ++ .byte 0x7e ; sleb128 -2 ++ .align LOG2_GPR_BYTES ++ ++LEFDE1: ++.data ++ .align LOG2_GPR_BYTES ++LDFCM0: ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi_closure_helper_DARWIN$stub: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ mflr r0 ++ bcl 20,31,LO$ffi_closure_helper_DARWIN ++ ++LO$ffi_closure_helper_DARWIN: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) ++ mtlr r0 ++ lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi_closure_helper_DARWIN$lazy_ptr: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ .g_long dyld_stub_binding_helper ++ ++ ++#endif // __ppc__ +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c +new file mode 100644 +index 0000000..8953d5f +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c +@@ -0,0 +1,1776 @@ ++#if defined(__ppc__) || defined(__ppc64__) ++ ++/* ----------------------------------------------------------------------- ++ ffi.c - Copyright (c) 1998 Geoffrey Keating ++ ++ PowerPC Foreign Function Interface ++ ++ Darwin ABI support (c) 2001 John Hornkvist ++ AIX ABI support (c) 2002 Free Software Foundation, Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#if 0 ++#if defined(POWERPC_DARWIN) ++#include // for sys_icache_invalidate() ++#endif ++ ++#else ++ ++#pragma weak sys_icache_invalidate ++extern void sys_icache_invalidate(void *start, size_t len); ++ ++#endif ++ ++ ++extern void ffi_closure_ASM(void); ++ ++// The layout of a function descriptor. A C function pointer really ++// points to one of these. ++typedef struct aix_fd_struct { ++ void* code_pointer; ++ void* toc; ++} aix_fd; ++ ++/* ffi_prep_args is called by the assembly routine once stack space ++ has been allocated for the function's arguments. ++ ++ The stack layout we want looks like this: ++ ++ | Return address from ffi_call_DARWIN | higher addresses ++ |--------------------------------------------| ++ | Previous backchain pointer 4/8 | stack pointer here ++ |--------------------------------------------|-\ <<< on entry to ++ | Saved r28-r31 (4/8)*4 | | ffi_call_DARWIN ++ |--------------------------------------------| | ++ | Parameters (at least 8*(4/8)=32/64) | | (176) +112 - +288 ++ |--------------------------------------------| | ++ | Space for GPR2 4/8 | | ++ |--------------------------------------------| | stack | ++ | Reserved (4/8)*2 | | grows | ++ |--------------------------------------------| | down V ++ | Space for callee's LR 4/8 | | ++ |--------------------------------------------| | lower addresses ++ | Saved CR 4/8 | | ++ |--------------------------------------------| | stack pointer here ++ | Current backchain pointer 4/8 | | during ++ |--------------------------------------------|-/ <<< ffi_call_DARWIN ++ ++ Note: ppc64 CR is saved in the low word of a long on the stack. ++*/ ++ ++/*@-exportheader@*/ ++void ++ffi_prep_args( ++ extended_cif* inEcif, ++ unsigned *const stack) ++/*@=exportheader@*/ ++{ ++ /* Copy the ecif to a local var so we can trample the arg. ++ BC note: test this with GP later for possible problems... */ ++ volatile extended_cif* ecif = inEcif; ++ ++ const unsigned bytes = ecif->cif->bytes; ++ const unsigned flags = ecif->cif->flags; ++ ++ /* Cast the stack arg from int* to long*. sizeof(long) == 4 in 32-bit mode ++ and 8 in 64-bit mode. */ ++ unsigned long *const longStack = (unsigned long *const)stack; ++ ++ /* 'stacktop' points at the previous backchain pointer. */ ++#if defined(__ppc64__) ++ // In ppc-darwin.s, an extra 96 bytes is reserved for the linkage area, ++ // saved registers, and an extra FPR. ++ unsigned long *const stacktop = ++ (unsigned long *)(unsigned long)((char*)longStack + bytes + 96); ++#elif defined(__ppc__) ++ unsigned long *const stacktop = longStack + (bytes / sizeof(long)); ++#else ++#error undefined architecture ++#endif ++ ++ /* 'fpr_base' points at the space for fpr1, and grows upwards as ++ we use FPR registers. */ ++ double* fpr_base = (double*)(stacktop - ASM_NEEDS_REGISTERS) - ++ NUM_FPR_ARG_REGISTERS; ++ ++#if defined(__ppc64__) ++ // 64-bit saves an extra register, and uses an extra FPR. Knock fpr_base ++ // down a couple pegs. ++ fpr_base -= 2; ++#endif ++ ++ unsigned int fparg_count = 0; ++ ++ /* 'next_arg' grows up as we put parameters in it. */ ++ unsigned long* next_arg = longStack + 6; /* 6 reserved positions. */ ++ ++ int i; ++ double double_tmp; ++ void** p_argv = ecif->avalue; ++ unsigned long gprvalue; ++ ffi_type** ptr = ecif->cif->arg_types; ++ ++ /* Check that everything starts aligned properly. */ ++ FFI_ASSERT(stack == SF_ROUND(stack)); ++ FFI_ASSERT(stacktop == SF_ROUND(stacktop)); ++ FFI_ASSERT(bytes == SF_ROUND(bytes)); ++ ++ /* Deal with return values that are actually pass-by-reference. ++ Rule: ++ Return values are referenced by r3, so r4 is the first parameter. */ ++ ++ if (flags & FLAG_RETVAL_REFERENCE) ++ *next_arg++ = (unsigned long)(char*)ecif->rvalue; ++ ++ /* Now for the arguments. */ ++ for (i = ecif->cif->nargs; i > 0; i--, ptr++, p_argv++) ++ { ++ switch ((*ptr)->type) ++ { ++ /* If a floating-point parameter appears before all of the general- ++ purpose registers are filled, the corresponding GPRs that match ++ the size of the floating-point parameter are shadowed for the ++ benefit of vararg and pre-ANSI functions. */ ++ case FFI_TYPE_FLOAT: ++ double_tmp = *(float*)*p_argv; ++ ++ if (fparg_count < NUM_FPR_ARG_REGISTERS) ++ *fpr_base++ = double_tmp; ++ ++ *(double*)next_arg = double_tmp; ++ ++ next_arg++; ++ fparg_count++; ++ FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); ++ ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ double_tmp = *(double*)*p_argv; ++ ++ if (fparg_count < NUM_FPR_ARG_REGISTERS) ++ *fpr_base++ = double_tmp; ++ ++ *(double*)next_arg = double_tmp; ++ ++ next_arg += MODE_CHOICE(2,1); ++ fparg_count++; ++ FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); ++ ++ break; ++ ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++#if defined(__ppc64__) ++ if (fparg_count < NUM_FPR_ARG_REGISTERS) ++ *(long double*)fpr_base = *(long double*)*p_argv; ++#elif defined(__ppc__) ++ if (fparg_count < NUM_FPR_ARG_REGISTERS - 1) ++ *(long double*)fpr_base = *(long double*)*p_argv; ++ else if (fparg_count == NUM_FPR_ARG_REGISTERS - 1) ++ *(double*)fpr_base = *(double*)*p_argv; ++#else ++#error undefined architecture ++#endif ++ ++ *(long double*)next_arg = *(long double*)*p_argv; ++ fparg_count += 2; ++ fpr_base += 2; ++ next_arg += MODE_CHOICE(4,2); ++ FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); ++ ++ break; ++#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++#if defined(__ppc64__) ++ gprvalue = *(long long*)*p_argv; ++ goto putgpr; ++#elif defined(__ppc__) ++ *(long long*)next_arg = *(long long*)*p_argv; ++ next_arg += 2; ++ break; ++#else ++#error undefined architecture ++#endif ++ ++ case FFI_TYPE_POINTER: ++ gprvalue = *(unsigned long*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_UINT8: ++ gprvalue = *(unsigned char*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_SINT8: ++ gprvalue = *(signed char*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_UINT16: ++ gprvalue = *(unsigned short*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_SINT16: ++ gprvalue = *(signed short*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_STRUCT: ++ { ++#if defined(__ppc64__) ++ unsigned int gprSize = 0; ++ unsigned int fprSize = 0; ++ ++ ffi64_struct_to_reg_form(*ptr, (char*)*p_argv, NULL, &fparg_count, ++ (char*)next_arg, &gprSize, (char*)fpr_base, &fprSize); ++ next_arg += gprSize / sizeof(long); ++ fpr_base += fprSize / sizeof(double); ++ ++#elif defined(__ppc__) ++ char* dest_cpy = (char*)next_arg; ++ ++ /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, ++ SI 4 bytes) are aligned as if they were those modes. ++ Structures with 3 byte in size are padded upwards. */ ++ unsigned size_al = (*ptr)->size; ++ ++ /* If the first member of the struct is a double, then align ++ the struct to double-word. */ ++ if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) ++ size_al = ALIGN((*ptr)->size, 8); ++ ++ if (ecif->cif->abi == FFI_DARWIN) ++ { ++ if (size_al < 3) ++ dest_cpy += 4 - size_al; ++ } ++ ++ memcpy((char*)dest_cpy, (char*)*p_argv, size_al); ++ next_arg += (size_al + 3) / 4; ++#else ++#error undefined architecture ++#endif ++ break; ++ } ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ gprvalue = *(unsigned*)*p_argv; ++ ++putgpr: ++ *next_arg++ = gprvalue; ++ break; ++ ++ default: ++ break; ++ } ++ } ++ ++ /* Check that we didn't overrun the stack... */ ++ //FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS); ++ //FFI_ASSERT((unsigned *)fpr_base ++ // <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); ++ //FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); ++} ++ ++#if defined(__ppc64__) ++ ++bool ++ffi64_struct_contains_fp( ++ const ffi_type* inType) ++{ ++ bool containsFP = false; ++ unsigned int i; ++ ++ for (i = 0; inType->elements[i] != NULL && !containsFP; i++) ++ { ++ if (inType->elements[i]->type == FFI_TYPE_FLOAT || ++ inType->elements[i]->type == FFI_TYPE_DOUBLE || ++ inType->elements[i]->type == FFI_TYPE_LONGDOUBLE) ++ containsFP = true; ++ else if (inType->elements[i]->type == FFI_TYPE_STRUCT) ++ containsFP = ffi64_struct_contains_fp(inType->elements[i]); ++ } ++ ++ return containsFP; ++} ++ ++#endif // defined(__ppc64__) ++ ++/* Perform machine dependent cif processing. */ ++ffi_status ++ffi_prep_cif_machdep( ++ ffi_cif* cif) ++{ ++ /* All this is for the DARWIN ABI. */ ++ int i; ++ ffi_type** ptr; ++ int intarg_count = 0; ++ int fparg_count = 0; ++ unsigned int flags = 0; ++ unsigned int size_al = 0; ++ ++ /* All the machine-independent calculation of cif->bytes will be wrong. ++ Redo the calculation for DARWIN. */ ++ ++ /* Space for the frame pointer, callee's LR, CR, etc, and for ++ the asm's temp regs. */ ++ unsigned int bytes = (6 + ASM_NEEDS_REGISTERS) * sizeof(long); ++ ++ /* Return value handling. The rules are as follows: ++ - 32-bit (or less) integer values are returned in gpr3; ++ - Structures of size <= 4 bytes also returned in gpr3; ++ - 64-bit integer values and structures between 5 and 8 bytes are ++ returned in gpr3 and gpr4; ++ - Single/double FP values are returned in fpr1; ++ - Long double FP (if not equivalent to double) values are returned in ++ fpr1 and fpr2; ++ - Larger structures values are allocated space and a pointer is passed ++ as the first argument. */ ++ switch (cif->rtype->type) ++ { ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ flags |= FLAG_RETURNS_128BITS; ++ flags |= FLAG_RETURNS_FP; ++ break; ++#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_DOUBLE: ++ flags |= FLAG_RETURNS_64BITS; ++ /* Fall through. */ ++ case FFI_TYPE_FLOAT: ++ flags |= FLAG_RETURNS_FP; ++ break; ++ ++#if defined(__ppc64__) ++ case FFI_TYPE_POINTER: ++#endif ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ flags |= FLAG_RETURNS_64BITS; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ { ++#if defined(__ppc64__) ++ ++ if (ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) ++ { ++ flags |= FLAG_RETVAL_REFERENCE; ++ flags |= FLAG_RETURNS_NOTHING; ++ intarg_count++; ++ } ++ else ++ { ++ flags |= FLAG_RETURNS_STRUCT; ++ ++ if (ffi64_struct_contains_fp(cif->rtype)) ++ flags |= FLAG_STRUCT_CONTAINS_FP; ++ } ++ ++#elif defined(__ppc__) ++ ++ flags |= FLAG_RETVAL_REFERENCE; ++ flags |= FLAG_RETURNS_NOTHING; ++ intarg_count++; ++ ++#else ++#error undefined architecture ++#endif ++ break; ++ } ++ ++ case FFI_TYPE_VOID: ++ flags |= FLAG_RETURNS_NOTHING; ++ break; ++ ++ default: ++ /* Returns 32-bit integer, or similar. Nothing to do here. */ ++ break; ++ } ++ ++ /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the ++ first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest ++ goes on the stack. Structures are passed as a pointer to a copy of ++ the structure. Stuff on the stack needs to keep proper alignment. */ ++ for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) ++ { ++ switch ((*ptr)->type) ++ { ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ fparg_count++; ++ /* If this FP arg is going on the stack, it must be ++ 8-byte-aligned. */ ++ if (fparg_count > NUM_FPR_ARG_REGISTERS ++ && intarg_count % 2 != 0) ++ intarg_count++; ++ break; ++ ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ fparg_count += 2; ++ /* If this FP arg is going on the stack, it must be ++ 8-byte-aligned. */ ++ ++ if ( ++#if defined(__ppc64__) ++ fparg_count > NUM_FPR_ARG_REGISTERS + 1 ++#elif defined(__ppc__) ++ fparg_count > NUM_FPR_ARG_REGISTERS ++#else ++#error undefined architecture ++#endif ++ && intarg_count % 2 != 0) ++ intarg_count++; ++ ++ intarg_count += 2; ++ break; ++#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ /* 'long long' arguments are passed as two words, but ++ either both words must fit in registers or both go ++ on the stack. If they go on the stack, they must ++ be 8-byte-aligned. */ ++ if (intarg_count == NUM_GPR_ARG_REGISTERS - 1 ++ || (intarg_count >= NUM_GPR_ARG_REGISTERS ++ && intarg_count % 2 != 0)) ++ intarg_count++; ++ ++ intarg_count += MODE_CHOICE(2,1); ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ size_al = (*ptr)->size; ++ /* If the first member of the struct is a double, then align ++ the struct to double-word. */ ++ if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) ++ size_al = ALIGN((*ptr)->size, 8); ++ ++#if defined(__ppc64__) ++ // Look for FP struct members. ++ unsigned int j; ++ ++ for (j = 0; (*ptr)->elements[j] != NULL; j++) ++ { ++ if ((*ptr)->elements[j]->type == FFI_TYPE_FLOAT || ++ (*ptr)->elements[j]->type == FFI_TYPE_DOUBLE) ++ { ++ fparg_count++; ++ ++ if (fparg_count > NUM_FPR_ARG_REGISTERS) ++ intarg_count++; ++ } ++ else if ((*ptr)->elements[j]->type == FFI_TYPE_LONGDOUBLE) ++ { ++ fparg_count += 2; ++ ++ if (fparg_count > NUM_FPR_ARG_REGISTERS + 1) ++ intarg_count += 2; ++ } ++ else ++ intarg_count++; ++ } ++#elif defined(__ppc__) ++ intarg_count += (size_al + 3) / 4; ++#else ++#error undefined architecture ++#endif ++ ++ break; ++ ++ default: ++ /* Everything else is passed as a 4/8-byte word in a GPR, either ++ the object itself or a pointer to it. */ ++ intarg_count++; ++ break; ++ } ++ } ++ ++ /* Space for the FPR registers, if needed. */ ++ if (fparg_count != 0) ++ { ++ flags |= FLAG_FP_ARGUMENTS; ++#if defined(__ppc64__) ++ bytes += (NUM_FPR_ARG_REGISTERS + 1) * sizeof(double); ++#elif defined(__ppc__) ++ bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); ++#else ++#error undefined architecture ++#endif ++ } ++ ++ /* Stack space. */ ++#if defined(__ppc64__) ++ if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS) ++ bytes += (intarg_count + fparg_count) * sizeof(long); ++#elif defined(__ppc__) ++ if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS) ++ bytes += (intarg_count + 2 * fparg_count) * sizeof(long); ++#else ++#error undefined architecture ++#endif ++ else ++ bytes += NUM_GPR_ARG_REGISTERS * sizeof(long); ++ ++ /* The stack space allocated needs to be a multiple of 16/32 bytes. */ ++ bytes = SF_ROUND(bytes); ++ ++ cif->flags = flags; ++ cif->bytes = bytes; ++ ++ return FFI_OK; ++} ++ ++/*@-declundef@*/ ++/*@-exportheader@*/ ++extern void ++ffi_call_AIX( ++/*@out@*/ extended_cif*, ++ unsigned, ++ unsigned, ++/*@out@*/ unsigned*, ++ void (*fn)(void), ++ void (*fn2)(extended_cif*, unsigned *const)); ++ ++extern void ++ffi_call_DARWIN( ++/*@out@*/ extended_cif*, ++ unsigned long, ++ unsigned, ++/*@out@*/ unsigned*, ++ void (*fn)(void), ++ void (*fn2)(extended_cif*, unsigned *const)); ++/*@=declundef@*/ ++/*@=exportheader@*/ ++ ++void ++ffi_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ void** avalue) ++{ ++ extended_cif ecif; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return ++ value address then we need to make one. */ ++ if ((rvalue == NULL) && ++ (cif->rtype->type == FFI_TYPE_STRUCT)) ++ { ++ /*@-sysunrecog@*/ ++ ecif.rvalue = alloca(cif->rtype->size); ++ /*@=sysunrecog@*/ ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ switch (cif->abi) ++ { ++ case FFI_AIX: ++ /*@-usedef@*/ ++ ffi_call_AIX(&ecif, -cif->bytes, ++ cif->flags, ecif.rvalue, fn, ffi_prep_args); ++ /*@=usedef@*/ ++ break; ++ ++ case FFI_DARWIN: ++ /*@-usedef@*/ ++ ffi_call_DARWIN(&ecif, -(long)cif->bytes, ++ cif->flags, ecif.rvalue, fn, ffi_prep_args); ++ /*@=usedef@*/ ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++/* here I'd like to add the stack frame layout we use in darwin_closure.S ++ and aix_clsoure.S ++ ++ SP previous -> +---------------------------------------+ <--- child frame ++ | back chain to caller 4 | ++ +---------------------------------------+ 4 ++ | saved CR 4 | ++ +---------------------------------------+ 8 ++ | saved LR 4 | ++ +---------------------------------------+ 12 ++ | reserved for compilers 4 | ++ +---------------------------------------+ 16 ++ | reserved for binders 4 | ++ +---------------------------------------+ 20 ++ | saved TOC pointer 4 | ++ +---------------------------------------+ 24 ++ | always reserved 8*4=32 (previous GPRs)| ++ | according to the linkage convention | ++ | from AIX | ++ +---------------------------------------+ 56 ++ | our FPR area 13*8=104 | ++ | f1 | ++ | . | ++ | f13 | ++ +---------------------------------------+ 160 ++ | result area 8 | ++ +---------------------------------------+ 168 ++ | alignement to the next multiple of 16 | ++SP current --> +---------------------------------------+ 176 <- parent frame ++ | back chain to caller 4 | ++ +---------------------------------------+ 180 ++ | saved CR 4 | ++ +---------------------------------------+ 184 ++ | saved LR 4 | ++ +---------------------------------------+ 188 ++ | reserved for compilers 4 | ++ +---------------------------------------+ 192 ++ | reserved for binders 4 | ++ +---------------------------------------+ 196 ++ | saved TOC pointer 4 | ++ +---------------------------------------+ 200 ++ | always reserved 8*4=32 we store our | ++ | GPRs here | ++ | r3 | ++ | . | ++ | r10 | ++ +---------------------------------------+ 232 ++ | overflow part | ++ +---------------------------------------+ xxx ++ | ???? | ++ +---------------------------------------+ xxx ++*/ ++ ++#if !defined(POWERPC_DARWIN) ++ ++#define MIN_LINE_SIZE 32 ++ ++static void ++flush_icache( ++ char* addr) ++{ ++#ifndef _AIX ++ __asm__ volatile ( ++ "dcbf 0,%0\n" ++ "sync\n" ++ "icbi 0,%0\n" ++ "sync\n" ++ "isync" ++ : : "r" (addr) : "memory"); ++#endif ++} ++ ++static void ++flush_range( ++ char* addr, ++ int size) ++{ ++ int i; ++ ++ for (i = 0; i < size; i += MIN_LINE_SIZE) ++ flush_icache(addr + i); ++ ++ flush_icache(addr + size - 1); ++} ++ ++#endif // !defined(POWERPC_DARWIN) ++ ++ffi_status ++ffi_prep_closure( ++ ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*, void*, void**, void*), ++ void* user_data) ++{ ++ switch (cif->abi) ++ { ++ case FFI_DARWIN: ++ { ++ FFI_ASSERT (cif->abi == FFI_DARWIN); ++ ++ unsigned int* tramp = (unsigned int*)&closure->tramp[0]; ++ ++#if defined(__ppc64__) ++ tramp[0] = 0x7c0802a6; // mflr r0 ++ tramp[1] = 0x429f0005; // bcl 20,31,+0x8 ++ tramp[2] = 0x7d6802a6; // mflr r11 ++ tramp[3] = 0x7c0803a6; // mtlr r0 ++ tramp[4] = 0xe98b0018; // ld r12,24(r11) ++ tramp[5] = 0x7d8903a6; // mtctr r12 ++ tramp[6] = 0xe96b0020; // ld r11,32(r11) ++ tramp[7] = 0x4e800420; // bctr ++ *(unsigned long*)&tramp[8] = (unsigned long)ffi_closure_ASM; ++ *(unsigned long*)&tramp[10] = (unsigned long)closure; ++#elif defined(__ppc__) ++ tramp[0] = 0x7c0802a6; // mflr r0 ++ tramp[1] = 0x429f0005; // bcl 20,31,+0x8 ++ tramp[2] = 0x7d6802a6; // mflr r11 ++ tramp[3] = 0x7c0803a6; // mtlr r0 ++ tramp[4] = 0x818b0018; // lwz r12,24(r11) ++ tramp[5] = 0x7d8903a6; // mtctr r12 ++ tramp[6] = 0x816b001c; // lwz r11,28(r11) ++ tramp[7] = 0x4e800420; // bctr ++ tramp[8] = (unsigned long)ffi_closure_ASM; ++ tramp[9] = (unsigned long)closure; ++#else ++#error undefined architecture ++#endif ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ ++ // Flush the icache. Only necessary on Darwin. ++#if defined(POWERPC_DARWIN) ++ sys_icache_invalidate(closure->tramp, FFI_TRAMPOLINE_SIZE); ++#else ++ flush_range(closure->tramp, FFI_TRAMPOLINE_SIZE); ++#endif ++ ++ break; ++ } ++ ++ case FFI_AIX: ++ { ++ FFI_ASSERT (cif->abi == FFI_AIX); ++ ++ ffi_aix_trampoline_struct* tramp_aix = ++ (ffi_aix_trampoline_struct*)(closure->tramp); ++ aix_fd* fd = (aix_fd*)(void*)ffi_closure_ASM; ++ ++ tramp_aix->code_pointer = fd->code_pointer; ++ tramp_aix->toc = fd->toc; ++ tramp_aix->static_chain = closure; ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ break; ++ } ++ ++ default: ++ return FFI_BAD_ABI; ++ } ++ ++ return FFI_OK; ++} ++ ++#if defined(__ppc__) ++ typedef double ldbits[2]; ++ ++ typedef union ++ { ++ ldbits lb; ++ long double ld; ++ } ldu; ++#endif ++ ++typedef union ++{ ++ float f; ++ double d; ++} ffi_dblfl; ++ ++/* The trampoline invokes ffi_closure_ASM, and on entry, r11 holds the ++ address of the closure. After storing the registers that could possibly ++ contain parameters to be passed into the stack frame and setting up space ++ for a return value, ffi_closure_ASM invokes the following helper function ++ to do most of the work. */ ++int ++ffi_closure_helper_DARWIN( ++ ffi_closure* closure, ++ void* rvalue, ++ unsigned long* pgr, ++ ffi_dblfl* pfr) ++{ ++ /* rvalue is the pointer to space for return value in closure assembly ++ pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM ++ pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM. */ ++ ++#if defined(__ppc__) ++ ldu temp_ld; ++#endif ++ ++ double temp; ++ unsigned int i; ++ unsigned int nf = 0; /* number of FPRs already used. */ ++ unsigned int ng = 0; /* number of GPRs already used. */ ++ ffi_cif* cif = closure->cif; ++ long avn = cif->nargs; ++ void** avalue = alloca(cif->nargs * sizeof(void*)); ++ ffi_type** arg_types = cif->arg_types; ++ ++ /* Copy the caller's structure return value address so that the closure ++ returns the data directly to the caller. */ ++#if defined(__ppc64__) ++ if (cif->rtype->type == FFI_TYPE_STRUCT && ++ ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) ++#elif defined(__ppc__) ++ if (cif->rtype->type == FFI_TYPE_STRUCT) ++#else ++#error undefined architecture ++#endif ++ { ++ rvalue = (void*)*pgr; ++ pgr++; ++ ng++; ++ } ++ ++ /* Grab the addresses of the arguments from the stack frame. */ ++ for (i = 0; i < avn; i++) ++ { ++ switch (arg_types[i]->type) ++ { ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT8: ++ avalue[i] = (char*)pgr + MODE_CHOICE(3,7); ++ ng++; ++ pgr++; ++ break; ++ ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT16: ++ avalue[i] = (char*)pgr + MODE_CHOICE(2,6); ++ ng++; ++ pgr++; ++ break; ++ ++#if defined(__ppc__) ++ case FFI_TYPE_POINTER: ++#endif ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT32: ++ avalue[i] = (char*)pgr + MODE_CHOICE(0,4); ++ ng++; ++ pgr++; ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ if (cif->abi == FFI_DARWIN) ++ { ++#if defined(__ppc64__) ++ unsigned int gprSize = 0; ++ unsigned int fprSize = 0; ++ unsigned int savedFPRSize = fprSize; ++ ++ avalue[i] = alloca(arg_types[i]->size); ++ ffi64_struct_to_ram_form(arg_types[i], (const char*)pgr, ++ &gprSize, (const char*)pfr, &fprSize, &nf, avalue[i], NULL); ++ ++ ng += gprSize / sizeof(long); ++ pgr += gprSize / sizeof(long); ++ pfr += (fprSize - savedFPRSize) / sizeof(double); ++ ++#elif defined(__ppc__) ++ /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, ++ SI 4 bytes) are aligned as if they were those modes. */ ++ unsigned int size_al = size_al = arg_types[i]->size; ++ ++ /* If the first member of the struct is a double, then align ++ the struct to double-word. */ ++ if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE) ++ size_al = ALIGN(arg_types[i]->size, 8); ++ ++ if (size_al < 3) ++ avalue[i] = (void*)pgr + MODE_CHOICE(4,8) - size_al; ++ else ++ avalue[i] = (void*)pgr; ++ ++ ng += (size_al + 3) / sizeof(long); ++ pgr += (size_al + 3) / sizeof(long); ++#else ++#error undefined architecture ++#endif ++ } ++ ++ break; ++ ++#if defined(__ppc64__) ++ case FFI_TYPE_POINTER: ++#endif ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_UINT64: ++ /* Long long ints are passed in 1 or 2 GPRs. */ ++ avalue[i] = pgr; ++ ng += MODE_CHOICE(2,1); ++ pgr += MODE_CHOICE(2,1); ++ ++ break; ++ ++ case FFI_TYPE_FLOAT: ++ /* A float value consumes a GPR. ++ There are 13 64-bit floating point registers. */ ++ if (nf < NUM_FPR_ARG_REGISTERS) ++ { ++ temp = pfr->d; ++ pfr->f = (float)temp; ++ avalue[i] = pfr; ++ pfr++; ++ } ++ else ++ avalue[i] = pgr; ++ ++ nf++; ++ ng++; ++ pgr++; ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ /* A double value consumes one or two GPRs. ++ There are 13 64bit floating point registers. */ ++ if (nf < NUM_FPR_ARG_REGISTERS) ++ { ++ avalue[i] = pfr; ++ pfr++; ++ } ++ else ++ avalue[i] = pgr; ++ ++ nf++; ++ ng += MODE_CHOICE(2,1); ++ pgr += MODE_CHOICE(2,1); ++ ++ break; ++ ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_LONGDOUBLE: ++#if defined(__ppc64__) ++ if (nf < NUM_FPR_ARG_REGISTERS) ++ { ++ avalue[i] = pfr; ++ pfr += 2; ++ } ++#elif defined(__ppc__) ++ /* A long double value consumes 2/4 GPRs and 2 FPRs. ++ There are 13 64bit floating point registers. */ ++ if (nf < NUM_FPR_ARG_REGISTERS - 1) ++ { ++ avalue[i] = pfr; ++ pfr += 2; ++ } ++ /* Here we have the situation where one part of the long double ++ is stored in fpr13 and the other part is already on the stack. ++ We use a union to pass the long double to avalue[i]. */ ++ else if (nf == NUM_FPR_ARG_REGISTERS - 1) ++ { ++ memcpy (&temp_ld.lb[0], pfr, sizeof(temp_ld.lb[0])); ++ memcpy (&temp_ld.lb[1], pgr + 2, sizeof(temp_ld.lb[1])); ++ avalue[i] = &temp_ld.ld; ++ } ++#else ++#error undefined architecture ++#endif ++ else ++ avalue[i] = pgr; ++ ++ nf += 2; ++ ng += MODE_CHOICE(4,2); ++ pgr += MODE_CHOICE(4,2); ++ ++ break; ++ ++#endif /* FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE */ ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ } ++ ++ (closure->fun)(cif, rvalue, avalue, closure->user_data); ++ ++ /* Tell ffi_closure_ASM to perform return type promotions. */ ++ return cif->rtype->type; ++} ++ ++#if defined(__ppc64__) ++ ++/* ffi64_struct_to_ram_form ++ ++ Rebuild a struct's natural layout from buffers of concatenated registers. ++ Return the number of registers used. ++ inGPRs[0-7] == r3, inFPRs[0-7] == f1 ... ++*/ ++void ++ffi64_struct_to_ram_form( ++ const ffi_type* inType, ++ const char* inGPRs, ++ unsigned int* ioGPRMarker, ++ const char* inFPRs, ++ unsigned int* ioFPRMarker, ++ unsigned int* ioFPRsUsed, ++ char* outStruct, // caller-allocated ++ unsigned int* ioStructMarker) ++{ ++ unsigned int srcGMarker = 0; ++ unsigned int srcFMarker = 0; ++ unsigned int savedFMarker = 0; ++ unsigned int fprsUsed = 0; ++ unsigned int savedFPRsUsed = 0; ++ unsigned int destMarker = 0; ++ ++ static unsigned int recurseCount = 0; ++ ++ if (ioGPRMarker) ++ srcGMarker = *ioGPRMarker; ++ ++ if (ioFPRMarker) ++ { ++ srcFMarker = *ioFPRMarker; ++ savedFMarker = srcFMarker; ++ } ++ ++ if (ioFPRsUsed) ++ { ++ fprsUsed = *ioFPRsUsed; ++ savedFPRsUsed = fprsUsed; ++ } ++ ++ if (ioStructMarker) ++ destMarker = *ioStructMarker; ++ ++ size_t i; ++ ++ switch (inType->size) ++ { ++ case 1: case 2: case 4: ++ srcGMarker += 8 - inType->size; ++ break; ++ ++ default: ++ break; ++ } ++ ++ for (i = 0; inType->elements[i] != NULL; i++) ++ { ++ switch (inType->elements[i]->type) ++ { ++ case FFI_TYPE_FLOAT: ++ srcFMarker = ALIGN(srcFMarker, 4); ++ srcGMarker = ALIGN(srcGMarker, 4); ++ destMarker = ALIGN(destMarker, 4); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ *(float*)&outStruct[destMarker] = ++ (float)*(double*)&inFPRs[srcFMarker]; ++ srcFMarker += 8; ++ fprsUsed++; ++ } ++ else ++ *(float*)&outStruct[destMarker] = ++ (float)*(double*)&inGPRs[srcGMarker]; ++ ++ srcGMarker += 4; ++ destMarker += 4; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (destMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) ++ srcGMarker = ALIGN(srcGMarker, 8); ++ } ++ ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ srcFMarker = ALIGN(srcFMarker, 8); ++ destMarker = ALIGN(destMarker, 8); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ *(double*)&outStruct[destMarker] = ++ *(double*)&inFPRs[srcFMarker]; ++ srcFMarker += 8; ++ fprsUsed++; ++ } ++ else ++ *(double*)&outStruct[destMarker] = ++ *(double*)&inGPRs[srcGMarker]; ++ ++ destMarker += 8; ++ ++ // Skip next GPR ++ srcGMarker += 8; ++ srcGMarker = ALIGN(srcGMarker, 8); ++ ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ destMarker = ALIGN(destMarker, 16); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ srcFMarker = ALIGN(srcFMarker, 8); ++ srcGMarker = ALIGN(srcGMarker, 8); ++ *(long double*)&outStruct[destMarker] = ++ *(long double*)&inFPRs[srcFMarker]; ++ srcFMarker += 16; ++ fprsUsed += 2; ++ } ++ else ++ { ++ srcFMarker = ALIGN(srcFMarker, 16); ++ srcGMarker = ALIGN(srcGMarker, 16); ++ *(long double*)&outStruct[destMarker] = ++ *(long double*)&inGPRs[srcGMarker]; ++ } ++ ++ destMarker += 16; ++ ++ // Skip next 2 GPRs ++ srcGMarker += 16; ++ srcGMarker = ALIGN(srcGMarker, 8); ++ ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ { ++ if (inType->alignment == 1) // chars only ++ { ++ if (inType->size == 1) ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ else if (inType->size == 2) ++ { ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ i++; ++ } ++ else ++ { ++ memcpy(&outStruct[destMarker], ++ &inGPRs[srcGMarker], inType->size); ++ srcGMarker += inType->size; ++ destMarker += inType->size; ++ i += inType->size - 1; ++ } ++ } ++ else // chars and other stuff ++ { ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (srcGMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) ++ srcGMarker = ALIGN(srcGMarker, inType->alignment); // was 8 ++ } ++ } ++ ++ break; ++ } ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ srcGMarker = ALIGN(srcGMarker, 2); ++ destMarker = ALIGN(destMarker, 2); ++ ++ *(short*)&outStruct[destMarker] = ++ *(short*)&inGPRs[srcGMarker]; ++ srcGMarker += 2; ++ destMarker += 2; ++ ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ srcGMarker = ALIGN(srcGMarker, 4); ++ destMarker = ALIGN(destMarker, 4); ++ ++ *(int*)&outStruct[destMarker] = ++ *(int*)&inGPRs[srcGMarker]; ++ srcGMarker += 4; ++ destMarker += 4; ++ ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ srcGMarker = ALIGN(srcGMarker, 8); ++ destMarker = ALIGN(destMarker, 8); ++ ++ *(long long*)&outStruct[destMarker] = ++ *(long long*)&inGPRs[srcGMarker]; ++ srcGMarker += 8; ++ destMarker += 8; ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ recurseCount++; ++ ffi64_struct_to_ram_form(inType->elements[i], inGPRs, ++ &srcGMarker, inFPRs, &srcFMarker, &fprsUsed, ++ outStruct, &destMarker); ++ recurseCount--; ++ break; ++ ++ default: ++ FFI_ASSERT(0); // unknown element type ++ break; ++ } ++ } ++ ++ srcGMarker = ALIGN(srcGMarker, inType->alignment); ++ ++ // Take care of the special case for 16-byte structs, but not for ++ // nested structs. ++ if (recurseCount == 0 && srcGMarker == 16) ++ { ++ *(long double*)&outStruct[0] = *(long double*)&inGPRs[0]; ++ srcFMarker = savedFMarker; ++ fprsUsed = savedFPRsUsed; ++ } ++ ++ if (ioGPRMarker) ++ *ioGPRMarker = ALIGN(srcGMarker, 8); ++ ++ if (ioFPRMarker) ++ *ioFPRMarker = srcFMarker; ++ ++ if (ioFPRsUsed) ++ *ioFPRsUsed = fprsUsed; ++ ++ if (ioStructMarker) ++ *ioStructMarker = ALIGN(destMarker, 8); ++} ++ ++/* ffi64_struct_to_reg_form ++ ++ Copy a struct's elements into buffers that can be sliced into registers. ++ Return the sizes of the output buffers in bytes. Pass NULL buffer pointers ++ to calculate size only. ++ outGPRs[0-7] == r3, outFPRs[0-7] == f1 ... ++*/ ++void ++ffi64_struct_to_reg_form( ++ const ffi_type* inType, ++ const char* inStruct, ++ unsigned int* ioStructMarker, ++ unsigned int* ioFPRsUsed, ++ char* outGPRs, // caller-allocated ++ unsigned int* ioGPRSize, ++ char* outFPRs, // caller-allocated ++ unsigned int* ioFPRSize) ++{ ++ size_t i; ++ unsigned int srcMarker = 0; ++ unsigned int destGMarker = 0; ++ unsigned int destFMarker = 0; ++ unsigned int savedFMarker = 0; ++ unsigned int fprsUsed = 0; ++ unsigned int savedFPRsUsed = 0; ++ ++ static unsigned int recurseCount = 0; ++ ++ if (ioStructMarker) ++ srcMarker = *ioStructMarker; ++ ++ if (ioFPRsUsed) ++ { ++ fprsUsed = *ioFPRsUsed; ++ savedFPRsUsed = fprsUsed; ++ } ++ ++ if (ioGPRSize) ++ destGMarker = *ioGPRSize; ++ ++ if (ioFPRSize) ++ { ++ destFMarker = *ioFPRSize; ++ savedFMarker = destFMarker; ++ } ++ ++ switch (inType->size) ++ { ++ case 1: case 2: case 4: ++ destGMarker += 8 - inType->size; ++ break; ++ ++ default: ++ break; ++ } ++ ++ for (i = 0; inType->elements[i] != NULL; i++) ++ { ++ switch (inType->elements[i]->type) ++ { ++ // Shadow floating-point types in GPRs for vararg and pre-ANSI ++ // functions. ++ case FFI_TYPE_FLOAT: ++ // Nudge markers to next 4/8-byte boundary ++ srcMarker = ALIGN(srcMarker, 4); ++ destGMarker = ALIGN(destGMarker, 4); ++ destFMarker = ALIGN(destFMarker, 8); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ if (outFPRs != NULL && inStruct != NULL) ++ *(double*)&outFPRs[destFMarker] = ++ (double)*(float*)&inStruct[srcMarker]; ++ ++ destFMarker += 8; ++ fprsUsed++; ++ } ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(double*)&outGPRs[destGMarker] = ++ (double)*(float*)&inStruct[srcMarker]; ++ ++ srcMarker += 4; ++ destGMarker += 4; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (srcMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 4)) ++ destGMarker = ALIGN(destGMarker, 8); ++ } ++ ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ srcMarker = ALIGN(srcMarker, 8); ++ destFMarker = ALIGN(destFMarker, 8); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ if (outFPRs != NULL && inStruct != NULL) ++ *(double*)&outFPRs[destFMarker] = ++ *(double*)&inStruct[srcMarker]; ++ ++ destFMarker += 8; ++ fprsUsed++; ++ } ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(double*)&outGPRs[destGMarker] = ++ *(double*)&inStruct[srcMarker]; ++ ++ srcMarker += 8; ++ ++ // Skip next GPR ++ destGMarker += 8; ++ destGMarker = ALIGN(destGMarker, 8); ++ ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ srcMarker = ALIGN(srcMarker, 16); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ destFMarker = ALIGN(destFMarker, 8); ++ destGMarker = ALIGN(destGMarker, 8); ++ ++ if (outFPRs != NULL && inStruct != NULL) ++ *(long double*)&outFPRs[destFMarker] = ++ *(long double*)&inStruct[srcMarker]; ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long double*)&outGPRs[destGMarker] = ++ *(long double*)&inStruct[srcMarker]; ++ ++ destFMarker += 16; ++ fprsUsed += 2; ++ } ++ else ++ { ++ destGMarker = ALIGN(destGMarker, 16); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long double*)&outGPRs[destGMarker] = ++ *(long double*)&inStruct[srcMarker]; ++ } ++ ++ srcMarker += 16; ++ destGMarker += 16; // Skip next 2 GPRs ++ destGMarker = ALIGN(destGMarker, 8); // was 16 ++ ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ if (inType->alignment == 1) // bytes only ++ { ++ if (inType->size == 1) ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ outGPRs[destGMarker] = inStruct[srcMarker]; ++ ++ srcMarker++; ++ destGMarker++; ++ } ++ else if (inType->size == 2) ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ { ++ outGPRs[destGMarker] = inStruct[srcMarker]; ++ outGPRs[destGMarker + 1] = inStruct[srcMarker + 1]; ++ } ++ ++ srcMarker += 2; ++ destGMarker += 2; ++ ++ i++; ++ } ++ else ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ { ++ // Avoid memcpy for small chunks. ++ if (inType->size <= sizeof(long)) ++ *(long*)&outGPRs[destGMarker] = ++ *(long*)&inStruct[srcMarker]; ++ else ++ memcpy(&outGPRs[destGMarker], ++ &inStruct[srcMarker], inType->size); ++ } ++ ++ srcMarker += inType->size; ++ destGMarker += inType->size; ++ i += inType->size - 1; ++ } ++ } ++ else // bytes and other stuff ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ outGPRs[destGMarker] = inStruct[srcMarker]; ++ ++ srcMarker++; ++ destGMarker++; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (destGMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 4)) ++ destGMarker = ALIGN(destGMarker, inType->alignment); // was 8 ++ } ++ } ++ ++ break; ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ srcMarker = ALIGN(srcMarker, 2); ++ destGMarker = ALIGN(destGMarker, 2); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(short*)&outGPRs[destGMarker] = ++ *(short*)&inStruct[srcMarker]; ++ ++ srcMarker += 2; ++ destGMarker += 2; ++ ++ if (inType->elements[i + 1] == NULL) ++ destGMarker = ALIGN(destGMarker, inType->alignment); ++ ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ srcMarker = ALIGN(srcMarker, 4); ++ destGMarker = ALIGN(destGMarker, 4); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(int*)&outGPRs[destGMarker] = ++ *(int*)&inStruct[srcMarker]; ++ ++ srcMarker += 4; ++ destGMarker += 4; ++ ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ srcMarker = ALIGN(srcMarker, 8); ++ destGMarker = ALIGN(destGMarker, 8); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long long*)&outGPRs[destGMarker] = ++ *(long long*)&inStruct[srcMarker]; ++ ++ srcMarker += 8; ++ destGMarker += 8; ++ ++ if (inType->elements[i + 1] == NULL) ++ destGMarker = ALIGN(destGMarker, inType->alignment); ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ recurseCount++; ++ ffi64_struct_to_reg_form(inType->elements[i], ++ inStruct, &srcMarker, &fprsUsed, outGPRs, ++ &destGMarker, outFPRs, &destFMarker); ++ recurseCount--; ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ } ++ ++ destGMarker = ALIGN(destGMarker, inType->alignment); ++ ++ // Take care of the special case for 16-byte structs, but not for ++ // nested structs. ++ if (recurseCount == 0 && destGMarker == 16) ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long double*)&outGPRs[0] = *(long double*)&inStruct[0]; ++ ++ destFMarker = savedFMarker; ++ fprsUsed = savedFPRsUsed; ++ } ++ ++ if (ioStructMarker) ++ *ioStructMarker = ALIGN(srcMarker, 8); ++ ++ if (ioFPRsUsed) ++ *ioFPRsUsed = fprsUsed; ++ ++ if (ioGPRSize) ++ *ioGPRSize = ALIGN(destGMarker, 8); ++ ++ if (ioFPRSize) ++ *ioFPRSize = ALIGN(destFMarker, 8); ++} ++ ++/* ffi64_stret_needs_ptr ++ ++ Determine whether a returned struct needs a pointer in r3 or can fit ++ in registers. ++*/ ++ ++bool ++ffi64_stret_needs_ptr( ++ const ffi_type* inType, ++ unsigned short* ioGPRCount, ++ unsigned short* ioFPRCount) ++{ ++ // Obvious case first- struct is larger than combined FPR size. ++ if (inType->size > 14 * 8) ++ return true; ++ ++ // Now the struct can physically fit in registers, determine if it ++ // also fits logically. ++ bool needsPtr = false; ++ unsigned short gprsUsed = 0; ++ unsigned short fprsUsed = 0; ++ size_t i; ++ ++ if (ioGPRCount) ++ gprsUsed = *ioGPRCount; ++ ++ if (ioFPRCount) ++ fprsUsed = *ioFPRCount; ++ ++ for (i = 0; inType->elements[i] != NULL && !needsPtr; i++) ++ { ++ switch (inType->elements[i]->type) ++ { ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ gprsUsed++; ++ fprsUsed++; ++ ++ if (fprsUsed > 13) ++ needsPtr = true; ++ ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ gprsUsed += 2; ++ fprsUsed += 2; ++ ++ if (fprsUsed > 14) ++ needsPtr = true; ++ ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ { ++ gprsUsed++; ++ ++ if (gprsUsed > 8) ++ { ++ needsPtr = true; ++ break; ++ } ++ ++ if (inType->elements[i + 1] == NULL) // last byte in the struct ++ break; ++ ++ // Count possible contiguous bytes ahead, up to 8. ++ unsigned short j; ++ ++ for (j = 1; j < 8; j++) ++ { ++ if (inType->elements[i + j] == NULL || ++ !FFI_TYPE_1_BYTE(inType->elements[i + j]->type)) ++ break; ++ } ++ ++ i += j - 1; // allow for i++ before the test condition ++ ++ break; ++ } ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ gprsUsed++; ++ ++ if (gprsUsed > 8) ++ needsPtr = true; ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ needsPtr = ffi64_stret_needs_ptr( ++ inType->elements[i], &gprsUsed, &fprsUsed); ++ ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ } ++ ++ if (ioGPRCount) ++ *ioGPRCount = gprsUsed; ++ ++ if (ioFPRCount) ++ *ioFPRCount = fprsUsed; ++ ++ return needsPtr; ++} ++ ++/* ffi64_data_size ++ ++ Calculate the size in bytes of an ffi type. ++*/ ++ ++unsigned int ++ffi64_data_size( ++ const ffi_type* inType) ++{ ++ unsigned int size = 0; ++ ++ switch (inType->type) ++ { ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ size = 1; ++ break; ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ size = 2; ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_FLOAT: ++ size = 4; ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_DOUBLE: ++ size = 8; ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ size = 16; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ ffi64_struct_to_reg_form( ++ inType, NULL, NULL, NULL, NULL, &size, NULL, NULL); ++ break; ++ ++ case FFI_TYPE_VOID: ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ ++ return size; ++} ++ ++#endif /* defined(__ppc64__) */ ++#endif /* __ppc__ || __ppc64__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S +new file mode 100644 +index 0000000..7162fa1 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S +@@ -0,0 +1,418 @@ ++#if defined(__ppc64__) ++ ++/* ----------------------------------------------------------------------- ++ ppc64-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, ++ Inc. based on ppc_closure.S ++ ++ PowerPC Assembly glue. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++ ++#include ++#include // for FFI_TRAMPOLINE_SIZE ++#include ++#include ++ ++ .file "ppc64-darwin_closure.S" ++.text ++ .align LOG2_GPR_BYTES ++ .globl _ffi_closure_ASM ++ ++.text ++ .align LOG2_GPR_BYTES ++ ++_ffi_closure_ASM: ++LFB1: ++ mflr r0 ++ stg r0,SF_RETURN(r1) // save return address ++ ++ // Save GPRs 3 - 10 (aligned to 8) in the parents outgoing area. ++ stg r3,SF_ARG1(r1) ++ stg r4,SF_ARG2(r1) ++ stg r5,SF_ARG3(r1) ++ stg r6,SF_ARG4(r1) ++ stg r7,SF_ARG5(r1) ++ stg r8,SF_ARG6(r1) ++ stg r9,SF_ARG7(r1) ++ stg r10,SF_ARG8(r1) ++ ++LCFI0: ++/* 48 bytes (Linkage Area) ++ 64 bytes (outgoing parameter area, always reserved) ++ 112 bytes (14*8 for incoming FPR) ++ ? bytes (result) ++ 112 bytes (14*8 for outgoing FPR) ++ 16 bytes (2 saved registers) ++ 352 + ? total bytes ++*/ ++ ++ std r31,-8(r1) // Save registers we use. ++ std r30,-16(r1) ++ mr r30,r1 // Save the old SP. ++ mr r31,r11 // Save the ffi_closure around ffi64_data_size. ++ ++ // Calculate the space we need. ++ stdu r1,-SF_MINSIZE(r1) ++ ld r3,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* ++ ld r3,16(r3) // ffi_cif->rtype* ++ bl Lffi64_data_size$stub ++ ld r1,0(r1) ++ ++ addi r3,r3,352 // Add our overhead. ++ neg r3,r3 ++ li r0,-32 // Align to 32 bytes. ++ and r3,r3,r0 ++ stdux r1,r1,r3 // Grow the stack. ++ ++ mr r11,r31 // Copy the ffi_closure back. ++ ++LCFI1: ++ // We want to build up an area for the parameters passed ++ // in registers. (both floating point and integer) ++ ++/* 320 bytes (callee stack frame aligned to 32) ++ 48 bytes (caller linkage area) ++ 368 (start of caller parameter area aligned to 8) ++*/ ++ ++ // Save FPRs 1 - 14. (aligned to 8) ++ stfd f1,112(r1) ++ stfd f2,120(r1) ++ stfd f3,128(r1) ++ stfd f4,136(r1) ++ stfd f5,144(r1) ++ stfd f6,152(r1) ++ stfd f7,160(r1) ++ stfd f8,168(r1) ++ stfd f9,176(r1) ++ stfd f10,184(r1) ++ stfd f11,192(r1) ++ stfd f12,200(r1) ++ stfd f13,208(r1) ++ stfd f14,216(r1) ++ ++ // Set up registers for the routine that actually does the work. ++ mr r3,r11 // context pointer from the trampoline ++ addi r4,r1,224 // result storage ++ addi r5,r30,SF_ARG1 // saved GPRs ++ addi r6,r1,112 // saved FPRs ++ bl Lffi_closure_helper_DARWIN$stub ++ ++ // Look the proper starting point in table ++ // by using return type as an offset. ++ addi r5,r1,224 // Get pointer to results area. ++ bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. ++ mflr r4 // Move to r4. ++ slwi r3,r3,4 // Now multiply return type by 16. ++ add r3,r3,r4 // Add contents of table to table address. ++ mtctr r3 ++ bctr ++ ++LFE1: ++ // Each of the ret_typeX code fragments has to be exactly 16 bytes long ++ // (4 instructions). For cache effectiveness we align to a 16 byte ++ // boundary first. ++ .align 4 ++ nop ++ nop ++ nop ++ ++Lget_ret_type0_addr: ++ blrl ++ ++// case FFI_TYPE_VOID ++Lret_type0: ++ b Lfinish ++ nop ++ nop ++ nop ++ ++// case FFI_TYPE_INT ++Lret_type1: ++ lwz r3,4(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_FLOAT ++Lret_type2: ++ lfs f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_DOUBLE ++Lret_type3: ++ lfd f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_LONGDOUBLE ++Lret_type4: ++ lfd f1,0(r5) ++ lfd f2,8(r5) ++ b Lfinish ++ nop ++ ++// case FFI_TYPE_UINT8 ++Lret_type5: ++ lbz r3,7(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT8 ++Lret_type6: ++ lbz r3,7(r5) ++ extsb r3,r3 ++ b Lfinish ++ nop ++ ++// case FFI_TYPE_UINT16 ++Lret_type7: ++ lhz r3,6(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT16 ++Lret_type8: ++ lha r3,6(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_UINT32 ++Lret_type9: // same as Lret_type1 ++ lwz r3,4(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT32 ++Lret_type10: // same as Lret_type1 ++ lwz r3,4(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_UINT64 ++Lret_type11: ++ ld r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT64 ++Lret_type12: // same as Lret_type11 ++ ld r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_STRUCT ++Lret_type13: ++ b Lret_struct ++ nop ++ nop ++ nop ++ ++// ** End 16-byte aligned cases ** ++// case FFI_TYPE_POINTER ++// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types ++// are added in future, the following code will need to be updated and ++// padded to 16 bytes. ++Lret_type14: ++ lg r3,0(r5) ++ b Lfinish ++ ++// copy struct into registers ++Lret_struct: ++ ld r31,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* ++ ld r3,16(r31) // ffi_cif->rtype* ++ ld r31,24(r31) // ffi_cif->flags ++ mr r4,r5 // copy struct* to 2nd arg ++ addi r7,r1,SF_ARG9 // GPR return area ++ addi r9,r30,-16-(14*8) // FPR return area ++ li r5,0 // struct offset ptr (NULL) ++ li r6,0 // FPR used count ptr (NULL) ++ li r8,0 // GPR return area size ptr (NULL) ++ li r10,0 // FPR return area size ptr (NULL) ++ bl Lffi64_struct_to_reg_form$stub ++ ++ // Load GPRs ++ ld r3,SF_ARG9(r1) ++ ld r4,SF_ARG10(r1) ++ ld r5,SF_ARG11(r1) ++ ld r6,SF_ARG12(r1) ++ nop ++ ld r7,SF_ARG13(r1) ++ ld r8,SF_ARG14(r1) ++ ld r9,SF_ARG15(r1) ++ ld r10,SF_ARG16(r1) ++ nop ++ ++ // Load FPRs ++ mtcrf 0x2,r31 ++ bf 26,Lfinish ++ lfd f1,-16-(14*8)(r30) ++ lfd f2,-16-(13*8)(r30) ++ lfd f3,-16-(12*8)(r30) ++ lfd f4,-16-(11*8)(r30) ++ nop ++ lfd f5,-16-(10*8)(r30) ++ lfd f6,-16-(9*8)(r30) ++ lfd f7,-16-(8*8)(r30) ++ lfd f8,-16-(7*8)(r30) ++ nop ++ lfd f9,-16-(6*8)(r30) ++ lfd f10,-16-(5*8)(r30) ++ lfd f11,-16-(4*8)(r30) ++ lfd f12,-16-(3*8)(r30) ++ nop ++ lfd f13,-16-(2*8)(r30) ++ lfd f14,-16-(1*8)(r30) ++ // Fall through ++ ++// case done ++Lfinish: ++ lg r1,0(r1) // Restore stack pointer. ++ ld r31,-8(r1) // Restore registers we used. ++ ld r30,-16(r1) ++ lg r0,SF_RETURN(r1) // Get return address. ++ mtlr r0 // Reset link register. ++ blr ++ ++// END(ffi_closure_ASM) ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ; Length of Common Information Entry ++LSCIE1: ++ .long 0x0 ; CIE Identifier Tag ++ .byte 0x1 ; CIE Version ++ .ascii "zR\0" ; CIE Augmentation ++ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor ++ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte 0x41 ; CIE RA Column ++ .byte 0x1 ; uleb128 0x1; Augmentation size ++ .byte 0x10 ; FDE Encoding (pcrel) ++ .byte 0xc ; DW_CFA_def_cfa ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x0 ; uleb128 0x0 ++ .align LOG2_GPR_BYTES ++LECIE1: ++.globl _ffi_closure_ASM.eh ++_ffi_closure_ASM.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ; FDE Length ++ ++LASFDE1: ++ .long LASFDE1-EH_frame1 ; FDE CIE offset ++ .g_long LFB1-. ; FDE initial location ++ .set L$set$3,LFE1-LFB1 ++ .g_long L$set$3 ; FDE address range ++ .byte 0x0 ; uleb128 0x0; Augmentation size ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$3,LCFI1-LCFI0 ++ .long L$set$3 ++ .byte 0xe ; DW_CFA_def_cfa_offset ++ .byte 176,1 ; uleb128 176 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$4,LCFI0-LFB1 ++ .long L$set$4 ++ .byte 0x11 ; DW_CFA_offset_extended_sf ++ .byte 0x41 ; uleb128 0x41 ++ .byte 0x7e ; sleb128 -2 ++ .align LOG2_GPR_BYTES ++ ++LEFDE1: ++.data ++ .align LOG2_GPR_BYTES ++LDFCM0: ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi_closure_helper_DARWIN$stub: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ mflr r0 ++ bcl 20,31,LO$ffi_closure_helper_DARWIN ++ ++LO$ffi_closure_helper_DARWIN: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) ++ mtlr r0 ++ lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi_closure_helper_DARWIN$lazy_ptr: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ .g_long dyld_stub_binding_helper ++ ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi64_struct_to_reg_form$stub: ++ .indirect_symbol _ffi64_struct_to_reg_form ++ mflr r0 ++ bcl 20,31,LO$ffi64_struct_to_reg_form ++ ++LO$ffi64_struct_to_reg_form: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form) ++ mtlr r0 ++ lgu r12,lo16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form)(r11) ++ mtctr r12 ++ bctr ++ ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi64_data_size$stub: ++ .indirect_symbol _ffi64_data_size ++ mflr r0 ++ bcl 20,31,LO$ffi64_data_size ++ ++LO$ffi64_data_size: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size) ++ mtlr r0 ++ lgu r12,lo16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi64_struct_to_reg_form$lazy_ptr: ++ .indirect_symbol _ffi64_struct_to_reg_form ++ .g_long dyld_stub_binding_helper ++ ++L_ffi64_data_size$lazy_ptr: ++ .indirect_symbol _ffi64_data_size ++ .g_long dyld_stub_binding_helper ++ ++#endif // __ppc64__ +diff -r -u ./Modules/_ctypes/libffi_osx/types.c ./Modules/_ctypes/libffi_osx/types.c +new file mode 100644 +index 0000000..44806ae +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/types.c +@@ -0,0 +1,115 @@ ++/* ----------------------------------------------------------------------- ++ types.c - Copyright (c) 1996, 1998 Red Hat, Inc. ++ ++ Predefined ffi_types needed by libffi. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++/* Type definitions */ ++#define FFI_INTEGRAL_TYPEDEF(n, s, a, t) \ ++ ffi_type ffi_type_##n = { s, a, t, NULL } ++#define FFI_AGGREGATE_TYPEDEF(n, e) \ ++ ffi_type ffi_type_##n = { 0, 0, FFI_TYPE_STRUCT, e } ++ ++FFI_INTEGRAL_TYPEDEF(uint8, 1, 1, FFI_TYPE_UINT8); ++FFI_INTEGRAL_TYPEDEF(sint8, 1, 1, FFI_TYPE_SINT8); ++FFI_INTEGRAL_TYPEDEF(uint16, 2, 2, FFI_TYPE_UINT16); ++FFI_INTEGRAL_TYPEDEF(sint16, 2, 2, FFI_TYPE_SINT16); ++FFI_INTEGRAL_TYPEDEF(uint32, 4, 4, FFI_TYPE_UINT32); ++FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32); ++FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT); ++ ++/* Size and alignment are fake here. They must not be 0. */ ++FFI_INTEGRAL_TYPEDEF(void, 1, 1, FFI_TYPE_VOID); ++ ++#if defined ALPHA || defined SPARC64 || defined X86_64 || \ ++ defined S390X || defined IA64 || defined POWERPC64 ++FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER); ++#else ++FFI_INTEGRAL_TYPEDEF(pointer, 4, 4, FFI_TYPE_POINTER); ++#endif ++ ++#if defined X86 || defined ARM || defined M68K || defined(X86_DARWIN) ++ ++# ifdef X86_64 ++ FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); ++ FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); ++# else ++ FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); ++ FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); ++# endif ++ ++#elif defined(POWERPC_DARWIN) ++FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); ++FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); ++#elif defined SH ++FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); ++FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); ++#else ++FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); ++FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); ++#endif ++ ++#if defined X86 || defined X86_WIN32 || defined M68K || defined(X86_DARWIN) ++ ++# if defined X86_WIN32 || defined X86_64 ++ FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); ++# endif ++ ++# ifdef X86_DARWIN ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE); ++# endif ++ ++#elif defined ARM || defined SH || defined POWERPC_AIX ++FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); ++FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE); ++#elif defined POWERPC_DARWIN ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++ ++# if __GNUC__ >= 4 ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); ++# endif ++ ++#elif defined SPARC ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++ ++# ifdef SPARC64 ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE); ++# endif ++ ++#elif defined X86_64 || defined POWERPC64 ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++#else ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); ++#endif +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/x86/darwin64.S ./Modules/_ctypes/libffi_osx/x86/darwin64.S +new file mode 100644 +index 0000000..165d469 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/darwin64.S +@@ -0,0 +1,417 @@ ++/* ----------------------------------------------------------------------- ++ darwin64.S - Copyright (c) 2006 Free Software Foundation, Inc. ++ derived from unix64.S ++ ++ x86-64 Foreign Function Interface for Darwin. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#ifdef __x86_64__ ++#define LIBFFI_ASM ++#include ++#include ++ ++ .file "darwin64.S" ++.text ++ ++/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, ++ void *raddr, void (*fnaddr)()); ++ ++ Bit o trickiness here -- ARGS+BYTES is the base of the stack frame ++ for this function. This has been allocated by ffi_call. We also ++ deallocate some of the stack that has been alloca'd. */ ++ ++ .align 3 ++ .globl _ffi_call_unix64 ++ ++_ffi_call_unix64: ++LUW0: ++ movq (%rsp), %r10 /* Load return address. */ ++ movq %rdi, %r12 /* Save a copy of the register area. */ ++ leaq (%rdi, %rsi), %rax /* Find local stack base. */ ++ movq %rdx, (%rax) /* Save flags. */ ++ movq %rcx, 8(%rax) /* Save raddr. */ ++ movq %rbp, 16(%rax) /* Save old frame pointer. */ ++ movq %r10, 24(%rax) /* Relocate return address. */ ++ movq %rax, %rbp /* Finalize local stack frame. */ ++LUW1: ++ /* movq %rdi, %r10 // Save a copy of the register area. */ ++ movq %r12, %r10 ++ movq %r8, %r11 /* Save a copy of the target fn. */ ++ movl %r9d, %eax /* Set number of SSE registers. */ ++ ++ /* Load up all argument registers. */ ++ movq (%r10), %rdi ++ movq 8(%r10), %rsi ++ movq 16(%r10), %rdx ++ movq 24(%r10), %rcx ++ movq 32(%r10), %r8 ++ movq 40(%r10), %r9 ++ testl %eax, %eax ++ jnz Lload_sse ++Lret_from_load_sse: ++ ++ /* Deallocate the reg arg area. */ ++ leaq 176(%r10), %rsp ++ ++ /* Call the user function. */ ++ call *%r11 ++ ++ /* Deallocate stack arg area; local stack frame in redzone. */ ++ leaq 24(%rbp), %rsp ++ ++ movq 0(%rbp), %rcx /* Reload flags. */ ++ movq 8(%rbp), %rdi /* Reload raddr. */ ++ movq 16(%rbp), %rbp /* Reload old frame pointer. */ ++LUW2: ++ ++ /* The first byte of the flags contains the FFI_TYPE. */ ++ movzbl %cl, %r10d ++ leaq Lstore_table(%rip), %r11 ++ movslq (%r11, %r10, 4), %r10 ++ addq %r11, %r10 ++ jmp *%r10 ++ ++Lstore_table: ++ .long Lst_void-Lstore_table /* FFI_TYPE_VOID */ ++ .long Lst_sint32-Lstore_table /* FFI_TYPE_INT */ ++ .long Lst_float-Lstore_table /* FFI_TYPE_FLOAT */ ++ .long Lst_double-Lstore_table /* FFI_TYPE_DOUBLE */ ++ .long Lst_ldouble-Lstore_table /* FFI_TYPE_LONGDOUBLE */ ++ .long Lst_uint8-Lstore_table /* FFI_TYPE_UINT8 */ ++ .long Lst_sint8-Lstore_table /* FFI_TYPE_SINT8 */ ++ .long Lst_uint16-Lstore_table /* FFI_TYPE_UINT16 */ ++ .long Lst_sint16-Lstore_table /* FFI_TYPE_SINT16 */ ++ .long Lst_uint32-Lstore_table /* FFI_TYPE_UINT32 */ ++ .long Lst_sint32-Lstore_table /* FFI_TYPE_SINT32 */ ++ .long Lst_int64-Lstore_table /* FFI_TYPE_UINT64 */ ++ .long Lst_int64-Lstore_table /* FFI_TYPE_SINT64 */ ++ .long Lst_struct-Lstore_table /* FFI_TYPE_STRUCT */ ++ .long Lst_int64-Lstore_table /* FFI_TYPE_POINTER */ ++ ++ .text ++ .align 3 ++Lst_void: ++ ret ++ .align 3 ++Lst_uint8: ++ movzbq %al, %rax ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_sint8: ++ movsbq %al, %rax ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_uint16: ++ movzwq %ax, %rax ++ movq %rax, (%rdi) ++ .align 3 ++Lst_sint16: ++ movswq %ax, %rax ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_uint32: ++ movl %eax, %eax ++ movq %rax, (%rdi) ++ .align 3 ++Lst_sint32: ++ cltq ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_int64: ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_float: ++ movss %xmm0, (%rdi) ++ ret ++ .align 3 ++Lst_double: ++ movsd %xmm0, (%rdi) ++ ret ++Lst_ldouble: ++ fstpt (%rdi) ++ ret ++ .align 3 ++Lst_struct: ++ leaq -20(%rsp), %rsi /* Scratch area in redzone. */ ++ ++ /* We have to locate the values now, and since we don't want to ++ write too much data into the user's return value, we spill the ++ value to a 16 byte scratch area first. Bits 8, 9, and 10 ++ control where the values are located. Only one of the three ++ bits will be set; see ffi_prep_cif_machdep for the pattern. */ ++ movd %xmm0, %r10 ++ movd %xmm1, %r11 ++ testl $0x100, %ecx ++ cmovnz %rax, %rdx ++ cmovnz %r10, %rax ++ testl $0x200, %ecx ++ cmovnz %r10, %rdx ++ testl $0x400, %ecx ++ cmovnz %r10, %rax ++ cmovnz %r11, %rdx ++ movq %rax, (%rsi) ++ movq %rdx, 8(%rsi) ++ ++ /* Bits 12-31 contain the true size of the structure. Copy from ++ the scratch area to the true destination. */ ++ shrl $12, %ecx ++ rep movsb ++ ret ++ ++ /* Many times we can avoid loading any SSE registers at all. ++ It's not worth an indirect jump to load the exact set of ++ SSE registers needed; zero or all is a good compromise. */ ++ .align 3 ++LUW3: ++Lload_sse: ++ movdqa 48(%r10), %xmm0 ++ movdqa 64(%r10), %xmm1 ++ movdqa 80(%r10), %xmm2 ++ movdqa 96(%r10), %xmm3 ++ movdqa 112(%r10), %xmm4 ++ movdqa 128(%r10), %xmm5 ++ movdqa 144(%r10), %xmm6 ++ movdqa 160(%r10), %xmm7 ++ jmp Lret_from_load_sse ++ ++LUW4: ++ .align 3 ++ .globl _ffi_closure_unix64 ++ ++_ffi_closure_unix64: ++LUW5: ++ /* The carry flag is set by the trampoline iff SSE registers ++ are used. Don't clobber it before the branch instruction. */ ++ leaq -200(%rsp), %rsp ++LUW6: ++ movq %rdi, (%rsp) ++ movq %rsi, 8(%rsp) ++ movq %rdx, 16(%rsp) ++ movq %rcx, 24(%rsp) ++ movq %r8, 32(%rsp) ++ movq %r9, 40(%rsp) ++ jc Lsave_sse ++Lret_from_save_sse: ++ ++ movq %r10, %rdi ++ leaq 176(%rsp), %rsi ++ movq %rsp, %rdx ++ leaq 208(%rsp), %rcx ++ call _ffi_closure_unix64_inner ++ ++ /* Deallocate stack frame early; return value is now in redzone. */ ++ addq $200, %rsp ++LUW7: ++ ++ /* The first byte of the return value contains the FFI_TYPE. */ ++ movzbl %al, %r10d ++ leaq Lload_table(%rip), %r11 ++ movslq (%r11, %r10, 4), %r10 ++ addq %r11, %r10 ++ jmp *%r10 ++ ++Lload_table: ++ .long Lld_void-Lload_table /* FFI_TYPE_VOID */ ++ .long Lld_int32-Lload_table /* FFI_TYPE_INT */ ++ .long Lld_float-Lload_table /* FFI_TYPE_FLOAT */ ++ .long Lld_double-Lload_table /* FFI_TYPE_DOUBLE */ ++ .long Lld_ldouble-Lload_table /* FFI_TYPE_LONGDOUBLE */ ++ .long Lld_int8-Lload_table /* FFI_TYPE_UINT8 */ ++ .long Lld_int8-Lload_table /* FFI_TYPE_SINT8 */ ++ .long Lld_int16-Lload_table /* FFI_TYPE_UINT16 */ ++ .long Lld_int16-Lload_table /* FFI_TYPE_SINT16 */ ++ .long Lld_int32-Lload_table /* FFI_TYPE_UINT32 */ ++ .long Lld_int32-Lload_table /* FFI_TYPE_SINT32 */ ++ .long Lld_int64-Lload_table /* FFI_TYPE_UINT64 */ ++ .long Lld_int64-Lload_table /* FFI_TYPE_SINT64 */ ++ .long Lld_struct-Lload_table /* FFI_TYPE_STRUCT */ ++ .long Lld_int64-Lload_table /* FFI_TYPE_POINTER */ ++ ++ .text ++ .align 3 ++Lld_void: ++ ret ++ .align 3 ++Lld_int8: ++ movzbl -24(%rsp), %eax ++ ret ++ .align 3 ++Lld_int16: ++ movzwl -24(%rsp), %eax ++ ret ++ .align 3 ++Lld_int32: ++ movl -24(%rsp), %eax ++ ret ++ .align 3 ++Lld_int64: ++ movq -24(%rsp), %rax ++ ret ++ .align 3 ++Lld_float: ++ movss -24(%rsp), %xmm0 ++ ret ++ .align 3 ++Lld_double: ++ movsd -24(%rsp), %xmm0 ++ ret ++ .align 3 ++Lld_ldouble: ++ fldt -24(%rsp) ++ ret ++ .align 3 ++Lld_struct: ++ /* There are four possibilities here, %rax/%rdx, %xmm0/%rax, ++ %rax/%xmm0, %xmm0/%xmm1. We collapse two by always loading ++ both rdx and xmm1 with the second word. For the remaining, ++ bit 8 set means xmm0 gets the second word, and bit 9 means ++ that rax gets the second word. */ ++ movq -24(%rsp), %rcx ++ movq -16(%rsp), %rdx ++ movq -16(%rsp), %xmm1 ++ testl $0x100, %eax ++ cmovnz %rdx, %rcx ++ movd %rcx, %xmm0 ++ testl $0x200, %eax ++ movq -24(%rsp), %rax ++ cmovnz %rdx, %rax ++ ret ++ ++ /* See the comment above Lload_sse; the same logic applies here. */ ++ .align 3 ++LUW8: ++Lsave_sse: ++ movdqa %xmm0, 48(%rsp) ++ movdqa %xmm1, 64(%rsp) ++ movdqa %xmm2, 80(%rsp) ++ movdqa %xmm3, 96(%rsp) ++ movdqa %xmm4, 112(%rsp) ++ movdqa %xmm5, 128(%rsp) ++ movdqa %xmm6, 144(%rsp) ++ movdqa %xmm7, 160(%rsp) ++ jmp Lret_from_save_sse ++ ++LUW9: ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 /* CIE Length */ ++ .long L$set$0 ++LSCIE1: ++ .long 0x0 /* CIE Identifier Tag */ ++ .byte 0x1 /* CIE Version */ ++ .ascii "zR\0" /* CIE Augmentation */ ++ .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ ++ .byte 0x78 /* sleb128 -8; CIE Data Alignment Factor */ ++ .byte 0x10 /* CIE RA Column */ ++ .byte 0x1 /* uleb128 0x1; Augmentation size */ ++ .byte 0x10 /* FDE Encoding (pcrel sdata4) */ ++ .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ ++ .byte 0x7 /* uleb128 0x7 */ ++ .byte 0x8 /* uleb128 0x8 */ ++ .byte 0x90 /* DW_CFA_offset, column 0x10 */ ++ .byte 0x1 ++ .align 3 ++LECIE1: ++ .globl _ffi_call_unix64.eh ++_ffi_call_unix64.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 /* FDE Length */ ++ .long L$set$1 ++LASFDE1: ++ .long LASFDE1-EH_frame1 /* FDE CIE offset */ ++ .quad LUW0-. /* FDE initial location */ ++ .set L$set$2,LUW4-LUW0 /* FDE address range */ ++ .quad L$set$2 ++ .byte 0x0 /* Augmentation size */ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$3,LUW1-LUW0 ++ .long L$set$3 ++ ++ /* New stack frame based off rbp. This is a itty bit of unwind ++ trickery in that the CFA *has* changed. There is no easy way ++ to describe it correctly on entry to the function. Fortunately, ++ it doesn't matter too much since at all points we can correctly ++ unwind back to ffi_call. Note that the location to which we ++ moved the return address is (the new) CFA-8, so from the ++ perspective of the unwind info, it hasn't moved. */ ++ .byte 0xc /* DW_CFA_def_cfa, %rbp offset 32 */ ++ .byte 0x6 ++ .byte 0x20 ++ .byte 0x80+6 /* DW_CFA_offset, %rbp offset 2*-8 */ ++ .byte 0x2 ++ .byte 0xa /* DW_CFA_remember_state */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$4,LUW2-LUW1 ++ .long L$set$4 ++ .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ ++ .byte 0x7 ++ .byte 0x8 ++ .byte 0xc0+6 /* DW_CFA_restore, %rbp */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$5,LUW3-LUW2 ++ .long L$set$5 ++ .byte 0xb /* DW_CFA_restore_state */ ++ ++ .align 3 ++LEFDE1: ++ .globl _ffi_closure_unix64.eh ++_ffi_closure_unix64.eh: ++LSFDE3: ++ .set L$set$6,LEFDE3-LASFDE3 /* FDE Length */ ++ .long L$set$6 ++LASFDE3: ++ .long LASFDE3-EH_frame1 /* FDE CIE offset */ ++ .quad LUW5-. /* FDE initial location */ ++ .set L$set$7,LUW9-LUW5 /* FDE address range */ ++ .quad L$set$7 ++ .byte 0x0 /* Augmentation size */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$8,LUW6-LUW5 ++ .long L$set$8 ++ .byte 0xe /* DW_CFA_def_cfa_offset */ ++ .byte 208,1 /* uleb128 208 */ ++ .byte 0xa /* DW_CFA_remember_state */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$9,LUW7-LUW6 ++ .long L$set$9 ++ .byte 0xe /* DW_CFA_def_cfa_offset */ ++ .byte 0x8 ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$10,LUW8-LUW7 ++ .long L$set$10 ++ .byte 0xb /* DW_CFA_restore_state */ ++ ++ .align 3 ++LEFDE3: ++ .subsections_via_symbols ++ ++#endif /* __x86_64__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S +new file mode 100644 +index 0000000..925a841 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S +@@ -0,0 +1,422 @@ ++#ifdef __i386__ ++/* ----------------------------------------------------------------------- ++ darwin.S - Copyright (c) 1996, 1998, 2001, 2002, 2003 Red Hat, Inc. ++ ++ X86 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++/* ++ * This file is based on sysv.S and then hacked up by Ronald who hasn't done ++ * assembly programming in 8 years. ++ */ ++ ++#ifndef __x86_64__ ++ ++#define LIBFFI_ASM ++#include ++#include ++ ++#ifdef PyObjC_STRICT_DEBUGGING ++ /* XXX: Debugging of stack alignment, to be removed */ ++#define ASSERT_STACK_ALIGNED movdqa -16(%esp), %xmm0 ++#else ++#define ASSERT_STACK_ALIGNED ++#endif ++ ++.text ++ ++.globl _ffi_prep_args ++ ++ .align 4 ++.globl _ffi_call_SYSV ++ ++_ffi_call_SYSV: ++LFB1: ++ pushl %ebp ++LCFI0: ++ movl %esp,%ebp ++LCFI1: ++ subl $8,%esp ++ /* Make room for all of the new args. */ ++ movl 16(%ebp),%ecx ++ subl %ecx,%esp ++ ++ movl %esp,%eax ++ ++ /* Place all of the ffi_prep_args in position */ ++ subl $8,%esp ++ pushl 12(%ebp) ++ pushl %eax ++ call *8(%ebp) ++ ++ /* Return stack to previous state and call the function */ ++ addl $16,%esp ++ ++ call *28(%ebp) ++ ++ /* Remove the space we pushed for the args */ ++ movl 16(%ebp),%ecx ++ addl %ecx,%esp ++ ++ /* Load %ecx with the return type code */ ++ movl 20(%ebp),%ecx ++ ++ /* If the return value pointer is NULL, assume no return value. */ ++ cmpl $0,24(%ebp) ++ jne Lretint ++ ++ /* Even if there is no space for the return value, we are ++ obliged to handle floating-point values. */ ++ cmpl $FFI_TYPE_FLOAT,%ecx ++ jne Lnoretval ++ fstp %st(0) ++ ++ jmp Lepilogue ++ ++Lretint: ++ cmpl $FFI_TYPE_INT,%ecx ++ jne Lretfloat ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movl %eax,0(%ecx) ++ jmp Lepilogue ++ ++Lretfloat: ++ cmpl $FFI_TYPE_FLOAT,%ecx ++ jne Lretdouble ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ fstps (%ecx) ++ jmp Lepilogue ++ ++Lretdouble: ++ cmpl $FFI_TYPE_DOUBLE,%ecx ++ jne Lretlongdouble ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ fstpl (%ecx) ++ jmp Lepilogue ++ ++Lretlongdouble: ++ cmpl $FFI_TYPE_LONGDOUBLE,%ecx ++ jne Lretint64 ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ fstpt (%ecx) ++ jmp Lepilogue ++ ++Lretint64: ++ cmpl $FFI_TYPE_SINT64,%ecx ++ jne Lretstruct1b ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movl %eax,0(%ecx) ++ movl %edx,4(%ecx) ++ jmp Lepilogue ++ ++Lretstruct1b: ++ cmpl $FFI_TYPE_SINT8,%ecx ++ jne Lretstruct2b ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movb %al,0(%ecx) ++ jmp Lepilogue ++ ++Lretstruct2b: ++ cmpl $FFI_TYPE_SINT16,%ecx ++ jne Lretstruct ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movw %ax,0(%ecx) ++ jmp Lepilogue ++ ++Lretstruct: ++ cmpl $FFI_TYPE_STRUCT,%ecx ++ jne Lnoretval ++ /* Nothing to do! */ ++ addl $4,%esp ++ popl %ebp ++ ret ++ ++Lnoretval: ++Lepilogue: ++ addl $8,%esp ++ movl %ebp,%esp ++ popl %ebp ++ ret ++LFE1: ++.ffi_call_SYSV_end: ++ ++ .align 4 ++FFI_HIDDEN (ffi_closure_SYSV) ++.globl _ffi_closure_SYSV ++ ++_ffi_closure_SYSV: ++LFB2: ++ pushl %ebp ++LCFI2: ++ movl %esp, %ebp ++LCFI3: ++ subl $56, %esp ++ leal -40(%ebp), %edx ++ movl %edx, -12(%ebp) /* resp */ ++ leal 8(%ebp), %edx ++ movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ ++ leal -12(%ebp), %edx ++ movl %edx, (%esp) /* &resp */ ++ movl %ebx, 8(%esp) ++LCFI7: ++ call L_ffi_closure_SYSV_inner$stub ++ movl 8(%esp), %ebx ++ movl -12(%ebp), %ecx ++ cmpl $FFI_TYPE_INT, %eax ++ je Lcls_retint ++ cmpl $FFI_TYPE_FLOAT, %eax ++ je Lcls_retfloat ++ cmpl $FFI_TYPE_DOUBLE, %eax ++ je Lcls_retdouble ++ cmpl $FFI_TYPE_LONGDOUBLE, %eax ++ je Lcls_retldouble ++ cmpl $FFI_TYPE_SINT64, %eax ++ je Lcls_retllong ++ cmpl $FFI_TYPE_UINT8, %eax ++ je Lcls_retstruct1 ++ cmpl $FFI_TYPE_SINT8, %eax ++ je Lcls_retstruct1 ++ cmpl $FFI_TYPE_UINT16, %eax ++ je Lcls_retstruct2 ++ cmpl $FFI_TYPE_SINT16, %eax ++ je Lcls_retstruct2 ++ cmpl $FFI_TYPE_STRUCT, %eax ++ je Lcls_retstruct ++Lcls_epilogue: ++ movl %ebp, %esp ++ popl %ebp ++ ret ++Lcls_retint: ++ movl (%ecx), %eax ++ jmp Lcls_epilogue ++Lcls_retfloat: ++ flds (%ecx) ++ jmp Lcls_epilogue ++Lcls_retdouble: ++ fldl (%ecx) ++ jmp Lcls_epilogue ++Lcls_retldouble: ++ fldt (%ecx) ++ jmp Lcls_epilogue ++Lcls_retllong: ++ movl (%ecx), %eax ++ movl 4(%ecx), %edx ++ jmp Lcls_epilogue ++Lcls_retstruct1: ++ movsbl (%ecx), %eax ++ jmp Lcls_epilogue ++Lcls_retstruct2: ++ movswl (%ecx), %eax ++ jmp Lcls_epilogue ++Lcls_retstruct: ++ lea -8(%ebp),%esp ++ movl %ebp, %esp ++ popl %ebp ++ ret $4 ++LFE2: ++ ++#if !FFI_NO_RAW_API ++ ++#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) ++#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) ++#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) ++#define CIF_FLAGS_OFFSET 20 ++ ++ .align 4 ++FFI_HIDDEN (ffi_closure_raw_SYSV) ++.globl _ffi_closure_raw_SYSV ++ ++_ffi_closure_raw_SYSV: ++LFB3: ++ pushl %ebp ++LCFI4: ++ movl %esp, %ebp ++LCFI5: ++ pushl %esi ++LCFI6: ++ subl $36, %esp ++ movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ ++ movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ ++ movl %edx, 12(%esp) /* user_data */ ++ leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ ++ movl %edx, 8(%esp) /* raw_args */ ++ leal -24(%ebp), %edx ++ movl %edx, 4(%esp) /* &res */ ++ movl %esi, (%esp) /* cif */ ++ call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ ++ movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ ++ cmpl $FFI_TYPE_INT, %eax ++ je Lrcls_retint ++ cmpl $FFI_TYPE_FLOAT, %eax ++ je Lrcls_retfloat ++ cmpl $FFI_TYPE_DOUBLE, %eax ++ je Lrcls_retdouble ++ cmpl $FFI_TYPE_LONGDOUBLE, %eax ++ je Lrcls_retldouble ++ cmpl $FFI_TYPE_SINT64, %eax ++ je Lrcls_retllong ++Lrcls_epilogue: ++ addl $36, %esp ++ popl %esi ++ popl %ebp ++ ret ++Lrcls_retint: ++ movl -24(%ebp), %eax ++ jmp Lrcls_epilogue ++Lrcls_retfloat: ++ flds -24(%ebp) ++ jmp Lrcls_epilogue ++Lrcls_retdouble: ++ fldl -24(%ebp) ++ jmp Lrcls_epilogue ++Lrcls_retldouble: ++ fldt -24(%ebp) ++ jmp Lrcls_epilogue ++Lrcls_retllong: ++ movl -24(%ebp), %eax ++ movl -20(%ebp), %edx ++ jmp Lrcls_epilogue ++LFE3: ++#endif ++ ++.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5 ++L_ffi_closure_SYSV_inner$stub: ++ .indirect_symbol _ffi_closure_SYSV_inner ++ hlt ; hlt ; hlt ; hlt ; hlt ++ ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ++LSCIE1: ++ .long 0x0 ++ .byte 0x1 ++ .ascii "zR\0" ++ .byte 0x1 ++ .byte 0x7c ++ .byte 0x8 ++ .byte 0x1 ++ .byte 0x10 ++ .byte 0xc ++ .byte 0x5 ++ .byte 0x4 ++ .byte 0x88 ++ .byte 0x1 ++ .align 2 ++LECIE1: ++.globl _ffi_call_SYSV.eh ++_ffi_call_SYSV.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ++LASFDE1: ++ .long LASFDE1-EH_frame1 ++ .long LFB1-. ++ .set L$set$2,LFE1-LFB1 ++ .long L$set$2 ++ .byte 0x0 ++ .byte 0x4 ++ .set L$set$3,LCFI0-LFB1 ++ .long L$set$3 ++ .byte 0xe ++ .byte 0x8 ++ .byte 0x84 ++ .byte 0x2 ++ .byte 0x4 ++ .set L$set$4,LCFI1-LCFI0 ++ .long L$set$4 ++ .byte 0xd ++ .byte 0x4 ++ .align 2 ++LEFDE1: ++.globl _ffi_closure_SYSV.eh ++_ffi_closure_SYSV.eh: ++LSFDE2: ++ .set L$set$5,LEFDE2-LASFDE2 ++ .long L$set$5 ++LASFDE2: ++ .long LASFDE2-EH_frame1 ++ .long LFB2-. ++ .set L$set$6,LFE2-LFB2 ++ .long L$set$6 ++ .byte 0x0 ++ .byte 0x4 ++ .set L$set$7,LCFI2-LFB2 ++ .long L$set$7 ++ .byte 0xe ++ .byte 0x8 ++ .byte 0x84 ++ .byte 0x2 ++ .byte 0x4 ++ .set L$set$8,LCFI3-LCFI2 ++ .long L$set$8 ++ .byte 0xd ++ .byte 0x4 ++ .align 2 ++LEFDE2: ++ ++#if !FFI_NO_RAW_API ++ ++.globl _ffi_closure_raw_SYSV.eh ++_ffi_closure_raw_SYSV.eh: ++LSFDE3: ++ .set L$set$10,LEFDE3-LASFDE3 ++ .long L$set$10 ++LASFDE3: ++ .long LASFDE3-EH_frame1 ++ .long LFB3-. ++ .set L$set$11,LFE3-LFB3 ++ .long L$set$11 ++ .byte 0x0 ++ .byte 0x4 ++ .set L$set$12,LCFI4-LFB3 ++ .long L$set$12 ++ .byte 0xe ++ .byte 0x8 ++ .byte 0x84 ++ .byte 0x2 ++ .byte 0x4 ++ .set L$set$13,LCFI5-LCFI4 ++ .long L$set$13 ++ .byte 0xd ++ .byte 0x4 ++ .byte 0x4 ++ .set L$set$14,LCFI6-LCFI5 ++ .long L$set$14 ++ .byte 0x85 ++ .byte 0x3 ++ .align 2 ++LEFDE3: ++ ++#endif ++ ++#endif /* ifndef __x86_64__ */ ++ ++#endif /* defined __i386__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c +new file mode 100644 +index 0000000..06feaf2 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c +@@ -0,0 +1,734 @@ ++#ifdef __x86_64__ ++ ++/* ----------------------------------------------------------------------- ++ x86-ffi64.c - Copyright (c) 2002 Bo Thorsen ++ ++ x86-64 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++#include ++ ++#define MAX_GPR_REGS 6 ++#define MAX_SSE_REGS 8 ++ ++typedef struct RegisterArgs { ++ /* Registers for argument passing. */ ++ UINT64 gpr[MAX_GPR_REGS]; ++ __int128_t sse[MAX_SSE_REGS]; ++} RegisterArgs; ++ ++extern void ++ffi_call_unix64( ++ void* args, ++ unsigned long bytes, ++ unsigned flags, ++ void* raddr, ++ void (*fnaddr)(), ++ unsigned ssecount); ++ ++/* All reference to register classes here is identical to the code in ++ gcc/config/i386/i386.c. Do *not* change one without the other. */ ++ ++/* Register class used for passing given 64bit part of the argument. ++ These represent classes as documented by the PS ABI, with the exception ++ of SSESF, SSEDF classes, that are basically SSE class, just gcc will ++ use SF or DFmode move instead of DImode to avoid reformating penalties. ++ ++ Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves ++ whenever possible (upper half does contain padding). */ ++enum x86_64_reg_class ++{ ++ X86_64_NO_CLASS, ++ X86_64_INTEGER_CLASS, ++ X86_64_INTEGERSI_CLASS, ++ X86_64_SSE_CLASS, ++ X86_64_SSESF_CLASS, ++ X86_64_SSEDF_CLASS, ++ X86_64_SSEUP_CLASS, ++ X86_64_X87_CLASS, ++ X86_64_X87UP_CLASS, ++ X86_64_COMPLEX_X87_CLASS, ++ X86_64_MEMORY_CLASS ++}; ++ ++#define MAX_CLASSES 4 ++#define SSE_CLASS_P(X) ((X) >= X86_64_SSE_CLASS && X <= X86_64_SSEUP_CLASS) ++ ++/* x86-64 register passing implementation. See x86-64 ABI for details. Goal ++ of this code is to classify each 8bytes of incoming argument by the register ++ class and assign registers accordingly. */ ++ ++/* Return the union class of CLASS1 and CLASS2. ++ See the x86-64 PS ABI for details. */ ++static enum x86_64_reg_class ++merge_classes( ++ enum x86_64_reg_class class1, ++ enum x86_64_reg_class class2) ++{ ++ /* Rule #1: If both classes are equal, this is the resulting class. */ ++ if (class1 == class2) ++ return class1; ++ ++ /* Rule #2: If one of the classes is NO_CLASS, the resulting class is ++ the other class. */ ++ if (class1 == X86_64_NO_CLASS) ++ return class2; ++ ++ if (class2 == X86_64_NO_CLASS) ++ return class1; ++ ++ /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */ ++ if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS) ++ return X86_64_MEMORY_CLASS; ++ ++ /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */ ++ if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS) ++ || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS)) ++ return X86_64_INTEGERSI_CLASS; ++ ++ if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS ++ || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS) ++ return X86_64_INTEGER_CLASS; ++ ++ /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class, ++ MEMORY is used. */ ++ if (class1 == X86_64_X87_CLASS ++ || class1 == X86_64_X87UP_CLASS ++ || class1 == X86_64_COMPLEX_X87_CLASS ++ || class2 == X86_64_X87_CLASS ++ || class2 == X86_64_X87UP_CLASS ++ || class2 == X86_64_COMPLEX_X87_CLASS) ++ return X86_64_MEMORY_CLASS; ++ ++ /* Rule #6: Otherwise class SSE is used. */ ++ return X86_64_SSE_CLASS; ++} ++ ++/* Classify the argument of type TYPE and mode MODE. ++ CLASSES will be filled by the register class used to pass each word ++ of the operand. The number of words is returned. In case the parameter ++ should be passed in memory, 0 is returned. As a special case for zero ++ sized containers, classes[0] will be NO_CLASS and 1 is returned. ++ ++ See the x86-64 PS ABI for details. */ ++ ++static int ++classify_argument( ++ ffi_type* type, ++ enum x86_64_reg_class classes[], ++ size_t byte_offset) ++{ ++ switch (type->type) ++ { ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_POINTER: ++#if 0 ++ if (byte_offset + type->size <= 4) ++ classes[0] = X86_64_INTEGERSI_CLASS; ++ else ++ classes[0] = X86_64_INTEGER_CLASS; ++ ++ return 1; ++#else ++ { ++ int size = byte_offset + type->size; ++ ++ if (size <= 4) ++ { ++ classes[0] = X86_64_INTEGERSI_CLASS; ++ return 1; ++ } ++ else if (size <= 8) ++ { ++ classes[0] = X86_64_INTEGER_CLASS; ++ return 1; ++ } ++ else if (size <= 12) ++ { ++ classes[0] = X86_64_INTEGER_CLASS; ++ classes[1] = X86_64_INTEGERSI_CLASS; ++ return 2; ++ } ++ else if (size <= 16) ++ { ++ classes[0] = classes[1] = X86_64_INTEGERSI_CLASS; ++ return 2; ++ } ++ else ++ FFI_ASSERT (0); ++ } ++#endif ++ ++ case FFI_TYPE_FLOAT: ++ if (byte_offset == 0) ++ classes[0] = X86_64_SSESF_CLASS; ++ else ++ classes[0] = X86_64_SSE_CLASS; ++ ++ return 1; ++ ++ case FFI_TYPE_DOUBLE: ++ classes[0] = X86_64_SSEDF_CLASS; ++ return 1; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ classes[0] = X86_64_X87_CLASS; ++ classes[1] = X86_64_X87UP_CLASS; ++ return 2; ++ ++ case FFI_TYPE_STRUCT: ++ { ++ ffi_type** ptr; ++ int i; ++ enum x86_64_reg_class subclasses[MAX_CLASSES]; ++ const int UNITS_PER_WORD = 8; ++ int words = ++ (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; ++ ++ /* If the struct is larger than 16 bytes, pass it on the stack. */ ++ if (type->size > 16) ++ return 0; ++ ++ for (i = 0; i < words; i++) ++ classes[i] = X86_64_NO_CLASS; ++ ++ /* Merge the fields of structure. */ ++ for (ptr = type->elements; *ptr != NULL; ptr++) ++ { ++ byte_offset = ALIGN(byte_offset, (*ptr)->alignment); ++ ++ int num = classify_argument(*ptr, subclasses, byte_offset % 8); ++ ++ if (num == 0) ++ return 0; ++ ++ int pos = byte_offset / 8; ++ ++ for (i = 0; i < num; i++) ++ { ++ classes[i + pos] = ++ merge_classes(subclasses[i], classes[i + pos]); ++ } ++ ++ byte_offset += (*ptr)->size; ++ } ++ ++ if (words > 2) ++ { ++ /* When size > 16 bytes, if the first one isn't ++ X86_64_SSE_CLASS or any other ones aren't ++ X86_64_SSEUP_CLASS, everything should be passed in ++ memory. */ ++ if (classes[0] != X86_64_SSE_CLASS) ++ return 0; ++ ++ for (i = 1; i < words; i++) ++ if (classes[i] != X86_64_SSEUP_CLASS) ++ return 0; ++ } ++ ++ ++ /* Final merger cleanup. */ ++ for (i = 0; i < words; i++) ++ { ++ /* If one class is MEMORY, everything should be passed in ++ memory. */ ++ if (classes[i] == X86_64_MEMORY_CLASS) ++ return 0; ++ ++ /* The X86_64_SSEUP_CLASS should be always preceded by ++ X86_64_SSE_CLASS. */ ++ if (classes[i] == X86_64_SSEUP_CLASS ++ && classes[i - 1] != X86_64_SSE_CLASS ++ && classes[i - 1] != X86_64_SSEUP_CLASS) ++ { ++ FFI_ASSERT(i != 0); ++ classes[i] = X86_64_SSE_CLASS; ++ } ++ ++ /* X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS. */ ++ if (classes[i] == X86_64_X87UP_CLASS ++ && classes[i - 1] != X86_64_X87_CLASS) ++ { ++ FFI_ASSERT(i != 0); ++ classes[i] = X86_64_SSE_CLASS; ++ } ++ } ++ ++ return words; ++ } ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ ++ return 0; /* Never reached. */ ++} ++ ++/* Examine the argument and return set number of register required in each ++ class. Return zero if parameter should be passed in memory, otherwise ++ the number of registers. */ ++static int ++examine_argument( ++ ffi_type* type, ++ enum x86_64_reg_class classes[MAX_CLASSES], ++ _Bool in_return, ++ int* pngpr, ++ int* pnsse) ++{ ++ int n = classify_argument(type, classes, 0); ++ int ngpr = 0; ++ int nsse = 0; ++ int i; ++ ++ if (n == 0) ++ return 0; ++ ++ for (i = 0; i < n; ++i) ++ { ++ switch (classes[i]) ++ { ++ case X86_64_INTEGER_CLASS: ++ case X86_64_INTEGERSI_CLASS: ++ ngpr++; ++ break; ++ ++ case X86_64_SSE_CLASS: ++ case X86_64_SSESF_CLASS: ++ case X86_64_SSEDF_CLASS: ++ nsse++; ++ break; ++ ++ case X86_64_NO_CLASS: ++ case X86_64_SSEUP_CLASS: ++ break; ++ ++ case X86_64_X87_CLASS: ++ case X86_64_X87UP_CLASS: ++ case X86_64_COMPLEX_X87_CLASS: ++ return in_return != 0; ++ ++ default: ++ abort(); ++ } ++ } ++ ++ *pngpr = ngpr; ++ *pnsse = nsse; ++ ++ return n; ++} ++ ++/* Perform machine dependent cif processing. */ ++ffi_status ++ffi_prep_cif_machdep( ++ ffi_cif* cif) ++{ ++ int gprcount = 0; ++ int ssecount = 0; ++ int flags = cif->rtype->type; ++ int i, avn, n, ngpr, nsse; ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ size_t bytes; ++ ++ if (flags != FFI_TYPE_VOID) ++ { ++ n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); ++ ++ if (n == 0) ++ { ++ /* The return value is passed in memory. A pointer to that ++ memory is the first argument. Allocate a register for it. */ ++ gprcount++; ++ ++ /* We don't have to do anything in asm for the return. */ ++ flags = FFI_TYPE_VOID; ++ } ++ else if (flags == FFI_TYPE_STRUCT) ++ { ++ /* Mark which registers the result appears in. */ ++ _Bool sse0 = SSE_CLASS_P(classes[0]); ++ _Bool sse1 = n == 2 && SSE_CLASS_P(classes[1]); ++ ++ if (sse0 && !sse1) ++ flags |= 1 << 8; ++ else if (!sse0 && sse1) ++ flags |= 1 << 9; ++ else if (sse0 && sse1) ++ flags |= 1 << 10; ++ ++ /* Mark the true size of the structure. */ ++ flags |= cif->rtype->size << 12; ++ } ++ } ++ ++ /* Go over all arguments and determine the way they should be passed. ++ If it's in a register and there is space for it, let that be so. If ++ not, add it's size to the stack byte count. */ ++ for (bytes = 0, i = 0, avn = cif->nargs; i < avn; i++) ++ { ++ if (examine_argument(cif->arg_types[i], classes, 0, &ngpr, &nsse) == 0 ++ || gprcount + ngpr > MAX_GPR_REGS ++ || ssecount + nsse > MAX_SSE_REGS) ++ { ++ long align = cif->arg_types[i]->alignment; ++ ++ if (align < 8) ++ align = 8; ++ ++ bytes = ALIGN(bytes, align); ++ bytes += cif->arg_types[i]->size; ++ } ++ else ++ { ++ gprcount += ngpr; ++ ssecount += nsse; ++ } ++ } ++ ++ if (ssecount) ++ flags |= 1 << 11; ++ ++ cif->flags = flags; ++ cif->bytes = bytes; ++ cif->bytes = ALIGN(bytes,8); ++ ++ return FFI_OK; ++} ++ ++void ++ffi_call( ++ ffi_cif* cif, ++ void (*fn)(), ++ void* rvalue, ++ void** avalue) ++{ ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ char* stack; ++ char* argp; ++ ffi_type** arg_types; ++ int gprcount, ssecount, ngpr, nsse, i, avn; ++ _Bool ret_in_memory; ++ RegisterArgs* reg_args; ++ ++ /* Can't call 32-bit mode from 64-bit mode. */ ++ FFI_ASSERT(cif->abi == FFI_UNIX64); ++ ++ /* If the return value is a struct and we don't have a return value ++ address then we need to make one. Note the setting of flags to ++ VOID above in ffi_prep_cif_machdep. */ ++ ret_in_memory = (cif->rtype->type == FFI_TYPE_STRUCT ++ && (cif->flags & 0xff) == FFI_TYPE_VOID); ++ ++ if (rvalue == NULL && ret_in_memory) ++ rvalue = alloca (cif->rtype->size); ++ ++ /* Allocate the space for the arguments, plus 4 words of temp space. */ ++ stack = alloca(sizeof(RegisterArgs) + cif->bytes + 4 * 8); ++ reg_args = (RegisterArgs*)stack; ++ argp = stack + sizeof(RegisterArgs); ++ ++ gprcount = ssecount = 0; ++ ++ /* If the return value is passed in memory, add the pointer as the ++ first integer argument. */ ++ if (ret_in_memory) ++ reg_args->gpr[gprcount++] = (long) rvalue; ++ ++ avn = cif->nargs; ++ arg_types = cif->arg_types; ++ ++ for (i = 0; i < avn; ++i) ++ { ++ size_t size = arg_types[i]->size; ++ int n; ++ ++ n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); ++ ++ if (n == 0 ++ || gprcount + ngpr > MAX_GPR_REGS ++ || ssecount + nsse > MAX_SSE_REGS) ++ { ++ long align = arg_types[i]->alignment; ++ ++ /* Stack arguments are *always* at least 8 byte aligned. */ ++ if (align < 8) ++ align = 8; ++ ++ /* Pass this argument in memory. */ ++ argp = (void *) ALIGN (argp, align); ++ memcpy (argp, avalue[i], size); ++ argp += size; ++ } ++ else ++ { /* The argument is passed entirely in registers. */ ++ char *a = (char *) avalue[i]; ++ int j; ++ ++ for (j = 0; j < n; j++, a += 8, size -= 8) ++ { ++ switch (classes[j]) ++ { ++ case X86_64_INTEGER_CLASS: ++ case X86_64_INTEGERSI_CLASS: ++ reg_args->gpr[gprcount] = 0; ++ switch (arg_types[i]->type) { ++ case FFI_TYPE_SINT8: ++ { ++ int8_t shortval = *(int8_t*)a; ++ int64_t actval = (int64_t)shortval; ++ reg_args->gpr[gprcount] = actval; ++ /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ ++ break; ++ } ++ ++ case FFI_TYPE_SINT16: ++ { ++ int16_t shortval = *(int16_t*)a; ++ int64_t actval = (int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ case FFI_TYPE_SINT32: ++ { ++ int32_t shortval = *(int32_t*)a; ++ int64_t actval = (int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ case FFI_TYPE_UINT8: ++ { ++ u_int8_t shortval = *(u_int8_t*)a; ++ u_int64_t actval = (u_int64_t)shortval; ++ /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ ++ reg_args->gpr[gprcount] = actval; ++ break; ++ } ++ ++ case FFI_TYPE_UINT16: ++ { ++ u_int16_t shortval = *(u_int16_t*)a; ++ u_int64_t actval = (u_int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ case FFI_TYPE_UINT32: ++ { ++ u_int32_t shortval = *(u_int32_t*)a; ++ u_int64_t actval = (u_int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ default: ++ //memcpy (®_args->gpr[gprcount], a, size < 8 ? size : 8); ++ reg_args->gpr[gprcount] = *(int64_t*)a; ++ } ++ gprcount++; ++ break; ++ ++ case X86_64_SSE_CLASS: ++ case X86_64_SSEDF_CLASS: ++ reg_args->sse[ssecount++] = *(UINT64 *) a; ++ break; ++ ++ case X86_64_SSESF_CLASS: ++ reg_args->sse[ssecount++] = *(UINT32 *) a; ++ break; ++ ++ default: ++ abort(); ++ } ++ } ++ } ++ } ++ ++ ffi_call_unix64 (stack, cif->bytes + sizeof(RegisterArgs), ++ cif->flags, rvalue, fn, ssecount); ++} ++ ++extern void ffi_closure_unix64(void); ++ ++ffi_status ++ffi_prep_closure( ++ ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*, void*, void**, void*), ++ void* user_data) ++{ ++ if (cif->abi != FFI_UNIX64) ++ return FFI_BAD_ABI; ++ ++ volatile unsigned short* tramp = ++ (volatile unsigned short*)&closure->tramp[0]; ++ ++ tramp[0] = 0xbb49; /* mov , %r11 */ ++ *(void* volatile*)&tramp[1] = ffi_closure_unix64; ++ tramp[5] = 0xba49; /* mov , %r10 */ ++ *(void* volatile*)&tramp[6] = closure; ++ ++ /* Set the carry bit if the function uses any sse registers. ++ This is clc or stc, together with the first byte of the jmp. */ ++ tramp[10] = cif->flags & (1 << 11) ? 0x49f9 : 0x49f8; ++ tramp[11] = 0xe3ff; /* jmp *%r11 */ ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ ++ return FFI_OK; ++} ++ ++#pragma clang diagnostic push ++#pragma clang diagnostic ignored "-Wmissing-prototypes" ++int ++ffi_closure_unix64_inner( ++ ffi_closure* closure, ++ void* rvalue, ++ RegisterArgs* reg_args, ++ char* argp) ++#pragma clang diagnostic pop ++{ ++ ffi_cif* cif = closure->cif; ++ void** avalue = alloca(cif->nargs * sizeof(void *)); ++ ffi_type** arg_types; ++ long i, avn; ++ int gprcount = 0; ++ int ssecount = 0; ++ int ngpr, nsse; ++ int ret; ++ ++ ret = cif->rtype->type; ++ ++ if (ret != FFI_TYPE_VOID) ++ { ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ int n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); ++ ++ if (n == 0) ++ { ++ /* The return value goes in memory. Arrange for the closure ++ return value to go directly back to the original caller. */ ++ rvalue = (void *) reg_args->gpr[gprcount++]; ++ ++ /* We don't have to do anything in asm for the return. */ ++ ret = FFI_TYPE_VOID; ++ } ++ else if (ret == FFI_TYPE_STRUCT && n == 2) ++ { ++ /* Mark which register the second word of the structure goes in. */ ++ _Bool sse0 = SSE_CLASS_P (classes[0]); ++ _Bool sse1 = SSE_CLASS_P (classes[1]); ++ ++ if (!sse0 && sse1) ++ ret |= 1 << 8; ++ else if (sse0 && !sse1) ++ ret |= 1 << 9; ++ } ++ } ++ ++ avn = cif->nargs; ++ arg_types = cif->arg_types; ++ ++ for (i = 0; i < avn; ++i) ++ { ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ int n; ++ ++ n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); ++ ++ if (n == 0 ++ || gprcount + ngpr > MAX_GPR_REGS ++ || ssecount + nsse > MAX_SSE_REGS) ++ { ++ long align = arg_types[i]->alignment; ++ ++ /* Stack arguments are *always* at least 8 byte aligned. */ ++ if (align < 8) ++ align = 8; ++ ++ /* Pass this argument in memory. */ ++ argp = (void *) ALIGN (argp, align); ++ avalue[i] = argp; ++ argp += arg_types[i]->size; ++ } ++ ++#if !defined(X86_DARWIN) ++ /* If the argument is in a single register, or two consecutive ++ registers, then we can use that address directly. */ ++ else if (n == 1 || (n == 2 && ++ SSE_CLASS_P (classes[0]) == SSE_CLASS_P (classes[1]))) ++ { ++ // The argument is in a single register. ++ if (SSE_CLASS_P (classes[0])) ++ { ++ avalue[i] = ®_args->sse[ssecount]; ++ ssecount += n; ++ } ++ else ++ { ++ avalue[i] = ®_args->gpr[gprcount]; ++ gprcount += n; ++ } ++ } ++#endif ++ ++ /* Otherwise, allocate space to make them consecutive. */ ++ else ++ { ++ char *a = alloca (16); ++ int j; ++ ++ avalue[i] = a; ++ ++ for (j = 0; j < n; j++, a += 8) ++ { ++ if (SSE_CLASS_P (classes[j])) ++ memcpy (a, ®_args->sse[ssecount++], 8); ++ else ++ memcpy (a, ®_args->gpr[gprcount++], 8); ++ } ++ } ++ } ++ ++ /* Invoke the closure. */ ++ closure->fun (cif, rvalue, avalue, closure->user_data); ++ ++ /* Tell assembly how to perform return type promotions. */ ++ return ret; ++} ++ ++#endif /* __x86_64__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c +new file mode 100644 +index 0000000..706ea0f +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c +@@ -0,0 +1,438 @@ ++#ifdef __i386__ ++/* ----------------------------------------------------------------------- ++ ffi.c - Copyright (c) 1996, 1998, 1999, 2001 Red Hat, Inc. ++ Copyright (c) 2002 Ranjit Mathew ++ Copyright (c) 2002 Bo Thorsen ++ Copyright (c) 2002 Roger Sayle ++ ++ x86 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++ ++/* ffi_prep_args is called by the assembly routine once stack space ++ has been allocated for the function's arguments */ ++ ++void ffi_prep_args(char *stack, extended_cif *ecif); ++ ++void ffi_prep_args(char *stack, extended_cif *ecif) ++{ ++ register unsigned int i; ++ register void **p_argv; ++ register char *argp; ++ register ffi_type **p_arg; ++ ++ argp = stack; ++ ++ if (ecif->cif->flags == FFI_TYPE_STRUCT) ++ { ++ *(void **) argp = ecif->rvalue; ++ argp += 4; ++ } ++ ++ p_argv = ecif->avalue; ++ ++ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; ++ i != 0; ++ i--, p_arg++) ++ { ++ size_t z; ++ ++ /* Align if necessary */ ++ if ((sizeof(int) - 1) & (unsigned) argp) ++ argp = (char *) ALIGN(argp, sizeof(int)); ++ ++ z = (*p_arg)->size; ++ if (z < sizeof(int)) ++ { ++ z = sizeof(int); ++ switch ((*p_arg)->type) ++ { ++ case FFI_TYPE_SINT8: ++ *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT8: ++ *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_SINT16: ++ *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT16: ++ *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_SINT32: ++ *(signed int *) argp = (signed int)*(SINT32 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT32: ++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ } ++ else ++ { ++ memcpy(argp, *p_argv, z); ++ } ++ p_argv++; ++ argp += z; ++ } ++ ++ return; ++} ++ ++/* Perform machine dependent cif processing */ ++ffi_status ffi_prep_cif_machdep(ffi_cif *cif) ++{ ++ /* Set the return type flag */ ++ switch (cif->rtype->type) ++ { ++ case FFI_TYPE_VOID: ++#ifdef X86 ++ case FFI_TYPE_STRUCT: ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_SINT16: ++#endif ++ ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ case FFI_TYPE_LONGDOUBLE: ++ cif->flags = (unsigned) cif->rtype->type; ++ break; ++ ++ case FFI_TYPE_UINT64: ++ cif->flags = FFI_TYPE_SINT64; ++ break; ++ ++#ifndef X86 ++ case FFI_TYPE_STRUCT: ++ if (cif->rtype->size == 1) ++ { ++ cif->flags = FFI_TYPE_SINT8; /* same as char size */ ++ } ++ else if (cif->rtype->size == 2) ++ { ++ cif->flags = FFI_TYPE_SINT16; /* same as short size */ ++ } ++ else if (cif->rtype->size == 4) ++ { ++ cif->flags = FFI_TYPE_INT; /* same as int type */ ++ } ++ else if (cif->rtype->size == 8) ++ { ++ cif->flags = FFI_TYPE_SINT64; /* same as int64 type */ ++ } ++ else ++ { ++ cif->flags = FFI_TYPE_STRUCT; ++ } ++ break; ++#endif ++ ++ default: ++ cif->flags = FFI_TYPE_INT; ++ break; ++ } ++ ++#ifdef X86_DARWIN ++ cif->bytes = (cif->bytes + 15) & ~0xF; ++#endif ++ ++ return FFI_OK; ++} ++ ++extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, ++ unsigned, unsigned, unsigned *, void (*fn)()); ++ ++#ifdef X86_WIN32 ++extern void ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, ++ unsigned, unsigned, unsigned *, void (*fn)()); ++ ++#endif /* X86_WIN32 */ ++ ++void ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue) ++{ ++ extended_cif ecif; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return */ ++ /* value address then we need to make one */ ++ ++ if ((rvalue == NULL) && ++ (cif->flags == FFI_TYPE_STRUCT)) ++ { ++ ecif.rvalue = alloca(cif->rtype->size); ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ ++ switch (cif->abi) ++ { ++ case FFI_SYSV: ++ ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, ++ fn); ++ break; ++#ifdef X86_WIN32 ++ case FFI_STDCALL: ++ ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ break; ++#endif /* X86_WIN32 */ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++ ++/** private members **/ ++ ++static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, ++ void** args, ffi_cif* cif); ++void FFI_HIDDEN ffi_closure_SYSV (ffi_closure *) ++__attribute__ ((regparm(1))); ++unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *) ++__attribute__ ((regparm(1))); ++void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *) ++__attribute__ ((regparm(1))); ++ ++/* This function is jumped to by the trampoline */ ++ ++unsigned int FFI_HIDDEN ++ffi_closure_SYSV_inner (closure, respp, args) ++ffi_closure *closure; ++void **respp; ++void *args; ++{ ++ // our various things... ++ ffi_cif *cif; ++ void **arg_area; ++ ++ cif = closure->cif; ++ arg_area = (void**) alloca (cif->nargs * sizeof (void*)); ++ ++ /* this call will initialize ARG_AREA, such that each ++ * element in that array points to the corresponding ++ * value on the stack; and if the function returns ++ * a structure, it will re-set RESP to point to the ++ * structure return address. */ ++ ++ ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); ++ ++ (closure->fun) (cif, *respp, arg_area, closure->user_data); ++ ++ return cif->flags; ++} ++ ++static void ++ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue, ++ ffi_cif *cif) ++{ ++ register unsigned int i; ++ register void **p_argv; ++ register char *argp; ++ register ffi_type **p_arg; ++ ++ argp = stack; ++ ++ if ( cif->flags == FFI_TYPE_STRUCT ) { ++ *rvalue = *(void **) argp; ++ argp += 4; ++ } ++ ++ p_argv = avalue; ++ ++ for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) ++ { ++ size_t z; ++ ++ /* Align if necessary */ ++ if ((sizeof(int) - 1) & (unsigned) argp) { ++ argp = (char *) ALIGN(argp, sizeof(int)); ++ } ++ ++ z = (*p_arg)->size; ++ ++ /* because we're little endian, this is what it turns into. */ ++ ++ *p_argv = (void*) argp; ++ ++ p_argv++; ++ argp += z; ++ } ++ ++ return; ++} ++ ++/* How to make a trampoline. Derived from gcc/config/i386/i386.c. */ ++ ++#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ ++({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ ++unsigned int __fun = (unsigned int)(FUN); \ ++unsigned int __ctx = (unsigned int)(CTX); \ ++unsigned int __dis = __fun - (__ctx + FFI_TRAMPOLINE_SIZE); \ ++*(unsigned char*) &__tramp[0] = 0xb8; \ ++*(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \ ++*(unsigned char *) &__tramp[5] = 0xe9; \ ++*(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \ ++}) ++ ++ ++/* the cif must already be prep'ed */ ++ffi_status ++ffi_prep_closure (ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,void**,void*), ++ void *user_data) ++{ ++ if (cif->abi != FFI_SYSV) ++ return FFI_BAD_ABI; ++ ++ FFI_INIT_TRAMPOLINE (&closure->tramp[0], \ ++ &ffi_closure_SYSV, \ ++ (void*)closure); ++ ++ closure->cif = cif; ++ closure->user_data = user_data; ++ closure->fun = fun; ++ ++ return FFI_OK; ++} ++ ++/* ------- Native raw API support -------------------------------- */ ++ ++#if !FFI_NO_RAW_API ++ ++ffi_status ++ffi_prep_raw_closure_loc (ffi_raw_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), ++ void *user_data, ++ void *codeloc) ++{ ++ int i; ++ ++ FFI_ASSERT (cif->abi == FFI_SYSV); ++ ++ // we currently don't support certain kinds of arguments for raw ++ // closures. This should be implemented by a separate assembly language ++ // routine, since it would require argument processing, something we ++ // don't do now for performance. ++ ++ for (i = cif->nargs-1; i >= 0; i--) ++ { ++ FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_STRUCT); ++ FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_LONGDOUBLE); ++ } ++ ++ ++ FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_raw_SYSV, ++ codeloc); ++ ++ closure->cif = cif; ++ closure->user_data = user_data; ++ closure->fun = fun; ++ ++ return FFI_OK; ++} ++ ++static void ++ffi_prep_args_raw(char *stack, extended_cif *ecif) ++{ ++ memcpy (stack, ecif->avalue, ecif->cif->bytes); ++} ++ ++/* we borrow this routine from libffi (it must be changed, though, to ++ * actually call the function passed in the first argument. as of ++ * libffi-1.20, this is not the case.) ++ */ ++ ++extern void ++ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, unsigned, ++ unsigned, unsigned *, void (*fn)()); ++ ++#ifdef X86_WIN32 ++extern void ++ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, unsigned, ++ unsigned, unsigned *, void (*fn)()); ++#endif /* X86_WIN32 */ ++ ++void ++ffi_raw_call(ffi_cif *cif, void (*fn)(), void *rvalue, ffi_raw *fake_avalue) ++{ ++ extended_cif ecif; ++ void **avalue = (void **)fake_avalue; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return */ ++ /* value address then we need to make one */ ++ ++ if ((rvalue == NULL) && ++ (cif->rtype->type == FFI_TYPE_STRUCT)) ++ { ++ ecif.rvalue = alloca(cif->rtype->size); ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ ++ switch (cif->abi) ++ { ++ case FFI_SYSV: ++ ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ break; ++#ifdef X86_WIN32 ++ case FFI_STDCALL: ++ ffi_call_STDCALL(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ break; ++#endif /* X86_WIN32 */ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++#endif ++#endif // __i386__ +diff -r -u ./setup.py ./setup.py +index 46b92fe..2bf6b4b 100644 +--- ./setup.py ++++ ./setup.py +@@ -98,8 +98,14 @@ class PyBuildExt(build_ext): + self.detect_modules() + + # Remove modules that are present on the disabled list +- self.extensions = [ext for ext in self.extensions +- if ext.name not in disabled_module_list] ++ extensions = [ext for ext in self.extensions ++ if ext.name not in disabled_module_list] ++ # move ctypes to the end, it depends on other modules ++ ext_map = dict((ext.name, i) for i, ext in enumerate(extensions)) ++ if "_ctypes" in ext_map: ++ ctypes = extensions.pop(ext_map["_ctypes"]) ++ extensions.append(ctypes) ++ self.extensions = extensions + + # Fix up the autodetected modules, prefixing all the source files + # with Modules/ and adding Python's include directory to the path. +@@ -1330,9 +1336,39 @@ class PyBuildExt(build_ext): + # *** Uncomment these for TOGL extension only: + # -lGL -lGLU -lXext -lXmu \ + ++ def configure_ctypes_darwin(self, ext): ++ # Darwin (OS X) uses preconfigured files, in ++ # the Modules/_ctypes/libffi_osx directory. ++ srcdir = sysconfig.get_config_var('srcdir') ++ ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', ++ '_ctypes', 'libffi_osx')) ++ sources = [os.path.join(ffi_srcdir, p) ++ for p in ['ffi.c', ++ 'x86/darwin64.S', ++ 'x86/x86-darwin.S', ++ 'x86/x86-ffi_darwin.c', ++ 'x86/x86-ffi64.c', ++ 'powerpc/ppc-darwin.S', ++ 'powerpc/ppc-darwin_closure.S', ++ 'powerpc/ppc-ffi_darwin.c', ++ 'powerpc/ppc64-darwin_closure.S', ++ ]] ++ ++ # Add .S (preprocessed assembly) to C compiler source extensions. ++ self.compiler.src_extensions.append('.S') ++ ++ include_dirs = [os.path.join(ffi_srcdir, 'include'), ++ os.path.join(ffi_srcdir, 'powerpc')] ++ ext.include_dirs.extend(include_dirs) ++ ext.sources.extend(sources) ++ return True ++ + def configure_ctypes(self, ext): + if not self.use_system_libffi: +- (srcdir,) = sysconfig.get_config_vars('srcdir') ++ if sys.platform == 'darwin': ++ return self.configure_ctypes_darwin(ext) ++ ++ srcdir = sysconfig.get_config_var('srcdir') + ffi_builddir = os.path.join(self.build_temp, 'libffi') + ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', + '_ctypes', 'libffi')) +@@ -1347,7 +1383,10 @@ class PyBuildExt(build_ext): + ffi_configfile): + from distutils.dir_util import mkpath + mkpath(ffi_builddir) +- config_args = [] ++ config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split() ++ if (('--host=' in arg) or ('--build=' in arg))] ++ if not self.verbose: ++ config_args.append("-q") + + # Pass empty CFLAGS because we'll just append the resulting + # CFLAGS to Python's; -g or -O2 is to be avoided. +@@ -1367,10 +1406,12 @@ class PyBuildExt(build_ext): + self.compiler.src_extensions.append('.S') + + include_dirs = [os.path.join(ffi_builddir, 'include'), +- ffi_builddir, ffi_srcdir] ++ ffi_builddir, ++ os.path.join(ffi_srcdir, 'src')] + extra_compile_args = fficonfig['ffi_cflags'].split() + +- ext.sources.extend(fficonfig['ffi_sources']) ++ ext.sources.extend(os.path.join(ffi_srcdir, f) for f in ++ fficonfig['ffi_sources']) + ext.include_dirs.extend(include_dirs) + ext.extra_compile_args.extend(extra_compile_args) + return True +@@ -1390,6 +1431,7 @@ class PyBuildExt(build_ext): + + if sys.platform == 'darwin': + sources.append('_ctypes/darwin/dlfcn_simple.c') ++ extra_compile_args.append('-DMACOSX') + include_dirs.append('_ctypes/darwin') + # XXX Is this still needed? + ## extra_link_args.extend(['-read_only_relocs', 'warning']) +@@ -1419,7 +1461,14 @@ class PyBuildExt(build_ext): + if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"): + return + +- ffi_inc = find_file('ffi.h', [], inc_dirs) ++ if sys.platform == 'darwin': ++ # OS X 10.5 comes with libffi.dylib; the include files are ++ # in /usr/include/ffi ++ inc_dirs.append('/usr/include/ffi') ++ ++ ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] ++ if not ffi_inc or ffi_inc[0] == '': ++ ffi_inc = find_file('ffi.h', [], inc_dirs) + if ffi_inc is not None: + ffi_h = ffi_inc[0] + '/ffi.h' + fp = open(ffi_h) diff --git a/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/005_osx_failed_modules.patch b/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/005_osx_failed_modules.patch new file mode 100644 index 0000000..5ccfe9c --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/005_osx_failed_modules.patch @@ -0,0 +1,124 @@ +diff -r -u ./Mac/Modules/cg/_CGmodule.c ./Mac/Modules/cg/_CGmodule.c +index 8115614..e36fce9 100755 +--- ./Mac/Modules/cg/_CGmodule.c ++++ ./Mac/Modules/cg/_CGmodule.c +@@ -1025,6 +1025,7 @@ static PyObject *CGContextRefObj_CGContextSetShouldAntialias(CGContextRefObject + return _res; + } + ++#ifndef __LP64__ + static PyObject *CGContextRefObj_SyncCGContextOriginWithPort(CGContextRefObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1055,6 +1056,7 @@ static PyObject *CGContextRefObj_ClipCGContextToRegion(CGContextRefObject *_self + _res = Py_None; + return _res; + } ++#endif + + static PyMethodDef CGContextRefObj_methods[] = { + {"CGContextSaveGState", (PyCFunction)CGContextRefObj_CGContextSaveGState, 1, +@@ -1173,10 +1175,12 @@ static PyMethodDef CGContextRefObj_methods[] = { + PyDoc_STR("() -> None")}, + {"CGContextSetShouldAntialias", (PyCFunction)CGContextRefObj_CGContextSetShouldAntialias, 1, + PyDoc_STR("(int shouldAntialias) -> None")}, ++#ifndef __LP64__ + {"SyncCGContextOriginWithPort", (PyCFunction)CGContextRefObj_SyncCGContextOriginWithPort, 1, + PyDoc_STR("(CGrafPtr port) -> None")}, + {"ClipCGContextToRegion", (PyCFunction)CGContextRefObj_ClipCGContextToRegion, 1, + PyDoc_STR("(Rect portRect, RgnHandle region) -> None")}, ++#endif + {NULL, NULL, 0} + }; + +@@ -1254,6 +1258,7 @@ PyTypeObject CGContextRef_Type = { + /* ------------------ End object type CGContextRef ------------------ */ + + ++#ifndef __LP64__ + static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1271,10 +1276,13 @@ static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) + return _res; + + } ++#endif + + static PyMethodDef CG_methods[] = { ++#ifndef __LP64__ + {"CreateCGContextForPort", (PyCFunction)CG_CreateCGContextForPort, 1, + PyDoc_STR("(CGrafPtr) -> CGContextRef")}, ++#endif + {NULL, NULL, 0} + }; + +diff -r -u ./Modules/_curses_panel.c ./Modules/_curses_panel.c +index 0acf3fd..1728b59 100644 +--- ./Modules/_curses_panel.c ++++ ./Modules/_curses_panel.c +@@ -56,7 +56,7 @@ typedef struct { + + PyTypeObject PyCursesPanel_Type; + +-#define PyCursesPanel_Check(v) ((v)->ob_type == &PyCursesPanel_Type) ++#define PyCursesPanel_Check(v) (Py_TYPE(v) == &PyCursesPanel_Type) + + /* Some helper functions. The problem is that there's always a window + associated with a panel. To ensure that Python's GC doesn't pull +@@ -178,12 +178,13 @@ PyCursesPanel_New(PANEL *pan, PyCursesWindowObject *wo) + po = PyObject_NEW(PyCursesPanelObject, &PyCursesPanel_Type); + if (po == NULL) return NULL; + po->pan = pan; +- po->wo = wo; +- Py_INCREF(wo); + if (insert_lop(po) < 0) { +- PyObject_DEL(po); +- return NULL; ++ po->wo = NULL; ++ Py_DECREF(po); ++ return NULL; + } ++ po->wo = wo; ++ Py_INCREF(wo); + return (PyObject *)po; + } + +@@ -191,8 +192,10 @@ static void + PyCursesPanel_Dealloc(PyCursesPanelObject *po) + { + (void)del_panel(po->pan); +- Py_DECREF(po->wo); +- remove_lop(po); ++ if (po->wo != NULL) { ++ Py_DECREF(po->wo); ++ remove_lop(po); ++ } + PyObject_DEL(po); + } + +@@ -338,11 +341,10 @@ PyCursesPanel_GetAttr(PyCursesPanelObject *self, char *name) + /* -------------------------------------------------------*/ + + PyTypeObject PyCursesPanel_Type = { +- PyObject_HEAD_INIT(NULL) +- 0, /*ob_size*/ +- "_curses_panel.curses panel", /*tp_name*/ +- sizeof(PyCursesPanelObject), /*tp_basicsize*/ +- 0, /*tp_itemsize*/ ++ PyVarObject_HEAD_INIT(NULL, 0) ++ "_curses_panel.curses panel", /*tp_name*/ ++ sizeof(PyCursesPanelObject), /*tp_basicsize*/ ++ 0, /*tp_itemsize*/ + /* methods */ + (destructor)PyCursesPanel_Dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ +@@ -458,7 +460,7 @@ init_curses_panel(void) + PyObject *m, *d, *v; + + /* Initialize object type */ +- PyCursesPanel_Type.ob_type = &PyType_Type; ++ Py_TYPE(&PyCursesPanel_Type) = &PyType_Type; + + import_curses(); + diff --git a/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/000_patch-setup.py.diff new file mode 100644 index 0000000..ffe4b0d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/000_patch-setup.py.diff @@ -0,0 +1,45 @@ +--- setup.py.orig 2011-07-07 19:19:43.800122463 +0900 ++++ setup.py 2011-07-07 19:25:04.548416377 +0900 +@@ -13,6 +13,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -242,10 +243,34 @@ + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ fp = open(tmpfile) ++ multiarch_path_component = fp.readline().strip() ++ fp.close() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. diff --git a/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/001_patch-svnversion.patch b/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/001_patch-svnversion.patch new file mode 100644 index 0000000..5ee39e9 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/001_patch-svnversion.patch @@ -0,0 +1,42 @@ +--- configure.in ++++ configure.in +@@ -767,7 +767,7 @@ + then + SVNVERSION="svnversion \$(srcdir)" + else +- SVNVERSION="echo exported" ++ SVNVERSION="echo Unversioned directory" + fi + + case $MACHDEP in +--- Makefile.pre.in ++++ Makefile.pre.in +@@ -501,7 +501,7 @@ + $(SIGNAL_OBJS) \ + $(MODOBJS) \ + $(srcdir)/Modules/getbuildinfo.c +- $(CC) -c $(PY_CFLAGS) -DSVNVERSION=\"`LC_ALL=C $(SVNVERSION)`\" -o $@ $(srcdir)/Modules/getbuildinfo.c ++ $(CC) -c $(PY_CFLAGS) -DSVNVERSION="\"`LC_ALL=C $(SVNVERSION)`\"" -o $@ $(srcdir)/Modules/getbuildinfo.c + + Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile + $(CC) -c $(PY_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ +--- Modules/getbuildinfo.c ++++ Modules/getbuildinfo.c +@@ -48,5 +48,5 @@ + static const char svnversion[] = SVNVERSION; + if (svnversion[0] != '$') + return svnversion; /* it was interpolated, or passed on command line */ +- return "exported"; ++ return "Unversioned directory"; + } +--- Python/sysmodule.c ++++ Python/sysmodule.c +@@ -1161,7 +1161,7 @@ + + + svnversion = _Py_svnversion(); +- if (strcmp(svnversion, "exported") != 0) ++ if (strcmp(svnversion, "Unversioned directory") != 0 && strcmp(svnversion, "exported") != 0) + svn_revision = svnversion; + else if (istag) { + len = strlen(_patchlevel_revision); diff --git a/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/002_darwin_c_source.patch b/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/002_darwin_c_source.patch new file mode 100644 index 0000000..8cef44a --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/002_darwin_c_source.patch @@ -0,0 +1,166 @@ +diff -r -u ./configure ../Python-2.5/configure +--- ./configure 2006-09-05 11:54:42.000000000 +0900 ++++ ../Python-2.5/configure 2013-07-19 15:27:46.000000000 +0900 +@@ -1396,6 +1396,16 @@ + _ACEOF + + ++# The later defininition of _XOPEN_SOURCE and _POSIX_C_SOURCE disables ++# certain features on Mac OS X, so we need _DARWIN_C_SOURCE to re-enable ++# them. ++ ++cat >>confdefs.h <<\_ACEOF ++#define _DARWIN_C_SOURCE 1 ++_ACEOF ++ ++ ++ + define_xopen_source=yes + + # Arguments passed to configure. +@@ -3885,11 +3895,110 @@ + ;; + # is there any other compiler on Darwin besides gcc? + Darwin*) +- BASECFLAGS="$BASECFLAGS -Wno-long-double -no-cpp-precomp -mno-fused-madd" ++ # -Wno-long-double, -no-cpp-precomp, and -mno-fused-madd ++ # used to be here, but non-Apple gcc doesn't accept them. ++ if test "${CC}" = gcc ++ then ++ { echo "$as_me:${as_lineno-$LINENO}: checking which compiler should be used" >&5 ++echo -n "checking which compiler should be used... " >&6; } ++ case "${UNIVERSALSDK}" in ++ */MacOSX10.4u.sdk) ++ # Build using 10.4 SDK, force usage of gcc when the ++ # compiler is gcc, otherwise the user will get very ++ # confusing error messages when building on OSX 10.6 ++ CC=gcc-4.0 ++ CPP=cpp-4.0 ++ ;; ++ esac ++ { echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 ++echo "$CC" >&6; } ++ fi ++ ++ + if test "${enable_universalsdk}"; then +- BASECFLAGS="-arch ppc -arch i386 -isysroot ${UNIVERSALSDK} ${BASECFLAGS}" ++ UNIVERSAL_ARCH_FLAGS="" ++ if test "$UNIVERSAL_ARCHS" = "32-bit" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch ppc -arch i386" ++ ARCH_RUN_32BIT="" ++ LIPO_32BIT_FLAGS="" ++ elif test "$UNIVERSAL_ARCHS" = "64-bit" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch ppc64 -arch x86_64" ++ LIPO_32BIT_FLAGS="" ++ ARCH_RUN_32BIT="true" ++ ++ elif test "$UNIVERSAL_ARCHS" = "all" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64" ++ LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" ++ ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" ++ ++ elif test "$UNIVERSAL_ARCHS" = "intel" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64" ++ LIPO_32BIT_FLAGS="-extract i386" ++ ARCH_RUN_32BIT="/usr/bin/arch -i386" ++ ++ elif test "$UNIVERSAL_ARCHS" = "3-way" ; then ++ UNIVERSAL_ARCH_FLAGS="-arch i386 -arch ppc -arch x86_64" ++ LIPO_32BIT_FLAGS="-extract ppc7400 -extract i386" ++ ARCH_RUN_32BIT="/usr/bin/arch -i386 -ppc" ++ ++ else ++ as_fn_error $? "proper usage is --with-universal-arch=32-bit|64-bit|all|intel|3-way" "$LINENO" 5 ++ ++ fi ++ ++ ++ CFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${CFLAGS}" ++ if test "${UNIVERSALSDK}" != "/" ++ then ++ CFLAGS="-isysroot ${UNIVERSALSDK} ${CFLAGS}" ++ LDFLAGS="-isysroot ${UNIVERSALSDK} ${LDFLAGS}" ++ CPPFLAGS="-isysroot ${UNIVERSALSDK} ${CPPFLAGS}" ++ fi + fi + ++ # Calculate the right deployment target for this build. ++ # ++ cur_target=`sw_vers -productVersion | sed 's/\(10\.[0-9]*\).*/\1/'` ++ if test ${cur_target} '>' 10.2 && \ ++ test ${cur_target} '<' 10.6 ++ then ++ cur_target=10.3 ++ if test ${enable_universalsdk}; then ++ if test "${UNIVERSAL_ARCHS}" = "all"; then ++ # Ensure that the default platform for a ++ # 4-way universal build is OSX 10.5, ++ # that's the first OS release where ++ # 4-way builds make sense. ++ cur_target='10.5' ++ ++ elif test "${UNIVERSAL_ARCHS}" = "3-way"; then ++ cur_target='10.5' ++ ++ elif test "${UNIVERSAL_ARCHS}" = "intel"; then ++ cur_target='10.5' ++ ++ elif test "${UNIVERSAL_ARCHS}" = "64-bit"; then ++ cur_target='10.5' ++ fi ++ else ++ if test `/usr/bin/arch` = "i386"; then ++ # On Intel macs default to a deployment ++ # target of 10.4, that's the first OSX ++ # release with Intel support. ++ cur_target="10.4" ++ fi ++ fi ++ fi ++ CONFIGURE_MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET-${cur_target}} ++ ++ # Make sure that MACOSX_DEPLOYMENT_TARGET is set in the ++ # environment with a value that is the same as what we'll use ++ # in the Makefile to ensure that we'll get the same compiler ++ # environment during configure and build time. ++ MACOSX_DEPLOYMENT_TARGET="$CONFIGURE_MACOSX_DEPLOYMENT_TARGET" ++ export MACOSX_DEPLOYMENT_TARGET ++ EXPORT_MACOSX_DEPLOYMENT_TARGET='' ++ + ;; + OSF*) + BASECFLAGS="$BASECFLAGS -mieee" +@@ -10851,7 +10960,7 @@ + if test "${enable_universalsdk}"; then + : + else +- LIBTOOL_CRUFT="${LIBTOOL_CRUFT} -arch_only `arch`" ++ LIBTOOL_CRUFT="${LIBTOOL_CRUFT}" + fi + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; +@@ -10863,7 +10972,7 @@ + else + LIBTOOL_CRUFT="" + fi +- LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs -arch_only `arch`" ++ LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs" + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; + esac +diff -r -u ./pyconfig.h.in ../Python-2.5/pyconfig.h.in +--- ./pyconfig.h.in 2006-07-30 23:09:47.000000000 +0900 ++++ ../Python-2.5/pyconfig.h.in 2013-07-17 23:12:31.000000000 +0900 +@@ -912,6 +912,11 @@ + /* Define on Irix to enable u_int */ + #undef _BSD_TYPES + ++/* Define on Darwin to activate all library features */ ++#ifndef _DARWIN_C_SOURCE ++#define _DARWIN_C_SOURCE ++#endif ++ + /* This must be set to 64 on some systems to enable large file support. */ + #undef _FILE_OFFSET_BITS + diff --git a/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/003_osx_lp64.patch b/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/003_osx_lp64.patch new file mode 100644 index 0000000..fc07fc1 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/003_osx_lp64.patch @@ -0,0 +1,271 @@ +diff -r -u ./Include/pymactoolbox.h ../Python-2.5/Include/pymactoolbox.h +--- ./Include/pymactoolbox.h 2004-11-05 16:02:59.000000000 +0900 ++++ ../Python-2.5/Include/pymactoolbox.h 2013-07-17 23:38:51.000000000 +0900 +@@ -8,7 +8,10 @@ + #endif + + #include ++ ++#ifndef __LP64__ + #include ++#endif /* !__LP64__ */ + + /* + ** Helper routines for error codes and such. +@@ -18,8 +21,11 @@ + PyObject *PyMac_GetOSErrException(void); /* Initialize & return it */ + PyObject *PyErr_Mac(PyObject *, int); /* Exception with a mac error */ + PyObject *PyMac_Error(OSErr); /* Uses PyMac_GetOSErrException */ ++#ifndef __LP64__ + extern OSErr PyMac_GetFullPathname(FSSpec *, char *, int); /* convert + fsspec->path */ ++#endif /* __LP64__ */ ++ + /* + ** These conversion routines are defined in mactoolboxglue.c itself. + */ +@@ -83,8 +89,10 @@ + #endif /* USE_TOOLBOX_OBJECT_GLUE */ + + /* macfs exports */ ++#ifndef __LP64__ + int PyMac_GetFSSpec(PyObject *, FSSpec *); /* argument parser for FSSpec */ + PyObject *PyMac_BuildFSSpec(FSSpec *); /* Convert FSSpec to PyObject */ ++#endif /* !__LP64__ */ + + int PyMac_GetFSRef(PyObject *, FSRef *); /* argument parser for FSRef */ + PyObject *PyMac_BuildFSRef(FSRef *); /* Convert FSRef to PyObject */ +@@ -101,39 +109,54 @@ + extern int CmpInstObj_Convert(PyObject *, ComponentInstance *); + + /* Ctl exports */ ++#ifndef __LP64__ + extern PyObject *CtlObj_New(ControlHandle); + extern int CtlObj_Convert(PyObject *, ControlHandle *); ++#endif /* !__LP64__ */ + + /* Dlg exports */ ++#ifndef __LP64__ + extern PyObject *DlgObj_New(DialogPtr); + extern int DlgObj_Convert(PyObject *, DialogPtr *); + extern PyObject *DlgObj_WhichDialog(DialogPtr); ++#endif /* !__LP64__ */ + + /* Drag exports */ ++#ifndef __LP64__ + extern PyObject *DragObj_New(DragReference); + extern int DragObj_Convert(PyObject *, DragReference *); ++#endif /* !__LP64__ */ + + /* List exports */ ++#ifndef __LP64__ + extern PyObject *ListObj_New(ListHandle); + extern int ListObj_Convert(PyObject *, ListHandle *); ++#endif /* !__LP64__ */ + + /* Menu exports */ ++#ifndef __LP64__ + extern PyObject *MenuObj_New(MenuHandle); + extern int MenuObj_Convert(PyObject *, MenuHandle *); ++#endif /* !__LP64__ */ + + /* Qd exports */ ++#ifndef __LP64__ + extern PyObject *GrafObj_New(GrafPtr); + extern int GrafObj_Convert(PyObject *, GrafPtr *); + extern PyObject *BMObj_New(BitMapPtr); + extern int BMObj_Convert(PyObject *, BitMapPtr *); + extern PyObject *QdRGB_New(RGBColor *); + extern int QdRGB_Convert(PyObject *, RGBColor *); ++#endif /* !__LP64__ */ + + /* Qdoffs exports */ ++#ifndef __LP64__ + extern PyObject *GWorldObj_New(GWorldPtr); + extern int GWorldObj_Convert(PyObject *, GWorldPtr *); ++#endif /* !__LP64__ */ + + /* Qt exports */ ++#ifndef __LP64__ + extern PyObject *TrackObj_New(Track); + extern int TrackObj_Convert(PyObject *, Track *); + extern PyObject *MovieObj_New(Movie); +@@ -146,6 +169,7 @@ + extern int UserDataObj_Convert(PyObject *, UserData *); + extern PyObject *MediaObj_New(Media); + extern int MediaObj_Convert(PyObject *, Media *); ++#endif /* !__LP64__ */ + + /* Res exports */ + extern PyObject *ResObj_New(Handle); +@@ -154,13 +178,17 @@ + extern int OptResObj_Convert(PyObject *, Handle *); + + /* TE exports */ ++#ifndef __LP64__ + extern PyObject *TEObj_New(TEHandle); + extern int TEObj_Convert(PyObject *, TEHandle *); ++#endif /* !__LP64__ */ + + /* Win exports */ ++#ifndef __LP64__ + extern PyObject *WinObj_New(WindowPtr); + extern int WinObj_Convert(PyObject *, WindowPtr *); + extern PyObject *WinObj_WhichWindow(WindowPtr); ++#endif /* !__LP64__ */ + + /* CF exports */ + extern PyObject *CFObj_New(CFTypeRef); +diff -r -u ./Mac/Modules/res/_Resmodule.c ../Python-2.5/Mac/Modules/res/_Resmodule.c +--- ./Mac/Modules/res/_Resmodule.c 2005-07-04 05:59:44.000000000 +0900 ++++ ../Python-2.5/Mac/Modules/res/_Resmodule.c 2013-07-17 23:38:51.000000000 +0900 +@@ -414,6 +414,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *ResObj_as_Control(ResourceObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -431,6 +432,7 @@ + return _res; + + } ++#endif /* !__LP64__ */ + + static PyObject *ResObj_LoadResource(ResourceObject *_self, PyObject *_args) + { +@@ -1152,6 +1154,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *Res_OpenRFPerm(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1287,6 +1290,7 @@ + _res = Py_None; + return _res; + } ++#endif /* !__LP64__ */ + + static PyObject *Res_InsertResourceFile(PyObject *_self, PyObject *_args) + { +@@ -1327,6 +1331,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *Res_FSpResourceFileAlreadyOpen(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1413,6 +1418,7 @@ + nextRefNum); + return _res; + } ++#endif /* !__LP64__ */ + + static PyObject *Res_FSOpenResFile(PyObject *_self, PyObject *_args) + { +@@ -1438,6 +1444,7 @@ + return _res; + } + ++#ifndef __LP64__ + static PyObject *Res_FSCreateResFile(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1534,6 +1541,7 @@ + PyMac_BuildFSSpec, &newSpec); + return _res; + } ++#endif /* __LP64__ */ + + static PyObject *Res_FSOpenResourceFile(PyObject *_self, PyObject *_args) + { +@@ -1637,6 +1645,7 @@ + PyDoc_STR("(short refNum) -> (short _rv)")}, + {"SetResFileAttrs", (PyCFunction)Res_SetResFileAttrs, 1, + PyDoc_STR("(short refNum, short attrs) -> None")}, ++#ifndef __LP64__ + {"OpenRFPerm", (PyCFunction)Res_OpenRFPerm, 1, + PyDoc_STR("(Str255 fileName, short vRefNum, SignedByte permission) -> (short _rv)")}, + {"HOpenResFile", (PyCFunction)Res_HOpenResFile, 1, +@@ -1647,10 +1656,12 @@ + PyDoc_STR("(FSSpec spec, SignedByte permission) -> (short _rv)")}, + {"FSpCreateResFile", (PyCFunction)Res_FSpCreateResFile, 1, + PyDoc_STR("(FSSpec spec, OSType creator, OSType fileType, ScriptCode scriptTag) -> None")}, ++#endif /* !__LP64__ */ + {"InsertResourceFile", (PyCFunction)Res_InsertResourceFile, 1, + PyDoc_STR("(SInt16 refNum, RsrcChainLocation where) -> None")}, + {"DetachResourceFile", (PyCFunction)Res_DetachResourceFile, 1, + PyDoc_STR("(SInt16 refNum) -> None")}, ++#ifndef __LP64__ + {"FSpResourceFileAlreadyOpen", (PyCFunction)Res_FSpResourceFileAlreadyOpen, 1, + PyDoc_STR("(FSSpec resourceFile) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, + {"FSpOpenOrphanResFile", (PyCFunction)Res_FSpOpenOrphanResFile, 1, +@@ -1659,14 +1670,17 @@ + PyDoc_STR("() -> (SInt16 refNum)")}, + {"GetNextResourceFile", (PyCFunction)Res_GetNextResourceFile, 1, + PyDoc_STR("(SInt16 curRefNum) -> (SInt16 nextRefNum)")}, ++#endif /* __LP64__ */ + {"FSOpenResFile", (PyCFunction)Res_FSOpenResFile, 1, + PyDoc_STR("(FSRef ref, SignedByte permission) -> (short _rv)")}, ++#ifndef __LP64__ + {"FSCreateResFile", (PyCFunction)Res_FSCreateResFile, 1, + PyDoc_STR("(FSRef parentRef, Buffer nameLength) -> (FSRef newRef, FSSpec newSpec)")}, + {"FSResourceFileAlreadyOpen", (PyCFunction)Res_FSResourceFileAlreadyOpen, 1, + PyDoc_STR("(FSRef resourceFileRef) -> (Boolean _rv, Boolean inChain, SInt16 refNum)")}, + {"FSCreateResourceFile", (PyCFunction)Res_FSCreateResourceFile, 1, + PyDoc_STR("(FSRef parentRef, Buffer nameLength, Buffer forkNameLength) -> (FSRef newRef, FSSpec newSpec)")}, ++#endif /* __LP64__ */ + {"FSOpenResourceFile", (PyCFunction)Res_FSOpenResourceFile, 1, + PyDoc_STR("(FSRef ref, Buffer forkNameLength, SignedByte permissions) -> (SInt16 refNum)")}, + {"Handle", (PyCFunction)Res_Handle, 1, +diff -r -u ./Modules/_ctypes/libffi/src/darwin/ffitarget.h ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h +--- ./Modules/_ctypes/libffi/src/darwin/ffitarget.h 2006-05-26 06:58:05.000000000 +0900 ++++ ../Python-2.5/Modules/_ctypes/libffi/src/darwin/ffitarget.h 2013-07-17 23:38:51.000000000 +0900 +@@ -4,7 +4,7 @@ + * created by configure). This makes is possible to build a univeral binary + * of ctypes in one go. + */ +-#if defined(__i386__) ++#if defined(__i386__) || defined(__x86_64__) + + #ifndef X86_DARWIN + #define X86_DARWIN +diff -r -u ./Python/mactoolboxglue.c ../Python-2.5/Python/mactoolboxglue.c +--- ./Python/mactoolboxglue.c 2006-07-12 01:44:25.000000000 +0900 ++++ ../Python-2.5/Python/mactoolboxglue.c 2013-07-17 23:39:09.000000000 +0900 +@@ -106,6 +106,7 @@ + } + + ++#ifndef __LP64__ + OSErr + PyMac_GetFullPathname(FSSpec *fss, char *path, int len) + { +@@ -153,6 +154,7 @@ + Py_XDECREF(fs); + return err; + } ++#endif /* !__LP64__ */ + + /* Convert a 4-char string object argument to an OSType value */ + int +@@ -417,6 +419,7 @@ + GLUE_NEW(GWorldPtr, GWorldObj_New, "Carbon.Qdoffs") + GLUE_CONVERT(GWorldPtr, GWorldObj_Convert, "Carbon.Qdoffs") + ++#ifndef __LP64__ + GLUE_NEW(Track, TrackObj_New, "Carbon.Qt") + GLUE_CONVERT(Track, TrackObj_Convert, "Carbon.Qt") + GLUE_NEW(Movie, MovieObj_New, "Carbon.Qt") +@@ -429,6 +432,7 @@ + GLUE_CONVERT(UserData, UserDataObj_Convert, "Carbon.Qt") + GLUE_NEW(Media, MediaObj_New, "Carbon.Qt") + GLUE_CONVERT(Media, MediaObj_Convert, "Carbon.Qt") ++#endif /* !__LP64__ */ + + GLUE_NEW(Handle, ResObj_New, "Carbon.Res") + GLUE_CONVERT(Handle, ResObj_Convert, "Carbon.Res") diff --git a/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/004_osx_libffi.patch b/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/004_osx_libffi.patch new file mode 100644 index 0000000..8318432 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/004_osx_libffi.patch @@ -0,0 +1,6881 @@ +diff -r -u ./Modules/_ctypes/libffi_osx/LICENSE ./Modules/_ctypes/libffi_osx/LICENSE +new file mode 100644 +index 0000000..f591795 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/LICENSE +@@ -0,0 +1,20 @@ ++libffi - Copyright (c) 1996-2003 Red Hat, Inc. ++ ++Permission is hereby granted, free of charge, to any person obtaining ++a copy of this software and associated documentation files (the ++``Software''), to deal in the Software without restriction, including ++without limitation the rights to use, copy, modify, merge, publish, ++distribute, sublicense, and/or sell copies of the Software, and to ++permit persons to whom the Software is furnished to do so, subject to ++the following conditions: ++ ++The above copyright notice and this permission notice shall be included ++in all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++OTHER DEALINGS IN THE SOFTWARE. +diff -r -u ./Modules/_ctypes/libffi_osx/README ./Modules/_ctypes/libffi_osx/README +new file mode 100644 +index 0000000..1fc2747 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/README +@@ -0,0 +1,500 @@ ++This directory contains the libffi package, which is not part of GCC but ++shipped with GCC as convenience. ++ ++Status ++====== ++ ++libffi-2.00 has not been released yet! This is a development snapshot! ++ ++libffi-1.20 was released on October 5, 1998. Check the libffi web ++page for updates: . ++ ++ ++What is libffi? ++=============== ++ ++Compilers for high level languages generate code that follow certain ++conventions. These conventions are necessary, in part, for separate ++compilation to work. One such convention is the "calling ++convention". The "calling convention" is essentially a set of ++assumptions made by the compiler about where function arguments will ++be found on entry to a function. A "calling convention" also specifies ++where the return value for a function is found. ++ ++Some programs may not know at the time of compilation what arguments ++are to be passed to a function. For instance, an interpreter may be ++told at run-time about the number and types of arguments used to call ++a given function. Libffi can be used in such programs to provide a ++bridge from the interpreter program to compiled code. ++ ++The libffi library provides a portable, high level programming ++interface to various calling conventions. This allows a programmer to ++call any function specified by a call interface description at run ++time. ++ ++Ffi stands for Foreign Function Interface. A foreign function ++interface is the popular name for the interface that allows code ++written in one language to call code written in another language. The ++libffi library really only provides the lowest, machine dependent ++layer of a fully featured foreign function interface. A layer must ++exist above libffi that handles type conversions for values passed ++between the two languages. ++ ++ ++Supported Platforms and Prerequisites ++===================================== ++ ++Libffi has been ported to: ++ ++ SunOS 4.1.3 & Solaris 2.x (SPARC-V8, SPARC-V9) ++ ++ Irix 5.3 & 6.2 (System V/o32 & n32) ++ ++ Intel x86 - Linux (System V ABI) ++ ++ Alpha - Linux and OSF/1 ++ ++ m68k - Linux (System V ABI) ++ ++ PowerPC - Linux (System V ABI, Darwin, AIX) ++ ++ ARM - Linux (System V ABI) ++ ++Libffi has been tested with the egcs 1.0.2 gcc compiler. Chances are ++that other versions will work. Libffi has also been built and tested ++with the SGI compiler tools. ++ ++On PowerPC, the tests failed (see the note below). ++ ++You must use GNU make to build libffi. SGI's make will not work. ++Sun's probably won't either. ++ ++If you port libffi to another platform, please let me know! I assume ++that some will be easy (x86 NetBSD), and others will be more difficult ++(HP). ++ ++ ++Installing libffi ++================= ++ ++[Note: before actually performing any of these installation steps, ++ you may wish to read the "Platform Specific Notes" below.] ++ ++First you must configure the distribution for your particular ++system. Go to the directory you wish to build libffi in and run the ++"configure" program found in the root directory of the libffi source ++distribution. ++ ++You may want to tell configure where to install the libffi library and ++header files. To do that, use the --prefix configure switch. Libffi ++will install under /usr/local by default. ++ ++If you want to enable extra run-time debugging checks use the the ++--enable-debug configure switch. This is useful when your program dies ++mysteriously while using libffi. ++ ++Another useful configure switch is --enable-purify-safety. Using this ++will add some extra code which will suppress certain warnings when you ++are using Purify with libffi. Only use this switch when using ++Purify, as it will slow down the library. ++ ++Configure has many other options. Use "configure --help" to see them all. ++ ++Once configure has finished, type "make". Note that you must be using ++GNU make. SGI's make will not work. Sun's probably won't either. ++You can ftp GNU make from prep.ai.mit.edu:/pub/gnu. ++ ++To ensure that libffi is working as advertised, type "make test". ++ ++To install the library and header files, type "make install". ++ ++ ++Using libffi ++============ ++ ++ The Basics ++ ---------- ++ ++Libffi assumes that you have a pointer to the function you wish to ++call and that you know the number and types of arguments to pass it, ++as well as the return type of the function. ++ ++The first thing you must do is create an ffi_cif object that matches ++the signature of the function you wish to call. The cif in ffi_cif ++stands for Call InterFace. To prepare a call interface object, use the ++following function: ++ ++ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, ++ unsigned int nargs, ++ ffi_type *rtype, ffi_type **atypes); ++ ++ CIF is a pointer to the call interface object you wish ++ to initialize. ++ ++ ABI is an enum that specifies the calling convention ++ to use for the call. FFI_DEFAULT_ABI defaults ++ to the system's native calling convention. Other ++ ABI's may be used with care. They are system ++ specific. ++ ++ NARGS is the number of arguments this function accepts. ++ libffi does not yet support vararg functions. ++ ++ RTYPE is a pointer to an ffi_type structure that represents ++ the return type of the function. Ffi_type objects ++ describe the types of values. libffi provides ++ ffi_type objects for many of the native C types: ++ signed int, unsigned int, signed char, unsigned char, ++ etc. There is also a pointer ffi_type object and ++ a void ffi_type. Use &ffi_type_void for functions that ++ don't return values. ++ ++ ATYPES is a vector of ffi_type pointers. ARGS must be NARGS long. ++ If NARGS is 0, this is ignored. ++ ++ ++ffi_prep_cif will return a status code that you are responsible ++for checking. It will be one of the following: ++ ++ FFI_OK - All is good. ++ ++ FFI_BAD_TYPEDEF - One of the ffi_type objects that ffi_prep_cif ++ came across is bad. ++ ++ ++Before making the call, the VALUES vector should be initialized ++with pointers to the appropriate argument values. ++ ++To call the function using the initialized ffi_cif, use the ++ffi_call function: ++ ++void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues); ++ ++ CIF is a pointer to the ffi_cif initialized specifically ++ for this function. ++ ++ FN is a pointer to the function you want to call. ++ ++ RVALUE is a pointer to a chunk of memory that is to hold the ++ result of the function call. Currently, it must be ++ at least one word in size (except for the n32 version ++ under Irix 6.x, which must be a pointer to an 8 byte ++ aligned value (a long long). It must also be at least ++ word aligned (depending on the return type, and the ++ system's alignment requirements). If RTYPE is ++ &ffi_type_void, this is ignored. If RVALUE is NULL, ++ the return value is discarded. ++ ++ AVALUES is a vector of void* that point to the memory locations ++ holding the argument values for a call. ++ If NARGS is 0, this is ignored. ++ ++ ++If you are expecting a return value from FN it will have been stored ++at RVALUE. ++ ++ ++ ++ An Example ++ ---------- ++ ++Here is a trivial example that calls puts() a few times. ++ ++ #include ++ #include ++ ++ int main() ++ { ++ ffi_cif cif; ++ ffi_type *args[1]; ++ void *values[1]; ++ char *s; ++ int rc; ++ ++ /* Initialize the argument info vectors */ ++ args[0] = &ffi_type_uint; ++ values[0] = &s; ++ ++ /* Initialize the cif */ ++ if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, ++ &ffi_type_uint, args) == FFI_OK) ++ { ++ s = "Hello World!"; ++ ffi_call(&cif, puts, &rc, values); ++ /* rc now holds the result of the call to puts */ ++ ++ /* values holds a pointer to the function's arg, so to ++ call puts() again all we need to do is change the ++ value of s */ ++ s = "This is cool!"; ++ ffi_call(&cif, puts, &rc, values); ++ } ++ ++ return 0; ++ } ++ ++ ++ ++ Aggregate Types ++ --------------- ++ ++Although libffi has no special support for unions or bit-fields, it is ++perfectly happy passing structures back and forth. You must first ++describe the structure to libffi by creating a new ffi_type object ++for it. Here is the definition of ffi_type: ++ ++ typedef struct _ffi_type ++ { ++ unsigned size; ++ short alignment; ++ short type; ++ struct _ffi_type **elements; ++ } ffi_type; ++ ++All structures must have type set to FFI_TYPE_STRUCT. You may set ++size and alignment to 0. These will be calculated and reset to the ++appropriate values by ffi_prep_cif(). ++ ++elements is a NULL terminated array of pointers to ffi_type objects ++that describe the type of the structure elements. These may, in turn, ++be structure elements. ++ ++The following example initializes a ffi_type object representing the ++tm struct from Linux's time.h: ++ ++ struct tm { ++ int tm_sec; ++ int tm_min; ++ int tm_hour; ++ int tm_mday; ++ int tm_mon; ++ int tm_year; ++ int tm_wday; ++ int tm_yday; ++ int tm_isdst; ++ /* Those are for future use. */ ++ long int __tm_gmtoff__; ++ __const char *__tm_zone__; ++ }; ++ ++ { ++ ffi_type tm_type; ++ ffi_type *tm_type_elements[12]; ++ int i; ++ ++ tm_type.size = tm_type.alignment = 0; ++ tm_type.elements = &tm_type_elements; ++ ++ for (i = 0; i < 9; i++) ++ tm_type_elements[i] = &ffi_type_sint; ++ ++ tm_type_elements[9] = &ffi_type_slong; ++ tm_type_elements[10] = &ffi_type_pointer; ++ tm_type_elements[11] = NULL; ++ ++ /* tm_type can now be used to represent tm argument types and ++ return types for ffi_prep_cif() */ ++ } ++ ++ ++ ++Platform Specific Notes ++======================= ++ ++ Intel x86 ++ --------- ++ ++There are no known problems with the x86 port. ++ ++ Sun SPARC - SunOS 4.1.3 & Solaris 2.x ++ ------------------------------------- ++ ++You must use GNU Make to build libffi on Sun platforms. ++ ++ MIPS - Irix 5.3 & 6.x ++ --------------------- ++ ++Irix 6.2 and better supports three different calling conventions: o32, ++n32 and n64. Currently, libffi only supports both o32 and n32 under ++Irix 6.x, but only o32 under Irix 5.3. Libffi will automatically be ++configured for whichever calling convention it was built for. ++ ++By default, the configure script will try to build libffi with the GNU ++development tools. To build libffi with the SGI development tools, set ++the environment variable CC to either "cc -32" or "cc -n32" before ++running configure under Irix 6.x (depending on whether you want an o32 ++or n32 library), or just "cc" for Irix 5.3. ++ ++With the n32 calling convention, when returning structures smaller ++than 16 bytes, be sure to provide an RVALUE that is 8 byte aligned. ++Here's one way of forcing this: ++ ++ double struct_storage[2]; ++ my_small_struct *s = (my_small_struct *) struct_storage; ++ /* Use s for RVALUE */ ++ ++If you don't do this you are liable to get spurious bus errors. ++ ++"long long" values are not supported yet. ++ ++You must use GNU Make to build libffi on SGI platforms. ++ ++ ARM - System V ABI ++ ------------------ ++ ++The ARM port was performed on a NetWinder running ARM Linux ELF ++(2.0.31) and gcc 2.8.1. ++ ++ ++ ++ PowerPC System V ABI ++ -------------------- ++ ++There are two `System V ABI's which libffi implements for PowerPC. ++They differ only in how small structures are returned from functions. ++ ++In the FFI_SYSV version, structures that are 8 bytes or smaller are ++returned in registers. This is what GCC does when it is configured ++for solaris, and is what the System V ABI I have (dated September ++1995) says. ++ ++In the FFI_GCC_SYSV version, all structures are returned the same way: ++by passing a pointer as the first argument to the function. This is ++what GCC does when it is configured for linux or a generic sysv ++target. ++ ++EGCS 1.0.1 (and probably other versions of EGCS/GCC) also has a ++inconsistency with the SysV ABI: When a procedure is called with many ++floating-point arguments, some of them get put on the stack. They are ++all supposed to be stored in double-precision format, even if they are ++only single-precision, but EGCS stores single-precision arguments as ++single-precision anyway. This causes one test to fail (the `many ++arguments' test). ++ ++ ++What's With The Crazy Comments? ++=============================== ++ ++You might notice a number of cryptic comments in the code, delimited ++by /*@ and @*/. These are annotations read by the program LCLint, a ++tool for statically checking C programs. You can read all about it at ++. ++ ++ ++History ++======= ++ ++1.20 Oct-5-98 ++ Raffaele Sena produces ARM port. ++ ++1.19 Oct-5-98 ++ Fixed x86 long double and long long return support. ++ m68k bug fixes from Andreas Schwab. ++ Patch for DU assembler compatibility for the Alpha from Richard ++ Henderson. ++ ++1.18 Apr-17-98 ++ Bug fixes and MIPS configuration changes. ++ ++1.17 Feb-24-98 ++ Bug fixes and m68k port from Andreas Schwab. PowerPC port from ++ Geoffrey Keating. Various bug x86, Sparc and MIPS bug fixes. ++ ++1.16 Feb-11-98 ++ Richard Henderson produces Alpha port. ++ ++1.15 Dec-4-97 ++ Fixed an n32 ABI bug. New libtool, auto* support. ++ ++1.14 May-13-97 ++ libtool is now used to generate shared and static libraries. ++ Fixed a minor portability problem reported by Russ McManus ++ . ++ ++1.13 Dec-2-96 ++ Added --enable-purify-safety to keep Purify from complaining ++ about certain low level code. ++ Sparc fix for calling functions with < 6 args. ++ Linux x86 a.out fix. ++ ++1.12 Nov-22-96 ++ Added missing ffi_type_void, needed for supporting void return ++ types. Fixed test case for non MIPS machines. Cygnus Support ++ is now Cygnus Solutions. ++ ++1.11 Oct-30-96 ++ Added notes about GNU make. ++ ++1.10 Oct-29-96 ++ Added configuration fix for non GNU compilers. ++ ++1.09 Oct-29-96 ++ Added --enable-debug configure switch. Clean-ups based on LCLint ++ feedback. ffi_mips.h is always installed. Many configuration ++ fixes. Fixed ffitest.c for sparc builds. ++ ++1.08 Oct-15-96 ++ Fixed n32 problem. Many clean-ups. ++ ++1.07 Oct-14-96 ++ Gordon Irlam rewrites v8.S again. Bug fixes. ++ ++1.06 Oct-14-96 ++ Gordon Irlam improved the sparc port. ++ ++1.05 Oct-14-96 ++ Interface changes based on feedback. ++ ++1.04 Oct-11-96 ++ Sparc port complete (modulo struct passing bug). ++ ++1.03 Oct-10-96 ++ Passing struct args, and returning struct values works for ++ all architectures/calling conventions. Expanded tests. ++ ++1.02 Oct-9-96 ++ Added SGI n32 support. Fixed bugs in both o32 and Linux support. ++ Added "make test". ++ ++1.01 Oct-8-96 ++ Fixed float passing bug in mips version. Restructured some ++ of the code. Builds cleanly with SGI tools. ++ ++1.00 Oct-7-96 ++ First release. No public announcement. ++ ++ ++Authors & Credits ++================= ++ ++libffi was written by Anthony Green . ++ ++Portions of libffi were derived from Gianni Mariani's free gencall ++library for Silicon Graphics machines. ++ ++The closure mechanism was designed and implemented by Kresten Krab ++Thorup. ++ ++The Sparc port was derived from code contributed by the fine folks at ++Visible Decisions Inc . Further enhancements were ++made by Gordon Irlam at Cygnus Solutions . ++ ++The Alpha port was written by Richard Henderson at Cygnus Solutions. ++ ++Andreas Schwab ported libffi to m68k Linux and provided a number of ++bug fixes. ++ ++Geoffrey Keating ported libffi to the PowerPC. ++ ++Raffaele Sena ported libffi to the ARM. ++ ++Jesper Skov and Andrew Haley both did more than their fair share of ++stepping through the code and tracking down bugs. ++ ++Thanks also to Tom Tromey for bug fixes and configuration help. ++ ++Thanks to Jim Blandy, who provided some useful feedback on the libffi ++interface. ++ ++If you have a problem, or have found a bug, please send a note to ++green@cygnus.com. +diff -r -u ./Modules/_ctypes/libffi_osx/README.pyobjc ./Modules/_ctypes/libffi_osx/README.pyobjc +new file mode 100644 +index 0000000..405d85f +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/README.pyobjc +@@ -0,0 +1,5 @@ ++This directory contains a slightly modified version of libffi, extracted from ++the GCC source-tree. ++ ++The only modifications are those that are necessary to compile libffi using ++the Apple provided compiler and outside of the GCC source tree. +diff -r -u ./Modules/_ctypes/libffi_osx/ffi.c ./Modules/_ctypes/libffi_osx/ffi.c +new file mode 100644 +index 0000000..bf42093 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/ffi.c +@@ -0,0 +1,226 @@ ++/* ----------------------------------------------------------------------- ++ prep_cif.c - Copyright (c) 1996, 1998 Red Hat, Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++#include ++ ++/* Round up to FFI_SIZEOF_ARG. */ ++#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG) ++ ++/* Perform machine independent initialization of aggregate type ++ specifications. */ ++ ++static ffi_status ++initialize_aggregate( ++/*@out@*/ ffi_type* arg) ++{ ++/*@-usedef@*/ ++ ++ if (arg == NULL || arg->elements == NULL || ++ arg->size != 0 || arg->alignment != 0) ++ return FFI_BAD_TYPEDEF; ++ ++ ffi_type** ptr = &(arg->elements[0]); ++ ++ while ((*ptr) != NULL) ++ { ++ if (((*ptr)->size == 0) && (initialize_aggregate(*ptr) != FFI_OK)) ++ return FFI_BAD_TYPEDEF; ++ ++ /* Perform a sanity check on the argument type */ ++ FFI_ASSERT_VALID_TYPE(*ptr); ++ ++#ifdef POWERPC_DARWIN ++ int curalign = (*ptr)->alignment; ++ ++ if (ptr != &(arg->elements[0])) ++ { ++ if (curalign > 4 && curalign != 16) ++ curalign = 4; ++ } ++ ++ arg->size = ALIGN(arg->size, curalign); ++ arg->size += (*ptr)->size; ++ arg->alignment = (arg->alignment > curalign) ? ++ arg->alignment : curalign; ++#else ++ arg->size = ALIGN(arg->size, (*ptr)->alignment); ++ arg->size += (*ptr)->size; ++ arg->alignment = (arg->alignment > (*ptr)->alignment) ? ++ arg->alignment : (*ptr)->alignment; ++#endif ++ ++ ptr++; ++ } ++ ++ /* Structure size includes tail padding. This is important for ++ structures that fit in one register on ABIs like the PowerPC64 ++ Linux ABI that right justify small structs in a register. ++ It's also needed for nested structure layout, for example ++ struct A { long a; char b; }; struct B { struct A x; char y; }; ++ should find y at an offset of 2*sizeof(long) and result in a ++ total size of 3*sizeof(long). */ ++ arg->size = ALIGN(arg->size, arg->alignment); ++ ++ if (arg->size == 0) ++ return FFI_BAD_TYPEDEF; ++ ++ return FFI_OK; ++ ++/*@=usedef@*/ ++} ++ ++#ifndef __CRIS__ ++/* The CRIS ABI specifies structure elements to have byte ++ alignment only, so it completely overrides this functions, ++ which assumes "natural" alignment and padding. */ ++ ++/* Perform machine independent ffi_cif preparation, then call ++ machine dependent routine. */ ++ ++#if defined(X86_DARWIN) ++ ++static inline bool ++struct_on_stack( ++ int size) ++{ ++ if (size > 8) ++ return true; ++ ++ /* This is not what the ABI says, but is what is really implemented */ ++ switch (size) ++ { ++ case 1: ++ case 2: ++ case 4: ++ case 8: ++ return false; ++ ++ default: ++ return true; ++ } ++} ++ ++#endif // defined(X86_DARWIN) ++ ++// Arguments' ffi_type->alignment must be nonzero. ++ffi_status ++ffi_prep_cif( ++/*@out@*/ /*@partial@*/ ffi_cif* cif, ++ ffi_abi abi, ++ unsigned int nargs, ++/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, ++/*@dependent@*/ ffi_type** atypes) ++{ ++ if (cif == NULL) ++ return FFI_BAD_TYPEDEF; ++ ++ if (abi <= FFI_FIRST_ABI || abi > FFI_DEFAULT_ABI) ++ return FFI_BAD_ABI; ++ ++ unsigned int bytes = 0; ++ unsigned int i; ++ ffi_type** ptr; ++ ++ cif->abi = abi; ++ cif->arg_types = atypes; ++ cif->nargs = nargs; ++ cif->rtype = rtype; ++ cif->flags = 0; ++ ++ /* Initialize the return type if necessary */ ++ /*@-usedef@*/ ++ if ((cif->rtype->size == 0) && (initialize_aggregate(cif->rtype) != FFI_OK)) ++ return FFI_BAD_TYPEDEF; ++ /*@=usedef@*/ ++ ++ /* Perform a sanity check on the return type */ ++ FFI_ASSERT_VALID_TYPE(cif->rtype); ++ ++ /* x86-64 and s390 stack space allocation is handled in prep_machdep. */ ++#if !defined M68K && !defined __x86_64__ && !defined S390 && !defined PA ++ /* Make space for the return structure pointer */ ++ if (cif->rtype->type == FFI_TYPE_STRUCT ++#ifdef SPARC ++ && (cif->abi != FFI_V9 || cif->rtype->size > 32) ++#endif ++#ifdef X86_DARWIN ++ && (struct_on_stack(cif->rtype->size)) ++#endif ++ ) ++ bytes = STACK_ARG_SIZE(sizeof(void*)); ++#endif ++ ++ for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) ++ { ++ /* Initialize any uninitialized aggregate type definitions */ ++ if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) ++ return FFI_BAD_TYPEDEF; ++ ++ if ((*ptr)->alignment == 0) ++ return FFI_BAD_TYPEDEF; ++ ++ /* Perform a sanity check on the argument type, do this ++ check after the initialization. */ ++ FFI_ASSERT_VALID_TYPE(*ptr); ++ ++#if defined(X86_DARWIN) ++ { ++ int align = (*ptr)->alignment; ++ ++ if (align > 4) ++ align = 4; ++ ++ if ((align - 1) & bytes) ++ bytes = ALIGN(bytes, align); ++ ++ bytes += STACK_ARG_SIZE((*ptr)->size); ++ } ++#elif !defined __x86_64__ && !defined S390 && !defined PA ++#ifdef SPARC ++ if (((*ptr)->type == FFI_TYPE_STRUCT ++ && ((*ptr)->size > 16 || cif->abi != FFI_V9)) ++ || ((*ptr)->type == FFI_TYPE_LONGDOUBLE ++ && cif->abi != FFI_V9)) ++ bytes += sizeof(void*); ++ else ++#endif ++ { ++ /* Add any padding if necessary */ ++ if (((*ptr)->alignment - 1) & bytes) ++ bytes = ALIGN(bytes, (*ptr)->alignment); ++ ++ bytes += STACK_ARG_SIZE((*ptr)->size); ++ } ++#endif ++ } ++ ++ cif->bytes = bytes; ++ ++ /* Perform machine dependent cif processing */ ++ return ffi_prep_cif_machdep(cif); ++} ++#endif /* not __CRIS__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi.h ./Modules/_ctypes/libffi_osx/include/ffi.h +new file mode 100644 +index 0000000..c104a5c +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ffi.h +@@ -0,0 +1,355 @@ ++/* -----------------------------------------------------------------*-C-*- ++ libffi PyOBJC - Copyright (c) 1996-2003 Red Hat, Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ++ ----------------------------------------------------------------------- */ ++ ++/* ------------------------------------------------------------------- ++ The basic API is described in the README file. ++ ++ The raw API is designed to bypass some of the argument packing ++ and unpacking on architectures for which it can be avoided. ++ ++ The closure API allows interpreted functions to be packaged up ++ inside a C function pointer, so that they can be called as C functions, ++ with no understanding on the client side that they are interpreted. ++ It can also be used in other cases in which it is necessary to package ++ up a user specified parameter and a function pointer as a single ++ function pointer. ++ ++ The closure API must be implemented in order to get its functionality, ++ e.g. for use by gij. Routines are provided to emulate the raw API ++ if the underlying platform doesn't allow faster implementation. ++ ++ More details on the raw and closure API can be found in: ++ ++ http://gcc.gnu.org/ml/java/1999-q3/msg00138.html ++ ++ and ++ ++ http://gcc.gnu.org/ml/java/1999-q3/msg00174.html ++ -------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_H ++#define LIBFFI_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/* Specify which architecture libffi is configured for. */ ++#ifdef MACOSX ++# if defined(__i386__) || defined(__x86_64__) ++# define X86_DARWIN ++# elif defined(__ppc__) || defined(__ppc64__) ++# define POWERPC_DARWIN ++# else ++# error "Unsupported MacOS X CPU type" ++# endif ++#else ++#error "Unsupported OS type" ++#endif ++ ++/* ---- System configuration information --------------------------------- */ ++ ++#include "ffitarget.h" ++#include "fficonfig.h" ++ ++#ifndef LIBFFI_ASM ++ ++#include ++#include ++ ++/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). ++ But we can find it either under the correct ANSI name, or under GNU ++ C's internal name. */ ++#ifdef LONG_LONG_MAX ++# define FFI_LONG_LONG_MAX LONG_LONG_MAX ++#else ++# ifdef LLONG_MAX ++# define FFI_LONG_LONG_MAX LLONG_MAX ++# else ++# ifdef __GNUC__ ++# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ ++# endif ++# endif ++#endif ++ ++#if SCHAR_MAX == 127 ++# define ffi_type_uchar ffi_type_uint8 ++# define ffi_type_schar ffi_type_sint8 ++#else ++#error "char size not supported" ++#endif ++ ++#if SHRT_MAX == 32767 ++# define ffi_type_ushort ffi_type_uint16 ++# define ffi_type_sshort ffi_type_sint16 ++#elif SHRT_MAX == 2147483647 ++# define ffi_type_ushort ffi_type_uint32 ++# define ffi_type_sshort ffi_type_sint32 ++#else ++#error "short size not supported" ++#endif ++ ++#if INT_MAX == 32767 ++# define ffi_type_uint ffi_type_uint16 ++# define ffi_type_sint ffi_type_sint16 ++#elif INT_MAX == 2147483647 ++# define ffi_type_uint ffi_type_uint32 ++# define ffi_type_sint ffi_type_sint32 ++#elif INT_MAX == 9223372036854775807 ++# define ffi_type_uint ffi_type_uint64 ++# define ffi_type_sint ffi_type_sint64 ++#else ++#error "int size not supported" ++#endif ++ ++#define ffi_type_ulong ffi_type_uint64 ++#define ffi_type_slong ffi_type_sint64 ++ ++#if LONG_MAX == 2147483647 ++# if FFI_LONG_LONG_MAX != 9223372036854775807 ++# error "no 64-bit data type supported" ++# endif ++#elif LONG_MAX != 9223372036854775807 ++#error "long size not supported" ++#endif ++ ++/* The closure code assumes that this works on pointers, i.e. a size_t ++ can hold a pointer. */ ++ ++typedef struct _ffi_type { ++ size_t size; ++ unsigned short alignment; ++ unsigned short type; ++/*@null@*/ struct _ffi_type** elements; ++} ffi_type; ++ ++/* These are defined in types.c */ ++extern ffi_type ffi_type_void; ++extern ffi_type ffi_type_uint8; ++extern ffi_type ffi_type_sint8; ++extern ffi_type ffi_type_uint16; ++extern ffi_type ffi_type_sint16; ++extern ffi_type ffi_type_uint32; ++extern ffi_type ffi_type_sint32; ++extern ffi_type ffi_type_uint64; ++extern ffi_type ffi_type_sint64; ++extern ffi_type ffi_type_float; ++extern ffi_type ffi_type_double; ++extern ffi_type ffi_type_longdouble; ++extern ffi_type ffi_type_pointer; ++ ++typedef enum ffi_status { ++ FFI_OK = 0, ++ FFI_BAD_TYPEDEF, ++ FFI_BAD_ABI ++} ffi_status; ++ ++typedef unsigned FFI_TYPE; ++ ++typedef struct ffi_cif { ++ ffi_abi abi; ++ unsigned nargs; ++/*@dependent@*/ ffi_type** arg_types; ++/*@dependent@*/ ffi_type* rtype; ++ unsigned bytes; ++ unsigned flags; ++#ifdef FFI_EXTRA_CIF_FIELDS ++ FFI_EXTRA_CIF_FIELDS; ++#endif ++} ffi_cif; ++ ++/* ---- Definitions for the raw API -------------------------------------- */ ++ ++#ifndef FFI_SIZEOF_ARG ++# if LONG_MAX == 2147483647 ++# define FFI_SIZEOF_ARG 4 ++# elif LONG_MAX == 9223372036854775807 ++# define FFI_SIZEOF_ARG 8 ++# endif ++#endif ++ ++typedef union { ++ ffi_sarg sint; ++ ffi_arg uint; ++ float flt; ++ char data[FFI_SIZEOF_ARG]; ++ void* ptr; ++} ffi_raw; ++ ++void ++ffi_raw_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ ffi_raw* avalue); ++ ++void ++ffi_ptrarray_to_raw( ++ ffi_cif* cif, ++ void** args, ++ ffi_raw* raw); ++ ++void ++ffi_raw_to_ptrarray( ++ ffi_cif* cif, ++ ffi_raw* raw, ++ void** args); ++ ++size_t ++ffi_raw_size( ++ ffi_cif* cif); ++ ++/* This is analogous to the raw API, except it uses Java parameter ++ packing, even on 64-bit machines. I.e. on 64-bit machines ++ longs and doubles are followed by an empty 64-bit word. */ ++void ++ffi_java_raw_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ ffi_raw* avalue); ++ ++void ++ffi_java_ptrarray_to_raw( ++ ffi_cif* cif, ++ void** args, ++ ffi_raw* raw); ++ ++void ++ffi_java_raw_to_ptrarray( ++ ffi_cif* cif, ++ ffi_raw* raw, ++ void** args); ++ ++size_t ++ffi_java_raw_size( ++ ffi_cif* cif); ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#if FFI_CLOSURES ++ ++typedef struct ffi_closure { ++ char tramp[FFI_TRAMPOLINE_SIZE]; ++ ffi_cif* cif; ++ void (*fun)(ffi_cif*,void*,void**,void*); ++ void* user_data; ++} ffi_closure; ++ ++ffi_status ++ffi_prep_closure( ++ ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,void**,void*), ++ void* user_data); ++ ++void ffi_closure_free(void *); ++void *ffi_closure_alloc (size_t size, void **code); ++ ++typedef struct ffi_raw_closure { ++ char tramp[FFI_TRAMPOLINE_SIZE]; ++ ffi_cif* cif; ++ ++#if !FFI_NATIVE_RAW_API ++ /* if this is enabled, then a raw closure has the same layout ++ as a regular closure. We use this to install an intermediate ++ handler to do the transaltion, void** -> ffi_raw*. */ ++ void (*translate_args)(ffi_cif*,void*,void**,void*); ++ void* this_closure; ++#endif ++ ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*); ++ void* user_data; ++} ffi_raw_closure; ++ ++ffi_status ++ffi_prep_raw_closure( ++ ffi_raw_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), ++ void* user_data); ++ ++ffi_status ++ffi_prep_java_raw_closure( ++ ffi_raw_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), ++ void* user_data); ++ ++#endif // FFI_CLOSURES ++ ++/* ---- Public interface definition -------------------------------------- */ ++ ++ffi_status ++ffi_prep_cif( ++/*@out@*/ /*@partial@*/ ffi_cif* cif, ++ ffi_abi abi, ++ unsigned int nargs, ++/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type* rtype, ++/*@dependent@*/ ffi_type** atypes); ++ ++void ++ffi_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ void** avalue); ++ ++/* Useful for eliminating compiler warnings */ ++#define FFI_FN(f) ((void (*)(void))f) ++ ++#endif // #ifndef LIBFFI_ASM ++/* ---- Definitions shared with assembly code ---------------------------- */ ++ ++/* If these change, update src/mips/ffitarget.h. */ ++#define FFI_TYPE_VOID 0 ++#define FFI_TYPE_INT 1 ++#define FFI_TYPE_FLOAT 2 ++#define FFI_TYPE_DOUBLE 3 ++ ++#ifdef HAVE_LONG_DOUBLE ++# define FFI_TYPE_LONGDOUBLE 4 ++#else ++# define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE ++#endif ++ ++#define FFI_TYPE_UINT8 5 ++#define FFI_TYPE_SINT8 6 ++#define FFI_TYPE_UINT16 7 ++#define FFI_TYPE_SINT16 8 ++#define FFI_TYPE_UINT32 9 ++#define FFI_TYPE_SINT32 10 ++#define FFI_TYPE_UINT64 11 ++#define FFI_TYPE_SINT64 12 ++#define FFI_TYPE_STRUCT 13 ++#define FFI_TYPE_POINTER 14 ++ ++/* This should always refer to the last type code (for sanity checks) */ ++#define FFI_TYPE_LAST FFI_TYPE_POINTER ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif // #ifndef LIBFFI_H +diff -r -u ./Modules/_ctypes/libffi_osx/include/ffi_common.h ./Modules/_ctypes/libffi_osx/include/ffi_common.h +new file mode 100644 +index 0000000..685a358 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ffi_common.h +@@ -0,0 +1,102 @@ ++/* ----------------------------------------------------------------------- ++ ffi_common.h - Copyright (c) 1996 Red Hat, Inc. ++ ++ Common internal definitions and macros. Only necessary for building ++ libffi. ++ ----------------------------------------------------------------------- */ ++ ++#ifndef FFI_COMMON_H ++#define FFI_COMMON_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include "fficonfig.h" ++ ++/* Do not move this. Some versions of AIX are very picky about where ++ this is positioned. */ ++#ifdef __GNUC__ ++# define alloca __builtin_alloca ++#else ++# if HAVE_ALLOCA_H ++# include ++# else ++# ifdef _AIX ++# pragma alloca ++# else ++# ifndef alloca /* predefined by HP cc +Olibcalls */ ++char* alloca(); ++# endif ++# endif ++# endif ++#endif ++ ++/* Check for the existence of memcpy. */ ++#if STDC_HEADERS ++# include ++#else ++# ifndef HAVE_MEMCPY ++# define memcpy(d, s, n) bcopy((s), (d), (n)) ++# endif ++#endif ++ ++/*#if defined(FFI_DEBUG) ++#include ++#endif*/ ++ ++#ifdef FFI_DEBUG ++#include ++ ++/*@exits@*/ void ++ffi_assert( ++/*@temp@*/ char* expr, ++/*@temp@*/ char* file, ++ int line); ++void ++ffi_stop_here(void); ++void ++ffi_type_test( ++/*@temp@*/ /*@out@*/ ffi_type* a, ++/*@temp@*/ char* file, ++ int line); ++ ++# define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) ++# define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) ++# define FFI_ASSERT_VALID_TYPE(x) ffi_type_test(x, __FILE__, __LINE__) ++#else ++# define FFI_ASSERT(x) ++# define FFI_ASSERT_AT(x, f, l) ++# define FFI_ASSERT_VALID_TYPE(x) ++#endif // #ifdef FFI_DEBUG ++ ++#define ALIGN(v, a) (((size_t)(v) + (a) - 1) & ~((a) - 1)) ++ ++/* Perform machine dependent cif processing */ ++ffi_status ++ffi_prep_cif_machdep( ++ ffi_cif* cif); ++ ++/* Extended cif, used in callback from assembly routine */ ++typedef struct extended_cif { ++/*@dependent@*/ ffi_cif* cif; ++/*@dependent@*/ void* rvalue; ++/*@dependent@*/ void** avalue; ++} extended_cif; ++ ++/* Terse sized type definitions. */ ++typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); ++typedef signed int SINT8 __attribute__((__mode__(__QI__))); ++typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); ++typedef signed int SINT16 __attribute__((__mode__(__HI__))); ++typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); ++typedef signed int SINT32 __attribute__((__mode__(__SI__))); ++typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); ++typedef signed int SINT64 __attribute__((__mode__(__DI__))); ++typedef float FLOAT32; ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif // #ifndef FFI_COMMON_H +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/fficonfig.h ./Modules/_ctypes/libffi_osx/include/fficonfig.h +new file mode 100644 +index 0000000..2172490 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/fficonfig.h +@@ -0,0 +1,150 @@ ++/* Manually created fficonfig.h for Darwin on PowerPC or Intel ++ ++ This file is manually generated to do away with the need for autoconf and ++ therefore make it easier to cross-compile and build fat binaries. ++ ++ NOTE: This file was added by PyObjC. ++*/ ++ ++#ifndef MACOSX ++#error "This file is only supported on Mac OS X" ++#endif ++ ++#if defined(__i386__) ++# define BYTEORDER 1234 ++# undef HOST_WORDS_BIG_ENDIAN ++# undef WORDS_BIGENDIAN ++# define SIZEOF_DOUBLE 8 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++ ++#elif defined(__x86_64__) ++# define BYTEORDER 1234 ++# undef HOST_WORDS_BIG_ENDIAN ++# undef WORDS_BIGENDIAN ++# define SIZEOF_DOUBLE 8 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++ ++#elif defined(__ppc__) ++# define BYTEORDER 4321 ++# define HOST_WORDS_BIG_ENDIAN 1 ++# define WORDS_BIGENDIAN 1 ++# define SIZEOF_DOUBLE 8 ++# if __GNUC__ >= 4 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++# else ++# undef HAVE_LONG_DOUBLE ++# define SIZEOF_LONG_DOUBLE 8 ++# endif ++ ++#elif defined(__ppc64__) ++# define BYTEORDER 4321 ++# define HOST_WORDS_BIG_ENDIAN 1 ++# define WORDS_BIGENDIAN 1 ++# define SIZEOF_DOUBLE 8 ++# define HAVE_LONG_DOUBLE 1 ++# define SIZEOF_LONG_DOUBLE 16 ++ ++#else ++#error "Unknown CPU type" ++#endif ++ ++/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP ++ systems. This function is required for `alloca.c' support on those systems. */ ++#undef CRAY_STACKSEG_END ++ ++/* Define to 1 if using `alloca.c'. */ ++/* #undef C_ALLOCA */ ++ ++/* Define to the flags needed for the .section .eh_frame directive. */ ++#define EH_FRAME_FLAGS "aw" ++ ++/* Define this if you want extra debugging. */ ++/* #undef FFI_DEBUG */ ++ ++/* Define this is you do not want support for the raw API. */ ++#define FFI_NO_RAW_API 1 ++ ++/* Define this if you do not want support for aggregate types. */ ++/* #undef FFI_NO_STRUCTS */ ++ ++/* Define to 1 if you have `alloca', as a function or macro. */ ++#define HAVE_ALLOCA 1 ++ ++/* Define to 1 if you have and it should be used (not on Ultrix). */ ++#define HAVE_ALLOCA_H 1 ++ ++/* Define if your assembler supports .register. */ ++/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ ++ ++/* Define if your assembler and linker support unaligned PC relative relocs. */ ++/* #undef HAVE_AS_SPARC_UA_PCREL */ ++ ++/* Define to 1 if you have the `memcpy' function. */ ++#define HAVE_MEMCPY 1 ++ ++/* Define if mmap with MAP_ANON(YMOUS) works. */ ++#define HAVE_MMAP_ANON 1 ++ ++/* Define if mmap of /dev/zero works. */ ++/* #undef HAVE_MMAP_DEV_ZERO */ ++ ++/* Define if read-only mmap of a plain file works. */ ++#define HAVE_MMAP_FILE 1 ++ ++/* Define if .eh_frame sections should be read-only. */ ++/* #undef HAVE_RO_EH_FRAME */ ++ ++/* Define to 1 if your C compiler doesn't accept -c and -o together. */ ++/* #undef NO_MINUS_C_MINUS_O */ ++ ++/* Name of package */ ++#define PACKAGE "libffi" ++ ++/* Define to the address where bug reports for this package should be sent. */ ++#define PACKAGE_BUGREPORT "http://gcc.gnu.org/bugs.html" ++ ++/* Define to the full name of this package. */ ++#define PACKAGE_NAME "libffi" ++ ++/* Define to the full name and version of this package. */ ++#define PACKAGE_STRING "libffi 2.1" ++ ++/* Define to the one symbol short name of this package. */ ++#define PACKAGE_TARNAME "libffi" ++ ++/* Define to the version of this package. */ ++#define PACKAGE_VERSION "2.1" ++ ++/* If using the C implementation of alloca, define if you know the ++ direction of stack growth for your system; otherwise it will be ++ automatically deduced at run-time. ++ STACK_DIRECTION > 0 => grows toward higher addresses ++ STACK_DIRECTION < 0 => grows toward lower addresses ++ STACK_DIRECTION = 0 => direction of growth unknown */ ++/* #undef STACK_DIRECTION */ ++ ++/* Define to 1 if you have the ANSI C header files. */ ++#define STDC_HEADERS 1 ++ ++/* Define this if you are using Purify and want to suppress spurious messages. */ ++/* #undef USING_PURIFY */ ++ ++/* Version number of package */ ++#define VERSION "2.1-pyobjc" ++ ++#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE ++# ifdef LIBFFI_ASM ++# define FFI_HIDDEN(name) .hidden name ++# else ++# define FFI_HIDDEN __attribute__((visibility ("hidden"))) ++# endif ++#else ++# ifdef LIBFFI_ASM ++# define FFI_HIDDEN(name) ++# else ++# define FFI_HIDDEN ++# endif ++#endif +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/ffitarget.h ./Modules/_ctypes/libffi_osx/include/ffitarget.h +new file mode 100644 +index 0000000..faaa30d +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ffitarget.h +@@ -0,0 +1,13 @@ ++/* Dispatch to the right ffitarget file. This file is PyObjC specific; in a ++ normal build, the build environment copies the file to the right location or ++ sets up the right include flags. We want to do neither because that would ++ make building fat binaries harder. ++*/ ++ ++#if defined(__i386__) || defined(__x86_64__) ++#include "x86-ffitarget.h" ++#elif defined(__ppc__) || defined(__ppc64__) ++#include "ppc-ffitarget.h" ++#else ++#error "Unsupported CPU type" ++#endif +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h +new file mode 100644 +index 0000000..2318421 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/ppc-ffitarget.h +@@ -0,0 +1,104 @@ ++/* -----------------------------------------------------------------*-C-*- ++ ppc-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ Target configuration macros for PowerPC. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++/* ---- System specific configurations ----------------------------------- */ ++ ++#if (defined(POWERPC) && defined(__powerpc64__)) || \ ++ (defined(POWERPC_DARWIN) && defined(__ppc64__)) ++#define POWERPC64 ++#endif ++ ++#ifndef LIBFFI_ASM ++ ++typedef unsigned long ffi_arg; ++typedef signed long ffi_sarg; ++ ++typedef enum ffi_abi { ++ FFI_FIRST_ABI = 0, ++ ++#ifdef POWERPC ++ FFI_SYSV, ++ FFI_GCC_SYSV, ++ FFI_LINUX64, ++# ifdef POWERPC64 ++ FFI_DEFAULT_ABI = FFI_LINUX64, ++# else ++ FFI_DEFAULT_ABI = FFI_GCC_SYSV, ++# endif ++#endif ++ ++#ifdef POWERPC_AIX ++ FFI_AIX, ++ FFI_DARWIN, ++ FFI_DEFAULT_ABI = FFI_AIX, ++#endif ++ ++#ifdef POWERPC_DARWIN ++ FFI_AIX, ++ FFI_DARWIN, ++ FFI_DEFAULT_ABI = FFI_DARWIN, ++#endif ++ ++#ifdef POWERPC_FREEBSD ++ FFI_SYSV, ++ FFI_GCC_SYSV, ++ FFI_LINUX64, ++ FFI_DEFAULT_ABI = FFI_SYSV, ++#endif ++ ++ FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 ++} ffi_abi; ++ ++#endif // #ifndef LIBFFI_ASM ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#define FFI_CLOSURES 1 ++#define FFI_NATIVE_RAW_API 0 ++ ++/* Needed for FFI_SYSV small structure returns. */ ++#define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST) ++ ++#if defined(POWERPC64) /*|| defined(POWERPC_AIX)*/ ++# define FFI_TRAMPOLINE_SIZE 48 ++#elif defined(POWERPC_AIX) ++# define FFI_TRAMPOLINE_SIZE 24 ++#else ++# define FFI_TRAMPOLINE_SIZE 40 ++#endif ++ ++#ifndef LIBFFI_ASM ++# if defined(POWERPC_DARWIN) || defined(POWERPC_AIX) ++typedef struct ffi_aix_trampoline_struct { ++ void* code_pointer; /* Pointer to ffi_closure_ASM */ ++ void* toc; /* TOC */ ++ void* static_chain; /* Pointer to closure */ ++} ffi_aix_trampoline_struct; ++# endif ++#endif // #ifndef LIBFFI_ASM ++ ++#endif // #ifndef LIBFFI_TARGET_H +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h +new file mode 100644 +index 0000000..55c2b6c +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/include/x86-ffitarget.h +@@ -0,0 +1,88 @@ ++/* -----------------------------------------------------------------*-C-*- ++ x86-ffitarget.h - Copyright (c) 1996-2003 Red Hat, Inc. ++ Target configuration macros for x86 and x86-64. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ++ ----------------------------------------------------------------------- */ ++ ++#ifndef LIBFFI_TARGET_H ++#define LIBFFI_TARGET_H ++ ++/* ---- System specific configurations ----------------------------------- */ ++ ++#if defined(X86_64) && defined(__i386__) ++# undef X86_64 ++# define X86 ++#endif ++ ++#if defined(__x86_64__) ++# ifndef X86_64 ++# define X86_64 ++# endif ++#endif ++ ++/* ---- Generic type definitions ----------------------------------------- */ ++ ++#ifndef LIBFFI_ASM ++ ++typedef unsigned long ffi_arg; ++typedef signed long ffi_sarg; ++ ++typedef enum ffi_abi { ++ FFI_FIRST_ABI = 0, ++ ++ /* ---- Intel x86 Win32 ---------- */ ++#ifdef X86_WIN32 ++ FFI_SYSV, ++ FFI_STDCALL, ++ /* TODO: Add fastcall support for the sake of completeness */ ++ FFI_DEFAULT_ABI = FFI_SYSV, ++#endif ++ ++ /* ---- Intel x86 and AMD x86-64 - */ ++#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__)) ++ FFI_SYSV, ++ FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ ++# ifdef __i386__ ++ FFI_DEFAULT_ABI = FFI_SYSV, ++# else ++ FFI_DEFAULT_ABI = FFI_UNIX64, ++# endif ++#endif ++ ++ FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 ++} ffi_abi; ++ ++#endif // #ifndef LIBFFI_ASM ++ ++/* ---- Definitions for closures ----------------------------------------- */ ++ ++#define FFI_CLOSURES 1 ++ ++#if defined(X86_64) || (defined(__x86_64__) && defined(X86_DARWIN)) ++# define FFI_TRAMPOLINE_SIZE 24 ++# define FFI_NATIVE_RAW_API 0 ++#else ++# define FFI_TRAMPOLINE_SIZE 10 ++# define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ ++#endif ++ ++#endif // #ifndef LIBFFI_TARGET_H +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S +new file mode 100644 +index 0000000..f143dbd +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.S +@@ -0,0 +1,365 @@ ++#if defined(__ppc__) || defined(__ppc64__) ++ ++/* ----------------------------------------------------------------------- ++ ppc-darwin.S - Copyright (c) 2000 John Hornkvist ++ Copyright (c) 2004 Free Software Foundation, Inc. ++ ++ PowerPC Assembly glue. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++ ++#include ++#include ++#include ++#include ++ ++.text ++ .align 2 ++.globl _ffi_prep_args ++ ++.text ++ .align 2 ++.globl _ffi_call_DARWIN ++ ++.text ++ .align 2 ++_ffi_call_DARWIN: ++LFB0: ++ mr r12,r8 /* We only need r12 until the call, ++ so it doesn't have to be saved. */ ++ ++LFB1: ++ /* Save the old stack pointer as AP. */ ++ mr r8,r1 ++ ++LCFI0: ++#if defined(__ppc64__) ++ /* Allocate the stack space we need. ++ r4 (size of input data) ++ 48 bytes (linkage area) ++ 40 bytes (saved registers) ++ 8 bytes (extra FPR) ++ r4 + 96 bytes total ++ */ ++ ++ addi r4,r4,-96 // Add our overhead. ++ li r0,-32 // Align to 32 bytes. ++ and r4,r4,r0 ++#endif ++ stgux r1,r1,r4 // Grow the stack. ++ mflr r9 ++ ++ /* Save registers we use. */ ++#if defined(__ppc64__) ++ std r27,-40(r8) ++#endif ++ stg r28,MODE_CHOICE(-16,-32)(r8) ++ stg r29,MODE_CHOICE(-12,-24)(r8) ++ stg r30,MODE_CHOICE(-8,-16)(r8) ++ stg r31,MODE_CHOICE(-4,-8)(r8) ++ stg r9,SF_RETURN(r8) /* return address */ ++#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ ++ stg r2,MODE_CHOICE(20,40)(r1) ++#endif ++ ++LCFI1: ++#if defined(__ppc64__) ++ mr r27,r3 // our extended_cif ++#endif ++ /* Save arguments over call. */ ++ mr r31,r5 /* flags, */ ++ mr r30,r6 /* rvalue, */ ++ mr r29,r7 /* function address, */ ++ mr r28,r8 /* our AP. */ ++ ++LCFI2: ++ /* Call ffi_prep_args. */ ++ mr r4,r1 ++ li r9,0 ++ mtctr r12 /* r12 holds address of _ffi_prep_args. */ ++ bctrl ++#if !defined(POWERPC_DARWIN) /* TOC unused in OS X */ ++ lg r2,MODE_CHOICE(20,40)(r1) ++#endif ++ ++ /* Now do the call. ++ Set up cr1 with bits 4-7 of the flags. */ ++ mtcrf 0x40,r31 ++ ++ /* Load all those argument registers. ++ We have set up a nice stack frame, just load it into registers. */ ++ lg r3,SF_ARG1(r1) ++ lg r4,SF_ARG2(r1) ++ lg r5,SF_ARG3(r1) ++ lg r6,SF_ARG4(r1) ++ nop ++ lg r7,SF_ARG5(r1) ++ lg r8,SF_ARG6(r1) ++ lg r9,SF_ARG7(r1) ++ lg r10,SF_ARG8(r1) ++ ++ /* Load all the FP registers. */ ++ bf 6,L2 /* No floats to load. */ ++#if defined(__ppc64__) ++ lfd f1,MODE_CHOICE(-16,-40)-(14*8)(r28) ++ lfd f2,MODE_CHOICE(-16,-40)-(13*8)(r28) ++ lfd f3,MODE_CHOICE(-16,-40)-(12*8)(r28) ++ lfd f4,MODE_CHOICE(-16,-40)-(11*8)(r28) ++ nop ++ lfd f5,MODE_CHOICE(-16,-40)-(10*8)(r28) ++ lfd f6,MODE_CHOICE(-16,-40)-(9*8)(r28) ++ lfd f7,MODE_CHOICE(-16,-40)-(8*8)(r28) ++ lfd f8,MODE_CHOICE(-16,-40)-(7*8)(r28) ++ nop ++ lfd f9,MODE_CHOICE(-16,-40)-(6*8)(r28) ++ lfd f10,MODE_CHOICE(-16,-40)-(5*8)(r28) ++ lfd f11,MODE_CHOICE(-16,-40)-(4*8)(r28) ++ lfd f12,MODE_CHOICE(-16,-40)-(3*8)(r28) ++ nop ++ lfd f13,MODE_CHOICE(-16,-40)-(2*8)(r28) ++ lfd f14,MODE_CHOICE(-16,-40)-(1*8)(r28) ++#elif defined(__ppc__) ++ lfd f1,MODE_CHOICE(-16,-40)-(13*8)(r28) ++ lfd f2,MODE_CHOICE(-16,-40)-(12*8)(r28) ++ lfd f3,MODE_CHOICE(-16,-40)-(11*8)(r28) ++ lfd f4,MODE_CHOICE(-16,-40)-(10*8)(r28) ++ nop ++ lfd f5,MODE_CHOICE(-16,-40)-(9*8)(r28) ++ lfd f6,MODE_CHOICE(-16,-40)-(8*8)(r28) ++ lfd f7,MODE_CHOICE(-16,-40)-(7*8)(r28) ++ lfd f8,MODE_CHOICE(-16,-40)-(6*8)(r28) ++ nop ++ lfd f9,MODE_CHOICE(-16,-40)-(5*8)(r28) ++ lfd f10,MODE_CHOICE(-16,-40)-(4*8)(r28) ++ lfd f11,MODE_CHOICE(-16,-40)-(3*8)(r28) ++ lfd f12,MODE_CHOICE(-16,-40)-(2*8)(r28) ++ nop ++ lfd f13,MODE_CHOICE(-16,-40)-(1*8)(r28) ++#else ++#error undefined architecture ++#endif ++ ++L2: ++ mr r12,r29 // Put the target address in r12 as specified. ++ mtctr r12 // Get the address to call into CTR. ++ nop ++ nop ++ bctrl // Make the call. ++ ++ // Deal with the return value. ++#if defined(__ppc64__) ++ mtcrf 0x3,r31 // flags in cr6 and cr7 ++ bt 27,L(st_return_value) ++#elif defined(__ppc__) ++ mtcrf 0x1,r31 // flags in cr7 ++#else ++#error undefined architecture ++#endif ++ ++ bt 30,L(done_return_value) ++ bt 29,L(fp_return_value) ++ stg r3,0(r30) ++#if defined(__ppc__) ++ bf 28,L(done_return_value) // Store the second long if necessary. ++ stg r4,4(r30) ++#endif ++ // Fall through ++ ++L(done_return_value): ++ lg r1,0(r1) // Restore stack pointer. ++ // Restore the registers we used. ++ lg r9,SF_RETURN(r1) // return address ++ lg r31,MODE_CHOICE(-4,-8)(r1) ++ mtlr r9 ++ lg r30,MODE_CHOICE(-8,-16)(r1) ++ lg r29,MODE_CHOICE(-12,-24)(r1) ++ lg r28,MODE_CHOICE(-16,-32)(r1) ++#if defined(__ppc64__) ++ ld r27,-40(r1) ++#endif ++ blr ++ ++#if defined(__ppc64__) ++L(st_return_value): ++ // Grow the stack enough to fit the registers. Leave room for 8 args ++ // to trample the 1st 8 slots in param area. ++ stgu r1,-SF_ROUND(280)(r1) // 64 + 104 + 48 + 64 ++ ++ // Store GPRs ++ std r3,SF_ARG9(r1) ++ std r4,SF_ARG10(r1) ++ std r5,SF_ARG11(r1) ++ std r6,SF_ARG12(r1) ++ nop ++ std r7,SF_ARG13(r1) ++ std r8,SF_ARG14(r1) ++ std r9,SF_ARG15(r1) ++ std r10,SF_ARG16(r1) ++ ++ // Store FPRs ++ nop ++ bf 26,L(call_struct_to_ram_form) ++ stfd f1,SF_ARG17(r1) ++ stfd f2,SF_ARG18(r1) ++ stfd f3,SF_ARG19(r1) ++ stfd f4,SF_ARG20(r1) ++ nop ++ stfd f5,SF_ARG21(r1) ++ stfd f6,SF_ARG22(r1) ++ stfd f7,SF_ARG23(r1) ++ stfd f8,SF_ARG24(r1) ++ nop ++ stfd f9,SF_ARG25(r1) ++ stfd f10,SF_ARG26(r1) ++ stfd f11,SF_ARG27(r1) ++ stfd f12,SF_ARG28(r1) ++ nop ++ stfd f13,SF_ARG29(r1) ++ ++L(call_struct_to_ram_form): ++ ld r3,0(r27) // extended_cif->cif* ++ ld r3,16(r3) // ffi_cif->rtype* ++ addi r4,r1,SF_ARG9 // stored GPRs ++ addi r6,r1,SF_ARG17 // stored FPRs ++ li r5,0 // GPR size ptr (NULL) ++ li r7,0 // FPR size ptr (NULL) ++ li r8,0 // FPR count ptr (NULL) ++ li r10,0 // struct offset (NULL) ++ mr r9,r30 // return area ++ bl Lffi64_struct_to_ram_form$stub ++ lg r1,0(r1) // Restore stack pointer. ++ b L(done_return_value) ++#endif ++ ++L(fp_return_value): ++ /* Do we have long double to store? */ ++ bf 31,L(fd_return_value) ++ stfd f1,0(r30) ++ stfd f2,8(r30) ++ b L(done_return_value) ++ ++L(fd_return_value): ++ /* Do we have double to store? */ ++ bf 28,L(float_return_value) ++ stfd f1,0(r30) ++ b L(done_return_value) ++ ++L(float_return_value): ++ /* We only have a float to store. */ ++ stfs f1,0(r30) ++ b L(done_return_value) ++ ++LFE1: ++/* END(_ffi_call_DARWIN) */ ++ ++/* Provide a null definition of _ffi_call_AIX. */ ++.text ++ .align 2 ++.globl _ffi_call_AIX ++.text ++ .align 2 ++_ffi_call_AIX: ++ blr ++/* END(_ffi_call_AIX) */ ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ; Length of Common Information Entry ++LSCIE1: ++ .long 0x0 ; CIE Identifier Tag ++ .byte 0x1 ; CIE Version ++ .ascii "zR\0" ; CIE Augmentation ++ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor ++ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte 0x41 ; CIE RA Column ++ .byte 0x1 ; uleb128 0x1; Augmentation size ++ .byte 0x10 ; FDE Encoding (pcrel) ++ .byte 0xc ; DW_CFA_def_cfa ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x0 ; uleb128 0x0 ++ .align LOG2_GPR_BYTES ++LECIE1: ++.globl _ffi_call_DARWIN.eh ++_ffi_call_DARWIN.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ; FDE Length ++ ++LASFDE1: ++ .long LASFDE1-EH_frame1 ; FDE CIE offset ++ .g_long LFB0-. ; FDE initial location ++ .set L$set$3,LFE1-LFB0 ++ .g_long L$set$3 ; FDE address range ++ .byte 0x0 ; uleb128 0x0; Augmentation size ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$4,LCFI0-LFB1 ++ .long L$set$4 ++ .byte 0xd ; DW_CFA_def_cfa_register ++ .byte 0x08 ; uleb128 0x08 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$5,LCFI1-LCFI0 ++ .long L$set$5 ++ .byte 0x11 ; DW_CFA_offset_extended_sf ++ .byte 0x41 ; uleb128 0x41 ++ .byte 0x7e ; sleb128 -2 ++ .byte 0x9f ; DW_CFA_offset, column 0x1f ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x9e ; DW_CFA_offset, column 0x1e ++ .byte 0x2 ; uleb128 0x2 ++ .byte 0x9d ; DW_CFA_offset, column 0x1d ++ .byte 0x3 ; uleb128 0x3 ++ .byte 0x9c ; DW_CFA_offset, column 0x1c ++ .byte 0x4 ; uleb128 0x4 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$6,LCFI2-LCFI1 ++ .long L$set$6 ++ .byte 0xd ; DW_CFA_def_cfa_register ++ .byte 0x1c ; uleb128 0x1c ++ .align LOG2_GPR_BYTES ++LEFDE1: ++ ++#if defined(__ppc64__) ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi64_struct_to_ram_form$stub: ++ .indirect_symbol _ffi64_struct_to_ram_form ++ mflr r0 ++ bcl 20,31,LO$ffi64_struct_to_ram_form ++ ++LO$ffi64_struct_to_ram_form: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form) ++ mtlr r0 ++ lgu r12,lo16(L_ffi64_struct_to_ram_form$lazy_ptr - LO$ffi64_struct_to_ram_form)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi64_struct_to_ram_form$lazy_ptr: ++ .indirect_symbol _ffi64_struct_to_ram_form ++ .g_long dyld_stub_binding_helper ++ ++#endif // __ppc64__ ++#endif // __ppc__ || __ppc64__ +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h +new file mode 100644 +index 0000000..cf4bd50 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin.h +@@ -0,0 +1,85 @@ ++/* ----------------------------------------------------------------------- ++ ppc-darwin.h - Copyright (c) 2002, 2003, 2004, Free Software Foundation, ++ Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define L(x) x ++ ++#define SF_ARG9 MODE_CHOICE(56,112) ++#define SF_ARG10 MODE_CHOICE(60,120) ++#define SF_ARG11 MODE_CHOICE(64,128) ++#define SF_ARG12 MODE_CHOICE(68,136) ++#define SF_ARG13 MODE_CHOICE(72,144) ++#define SF_ARG14 MODE_CHOICE(76,152) ++#define SF_ARG15 MODE_CHOICE(80,160) ++#define SF_ARG16 MODE_CHOICE(84,168) ++#define SF_ARG17 MODE_CHOICE(88,176) ++#define SF_ARG18 MODE_CHOICE(92,184) ++#define SF_ARG19 MODE_CHOICE(96,192) ++#define SF_ARG20 MODE_CHOICE(100,200) ++#define SF_ARG21 MODE_CHOICE(104,208) ++#define SF_ARG22 MODE_CHOICE(108,216) ++#define SF_ARG23 MODE_CHOICE(112,224) ++#define SF_ARG24 MODE_CHOICE(116,232) ++#define SF_ARG25 MODE_CHOICE(120,240) ++#define SF_ARG26 MODE_CHOICE(124,248) ++#define SF_ARG27 MODE_CHOICE(128,256) ++#define SF_ARG28 MODE_CHOICE(132,264) ++#define SF_ARG29 MODE_CHOICE(136,272) ++ ++#define ASM_NEEDS_REGISTERS 4 ++#define NUM_GPR_ARG_REGISTERS 8 ++#define NUM_FPR_ARG_REGISTERS 13 ++ ++#define FFI_TYPE_1_BYTE(x) ((x) == FFI_TYPE_UINT8 || (x) == FFI_TYPE_SINT8) ++#define FFI_TYPE_2_BYTE(x) ((x) == FFI_TYPE_UINT16 || (x) == FFI_TYPE_SINT16) ++#define FFI_TYPE_4_BYTE(x) \ ++ ((x) == FFI_TYPE_UINT32 || (x) == FFI_TYPE_SINT32 ||\ ++ (x) == FFI_TYPE_INT || (x) == FFI_TYPE_FLOAT) ++ ++#if !defined(LIBFFI_ASM) ++ ++enum { ++ FLAG_RETURNS_NOTHING = 1 << (31 - 30), // cr7 ++ FLAG_RETURNS_FP = 1 << (31 - 29), ++ FLAG_RETURNS_64BITS = 1 << (31 - 28), ++ FLAG_RETURNS_128BITS = 1 << (31 - 31), ++ ++ FLAG_RETURNS_STRUCT = 1 << (31 - 27), // cr6 ++ FLAG_STRUCT_CONTAINS_FP = 1 << (31 - 26), ++ ++ FLAG_ARG_NEEDS_COPY = 1 << (31 - 7), ++ FLAG_FP_ARGUMENTS = 1 << (31 - 6), // cr1.eq; specified by ABI ++ FLAG_4_GPR_ARGUMENTS = 1 << (31 - 5), ++ FLAG_RETVAL_REFERENCE = 1 << (31 - 4) ++}; ++ ++#if defined(__ppc64__) ++void ffi64_struct_to_ram_form(const ffi_type*, const char*, unsigned int*, ++ const char*, unsigned int*, unsigned int*, char*, unsigned int*); ++void ffi64_struct_to_reg_form(const ffi_type*, const char*, unsigned int*, ++ unsigned int*, char*, unsigned int*, char*, unsigned int*); ++bool ffi64_stret_needs_ptr(const ffi_type* inType, ++ unsigned short*, unsigned short*); ++#endif ++ ++#endif // !defined(LIBFFI_ASM) +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S +new file mode 100644 +index 0000000..c3d30c2 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-darwin_closure.S +@@ -0,0 +1,308 @@ ++#if defined(__ppc__) ++ ++/* ----------------------------------------------------------------------- ++ ppc-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, ++ Inc. based on ppc_closure.S ++ ++ PowerPC Assembly glue. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++ ++#include ++#include // for FFI_TRAMPOLINE_SIZE ++#include ++#include ++ ++ .file "ppc-darwin_closure.S" ++.text ++ .align LOG2_GPR_BYTES ++ .globl _ffi_closure_ASM ++ ++.text ++ .align LOG2_GPR_BYTES ++ ++_ffi_closure_ASM: ++LFB1: ++ mflr r0 // Save return address ++ stg r0,SF_RETURN(r1) ++ ++LCFI0: ++ /* 24/48 bytes (Linkage Area) ++ 32/64 bytes (outgoing parameter area, always reserved) ++ 104 bytes (13*8 from FPR) ++ 16/32 bytes (result) ++ 176/232 total bytes */ ++ ++ /* skip over caller save area and keep stack aligned to 16/32. */ ++ stgu r1,-SF_ROUND(176)(r1) ++ ++LCFI1: ++ /* We want to build up an area for the parameters passed ++ in registers. (both floating point and integer) */ ++ ++ /* 176/256 bytes (callee stack frame aligned to 16/32) ++ 24/48 bytes (caller linkage area) ++ 200/304 (start of caller parameter area aligned to 4/8) ++ */ ++ ++ /* Save GPRs 3 - 10 (aligned to 4/8) ++ in the parents outgoing area. */ ++ stg r3,200(r1) ++ stg r4,204(r1) ++ stg r5,208(r1) ++ stg r6,212(r1) ++ stg r7,216(r1) ++ stg r8,220(r1) ++ stg r9,224(r1) ++ stg r10,228(r1) ++ ++ /* Save FPRs 1 - 13. (aligned to 8) */ ++ stfd f1,56(r1) ++ stfd f2,64(r1) ++ stfd f3,72(r1) ++ stfd f4,80(r1) ++ stfd f5,88(r1) ++ stfd f6,96(r1) ++ stfd f7,104(r1) ++ stfd f8,112(r1) ++ stfd f9,120(r1) ++ stfd f10,128(r1) ++ stfd f11,136(r1) ++ stfd f12,144(r1) ++ stfd f13,152(r1) ++ ++ // Set up registers for the routine that actually does the work. ++ mr r3,r11 // context pointer from the trampoline ++ addi r4,r1,160 // result storage ++ addi r5,r1,200 // saved GPRs ++ addi r6,r1,56 // saved FPRs ++ bl Lffi_closure_helper_DARWIN$stub ++ ++ /* Now r3 contains the return type. Use it to look up in a table ++ so we know how to deal with each type. */ ++ addi r5,r1,160 // Copy result storage pointer. ++ bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. ++ mflr r4 // Move to r4. ++ slwi r3,r3,4 // Multiply return type by 16. ++ add r3,r3,r4 // Add contents of table to table address. ++ mtctr r3 ++ bctr ++ ++LFE1: ++/* Each of the ret_typeX code fragments has to be exactly 16 bytes long ++ (4 instructions). For cache effectiveness we align to a 16 byte boundary ++ first. */ ++ .align 4 ++ nop ++ nop ++ nop ++ ++Lget_ret_type0_addr: ++ blrl ++ ++/* case FFI_TYPE_VOID */ ++Lret_type0: ++ b Lfinish ++ nop ++ nop ++ nop ++ ++/* case FFI_TYPE_INT */ ++Lret_type1: ++ lwz r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_FLOAT */ ++Lret_type2: ++ lfs f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_DOUBLE */ ++Lret_type3: ++ lfd f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_LONGDOUBLE */ ++Lret_type4: ++ lfd f1,0(r5) ++ lfd f2,8(r5) ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_UINT8 */ ++Lret_type5: ++ lbz r3,3(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_SINT8 */ ++Lret_type6: ++ lbz r3,3(r5) ++ extsb r3,r3 ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_UINT16 */ ++Lret_type7: ++ lhz r3,2(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_SINT16 */ ++Lret_type8: ++ lha r3,2(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_UINT32 */ ++Lret_type9: // same as Lret_type1 ++ lwz r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_SINT32 */ ++Lret_type10: // same as Lret_type1 ++ lwz r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++/* case FFI_TYPE_UINT64 */ ++Lret_type11: ++ lwz r3,0(r5) ++ lwz r4,4(r5) ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_SINT64 */ ++Lret_type12: // same as Lret_type11 ++ lwz r3,0(r5) ++ lwz r4,4(r5) ++ b Lfinish ++ nop ++ ++/* case FFI_TYPE_STRUCT */ ++Lret_type13: ++ b Lfinish ++ nop ++ nop ++ nop ++ ++/* End 16-byte aligned cases */ ++/* case FFI_TYPE_POINTER */ ++// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types ++// are added in future, the following code will need to be updated and ++// padded to 16 bytes. ++Lret_type14: ++ lg r3,0(r5) ++ // fall through ++ ++/* case done */ ++Lfinish: ++ addi r1,r1,SF_ROUND(176) // Restore stack pointer. ++ lg r0,SF_RETURN(r1) // Restore return address. ++ mtlr r0 // Restore link register. ++ blr ++ ++/* END(ffi_closure_ASM) */ ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ; Length of Common Information Entry ++LSCIE1: ++ .long 0x0 ; CIE Identifier Tag ++ .byte 0x1 ; CIE Version ++ .ascii "zR\0" ; CIE Augmentation ++ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor ++ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte 0x41 ; CIE RA Column ++ .byte 0x1 ; uleb128 0x1; Augmentation size ++ .byte 0x10 ; FDE Encoding (pcrel) ++ .byte 0xc ; DW_CFA_def_cfa ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x0 ; uleb128 0x0 ++ .align LOG2_GPR_BYTES ++LECIE1: ++.globl _ffi_closure_ASM.eh ++_ffi_closure_ASM.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ; FDE Length ++ ++LASFDE1: ++ .long LASFDE1-EH_frame1 ; FDE CIE offset ++ .g_long LFB1-. ; FDE initial location ++ .set L$set$3,LFE1-LFB1 ++ .g_long L$set$3 ; FDE address range ++ .byte 0x0 ; uleb128 0x0; Augmentation size ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$3,LCFI1-LCFI0 ++ .long L$set$3 ++ .byte 0xe ; DW_CFA_def_cfa_offset ++ .byte 176,1 ; uleb128 176 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$4,LCFI0-LFB1 ++ .long L$set$4 ++ .byte 0x11 ; DW_CFA_offset_extended_sf ++ .byte 0x41 ; uleb128 0x41 ++ .byte 0x7e ; sleb128 -2 ++ .align LOG2_GPR_BYTES ++ ++LEFDE1: ++.data ++ .align LOG2_GPR_BYTES ++LDFCM0: ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi_closure_helper_DARWIN$stub: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ mflr r0 ++ bcl 20,31,LO$ffi_closure_helper_DARWIN ++ ++LO$ffi_closure_helper_DARWIN: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) ++ mtlr r0 ++ lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi_closure_helper_DARWIN$lazy_ptr: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ .g_long dyld_stub_binding_helper ++ ++ ++#endif // __ppc__ +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c +new file mode 100644 +index 0000000..8953d5f +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc-ffi_darwin.c +@@ -0,0 +1,1776 @@ ++#if defined(__ppc__) || defined(__ppc64__) ++ ++/* ----------------------------------------------------------------------- ++ ffi.c - Copyright (c) 1998 Geoffrey Keating ++ ++ PowerPC Foreign Function Interface ++ ++ Darwin ABI support (c) 2001 John Hornkvist ++ AIX ABI support (c) 2002 Free Software Foundation, Inc. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#if 0 ++#if defined(POWERPC_DARWIN) ++#include // for sys_icache_invalidate() ++#endif ++ ++#else ++ ++#pragma weak sys_icache_invalidate ++extern void sys_icache_invalidate(void *start, size_t len); ++ ++#endif ++ ++ ++extern void ffi_closure_ASM(void); ++ ++// The layout of a function descriptor. A C function pointer really ++// points to one of these. ++typedef struct aix_fd_struct { ++ void* code_pointer; ++ void* toc; ++} aix_fd; ++ ++/* ffi_prep_args is called by the assembly routine once stack space ++ has been allocated for the function's arguments. ++ ++ The stack layout we want looks like this: ++ ++ | Return address from ffi_call_DARWIN | higher addresses ++ |--------------------------------------------| ++ | Previous backchain pointer 4/8 | stack pointer here ++ |--------------------------------------------|-\ <<< on entry to ++ | Saved r28-r31 (4/8)*4 | | ffi_call_DARWIN ++ |--------------------------------------------| | ++ | Parameters (at least 8*(4/8)=32/64) | | (176) +112 - +288 ++ |--------------------------------------------| | ++ | Space for GPR2 4/8 | | ++ |--------------------------------------------| | stack | ++ | Reserved (4/8)*2 | | grows | ++ |--------------------------------------------| | down V ++ | Space for callee's LR 4/8 | | ++ |--------------------------------------------| | lower addresses ++ | Saved CR 4/8 | | ++ |--------------------------------------------| | stack pointer here ++ | Current backchain pointer 4/8 | | during ++ |--------------------------------------------|-/ <<< ffi_call_DARWIN ++ ++ Note: ppc64 CR is saved in the low word of a long on the stack. ++*/ ++ ++/*@-exportheader@*/ ++void ++ffi_prep_args( ++ extended_cif* inEcif, ++ unsigned *const stack) ++/*@=exportheader@*/ ++{ ++ /* Copy the ecif to a local var so we can trample the arg. ++ BC note: test this with GP later for possible problems... */ ++ volatile extended_cif* ecif = inEcif; ++ ++ const unsigned bytes = ecif->cif->bytes; ++ const unsigned flags = ecif->cif->flags; ++ ++ /* Cast the stack arg from int* to long*. sizeof(long) == 4 in 32-bit mode ++ and 8 in 64-bit mode. */ ++ unsigned long *const longStack = (unsigned long *const)stack; ++ ++ /* 'stacktop' points at the previous backchain pointer. */ ++#if defined(__ppc64__) ++ // In ppc-darwin.s, an extra 96 bytes is reserved for the linkage area, ++ // saved registers, and an extra FPR. ++ unsigned long *const stacktop = ++ (unsigned long *)(unsigned long)((char*)longStack + bytes + 96); ++#elif defined(__ppc__) ++ unsigned long *const stacktop = longStack + (bytes / sizeof(long)); ++#else ++#error undefined architecture ++#endif ++ ++ /* 'fpr_base' points at the space for fpr1, and grows upwards as ++ we use FPR registers. */ ++ double* fpr_base = (double*)(stacktop - ASM_NEEDS_REGISTERS) - ++ NUM_FPR_ARG_REGISTERS; ++ ++#if defined(__ppc64__) ++ // 64-bit saves an extra register, and uses an extra FPR. Knock fpr_base ++ // down a couple pegs. ++ fpr_base -= 2; ++#endif ++ ++ unsigned int fparg_count = 0; ++ ++ /* 'next_arg' grows up as we put parameters in it. */ ++ unsigned long* next_arg = longStack + 6; /* 6 reserved positions. */ ++ ++ int i; ++ double double_tmp; ++ void** p_argv = ecif->avalue; ++ unsigned long gprvalue; ++ ffi_type** ptr = ecif->cif->arg_types; ++ ++ /* Check that everything starts aligned properly. */ ++ FFI_ASSERT(stack == SF_ROUND(stack)); ++ FFI_ASSERT(stacktop == SF_ROUND(stacktop)); ++ FFI_ASSERT(bytes == SF_ROUND(bytes)); ++ ++ /* Deal with return values that are actually pass-by-reference. ++ Rule: ++ Return values are referenced by r3, so r4 is the first parameter. */ ++ ++ if (flags & FLAG_RETVAL_REFERENCE) ++ *next_arg++ = (unsigned long)(char*)ecif->rvalue; ++ ++ /* Now for the arguments. */ ++ for (i = ecif->cif->nargs; i > 0; i--, ptr++, p_argv++) ++ { ++ switch ((*ptr)->type) ++ { ++ /* If a floating-point parameter appears before all of the general- ++ purpose registers are filled, the corresponding GPRs that match ++ the size of the floating-point parameter are shadowed for the ++ benefit of vararg and pre-ANSI functions. */ ++ case FFI_TYPE_FLOAT: ++ double_tmp = *(float*)*p_argv; ++ ++ if (fparg_count < NUM_FPR_ARG_REGISTERS) ++ *fpr_base++ = double_tmp; ++ ++ *(double*)next_arg = double_tmp; ++ ++ next_arg++; ++ fparg_count++; ++ FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); ++ ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ double_tmp = *(double*)*p_argv; ++ ++ if (fparg_count < NUM_FPR_ARG_REGISTERS) ++ *fpr_base++ = double_tmp; ++ ++ *(double*)next_arg = double_tmp; ++ ++ next_arg += MODE_CHOICE(2,1); ++ fparg_count++; ++ FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); ++ ++ break; ++ ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++#if defined(__ppc64__) ++ if (fparg_count < NUM_FPR_ARG_REGISTERS) ++ *(long double*)fpr_base = *(long double*)*p_argv; ++#elif defined(__ppc__) ++ if (fparg_count < NUM_FPR_ARG_REGISTERS - 1) ++ *(long double*)fpr_base = *(long double*)*p_argv; ++ else if (fparg_count == NUM_FPR_ARG_REGISTERS - 1) ++ *(double*)fpr_base = *(double*)*p_argv; ++#else ++#error undefined architecture ++#endif ++ ++ *(long double*)next_arg = *(long double*)*p_argv; ++ fparg_count += 2; ++ fpr_base += 2; ++ next_arg += MODE_CHOICE(4,2); ++ FFI_ASSERT(flags & FLAG_FP_ARGUMENTS); ++ ++ break; ++#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++#if defined(__ppc64__) ++ gprvalue = *(long long*)*p_argv; ++ goto putgpr; ++#elif defined(__ppc__) ++ *(long long*)next_arg = *(long long*)*p_argv; ++ next_arg += 2; ++ break; ++#else ++#error undefined architecture ++#endif ++ ++ case FFI_TYPE_POINTER: ++ gprvalue = *(unsigned long*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_UINT8: ++ gprvalue = *(unsigned char*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_SINT8: ++ gprvalue = *(signed char*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_UINT16: ++ gprvalue = *(unsigned short*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_SINT16: ++ gprvalue = *(signed short*)*p_argv; ++ goto putgpr; ++ ++ case FFI_TYPE_STRUCT: ++ { ++#if defined(__ppc64__) ++ unsigned int gprSize = 0; ++ unsigned int fprSize = 0; ++ ++ ffi64_struct_to_reg_form(*ptr, (char*)*p_argv, NULL, &fparg_count, ++ (char*)next_arg, &gprSize, (char*)fpr_base, &fprSize); ++ next_arg += gprSize / sizeof(long); ++ fpr_base += fprSize / sizeof(double); ++ ++#elif defined(__ppc__) ++ char* dest_cpy = (char*)next_arg; ++ ++ /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, ++ SI 4 bytes) are aligned as if they were those modes. ++ Structures with 3 byte in size are padded upwards. */ ++ unsigned size_al = (*ptr)->size; ++ ++ /* If the first member of the struct is a double, then align ++ the struct to double-word. */ ++ if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) ++ size_al = ALIGN((*ptr)->size, 8); ++ ++ if (ecif->cif->abi == FFI_DARWIN) ++ { ++ if (size_al < 3) ++ dest_cpy += 4 - size_al; ++ } ++ ++ memcpy((char*)dest_cpy, (char*)*p_argv, size_al); ++ next_arg += (size_al + 3) / 4; ++#else ++#error undefined architecture ++#endif ++ break; ++ } ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ gprvalue = *(unsigned*)*p_argv; ++ ++putgpr: ++ *next_arg++ = gprvalue; ++ break; ++ ++ default: ++ break; ++ } ++ } ++ ++ /* Check that we didn't overrun the stack... */ ++ //FFI_ASSERT(gpr_base <= stacktop - ASM_NEEDS_REGISTERS); ++ //FFI_ASSERT((unsigned *)fpr_base ++ // <= stacktop - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS); ++ //FFI_ASSERT(flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4); ++} ++ ++#if defined(__ppc64__) ++ ++bool ++ffi64_struct_contains_fp( ++ const ffi_type* inType) ++{ ++ bool containsFP = false; ++ unsigned int i; ++ ++ for (i = 0; inType->elements[i] != NULL && !containsFP; i++) ++ { ++ if (inType->elements[i]->type == FFI_TYPE_FLOAT || ++ inType->elements[i]->type == FFI_TYPE_DOUBLE || ++ inType->elements[i]->type == FFI_TYPE_LONGDOUBLE) ++ containsFP = true; ++ else if (inType->elements[i]->type == FFI_TYPE_STRUCT) ++ containsFP = ffi64_struct_contains_fp(inType->elements[i]); ++ } ++ ++ return containsFP; ++} ++ ++#endif // defined(__ppc64__) ++ ++/* Perform machine dependent cif processing. */ ++ffi_status ++ffi_prep_cif_machdep( ++ ffi_cif* cif) ++{ ++ /* All this is for the DARWIN ABI. */ ++ int i; ++ ffi_type** ptr; ++ int intarg_count = 0; ++ int fparg_count = 0; ++ unsigned int flags = 0; ++ unsigned int size_al = 0; ++ ++ /* All the machine-independent calculation of cif->bytes will be wrong. ++ Redo the calculation for DARWIN. */ ++ ++ /* Space for the frame pointer, callee's LR, CR, etc, and for ++ the asm's temp regs. */ ++ unsigned int bytes = (6 + ASM_NEEDS_REGISTERS) * sizeof(long); ++ ++ /* Return value handling. The rules are as follows: ++ - 32-bit (or less) integer values are returned in gpr3; ++ - Structures of size <= 4 bytes also returned in gpr3; ++ - 64-bit integer values and structures between 5 and 8 bytes are ++ returned in gpr3 and gpr4; ++ - Single/double FP values are returned in fpr1; ++ - Long double FP (if not equivalent to double) values are returned in ++ fpr1 and fpr2; ++ - Larger structures values are allocated space and a pointer is passed ++ as the first argument. */ ++ switch (cif->rtype->type) ++ { ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ flags |= FLAG_RETURNS_128BITS; ++ flags |= FLAG_RETURNS_FP; ++ break; ++#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_DOUBLE: ++ flags |= FLAG_RETURNS_64BITS; ++ /* Fall through. */ ++ case FFI_TYPE_FLOAT: ++ flags |= FLAG_RETURNS_FP; ++ break; ++ ++#if defined(__ppc64__) ++ case FFI_TYPE_POINTER: ++#endif ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ flags |= FLAG_RETURNS_64BITS; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ { ++#if defined(__ppc64__) ++ ++ if (ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) ++ { ++ flags |= FLAG_RETVAL_REFERENCE; ++ flags |= FLAG_RETURNS_NOTHING; ++ intarg_count++; ++ } ++ else ++ { ++ flags |= FLAG_RETURNS_STRUCT; ++ ++ if (ffi64_struct_contains_fp(cif->rtype)) ++ flags |= FLAG_STRUCT_CONTAINS_FP; ++ } ++ ++#elif defined(__ppc__) ++ ++ flags |= FLAG_RETVAL_REFERENCE; ++ flags |= FLAG_RETURNS_NOTHING; ++ intarg_count++; ++ ++#else ++#error undefined architecture ++#endif ++ break; ++ } ++ ++ case FFI_TYPE_VOID: ++ flags |= FLAG_RETURNS_NOTHING; ++ break; ++ ++ default: ++ /* Returns 32-bit integer, or similar. Nothing to do here. */ ++ break; ++ } ++ ++ /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the ++ first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest ++ goes on the stack. Structures are passed as a pointer to a copy of ++ the structure. Stuff on the stack needs to keep proper alignment. */ ++ for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) ++ { ++ switch ((*ptr)->type) ++ { ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ fparg_count++; ++ /* If this FP arg is going on the stack, it must be ++ 8-byte-aligned. */ ++ if (fparg_count > NUM_FPR_ARG_REGISTERS ++ && intarg_count % 2 != 0) ++ intarg_count++; ++ break; ++ ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ case FFI_TYPE_LONGDOUBLE: ++ fparg_count += 2; ++ /* If this FP arg is going on the stack, it must be ++ 8-byte-aligned. */ ++ ++ if ( ++#if defined(__ppc64__) ++ fparg_count > NUM_FPR_ARG_REGISTERS + 1 ++#elif defined(__ppc__) ++ fparg_count > NUM_FPR_ARG_REGISTERS ++#else ++#error undefined architecture ++#endif ++ && intarg_count % 2 != 0) ++ intarg_count++; ++ ++ intarg_count += 2; ++ break; ++#endif // FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ /* 'long long' arguments are passed as two words, but ++ either both words must fit in registers or both go ++ on the stack. If they go on the stack, they must ++ be 8-byte-aligned. */ ++ if (intarg_count == NUM_GPR_ARG_REGISTERS - 1 ++ || (intarg_count >= NUM_GPR_ARG_REGISTERS ++ && intarg_count % 2 != 0)) ++ intarg_count++; ++ ++ intarg_count += MODE_CHOICE(2,1); ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ size_al = (*ptr)->size; ++ /* If the first member of the struct is a double, then align ++ the struct to double-word. */ ++ if ((*ptr)->elements[0]->type == FFI_TYPE_DOUBLE) ++ size_al = ALIGN((*ptr)->size, 8); ++ ++#if defined(__ppc64__) ++ // Look for FP struct members. ++ unsigned int j; ++ ++ for (j = 0; (*ptr)->elements[j] != NULL; j++) ++ { ++ if ((*ptr)->elements[j]->type == FFI_TYPE_FLOAT || ++ (*ptr)->elements[j]->type == FFI_TYPE_DOUBLE) ++ { ++ fparg_count++; ++ ++ if (fparg_count > NUM_FPR_ARG_REGISTERS) ++ intarg_count++; ++ } ++ else if ((*ptr)->elements[j]->type == FFI_TYPE_LONGDOUBLE) ++ { ++ fparg_count += 2; ++ ++ if (fparg_count > NUM_FPR_ARG_REGISTERS + 1) ++ intarg_count += 2; ++ } ++ else ++ intarg_count++; ++ } ++#elif defined(__ppc__) ++ intarg_count += (size_al + 3) / 4; ++#else ++#error undefined architecture ++#endif ++ ++ break; ++ ++ default: ++ /* Everything else is passed as a 4/8-byte word in a GPR, either ++ the object itself or a pointer to it. */ ++ intarg_count++; ++ break; ++ } ++ } ++ ++ /* Space for the FPR registers, if needed. */ ++ if (fparg_count != 0) ++ { ++ flags |= FLAG_FP_ARGUMENTS; ++#if defined(__ppc64__) ++ bytes += (NUM_FPR_ARG_REGISTERS + 1) * sizeof(double); ++#elif defined(__ppc__) ++ bytes += NUM_FPR_ARG_REGISTERS * sizeof(double); ++#else ++#error undefined architecture ++#endif ++ } ++ ++ /* Stack space. */ ++#if defined(__ppc64__) ++ if ((intarg_count + fparg_count) > NUM_GPR_ARG_REGISTERS) ++ bytes += (intarg_count + fparg_count) * sizeof(long); ++#elif defined(__ppc__) ++ if ((intarg_count + 2 * fparg_count) > NUM_GPR_ARG_REGISTERS) ++ bytes += (intarg_count + 2 * fparg_count) * sizeof(long); ++#else ++#error undefined architecture ++#endif ++ else ++ bytes += NUM_GPR_ARG_REGISTERS * sizeof(long); ++ ++ /* The stack space allocated needs to be a multiple of 16/32 bytes. */ ++ bytes = SF_ROUND(bytes); ++ ++ cif->flags = flags; ++ cif->bytes = bytes; ++ ++ return FFI_OK; ++} ++ ++/*@-declundef@*/ ++/*@-exportheader@*/ ++extern void ++ffi_call_AIX( ++/*@out@*/ extended_cif*, ++ unsigned, ++ unsigned, ++/*@out@*/ unsigned*, ++ void (*fn)(void), ++ void (*fn2)(extended_cif*, unsigned *const)); ++ ++extern void ++ffi_call_DARWIN( ++/*@out@*/ extended_cif*, ++ unsigned long, ++ unsigned, ++/*@out@*/ unsigned*, ++ void (*fn)(void), ++ void (*fn2)(extended_cif*, unsigned *const)); ++/*@=declundef@*/ ++/*@=exportheader@*/ ++ ++void ++ffi_call( ++/*@dependent@*/ ffi_cif* cif, ++ void (*fn)(void), ++/*@out@*/ void* rvalue, ++/*@dependent@*/ void** avalue) ++{ ++ extended_cif ecif; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return ++ value address then we need to make one. */ ++ if ((rvalue == NULL) && ++ (cif->rtype->type == FFI_TYPE_STRUCT)) ++ { ++ /*@-sysunrecog@*/ ++ ecif.rvalue = alloca(cif->rtype->size); ++ /*@=sysunrecog@*/ ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ switch (cif->abi) ++ { ++ case FFI_AIX: ++ /*@-usedef@*/ ++ ffi_call_AIX(&ecif, -cif->bytes, ++ cif->flags, ecif.rvalue, fn, ffi_prep_args); ++ /*@=usedef@*/ ++ break; ++ ++ case FFI_DARWIN: ++ /*@-usedef@*/ ++ ffi_call_DARWIN(&ecif, -(long)cif->bytes, ++ cif->flags, ecif.rvalue, fn, ffi_prep_args); ++ /*@=usedef@*/ ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++/* here I'd like to add the stack frame layout we use in darwin_closure.S ++ and aix_clsoure.S ++ ++ SP previous -> +---------------------------------------+ <--- child frame ++ | back chain to caller 4 | ++ +---------------------------------------+ 4 ++ | saved CR 4 | ++ +---------------------------------------+ 8 ++ | saved LR 4 | ++ +---------------------------------------+ 12 ++ | reserved for compilers 4 | ++ +---------------------------------------+ 16 ++ | reserved for binders 4 | ++ +---------------------------------------+ 20 ++ | saved TOC pointer 4 | ++ +---------------------------------------+ 24 ++ | always reserved 8*4=32 (previous GPRs)| ++ | according to the linkage convention | ++ | from AIX | ++ +---------------------------------------+ 56 ++ | our FPR area 13*8=104 | ++ | f1 | ++ | . | ++ | f13 | ++ +---------------------------------------+ 160 ++ | result area 8 | ++ +---------------------------------------+ 168 ++ | alignement to the next multiple of 16 | ++SP current --> +---------------------------------------+ 176 <- parent frame ++ | back chain to caller 4 | ++ +---------------------------------------+ 180 ++ | saved CR 4 | ++ +---------------------------------------+ 184 ++ | saved LR 4 | ++ +---------------------------------------+ 188 ++ | reserved for compilers 4 | ++ +---------------------------------------+ 192 ++ | reserved for binders 4 | ++ +---------------------------------------+ 196 ++ | saved TOC pointer 4 | ++ +---------------------------------------+ 200 ++ | always reserved 8*4=32 we store our | ++ | GPRs here | ++ | r3 | ++ | . | ++ | r10 | ++ +---------------------------------------+ 232 ++ | overflow part | ++ +---------------------------------------+ xxx ++ | ???? | ++ +---------------------------------------+ xxx ++*/ ++ ++#if !defined(POWERPC_DARWIN) ++ ++#define MIN_LINE_SIZE 32 ++ ++static void ++flush_icache( ++ char* addr) ++{ ++#ifndef _AIX ++ __asm__ volatile ( ++ "dcbf 0,%0\n" ++ "sync\n" ++ "icbi 0,%0\n" ++ "sync\n" ++ "isync" ++ : : "r" (addr) : "memory"); ++#endif ++} ++ ++static void ++flush_range( ++ char* addr, ++ int size) ++{ ++ int i; ++ ++ for (i = 0; i < size; i += MIN_LINE_SIZE) ++ flush_icache(addr + i); ++ ++ flush_icache(addr + size - 1); ++} ++ ++#endif // !defined(POWERPC_DARWIN) ++ ++ffi_status ++ffi_prep_closure( ++ ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*, void*, void**, void*), ++ void* user_data) ++{ ++ switch (cif->abi) ++ { ++ case FFI_DARWIN: ++ { ++ FFI_ASSERT (cif->abi == FFI_DARWIN); ++ ++ unsigned int* tramp = (unsigned int*)&closure->tramp[0]; ++ ++#if defined(__ppc64__) ++ tramp[0] = 0x7c0802a6; // mflr r0 ++ tramp[1] = 0x429f0005; // bcl 20,31,+0x8 ++ tramp[2] = 0x7d6802a6; // mflr r11 ++ tramp[3] = 0x7c0803a6; // mtlr r0 ++ tramp[4] = 0xe98b0018; // ld r12,24(r11) ++ tramp[5] = 0x7d8903a6; // mtctr r12 ++ tramp[6] = 0xe96b0020; // ld r11,32(r11) ++ tramp[7] = 0x4e800420; // bctr ++ *(unsigned long*)&tramp[8] = (unsigned long)ffi_closure_ASM; ++ *(unsigned long*)&tramp[10] = (unsigned long)closure; ++#elif defined(__ppc__) ++ tramp[0] = 0x7c0802a6; // mflr r0 ++ tramp[1] = 0x429f0005; // bcl 20,31,+0x8 ++ tramp[2] = 0x7d6802a6; // mflr r11 ++ tramp[3] = 0x7c0803a6; // mtlr r0 ++ tramp[4] = 0x818b0018; // lwz r12,24(r11) ++ tramp[5] = 0x7d8903a6; // mtctr r12 ++ tramp[6] = 0x816b001c; // lwz r11,28(r11) ++ tramp[7] = 0x4e800420; // bctr ++ tramp[8] = (unsigned long)ffi_closure_ASM; ++ tramp[9] = (unsigned long)closure; ++#else ++#error undefined architecture ++#endif ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ ++ // Flush the icache. Only necessary on Darwin. ++#if defined(POWERPC_DARWIN) ++ sys_icache_invalidate(closure->tramp, FFI_TRAMPOLINE_SIZE); ++#else ++ flush_range(closure->tramp, FFI_TRAMPOLINE_SIZE); ++#endif ++ ++ break; ++ } ++ ++ case FFI_AIX: ++ { ++ FFI_ASSERT (cif->abi == FFI_AIX); ++ ++ ffi_aix_trampoline_struct* tramp_aix = ++ (ffi_aix_trampoline_struct*)(closure->tramp); ++ aix_fd* fd = (aix_fd*)(void*)ffi_closure_ASM; ++ ++ tramp_aix->code_pointer = fd->code_pointer; ++ tramp_aix->toc = fd->toc; ++ tramp_aix->static_chain = closure; ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ break; ++ } ++ ++ default: ++ return FFI_BAD_ABI; ++ } ++ ++ return FFI_OK; ++} ++ ++#if defined(__ppc__) ++ typedef double ldbits[2]; ++ ++ typedef union ++ { ++ ldbits lb; ++ long double ld; ++ } ldu; ++#endif ++ ++typedef union ++{ ++ float f; ++ double d; ++} ffi_dblfl; ++ ++/* The trampoline invokes ffi_closure_ASM, and on entry, r11 holds the ++ address of the closure. After storing the registers that could possibly ++ contain parameters to be passed into the stack frame and setting up space ++ for a return value, ffi_closure_ASM invokes the following helper function ++ to do most of the work. */ ++int ++ffi_closure_helper_DARWIN( ++ ffi_closure* closure, ++ void* rvalue, ++ unsigned long* pgr, ++ ffi_dblfl* pfr) ++{ ++ /* rvalue is the pointer to space for return value in closure assembly ++ pgr is the pointer to where r3-r10 are stored in ffi_closure_ASM ++ pfr is the pointer to where f1-f13 are stored in ffi_closure_ASM. */ ++ ++#if defined(__ppc__) ++ ldu temp_ld; ++#endif ++ ++ double temp; ++ unsigned int i; ++ unsigned int nf = 0; /* number of FPRs already used. */ ++ unsigned int ng = 0; /* number of GPRs already used. */ ++ ffi_cif* cif = closure->cif; ++ long avn = cif->nargs; ++ void** avalue = alloca(cif->nargs * sizeof(void*)); ++ ffi_type** arg_types = cif->arg_types; ++ ++ /* Copy the caller's structure return value address so that the closure ++ returns the data directly to the caller. */ ++#if defined(__ppc64__) ++ if (cif->rtype->type == FFI_TYPE_STRUCT && ++ ffi64_stret_needs_ptr(cif->rtype, NULL, NULL)) ++#elif defined(__ppc__) ++ if (cif->rtype->type == FFI_TYPE_STRUCT) ++#else ++#error undefined architecture ++#endif ++ { ++ rvalue = (void*)*pgr; ++ pgr++; ++ ng++; ++ } ++ ++ /* Grab the addresses of the arguments from the stack frame. */ ++ for (i = 0; i < avn; i++) ++ { ++ switch (arg_types[i]->type) ++ { ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT8: ++ avalue[i] = (char*)pgr + MODE_CHOICE(3,7); ++ ng++; ++ pgr++; ++ break; ++ ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT16: ++ avalue[i] = (char*)pgr + MODE_CHOICE(2,6); ++ ng++; ++ pgr++; ++ break; ++ ++#if defined(__ppc__) ++ case FFI_TYPE_POINTER: ++#endif ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT32: ++ avalue[i] = (char*)pgr + MODE_CHOICE(0,4); ++ ng++; ++ pgr++; ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ if (cif->abi == FFI_DARWIN) ++ { ++#if defined(__ppc64__) ++ unsigned int gprSize = 0; ++ unsigned int fprSize = 0; ++ unsigned int savedFPRSize = fprSize; ++ ++ avalue[i] = alloca(arg_types[i]->size); ++ ffi64_struct_to_ram_form(arg_types[i], (const char*)pgr, ++ &gprSize, (const char*)pfr, &fprSize, &nf, avalue[i], NULL); ++ ++ ng += gprSize / sizeof(long); ++ pgr += gprSize / sizeof(long); ++ pfr += (fprSize - savedFPRSize) / sizeof(double); ++ ++#elif defined(__ppc__) ++ /* Structures that match the basic modes (QI 1 byte, HI 2 bytes, ++ SI 4 bytes) are aligned as if they were those modes. */ ++ unsigned int size_al = size_al = arg_types[i]->size; ++ ++ /* If the first member of the struct is a double, then align ++ the struct to double-word. */ ++ if (arg_types[i]->elements[0]->type == FFI_TYPE_DOUBLE) ++ size_al = ALIGN(arg_types[i]->size, 8); ++ ++ if (size_al < 3) ++ avalue[i] = (void*)pgr + MODE_CHOICE(4,8) - size_al; ++ else ++ avalue[i] = (void*)pgr; ++ ++ ng += (size_al + 3) / sizeof(long); ++ pgr += (size_al + 3) / sizeof(long); ++#else ++#error undefined architecture ++#endif ++ } ++ ++ break; ++ ++#if defined(__ppc64__) ++ case FFI_TYPE_POINTER: ++#endif ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_UINT64: ++ /* Long long ints are passed in 1 or 2 GPRs. */ ++ avalue[i] = pgr; ++ ng += MODE_CHOICE(2,1); ++ pgr += MODE_CHOICE(2,1); ++ ++ break; ++ ++ case FFI_TYPE_FLOAT: ++ /* A float value consumes a GPR. ++ There are 13 64-bit floating point registers. */ ++ if (nf < NUM_FPR_ARG_REGISTERS) ++ { ++ temp = pfr->d; ++ pfr->f = (float)temp; ++ avalue[i] = pfr; ++ pfr++; ++ } ++ else ++ avalue[i] = pgr; ++ ++ nf++; ++ ng++; ++ pgr++; ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ /* A double value consumes one or two GPRs. ++ There are 13 64bit floating point registers. */ ++ if (nf < NUM_FPR_ARG_REGISTERS) ++ { ++ avalue[i] = pfr; ++ pfr++; ++ } ++ else ++ avalue[i] = pgr; ++ ++ nf++; ++ ng += MODE_CHOICE(2,1); ++ pgr += MODE_CHOICE(2,1); ++ ++ break; ++ ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ ++ case FFI_TYPE_LONGDOUBLE: ++#if defined(__ppc64__) ++ if (nf < NUM_FPR_ARG_REGISTERS) ++ { ++ avalue[i] = pfr; ++ pfr += 2; ++ } ++#elif defined(__ppc__) ++ /* A long double value consumes 2/4 GPRs and 2 FPRs. ++ There are 13 64bit floating point registers. */ ++ if (nf < NUM_FPR_ARG_REGISTERS - 1) ++ { ++ avalue[i] = pfr; ++ pfr += 2; ++ } ++ /* Here we have the situation where one part of the long double ++ is stored in fpr13 and the other part is already on the stack. ++ We use a union to pass the long double to avalue[i]. */ ++ else if (nf == NUM_FPR_ARG_REGISTERS - 1) ++ { ++ memcpy (&temp_ld.lb[0], pfr, sizeof(temp_ld.lb[0])); ++ memcpy (&temp_ld.lb[1], pgr + 2, sizeof(temp_ld.lb[1])); ++ avalue[i] = &temp_ld.ld; ++ } ++#else ++#error undefined architecture ++#endif ++ else ++ avalue[i] = pgr; ++ ++ nf += 2; ++ ng += MODE_CHOICE(4,2); ++ pgr += MODE_CHOICE(4,2); ++ ++ break; ++ ++#endif /* FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE */ ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ } ++ ++ (closure->fun)(cif, rvalue, avalue, closure->user_data); ++ ++ /* Tell ffi_closure_ASM to perform return type promotions. */ ++ return cif->rtype->type; ++} ++ ++#if defined(__ppc64__) ++ ++/* ffi64_struct_to_ram_form ++ ++ Rebuild a struct's natural layout from buffers of concatenated registers. ++ Return the number of registers used. ++ inGPRs[0-7] == r3, inFPRs[0-7] == f1 ... ++*/ ++void ++ffi64_struct_to_ram_form( ++ const ffi_type* inType, ++ const char* inGPRs, ++ unsigned int* ioGPRMarker, ++ const char* inFPRs, ++ unsigned int* ioFPRMarker, ++ unsigned int* ioFPRsUsed, ++ char* outStruct, // caller-allocated ++ unsigned int* ioStructMarker) ++{ ++ unsigned int srcGMarker = 0; ++ unsigned int srcFMarker = 0; ++ unsigned int savedFMarker = 0; ++ unsigned int fprsUsed = 0; ++ unsigned int savedFPRsUsed = 0; ++ unsigned int destMarker = 0; ++ ++ static unsigned int recurseCount = 0; ++ ++ if (ioGPRMarker) ++ srcGMarker = *ioGPRMarker; ++ ++ if (ioFPRMarker) ++ { ++ srcFMarker = *ioFPRMarker; ++ savedFMarker = srcFMarker; ++ } ++ ++ if (ioFPRsUsed) ++ { ++ fprsUsed = *ioFPRsUsed; ++ savedFPRsUsed = fprsUsed; ++ } ++ ++ if (ioStructMarker) ++ destMarker = *ioStructMarker; ++ ++ size_t i; ++ ++ switch (inType->size) ++ { ++ case 1: case 2: case 4: ++ srcGMarker += 8 - inType->size; ++ break; ++ ++ default: ++ break; ++ } ++ ++ for (i = 0; inType->elements[i] != NULL; i++) ++ { ++ switch (inType->elements[i]->type) ++ { ++ case FFI_TYPE_FLOAT: ++ srcFMarker = ALIGN(srcFMarker, 4); ++ srcGMarker = ALIGN(srcGMarker, 4); ++ destMarker = ALIGN(destMarker, 4); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ *(float*)&outStruct[destMarker] = ++ (float)*(double*)&inFPRs[srcFMarker]; ++ srcFMarker += 8; ++ fprsUsed++; ++ } ++ else ++ *(float*)&outStruct[destMarker] = ++ (float)*(double*)&inGPRs[srcGMarker]; ++ ++ srcGMarker += 4; ++ destMarker += 4; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (destMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) ++ srcGMarker = ALIGN(srcGMarker, 8); ++ } ++ ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ srcFMarker = ALIGN(srcFMarker, 8); ++ destMarker = ALIGN(destMarker, 8); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ *(double*)&outStruct[destMarker] = ++ *(double*)&inFPRs[srcFMarker]; ++ srcFMarker += 8; ++ fprsUsed++; ++ } ++ else ++ *(double*)&outStruct[destMarker] = ++ *(double*)&inGPRs[srcGMarker]; ++ ++ destMarker += 8; ++ ++ // Skip next GPR ++ srcGMarker += 8; ++ srcGMarker = ALIGN(srcGMarker, 8); ++ ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ destMarker = ALIGN(destMarker, 16); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ srcFMarker = ALIGN(srcFMarker, 8); ++ srcGMarker = ALIGN(srcGMarker, 8); ++ *(long double*)&outStruct[destMarker] = ++ *(long double*)&inFPRs[srcFMarker]; ++ srcFMarker += 16; ++ fprsUsed += 2; ++ } ++ else ++ { ++ srcFMarker = ALIGN(srcFMarker, 16); ++ srcGMarker = ALIGN(srcGMarker, 16); ++ *(long double*)&outStruct[destMarker] = ++ *(long double*)&inGPRs[srcGMarker]; ++ } ++ ++ destMarker += 16; ++ ++ // Skip next 2 GPRs ++ srcGMarker += 16; ++ srcGMarker = ALIGN(srcGMarker, 8); ++ ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ { ++ if (inType->alignment == 1) // chars only ++ { ++ if (inType->size == 1) ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ else if (inType->size == 2) ++ { ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ i++; ++ } ++ else ++ { ++ memcpy(&outStruct[destMarker], ++ &inGPRs[srcGMarker], inType->size); ++ srcGMarker += inType->size; ++ destMarker += inType->size; ++ i += inType->size - 1; ++ } ++ } ++ else // chars and other stuff ++ { ++ outStruct[destMarker++] = inGPRs[srcGMarker++]; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (srcGMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(srcGMarker, 8) - srcGMarker) < 4)) ++ srcGMarker = ALIGN(srcGMarker, inType->alignment); // was 8 ++ } ++ } ++ ++ break; ++ } ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ srcGMarker = ALIGN(srcGMarker, 2); ++ destMarker = ALIGN(destMarker, 2); ++ ++ *(short*)&outStruct[destMarker] = ++ *(short*)&inGPRs[srcGMarker]; ++ srcGMarker += 2; ++ destMarker += 2; ++ ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ srcGMarker = ALIGN(srcGMarker, 4); ++ destMarker = ALIGN(destMarker, 4); ++ ++ *(int*)&outStruct[destMarker] = ++ *(int*)&inGPRs[srcGMarker]; ++ srcGMarker += 4; ++ destMarker += 4; ++ ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ srcGMarker = ALIGN(srcGMarker, 8); ++ destMarker = ALIGN(destMarker, 8); ++ ++ *(long long*)&outStruct[destMarker] = ++ *(long long*)&inGPRs[srcGMarker]; ++ srcGMarker += 8; ++ destMarker += 8; ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ recurseCount++; ++ ffi64_struct_to_ram_form(inType->elements[i], inGPRs, ++ &srcGMarker, inFPRs, &srcFMarker, &fprsUsed, ++ outStruct, &destMarker); ++ recurseCount--; ++ break; ++ ++ default: ++ FFI_ASSERT(0); // unknown element type ++ break; ++ } ++ } ++ ++ srcGMarker = ALIGN(srcGMarker, inType->alignment); ++ ++ // Take care of the special case for 16-byte structs, but not for ++ // nested structs. ++ if (recurseCount == 0 && srcGMarker == 16) ++ { ++ *(long double*)&outStruct[0] = *(long double*)&inGPRs[0]; ++ srcFMarker = savedFMarker; ++ fprsUsed = savedFPRsUsed; ++ } ++ ++ if (ioGPRMarker) ++ *ioGPRMarker = ALIGN(srcGMarker, 8); ++ ++ if (ioFPRMarker) ++ *ioFPRMarker = srcFMarker; ++ ++ if (ioFPRsUsed) ++ *ioFPRsUsed = fprsUsed; ++ ++ if (ioStructMarker) ++ *ioStructMarker = ALIGN(destMarker, 8); ++} ++ ++/* ffi64_struct_to_reg_form ++ ++ Copy a struct's elements into buffers that can be sliced into registers. ++ Return the sizes of the output buffers in bytes. Pass NULL buffer pointers ++ to calculate size only. ++ outGPRs[0-7] == r3, outFPRs[0-7] == f1 ... ++*/ ++void ++ffi64_struct_to_reg_form( ++ const ffi_type* inType, ++ const char* inStruct, ++ unsigned int* ioStructMarker, ++ unsigned int* ioFPRsUsed, ++ char* outGPRs, // caller-allocated ++ unsigned int* ioGPRSize, ++ char* outFPRs, // caller-allocated ++ unsigned int* ioFPRSize) ++{ ++ size_t i; ++ unsigned int srcMarker = 0; ++ unsigned int destGMarker = 0; ++ unsigned int destFMarker = 0; ++ unsigned int savedFMarker = 0; ++ unsigned int fprsUsed = 0; ++ unsigned int savedFPRsUsed = 0; ++ ++ static unsigned int recurseCount = 0; ++ ++ if (ioStructMarker) ++ srcMarker = *ioStructMarker; ++ ++ if (ioFPRsUsed) ++ { ++ fprsUsed = *ioFPRsUsed; ++ savedFPRsUsed = fprsUsed; ++ } ++ ++ if (ioGPRSize) ++ destGMarker = *ioGPRSize; ++ ++ if (ioFPRSize) ++ { ++ destFMarker = *ioFPRSize; ++ savedFMarker = destFMarker; ++ } ++ ++ switch (inType->size) ++ { ++ case 1: case 2: case 4: ++ destGMarker += 8 - inType->size; ++ break; ++ ++ default: ++ break; ++ } ++ ++ for (i = 0; inType->elements[i] != NULL; i++) ++ { ++ switch (inType->elements[i]->type) ++ { ++ // Shadow floating-point types in GPRs for vararg and pre-ANSI ++ // functions. ++ case FFI_TYPE_FLOAT: ++ // Nudge markers to next 4/8-byte boundary ++ srcMarker = ALIGN(srcMarker, 4); ++ destGMarker = ALIGN(destGMarker, 4); ++ destFMarker = ALIGN(destFMarker, 8); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ if (outFPRs != NULL && inStruct != NULL) ++ *(double*)&outFPRs[destFMarker] = ++ (double)*(float*)&inStruct[srcMarker]; ++ ++ destFMarker += 8; ++ fprsUsed++; ++ } ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(double*)&outGPRs[destGMarker] = ++ (double)*(float*)&inStruct[srcMarker]; ++ ++ srcMarker += 4; ++ destGMarker += 4; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (srcMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 4)) ++ destGMarker = ALIGN(destGMarker, 8); ++ } ++ ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ srcMarker = ALIGN(srcMarker, 8); ++ destFMarker = ALIGN(destFMarker, 8); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ if (outFPRs != NULL && inStruct != NULL) ++ *(double*)&outFPRs[destFMarker] = ++ *(double*)&inStruct[srcMarker]; ++ ++ destFMarker += 8; ++ fprsUsed++; ++ } ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(double*)&outGPRs[destGMarker] = ++ *(double*)&inStruct[srcMarker]; ++ ++ srcMarker += 8; ++ ++ // Skip next GPR ++ destGMarker += 8; ++ destGMarker = ALIGN(destGMarker, 8); ++ ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ srcMarker = ALIGN(srcMarker, 16); ++ ++ if (fprsUsed < NUM_FPR_ARG_REGISTERS) ++ { ++ destFMarker = ALIGN(destFMarker, 8); ++ destGMarker = ALIGN(destGMarker, 8); ++ ++ if (outFPRs != NULL && inStruct != NULL) ++ *(long double*)&outFPRs[destFMarker] = ++ *(long double*)&inStruct[srcMarker]; ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long double*)&outGPRs[destGMarker] = ++ *(long double*)&inStruct[srcMarker]; ++ ++ destFMarker += 16; ++ fprsUsed += 2; ++ } ++ else ++ { ++ destGMarker = ALIGN(destGMarker, 16); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long double*)&outGPRs[destGMarker] = ++ *(long double*)&inStruct[srcMarker]; ++ } ++ ++ srcMarker += 16; ++ destGMarker += 16; // Skip next 2 GPRs ++ destGMarker = ALIGN(destGMarker, 8); // was 16 ++ ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ if (inType->alignment == 1) // bytes only ++ { ++ if (inType->size == 1) ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ outGPRs[destGMarker] = inStruct[srcMarker]; ++ ++ srcMarker++; ++ destGMarker++; ++ } ++ else if (inType->size == 2) ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ { ++ outGPRs[destGMarker] = inStruct[srcMarker]; ++ outGPRs[destGMarker + 1] = inStruct[srcMarker + 1]; ++ } ++ ++ srcMarker += 2; ++ destGMarker += 2; ++ ++ i++; ++ } ++ else ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ { ++ // Avoid memcpy for small chunks. ++ if (inType->size <= sizeof(long)) ++ *(long*)&outGPRs[destGMarker] = ++ *(long*)&inStruct[srcMarker]; ++ else ++ memcpy(&outGPRs[destGMarker], ++ &inStruct[srcMarker], inType->size); ++ } ++ ++ srcMarker += inType->size; ++ destGMarker += inType->size; ++ i += inType->size - 1; ++ } ++ } ++ else // bytes and other stuff ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ outGPRs[destGMarker] = inStruct[srcMarker]; ++ ++ srcMarker++; ++ destGMarker++; ++ ++ // Skip to next GPR if next element won't fit and we're ++ // not already at a register boundary. ++ if (inType->elements[i + 1] != NULL && (destGMarker % 8)) ++ { ++ if (!FFI_TYPE_1_BYTE(inType->elements[i + 1]->type) && ++ (!FFI_TYPE_2_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 2) && ++ (!FFI_TYPE_4_BYTE(inType->elements[i + 1]->type) || ++ (ALIGN(destGMarker, 8) - destGMarker) < 4)) ++ destGMarker = ALIGN(destGMarker, inType->alignment); // was 8 ++ } ++ } ++ ++ break; ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ srcMarker = ALIGN(srcMarker, 2); ++ destGMarker = ALIGN(destGMarker, 2); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(short*)&outGPRs[destGMarker] = ++ *(short*)&inStruct[srcMarker]; ++ ++ srcMarker += 2; ++ destGMarker += 2; ++ ++ if (inType->elements[i + 1] == NULL) ++ destGMarker = ALIGN(destGMarker, inType->alignment); ++ ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ srcMarker = ALIGN(srcMarker, 4); ++ destGMarker = ALIGN(destGMarker, 4); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(int*)&outGPRs[destGMarker] = ++ *(int*)&inStruct[srcMarker]; ++ ++ srcMarker += 4; ++ destGMarker += 4; ++ ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ srcMarker = ALIGN(srcMarker, 8); ++ destGMarker = ALIGN(destGMarker, 8); ++ ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long long*)&outGPRs[destGMarker] = ++ *(long long*)&inStruct[srcMarker]; ++ ++ srcMarker += 8; ++ destGMarker += 8; ++ ++ if (inType->elements[i + 1] == NULL) ++ destGMarker = ALIGN(destGMarker, inType->alignment); ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ recurseCount++; ++ ffi64_struct_to_reg_form(inType->elements[i], ++ inStruct, &srcMarker, &fprsUsed, outGPRs, ++ &destGMarker, outFPRs, &destFMarker); ++ recurseCount--; ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ } ++ ++ destGMarker = ALIGN(destGMarker, inType->alignment); ++ ++ // Take care of the special case for 16-byte structs, but not for ++ // nested structs. ++ if (recurseCount == 0 && destGMarker == 16) ++ { ++ if (outGPRs != NULL && inStruct != NULL) ++ *(long double*)&outGPRs[0] = *(long double*)&inStruct[0]; ++ ++ destFMarker = savedFMarker; ++ fprsUsed = savedFPRsUsed; ++ } ++ ++ if (ioStructMarker) ++ *ioStructMarker = ALIGN(srcMarker, 8); ++ ++ if (ioFPRsUsed) ++ *ioFPRsUsed = fprsUsed; ++ ++ if (ioGPRSize) ++ *ioGPRSize = ALIGN(destGMarker, 8); ++ ++ if (ioFPRSize) ++ *ioFPRSize = ALIGN(destFMarker, 8); ++} ++ ++/* ffi64_stret_needs_ptr ++ ++ Determine whether a returned struct needs a pointer in r3 or can fit ++ in registers. ++*/ ++ ++bool ++ffi64_stret_needs_ptr( ++ const ffi_type* inType, ++ unsigned short* ioGPRCount, ++ unsigned short* ioFPRCount) ++{ ++ // Obvious case first- struct is larger than combined FPR size. ++ if (inType->size > 14 * 8) ++ return true; ++ ++ // Now the struct can physically fit in registers, determine if it ++ // also fits logically. ++ bool needsPtr = false; ++ unsigned short gprsUsed = 0; ++ unsigned short fprsUsed = 0; ++ size_t i; ++ ++ if (ioGPRCount) ++ gprsUsed = *ioGPRCount; ++ ++ if (ioFPRCount) ++ fprsUsed = *ioFPRCount; ++ ++ for (i = 0; inType->elements[i] != NULL && !needsPtr; i++) ++ { ++ switch (inType->elements[i]->type) ++ { ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ gprsUsed++; ++ fprsUsed++; ++ ++ if (fprsUsed > 13) ++ needsPtr = true; ++ ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ gprsUsed += 2; ++ fprsUsed += 2; ++ ++ if (fprsUsed > 14) ++ needsPtr = true; ++ ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ { ++ gprsUsed++; ++ ++ if (gprsUsed > 8) ++ { ++ needsPtr = true; ++ break; ++ } ++ ++ if (inType->elements[i + 1] == NULL) // last byte in the struct ++ break; ++ ++ // Count possible contiguous bytes ahead, up to 8. ++ unsigned short j; ++ ++ for (j = 1; j < 8; j++) ++ { ++ if (inType->elements[i + j] == NULL || ++ !FFI_TYPE_1_BYTE(inType->elements[i + j]->type)) ++ break; ++ } ++ ++ i += j - 1; // allow for i++ before the test condition ++ ++ break; ++ } ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ gprsUsed++; ++ ++ if (gprsUsed > 8) ++ needsPtr = true; ++ ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ needsPtr = ffi64_stret_needs_ptr( ++ inType->elements[i], &gprsUsed, &fprsUsed); ++ ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ } ++ ++ if (ioGPRCount) ++ *ioGPRCount = gprsUsed; ++ ++ if (ioFPRCount) ++ *ioFPRCount = fprsUsed; ++ ++ return needsPtr; ++} ++ ++/* ffi64_data_size ++ ++ Calculate the size in bytes of an ffi type. ++*/ ++ ++unsigned int ++ffi64_data_size( ++ const ffi_type* inType) ++{ ++ unsigned int size = 0; ++ ++ switch (inType->type) ++ { ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ size = 1; ++ break; ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ size = 2; ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_FLOAT: ++ size = 4; ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_DOUBLE: ++ size = 8; ++ break; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ size = 16; ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ ffi64_struct_to_reg_form( ++ inType, NULL, NULL, NULL, NULL, &size, NULL, NULL); ++ break; ++ ++ case FFI_TYPE_VOID: ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++ ++ return size; ++} ++ ++#endif /* defined(__ppc64__) */ ++#endif /* __ppc__ || __ppc64__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S +new file mode 100644 +index 0000000..7162fa1 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/powerpc/ppc64-darwin_closure.S +@@ -0,0 +1,418 @@ ++#if defined(__ppc64__) ++ ++/* ----------------------------------------------------------------------- ++ ppc64-darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation, ++ Inc. based on ppc_closure.S ++ ++ PowerPC Assembly glue. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++ ++#include ++#include // for FFI_TRAMPOLINE_SIZE ++#include ++#include ++ ++ .file "ppc64-darwin_closure.S" ++.text ++ .align LOG2_GPR_BYTES ++ .globl _ffi_closure_ASM ++ ++.text ++ .align LOG2_GPR_BYTES ++ ++_ffi_closure_ASM: ++LFB1: ++ mflr r0 ++ stg r0,SF_RETURN(r1) // save return address ++ ++ // Save GPRs 3 - 10 (aligned to 8) in the parents outgoing area. ++ stg r3,SF_ARG1(r1) ++ stg r4,SF_ARG2(r1) ++ stg r5,SF_ARG3(r1) ++ stg r6,SF_ARG4(r1) ++ stg r7,SF_ARG5(r1) ++ stg r8,SF_ARG6(r1) ++ stg r9,SF_ARG7(r1) ++ stg r10,SF_ARG8(r1) ++ ++LCFI0: ++/* 48 bytes (Linkage Area) ++ 64 bytes (outgoing parameter area, always reserved) ++ 112 bytes (14*8 for incoming FPR) ++ ? bytes (result) ++ 112 bytes (14*8 for outgoing FPR) ++ 16 bytes (2 saved registers) ++ 352 + ? total bytes ++*/ ++ ++ std r31,-8(r1) // Save registers we use. ++ std r30,-16(r1) ++ mr r30,r1 // Save the old SP. ++ mr r31,r11 // Save the ffi_closure around ffi64_data_size. ++ ++ // Calculate the space we need. ++ stdu r1,-SF_MINSIZE(r1) ++ ld r3,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* ++ ld r3,16(r3) // ffi_cif->rtype* ++ bl Lffi64_data_size$stub ++ ld r1,0(r1) ++ ++ addi r3,r3,352 // Add our overhead. ++ neg r3,r3 ++ li r0,-32 // Align to 32 bytes. ++ and r3,r3,r0 ++ stdux r1,r1,r3 // Grow the stack. ++ ++ mr r11,r31 // Copy the ffi_closure back. ++ ++LCFI1: ++ // We want to build up an area for the parameters passed ++ // in registers. (both floating point and integer) ++ ++/* 320 bytes (callee stack frame aligned to 32) ++ 48 bytes (caller linkage area) ++ 368 (start of caller parameter area aligned to 8) ++*/ ++ ++ // Save FPRs 1 - 14. (aligned to 8) ++ stfd f1,112(r1) ++ stfd f2,120(r1) ++ stfd f3,128(r1) ++ stfd f4,136(r1) ++ stfd f5,144(r1) ++ stfd f6,152(r1) ++ stfd f7,160(r1) ++ stfd f8,168(r1) ++ stfd f9,176(r1) ++ stfd f10,184(r1) ++ stfd f11,192(r1) ++ stfd f12,200(r1) ++ stfd f13,208(r1) ++ stfd f14,216(r1) ++ ++ // Set up registers for the routine that actually does the work. ++ mr r3,r11 // context pointer from the trampoline ++ addi r4,r1,224 // result storage ++ addi r5,r30,SF_ARG1 // saved GPRs ++ addi r6,r1,112 // saved FPRs ++ bl Lffi_closure_helper_DARWIN$stub ++ ++ // Look the proper starting point in table ++ // by using return type as an offset. ++ addi r5,r1,224 // Get pointer to results area. ++ bl Lget_ret_type0_addr // Get pointer to Lret_type0 into LR. ++ mflr r4 // Move to r4. ++ slwi r3,r3,4 // Now multiply return type by 16. ++ add r3,r3,r4 // Add contents of table to table address. ++ mtctr r3 ++ bctr ++ ++LFE1: ++ // Each of the ret_typeX code fragments has to be exactly 16 bytes long ++ // (4 instructions). For cache effectiveness we align to a 16 byte ++ // boundary first. ++ .align 4 ++ nop ++ nop ++ nop ++ ++Lget_ret_type0_addr: ++ blrl ++ ++// case FFI_TYPE_VOID ++Lret_type0: ++ b Lfinish ++ nop ++ nop ++ nop ++ ++// case FFI_TYPE_INT ++Lret_type1: ++ lwz r3,4(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_FLOAT ++Lret_type2: ++ lfs f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_DOUBLE ++Lret_type3: ++ lfd f1,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_LONGDOUBLE ++Lret_type4: ++ lfd f1,0(r5) ++ lfd f2,8(r5) ++ b Lfinish ++ nop ++ ++// case FFI_TYPE_UINT8 ++Lret_type5: ++ lbz r3,7(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT8 ++Lret_type6: ++ lbz r3,7(r5) ++ extsb r3,r3 ++ b Lfinish ++ nop ++ ++// case FFI_TYPE_UINT16 ++Lret_type7: ++ lhz r3,6(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT16 ++Lret_type8: ++ lha r3,6(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_UINT32 ++Lret_type9: // same as Lret_type1 ++ lwz r3,4(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT32 ++Lret_type10: // same as Lret_type1 ++ lwz r3,4(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_UINT64 ++Lret_type11: ++ ld r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_SINT64 ++Lret_type12: // same as Lret_type11 ++ ld r3,0(r5) ++ b Lfinish ++ nop ++ nop ++ ++// case FFI_TYPE_STRUCT ++Lret_type13: ++ b Lret_struct ++ nop ++ nop ++ nop ++ ++// ** End 16-byte aligned cases ** ++// case FFI_TYPE_POINTER ++// This case assumes that FFI_TYPE_POINTER == FFI_TYPE_LAST. If more types ++// are added in future, the following code will need to be updated and ++// padded to 16 bytes. ++Lret_type14: ++ lg r3,0(r5) ++ b Lfinish ++ ++// copy struct into registers ++Lret_struct: ++ ld r31,FFI_TRAMPOLINE_SIZE(r31) // ffi_closure->cif* ++ ld r3,16(r31) // ffi_cif->rtype* ++ ld r31,24(r31) // ffi_cif->flags ++ mr r4,r5 // copy struct* to 2nd arg ++ addi r7,r1,SF_ARG9 // GPR return area ++ addi r9,r30,-16-(14*8) // FPR return area ++ li r5,0 // struct offset ptr (NULL) ++ li r6,0 // FPR used count ptr (NULL) ++ li r8,0 // GPR return area size ptr (NULL) ++ li r10,0 // FPR return area size ptr (NULL) ++ bl Lffi64_struct_to_reg_form$stub ++ ++ // Load GPRs ++ ld r3,SF_ARG9(r1) ++ ld r4,SF_ARG10(r1) ++ ld r5,SF_ARG11(r1) ++ ld r6,SF_ARG12(r1) ++ nop ++ ld r7,SF_ARG13(r1) ++ ld r8,SF_ARG14(r1) ++ ld r9,SF_ARG15(r1) ++ ld r10,SF_ARG16(r1) ++ nop ++ ++ // Load FPRs ++ mtcrf 0x2,r31 ++ bf 26,Lfinish ++ lfd f1,-16-(14*8)(r30) ++ lfd f2,-16-(13*8)(r30) ++ lfd f3,-16-(12*8)(r30) ++ lfd f4,-16-(11*8)(r30) ++ nop ++ lfd f5,-16-(10*8)(r30) ++ lfd f6,-16-(9*8)(r30) ++ lfd f7,-16-(8*8)(r30) ++ lfd f8,-16-(7*8)(r30) ++ nop ++ lfd f9,-16-(6*8)(r30) ++ lfd f10,-16-(5*8)(r30) ++ lfd f11,-16-(4*8)(r30) ++ lfd f12,-16-(3*8)(r30) ++ nop ++ lfd f13,-16-(2*8)(r30) ++ lfd f14,-16-(1*8)(r30) ++ // Fall through ++ ++// case done ++Lfinish: ++ lg r1,0(r1) // Restore stack pointer. ++ ld r31,-8(r1) // Restore registers we used. ++ ld r30,-16(r1) ++ lg r0,SF_RETURN(r1) // Get return address. ++ mtlr r0 // Reset link register. ++ blr ++ ++// END(ffi_closure_ASM) ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ; Length of Common Information Entry ++LSCIE1: ++ .long 0x0 ; CIE Identifier Tag ++ .byte 0x1 ; CIE Version ++ .ascii "zR\0" ; CIE Augmentation ++ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor ++ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte 0x41 ; CIE RA Column ++ .byte 0x1 ; uleb128 0x1; Augmentation size ++ .byte 0x10 ; FDE Encoding (pcrel) ++ .byte 0xc ; DW_CFA_def_cfa ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x0 ; uleb128 0x0 ++ .align LOG2_GPR_BYTES ++LECIE1: ++.globl _ffi_closure_ASM.eh ++_ffi_closure_ASM.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ; FDE Length ++ ++LASFDE1: ++ .long LASFDE1-EH_frame1 ; FDE CIE offset ++ .g_long LFB1-. ; FDE initial location ++ .set L$set$3,LFE1-LFB1 ++ .g_long L$set$3 ; FDE address range ++ .byte 0x0 ; uleb128 0x0; Augmentation size ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$3,LCFI1-LCFI0 ++ .long L$set$3 ++ .byte 0xe ; DW_CFA_def_cfa_offset ++ .byte 176,1 ; uleb128 176 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$4,LCFI0-LFB1 ++ .long L$set$4 ++ .byte 0x11 ; DW_CFA_offset_extended_sf ++ .byte 0x41 ; uleb128 0x41 ++ .byte 0x7e ; sleb128 -2 ++ .align LOG2_GPR_BYTES ++ ++LEFDE1: ++.data ++ .align LOG2_GPR_BYTES ++LDFCM0: ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi_closure_helper_DARWIN$stub: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ mflr r0 ++ bcl 20,31,LO$ffi_closure_helper_DARWIN ++ ++LO$ffi_closure_helper_DARWIN: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN) ++ mtlr r0 ++ lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi_closure_helper_DARWIN$lazy_ptr: ++ .indirect_symbol _ffi_closure_helper_DARWIN ++ .g_long dyld_stub_binding_helper ++ ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi64_struct_to_reg_form$stub: ++ .indirect_symbol _ffi64_struct_to_reg_form ++ mflr r0 ++ bcl 20,31,LO$ffi64_struct_to_reg_form ++ ++LO$ffi64_struct_to_reg_form: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form) ++ mtlr r0 ++ lgu r12,lo16(L_ffi64_struct_to_reg_form$lazy_ptr - LO$ffi64_struct_to_reg_form)(r11) ++ mtctr r12 ++ bctr ++ ++.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32 ++ .align LOG2_GPR_BYTES ++ ++Lffi64_data_size$stub: ++ .indirect_symbol _ffi64_data_size ++ mflr r0 ++ bcl 20,31,LO$ffi64_data_size ++ ++LO$ffi64_data_size: ++ mflr r11 ++ addis r11,r11,ha16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size) ++ mtlr r0 ++ lgu r12,lo16(L_ffi64_data_size$lazy_ptr - LO$ffi64_data_size)(r11) ++ mtctr r12 ++ bctr ++ ++.lazy_symbol_pointer ++L_ffi64_struct_to_reg_form$lazy_ptr: ++ .indirect_symbol _ffi64_struct_to_reg_form ++ .g_long dyld_stub_binding_helper ++ ++L_ffi64_data_size$lazy_ptr: ++ .indirect_symbol _ffi64_data_size ++ .g_long dyld_stub_binding_helper ++ ++#endif // __ppc64__ +diff -r -u ./Modules/_ctypes/libffi_osx/types.c ./Modules/_ctypes/libffi_osx/types.c +new file mode 100644 +index 0000000..44806ae +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/types.c +@@ -0,0 +1,115 @@ ++/* ----------------------------------------------------------------------- ++ types.c - Copyright (c) 1996, 1998 Red Hat, Inc. ++ ++ Predefined ffi_types needed by libffi. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++/* Type definitions */ ++#define FFI_INTEGRAL_TYPEDEF(n, s, a, t) \ ++ ffi_type ffi_type_##n = { s, a, t, NULL } ++#define FFI_AGGREGATE_TYPEDEF(n, e) \ ++ ffi_type ffi_type_##n = { 0, 0, FFI_TYPE_STRUCT, e } ++ ++FFI_INTEGRAL_TYPEDEF(uint8, 1, 1, FFI_TYPE_UINT8); ++FFI_INTEGRAL_TYPEDEF(sint8, 1, 1, FFI_TYPE_SINT8); ++FFI_INTEGRAL_TYPEDEF(uint16, 2, 2, FFI_TYPE_UINT16); ++FFI_INTEGRAL_TYPEDEF(sint16, 2, 2, FFI_TYPE_SINT16); ++FFI_INTEGRAL_TYPEDEF(uint32, 4, 4, FFI_TYPE_UINT32); ++FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32); ++FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT); ++ ++/* Size and alignment are fake here. They must not be 0. */ ++FFI_INTEGRAL_TYPEDEF(void, 1, 1, FFI_TYPE_VOID); ++ ++#if defined ALPHA || defined SPARC64 || defined X86_64 || \ ++ defined S390X || defined IA64 || defined POWERPC64 ++FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER); ++#else ++FFI_INTEGRAL_TYPEDEF(pointer, 4, 4, FFI_TYPE_POINTER); ++#endif ++ ++#if defined X86 || defined ARM || defined M68K || defined(X86_DARWIN) ++ ++# ifdef X86_64 ++ FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); ++ FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); ++# else ++ FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); ++ FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); ++# endif ++ ++#elif defined(POWERPC_DARWIN) ++FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); ++FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); ++#elif defined SH ++FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); ++FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); ++#else ++FFI_INTEGRAL_TYPEDEF(uint64, 8, 8, FFI_TYPE_UINT64); ++FFI_INTEGRAL_TYPEDEF(sint64, 8, 8, FFI_TYPE_SINT64); ++#endif ++ ++#if defined X86 || defined X86_WIN32 || defined M68K || defined(X86_DARWIN) ++ ++# if defined X86_WIN32 || defined X86_64 ++ FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); ++# endif ++ ++# ifdef X86_DARWIN ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE); ++# endif ++ ++#elif defined ARM || defined SH || defined POWERPC_AIX ++FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); ++FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE); ++#elif defined POWERPC_DARWIN ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++ ++# if __GNUC__ >= 4 ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); ++# endif ++ ++#elif defined SPARC ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++ ++# ifdef SPARC64 ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++# else ++ FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE); ++# endif ++ ++#elif defined X86_64 || defined POWERPC64 ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++#else ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++FFI_INTEGRAL_TYPEDEF(longdouble, 8, 8, FFI_TYPE_LONGDOUBLE); ++#endif +\ No newline at end of file +diff -r -u ./Modules/_ctypes/libffi_osx/x86/darwin64.S ./Modules/_ctypes/libffi_osx/x86/darwin64.S +new file mode 100644 +index 0000000..165d469 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/darwin64.S +@@ -0,0 +1,417 @@ ++/* ----------------------------------------------------------------------- ++ darwin64.S - Copyright (c) 2006 Free Software Foundation, Inc. ++ derived from unix64.S ++ ++ x86-64 Foreign Function Interface for Darwin. ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#ifdef __x86_64__ ++#define LIBFFI_ASM ++#include ++#include ++ ++ .file "darwin64.S" ++.text ++ ++/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, ++ void *raddr, void (*fnaddr)()); ++ ++ Bit o trickiness here -- ARGS+BYTES is the base of the stack frame ++ for this function. This has been allocated by ffi_call. We also ++ deallocate some of the stack that has been alloca'd. */ ++ ++ .align 3 ++ .globl _ffi_call_unix64 ++ ++_ffi_call_unix64: ++LUW0: ++ movq (%rsp), %r10 /* Load return address. */ ++ movq %rdi, %r12 /* Save a copy of the register area. */ ++ leaq (%rdi, %rsi), %rax /* Find local stack base. */ ++ movq %rdx, (%rax) /* Save flags. */ ++ movq %rcx, 8(%rax) /* Save raddr. */ ++ movq %rbp, 16(%rax) /* Save old frame pointer. */ ++ movq %r10, 24(%rax) /* Relocate return address. */ ++ movq %rax, %rbp /* Finalize local stack frame. */ ++LUW1: ++ /* movq %rdi, %r10 // Save a copy of the register area. */ ++ movq %r12, %r10 ++ movq %r8, %r11 /* Save a copy of the target fn. */ ++ movl %r9d, %eax /* Set number of SSE registers. */ ++ ++ /* Load up all argument registers. */ ++ movq (%r10), %rdi ++ movq 8(%r10), %rsi ++ movq 16(%r10), %rdx ++ movq 24(%r10), %rcx ++ movq 32(%r10), %r8 ++ movq 40(%r10), %r9 ++ testl %eax, %eax ++ jnz Lload_sse ++Lret_from_load_sse: ++ ++ /* Deallocate the reg arg area. */ ++ leaq 176(%r10), %rsp ++ ++ /* Call the user function. */ ++ call *%r11 ++ ++ /* Deallocate stack arg area; local stack frame in redzone. */ ++ leaq 24(%rbp), %rsp ++ ++ movq 0(%rbp), %rcx /* Reload flags. */ ++ movq 8(%rbp), %rdi /* Reload raddr. */ ++ movq 16(%rbp), %rbp /* Reload old frame pointer. */ ++LUW2: ++ ++ /* The first byte of the flags contains the FFI_TYPE. */ ++ movzbl %cl, %r10d ++ leaq Lstore_table(%rip), %r11 ++ movslq (%r11, %r10, 4), %r10 ++ addq %r11, %r10 ++ jmp *%r10 ++ ++Lstore_table: ++ .long Lst_void-Lstore_table /* FFI_TYPE_VOID */ ++ .long Lst_sint32-Lstore_table /* FFI_TYPE_INT */ ++ .long Lst_float-Lstore_table /* FFI_TYPE_FLOAT */ ++ .long Lst_double-Lstore_table /* FFI_TYPE_DOUBLE */ ++ .long Lst_ldouble-Lstore_table /* FFI_TYPE_LONGDOUBLE */ ++ .long Lst_uint8-Lstore_table /* FFI_TYPE_UINT8 */ ++ .long Lst_sint8-Lstore_table /* FFI_TYPE_SINT8 */ ++ .long Lst_uint16-Lstore_table /* FFI_TYPE_UINT16 */ ++ .long Lst_sint16-Lstore_table /* FFI_TYPE_SINT16 */ ++ .long Lst_uint32-Lstore_table /* FFI_TYPE_UINT32 */ ++ .long Lst_sint32-Lstore_table /* FFI_TYPE_SINT32 */ ++ .long Lst_int64-Lstore_table /* FFI_TYPE_UINT64 */ ++ .long Lst_int64-Lstore_table /* FFI_TYPE_SINT64 */ ++ .long Lst_struct-Lstore_table /* FFI_TYPE_STRUCT */ ++ .long Lst_int64-Lstore_table /* FFI_TYPE_POINTER */ ++ ++ .text ++ .align 3 ++Lst_void: ++ ret ++ .align 3 ++Lst_uint8: ++ movzbq %al, %rax ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_sint8: ++ movsbq %al, %rax ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_uint16: ++ movzwq %ax, %rax ++ movq %rax, (%rdi) ++ .align 3 ++Lst_sint16: ++ movswq %ax, %rax ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_uint32: ++ movl %eax, %eax ++ movq %rax, (%rdi) ++ .align 3 ++Lst_sint32: ++ cltq ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_int64: ++ movq %rax, (%rdi) ++ ret ++ .align 3 ++Lst_float: ++ movss %xmm0, (%rdi) ++ ret ++ .align 3 ++Lst_double: ++ movsd %xmm0, (%rdi) ++ ret ++Lst_ldouble: ++ fstpt (%rdi) ++ ret ++ .align 3 ++Lst_struct: ++ leaq -20(%rsp), %rsi /* Scratch area in redzone. */ ++ ++ /* We have to locate the values now, and since we don't want to ++ write too much data into the user's return value, we spill the ++ value to a 16 byte scratch area first. Bits 8, 9, and 10 ++ control where the values are located. Only one of the three ++ bits will be set; see ffi_prep_cif_machdep for the pattern. */ ++ movd %xmm0, %r10 ++ movd %xmm1, %r11 ++ testl $0x100, %ecx ++ cmovnz %rax, %rdx ++ cmovnz %r10, %rax ++ testl $0x200, %ecx ++ cmovnz %r10, %rdx ++ testl $0x400, %ecx ++ cmovnz %r10, %rax ++ cmovnz %r11, %rdx ++ movq %rax, (%rsi) ++ movq %rdx, 8(%rsi) ++ ++ /* Bits 12-31 contain the true size of the structure. Copy from ++ the scratch area to the true destination. */ ++ shrl $12, %ecx ++ rep movsb ++ ret ++ ++ /* Many times we can avoid loading any SSE registers at all. ++ It's not worth an indirect jump to load the exact set of ++ SSE registers needed; zero or all is a good compromise. */ ++ .align 3 ++LUW3: ++Lload_sse: ++ movdqa 48(%r10), %xmm0 ++ movdqa 64(%r10), %xmm1 ++ movdqa 80(%r10), %xmm2 ++ movdqa 96(%r10), %xmm3 ++ movdqa 112(%r10), %xmm4 ++ movdqa 128(%r10), %xmm5 ++ movdqa 144(%r10), %xmm6 ++ movdqa 160(%r10), %xmm7 ++ jmp Lret_from_load_sse ++ ++LUW4: ++ .align 3 ++ .globl _ffi_closure_unix64 ++ ++_ffi_closure_unix64: ++LUW5: ++ /* The carry flag is set by the trampoline iff SSE registers ++ are used. Don't clobber it before the branch instruction. */ ++ leaq -200(%rsp), %rsp ++LUW6: ++ movq %rdi, (%rsp) ++ movq %rsi, 8(%rsp) ++ movq %rdx, 16(%rsp) ++ movq %rcx, 24(%rsp) ++ movq %r8, 32(%rsp) ++ movq %r9, 40(%rsp) ++ jc Lsave_sse ++Lret_from_save_sse: ++ ++ movq %r10, %rdi ++ leaq 176(%rsp), %rsi ++ movq %rsp, %rdx ++ leaq 208(%rsp), %rcx ++ call _ffi_closure_unix64_inner ++ ++ /* Deallocate stack frame early; return value is now in redzone. */ ++ addq $200, %rsp ++LUW7: ++ ++ /* The first byte of the return value contains the FFI_TYPE. */ ++ movzbl %al, %r10d ++ leaq Lload_table(%rip), %r11 ++ movslq (%r11, %r10, 4), %r10 ++ addq %r11, %r10 ++ jmp *%r10 ++ ++Lload_table: ++ .long Lld_void-Lload_table /* FFI_TYPE_VOID */ ++ .long Lld_int32-Lload_table /* FFI_TYPE_INT */ ++ .long Lld_float-Lload_table /* FFI_TYPE_FLOAT */ ++ .long Lld_double-Lload_table /* FFI_TYPE_DOUBLE */ ++ .long Lld_ldouble-Lload_table /* FFI_TYPE_LONGDOUBLE */ ++ .long Lld_int8-Lload_table /* FFI_TYPE_UINT8 */ ++ .long Lld_int8-Lload_table /* FFI_TYPE_SINT8 */ ++ .long Lld_int16-Lload_table /* FFI_TYPE_UINT16 */ ++ .long Lld_int16-Lload_table /* FFI_TYPE_SINT16 */ ++ .long Lld_int32-Lload_table /* FFI_TYPE_UINT32 */ ++ .long Lld_int32-Lload_table /* FFI_TYPE_SINT32 */ ++ .long Lld_int64-Lload_table /* FFI_TYPE_UINT64 */ ++ .long Lld_int64-Lload_table /* FFI_TYPE_SINT64 */ ++ .long Lld_struct-Lload_table /* FFI_TYPE_STRUCT */ ++ .long Lld_int64-Lload_table /* FFI_TYPE_POINTER */ ++ ++ .text ++ .align 3 ++Lld_void: ++ ret ++ .align 3 ++Lld_int8: ++ movzbl -24(%rsp), %eax ++ ret ++ .align 3 ++Lld_int16: ++ movzwl -24(%rsp), %eax ++ ret ++ .align 3 ++Lld_int32: ++ movl -24(%rsp), %eax ++ ret ++ .align 3 ++Lld_int64: ++ movq -24(%rsp), %rax ++ ret ++ .align 3 ++Lld_float: ++ movss -24(%rsp), %xmm0 ++ ret ++ .align 3 ++Lld_double: ++ movsd -24(%rsp), %xmm0 ++ ret ++ .align 3 ++Lld_ldouble: ++ fldt -24(%rsp) ++ ret ++ .align 3 ++Lld_struct: ++ /* There are four possibilities here, %rax/%rdx, %xmm0/%rax, ++ %rax/%xmm0, %xmm0/%xmm1. We collapse two by always loading ++ both rdx and xmm1 with the second word. For the remaining, ++ bit 8 set means xmm0 gets the second word, and bit 9 means ++ that rax gets the second word. */ ++ movq -24(%rsp), %rcx ++ movq -16(%rsp), %rdx ++ movq -16(%rsp), %xmm1 ++ testl $0x100, %eax ++ cmovnz %rdx, %rcx ++ movd %rcx, %xmm0 ++ testl $0x200, %eax ++ movq -24(%rsp), %rax ++ cmovnz %rdx, %rax ++ ret ++ ++ /* See the comment above Lload_sse; the same logic applies here. */ ++ .align 3 ++LUW8: ++Lsave_sse: ++ movdqa %xmm0, 48(%rsp) ++ movdqa %xmm1, 64(%rsp) ++ movdqa %xmm2, 80(%rsp) ++ movdqa %xmm3, 96(%rsp) ++ movdqa %xmm4, 112(%rsp) ++ movdqa %xmm5, 128(%rsp) ++ movdqa %xmm6, 144(%rsp) ++ movdqa %xmm7, 160(%rsp) ++ jmp Lret_from_save_sse ++ ++LUW9: ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 /* CIE Length */ ++ .long L$set$0 ++LSCIE1: ++ .long 0x0 /* CIE Identifier Tag */ ++ .byte 0x1 /* CIE Version */ ++ .ascii "zR\0" /* CIE Augmentation */ ++ .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ ++ .byte 0x78 /* sleb128 -8; CIE Data Alignment Factor */ ++ .byte 0x10 /* CIE RA Column */ ++ .byte 0x1 /* uleb128 0x1; Augmentation size */ ++ .byte 0x10 /* FDE Encoding (pcrel sdata4) */ ++ .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ ++ .byte 0x7 /* uleb128 0x7 */ ++ .byte 0x8 /* uleb128 0x8 */ ++ .byte 0x90 /* DW_CFA_offset, column 0x10 */ ++ .byte 0x1 ++ .align 3 ++LECIE1: ++ .globl _ffi_call_unix64.eh ++_ffi_call_unix64.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 /* FDE Length */ ++ .long L$set$1 ++LASFDE1: ++ .long LASFDE1-EH_frame1 /* FDE CIE offset */ ++ .quad LUW0-. /* FDE initial location */ ++ .set L$set$2,LUW4-LUW0 /* FDE address range */ ++ .quad L$set$2 ++ .byte 0x0 /* Augmentation size */ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$3,LUW1-LUW0 ++ .long L$set$3 ++ ++ /* New stack frame based off rbp. This is a itty bit of unwind ++ trickery in that the CFA *has* changed. There is no easy way ++ to describe it correctly on entry to the function. Fortunately, ++ it doesn't matter too much since at all points we can correctly ++ unwind back to ffi_call. Note that the location to which we ++ moved the return address is (the new) CFA-8, so from the ++ perspective of the unwind info, it hasn't moved. */ ++ .byte 0xc /* DW_CFA_def_cfa, %rbp offset 32 */ ++ .byte 0x6 ++ .byte 0x20 ++ .byte 0x80+6 /* DW_CFA_offset, %rbp offset 2*-8 */ ++ .byte 0x2 ++ .byte 0xa /* DW_CFA_remember_state */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$4,LUW2-LUW1 ++ .long L$set$4 ++ .byte 0xc /* DW_CFA_def_cfa, %rsp offset 8 */ ++ .byte 0x7 ++ .byte 0x8 ++ .byte 0xc0+6 /* DW_CFA_restore, %rbp */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$5,LUW3-LUW2 ++ .long L$set$5 ++ .byte 0xb /* DW_CFA_restore_state */ ++ ++ .align 3 ++LEFDE1: ++ .globl _ffi_closure_unix64.eh ++_ffi_closure_unix64.eh: ++LSFDE3: ++ .set L$set$6,LEFDE3-LASFDE3 /* FDE Length */ ++ .long L$set$6 ++LASFDE3: ++ .long LASFDE3-EH_frame1 /* FDE CIE offset */ ++ .quad LUW5-. /* FDE initial location */ ++ .set L$set$7,LUW9-LUW5 /* FDE address range */ ++ .quad L$set$7 ++ .byte 0x0 /* Augmentation size */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$8,LUW6-LUW5 ++ .long L$set$8 ++ .byte 0xe /* DW_CFA_def_cfa_offset */ ++ .byte 208,1 /* uleb128 208 */ ++ .byte 0xa /* DW_CFA_remember_state */ ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$9,LUW7-LUW6 ++ .long L$set$9 ++ .byte 0xe /* DW_CFA_def_cfa_offset */ ++ .byte 0x8 ++ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .set L$set$10,LUW8-LUW7 ++ .long L$set$10 ++ .byte 0xb /* DW_CFA_restore_state */ ++ ++ .align 3 ++LEFDE3: ++ .subsections_via_symbols ++ ++#endif /* __x86_64__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S +new file mode 100644 +index 0000000..925a841 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/x86-darwin.S +@@ -0,0 +1,422 @@ ++#ifdef __i386__ ++/* ----------------------------------------------------------------------- ++ darwin.S - Copyright (c) 1996, 1998, 2001, 2002, 2003 Red Hat, Inc. ++ ++ X86 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++/* ++ * This file is based on sysv.S and then hacked up by Ronald who hasn't done ++ * assembly programming in 8 years. ++ */ ++ ++#ifndef __x86_64__ ++ ++#define LIBFFI_ASM ++#include ++#include ++ ++#ifdef PyObjC_STRICT_DEBUGGING ++ /* XXX: Debugging of stack alignment, to be removed */ ++#define ASSERT_STACK_ALIGNED movdqa -16(%esp), %xmm0 ++#else ++#define ASSERT_STACK_ALIGNED ++#endif ++ ++.text ++ ++.globl _ffi_prep_args ++ ++ .align 4 ++.globl _ffi_call_SYSV ++ ++_ffi_call_SYSV: ++LFB1: ++ pushl %ebp ++LCFI0: ++ movl %esp,%ebp ++LCFI1: ++ subl $8,%esp ++ /* Make room for all of the new args. */ ++ movl 16(%ebp),%ecx ++ subl %ecx,%esp ++ ++ movl %esp,%eax ++ ++ /* Place all of the ffi_prep_args in position */ ++ subl $8,%esp ++ pushl 12(%ebp) ++ pushl %eax ++ call *8(%ebp) ++ ++ /* Return stack to previous state and call the function */ ++ addl $16,%esp ++ ++ call *28(%ebp) ++ ++ /* Remove the space we pushed for the args */ ++ movl 16(%ebp),%ecx ++ addl %ecx,%esp ++ ++ /* Load %ecx with the return type code */ ++ movl 20(%ebp),%ecx ++ ++ /* If the return value pointer is NULL, assume no return value. */ ++ cmpl $0,24(%ebp) ++ jne Lretint ++ ++ /* Even if there is no space for the return value, we are ++ obliged to handle floating-point values. */ ++ cmpl $FFI_TYPE_FLOAT,%ecx ++ jne Lnoretval ++ fstp %st(0) ++ ++ jmp Lepilogue ++ ++Lretint: ++ cmpl $FFI_TYPE_INT,%ecx ++ jne Lretfloat ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movl %eax,0(%ecx) ++ jmp Lepilogue ++ ++Lretfloat: ++ cmpl $FFI_TYPE_FLOAT,%ecx ++ jne Lretdouble ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ fstps (%ecx) ++ jmp Lepilogue ++ ++Lretdouble: ++ cmpl $FFI_TYPE_DOUBLE,%ecx ++ jne Lretlongdouble ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ fstpl (%ecx) ++ jmp Lepilogue ++ ++Lretlongdouble: ++ cmpl $FFI_TYPE_LONGDOUBLE,%ecx ++ jne Lretint64 ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ fstpt (%ecx) ++ jmp Lepilogue ++ ++Lretint64: ++ cmpl $FFI_TYPE_SINT64,%ecx ++ jne Lretstruct1b ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movl %eax,0(%ecx) ++ movl %edx,4(%ecx) ++ jmp Lepilogue ++ ++Lretstruct1b: ++ cmpl $FFI_TYPE_SINT8,%ecx ++ jne Lretstruct2b ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movb %al,0(%ecx) ++ jmp Lepilogue ++ ++Lretstruct2b: ++ cmpl $FFI_TYPE_SINT16,%ecx ++ jne Lretstruct ++ /* Load %ecx with the pointer to storage for the return value */ ++ movl 24(%ebp),%ecx ++ movw %ax,0(%ecx) ++ jmp Lepilogue ++ ++Lretstruct: ++ cmpl $FFI_TYPE_STRUCT,%ecx ++ jne Lnoretval ++ /* Nothing to do! */ ++ addl $4,%esp ++ popl %ebp ++ ret ++ ++Lnoretval: ++Lepilogue: ++ addl $8,%esp ++ movl %ebp,%esp ++ popl %ebp ++ ret ++LFE1: ++.ffi_call_SYSV_end: ++ ++ .align 4 ++FFI_HIDDEN (ffi_closure_SYSV) ++.globl _ffi_closure_SYSV ++ ++_ffi_closure_SYSV: ++LFB2: ++ pushl %ebp ++LCFI2: ++ movl %esp, %ebp ++LCFI3: ++ subl $56, %esp ++ leal -40(%ebp), %edx ++ movl %edx, -12(%ebp) /* resp */ ++ leal 8(%ebp), %edx ++ movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ ++ leal -12(%ebp), %edx ++ movl %edx, (%esp) /* &resp */ ++ movl %ebx, 8(%esp) ++LCFI7: ++ call L_ffi_closure_SYSV_inner$stub ++ movl 8(%esp), %ebx ++ movl -12(%ebp), %ecx ++ cmpl $FFI_TYPE_INT, %eax ++ je Lcls_retint ++ cmpl $FFI_TYPE_FLOAT, %eax ++ je Lcls_retfloat ++ cmpl $FFI_TYPE_DOUBLE, %eax ++ je Lcls_retdouble ++ cmpl $FFI_TYPE_LONGDOUBLE, %eax ++ je Lcls_retldouble ++ cmpl $FFI_TYPE_SINT64, %eax ++ je Lcls_retllong ++ cmpl $FFI_TYPE_UINT8, %eax ++ je Lcls_retstruct1 ++ cmpl $FFI_TYPE_SINT8, %eax ++ je Lcls_retstruct1 ++ cmpl $FFI_TYPE_UINT16, %eax ++ je Lcls_retstruct2 ++ cmpl $FFI_TYPE_SINT16, %eax ++ je Lcls_retstruct2 ++ cmpl $FFI_TYPE_STRUCT, %eax ++ je Lcls_retstruct ++Lcls_epilogue: ++ movl %ebp, %esp ++ popl %ebp ++ ret ++Lcls_retint: ++ movl (%ecx), %eax ++ jmp Lcls_epilogue ++Lcls_retfloat: ++ flds (%ecx) ++ jmp Lcls_epilogue ++Lcls_retdouble: ++ fldl (%ecx) ++ jmp Lcls_epilogue ++Lcls_retldouble: ++ fldt (%ecx) ++ jmp Lcls_epilogue ++Lcls_retllong: ++ movl (%ecx), %eax ++ movl 4(%ecx), %edx ++ jmp Lcls_epilogue ++Lcls_retstruct1: ++ movsbl (%ecx), %eax ++ jmp Lcls_epilogue ++Lcls_retstruct2: ++ movswl (%ecx), %eax ++ jmp Lcls_epilogue ++Lcls_retstruct: ++ lea -8(%ebp),%esp ++ movl %ebp, %esp ++ popl %ebp ++ ret $4 ++LFE2: ++ ++#if !FFI_NO_RAW_API ++ ++#define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3) ++#define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4) ++#define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4) ++#define CIF_FLAGS_OFFSET 20 ++ ++ .align 4 ++FFI_HIDDEN (ffi_closure_raw_SYSV) ++.globl _ffi_closure_raw_SYSV ++ ++_ffi_closure_raw_SYSV: ++LFB3: ++ pushl %ebp ++LCFI4: ++ movl %esp, %ebp ++LCFI5: ++ pushl %esi ++LCFI6: ++ subl $36, %esp ++ movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */ ++ movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */ ++ movl %edx, 12(%esp) /* user_data */ ++ leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */ ++ movl %edx, 8(%esp) /* raw_args */ ++ leal -24(%ebp), %edx ++ movl %edx, 4(%esp) /* &res */ ++ movl %esi, (%esp) /* cif */ ++ call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */ ++ movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */ ++ cmpl $FFI_TYPE_INT, %eax ++ je Lrcls_retint ++ cmpl $FFI_TYPE_FLOAT, %eax ++ je Lrcls_retfloat ++ cmpl $FFI_TYPE_DOUBLE, %eax ++ je Lrcls_retdouble ++ cmpl $FFI_TYPE_LONGDOUBLE, %eax ++ je Lrcls_retldouble ++ cmpl $FFI_TYPE_SINT64, %eax ++ je Lrcls_retllong ++Lrcls_epilogue: ++ addl $36, %esp ++ popl %esi ++ popl %ebp ++ ret ++Lrcls_retint: ++ movl -24(%ebp), %eax ++ jmp Lrcls_epilogue ++Lrcls_retfloat: ++ flds -24(%ebp) ++ jmp Lrcls_epilogue ++Lrcls_retdouble: ++ fldl -24(%ebp) ++ jmp Lrcls_epilogue ++Lrcls_retldouble: ++ fldt -24(%ebp) ++ jmp Lrcls_epilogue ++Lrcls_retllong: ++ movl -24(%ebp), %eax ++ movl -20(%ebp), %edx ++ jmp Lrcls_epilogue ++LFE3: ++#endif ++ ++.section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5 ++L_ffi_closure_SYSV_inner$stub: ++ .indirect_symbol _ffi_closure_SYSV_inner ++ hlt ; hlt ; hlt ; hlt ; hlt ++ ++ ++.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support ++EH_frame1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ++LSCIE1: ++ .long 0x0 ++ .byte 0x1 ++ .ascii "zR\0" ++ .byte 0x1 ++ .byte 0x7c ++ .byte 0x8 ++ .byte 0x1 ++ .byte 0x10 ++ .byte 0xc ++ .byte 0x5 ++ .byte 0x4 ++ .byte 0x88 ++ .byte 0x1 ++ .align 2 ++LECIE1: ++.globl _ffi_call_SYSV.eh ++_ffi_call_SYSV.eh: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ++LASFDE1: ++ .long LASFDE1-EH_frame1 ++ .long LFB1-. ++ .set L$set$2,LFE1-LFB1 ++ .long L$set$2 ++ .byte 0x0 ++ .byte 0x4 ++ .set L$set$3,LCFI0-LFB1 ++ .long L$set$3 ++ .byte 0xe ++ .byte 0x8 ++ .byte 0x84 ++ .byte 0x2 ++ .byte 0x4 ++ .set L$set$4,LCFI1-LCFI0 ++ .long L$set$4 ++ .byte 0xd ++ .byte 0x4 ++ .align 2 ++LEFDE1: ++.globl _ffi_closure_SYSV.eh ++_ffi_closure_SYSV.eh: ++LSFDE2: ++ .set L$set$5,LEFDE2-LASFDE2 ++ .long L$set$5 ++LASFDE2: ++ .long LASFDE2-EH_frame1 ++ .long LFB2-. ++ .set L$set$6,LFE2-LFB2 ++ .long L$set$6 ++ .byte 0x0 ++ .byte 0x4 ++ .set L$set$7,LCFI2-LFB2 ++ .long L$set$7 ++ .byte 0xe ++ .byte 0x8 ++ .byte 0x84 ++ .byte 0x2 ++ .byte 0x4 ++ .set L$set$8,LCFI3-LCFI2 ++ .long L$set$8 ++ .byte 0xd ++ .byte 0x4 ++ .align 2 ++LEFDE2: ++ ++#if !FFI_NO_RAW_API ++ ++.globl _ffi_closure_raw_SYSV.eh ++_ffi_closure_raw_SYSV.eh: ++LSFDE3: ++ .set L$set$10,LEFDE3-LASFDE3 ++ .long L$set$10 ++LASFDE3: ++ .long LASFDE3-EH_frame1 ++ .long LFB3-. ++ .set L$set$11,LFE3-LFB3 ++ .long L$set$11 ++ .byte 0x0 ++ .byte 0x4 ++ .set L$set$12,LCFI4-LFB3 ++ .long L$set$12 ++ .byte 0xe ++ .byte 0x8 ++ .byte 0x84 ++ .byte 0x2 ++ .byte 0x4 ++ .set L$set$13,LCFI5-LCFI4 ++ .long L$set$13 ++ .byte 0xd ++ .byte 0x4 ++ .byte 0x4 ++ .set L$set$14,LCFI6-LCFI5 ++ .long L$set$14 ++ .byte 0x85 ++ .byte 0x3 ++ .align 2 ++LEFDE3: ++ ++#endif ++ ++#endif /* ifndef __x86_64__ */ ++ ++#endif /* defined __i386__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c +new file mode 100644 +index 0000000..06feaf2 +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi64.c +@@ -0,0 +1,734 @@ ++#ifdef __x86_64__ ++ ++/* ----------------------------------------------------------------------- ++ x86-ffi64.c - Copyright (c) 2002 Bo Thorsen ++ ++ x86-64 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++#include ++ ++#define MAX_GPR_REGS 6 ++#define MAX_SSE_REGS 8 ++ ++typedef struct RegisterArgs { ++ /* Registers for argument passing. */ ++ UINT64 gpr[MAX_GPR_REGS]; ++ __int128_t sse[MAX_SSE_REGS]; ++} RegisterArgs; ++ ++extern void ++ffi_call_unix64( ++ void* args, ++ unsigned long bytes, ++ unsigned flags, ++ void* raddr, ++ void (*fnaddr)(), ++ unsigned ssecount); ++ ++/* All reference to register classes here is identical to the code in ++ gcc/config/i386/i386.c. Do *not* change one without the other. */ ++ ++/* Register class used for passing given 64bit part of the argument. ++ These represent classes as documented by the PS ABI, with the exception ++ of SSESF, SSEDF classes, that are basically SSE class, just gcc will ++ use SF or DFmode move instead of DImode to avoid reformating penalties. ++ ++ Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves ++ whenever possible (upper half does contain padding). */ ++enum x86_64_reg_class ++{ ++ X86_64_NO_CLASS, ++ X86_64_INTEGER_CLASS, ++ X86_64_INTEGERSI_CLASS, ++ X86_64_SSE_CLASS, ++ X86_64_SSESF_CLASS, ++ X86_64_SSEDF_CLASS, ++ X86_64_SSEUP_CLASS, ++ X86_64_X87_CLASS, ++ X86_64_X87UP_CLASS, ++ X86_64_COMPLEX_X87_CLASS, ++ X86_64_MEMORY_CLASS ++}; ++ ++#define MAX_CLASSES 4 ++#define SSE_CLASS_P(X) ((X) >= X86_64_SSE_CLASS && X <= X86_64_SSEUP_CLASS) ++ ++/* x86-64 register passing implementation. See x86-64 ABI for details. Goal ++ of this code is to classify each 8bytes of incoming argument by the register ++ class and assign registers accordingly. */ ++ ++/* Return the union class of CLASS1 and CLASS2. ++ See the x86-64 PS ABI for details. */ ++static enum x86_64_reg_class ++merge_classes( ++ enum x86_64_reg_class class1, ++ enum x86_64_reg_class class2) ++{ ++ /* Rule #1: If both classes are equal, this is the resulting class. */ ++ if (class1 == class2) ++ return class1; ++ ++ /* Rule #2: If one of the classes is NO_CLASS, the resulting class is ++ the other class. */ ++ if (class1 == X86_64_NO_CLASS) ++ return class2; ++ ++ if (class2 == X86_64_NO_CLASS) ++ return class1; ++ ++ /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */ ++ if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS) ++ return X86_64_MEMORY_CLASS; ++ ++ /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */ ++ if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS) ++ || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS)) ++ return X86_64_INTEGERSI_CLASS; ++ ++ if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS ++ || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS) ++ return X86_64_INTEGER_CLASS; ++ ++ /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class, ++ MEMORY is used. */ ++ if (class1 == X86_64_X87_CLASS ++ || class1 == X86_64_X87UP_CLASS ++ || class1 == X86_64_COMPLEX_X87_CLASS ++ || class2 == X86_64_X87_CLASS ++ || class2 == X86_64_X87UP_CLASS ++ || class2 == X86_64_COMPLEX_X87_CLASS) ++ return X86_64_MEMORY_CLASS; ++ ++ /* Rule #6: Otherwise class SSE is used. */ ++ return X86_64_SSE_CLASS; ++} ++ ++/* Classify the argument of type TYPE and mode MODE. ++ CLASSES will be filled by the register class used to pass each word ++ of the operand. The number of words is returned. In case the parameter ++ should be passed in memory, 0 is returned. As a special case for zero ++ sized containers, classes[0] will be NO_CLASS and 1 is returned. ++ ++ See the x86-64 PS ABI for details. */ ++ ++static int ++classify_argument( ++ ffi_type* type, ++ enum x86_64_reg_class classes[], ++ size_t byte_offset) ++{ ++ switch (type->type) ++ { ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_POINTER: ++#if 0 ++ if (byte_offset + type->size <= 4) ++ classes[0] = X86_64_INTEGERSI_CLASS; ++ else ++ classes[0] = X86_64_INTEGER_CLASS; ++ ++ return 1; ++#else ++ { ++ int size = byte_offset + type->size; ++ ++ if (size <= 4) ++ { ++ classes[0] = X86_64_INTEGERSI_CLASS; ++ return 1; ++ } ++ else if (size <= 8) ++ { ++ classes[0] = X86_64_INTEGER_CLASS; ++ return 1; ++ } ++ else if (size <= 12) ++ { ++ classes[0] = X86_64_INTEGER_CLASS; ++ classes[1] = X86_64_INTEGERSI_CLASS; ++ return 2; ++ } ++ else if (size <= 16) ++ { ++ classes[0] = classes[1] = X86_64_INTEGERSI_CLASS; ++ return 2; ++ } ++ else ++ FFI_ASSERT (0); ++ } ++#endif ++ ++ case FFI_TYPE_FLOAT: ++ if (byte_offset == 0) ++ classes[0] = X86_64_SSESF_CLASS; ++ else ++ classes[0] = X86_64_SSE_CLASS; ++ ++ return 1; ++ ++ case FFI_TYPE_DOUBLE: ++ classes[0] = X86_64_SSEDF_CLASS; ++ return 1; ++ ++ case FFI_TYPE_LONGDOUBLE: ++ classes[0] = X86_64_X87_CLASS; ++ classes[1] = X86_64_X87UP_CLASS; ++ return 2; ++ ++ case FFI_TYPE_STRUCT: ++ { ++ ffi_type** ptr; ++ int i; ++ enum x86_64_reg_class subclasses[MAX_CLASSES]; ++ const int UNITS_PER_WORD = 8; ++ int words = ++ (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; ++ ++ /* If the struct is larger than 16 bytes, pass it on the stack. */ ++ if (type->size > 16) ++ return 0; ++ ++ for (i = 0; i < words; i++) ++ classes[i] = X86_64_NO_CLASS; ++ ++ /* Merge the fields of structure. */ ++ for (ptr = type->elements; *ptr != NULL; ptr++) ++ { ++ byte_offset = ALIGN(byte_offset, (*ptr)->alignment); ++ ++ int num = classify_argument(*ptr, subclasses, byte_offset % 8); ++ ++ if (num == 0) ++ return 0; ++ ++ int pos = byte_offset / 8; ++ ++ for (i = 0; i < num; i++) ++ { ++ classes[i + pos] = ++ merge_classes(subclasses[i], classes[i + pos]); ++ } ++ ++ byte_offset += (*ptr)->size; ++ } ++ ++ if (words > 2) ++ { ++ /* When size > 16 bytes, if the first one isn't ++ X86_64_SSE_CLASS or any other ones aren't ++ X86_64_SSEUP_CLASS, everything should be passed in ++ memory. */ ++ if (classes[0] != X86_64_SSE_CLASS) ++ return 0; ++ ++ for (i = 1; i < words; i++) ++ if (classes[i] != X86_64_SSEUP_CLASS) ++ return 0; ++ } ++ ++ ++ /* Final merger cleanup. */ ++ for (i = 0; i < words; i++) ++ { ++ /* If one class is MEMORY, everything should be passed in ++ memory. */ ++ if (classes[i] == X86_64_MEMORY_CLASS) ++ return 0; ++ ++ /* The X86_64_SSEUP_CLASS should be always preceded by ++ X86_64_SSE_CLASS. */ ++ if (classes[i] == X86_64_SSEUP_CLASS ++ && classes[i - 1] != X86_64_SSE_CLASS ++ && classes[i - 1] != X86_64_SSEUP_CLASS) ++ { ++ FFI_ASSERT(i != 0); ++ classes[i] = X86_64_SSE_CLASS; ++ } ++ ++ /* X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS. */ ++ if (classes[i] == X86_64_X87UP_CLASS ++ && classes[i - 1] != X86_64_X87_CLASS) ++ { ++ FFI_ASSERT(i != 0); ++ classes[i] = X86_64_SSE_CLASS; ++ } ++ } ++ ++ return words; ++ } ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ ++ return 0; /* Never reached. */ ++} ++ ++/* Examine the argument and return set number of register required in each ++ class. Return zero if parameter should be passed in memory, otherwise ++ the number of registers. */ ++static int ++examine_argument( ++ ffi_type* type, ++ enum x86_64_reg_class classes[MAX_CLASSES], ++ _Bool in_return, ++ int* pngpr, ++ int* pnsse) ++{ ++ int n = classify_argument(type, classes, 0); ++ int ngpr = 0; ++ int nsse = 0; ++ int i; ++ ++ if (n == 0) ++ return 0; ++ ++ for (i = 0; i < n; ++i) ++ { ++ switch (classes[i]) ++ { ++ case X86_64_INTEGER_CLASS: ++ case X86_64_INTEGERSI_CLASS: ++ ngpr++; ++ break; ++ ++ case X86_64_SSE_CLASS: ++ case X86_64_SSESF_CLASS: ++ case X86_64_SSEDF_CLASS: ++ nsse++; ++ break; ++ ++ case X86_64_NO_CLASS: ++ case X86_64_SSEUP_CLASS: ++ break; ++ ++ case X86_64_X87_CLASS: ++ case X86_64_X87UP_CLASS: ++ case X86_64_COMPLEX_X87_CLASS: ++ return in_return != 0; ++ ++ default: ++ abort(); ++ } ++ } ++ ++ *pngpr = ngpr; ++ *pnsse = nsse; ++ ++ return n; ++} ++ ++/* Perform machine dependent cif processing. */ ++ffi_status ++ffi_prep_cif_machdep( ++ ffi_cif* cif) ++{ ++ int gprcount = 0; ++ int ssecount = 0; ++ int flags = cif->rtype->type; ++ int i, avn, n, ngpr, nsse; ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ size_t bytes; ++ ++ if (flags != FFI_TYPE_VOID) ++ { ++ n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); ++ ++ if (n == 0) ++ { ++ /* The return value is passed in memory. A pointer to that ++ memory is the first argument. Allocate a register for it. */ ++ gprcount++; ++ ++ /* We don't have to do anything in asm for the return. */ ++ flags = FFI_TYPE_VOID; ++ } ++ else if (flags == FFI_TYPE_STRUCT) ++ { ++ /* Mark which registers the result appears in. */ ++ _Bool sse0 = SSE_CLASS_P(classes[0]); ++ _Bool sse1 = n == 2 && SSE_CLASS_P(classes[1]); ++ ++ if (sse0 && !sse1) ++ flags |= 1 << 8; ++ else if (!sse0 && sse1) ++ flags |= 1 << 9; ++ else if (sse0 && sse1) ++ flags |= 1 << 10; ++ ++ /* Mark the true size of the structure. */ ++ flags |= cif->rtype->size << 12; ++ } ++ } ++ ++ /* Go over all arguments and determine the way they should be passed. ++ If it's in a register and there is space for it, let that be so. If ++ not, add it's size to the stack byte count. */ ++ for (bytes = 0, i = 0, avn = cif->nargs; i < avn; i++) ++ { ++ if (examine_argument(cif->arg_types[i], classes, 0, &ngpr, &nsse) == 0 ++ || gprcount + ngpr > MAX_GPR_REGS ++ || ssecount + nsse > MAX_SSE_REGS) ++ { ++ long align = cif->arg_types[i]->alignment; ++ ++ if (align < 8) ++ align = 8; ++ ++ bytes = ALIGN(bytes, align); ++ bytes += cif->arg_types[i]->size; ++ } ++ else ++ { ++ gprcount += ngpr; ++ ssecount += nsse; ++ } ++ } ++ ++ if (ssecount) ++ flags |= 1 << 11; ++ ++ cif->flags = flags; ++ cif->bytes = bytes; ++ cif->bytes = ALIGN(bytes,8); ++ ++ return FFI_OK; ++} ++ ++void ++ffi_call( ++ ffi_cif* cif, ++ void (*fn)(), ++ void* rvalue, ++ void** avalue) ++{ ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ char* stack; ++ char* argp; ++ ffi_type** arg_types; ++ int gprcount, ssecount, ngpr, nsse, i, avn; ++ _Bool ret_in_memory; ++ RegisterArgs* reg_args; ++ ++ /* Can't call 32-bit mode from 64-bit mode. */ ++ FFI_ASSERT(cif->abi == FFI_UNIX64); ++ ++ /* If the return value is a struct and we don't have a return value ++ address then we need to make one. Note the setting of flags to ++ VOID above in ffi_prep_cif_machdep. */ ++ ret_in_memory = (cif->rtype->type == FFI_TYPE_STRUCT ++ && (cif->flags & 0xff) == FFI_TYPE_VOID); ++ ++ if (rvalue == NULL && ret_in_memory) ++ rvalue = alloca (cif->rtype->size); ++ ++ /* Allocate the space for the arguments, plus 4 words of temp space. */ ++ stack = alloca(sizeof(RegisterArgs) + cif->bytes + 4 * 8); ++ reg_args = (RegisterArgs*)stack; ++ argp = stack + sizeof(RegisterArgs); ++ ++ gprcount = ssecount = 0; ++ ++ /* If the return value is passed in memory, add the pointer as the ++ first integer argument. */ ++ if (ret_in_memory) ++ reg_args->gpr[gprcount++] = (long) rvalue; ++ ++ avn = cif->nargs; ++ arg_types = cif->arg_types; ++ ++ for (i = 0; i < avn; ++i) ++ { ++ size_t size = arg_types[i]->size; ++ int n; ++ ++ n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); ++ ++ if (n == 0 ++ || gprcount + ngpr > MAX_GPR_REGS ++ || ssecount + nsse > MAX_SSE_REGS) ++ { ++ long align = arg_types[i]->alignment; ++ ++ /* Stack arguments are *always* at least 8 byte aligned. */ ++ if (align < 8) ++ align = 8; ++ ++ /* Pass this argument in memory. */ ++ argp = (void *) ALIGN (argp, align); ++ memcpy (argp, avalue[i], size); ++ argp += size; ++ } ++ else ++ { /* The argument is passed entirely in registers. */ ++ char *a = (char *) avalue[i]; ++ int j; ++ ++ for (j = 0; j < n; j++, a += 8, size -= 8) ++ { ++ switch (classes[j]) ++ { ++ case X86_64_INTEGER_CLASS: ++ case X86_64_INTEGERSI_CLASS: ++ reg_args->gpr[gprcount] = 0; ++ switch (arg_types[i]->type) { ++ case FFI_TYPE_SINT8: ++ { ++ int8_t shortval = *(int8_t*)a; ++ int64_t actval = (int64_t)shortval; ++ reg_args->gpr[gprcount] = actval; ++ /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ ++ break; ++ } ++ ++ case FFI_TYPE_SINT16: ++ { ++ int16_t shortval = *(int16_t*)a; ++ int64_t actval = (int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ case FFI_TYPE_SINT32: ++ { ++ int32_t shortval = *(int32_t*)a; ++ int64_t actval = (int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ case FFI_TYPE_UINT8: ++ { ++ u_int8_t shortval = *(u_int8_t*)a; ++ u_int64_t actval = (u_int64_t)shortval; ++ /*memcpy (®_args->gpr[gprcount], &actval, 8);*/ ++ reg_args->gpr[gprcount] = actval; ++ break; ++ } ++ ++ case FFI_TYPE_UINT16: ++ { ++ u_int16_t shortval = *(u_int16_t*)a; ++ u_int64_t actval = (u_int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ case FFI_TYPE_UINT32: ++ { ++ u_int32_t shortval = *(u_int32_t*)a; ++ u_int64_t actval = (u_int64_t)shortval; ++ memcpy (®_args->gpr[gprcount], &actval, 8); ++ break; ++ } ++ ++ default: ++ //memcpy (®_args->gpr[gprcount], a, size < 8 ? size : 8); ++ reg_args->gpr[gprcount] = *(int64_t*)a; ++ } ++ gprcount++; ++ break; ++ ++ case X86_64_SSE_CLASS: ++ case X86_64_SSEDF_CLASS: ++ reg_args->sse[ssecount++] = *(UINT64 *) a; ++ break; ++ ++ case X86_64_SSESF_CLASS: ++ reg_args->sse[ssecount++] = *(UINT32 *) a; ++ break; ++ ++ default: ++ abort(); ++ } ++ } ++ } ++ } ++ ++ ffi_call_unix64 (stack, cif->bytes + sizeof(RegisterArgs), ++ cif->flags, rvalue, fn, ssecount); ++} ++ ++extern void ffi_closure_unix64(void); ++ ++ffi_status ++ffi_prep_closure( ++ ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*, void*, void**, void*), ++ void* user_data) ++{ ++ if (cif->abi != FFI_UNIX64) ++ return FFI_BAD_ABI; ++ ++ volatile unsigned short* tramp = ++ (volatile unsigned short*)&closure->tramp[0]; ++ ++ tramp[0] = 0xbb49; /* mov , %r11 */ ++ *(void* volatile*)&tramp[1] = ffi_closure_unix64; ++ tramp[5] = 0xba49; /* mov , %r10 */ ++ *(void* volatile*)&tramp[6] = closure; ++ ++ /* Set the carry bit if the function uses any sse registers. ++ This is clc or stc, together with the first byte of the jmp. */ ++ tramp[10] = cif->flags & (1 << 11) ? 0x49f9 : 0x49f8; ++ tramp[11] = 0xe3ff; /* jmp *%r11 */ ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ ++ return FFI_OK; ++} ++ ++#pragma clang diagnostic push ++#pragma clang diagnostic ignored "-Wmissing-prototypes" ++int ++ffi_closure_unix64_inner( ++ ffi_closure* closure, ++ void* rvalue, ++ RegisterArgs* reg_args, ++ char* argp) ++#pragma clang diagnostic pop ++{ ++ ffi_cif* cif = closure->cif; ++ void** avalue = alloca(cif->nargs * sizeof(void *)); ++ ffi_type** arg_types; ++ long i, avn; ++ int gprcount = 0; ++ int ssecount = 0; ++ int ngpr, nsse; ++ int ret; ++ ++ ret = cif->rtype->type; ++ ++ if (ret != FFI_TYPE_VOID) ++ { ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ int n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); ++ ++ if (n == 0) ++ { ++ /* The return value goes in memory. Arrange for the closure ++ return value to go directly back to the original caller. */ ++ rvalue = (void *) reg_args->gpr[gprcount++]; ++ ++ /* We don't have to do anything in asm for the return. */ ++ ret = FFI_TYPE_VOID; ++ } ++ else if (ret == FFI_TYPE_STRUCT && n == 2) ++ { ++ /* Mark which register the second word of the structure goes in. */ ++ _Bool sse0 = SSE_CLASS_P (classes[0]); ++ _Bool sse1 = SSE_CLASS_P (classes[1]); ++ ++ if (!sse0 && sse1) ++ ret |= 1 << 8; ++ else if (sse0 && !sse1) ++ ret |= 1 << 9; ++ } ++ } ++ ++ avn = cif->nargs; ++ arg_types = cif->arg_types; ++ ++ for (i = 0; i < avn; ++i) ++ { ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ int n; ++ ++ n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); ++ ++ if (n == 0 ++ || gprcount + ngpr > MAX_GPR_REGS ++ || ssecount + nsse > MAX_SSE_REGS) ++ { ++ long align = arg_types[i]->alignment; ++ ++ /* Stack arguments are *always* at least 8 byte aligned. */ ++ if (align < 8) ++ align = 8; ++ ++ /* Pass this argument in memory. */ ++ argp = (void *) ALIGN (argp, align); ++ avalue[i] = argp; ++ argp += arg_types[i]->size; ++ } ++ ++#if !defined(X86_DARWIN) ++ /* If the argument is in a single register, or two consecutive ++ registers, then we can use that address directly. */ ++ else if (n == 1 || (n == 2 && ++ SSE_CLASS_P (classes[0]) == SSE_CLASS_P (classes[1]))) ++ { ++ // The argument is in a single register. ++ if (SSE_CLASS_P (classes[0])) ++ { ++ avalue[i] = ®_args->sse[ssecount]; ++ ssecount += n; ++ } ++ else ++ { ++ avalue[i] = ®_args->gpr[gprcount]; ++ gprcount += n; ++ } ++ } ++#endif ++ ++ /* Otherwise, allocate space to make them consecutive. */ ++ else ++ { ++ char *a = alloca (16); ++ int j; ++ ++ avalue[i] = a; ++ ++ for (j = 0; j < n; j++, a += 8) ++ { ++ if (SSE_CLASS_P (classes[j])) ++ memcpy (a, ®_args->sse[ssecount++], 8); ++ else ++ memcpy (a, ®_args->gpr[gprcount++], 8); ++ } ++ } ++ } ++ ++ /* Invoke the closure. */ ++ closure->fun (cif, rvalue, avalue, closure->user_data); ++ ++ /* Tell assembly how to perform return type promotions. */ ++ return ret; ++} ++ ++#endif /* __x86_64__ */ +diff -r -u ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c +new file mode 100644 +index 0000000..706ea0f +--- /dev/null ++++ ./Modules/_ctypes/libffi_osx/x86/x86-ffi_darwin.c +@@ -0,0 +1,438 @@ ++#ifdef __i386__ ++/* ----------------------------------------------------------------------- ++ ffi.c - Copyright (c) 1996, 1998, 1999, 2001 Red Hat, Inc. ++ Copyright (c) 2002 Ranjit Mathew ++ Copyright (c) 2002 Bo Thorsen ++ Copyright (c) 2002 Roger Sayle ++ ++ x86 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include ++#include ++ ++#include ++ ++/* ffi_prep_args is called by the assembly routine once stack space ++ has been allocated for the function's arguments */ ++ ++void ffi_prep_args(char *stack, extended_cif *ecif); ++ ++void ffi_prep_args(char *stack, extended_cif *ecif) ++{ ++ register unsigned int i; ++ register void **p_argv; ++ register char *argp; ++ register ffi_type **p_arg; ++ ++ argp = stack; ++ ++ if (ecif->cif->flags == FFI_TYPE_STRUCT) ++ { ++ *(void **) argp = ecif->rvalue; ++ argp += 4; ++ } ++ ++ p_argv = ecif->avalue; ++ ++ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; ++ i != 0; ++ i--, p_arg++) ++ { ++ size_t z; ++ ++ /* Align if necessary */ ++ if ((sizeof(int) - 1) & (unsigned) argp) ++ argp = (char *) ALIGN(argp, sizeof(int)); ++ ++ z = (*p_arg)->size; ++ if (z < sizeof(int)) ++ { ++ z = sizeof(int); ++ switch ((*p_arg)->type) ++ { ++ case FFI_TYPE_SINT8: ++ *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT8: ++ *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_SINT16: ++ *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT16: ++ *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_SINT32: ++ *(signed int *) argp = (signed int)*(SINT32 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT32: ++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ } ++ else ++ { ++ memcpy(argp, *p_argv, z); ++ } ++ p_argv++; ++ argp += z; ++ } ++ ++ return; ++} ++ ++/* Perform machine dependent cif processing */ ++ffi_status ffi_prep_cif_machdep(ffi_cif *cif) ++{ ++ /* Set the return type flag */ ++ switch (cif->rtype->type) ++ { ++ case FFI_TYPE_VOID: ++#ifdef X86 ++ case FFI_TYPE_STRUCT: ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_SINT16: ++#endif ++ ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ case FFI_TYPE_LONGDOUBLE: ++ cif->flags = (unsigned) cif->rtype->type; ++ break; ++ ++ case FFI_TYPE_UINT64: ++ cif->flags = FFI_TYPE_SINT64; ++ break; ++ ++#ifndef X86 ++ case FFI_TYPE_STRUCT: ++ if (cif->rtype->size == 1) ++ { ++ cif->flags = FFI_TYPE_SINT8; /* same as char size */ ++ } ++ else if (cif->rtype->size == 2) ++ { ++ cif->flags = FFI_TYPE_SINT16; /* same as short size */ ++ } ++ else if (cif->rtype->size == 4) ++ { ++ cif->flags = FFI_TYPE_INT; /* same as int type */ ++ } ++ else if (cif->rtype->size == 8) ++ { ++ cif->flags = FFI_TYPE_SINT64; /* same as int64 type */ ++ } ++ else ++ { ++ cif->flags = FFI_TYPE_STRUCT; ++ } ++ break; ++#endif ++ ++ default: ++ cif->flags = FFI_TYPE_INT; ++ break; ++ } ++ ++#ifdef X86_DARWIN ++ cif->bytes = (cif->bytes + 15) & ~0xF; ++#endif ++ ++ return FFI_OK; ++} ++ ++extern void ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, ++ unsigned, unsigned, unsigned *, void (*fn)()); ++ ++#ifdef X86_WIN32 ++extern void ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, ++ unsigned, unsigned, unsigned *, void (*fn)()); ++ ++#endif /* X86_WIN32 */ ++ ++void ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue) ++{ ++ extended_cif ecif; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return */ ++ /* value address then we need to make one */ ++ ++ if ((rvalue == NULL) && ++ (cif->flags == FFI_TYPE_STRUCT)) ++ { ++ ecif.rvalue = alloca(cif->rtype->size); ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ ++ switch (cif->abi) ++ { ++ case FFI_SYSV: ++ ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, cif->flags, ecif.rvalue, ++ fn); ++ break; ++#ifdef X86_WIN32 ++ case FFI_STDCALL: ++ ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ break; ++#endif /* X86_WIN32 */ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++ ++/** private members **/ ++ ++static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, ++ void** args, ffi_cif* cif); ++void FFI_HIDDEN ffi_closure_SYSV (ffi_closure *) ++__attribute__ ((regparm(1))); ++unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *) ++__attribute__ ((regparm(1))); ++void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *) ++__attribute__ ((regparm(1))); ++ ++/* This function is jumped to by the trampoline */ ++ ++unsigned int FFI_HIDDEN ++ffi_closure_SYSV_inner (closure, respp, args) ++ffi_closure *closure; ++void **respp; ++void *args; ++{ ++ // our various things... ++ ffi_cif *cif; ++ void **arg_area; ++ ++ cif = closure->cif; ++ arg_area = (void**) alloca (cif->nargs * sizeof (void*)); ++ ++ /* this call will initialize ARG_AREA, such that each ++ * element in that array points to the corresponding ++ * value on the stack; and if the function returns ++ * a structure, it will re-set RESP to point to the ++ * structure return address. */ ++ ++ ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif); ++ ++ (closure->fun) (cif, *respp, arg_area, closure->user_data); ++ ++ return cif->flags; ++} ++ ++static void ++ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue, ++ ffi_cif *cif) ++{ ++ register unsigned int i; ++ register void **p_argv; ++ register char *argp; ++ register ffi_type **p_arg; ++ ++ argp = stack; ++ ++ if ( cif->flags == FFI_TYPE_STRUCT ) { ++ *rvalue = *(void **) argp; ++ argp += 4; ++ } ++ ++ p_argv = avalue; ++ ++ for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) ++ { ++ size_t z; ++ ++ /* Align if necessary */ ++ if ((sizeof(int) - 1) & (unsigned) argp) { ++ argp = (char *) ALIGN(argp, sizeof(int)); ++ } ++ ++ z = (*p_arg)->size; ++ ++ /* because we're little endian, this is what it turns into. */ ++ ++ *p_argv = (void*) argp; ++ ++ p_argv++; ++ argp += z; ++ } ++ ++ return; ++} ++ ++/* How to make a trampoline. Derived from gcc/config/i386/i386.c. */ ++ ++#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \ ++({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ ++unsigned int __fun = (unsigned int)(FUN); \ ++unsigned int __ctx = (unsigned int)(CTX); \ ++unsigned int __dis = __fun - (__ctx + FFI_TRAMPOLINE_SIZE); \ ++*(unsigned char*) &__tramp[0] = 0xb8; \ ++*(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \ ++*(unsigned char *) &__tramp[5] = 0xe9; \ ++*(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \ ++}) ++ ++ ++/* the cif must already be prep'ed */ ++ffi_status ++ffi_prep_closure (ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,void**,void*), ++ void *user_data) ++{ ++ if (cif->abi != FFI_SYSV) ++ return FFI_BAD_ABI; ++ ++ FFI_INIT_TRAMPOLINE (&closure->tramp[0], \ ++ &ffi_closure_SYSV, \ ++ (void*)closure); ++ ++ closure->cif = cif; ++ closure->user_data = user_data; ++ closure->fun = fun; ++ ++ return FFI_OK; ++} ++ ++/* ------- Native raw API support -------------------------------- */ ++ ++#if !FFI_NO_RAW_API ++ ++ffi_status ++ffi_prep_raw_closure_loc (ffi_raw_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), ++ void *user_data, ++ void *codeloc) ++{ ++ int i; ++ ++ FFI_ASSERT (cif->abi == FFI_SYSV); ++ ++ // we currently don't support certain kinds of arguments for raw ++ // closures. This should be implemented by a separate assembly language ++ // routine, since it would require argument processing, something we ++ // don't do now for performance. ++ ++ for (i = cif->nargs-1; i >= 0; i--) ++ { ++ FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_STRUCT); ++ FFI_ASSERT (cif->arg_types[i]->type != FFI_TYPE_LONGDOUBLE); ++ } ++ ++ ++ FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_raw_SYSV, ++ codeloc); ++ ++ closure->cif = cif; ++ closure->user_data = user_data; ++ closure->fun = fun; ++ ++ return FFI_OK; ++} ++ ++static void ++ffi_prep_args_raw(char *stack, extended_cif *ecif) ++{ ++ memcpy (stack, ecif->avalue, ecif->cif->bytes); ++} ++ ++/* we borrow this routine from libffi (it must be changed, though, to ++ * actually call the function passed in the first argument. as of ++ * libffi-1.20, this is not the case.) ++ */ ++ ++extern void ++ffi_call_SYSV(void (*)(char *, extended_cif *), extended_cif *, unsigned, ++ unsigned, unsigned *, void (*fn)()); ++ ++#ifdef X86_WIN32 ++extern void ++ffi_call_STDCALL(void (*)(char *, extended_cif *), extended_cif *, unsigned, ++ unsigned, unsigned *, void (*fn)()); ++#endif /* X86_WIN32 */ ++ ++void ++ffi_raw_call(ffi_cif *cif, void (*fn)(), void *rvalue, ffi_raw *fake_avalue) ++{ ++ extended_cif ecif; ++ void **avalue = (void **)fake_avalue; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return */ ++ /* value address then we need to make one */ ++ ++ if ((rvalue == NULL) && ++ (cif->rtype->type == FFI_TYPE_STRUCT)) ++ { ++ ecif.rvalue = alloca(cif->rtype->size); ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ ++ switch (cif->abi) ++ { ++ case FFI_SYSV: ++ ffi_call_SYSV(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ break; ++#ifdef X86_WIN32 ++ case FFI_STDCALL: ++ ffi_call_STDCALL(ffi_prep_args_raw, &ecif, cif->bytes, cif->flags, ++ ecif.rvalue, fn); ++ break; ++#endif /* X86_WIN32 */ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++#endif ++#endif // __i386__ +diff -r -u ./setup.py ./setup.py +index 46b92fe..2bf6b4b 100644 +--- ./setup.py ++++ ./setup.py +@@ -98,8 +98,14 @@ class PyBuildExt(build_ext): + self.detect_modules() + + # Remove modules that are present on the disabled list +- self.extensions = [ext for ext in self.extensions +- if ext.name not in disabled_module_list] ++ extensions = [ext for ext in self.extensions ++ if ext.name not in disabled_module_list] ++ # move ctypes to the end, it depends on other modules ++ ext_map = dict((ext.name, i) for i, ext in enumerate(extensions)) ++ if "_ctypes" in ext_map: ++ ctypes = extensions.pop(ext_map["_ctypes"]) ++ extensions.append(ctypes) ++ self.extensions = extensions + + # Fix up the autodetected modules, prefixing all the source files + # with Modules/ and adding Python's include directory to the path. +@@ -1330,9 +1336,39 @@ class PyBuildExt(build_ext): + # *** Uncomment these for TOGL extension only: + # -lGL -lGLU -lXext -lXmu \ + ++ def configure_ctypes_darwin(self, ext): ++ # Darwin (OS X) uses preconfigured files, in ++ # the Modules/_ctypes/libffi_osx directory. ++ srcdir = sysconfig.get_config_var('srcdir') ++ ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', ++ '_ctypes', 'libffi_osx')) ++ sources = [os.path.join(ffi_srcdir, p) ++ for p in ['ffi.c', ++ 'x86/darwin64.S', ++ 'x86/x86-darwin.S', ++ 'x86/x86-ffi_darwin.c', ++ 'x86/x86-ffi64.c', ++ 'powerpc/ppc-darwin.S', ++ 'powerpc/ppc-darwin_closure.S', ++ 'powerpc/ppc-ffi_darwin.c', ++ 'powerpc/ppc64-darwin_closure.S', ++ ]] ++ ++ # Add .S (preprocessed assembly) to C compiler source extensions. ++ self.compiler.src_extensions.append('.S') ++ ++ include_dirs = [os.path.join(ffi_srcdir, 'include'), ++ os.path.join(ffi_srcdir, 'powerpc')] ++ ext.include_dirs.extend(include_dirs) ++ ext.sources.extend(sources) ++ return True ++ + def configure_ctypes(self, ext): + if not self.use_system_libffi: +- (srcdir,) = sysconfig.get_config_vars('srcdir') ++ if sys.platform == 'darwin': ++ return self.configure_ctypes_darwin(ext) ++ ++ srcdir = sysconfig.get_config_var('srcdir') + ffi_builddir = os.path.join(self.build_temp, 'libffi') + ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', + '_ctypes', 'libffi')) +@@ -1347,7 +1383,10 @@ class PyBuildExt(build_ext): + ffi_configfile): + from distutils.dir_util import mkpath + mkpath(ffi_builddir) +- config_args = [] ++ config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split() ++ if (('--host=' in arg) or ('--build=' in arg))] ++ if not self.verbose: ++ config_args.append("-q") + + # Pass empty CFLAGS because we'll just append the resulting + # CFLAGS to Python's; -g or -O2 is to be avoided. +@@ -1367,10 +1406,12 @@ class PyBuildExt(build_ext): + self.compiler.src_extensions.append('.S') + + include_dirs = [os.path.join(ffi_builddir, 'include'), +- ffi_builddir, ffi_srcdir] ++ ffi_builddir, ++ os.path.join(ffi_srcdir, 'src')] + extra_compile_args = fficonfig['ffi_cflags'].split() + +- ext.sources.extend(fficonfig['ffi_sources']) ++ ext.sources.extend(os.path.join(ffi_srcdir, f) for f in ++ fficonfig['ffi_sources']) + ext.include_dirs.extend(include_dirs) + ext.extra_compile_args.extend(extra_compile_args) + return True +@@ -1390,6 +1431,7 @@ class PyBuildExt(build_ext): + + if sys.platform == 'darwin': + sources.append('_ctypes/darwin/dlfcn_simple.c') ++ extra_compile_args.append('-DMACOSX') + include_dirs.append('_ctypes/darwin') + # XXX Is this still needed? + ## extra_link_args.extend(['-read_only_relocs', 'warning']) +@@ -1419,7 +1461,14 @@ class PyBuildExt(build_ext): + if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"): + return + +- ffi_inc = find_file('ffi.h', [], inc_dirs) ++ if sys.platform == 'darwin': ++ # OS X 10.5 comes with libffi.dylib; the include files are ++ # in /usr/include/ffi ++ inc_dirs.append('/usr/include/ffi') ++ ++ ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] ++ if not ffi_inc or ffi_inc[0] == '': ++ ffi_inc = find_file('ffi.h', [], inc_dirs) + if ffi_inc is not None: + ffi_h = ffi_inc[0] + '/ffi.h' + fp = open(ffi_h) diff --git a/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/005_osx_failed_modules.patch b/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/005_osx_failed_modules.patch new file mode 100644 index 0000000..5ccfe9c --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/005_osx_failed_modules.patch @@ -0,0 +1,124 @@ +diff -r -u ./Mac/Modules/cg/_CGmodule.c ./Mac/Modules/cg/_CGmodule.c +index 8115614..e36fce9 100755 +--- ./Mac/Modules/cg/_CGmodule.c ++++ ./Mac/Modules/cg/_CGmodule.c +@@ -1025,6 +1025,7 @@ static PyObject *CGContextRefObj_CGContextSetShouldAntialias(CGContextRefObject + return _res; + } + ++#ifndef __LP64__ + static PyObject *CGContextRefObj_SyncCGContextOriginWithPort(CGContextRefObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1055,6 +1056,7 @@ static PyObject *CGContextRefObj_ClipCGContextToRegion(CGContextRefObject *_self + _res = Py_None; + return _res; + } ++#endif + + static PyMethodDef CGContextRefObj_methods[] = { + {"CGContextSaveGState", (PyCFunction)CGContextRefObj_CGContextSaveGState, 1, +@@ -1173,10 +1175,12 @@ static PyMethodDef CGContextRefObj_methods[] = { + PyDoc_STR("() -> None")}, + {"CGContextSetShouldAntialias", (PyCFunction)CGContextRefObj_CGContextSetShouldAntialias, 1, + PyDoc_STR("(int shouldAntialias) -> None")}, ++#ifndef __LP64__ + {"SyncCGContextOriginWithPort", (PyCFunction)CGContextRefObj_SyncCGContextOriginWithPort, 1, + PyDoc_STR("(CGrafPtr port) -> None")}, + {"ClipCGContextToRegion", (PyCFunction)CGContextRefObj_ClipCGContextToRegion, 1, + PyDoc_STR("(Rect portRect, RgnHandle region) -> None")}, ++#endif + {NULL, NULL, 0} + }; + +@@ -1254,6 +1258,7 @@ PyTypeObject CGContextRef_Type = { + /* ------------------ End object type CGContextRef ------------------ */ + + ++#ifndef __LP64__ + static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) + { + PyObject *_res = NULL; +@@ -1271,10 +1276,13 @@ static PyObject *CG_CreateCGContextForPort(PyObject *_self, PyObject *_args) + return _res; + + } ++#endif + + static PyMethodDef CG_methods[] = { ++#ifndef __LP64__ + {"CreateCGContextForPort", (PyCFunction)CG_CreateCGContextForPort, 1, + PyDoc_STR("(CGrafPtr) -> CGContextRef")}, ++#endif + {NULL, NULL, 0} + }; + +diff -r -u ./Modules/_curses_panel.c ./Modules/_curses_panel.c +index 0acf3fd..1728b59 100644 +--- ./Modules/_curses_panel.c ++++ ./Modules/_curses_panel.c +@@ -56,7 +56,7 @@ typedef struct { + + PyTypeObject PyCursesPanel_Type; + +-#define PyCursesPanel_Check(v) ((v)->ob_type == &PyCursesPanel_Type) ++#define PyCursesPanel_Check(v) (Py_TYPE(v) == &PyCursesPanel_Type) + + /* Some helper functions. The problem is that there's always a window + associated with a panel. To ensure that Python's GC doesn't pull +@@ -178,12 +178,13 @@ PyCursesPanel_New(PANEL *pan, PyCursesWindowObject *wo) + po = PyObject_NEW(PyCursesPanelObject, &PyCursesPanel_Type); + if (po == NULL) return NULL; + po->pan = pan; +- po->wo = wo; +- Py_INCREF(wo); + if (insert_lop(po) < 0) { +- PyObject_DEL(po); +- return NULL; ++ po->wo = NULL; ++ Py_DECREF(po); ++ return NULL; + } ++ po->wo = wo; ++ Py_INCREF(wo); + return (PyObject *)po; + } + +@@ -191,8 +192,10 @@ static void + PyCursesPanel_Dealloc(PyCursesPanelObject *po) + { + (void)del_panel(po->pan); +- Py_DECREF(po->wo); +- remove_lop(po); ++ if (po->wo != NULL) { ++ Py_DECREF(po->wo); ++ remove_lop(po); ++ } + PyObject_DEL(po); + } + +@@ -338,11 +341,10 @@ PyCursesPanel_GetAttr(PyCursesPanelObject *self, char *name) + /* -------------------------------------------------------*/ + + PyTypeObject PyCursesPanel_Type = { +- PyObject_HEAD_INIT(NULL) +- 0, /*ob_size*/ +- "_curses_panel.curses panel", /*tp_name*/ +- sizeof(PyCursesPanelObject), /*tp_basicsize*/ +- 0, /*tp_itemsize*/ ++ PyVarObject_HEAD_INIT(NULL, 0) ++ "_curses_panel.curses panel", /*tp_name*/ ++ sizeof(PyCursesPanelObject), /*tp_basicsize*/ ++ 0, /*tp_itemsize*/ + /* methods */ + (destructor)PyCursesPanel_Dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ +@@ -458,7 +460,7 @@ init_curses_panel(void) + PyObject *m, *d, *v; + + /* Initialize object type */ +- PyCursesPanel_Type.ob_type = &PyType_Type; ++ Py_TYPE(&PyCursesPanel_Type) = &PyType_Type; + + import_curses(); + diff --git a/plugins/python-build/share/python-build/patches/2.6.0/Python-2.6/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.6.0/Python-2.6/000_patch-setup.py.diff new file mode 100644 index 0000000..98646ba --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.0/Python-2.6/000_patch-setup.py.diff @@ -0,0 +1,71 @@ + +# HG changeset patch +# User Barry Warsaw +# Date 1302190091 14400 +# Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa +# Parent 2e4cdaffe493e879fb5367a4aa454491de451137 +Backport for Python 2.7 of issue 11715 support for building Python on +multiarch Debian/Ubuntu. + +diff -r -u setup.py setup.py +--- setup.py.orig ++++ setup.py +@@ -15,6 +15,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -308,10 +309,33 @@ class PyBuildExt(build_ext): + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ with open(tmpfile) as fp: ++ multiarch_path_component = fp.readline().strip() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. +@@ -1308,14 +1332,13 @@ + + + # Platform-specific libraries +- if platform == 'linux2': ++ if platform.startswith('linux'): + # Linux-specific modules + exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) ) + else: + missing.append('linuxaudiodev') + +- if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', +- 'freebsd7', 'freebsd8'): ++ if platform.startswith('linux') or platform.startswith('freebsd'): + exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) + else: + missing.append('ossaudiodev') diff --git a/plugins/python-build/share/python-build/patches/2.6.0/Python-2.6/002_readline63.patch b/plugins/python-build/share/python-build/patches/2.6.0/Python-2.6/002_readline63.patch new file mode 100644 index 0000000..5bb7245 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.0/Python-2.6/002_readline63.patch @@ -0,0 +1,61 @@ +diff -r -u ../Python-2.6.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-2.6.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 +@@ -174,8 +174,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -647,14 +646,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -749,7 +756,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + Py_XDECREF(begidx); + Py_XDECREF(endidx); +@@ -783,12 +790,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + rl_completer_word_break_characters = + strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?"); diff --git a/plugins/python-build/share/python-build/patches/2.6.0/Python-2.6/003_tk86.patch b/plugins/python-build/share/python-build/patches/2.6.0/Python-2.6/003_tk86.patch new file mode 100644 index 0000000..d68848f --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.0/Python-2.6/003_tk86.patch @@ -0,0 +1,12 @@ +diff -r -u ../Python-2.6.orig/setup.py ./setup.py +--- ../Python-2.6.orig/setup.py 2013-10-30 00:04:39.000000000 +0900 ++++ ./setup.py 2014-04-03 22:28:49.122061684 +0900 +@@ -1541,7 +1541,7 @@ + # The versions with dots are used on Unix, and the versions without + # dots on Windows, for detection by cygwin. + tcllib = tklib = tcl_includes = tk_includes = None +- for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2', ++ for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83', + '82', '8.1', '81', '8.0', '80']: + tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version) + tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version) diff --git a/plugins/python-build/share/python-build/patches/2.6.0/Python-2.6/010_ssl_no_ssl2_no_ssl3.patch b/plugins/python-build/share/python-build/patches/2.6.0/Python-2.6/010_ssl_no_ssl2_no_ssl3.patch new file mode 100644 index 0000000..c16b5ba --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.0/Python-2.6/010_ssl_no_ssl2_no_ssl3.patch @@ -0,0 +1,95 @@ +diff -r -u ../Python-2.6.4.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-2.6.4.orig/Lib/ssl.py 2012-04-10 15:32:06.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-18 14:46:36.487188331 +0000 +@@ -61,18 +61,24 @@ + + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import \ +- SSL_ERROR_ZERO_RETURN, \ +- SSL_ERROR_WANT_READ, \ +- SSL_ERROR_WANT_WRITE, \ +- SSL_ERROR_WANT_X509_LOOKUP, \ +- SSL_ERROR_SYSCALL, \ +- SSL_ERROR_SSL, \ +- SSL_ERROR_WANT_CONNECT, \ +- SSL_ERROR_EOF, \ +- SSL_ERROR_INVALID_ERROR_CODE ++from _ssl import RAND_status, RAND_add ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('ALERT_DESCRIPTION_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = dict([(value, name) for name, value in globals().items() if name.startswith('PROTOCOL_')]) + + from socket import socket, _fileobject + from socket import getnameinfo as _getnameinfo +@@ -394,7 +400,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodestring(d) + +-def get_server_certificate (addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. +diff -r -u ../Python-2.6.4.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-2.6.4.orig/Modules/_ssl.c 2012-04-10 15:32:09.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-18 14:45:30.419597074 +0000 +@@ -61,8 +61,12 @@ + }; + + enum py_ssl_version { ++#ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, ++#endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1, + }; +@@ -298,10 +302,14 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif ++#ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ ++#endif + else if (proto_version == PY_SSL_VERSION_SSL23) + self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ + PySSL_END_ALLOW_THREADS +@@ -1627,10 +1635,14 @@ + PY_SSL_CERT_REQUIRED); + + /* protocol versions */ ++#ifndef OPENSSL_NO_SSL2 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); ++#endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/2.6.1/Python-2.6.1/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.6.1/Python-2.6.1/000_patch-setup.py.diff new file mode 100644 index 0000000..d47a238 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.1/Python-2.6.1/000_patch-setup.py.diff @@ -0,0 +1,71 @@ + +# HG changeset patch +# User Barry Warsaw +# Date 1302190091 14400 +# Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa +# Parent 2e4cdaffe493e879fb5367a4aa454491de451137 +Backport for Python 2.7 of issue 11715 support for building Python on +multiarch Debian/Ubuntu. + +diff -r -u setup.py setup.py +--- setup.py.orig ++++ setup.py +@@ -15,6 +15,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -308,10 +309,33 @@ class PyBuildExt(build_ext): + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ with open(tmpfile) as fp: ++ multiarch_path_component = fp.readline().strip() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. +@@ -1310,14 +1334,13 @@ + + + # Platform-specific libraries +- if platform == 'linux2': ++ if platform.startswith('linux'): + # Linux-specific modules + exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) ) + else: + missing.append('linuxaudiodev') + +- if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', +- 'freebsd7', 'freebsd8'): ++ if platform.startswith('linux') or platform.startswith('freebsd'): + exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) + else: + missing.append('ossaudiodev') diff --git a/plugins/python-build/share/python-build/patches/2.6.1/Python-2.6.1/002_readline63.patch b/plugins/python-build/share/python-build/patches/2.6.1/Python-2.6.1/002_readline63.patch new file mode 100644 index 0000000..9f4feff --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.1/Python-2.6.1/002_readline63.patch @@ -0,0 +1,61 @@ +diff -r -u ../Python-2.6.4.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-2.6.4.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 +@@ -178,8 +178,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -655,14 +655,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -757,7 +757,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + Py_XDECREF(begidx); + Py_XDECREF(endidx); +@@ -791,12 +791,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + rl_completer_word_break_characters = + strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?"); diff --git a/plugins/python-build/share/python-build/patches/2.6.1/Python-2.6.1/003_tk86.patch b/plugins/python-build/share/python-build/patches/2.6.1/Python-2.6.1/003_tk86.patch new file mode 100644 index 0000000..83dfc42 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.1/Python-2.6.1/003_tk86.patch @@ -0,0 +1,12 @@ +diff -r -u ../Python-2.6.1.orig/setup.py ./setup.py +--- ../Python-2.6.1.orig/setup.py 2013-10-30 00:04:39.000000000 +0900 ++++ ./setup.py 2014-04-03 22:28:49.122061684 +0900 +@@ -1543,7 +1543,7 @@ + # The versions with dots are used on Unix, and the versions without + # dots on Windows, for detection by cygwin. + tcllib = tklib = tcl_includes = tk_includes = None +- for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2', ++ for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83', + '82', '8.1', '81', '8.0', '80']: + tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version) + tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version) diff --git a/plugins/python-build/share/python-build/patches/2.6.1/Python-2.6.1/010_ssl_no_ssl2_no_ssl3.patch b/plugins/python-build/share/python-build/patches/2.6.1/Python-2.6.1/010_ssl_no_ssl2_no_ssl3.patch new file mode 100644 index 0000000..c16b5ba --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.1/Python-2.6.1/010_ssl_no_ssl2_no_ssl3.patch @@ -0,0 +1,95 @@ +diff -r -u ../Python-2.6.4.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-2.6.4.orig/Lib/ssl.py 2012-04-10 15:32:06.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-18 14:46:36.487188331 +0000 +@@ -61,18 +61,24 @@ + + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import \ +- SSL_ERROR_ZERO_RETURN, \ +- SSL_ERROR_WANT_READ, \ +- SSL_ERROR_WANT_WRITE, \ +- SSL_ERROR_WANT_X509_LOOKUP, \ +- SSL_ERROR_SYSCALL, \ +- SSL_ERROR_SSL, \ +- SSL_ERROR_WANT_CONNECT, \ +- SSL_ERROR_EOF, \ +- SSL_ERROR_INVALID_ERROR_CODE ++from _ssl import RAND_status, RAND_add ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('ALERT_DESCRIPTION_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = dict([(value, name) for name, value in globals().items() if name.startswith('PROTOCOL_')]) + + from socket import socket, _fileobject + from socket import getnameinfo as _getnameinfo +@@ -394,7 +400,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodestring(d) + +-def get_server_certificate (addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. +diff -r -u ../Python-2.6.4.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-2.6.4.orig/Modules/_ssl.c 2012-04-10 15:32:09.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-18 14:45:30.419597074 +0000 +@@ -61,8 +61,12 @@ + }; + + enum py_ssl_version { ++#ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, ++#endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1, + }; +@@ -298,10 +302,14 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif ++#ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ ++#endif + else if (proto_version == PY_SSL_VERSION_SSL23) + self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ + PySSL_END_ALLOW_THREADS +@@ -1627,10 +1635,14 @@ + PY_SSL_CERT_REQUIRED); + + /* protocol versions */ ++#ifndef OPENSSL_NO_SSL2 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); ++#endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/2.6.2/Python-2.6.2/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.6.2/Python-2.6.2/000_patch-setup.py.diff new file mode 100644 index 0000000..076ac88 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.2/Python-2.6.2/000_patch-setup.py.diff @@ -0,0 +1,71 @@ + +# HG changeset patch +# User Barry Warsaw +# Date 1302190091 14400 +# Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa +# Parent 2e4cdaffe493e879fb5367a4aa454491de451137 +Backport for Python 2.7 of issue 11715 support for building Python on +multiarch Debian/Ubuntu. + +diff -r -u setup.py setup.py +--- setup.py.orig ++++ setup.py +@@ -15,6 +15,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -308,10 +309,33 @@ class PyBuildExt(build_ext): + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ with open(tmpfile) as fp: ++ multiarch_path_component = fp.readline().strip() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. +@@ -1331,14 +1355,13 @@ + + + # Platform-specific libraries +- if platform == 'linux2': ++ if platform.startswith('linux'): + # Linux-specific modules + exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) ) + else: + missing.append('linuxaudiodev') + +- if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', +- 'freebsd7', 'freebsd8'): ++ if platform.startswith('linux') or platform.startswith('freebsd'): + exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) + else: + missing.append('ossaudiodev') diff --git a/plugins/python-build/share/python-build/patches/2.6.2/Python-2.6.2/002_readline63.patch b/plugins/python-build/share/python-build/patches/2.6.2/Python-2.6.2/002_readline63.patch new file mode 100644 index 0000000..852f3ab --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.2/Python-2.6.2/002_readline63.patch @@ -0,0 +1,61 @@ +diff -r -u ../Python-2.6.4.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-2.6.4.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 +@@ -178,8 +178,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -655,14 +654,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -757,7 +764,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + Py_XDECREF(begidx); + Py_XDECREF(endidx); +@@ -791,12 +798,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + rl_completer_word_break_characters = + strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?"); diff --git a/plugins/python-build/share/python-build/patches/2.6.2/Python-2.6.2/003_tk86.patch b/plugins/python-build/share/python-build/patches/2.6.2/Python-2.6.2/003_tk86.patch new file mode 100644 index 0000000..cb4ed2d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.2/Python-2.6.2/003_tk86.patch @@ -0,0 +1,12 @@ +diff -r -u ../Python-2.6.2.orig/setup.py ./setup.py +--- ../Python-2.6.2.orig/setup.py 2013-10-30 00:04:39.000000000 +0900 ++++ ./setup.py 2014-04-03 22:28:49.122061684 +0900 +@@ -1564,7 +1564,7 @@ + # The versions with dots are used on Unix, and the versions without + # dots on Windows, for detection by cygwin. + tcllib = tklib = tcl_includes = tk_includes = None +- for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2', ++ for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83', + '82', '8.1', '81', '8.0', '80']: + tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version) + tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version) diff --git a/plugins/python-build/share/python-build/patches/2.6.2/Python-2.6.2/010_ssl_no_ssl2_no_ssl3.patch b/plugins/python-build/share/python-build/patches/2.6.2/Python-2.6.2/010_ssl_no_ssl2_no_ssl3.patch new file mode 100644 index 0000000..c16b5ba --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.2/Python-2.6.2/010_ssl_no_ssl2_no_ssl3.patch @@ -0,0 +1,95 @@ +diff -r -u ../Python-2.6.4.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-2.6.4.orig/Lib/ssl.py 2012-04-10 15:32:06.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-18 14:46:36.487188331 +0000 +@@ -61,18 +61,24 @@ + + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import \ +- SSL_ERROR_ZERO_RETURN, \ +- SSL_ERROR_WANT_READ, \ +- SSL_ERROR_WANT_WRITE, \ +- SSL_ERROR_WANT_X509_LOOKUP, \ +- SSL_ERROR_SYSCALL, \ +- SSL_ERROR_SSL, \ +- SSL_ERROR_WANT_CONNECT, \ +- SSL_ERROR_EOF, \ +- SSL_ERROR_INVALID_ERROR_CODE ++from _ssl import RAND_status, RAND_add ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('ALERT_DESCRIPTION_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = dict([(value, name) for name, value in globals().items() if name.startswith('PROTOCOL_')]) + + from socket import socket, _fileobject + from socket import getnameinfo as _getnameinfo +@@ -394,7 +400,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodestring(d) + +-def get_server_certificate (addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. +diff -r -u ../Python-2.6.4.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-2.6.4.orig/Modules/_ssl.c 2012-04-10 15:32:09.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-18 14:45:30.419597074 +0000 +@@ -61,8 +61,12 @@ + }; + + enum py_ssl_version { ++#ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, ++#endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1, + }; +@@ -298,10 +302,14 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif ++#ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ ++#endif + else if (proto_version == PY_SSL_VERSION_SSL23) + self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ + PySSL_END_ALLOW_THREADS +@@ -1627,10 +1635,14 @@ + PY_SSL_CERT_REQUIRED); + + /* protocol versions */ ++#ifndef OPENSSL_NO_SSL2 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); ++#endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/2.6.3/Python-2.6.3/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.6.3/Python-2.6.3/000_patch-setup.py.diff new file mode 100644 index 0000000..076ac88 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.3/Python-2.6.3/000_patch-setup.py.diff @@ -0,0 +1,71 @@ + +# HG changeset patch +# User Barry Warsaw +# Date 1302190091 14400 +# Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa +# Parent 2e4cdaffe493e879fb5367a4aa454491de451137 +Backport for Python 2.7 of issue 11715 support for building Python on +multiarch Debian/Ubuntu. + +diff -r -u setup.py setup.py +--- setup.py.orig ++++ setup.py +@@ -15,6 +15,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -308,10 +309,33 @@ class PyBuildExt(build_ext): + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ with open(tmpfile) as fp: ++ multiarch_path_component = fp.readline().strip() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. +@@ -1331,14 +1355,13 @@ + + + # Platform-specific libraries +- if platform == 'linux2': ++ if platform.startswith('linux'): + # Linux-specific modules + exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) ) + else: + missing.append('linuxaudiodev') + +- if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', +- 'freebsd7', 'freebsd8'): ++ if platform.startswith('linux') or platform.startswith('freebsd'): + exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) + else: + missing.append('ossaudiodev') diff --git a/plugins/python-build/share/python-build/patches/2.6.3/Python-2.6.3/002_readline63.patch b/plugins/python-build/share/python-build/patches/2.6.3/Python-2.6.3/002_readline63.patch new file mode 100644 index 0000000..852f3ab --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.3/Python-2.6.3/002_readline63.patch @@ -0,0 +1,61 @@ +diff -r -u ../Python-2.6.4.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-2.6.4.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 +@@ -178,8 +178,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -655,14 +654,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -757,7 +764,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + Py_XDECREF(begidx); + Py_XDECREF(endidx); +@@ -791,12 +798,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + rl_completer_word_break_characters = + strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?"); diff --git a/plugins/python-build/share/python-build/patches/2.6.3/Python-2.6.3/003_tk86.patch b/plugins/python-build/share/python-build/patches/2.6.3/Python-2.6.3/003_tk86.patch new file mode 100644 index 0000000..6036721 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.3/Python-2.6.3/003_tk86.patch @@ -0,0 +1,12 @@ +diff -r -u ../Python-2.6.4.orig/setup.py ./setup.py +--- ../Python-2.6.4.orig/setup.py 2013-10-30 00:04:39.000000000 +0900 ++++ ./setup.py 2014-04-03 22:28:49.122061684 +0900 +@@ -1573,7 +1573,7 @@ + # The versions with dots are used on Unix, and the versions without + # dots on Windows, for detection by cygwin. + tcllib = tklib = tcl_includes = tk_includes = None +- for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2', ++ for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83', + '82', '8.1', '81', '8.0', '80']: + tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version) + tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version) diff --git a/plugins/python-build/share/python-build/patches/2.6.3/Python-2.6.3/010_ssl_no_ssl2_no_ssl3.patch b/plugins/python-build/share/python-build/patches/2.6.3/Python-2.6.3/010_ssl_no_ssl2_no_ssl3.patch new file mode 100644 index 0000000..c16b5ba --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.3/Python-2.6.3/010_ssl_no_ssl2_no_ssl3.patch @@ -0,0 +1,95 @@ +diff -r -u ../Python-2.6.4.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-2.6.4.orig/Lib/ssl.py 2012-04-10 15:32:06.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-18 14:46:36.487188331 +0000 +@@ -61,18 +61,24 @@ + + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import \ +- SSL_ERROR_ZERO_RETURN, \ +- SSL_ERROR_WANT_READ, \ +- SSL_ERROR_WANT_WRITE, \ +- SSL_ERROR_WANT_X509_LOOKUP, \ +- SSL_ERROR_SYSCALL, \ +- SSL_ERROR_SSL, \ +- SSL_ERROR_WANT_CONNECT, \ +- SSL_ERROR_EOF, \ +- SSL_ERROR_INVALID_ERROR_CODE ++from _ssl import RAND_status, RAND_add ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('ALERT_DESCRIPTION_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = dict([(value, name) for name, value in globals().items() if name.startswith('PROTOCOL_')]) + + from socket import socket, _fileobject + from socket import getnameinfo as _getnameinfo +@@ -394,7 +400,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodestring(d) + +-def get_server_certificate (addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. +diff -r -u ../Python-2.6.4.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-2.6.4.orig/Modules/_ssl.c 2012-04-10 15:32:09.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-18 14:45:30.419597074 +0000 +@@ -61,8 +61,12 @@ + }; + + enum py_ssl_version { ++#ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, ++#endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1, + }; +@@ -298,10 +302,14 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif ++#ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ ++#endif + else if (proto_version == PY_SSL_VERSION_SSL23) + self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ + PySSL_END_ALLOW_THREADS +@@ -1627,10 +1635,14 @@ + PY_SSL_CERT_REQUIRED); + + /* protocol versions */ ++#ifndef OPENSSL_NO_SSL2 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); ++#endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/2.6.4/Python-2.6.4/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.6.4/Python-2.6.4/000_patch-setup.py.diff new file mode 100644 index 0000000..076ac88 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.4/Python-2.6.4/000_patch-setup.py.diff @@ -0,0 +1,71 @@ + +# HG changeset patch +# User Barry Warsaw +# Date 1302190091 14400 +# Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa +# Parent 2e4cdaffe493e879fb5367a4aa454491de451137 +Backport for Python 2.7 of issue 11715 support for building Python on +multiarch Debian/Ubuntu. + +diff -r -u setup.py setup.py +--- setup.py.orig ++++ setup.py +@@ -15,6 +15,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -308,10 +309,33 @@ class PyBuildExt(build_ext): + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ with open(tmpfile) as fp: ++ multiarch_path_component = fp.readline().strip() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. +@@ -1331,14 +1355,13 @@ + + + # Platform-specific libraries +- if platform == 'linux2': ++ if platform.startswith('linux'): + # Linux-specific modules + exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) ) + else: + missing.append('linuxaudiodev') + +- if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', +- 'freebsd7', 'freebsd8'): ++ if platform.startswith('linux') or platform.startswith('freebsd'): + exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) + else: + missing.append('ossaudiodev') diff --git a/plugins/python-build/share/python-build/patches/2.6.4/Python-2.6.4/002_readline63.patch b/plugins/python-build/share/python-build/patches/2.6.4/Python-2.6.4/002_readline63.patch new file mode 100644 index 0000000..852f3ab --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.4/Python-2.6.4/002_readline63.patch @@ -0,0 +1,61 @@ +diff -r -u ../Python-2.6.4.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-2.6.4.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 +@@ -178,8 +178,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -655,14 +654,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -757,7 +764,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + Py_XDECREF(begidx); + Py_XDECREF(endidx); +@@ -791,12 +798,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + rl_completer_word_break_characters = + strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?"); diff --git a/plugins/python-build/share/python-build/patches/2.6.4/Python-2.6.4/003_tk86.patch b/plugins/python-build/share/python-build/patches/2.6.4/Python-2.6.4/003_tk86.patch new file mode 100644 index 0000000..6036721 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.4/Python-2.6.4/003_tk86.patch @@ -0,0 +1,12 @@ +diff -r -u ../Python-2.6.4.orig/setup.py ./setup.py +--- ../Python-2.6.4.orig/setup.py 2013-10-30 00:04:39.000000000 +0900 ++++ ./setup.py 2014-04-03 22:28:49.122061684 +0900 +@@ -1573,7 +1573,7 @@ + # The versions with dots are used on Unix, and the versions without + # dots on Windows, for detection by cygwin. + tcllib = tklib = tcl_includes = tk_includes = None +- for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2', ++ for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83', + '82', '8.1', '81', '8.0', '80']: + tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version) + tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version) diff --git a/plugins/python-build/share/python-build/patches/2.6.4/Python-2.6.4/010_ssl_no_ssl2_no_ssl3.patch b/plugins/python-build/share/python-build/patches/2.6.4/Python-2.6.4/010_ssl_no_ssl2_no_ssl3.patch new file mode 100644 index 0000000..c16b5ba --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.4/Python-2.6.4/010_ssl_no_ssl2_no_ssl3.patch @@ -0,0 +1,95 @@ +diff -r -u ../Python-2.6.4.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-2.6.4.orig/Lib/ssl.py 2012-04-10 15:32:06.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-18 14:46:36.487188331 +0000 +@@ -61,18 +61,24 @@ + + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import \ +- SSL_ERROR_ZERO_RETURN, \ +- SSL_ERROR_WANT_READ, \ +- SSL_ERROR_WANT_WRITE, \ +- SSL_ERROR_WANT_X509_LOOKUP, \ +- SSL_ERROR_SYSCALL, \ +- SSL_ERROR_SSL, \ +- SSL_ERROR_WANT_CONNECT, \ +- SSL_ERROR_EOF, \ +- SSL_ERROR_INVALID_ERROR_CODE ++from _ssl import RAND_status, RAND_add ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('ALERT_DESCRIPTION_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = dict([(value, name) for name, value in globals().items() if name.startswith('PROTOCOL_')]) + + from socket import socket, _fileobject + from socket import getnameinfo as _getnameinfo +@@ -394,7 +400,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodestring(d) + +-def get_server_certificate (addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. +diff -r -u ../Python-2.6.4.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-2.6.4.orig/Modules/_ssl.c 2012-04-10 15:32:09.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-18 14:45:30.419597074 +0000 +@@ -61,8 +61,12 @@ + }; + + enum py_ssl_version { ++#ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, ++#endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1, + }; +@@ -298,10 +302,14 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif ++#ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ ++#endif + else if (proto_version == PY_SSL_VERSION_SSL23) + self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ + PySSL_END_ALLOW_THREADS +@@ -1627,10 +1635,14 @@ + PY_SSL_CERT_REQUIRED); + + /* protocol versions */ ++#ifndef OPENSSL_NO_SSL2 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); ++#endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/2.6.5/Python-2.6.5/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.6.5/Python-2.6.5/000_patch-setup.py.diff new file mode 100644 index 0000000..1c3852d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.5/Python-2.6.5/000_patch-setup.py.diff @@ -0,0 +1,71 @@ + +# HG changeset patch +# User Barry Warsaw +# Date 1302190091 14400 +# Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa +# Parent 2e4cdaffe493e879fb5367a4aa454491de451137 +Backport for Python 2.7 of issue 11715 support for building Python on +multiarch Debian/Ubuntu. + +diff -r -u setup.py setup.py +--- setup.py.orig ++++ setup.py +@@ -15,6 +15,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -308,10 +309,33 @@ class PyBuildExt(build_ext): + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ with open(tmpfile) as fp: ++ multiarch_path_component = fp.readline().strip() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. +@@ -1339,14 +1363,13 @@ + + + # Platform-specific libraries +- if platform == 'linux2': ++ if platform.startswith('linux'): + # Linux-specific modules + exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) ) + else: + missing.append('linuxaudiodev') + +- if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', +- 'freebsd7', 'freebsd8'): ++ if platform.startswith('linux') or platform.startswith('freebsd'): + exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) + else: + missing.append('ossaudiodev') diff --git a/plugins/python-build/share/python-build/patches/2.6.5/Python-2.6.5/002_readline63.patch b/plugins/python-build/share/python-build/patches/2.6.5/Python-2.6.5/002_readline63.patch new file mode 100644 index 0000000..7d93352 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.5/Python-2.6.5/002_readline63.patch @@ -0,0 +1,61 @@ +diff -r -u ../Python-2.6.5.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-2.6.5.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 +@@ -199,8 +199,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -699,14 +698,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -801,7 +808,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -841,12 +848,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + rl_completer_word_break_characters = + strdup(" \t\n`~!@#$%^&*()-=+[{]}\\|;:'\",<>/?"); diff --git a/plugins/python-build/share/python-build/patches/2.6.5/Python-2.6.5/003_tk86.patch b/plugins/python-build/share/python-build/patches/2.6.5/Python-2.6.5/003_tk86.patch new file mode 100644 index 0000000..012010f --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.5/Python-2.6.5/003_tk86.patch @@ -0,0 +1,12 @@ +diff -r -u ../Python-2.6.5.orig/setup.py ./setup.py +--- ../Python-2.6.5.orig/setup.py 2013-10-30 00:04:39.000000000 +0900 ++++ ./setup.py 2014-04-03 22:28:49.122061684 +0900 +@@ -1581,7 +1581,7 @@ + # The versions with dots are used on Unix, and the versions without + # dots on Windows, for detection by cygwin. + tcllib = tklib = tcl_includes = tk_includes = None +- for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2', ++ for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83', + '82', '8.1', '81', '8.0', '80']: + tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version) + tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version) diff --git a/plugins/python-build/share/python-build/patches/2.6.5/Python-2.6.5/010_ssl_no_ssl2_no_ssl3.patch b/plugins/python-build/share/python-build/patches/2.6.5/Python-2.6.5/010_ssl_no_ssl2_no_ssl3.patch new file mode 100644 index 0000000..dc8e55c --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.5/Python-2.6.5/010_ssl_no_ssl2_no_ssl3.patch @@ -0,0 +1,95 @@ +diff -r -u ../Python-2.6.5.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-2.6.5.orig/Lib/ssl.py 2012-04-10 15:32:06.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-18 14:46:36.487188331 +0000 +@@ -61,18 +61,24 @@ + + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import \ +- SSL_ERROR_ZERO_RETURN, \ +- SSL_ERROR_WANT_READ, \ +- SSL_ERROR_WANT_WRITE, \ +- SSL_ERROR_WANT_X509_LOOKUP, \ +- SSL_ERROR_SYSCALL, \ +- SSL_ERROR_SSL, \ +- SSL_ERROR_WANT_CONNECT, \ +- SSL_ERROR_EOF, \ +- SSL_ERROR_INVALID_ERROR_CODE ++from _ssl import RAND_status, RAND_add ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('ALERT_DESCRIPTION_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = dict([(value, name) for name, value in globals().items() if name.startswith('PROTOCOL_')]) + + from socket import socket, _fileobject + from socket import getnameinfo as _getnameinfo +@@ -394,7 +400,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodestring(d) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. +diff -r -u ../Python-2.6.5.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-2.6.5.orig/Modules/_ssl.c 2012-04-10 15:32:09.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-18 14:45:30.419597074 +0000 +@@ -61,8 +61,12 @@ + }; + + enum py_ssl_version { ++#ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, ++#endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1, + }; +@@ -298,10 +302,14 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif ++#ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ ++#endif + else if (proto_version == PY_SSL_VERSION_SSL23) + self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ + PySSL_END_ALLOW_THREADS +@@ -1627,10 +1635,14 @@ + PY_SSL_CERT_REQUIRED); + + /* protocol versions */ ++#ifndef OPENSSL_NO_SSL2 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); ++#endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/2.6.6/Python-2.6.6/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.6.6/Python-2.6.6/000_patch-setup.py.diff new file mode 100644 index 0000000..322cf29 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.6/Python-2.6.6/000_patch-setup.py.diff @@ -0,0 +1,63 @@ + +# HG changeset patch +# User Barry Warsaw +# Date 1302190091 14400 +# Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa +# Parent 2e4cdaffe493e879fb5367a4aa454491de451137 +Backport for Python 2.7 of issue 11715 support for building Python on +multiarch Debian/Ubuntu. + +diff -r -u setup.py setup.py +--- setup.py.orig ++++ setup.py +@@ -345,10 +345,33 @@ class PyBuildExt(build_ext): + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ with open(tmpfile) as fp: ++ multiarch_path_component = fp.readline().strip() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. +@@ -1443,14 +1443,13 @@ + + + # Platform-specific libraries +- if platform == 'linux2': ++ if platform.startswith('linux'): + # Linux-specific modules + exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) ) + else: + missing.append('linuxaudiodev') + +- if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', +- 'freebsd7', 'freebsd8'): ++ if platform.startswith('linux') or platform.startswith('freebsd'): + exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) + else: + missing.append('ossaudiodev') diff --git a/plugins/python-build/share/python-build/patches/2.6.6/Python-2.6.6/002_readline63.patch b/plugins/python-build/share/python-build/patches/2.6.6/Python-2.6.6/002_readline63.patch new file mode 100644 index 0000000..6d0eb19 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.6/Python-2.6.6/002_readline63.patch @@ -0,0 +1,61 @@ +diff -r -u ../Python-2.7.6.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-2.7.6.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 +@@ -206,8 +206,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -750,14 +749,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -852,7 +859,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -911,12 +918,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/2.6.6/Python-2.6.6/003_tk86.patch b/plugins/python-build/share/python-build/patches/2.6.6/Python-2.6.6/003_tk86.patch new file mode 100644 index 0000000..71e20d5 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.6/Python-2.6.6/003_tk86.patch @@ -0,0 +1,12 @@ +diff -r -u ../Python-2.6.9.orig/setup.py ./setup.py +--- ../Python-2.6.9.orig/setup.py 2013-10-30 00:04:39.000000000 +0900 ++++ ./setup.py 2014-04-03 22:28:49.122061684 +0900 +@@ -1675,7 +1675,7 @@ + # The versions with dots are used on Unix, and the versions without + # dots on Windows, for detection by cygwin. + tcllib = tklib = tcl_includes = tk_includes = None +- for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2', ++ for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83', + '82', '8.1', '81', '8.0', '80']: + tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version) + tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version) diff --git a/plugins/python-build/share/python-build/patches/2.6.6/Python-2.6.6/010_ssl_no_ssl2_no_ssl3.patch b/plugins/python-build/share/python-build/patches/2.6.6/Python-2.6.6/010_ssl_no_ssl2_no_ssl3.patch new file mode 100644 index 0000000..eb02875 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.6/Python-2.6.6/010_ssl_no_ssl2_no_ssl3.patch @@ -0,0 +1,95 @@ +diff -r -u ../Python-2.6.8.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-2.6.8.orig/Lib/ssl.py 2012-04-10 15:32:06.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-18 14:46:36.487188331 +0000 +@@ -61,18 +61,24 @@ + + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import \ +- SSL_ERROR_ZERO_RETURN, \ +- SSL_ERROR_WANT_READ, \ +- SSL_ERROR_WANT_WRITE, \ +- SSL_ERROR_WANT_X509_LOOKUP, \ +- SSL_ERROR_SYSCALL, \ +- SSL_ERROR_SSL, \ +- SSL_ERROR_WANT_CONNECT, \ +- SSL_ERROR_EOF, \ +- SSL_ERROR_INVALID_ERROR_CODE ++from _ssl import RAND_status, RAND_add ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('ALERT_DESCRIPTION_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = dict([(value, name) for name, value in globals().items() if name.startswith('PROTOCOL_')]) + + from socket import socket, _fileobject, _delegate_methods + from socket import error as socket_error +@@ -382,7 +388,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodestring(d) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. +diff -r -u ../Python-2.6.8.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-2.6.8.orig/Modules/_ssl.c 2012-04-10 15:32:09.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-18 14:45:30.419597074 +0000 +@@ -62,8 +62,12 @@ + }; + + enum py_ssl_version { ++#ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, ++#endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -300,10 +304,14 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif ++#ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ ++#endif + else if (proto_version == PY_SSL_VERSION_SSL23) + self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ + PySSL_END_ALLOW_THREADS +@@ -1688,10 +1696,14 @@ + PY_SSL_CERT_REQUIRED); + + /* protocol versions */ ++#ifndef OPENSSL_NO_SSL2 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); ++#endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/2.6.7/Python-2.6.7/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.6.7/Python-2.6.7/000_patch-setup.py.diff new file mode 100644 index 0000000..322cf29 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.7/Python-2.6.7/000_patch-setup.py.diff @@ -0,0 +1,63 @@ + +# HG changeset patch +# User Barry Warsaw +# Date 1302190091 14400 +# Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa +# Parent 2e4cdaffe493e879fb5367a4aa454491de451137 +Backport for Python 2.7 of issue 11715 support for building Python on +multiarch Debian/Ubuntu. + +diff -r -u setup.py setup.py +--- setup.py.orig ++++ setup.py +@@ -345,10 +345,33 @@ class PyBuildExt(build_ext): + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ with open(tmpfile) as fp: ++ multiarch_path_component = fp.readline().strip() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. +@@ -1443,14 +1443,13 @@ + + + # Platform-specific libraries +- if platform == 'linux2': ++ if platform.startswith('linux'): + # Linux-specific modules + exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) ) + else: + missing.append('linuxaudiodev') + +- if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', +- 'freebsd7', 'freebsd8'): ++ if platform.startswith('linux') or platform.startswith('freebsd'): + exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) + else: + missing.append('ossaudiodev') diff --git a/plugins/python-build/share/python-build/patches/2.6.7/Python-2.6.7/002_readline63.patch b/plugins/python-build/share/python-build/patches/2.6.7/Python-2.6.7/002_readline63.patch new file mode 100644 index 0000000..6d0eb19 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.7/Python-2.6.7/002_readline63.patch @@ -0,0 +1,61 @@ +diff -r -u ../Python-2.7.6.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-2.7.6.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 +@@ -206,8 +206,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -750,14 +749,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -852,7 +859,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -911,12 +918,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/2.6.7/Python-2.6.7/003_tk86.patch b/plugins/python-build/share/python-build/patches/2.6.7/Python-2.6.7/003_tk86.patch new file mode 100644 index 0000000..71e20d5 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.7/Python-2.6.7/003_tk86.patch @@ -0,0 +1,12 @@ +diff -r -u ../Python-2.6.9.orig/setup.py ./setup.py +--- ../Python-2.6.9.orig/setup.py 2013-10-30 00:04:39.000000000 +0900 ++++ ./setup.py 2014-04-03 22:28:49.122061684 +0900 +@@ -1675,7 +1675,7 @@ + # The versions with dots are used on Unix, and the versions without + # dots on Windows, for detection by cygwin. + tcllib = tklib = tcl_includes = tk_includes = None +- for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2', ++ for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83', + '82', '8.1', '81', '8.0', '80']: + tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version) + tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version) diff --git a/plugins/python-build/share/python-build/patches/2.6.7/Python-2.6.7/010_ssl_no_ssl2_no_ssl3.patch b/plugins/python-build/share/python-build/patches/2.6.7/Python-2.6.7/010_ssl_no_ssl2_no_ssl3.patch new file mode 100644 index 0000000..eb02875 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.7/Python-2.6.7/010_ssl_no_ssl2_no_ssl3.patch @@ -0,0 +1,95 @@ +diff -r -u ../Python-2.6.8.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-2.6.8.orig/Lib/ssl.py 2012-04-10 15:32:06.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-18 14:46:36.487188331 +0000 +@@ -61,18 +61,24 @@ + + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import \ +- SSL_ERROR_ZERO_RETURN, \ +- SSL_ERROR_WANT_READ, \ +- SSL_ERROR_WANT_WRITE, \ +- SSL_ERROR_WANT_X509_LOOKUP, \ +- SSL_ERROR_SYSCALL, \ +- SSL_ERROR_SSL, \ +- SSL_ERROR_WANT_CONNECT, \ +- SSL_ERROR_EOF, \ +- SSL_ERROR_INVALID_ERROR_CODE ++from _ssl import RAND_status, RAND_add ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('ALERT_DESCRIPTION_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = dict([(value, name) for name, value in globals().items() if name.startswith('PROTOCOL_')]) + + from socket import socket, _fileobject, _delegate_methods + from socket import error as socket_error +@@ -382,7 +388,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodestring(d) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. +diff -r -u ../Python-2.6.8.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-2.6.8.orig/Modules/_ssl.c 2012-04-10 15:32:09.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-18 14:45:30.419597074 +0000 +@@ -62,8 +62,12 @@ + }; + + enum py_ssl_version { ++#ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, ++#endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -300,10 +304,14 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif ++#ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ ++#endif + else if (proto_version == PY_SSL_VERSION_SSL23) + self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ + PySSL_END_ALLOW_THREADS +@@ -1688,10 +1696,14 @@ + PY_SSL_CERT_REQUIRED); + + /* protocol versions */ ++#ifndef OPENSSL_NO_SSL2 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); ++#endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/2.6.8/Python-2.6.8/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.6.8/Python-2.6.8/000_patch-setup.py.diff new file mode 100644 index 0000000..322cf29 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.8/Python-2.6.8/000_patch-setup.py.diff @@ -0,0 +1,63 @@ + +# HG changeset patch +# User Barry Warsaw +# Date 1302190091 14400 +# Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa +# Parent 2e4cdaffe493e879fb5367a4aa454491de451137 +Backport for Python 2.7 of issue 11715 support for building Python on +multiarch Debian/Ubuntu. + +diff -r -u setup.py setup.py +--- setup.py.orig ++++ setup.py +@@ -345,10 +345,33 @@ class PyBuildExt(build_ext): + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ with open(tmpfile) as fp: ++ multiarch_path_component = fp.readline().strip() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. +@@ -1443,14 +1443,13 @@ + + + # Platform-specific libraries +- if platform == 'linux2': ++ if platform.startswith('linux'): + # Linux-specific modules + exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) ) + else: + missing.append('linuxaudiodev') + +- if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', +- 'freebsd7', 'freebsd8'): ++ if platform.startswith('linux') or platform.startswith('freebsd'): + exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) + else: + missing.append('ossaudiodev') diff --git a/plugins/python-build/share/python-build/patches/2.6.8/Python-2.6.8/002_readline63.patch b/plugins/python-build/share/python-build/patches/2.6.8/Python-2.6.8/002_readline63.patch new file mode 100644 index 0000000..6d0eb19 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.8/Python-2.6.8/002_readline63.patch @@ -0,0 +1,61 @@ +diff -r -u ../Python-2.7.6.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-2.7.6.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 +@@ -206,8 +206,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -750,14 +749,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -852,7 +859,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -911,12 +918,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/2.6.8/Python-2.6.8/003_tk86.patch b/plugins/python-build/share/python-build/patches/2.6.8/Python-2.6.8/003_tk86.patch new file mode 100644 index 0000000..71e20d5 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.8/Python-2.6.8/003_tk86.patch @@ -0,0 +1,12 @@ +diff -r -u ../Python-2.6.9.orig/setup.py ./setup.py +--- ../Python-2.6.9.orig/setup.py 2013-10-30 00:04:39.000000000 +0900 ++++ ./setup.py 2014-04-03 22:28:49.122061684 +0900 +@@ -1675,7 +1675,7 @@ + # The versions with dots are used on Unix, and the versions without + # dots on Windows, for detection by cygwin. + tcllib = tklib = tcl_includes = tk_includes = None +- for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2', ++ for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83', + '82', '8.1', '81', '8.0', '80']: + tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version) + tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version) diff --git a/plugins/python-build/share/python-build/patches/2.6.8/Python-2.6.8/010_ssl_no_ssl2_no_ssl3.patch b/plugins/python-build/share/python-build/patches/2.6.8/Python-2.6.8/010_ssl_no_ssl2_no_ssl3.patch new file mode 100644 index 0000000..eb02875 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.8/Python-2.6.8/010_ssl_no_ssl2_no_ssl3.patch @@ -0,0 +1,95 @@ +diff -r -u ../Python-2.6.8.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-2.6.8.orig/Lib/ssl.py 2012-04-10 15:32:06.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-18 14:46:36.487188331 +0000 +@@ -61,18 +61,24 @@ + + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import \ +- SSL_ERROR_ZERO_RETURN, \ +- SSL_ERROR_WANT_READ, \ +- SSL_ERROR_WANT_WRITE, \ +- SSL_ERROR_WANT_X509_LOOKUP, \ +- SSL_ERROR_SYSCALL, \ +- SSL_ERROR_SSL, \ +- SSL_ERROR_WANT_CONNECT, \ +- SSL_ERROR_EOF, \ +- SSL_ERROR_INVALID_ERROR_CODE ++from _ssl import RAND_status, RAND_add ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('ALERT_DESCRIPTION_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = dict([(value, name) for name, value in globals().items() if name.startswith('PROTOCOL_')]) + + from socket import socket, _fileobject, _delegate_methods + from socket import error as socket_error +@@ -382,7 +388,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodestring(d) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. +diff -r -u ../Python-2.6.8.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-2.6.8.orig/Modules/_ssl.c 2012-04-10 15:32:09.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-18 14:45:30.419597074 +0000 +@@ -62,8 +62,12 @@ + }; + + enum py_ssl_version { ++#ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, ++#endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -300,10 +304,14 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif ++#ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ ++#endif + else if (proto_version == PY_SSL_VERSION_SSL23) + self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ + PySSL_END_ALLOW_THREADS +@@ -1688,10 +1696,14 @@ + PY_SSL_CERT_REQUIRED); + + /* protocol versions */ ++#ifndef OPENSSL_NO_SSL2 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); ++#endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9/000_patch-setup.py.diff new file mode 100644 index 0000000..322cf29 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9/000_patch-setup.py.diff @@ -0,0 +1,63 @@ + +# HG changeset patch +# User Barry Warsaw +# Date 1302190091 14400 +# Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa +# Parent 2e4cdaffe493e879fb5367a4aa454491de451137 +Backport for Python 2.7 of issue 11715 support for building Python on +multiarch Debian/Ubuntu. + +diff -r -u setup.py setup.py +--- setup.py.orig ++++ setup.py +@@ -345,10 +345,33 @@ class PyBuildExt(build_ext): + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ with open(tmpfile) as fp: ++ multiarch_path_component = fp.readline().strip() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. +@@ -1443,14 +1443,13 @@ + + + # Platform-specific libraries +- if platform == 'linux2': ++ if platform.startswith('linux'): + # Linux-specific modules + exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) ) + else: + missing.append('linuxaudiodev') + +- if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', +- 'freebsd7', 'freebsd8'): ++ if platform.startswith('linux') or platform.startswith('freebsd'): + exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) + else: + missing.append('ossaudiodev') diff --git a/plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9/001_remove_systemstubs.patch b/plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9/001_remove_systemstubs.patch new file mode 100644 index 0000000..759e77d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9/001_remove_systemstubs.patch @@ -0,0 +1,12 @@ +diff -ru ../Python-2.6.9/configure ./configure +--- ../Python-2.6.9/configure 2013-10-29 17:04:39.000000000 +0200 ++++ ./configure 2014-11-14 11:33:00.000000000 +0200 +@@ -7227,7 +7227,7 @@ + #ARCH_RUN_32BIT="true" + fi + +- LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -lSystemStubs -arch_only ${MACOSX_DEFAULT_ARCH}" ++ LIBTOOL_CRUFT=$LIBTOOL_CRUFT" -lSystem -arch_only ${MACOSX_DEFAULT_ARCH}" + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -install_name $(PYTHONFRAMEWORKINSTALLDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK)' + LIBTOOL_CRUFT=$LIBTOOL_CRUFT' -compatibility_version $(VERSION) -current_version $(VERSION)';; + esac diff --git a/plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9/002_readline63.patch b/plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9/002_readline63.patch new file mode 100644 index 0000000..6d0eb19 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9/002_readline63.patch @@ -0,0 +1,61 @@ +diff -r -u ../Python-2.7.6.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-2.7.6.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 +@@ -206,8 +206,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -750,14 +749,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -852,7 +859,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -911,12 +918,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9/003_tk86.patch b/plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9/003_tk86.patch new file mode 100644 index 0000000..71e20d5 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9/003_tk86.patch @@ -0,0 +1,12 @@ +diff -r -u ../Python-2.6.9.orig/setup.py ./setup.py +--- ../Python-2.6.9.orig/setup.py 2013-10-30 00:04:39.000000000 +0900 ++++ ./setup.py 2014-04-03 22:28:49.122061684 +0900 +@@ -1675,7 +1675,7 @@ + # The versions with dots are used on Unix, and the versions without + # dots on Windows, for detection by cygwin. + tcllib = tklib = tcl_includes = tk_includes = None +- for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2', ++ for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83', + '82', '8.1', '81', '8.0', '80']: + tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version) + tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version) diff --git a/plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9/010_ssl_no_ssl2_no_ssl3.patch b/plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9/010_ssl_no_ssl2_no_ssl3.patch new file mode 100644 index 0000000..c49ee2d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.6.9/Python-2.6.9/010_ssl_no_ssl2_no_ssl3.patch @@ -0,0 +1,91 @@ +diff -r -u ../Python-2.6.9.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-2.6.9.orig/Lib/ssl.py 2013-10-29 15:04:37.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-18 14:39:22.213215077 +0000 +@@ -61,18 +61,24 @@ + + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import \ +- SSL_ERROR_ZERO_RETURN, \ +- SSL_ERROR_WANT_READ, \ +- SSL_ERROR_WANT_WRITE, \ +- SSL_ERROR_WANT_X509_LOOKUP, \ +- SSL_ERROR_SYSCALL, \ +- SSL_ERROR_SSL, \ +- SSL_ERROR_WANT_CONNECT, \ +- SSL_ERROR_EOF, \ +- SSL_ERROR_INVALID_ERROR_CODE ++from _ssl import RAND_status, RAND_add ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('ALERT_DESCRIPTION_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = dict([(value, name) for name, value in globals().items() if name.startswith('PROTOCOL_')]) + + from socket import socket, _fileobject, _delegate_methods + from socket import error as socket_error +@@ -382,7 +388,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodestring(d) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. +diff -r -u ../Python-2.6.9.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-2.6.9.orig/Modules/_ssl.c 2013-10-29 15:04:38.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-18 14:32:08.051962468 +0000 +@@ -62,8 +62,12 @@ + }; + + enum py_ssl_version { ++#ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, ++#endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -300,8 +304,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +@@ -1746,10 +1752,14 @@ + PY_SSL_CERT_REQUIRED); + + /* protocol versions */ ++#ifndef OPENSSL_NO_SSL2 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); ++#endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/2.7.0/Python-2.7/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.7.0/Python-2.7/000_patch-setup.py.diff new file mode 100644 index 0000000..bf60166 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.0/Python-2.7/000_patch-setup.py.diff @@ -0,0 +1,47 @@ + +# HG changeset patch +# User Barry Warsaw +# Date 1302190091 14400 +# Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa +# Parent 2e4cdaffe493e879fb5367a4aa454491de451137 +Backport for Python 2.7 of issue 11715 support for building Python on +multiarch Debian/Ubuntu. + +diff -r -u setup.py setup.py +--- setup.py.orig ++++ setup.py +@@ -345,10 +345,33 @@ class PyBuildExt(build_ext): + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ with open(tmpfile) as fp: ++ multiarch_path_component = fp.readline().strip() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. + diff --git a/plugins/python-build/share/python-build/patches/2.7.0/Python-2.7/002_readline63.patch b/plugins/python-build/share/python-build/patches/2.7.0/Python-2.7/002_readline63.patch new file mode 100644 index 0000000..6d0eb19 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.0/Python-2.7/002_readline63.patch @@ -0,0 +1,61 @@ +diff -r -u ../Python-2.7.6.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-2.7.6.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 +@@ -206,8 +206,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -750,14 +749,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -852,7 +859,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -911,12 +918,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/2.7.0/Python-2.7/010_ssl_no_ssl2_no_ssl3.patch b/plugins/python-build/share/python-build/patches/2.7.0/Python-2.7/010_ssl_no_ssl2_no_ssl3.patch new file mode 100644 index 0000000..dbfa9fb --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.0/Python-2.7/010_ssl_no_ssl2_no_ssl3.patch @@ -0,0 +1,100 @@ +diff -r -u ../Python-2.7.1.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-2.7.1.orig/Lib/ssl.py 2010-09-14 14:37:18.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-18 14:14:39.089679248 +0000 +@@ -62,18 +62,29 @@ + from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import \ +- SSL_ERROR_ZERO_RETURN, \ +- SSL_ERROR_WANT_READ, \ +- SSL_ERROR_WANT_WRITE, \ +- SSL_ERROR_WANT_X509_LOOKUP, \ +- SSL_ERROR_SYSCALL, \ +- SSL_ERROR_SSL, \ +- SSL_ERROR_WANT_CONNECT, \ +- SSL_ERROR_EOF, \ +- SSL_ERROR_INVALID_ERROR_CODE ++from _ssl import RAND_status, RAND_add ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('ALERT_DESCRIPTION_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} ++ ++try: ++ _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 ++except NameError: ++ _SSLv2_IF_EXISTS = None + + from socket import socket, _fileobject, _delegate_methods, error as socket_error + from socket import getnameinfo as _getnameinfo +@@ -388,7 +399,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodestring(d) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. +diff -r -u ../Python-2.7.1.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-2.7.1.orig/Modules/_ssl.c 2010-10-13 22:10:31.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-18 14:18:21.612222848 +0000 +@@ -62,8 +62,12 @@ + }; + + enum py_ssl_version { ++#ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, ++#endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -300,10 +304,14 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif ++#ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ ++#endif + else if (proto_version == PY_SSL_VERSION_SSL23) + self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ + PySSL_END_ALLOW_THREADS +@@ -1706,10 +1714,14 @@ + PY_SSL_CERT_REQUIRED); + + /* protocol versions */ ++#ifndef OPENSSL_NO_SSL2 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); ++#endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/2.7.1/Python-2.7.1/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/2.7.1/Python-2.7.1/000_patch-setup.py.diff new file mode 100644 index 0000000..bf60166 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.1/Python-2.7.1/000_patch-setup.py.diff @@ -0,0 +1,47 @@ + +# HG changeset patch +# User Barry Warsaw +# Date 1302190091 14400 +# Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa +# Parent 2e4cdaffe493e879fb5367a4aa454491de451137 +Backport for Python 2.7 of issue 11715 support for building Python on +multiarch Debian/Ubuntu. + +diff -r -u setup.py setup.py +--- setup.py.orig ++++ setup.py +@@ -345,10 +345,33 @@ class PyBuildExt(build_ext): + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ with open(tmpfile) as fp: ++ multiarch_path_component = fp.readline().strip() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. + diff --git a/plugins/python-build/share/python-build/patches/2.7.1/Python-2.7.1/002_readline63.patch b/plugins/python-build/share/python-build/patches/2.7.1/Python-2.7.1/002_readline63.patch new file mode 100644 index 0000000..6d0eb19 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.1/Python-2.7.1/002_readline63.patch @@ -0,0 +1,61 @@ +diff -r -u ../Python-2.7.6.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-2.7.6.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 +@@ -206,8 +206,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -750,14 +749,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -852,7 +859,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -911,12 +918,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/2.7.1/Python-2.7.1/010_ssl_no_ssl2_no_ssl3.patch b/plugins/python-build/share/python-build/patches/2.7.1/Python-2.7.1/010_ssl_no_ssl2_no_ssl3.patch new file mode 100644 index 0000000..dbfa9fb --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.1/Python-2.7.1/010_ssl_no_ssl2_no_ssl3.patch @@ -0,0 +1,100 @@ +diff -r -u ../Python-2.7.1.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-2.7.1.orig/Lib/ssl.py 2010-09-14 14:37:18.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-18 14:14:39.089679248 +0000 +@@ -62,18 +62,29 @@ + from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import \ +- SSL_ERROR_ZERO_RETURN, \ +- SSL_ERROR_WANT_READ, \ +- SSL_ERROR_WANT_WRITE, \ +- SSL_ERROR_WANT_X509_LOOKUP, \ +- SSL_ERROR_SYSCALL, \ +- SSL_ERROR_SSL, \ +- SSL_ERROR_WANT_CONNECT, \ +- SSL_ERROR_EOF, \ +- SSL_ERROR_INVALID_ERROR_CODE ++from _ssl import RAND_status, RAND_add ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('ALERT_DESCRIPTION_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} ++ ++try: ++ _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 ++except NameError: ++ _SSLv2_IF_EXISTS = None + + from socket import socket, _fileobject, _delegate_methods, error as socket_error + from socket import getnameinfo as _getnameinfo +@@ -388,7 +399,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodestring(d) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. +diff -r -u ../Python-2.7.1.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-2.7.1.orig/Modules/_ssl.c 2010-10-13 22:10:31.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-18 14:18:21.612222848 +0000 +@@ -62,8 +62,12 @@ + }; + + enum py_ssl_version { ++#ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, ++#endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -300,10 +304,14 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif ++#ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ ++#endif + else if (proto_version == PY_SSL_VERSION_SSL23) + self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ + PySSL_END_ALLOW_THREADS +@@ -1706,10 +1714,14 @@ + PY_SSL_CERT_REQUIRED); + + /* protocol versions */ ++#ifndef OPENSSL_NO_SSL2 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); ++#endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/2.7.10/Python-2.7.10/003_system_library_path_in_sys_path.patch b/plugins/python-build/share/python-build/patches/2.7.10/Python-2.7.10/003_system_library_path_in_sys_path.patch new file mode 100644 index 0000000..4da2c73 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.10/Python-2.7.10/003_system_library_path_in_sys_path.patch @@ -0,0 +1,13 @@ +Only in .: 003_system_library_path_in_sys_path.patch +diff -ur ../Python-2.7.10/Lib/site.py ./Lib/site.py +--- ../Python-2.7.10/Lib/site.py 2014-06-30 05:05:30.000000000 +0300 ++++ ./Lib/site.py 2014-12-12 11:42:33.000000000 +0200 +@@ -300,7 +300,7 @@ + # locations. + from sysconfig import get_config_var + framework = get_config_var("PYTHONFRAMEWORK") +- if framework: ++ if False and framework: + sitepackages.append( + os.path.join("/Library", framework, + sys.version[:3], "site-packages")) diff --git a/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0001-Detect-arm64-in-configure.patch b/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0001-Detect-arm64-in-configure.patch new file mode 100644 index 0000000..94c4b7b --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0001-Detect-arm64-in-configure.patch @@ -0,0 +1,41 @@ +From 5495fb4719fa67ea3abeda0434699c8b28c77bb3 Mon Sep 17 00:00:00 2001 +From: Takumi Sueda +Date: Sat, 11 Sep 2021 16:50:14 +0900 +Subject: [PATCH 1/7] Detect arm64 in configure + +--- + configure | 3 +++ + configure.ac | 3 +++ + 2 files changed, 6 insertions(+) + +diff --git a/configure b/configure +index 63d675312d..c40ec120de 100755 +--- a/configure ++++ b/configure +@@ -8474,6 +8474,9 @@ fi + ppc) + MACOSX_DEFAULT_ARCH="ppc64" + ;; ++ arm64) ++ MACOSX_DEFAULT_ARCH="arm64" ++ ;; + *) + as_fn_error $? "Unexpected output of 'arch' on OSX" "$LINENO" 5 + ;; +diff --git a/configure.ac b/configure.ac +index efe6922b5d..df05bee87b 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -2066,6 +2066,9 @@ case $ac_sys_system/$ac_sys_release in + ppc) + MACOSX_DEFAULT_ARCH="ppc64" + ;; ++ arm64) ++ MACOSX_DEFAULT_ARCH="arm64" ++ ;; + *) + AC_MSG_ERROR([Unexpected output of 'arch' on OSX]) + ;; +-- +2.30.1 + diff --git a/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0002-Fix-macOS-_tkinter-use-of-Tck-Tk-in-Library-Framewor.patch b/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0002-Fix-macOS-_tkinter-use-of-Tck-Tk-in-Library-Framewor.patch new file mode 100644 index 0000000..a2a33c6 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0002-Fix-macOS-_tkinter-use-of-Tck-Tk-in-Library-Framewor.patch @@ -0,0 +1,237 @@ +From f17b9e30bd295b1eec68105e3f04568477ce6286 Mon Sep 17 00:00:00 2001 +From: Takumi Sueda +Date: Sat, 11 Sep 2021 17:14:34 +0900 +Subject: [PATCH 2/7] Fix macOS _tkinter use of Tck/Tk in /Library/Framework + +Modified and imported from https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch +--- + setup.py | 148 +++++++++++++++++++++++++++++++++++++++---------------- + 1 file changed, 106 insertions(+), 42 deletions(-) + +diff --git a/setup.py b/setup.py +index f764223d06..da1d34efaf 100644 +--- a/setup.py ++++ b/setup.py +@@ -50,6 +50,7 @@ def add_dir_to_list(dirlist, dir): + dirlist.insert(0, dir) + + MACOS_SDK_ROOT = None ++MACOS_SDK_SPECIFIED = None + + def macosx_sdk_root(): + """Return the directory of the current macOS SDK. +@@ -61,8 +62,9 @@ def macosx_sdk_root(): + (The SDK may be supplied via Xcode or via the Command Line Tools). + The SDK paths used by Apple-supplied tool chains depend on the + setting of various variables; see the xcrun man page for more info. ++ Also sets MACOS_SDK_SPECIFIED for use by macosx_sdk_specified(). + """ +- global MACOS_SDK_ROOT ++ global MACOS_SDK_ROOT, MACOS_SDK_SPECIFIED + + # If already called, return cached result. + if MACOS_SDK_ROOT: +@@ -72,8 +74,10 @@ def macosx_sdk_root(): + m = re.search(r'-isysroot\s+(\S+)', cflags) + if m is not None: + MACOS_SDK_ROOT = m.group(1) ++ MACOS_SDK_SPECIFIED = MACOS_SDK_ROOT != '/' + else: + MACOS_SDK_ROOT = '/' ++ MACOS_SDK_SPECIFIED = False + cc = sysconfig.get_config_var('CC') + tmpfile = '/tmp/setup_sdk_root.%d' % os.getpid() + try: +@@ -101,6 +105,27 @@ def macosx_sdk_root(): + + return MACOS_SDK_ROOT + ++def macosx_sdk_specified(): ++ """Returns true if an SDK was explicitly configured. ++ ++ True if an SDK was selected at configure time, either by specifying ++ --enable-universalsdk=(something other than no or /) or by adding a ++ -isysroot option to CFLAGS. In some cases, like when making ++ decisions about macOS Tk framework paths, we need to be able to ++ know whether the user explicitly asked to build with an SDK versus ++ the implicit use of an SDK when header files are no longer ++ installed on a running system by the Command Line Tools. ++ """ ++ global MACOS_SDK_SPECIFIED ++ ++ # If already called, return cached result. ++ if MACOS_SDK_SPECIFIED: ++ return MACOS_SDK_SPECIFIED ++ ++ # Find the sdk root and set MACOS_SDK_SPECIFIED ++ macosx_sdk_root() ++ return MACOS_SDK_SPECIFIED ++ + def is_macosx_sdk_path(path): + """ + Returns True if 'path' can be located in an OSX SDK +@@ -1834,31 +1859,72 @@ class PyBuildExt(build_ext): + return 1 + + def detect_tkinter_darwin(self, inc_dirs, lib_dirs): +- # The _tkinter module, using frameworks. Since frameworks are quite +- # different the UNIX search logic is not sharable. +- from os.path import join, exists +- framework_dirs = [ +- '/Library/Frameworks', +- '/System/Library/Frameworks/', +- join(os.getenv('HOME'), '/Library/Frameworks') +- ] ++ # Build default _tkinter on macOS using Tcl and Tk frameworks. ++ # ++ # The macOS native Tk (AKA Aqua Tk) and Tcl are most commonly ++ # built and installed as macOS framework bundles. However, ++ # for several reasons, we cannot take full advantage of the ++ # Apple-supplied compiler chain's -framework options here. ++ # Instead, we need to find and pass to the compiler the ++ # absolute paths of the Tcl and Tk headers files we want to use ++ # and the absolute path to the directory containing the Tcl ++ # and Tk frameworks for linking. ++ # ++ # We want to handle here two common use cases on macOS: ++ # 1. Build and link with system-wide third-party or user-built ++ # Tcl and Tk frameworks installed in /Library/Frameworks. ++ # 2. Build and link using a user-specified macOS SDK so that the ++ # built Python can be exported to other systems. In this case, ++ # search only the SDK's /Library/Frameworks (normally empty) ++ # and /System/Library/Frameworks. ++ # ++ # Any other use case should be able to be handled explicitly by ++ # using the options described above in detect_tkinter_explicitly(). ++ # In particular it would be good to handle here the case where ++ # you want to build and link with a framework build of Tcl and Tk ++ # that is not in /Library/Frameworks, say, in your private ++ # $HOME/Library/Frameworks directory or elsewhere. It turns ++ # out to be difficult to make that work automtically here ++ # without bringing into play more tools and magic. That case ++ # can be hamdled using a recipe with the right arguments ++ # to detect_tkinter_explicitly(). ++ # ++ # Note also that the fallback case here is to try to use the ++ # Apple-supplied Tcl and Tk frameworks in /System/Library but ++ # be forewarned that they are deprecated by Apple and typically ++ # out-of-date and buggy; their use should be avoided if at ++ # all possible by installing a newer version of Tcl and Tk in ++ # /Library/Frameworks before bwfore building Python without ++ # an explicit SDK or by configuring build arguments explicitly. + +- sysroot = macosx_sdk_root() ++ from os.path import join, exists ++ sysroot = macosx_sdk_root() # path to the SDK or '/' ++ ++ if macosx_sdk_specified(): ++ # Use case #2: an SDK other than '/' was specified. ++ # Only search there. ++ framework_dirs = [ ++ join(sysroot, 'Library', 'Frameworks'), ++ join(sysroot, 'System', 'Library', 'Frameworks'), ++ ] ++ else: ++ # Use case #1: no explicit SDK selected. ++ # Search the local system-wide /Library/Frameworks, ++ # not the one in the default SDK, othewise fall back to ++ # /System/Library/Frameworks whose header files may be in ++ # the default SDK or, on older systems, actually installed. ++ framework_dirs = [ ++ join('/', 'Library', 'Frameworks'), ++ join(sysroot, 'System', 'Library', 'Frameworks'), ++ ] + +- # Find the directory that contains the Tcl.framework and Tk.framework +- # bundles. +- # XXX distutils should support -F! ++ # Find the directory that contains the Tcl.framework and ++ # Tk.framework bundles. + for F in framework_dirs: + # both Tcl.framework and Tk.framework should be present +- +- + for fw in 'Tcl', 'Tk': +- if is_macosx_sdk_path(F): +- if not exists(join(sysroot, F[1:], fw + '.framework')): +- break +- else: +- if not exists(join(F, fw + '.framework')): +- break ++ if not exists(join(F, fw + '.framework')): ++ break + else: + # ok, F is now directory with both frameworks. Continure + # building +@@ -1868,32 +1934,20 @@ class PyBuildExt(build_ext): + # will now resume. + return 0 + +- # For 8.4a2, we must add -I options that point inside the Tcl and Tk +- # frameworks. In later release we should hopefully be able to pass +- # the -F option to gcc, which specifies a framework lookup path. +- # + include_dirs = [ + join(F, fw + '.framework', H) + for fw in 'Tcl', 'Tk' +- for H in 'Headers', 'Versions/Current/PrivateHeaders' ++ for H in ('Headers',) + ] + +- # For 8.4a2, the X11 headers are not included. Rather than include a +- # complicated search, this is a hard-coded path. It could bail out +- # if X11 libs are not found... +- include_dirs.append('/usr/X11R6/include') +- frameworks = ['-framework', 'Tcl', '-framework', 'Tk'] ++ # Add the base framework directory as well ++ compile_args = ['-F', F] + +- # All existing framework builds of Tcl/Tk don't support 64-bit +- # architectures. ++ # Do not build tkinter for archs that this Tk was not built with. + cflags = sysconfig.get_config_vars('CFLAGS')[0] + archs = re.findall('-arch\s+(\w+)', cflags) + +- if is_macosx_sdk_path(F): +- fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(os.path.join(sysroot, F[1:]),)) +- else: +- fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(F,)) +- ++ fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(F,)) + detected_archs = [] + for ln in fp: + a = ln.split()[-1] +@@ -1901,16 +1955,26 @@ class PyBuildExt(build_ext): + detected_archs.append(ln.split()[-1]) + fp.close() + ++ arch_args = [] + for a in detected_archs: +- frameworks.append('-arch') +- frameworks.append(a) ++ arch_args.append('-arch') ++ arch_args.append(a) ++ ++ compile_args += arch_args ++ link_args = [','.join(['-Wl', '-F', F, '-framework', 'Tcl', '-framework', 'Tk'])] + arch_args ++ ++ # The X11/xlib.h file bundled in the Tk sources can cause function ++ # prototype warnings from the compiler. Since we cannot easily fix ++ # that, suppress the warnings here instead. ++ if '-Wstrict-prototypes' in cflags.split(): ++ compile_args.append('-Wno-strict-prototypes') + + ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'], + define_macros=[('WITH_APPINIT', 1)], + include_dirs = include_dirs, + libraries = [], +- extra_compile_args = frameworks[2:], +- extra_link_args = frameworks, ++ extra_compile_args = compile_args, ++ extra_link_args = link_args, + ) + self.extensions.append(ext) + return 1 +-- +2.30.1 + diff --git a/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0003-Support-arm64-in-Mac-Tools-pythonw.patch b/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0003-Support-arm64-in-Mac-Tools-pythonw.patch new file mode 100644 index 0000000..f2ca621 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0003-Support-arm64-in-Mac-Tools-pythonw.patch @@ -0,0 +1,34 @@ +From d93a26fee21a5f91c51d8cb14ecaf29122f1b222 Mon Sep 17 00:00:00 2001 +From: Takumi Sueda +Date: Sat, 11 Sep 2021 17:25:00 +0900 +Subject: [PATCH 3/7] Support "arm64" in Mac/Tools/pythonw + +Imported from: https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch +--- + Mac/Tools/pythonw.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/Mac/Tools/pythonw.c b/Mac/Tools/pythonw.c +index 76734c1063..ebe5e8d975 100644 +--- a/Mac/Tools/pythonw.c ++++ b/Mac/Tools/pythonw.c +@@ -116,10 +116,16 @@ setup_spawnattr(posix_spawnattr_t* spawnattr) + + #elif defined(__ppc__) + cpu_types[0] = CPU_TYPE_POWERPC; ++ + #elif defined(__i386__) + cpu_types[0] = CPU_TYPE_X86; ++ ++#elif defined(__arm64__) ++ cpu_types[0] = CPU_TYPE_ARM64; ++ + #else + # error "Unknown CPU" ++ + #endif + + if (posix_spawnattr_setbinpref_np(spawnattr, count, +-- +2.30.1 + diff --git a/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0004-Use-system-libffi-for-Mac-OS-10.15-and-up.patch b/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0004-Use-system-libffi-for-Mac-OS-10.15-and-up.patch new file mode 100644 index 0000000..68c7fd4 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0004-Use-system-libffi-for-Mac-OS-10.15-and-up.patch @@ -0,0 +1,85 @@ +From a1b08c7de72c27d80a86b92c263d1f5b351e581b Mon Sep 17 00:00:00 2001 +From: Takumi Sueda +Date: Sat, 11 Sep 2021 18:07:48 +0900 +Subject: [PATCH 4/7] Use system libffi for Mac OS 10.15 and up + +Modified and imported from: https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch +--- + setup.py | 37 ++++++++++++++++++++++++++++--------- + 1 file changed, 28 insertions(+), 9 deletions(-) + +diff --git a/setup.py b/setup.py +index da1d34efaf..c92d0552e3 100644 +--- a/setup.py ++++ b/setup.py +@@ -126,6 +126,13 @@ def macosx_sdk_specified(): + macosx_sdk_root() + return MACOS_SDK_SPECIFIED + ++def is_macosx_at_least(vers): ++ if host_platform == 'darwin': ++ dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') ++ if dep_target: ++ return tuple(map(int, str(dep_target).split('.'))) >= vers ++ return False ++ + def is_macosx_sdk_path(path): + """ + Returns True if 'path' can be located in an OSX SDK +@@ -2180,7 +2187,11 @@ class PyBuildExt(build_ext): + return True + + def detect_ctypes(self, inc_dirs, lib_dirs): +- self.use_system_libffi = False ++ if not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and is_macosx_at_least((10,15)): ++ self.use_system_libffi = True ++ else: ++ self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS") ++ + include_dirs = [] + extra_compile_args = [] + extra_link_args = [] +@@ -2224,15 +2235,24 @@ class PyBuildExt(build_ext): + sources=['_ctypes/_ctypes_test.c']) + self.extensions.extend([ext, ext_test]) + +- if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"): +- return ++ ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] ++ ffi_lib = None + ++ #inc_dirs = self.inc_dirs.copy() ++ inc_dirs = self.compiler.include_dirs[:] + if host_platform == 'darwin': +- # OS X 10.5 comes with libffi.dylib; the include files are +- # in /usr/include/ffi +- inc_dirs.append('/usr/include/ffi') ++ if not self.use_system_libffi: ++ return ++ ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi") ++ if os.path.exists(ffi_in_sdk): ++ ffi_inc = [ffi_in_sdk] ++ ffi_lib = 'ffi' ++ sources.remove('_ctypes/malloc_closure.c') ++ else: ++ # OS X 10.5 comes with libffi.dylib; the include files are ++ # in /usr/include/ffi ++ inc_dirs.append('/usr/include/ffi') + +- ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] + if not ffi_inc or ffi_inc[0] == '': + ffi_inc = find_file('ffi.h', [], inc_dirs) + if ffi_inc is not None: +@@ -2247,8 +2267,7 @@ class PyBuildExt(build_ext): + ffi_inc = None + print('Header file {} does not define LIBFFI_H or ' + 'ffi_wrapper_h'.format(ffi_h)) +- ffi_lib = None +- if ffi_inc is not None: ++ if ffi_lib is None and ffi_inc is not None: + for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'): + if (self.compiler.find_library_file(lib_dirs, lib_name)): + ffi_lib = lib_name +-- +2.30.1 + diff --git a/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0005-ctypes-use-the-correct-ABI-for-variadic-functions.patch b/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0005-ctypes-use-the-correct-ABI-for-variadic-functions.patch new file mode 100644 index 0000000..48ce247 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0005-ctypes-use-the-correct-ABI-for-variadic-functions.patch @@ -0,0 +1,221 @@ +From 4394ec26842b04335b30b9a0595fcc8591c68496 Mon Sep 17 00:00:00 2001 +From: Takumi Sueda +Date: Sat, 11 Sep 2021 18:59:44 +0900 +Subject: [PATCH 5/7] ctypes: use the correct ABI for variadic functions + +Modified and imported from https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch +--- + Doc/library/ctypes.rst | 6 +++++ + Lib/test/test_str.py | 2 ++ + Lib/test/test_unicode.py | 3 +++ + Modules/_ctypes/_ctypes.c | 31 +++++++++++++++++++++++ + Modules/_ctypes/callproc.c | 51 +++++++++++++++++++++++++++++--------- + Modules/_ctypes/ctypes.h | 1 + + 6 files changed, 82 insertions(+), 12 deletions(-) + +diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst +index 6a5299145f..ec97da607f 100644 +--- a/Doc/library/ctypes.rst ++++ b/Doc/library/ctypes.rst +@@ -1584,6 +1584,12 @@ They are instances of a private class: + value usable as argument (integer, string, ctypes instance). This allows + defining adapters that can adapt custom objects as function parameters. + ++ .. attribute:: variadic ++ ++ Assign a boolean to specify that the function takes a variable number of ++ arguments. This does not matter on most platforms, but for Apple arm64 ++ platforms variadic functions have a different calling convention than ++ normal functions. + + .. attribute:: errcheck + +diff --git a/Lib/test/test_str.py b/Lib/test/test_str.py +index 73ed542a51..131f6d13e0 100644 +--- a/Lib/test/test_str.py ++++ b/Lib/test/test_str.py +@@ -489,6 +489,8 @@ class CAPITest(unittest.TestCase): + c_char_p) + + PyString_FromFormat = pythonapi.PyString_FromFormat ++ PyString_FromFormat.variadic = True ++ PyString_FromFormat.argtypes = (c_char_p,) + PyString_FromFormat.restype = py_object + + # basic tests +diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py +index 92476f68a5..23e9e643e0 100644 +--- a/Lib/test/test_unicode.py ++++ b/Lib/test/test_unicode.py +@@ -1676,6 +1676,7 @@ class CAPITest(unittest.TestCase): + def test_from_format(self): + test_support.import_module('ctypes') + from ctypes import ( ++ c_char_p, + pythonapi, py_object, sizeof, + c_int, c_long, c_longlong, c_ssize_t, + c_uint, c_ulong, c_ulonglong, c_size_t, c_void_p) +@@ -1684,6 +1685,8 @@ class CAPITest(unittest.TestCase): + else: + name = "PyUnicodeUCS4_FromFormat" + _PyUnicode_FromFormat = getattr(pythonapi, name) ++ _PyUnicode_FromFormat.argtypes = (c_char_p,) ++ _PyUnicode_FromFormat.variadic = True + _PyUnicode_FromFormat.restype = py_object + + def PyUnicode_FromFormat(format, *args): +diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c +index bef251ef04..d03b98d09c 100644 +--- a/Modules/_ctypes/_ctypes.c ++++ b/Modules/_ctypes/_ctypes.c +@@ -3253,6 +3253,34 @@ PyCFuncPtr_get_restype(PyCFuncPtrObject *self) + } + } + ++static int ++PyCFuncPtr_set_variadic(PyCFuncPtrObject *self, PyObject *ob) ++{ ++ StgDictObject *dict = PyObject_stgdict((PyObject *)self); ++ assert(dict); ++ int r = PyObject_IsTrue(ob); ++ if (r == 1) { ++ dict->flags |= FUNCFLAG_VARIADIC; ++ return 0; ++ } else if (r == 0) { ++ dict->flags &= ~FUNCFLAG_VARIADIC; ++ return 0; ++ } else { ++ return -1; ++ } ++} ++ ++static PyObject * ++PyCFuncPtr_get_variadic(PyCFuncPtrObject *self) ++{ ++ StgDictObject *dict = PyObject_stgdict((PyObject *)self); ++ assert(dict); /* Cannot be NULL for PyCFuncPtrObject instances */ ++ if (dict->flags & FUNCFLAG_VARIADIC) ++ Py_RETURN_TRUE; ++ else ++ Py_RETURN_FALSE; ++} ++ + static int + PyCFuncPtr_set_argtypes(PyCFuncPtrObject *self, PyObject *ob) + { +@@ -3299,6 +3327,8 @@ static PyGetSetDef PyCFuncPtr_getsets[] = { + { "argtypes", (getter)PyCFuncPtr_get_argtypes, + (setter)PyCFuncPtr_set_argtypes, + "specify the argument types", NULL }, ++ { "variadic", (getter)PyCFuncPtr_get_variadic, (setter)PyCFuncPtr_set_variadic, ++ "specify if function takes variable number of arguments", NULL }, + { NULL, NULL } + }; + +@@ -5838,6 +5868,7 @@ init_ctypes(void) + PyModule_AddObject(m, "FUNCFLAG_USE_ERRNO", PyInt_FromLong(FUNCFLAG_USE_ERRNO)); + PyModule_AddObject(m, "FUNCFLAG_USE_LASTERROR", PyInt_FromLong(FUNCFLAG_USE_LASTERROR)); + PyModule_AddObject(m, "FUNCFLAG_PYTHONAPI", PyInt_FromLong(FUNCFLAG_PYTHONAPI)); ++ PyModule_AddObject(m, "FUNCFLAG_VARIADIC", PyInt_FromLong(FUNCFLAG_VARIADIC)); + PyModule_AddStringConstant(m, "__version__", "1.1.0"); + + PyModule_AddObject(m, "_memmove_addr", PyLong_FromVoidPtr(memmove)); +diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c +index 066fefc0cc..39a539db47 100644 +--- a/Modules/_ctypes/callproc.c ++++ b/Modules/_ctypes/callproc.c +@@ -88,6 +88,9 @@ + #define DONT_USE_SEH + #endif + ++#if defined(__APPLE__) && __arm64__ ++#define HAVE_FFI_PREP_CIF_VAR 1 ++#endif + + #define CTYPES_CAPSULE_ERROROBJ "_ctypes/callproc.c error object" + CTYPES_CAPSULE_INSTANTIATE_DESTRUCTOR(CTYPES_CAPSULE_ERROROBJ) +@@ -773,7 +776,8 @@ static int _call_function_pointer(int flags, + ffi_type **atypes, + ffi_type *restype, + void *resmem, +- int argcount) ++ int argcount, ++ int argtypecount) + { + #ifdef WITH_THREAD + PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */ +@@ -801,15 +805,39 @@ static int _call_function_pointer(int flags, + if ((flags & FUNCFLAG_CDECL) == 0) + cc = FFI_STDCALL; + #endif +- if (FFI_OK != ffi_prep_cif(&cif, +- cc, +- argcount, +- restype, +- atypes)) { +- PyErr_SetString(PyExc_RuntimeError, +- "ffi_prep_cif failed"); +- return -1; ++ ++#if HAVE_FFI_PREP_CIF_VAR ++ /* Everyone SHOULD set f.variadic=True on variadic function pointers, but ++ * lots of existing code will not. If there's at least one arg and more ++ * args are passed than are defined in the prototype, then it must be a ++ * variadic function. */ ++ if ((flags & FUNCFLAG_VARIADIC) || ++ (argtypecount != 0 && argcount > argtypecount)) ++ { ++ if (FFI_OK != ffi_prep_cif_var(&cif, ++ cc, ++ argtypecount, ++ argcount, ++ restype, ++ atypes)) { ++ PyErr_SetString(PyExc_RuntimeError, ++ "ffi_prep_cif_var failed"); ++ return -1; ++ } ++ } else { ++#endif ++ if (FFI_OK != ffi_prep_cif(&cif, ++ cc, ++ argcount, ++ restype, ++ atypes)) { ++ PyErr_SetString(PyExc_RuntimeError, ++ "ffi_prep_cif failed"); ++ return -1; ++ } ++#if HAVE_FFI_PREP_CIF_VAR + } ++#endif + + if (flags & (FUNCFLAG_USE_ERRNO | FUNCFLAG_USE_LASTERROR)) { + error_object = _ctypes_get_errobj(&space); +@@ -1181,9 +1209,8 @@ PyObject *_ctypes_callproc(PPROC pProc, + + if (-1 == _call_function_pointer(flags, pProc, avalues, atypes, + rtype, resbuf, +- Py_SAFE_DOWNCAST(argcount, +- Py_ssize_t, +- int))) ++ Py_SAFE_DOWNCAST(argcount, Py_ssize_t, int), ++ Py_SAFE_DOWNCAST(argtype_count, Py_ssize_t, int))) + goto cleanup; + + #ifdef WORDS_BIGENDIAN +diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h +index 12b56c4342..8aec3d1ade 100644 +--- a/Modules/_ctypes/ctypes.h ++++ b/Modules/_ctypes/ctypes.h +@@ -325,6 +325,7 @@ PyObject *_ctypes_callproc(PPROC pProc, + #define FUNCFLAG_PYTHONAPI 0x4 + #define FUNCFLAG_USE_ERRNO 0x8 + #define FUNCFLAG_USE_LASTERROR 0x10 ++#define FUNCFLAG_VARIADIC 0x20 + + #define TYPEFLAG_ISPOINTER 0x100 + #define TYPEFLAG_HASPOINTER 0x200 +-- +2.30.1 + diff --git a/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0006-ctypes-probe-libffi-for-ffi_closure_alloc-and-ffi_pr.patch b/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0006-ctypes-probe-libffi-for-ffi_closure_alloc-and-ffi_pr.patch new file mode 100644 index 0000000..8e94a94 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0006-ctypes-probe-libffi-for-ffi_closure_alloc-and-ffi_pr.patch @@ -0,0 +1,108 @@ +From 43819cd35cddd189cbe513032e76f1c1a6ec6d8c Mon Sep 17 00:00:00 2001 +From: Takumi Sueda +Date: Sat, 11 Sep 2021 19:14:50 +0900 +Subject: [PATCH 6/7] ctypes: probe libffi for ffi_closure_alloc and + ffi_prep_cif_var + +Modified and imported from https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch +--- + Modules/_ctypes/callproc.c | 4 ---- + setup.py | 34 +++++++++++++++++++++++++--------- + 2 files changed, 25 insertions(+), 13 deletions(-) + +diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c +index 39a539db47..5273e8d246 100644 +--- a/Modules/_ctypes/callproc.c ++++ b/Modules/_ctypes/callproc.c +@@ -88,10 +88,6 @@ + #define DONT_USE_SEH + #endif + +-#if defined(__APPLE__) && __arm64__ +-#define HAVE_FFI_PREP_CIF_VAR 1 +-#endif +- + #define CTYPES_CAPSULE_ERROROBJ "_ctypes/callproc.c error object" + CTYPES_CAPSULE_INSTANTIATE_DESTRUCTOR(CTYPES_CAPSULE_ERROROBJ) + +diff --git a/setup.py b/setup.py +index c92d0552e3..beaf60f3e5 100644 +--- a/setup.py ++++ b/setup.py +@@ -141,6 +141,13 @@ def is_macosx_sdk_path(path): + or path.startswith('/System/') + or path.startswith('/Library/') ) + ++def grep_headers_for(function, headers): ++ for header in headers: ++ with open(header, 'r') as f: ++ if function in f.read(): ++ return True ++ return False ++ + def find_file(filename, std_dirs, paths): + """Searches for the directory where a given file is located, + and returns a possibly-empty list of additional directories, or None +@@ -2235,7 +2242,7 @@ class PyBuildExt(build_ext): + sources=['_ctypes/_ctypes_test.c']) + self.extensions.extend([ext, ext_test]) + +- ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] ++ ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR") + ffi_lib = None + + #inc_dirs = self.inc_dirs.copy() +@@ -2245,18 +2252,19 @@ class PyBuildExt(build_ext): + return + ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi") + if os.path.exists(ffi_in_sdk): +- ffi_inc = [ffi_in_sdk] ++ ffi_inc = ffi_in_sdk + ffi_lib = 'ffi' +- sources.remove('_ctypes/malloc_closure.c') + else: + # OS X 10.5 comes with libffi.dylib; the include files are + # in /usr/include/ffi + inc_dirs.append('/usr/include/ffi') + +- if not ffi_inc or ffi_inc[0] == '': +- ffi_inc = find_file('ffi.h', [], inc_dirs) +- if ffi_inc is not None: +- ffi_h = ffi_inc[0] + '/ffi.h' ++ if not ffi_inc: ++ found = find_file('ffi.h', [], inc_dirs) ++ if found: ++ ffi_inc = found[0] ++ if ffi_inc: ++ ffi_h = ffi_inc + '/ffi.h' + with open(ffi_h) as f: + for line in f: + line = line.strip() +@@ -2267,14 +2275,22 @@ class PyBuildExt(build_ext): + ffi_inc = None + print('Header file {} does not define LIBFFI_H or ' + 'ffi_wrapper_h'.format(ffi_h)) +- if ffi_lib is None and ffi_inc is not None: ++ if ffi_lib is None and ffi_inc: + for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'): + if (self.compiler.find_library_file(lib_dirs, lib_name)): + ffi_lib = lib_name + break + + if ffi_inc and ffi_lib: +- ext.include_dirs.extend(ffi_inc) ++ ffi_headers = glob(os.path.join(ffi_inc, '*.h')) ++ if grep_headers_for('ffi_closure_alloc', ffi_headers): ++ try: ++ sources.remove('_ctypes/malloc_closure.c') ++ except ValueError: ++ pass ++ if grep_headers_for('ffi_prep_cif_var', ffi_headers): ++ ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1") ++ ext.include_dirs.append(ffi_inc) + ext.libraries.append(ffi_lib) + self.use_system_libffi = True + +-- +2.30.1 + diff --git a/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0007-Remove-QuickTime-from-link-args.patch b/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0007-Remove-QuickTime-from-link-args.patch new file mode 100644 index 0000000..ffe9106 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.18/Python-2.7.18/0007-Remove-QuickTime-from-link-args.patch @@ -0,0 +1,40 @@ +From 41ee254166bb690feb665991fc2442e335631314 Mon Sep 17 00:00:00 2001 +From: Takumi Sueda +Date: Sat, 11 Sep 2021 19:20:30 +0900 +Subject: [PATCH 7/7] Remove QuickTime from link args + +--- + Mac/Modules/qt/setup.py | 2 +- + setup.py | 3 +-- + 2 files changed, 2 insertions(+), 3 deletions(-) + +diff --git a/Mac/Modules/qt/setup.py b/Mac/Modules/qt/setup.py +index 8442011ab9..4b5bc2bc20 100644 +--- a/Mac/Modules/qt/setup.py ++++ b/Mac/Modules/qt/setup.py +@@ -6,7 +6,7 @@ from distutils.core import Extension, setup + setup(name="QuickTime", version="0.2", + ext_modules=[ + Extension('QuickTime._Qt', ['_Qtmodule.c'], +- extra_link_args=['-framework', 'Carbon', '-framework', 'QuickTime']) ++ extra_link_args=['-framework', 'Carbon']) + ], + py_modules=['QuickTime.Qt', 'QuickTime.QuickTime'], + package_dir={'QuickTime':'../../../Lib/plat-mac/Carbon'} +diff --git a/setup.py b/setup.py +index beaf60f3e5..ff2298af91 100644 +--- a/setup.py ++++ b/setup.py +@@ -1819,8 +1819,7 @@ class PyBuildExt(build_ext): + + exts.append( Extension('_Qt', ['qt/_Qtmodule.c'], + extra_compile_args=carbon_extra_compile_args, +- extra_link_args=['-framework', 'QuickTime', +- '-framework', 'Carbon']) ) ++ extra_link_args=['-framework', 'Carbon']) ) + + + self.extensions.extend(exts) +-- +2.30.1 + diff --git a/plugins/python-build/share/python-build/patches/2.7.2/Python-2.7.2/002_readline63.patch b/plugins/python-build/share/python-build/patches/2.7.2/Python-2.7.2/002_readline63.patch new file mode 100644 index 0000000..6d0eb19 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.2/Python-2.7.2/002_readline63.patch @@ -0,0 +1,61 @@ +diff -r -u ../Python-2.7.6.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-2.7.6.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 +@@ -206,8 +206,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -750,14 +749,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -852,7 +859,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -911,12 +918,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/2.7.2/Python-2.7.2/003_system_library_path_in_sys_path.patch b/plugins/python-build/share/python-build/patches/2.7.2/Python-2.7.2/003_system_library_path_in_sys_path.patch new file mode 100644 index 0000000..a9587e5 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.2/Python-2.7.2/003_system_library_path_in_sys_path.patch @@ -0,0 +1,13 @@ +Only in .: 003_system_library_path_in_sys_path.patch +diff -ur ../Python-2.7.2/Lib/site.py ./Lib/site.py +--- ../Python-2.7.2/Lib/site.py 2014-12-12 10:59:47.000000000 +0200 ++++ ./Lib/site.py 2014-12-12 11:24:28.000000000 +0200 +@@ -312,7 +312,7 @@ + # locations. + from sysconfig import get_config_var + framework = get_config_var("PYTHONFRAMEWORK") +- if framework and "/%s.framework/"%(framework,) in prefix: ++ if False and framework and "/%s.framework/"%(framework,) in prefix: + sitepackages.append( + os.path.join("/Library", framework, + sys.version[:3], "site-packages")) diff --git a/plugins/python-build/share/python-build/patches/2.7.2/Python-2.7.2/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/2.7.2/Python-2.7.2/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..028cfd4 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.2/Python-2.7.2/010_ssl_no_ssl3.patch @@ -0,0 +1,98 @@ +diff -r -u ../Python-2.7.2.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-2.7.2.orig/Lib/ssl.py 2011-06-11 15:46:25.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-18 13:55:37.444270735 +0000 +@@ -62,29 +62,29 @@ + from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import \ +- SSL_ERROR_ZERO_RETURN, \ +- SSL_ERROR_WANT_READ, \ +- SSL_ERROR_WANT_WRITE, \ +- SSL_ERROR_WANT_X509_LOOKUP, \ +- SSL_ERROR_SYSCALL, \ +- SSL_ERROR_SSL, \ +- SSL_ERROR_WANT_CONNECT, \ +- SSL_ERROR_EOF, \ +- SSL_ERROR_INVALID_ERROR_CODE +-from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++from _ssl import RAND_status, RAND_add + try: +- from _ssl import PROTOCOL_SSLv2 ++ from _ssl import RAND_egd + except ImportError: ++ # LibreSSL does not provide RAND_egd + pass +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('ALERT_DESCRIPTION_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} ++ ++try: ++ _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 ++except NameError: ++ _SSLv2_IF_EXISTS = None + + from socket import socket, _fileobject, _delegate_methods, error as socket_error + from socket import getnameinfo as _getnameinfo +@@ -416,7 +416,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodestring(d) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. +diff -r -u ../Python-2.7.2.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-2.7.2.orig/Modules/_ssl.c 2011-06-11 15:46:27.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-18 13:49:22.254728756 +0000 +@@ -65,7 +65,9 @@ + #ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, + #endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3=1, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -302,8 +304,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +@@ -1716,8 +1720,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", +Only in ./Modules: _ssl.c.orig diff --git a/plugins/python-build/share/python-build/patches/2.7.3/Python-2.7.3/002_readline63.patch b/plugins/python-build/share/python-build/patches/2.7.3/Python-2.7.3/002_readline63.patch new file mode 100644 index 0000000..6d0eb19 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.3/Python-2.7.3/002_readline63.patch @@ -0,0 +1,61 @@ +diff -r -u ../Python-2.7.6.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-2.7.6.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 +@@ -206,8 +206,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -750,14 +749,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -852,7 +859,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -911,12 +918,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/2.7.3/Python-2.7.3/003_system_library_path_in_sys_path.patch b/plugins/python-build/share/python-build/patches/2.7.3/Python-2.7.3/003_system_library_path_in_sys_path.patch new file mode 100644 index 0000000..e46f772 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.3/Python-2.7.3/003_system_library_path_in_sys_path.patch @@ -0,0 +1,13 @@ +Only in .: 003_system_library_path_in_sys_path.patch +diff -ur ../Python-2.7.3/Lib/site.py ./Lib/site.py +--- ../Python-2.7.3/Lib/site.py 2012-04-10 02:07:31.000000000 +0300 ++++ ./Lib/site.py 2014-12-12 11:35:33.000000000 +0200 +@@ -312,7 +312,7 @@ + # locations. + from sysconfig import get_config_var + framework = get_config_var("PYTHONFRAMEWORK") +- if framework: ++ if False and framework: + sitepackages.append( + os.path.join("/Library", framework, + sys.version[:3], "site-packages")) diff --git a/plugins/python-build/share/python-build/patches/2.7.3/Python-2.7.3/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/2.7.3/Python-2.7.3/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..8845e45 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.3/Python-2.7.3/010_ssl_no_ssl3.patch @@ -0,0 +1,98 @@ +diff -r -u ../Python-2.7.8.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-2.7.8.orig/Lib/ssl.py 2014-06-30 02:05:31.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-18 14:04:15.266072550 +0000 +@@ -62,30 +62,29 @@ + from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import \ +- SSL_ERROR_ZERO_RETURN, \ +- SSL_ERROR_WANT_READ, \ +- SSL_ERROR_WANT_WRITE, \ +- SSL_ERROR_WANT_X509_LOOKUP, \ +- SSL_ERROR_SYSCALL, \ +- SSL_ERROR_SSL, \ +- SSL_ERROR_WANT_CONNECT, \ +- SSL_ERROR_EOF, \ +- SSL_ERROR_INVALID_ERROR_CODE +-from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++from _ssl import RAND_status, RAND_add + try: +- from _ssl import PROTOCOL_SSLv2 +- _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 ++ from _ssl import RAND_egd + except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('ALERT_DESCRIPTION_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} ++ ++try: ++ _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 ++except NameError: + _SSLv2_IF_EXISTS = None +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + + from socket import socket, _fileobject, _delegate_methods, error as socket_error + from socket import getnameinfo as _getnameinfo +@@ -436,7 +435,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodestring(d) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. +diff -r -u ../Python-2.7.8.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-2.7.8.orig/Modules/_ssl.c 2014-06-30 02:05:42.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-18 14:02:42.618029896 +0000 +@@ -67,7 +67,9 @@ + #ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, + #endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3=1, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -306,8 +308,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +@@ -1808,8 +1812,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/2.7.4/Python-2.7.4/002_readline63.patch b/plugins/python-build/share/python-build/patches/2.7.4/Python-2.7.4/002_readline63.patch new file mode 100644 index 0000000..6d0eb19 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.4/Python-2.7.4/002_readline63.patch @@ -0,0 +1,61 @@ +diff -r -u ../Python-2.7.6.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-2.7.6.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 +@@ -206,8 +206,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -750,14 +749,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -852,7 +859,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -911,12 +918,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/2.7.4/Python-2.7.4/003_system_library_path_in_sys_path.patch b/plugins/python-build/share/python-build/patches/2.7.4/Python-2.7.4/003_system_library_path_in_sys_path.patch new file mode 100644 index 0000000..e46f772 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.4/Python-2.7.4/003_system_library_path_in_sys_path.patch @@ -0,0 +1,13 @@ +Only in .: 003_system_library_path_in_sys_path.patch +diff -ur ../Python-2.7.3/Lib/site.py ./Lib/site.py +--- ../Python-2.7.3/Lib/site.py 2012-04-10 02:07:31.000000000 +0300 ++++ ./Lib/site.py 2014-12-12 11:35:33.000000000 +0200 +@@ -312,7 +312,7 @@ + # locations. + from sysconfig import get_config_var + framework = get_config_var("PYTHONFRAMEWORK") +- if framework: ++ if False and framework: + sitepackages.append( + os.path.join("/Library", framework, + sys.version[:3], "site-packages")) diff --git a/plugins/python-build/share/python-build/patches/2.7.4/Python-2.7.4/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/2.7.4/Python-2.7.4/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..8845e45 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.4/Python-2.7.4/010_ssl_no_ssl3.patch @@ -0,0 +1,98 @@ +diff -r -u ../Python-2.7.8.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-2.7.8.orig/Lib/ssl.py 2014-06-30 02:05:31.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-18 14:04:15.266072550 +0000 +@@ -62,30 +62,29 @@ + from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import \ +- SSL_ERROR_ZERO_RETURN, \ +- SSL_ERROR_WANT_READ, \ +- SSL_ERROR_WANT_WRITE, \ +- SSL_ERROR_WANT_X509_LOOKUP, \ +- SSL_ERROR_SYSCALL, \ +- SSL_ERROR_SSL, \ +- SSL_ERROR_WANT_CONNECT, \ +- SSL_ERROR_EOF, \ +- SSL_ERROR_INVALID_ERROR_CODE +-from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++from _ssl import RAND_status, RAND_add + try: +- from _ssl import PROTOCOL_SSLv2 +- _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 ++ from _ssl import RAND_egd + except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('ALERT_DESCRIPTION_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} ++ ++try: ++ _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 ++except NameError: + _SSLv2_IF_EXISTS = None +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + + from socket import socket, _fileobject, _delegate_methods, error as socket_error + from socket import getnameinfo as _getnameinfo +@@ -436,7 +435,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodestring(d) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. +diff -r -u ../Python-2.7.8.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-2.7.8.orig/Modules/_ssl.c 2014-06-30 02:05:42.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-18 14:02:42.618029896 +0000 +@@ -67,7 +67,9 @@ + #ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, + #endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3=1, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -306,8 +308,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +@@ -1808,8 +1812,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/2.7.5/Python-2.7.5/002_readline63.patch b/plugins/python-build/share/python-build/patches/2.7.5/Python-2.7.5/002_readline63.patch new file mode 100644 index 0000000..6d0eb19 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.5/Python-2.7.5/002_readline63.patch @@ -0,0 +1,61 @@ +diff -r -u ../Python-2.7.6.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-2.7.6.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 +@@ -206,8 +206,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -750,14 +749,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -852,7 +859,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -911,12 +918,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/2.7.5/Python-2.7.5/003_system_library_path_in_sys_path.patch b/plugins/python-build/share/python-build/patches/2.7.5/Python-2.7.5/003_system_library_path_in_sys_path.patch new file mode 100644 index 0000000..606b3bb --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.5/Python-2.7.5/003_system_library_path_in_sys_path.patch @@ -0,0 +1,13 @@ +Only in .: 003_system_library_path_in_sys_path.patch +diff -ur ../Python-2.7.5/Lib/site.py ./Lib/site.py +--- ../Python-2.7.5/Lib/site.py 2013-05-12 06:32:44.000000000 +0300 ++++ ./Lib/site.py 2014-12-12 11:29:29.000000000 +0200 +@@ -300,7 +300,7 @@ + # locations. + from sysconfig import get_config_var + framework = get_config_var("PYTHONFRAMEWORK") +- if framework: ++ if False and framework: + sitepackages.append( + os.path.join("/Library", framework, + sys.version[:3], "site-packages")) diff --git a/plugins/python-build/share/python-build/patches/2.7.5/Python-2.7.5/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/2.7.5/Python-2.7.5/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..8845e45 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.5/Python-2.7.5/010_ssl_no_ssl3.patch @@ -0,0 +1,98 @@ +diff -r -u ../Python-2.7.8.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-2.7.8.orig/Lib/ssl.py 2014-06-30 02:05:31.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-18 14:04:15.266072550 +0000 +@@ -62,30 +62,29 @@ + from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import \ +- SSL_ERROR_ZERO_RETURN, \ +- SSL_ERROR_WANT_READ, \ +- SSL_ERROR_WANT_WRITE, \ +- SSL_ERROR_WANT_X509_LOOKUP, \ +- SSL_ERROR_SYSCALL, \ +- SSL_ERROR_SSL, \ +- SSL_ERROR_WANT_CONNECT, \ +- SSL_ERROR_EOF, \ +- SSL_ERROR_INVALID_ERROR_CODE +-from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++from _ssl import RAND_status, RAND_add + try: +- from _ssl import PROTOCOL_SSLv2 +- _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 ++ from _ssl import RAND_egd + except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('ALERT_DESCRIPTION_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} ++ ++try: ++ _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 ++except NameError: + _SSLv2_IF_EXISTS = None +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + + from socket import socket, _fileobject, _delegate_methods, error as socket_error + from socket import getnameinfo as _getnameinfo +@@ -436,7 +435,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodestring(d) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. +diff -r -u ../Python-2.7.8.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-2.7.8.orig/Modules/_ssl.c 2014-06-30 02:05:42.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-18 14:02:42.618029896 +0000 +@@ -67,7 +67,9 @@ + #ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, + #endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3=1, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -306,8 +308,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +@@ -1808,8 +1812,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/2.7.6/Python-2.7.6/002_readline63.patch b/plugins/python-build/share/python-build/patches/2.7.6/Python-2.7.6/002_readline63.patch new file mode 100644 index 0000000..6d0eb19 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.6/Python-2.7.6/002_readline63.patch @@ -0,0 +1,61 @@ +diff -r -u ../Python-2.7.6.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-2.7.6.orig/Modules/readline.c 2013-11-10 16:36:41.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:17:48.643305752 +0900 +@@ -206,8 +206,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -750,14 +749,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -852,7 +859,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -911,12 +918,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/2.7.6/Python-2.7.6/003_system_library_path_in_sys_path.patch b/plugins/python-build/share/python-build/patches/2.7.6/Python-2.7.6/003_system_library_path_in_sys_path.patch new file mode 100644 index 0000000..606b3bb --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.6/Python-2.7.6/003_system_library_path_in_sys_path.patch @@ -0,0 +1,13 @@ +Only in .: 003_system_library_path_in_sys_path.patch +diff -ur ../Python-2.7.5/Lib/site.py ./Lib/site.py +--- ../Python-2.7.5/Lib/site.py 2013-05-12 06:32:44.000000000 +0300 ++++ ./Lib/site.py 2014-12-12 11:29:29.000000000 +0200 +@@ -300,7 +300,7 @@ + # locations. + from sysconfig import get_config_var + framework = get_config_var("PYTHONFRAMEWORK") +- if framework: ++ if False and framework: + sitepackages.append( + os.path.join("/Library", framework, + sys.version[:3], "site-packages")) diff --git a/plugins/python-build/share/python-build/patches/2.7.6/Python-2.7.6/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/2.7.6/Python-2.7.6/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..8845e45 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.6/Python-2.7.6/010_ssl_no_ssl3.patch @@ -0,0 +1,98 @@ +diff -r -u ../Python-2.7.8.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-2.7.8.orig/Lib/ssl.py 2014-06-30 02:05:31.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-18 14:04:15.266072550 +0000 +@@ -62,30 +62,29 @@ + from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import \ +- SSL_ERROR_ZERO_RETURN, \ +- SSL_ERROR_WANT_READ, \ +- SSL_ERROR_WANT_WRITE, \ +- SSL_ERROR_WANT_X509_LOOKUP, \ +- SSL_ERROR_SYSCALL, \ +- SSL_ERROR_SSL, \ +- SSL_ERROR_WANT_CONNECT, \ +- SSL_ERROR_EOF, \ +- SSL_ERROR_INVALID_ERROR_CODE +-from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++from _ssl import RAND_status, RAND_add + try: +- from _ssl import PROTOCOL_SSLv2 +- _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 ++ from _ssl import RAND_egd + except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('ALERT_DESCRIPTION_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} ++ ++try: ++ _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 ++except NameError: + _SSLv2_IF_EXISTS = None +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + + from socket import socket, _fileobject, _delegate_methods, error as socket_error + from socket import getnameinfo as _getnameinfo +@@ -436,7 +435,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodestring(d) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. +diff -r -u ../Python-2.7.8.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-2.7.8.orig/Modules/_ssl.c 2014-06-30 02:05:42.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-18 14:02:42.618029896 +0000 +@@ -67,7 +67,9 @@ + #ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, + #endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3=1, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -306,8 +308,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +@@ -1808,8 +1812,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/2.7.6/Python-2.7.6/012_fix_bundle_loader_for_new_osx.patch b/plugins/python-build/share/python-build/patches/2.7.6/Python-2.7.6/012_fix_bundle_loader_for_new_osx.patch new file mode 100644 index 0000000..2d9ba81 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.6/Python-2.7.6/012_fix_bundle_loader_for_new_osx.patch @@ -0,0 +1,58 @@ +diff -ur ../Python-2.7.6/configure ./configure +--- ../Python-2.7.6/configure 2014-06-19 14:35:59.000000000 -0400 ++++ ./configure 2018-04-24 12:44:24.143179222 -0400 +@@ -6045,8 +6045,14 @@ + + # Calculate the right deployment target for this build. + # +- cur_target=`sw_vers -productVersion | sed 's/\(10\.[0-9]*\).*/\1/'` +- if test ${cur_target} '>' 10.2; then ++ cur_target_major=`sw_vers -productVersion | \ ++ sed 's/\([0-9]*\)\.\([0-9]*\).*/\1/'` ++ cur_target_minor=`sw_vers -productVersion | \ ++ sed 's/\([0-9]*\)\.\([0-9]*\).*/\2/'` ++ cur_target="${cur_target_major}.${cur_target_minor}" ++ if test ${cur_target_major} -eq 10 && \ ++ test ${cur_target_minor} -ge 3 ++ then + cur_target=10.3 + if test ${enable_universalsdk}; then + if test "${UNIVERSAL_ARCHS}" = "all"; then +@@ -8230,15 +8236,14 @@ + # Use -undefined dynamic_lookup whenever possible (10.3 and later). + # This allows an extension to be used in any Python + +- if test ${MACOSX_DEPLOYMENT_TARGET} '>' 10.2 ++ dep_target_major=`echo ${MACOSX_DEPLOYMENT_TARGET} | \ ++ sed 's/\([0-9]*\)\.\([0-9]*\).*/\1/'` ++ dep_target_minor=`echo ${MACOSX_DEPLOYMENT_TARGET} | \ ++ sed 's/\([0-9]*\)\.\([0-9]*\).*/\2/'` ++ if test ${dep_target_major} -eq 10 && \ ++ test ${dep_target_minor} -le 2 + then +- if test "${enable_universalsdk}"; then +- LDFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${LDFLAGS}" +- fi +- LDSHARED='$(CC) -bundle -undefined dynamic_lookup' +- LDCXXSHARED='$(CXX) -bundle -undefined dynamic_lookup' +- BLDSHARED="$LDSHARED" +- else ++ # building for OS X 10.0 through 10.2 + LDSHARED='$(CC) -bundle' + LDCXXSHARED='$(CXX) -bundle' + if test "$enable_framework" ; then +@@ -8252,6 +8257,14 @@ + LDSHARED="$LDSHARED "'-bundle_loader $(BINDIR)/python$(VERSION)$(EXE)' + LDCXXSHARED="$LDCXXSHARED "'-bundle_loader $(BINDIR)/python$(VERSION)$(EXE)' + fi ++ else ++ # building for OS X 10.3 and later ++ if test "${enable_universalsdk}"; then ++ LDFLAGS="${UNIVERSAL_ARCH_FLAGS} -isysroot ${UNIVERSALSDK} ${LDFLAGS}" ++ fi ++ LDSHARED='$(CC) -bundle -undefined dynamic_lookup' ++ LDCXXSHARED='$(CXX) -bundle -undefined dynamic_lookup' ++ BLDSHARED="$LDSHARED" + fi + ;; + Linux*|GNU*|QNX*) diff --git a/plugins/python-build/share/python-build/patches/2.7.7/Python-2.7.7/003_system_library_path_in_sys_path.patch b/plugins/python-build/share/python-build/patches/2.7.7/Python-2.7.7/003_system_library_path_in_sys_path.patch new file mode 100644 index 0000000..606b3bb --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.7/Python-2.7.7/003_system_library_path_in_sys_path.patch @@ -0,0 +1,13 @@ +Only in .: 003_system_library_path_in_sys_path.patch +diff -ur ../Python-2.7.5/Lib/site.py ./Lib/site.py +--- ../Python-2.7.5/Lib/site.py 2013-05-12 06:32:44.000000000 +0300 ++++ ./Lib/site.py 2014-12-12 11:29:29.000000000 +0200 +@@ -300,7 +300,7 @@ + # locations. + from sysconfig import get_config_var + framework = get_config_var("PYTHONFRAMEWORK") +- if framework: ++ if False and framework: + sitepackages.append( + os.path.join("/Library", framework, + sys.version[:3], "site-packages")) diff --git a/plugins/python-build/share/python-build/patches/2.7.7/Python-2.7.7/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/2.7.7/Python-2.7.7/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..8845e45 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.7/Python-2.7.7/010_ssl_no_ssl3.patch @@ -0,0 +1,98 @@ +diff -r -u ../Python-2.7.8.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-2.7.8.orig/Lib/ssl.py 2014-06-30 02:05:31.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-18 14:04:15.266072550 +0000 +@@ -62,30 +62,29 @@ + from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import \ +- SSL_ERROR_ZERO_RETURN, \ +- SSL_ERROR_WANT_READ, \ +- SSL_ERROR_WANT_WRITE, \ +- SSL_ERROR_WANT_X509_LOOKUP, \ +- SSL_ERROR_SYSCALL, \ +- SSL_ERROR_SSL, \ +- SSL_ERROR_WANT_CONNECT, \ +- SSL_ERROR_EOF, \ +- SSL_ERROR_INVALID_ERROR_CODE +-from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++from _ssl import RAND_status, RAND_add + try: +- from _ssl import PROTOCOL_SSLv2 +- _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 ++ from _ssl import RAND_egd + except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('ALERT_DESCRIPTION_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} ++ ++try: ++ _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 ++except NameError: + _SSLv2_IF_EXISTS = None +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + + from socket import socket, _fileobject, _delegate_methods, error as socket_error + from socket import getnameinfo as _getnameinfo +@@ -436,7 +435,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodestring(d) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. +diff -r -u ../Python-2.7.8.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-2.7.8.orig/Modules/_ssl.c 2014-06-30 02:05:42.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-18 14:02:42.618029896 +0000 +@@ -67,7 +67,9 @@ + #ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, + #endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3=1, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -306,8 +308,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +@@ -1808,8 +1812,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/2.7.8/Python-2.7.8/003_system_library_path_in_sys_path.patch b/plugins/python-build/share/python-build/patches/2.7.8/Python-2.7.8/003_system_library_path_in_sys_path.patch new file mode 100644 index 0000000..cf6cb73 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.8/Python-2.7.8/003_system_library_path_in_sys_path.patch @@ -0,0 +1,13 @@ +Only in .: 003_system_library_path_in_sys_path.patch +diff -ur ../Python-2.7.8/Lib/site.py ./Lib/site.py +--- ../Python-2.7.8/Lib/site.py 2014-06-30 05:05:30.000000000 +0300 ++++ ./Lib/site.py 2014-12-12 11:42:33.000000000 +0200 +@@ -300,7 +300,7 @@ + # locations. + from sysconfig import get_config_var + framework = get_config_var("PYTHONFRAMEWORK") +- if framework: ++ if False and framework: + sitepackages.append( + os.path.join("/Library", framework, + sys.version[:3], "site-packages")) diff --git a/plugins/python-build/share/python-build/patches/2.7.8/Python-2.7.8/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/2.7.8/Python-2.7.8/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..8845e45 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.8/Python-2.7.8/010_ssl_no_ssl3.patch @@ -0,0 +1,98 @@ +diff -r -u ../Python-2.7.8.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-2.7.8.orig/Lib/ssl.py 2014-06-30 02:05:31.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-18 14:04:15.266072550 +0000 +@@ -62,30 +62,29 @@ + from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import \ +- SSL_ERROR_ZERO_RETURN, \ +- SSL_ERROR_WANT_READ, \ +- SSL_ERROR_WANT_WRITE, \ +- SSL_ERROR_WANT_X509_LOOKUP, \ +- SSL_ERROR_SYSCALL, \ +- SSL_ERROR_SSL, \ +- SSL_ERROR_WANT_CONNECT, \ +- SSL_ERROR_EOF, \ +- SSL_ERROR_INVALID_ERROR_CODE +-from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++from _ssl import RAND_status, RAND_add + try: +- from _ssl import PROTOCOL_SSLv2 +- _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 ++ from _ssl import RAND_egd + except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('ALERT_DESCRIPTION_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} ++ ++try: ++ _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 ++except NameError: + _SSLv2_IF_EXISTS = None +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + + from socket import socket, _fileobject, _delegate_methods, error as socket_error + from socket import getnameinfo as _getnameinfo +@@ -436,7 +435,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodestring(d) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. +diff -r -u ../Python-2.7.8.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-2.7.8.orig/Modules/_ssl.c 2014-06-30 02:05:42.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-18 14:02:42.618029896 +0000 +@@ -67,7 +67,9 @@ + #ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, + #endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3=1, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -306,8 +308,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +@@ -1808,8 +1812,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/2.7.9/Python-2.7.9/003_system_library_path_in_sys_path.patch b/plugins/python-build/share/python-build/patches/2.7.9/Python-2.7.9/003_system_library_path_in_sys_path.patch new file mode 100644 index 0000000..3ce8f59 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.9/Python-2.7.9/003_system_library_path_in_sys_path.patch @@ -0,0 +1,13 @@ +Only in .: 003_system_library_path_in_sys_path.patch +diff -ur ../Python-2.7.9/Lib/site.py ./Lib/site.py +--- ../Python-2.7.9/Lib/site.py 2014-06-30 05:05:30.000000000 +0300 ++++ ./Lib/site.py 2014-12-12 11:42:33.000000000 +0200 +@@ -300,7 +300,7 @@ + # locations. + from sysconfig import get_config_var + framework = get_config_var("PYTHONFRAMEWORK") +- if framework: ++ if False and framework: + sitepackages.append( + os.path.join("/Library", framework, + sys.version[:3], "site-packages")) diff --git a/plugins/python-build/share/python-build/patches/2.7.9/Python-2.7.9/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/2.7.9/Python-2.7.9/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..11156bb --- /dev/null +++ b/plugins/python-build/share/python-build/patches/2.7.9/Python-2.7.9/010_ssl_no_ssl3.patch @@ -0,0 +1,17 @@ +diff -r -u ../Python-2.7.9.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-2.7.9.orig/Lib/ssl.py 2014-12-10 15:59:40.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-18 14:09:51.218138658 +0000 +@@ -106,7 +106,12 @@ + from _ssl import (VERIFY_DEFAULT, VERIFY_CRL_CHECK_LEAF, VERIFY_CRL_CHECK_CHAIN, + VERIFY_X509_STRICT) + from _ssl import txt2obj as _txt2obj, nid2obj as _nid2obj +-from _ssl import RAND_status, RAND_egd, RAND_add ++from _ssl import RAND_status, RAND_add ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass + + def _import_symbols(prefix): + for n in dir(_ssl): diff --git a/plugins/python-build/share/python-build/patches/3.0.1/Python-3.0.1/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/3.0.1/Python-3.0.1/000_patch-setup.py.diff new file mode 100644 index 0000000..8f1a177 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.0.1/Python-3.0.1/000_patch-setup.py.diff @@ -0,0 +1,44 @@ +--- setup.py.orig 2011-07-07 19:41:48.610196111 +0900 ++++ setup.py 2011-07-07 19:46:44.986310031 +0900 +@@ -14,6 +14,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -308,10 +309,33 @@ + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ with open(tmpfile) as fp: ++ multiarch_path_component = fp.readline().strip() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. diff --git a/plugins/python-build/share/python-build/patches/3.0.1/Python-3.0.1/001_patch-svnversion.patch b/plugins/python-build/share/python-build/patches/3.0.1/Python-3.0.1/001_patch-svnversion.patch new file mode 100644 index 0000000..5ee39e9 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.0.1/Python-3.0.1/001_patch-svnversion.patch @@ -0,0 +1,42 @@ +--- configure.in ++++ configure.in +@@ -767,7 +767,7 @@ + then + SVNVERSION="svnversion \$(srcdir)" + else +- SVNVERSION="echo exported" ++ SVNVERSION="echo Unversioned directory" + fi + + case $MACHDEP in +--- Makefile.pre.in ++++ Makefile.pre.in +@@ -501,7 +501,7 @@ + $(SIGNAL_OBJS) \ + $(MODOBJS) \ + $(srcdir)/Modules/getbuildinfo.c +- $(CC) -c $(PY_CFLAGS) -DSVNVERSION=\"`LC_ALL=C $(SVNVERSION)`\" -o $@ $(srcdir)/Modules/getbuildinfo.c ++ $(CC) -c $(PY_CFLAGS) -DSVNVERSION="\"`LC_ALL=C $(SVNVERSION)`\"" -o $@ $(srcdir)/Modules/getbuildinfo.c + + Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile + $(CC) -c $(PY_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ +--- Modules/getbuildinfo.c ++++ Modules/getbuildinfo.c +@@ -48,5 +48,5 @@ + static const char svnversion[] = SVNVERSION; + if (svnversion[0] != '$') + return svnversion; /* it was interpolated, or passed on command line */ +- return "exported"; ++ return "Unversioned directory"; + } +--- Python/sysmodule.c ++++ Python/sysmodule.c +@@ -1161,7 +1161,7 @@ + + + svnversion = _Py_svnversion(); +- if (strcmp(svnversion, "exported") != 0) ++ if (strcmp(svnversion, "Unversioned directory") != 0 && strcmp(svnversion, "exported") != 0) + svn_revision = svnversion; + else if (istag) { + len = strlen(_patchlevel_revision); diff --git a/plugins/python-build/share/python-build/patches/3.0.1/Python-3.0.1/010_ssl_no_ssl2_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.0.1/Python-3.0.1/010_ssl_no_ssl2_no_ssl3.patch new file mode 100644 index 0000000..5501db4 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.0.1/Python-3.0.1/010_ssl_no_ssl2_no_ssl3.patch @@ -0,0 +1,96 @@ +diff -r -u ../Python-3.1.2.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.1.2.orig/Lib/ssl.py 2010-01-18 09:16:17.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-20 07:36:08.545346519 +0000 +@@ -60,20 +60,23 @@ + + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import (PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, +- PROTOCOL_TLSv1) +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import ( +- SSL_ERROR_ZERO_RETURN, +- SSL_ERROR_WANT_READ, +- SSL_ERROR_WANT_WRITE, +- SSL_ERROR_WANT_X509_LOOKUP, +- SSL_ERROR_SYSCALL, +- SSL_ERROR_SSL, +- SSL_ERROR_WANT_CONNECT, +- SSL_ERROR_EOF, +- SSL_ERROR_INVALID_ERROR_CODE, +- ) ++from _ssl import RAND_status, RAND_add ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + + from socket import getnameinfo as _getnameinfo + from socket import error as socket_error +@@ -415,7 +418,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.1.2.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.1.2.orig/Modules/_ssl.c 2010-03-02 22:49:30.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-20 07:35:02.675100987 +0000 +@@ -62,8 +62,12 @@ + }; + + enum py_ssl_version { ++#ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, ++#endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1, + }; +@@ -299,10 +303,14 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif ++#ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ ++#endif + else if (proto_version == PY_SSL_VERSION_SSL23) + self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ + PySSL_END_ALLOW_THREADS +@@ -1698,10 +1706,14 @@ + PY_SSL_CERT_REQUIRED); + + /* protocol versions */ ++#ifndef OPENSSL_NO_SSL2 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); ++#endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.1.0/Python-3.1/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/3.1.0/Python-3.1/000_patch-setup.py.diff new file mode 100644 index 0000000..ad886b8 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.1.0/Python-3.1/000_patch-setup.py.diff @@ -0,0 +1,55 @@ +diff -r -u ../Python-3.1/setup.py ./setup.py +--- ../Python-3.1/setup.py 2009-05-24 02:13:14.000000000 +0900 ++++ ./setup.py 2015-08-15 13:29:18.300777605 +0900 +@@ -14,6 +14,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -293,10 +294,33 @@ + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ with open(tmpfile) as fp: ++ multiarch_path_component = fp.readline().strip() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. +@@ -1203,8 +1203,7 @@ + # End multiprocessing + + # Platform-specific libraries +- if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', +- 'freebsd7', 'freebsd8'): ++ if platform.startswith('linux') or platform.startswith('freebsd'): + exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) + else: + missing.append('ossaudiodev') diff --git a/plugins/python-build/share/python-build/patches/3.1.0/Python-3.1/010_ssl_no_ssl2_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.1.0/Python-3.1/010_ssl_no_ssl2_no_ssl3.patch new file mode 100644 index 0000000..5501db4 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.1.0/Python-3.1/010_ssl_no_ssl2_no_ssl3.patch @@ -0,0 +1,96 @@ +diff -r -u ../Python-3.1.2.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.1.2.orig/Lib/ssl.py 2010-01-18 09:16:17.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-20 07:36:08.545346519 +0000 +@@ -60,20 +60,23 @@ + + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import (PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, +- PROTOCOL_TLSv1) +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import ( +- SSL_ERROR_ZERO_RETURN, +- SSL_ERROR_WANT_READ, +- SSL_ERROR_WANT_WRITE, +- SSL_ERROR_WANT_X509_LOOKUP, +- SSL_ERROR_SYSCALL, +- SSL_ERROR_SSL, +- SSL_ERROR_WANT_CONNECT, +- SSL_ERROR_EOF, +- SSL_ERROR_INVALID_ERROR_CODE, +- ) ++from _ssl import RAND_status, RAND_add ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + + from socket import getnameinfo as _getnameinfo + from socket import error as socket_error +@@ -415,7 +418,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.1.2.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.1.2.orig/Modules/_ssl.c 2010-03-02 22:49:30.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-20 07:35:02.675100987 +0000 +@@ -62,8 +62,12 @@ + }; + + enum py_ssl_version { ++#ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, ++#endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1, + }; +@@ -299,10 +303,14 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif ++#ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ ++#endif + else if (proto_version == PY_SSL_VERSION_SSL23) + self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ + PySSL_END_ALLOW_THREADS +@@ -1698,10 +1706,14 @@ + PY_SSL_CERT_REQUIRED); + + /* protocol versions */ ++#ifndef OPENSSL_NO_SSL2 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); ++#endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.1.1/Python-3.1.1/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/3.1.1/Python-3.1.1/000_patch-setup.py.diff new file mode 100644 index 0000000..ad886b8 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.1.1/Python-3.1.1/000_patch-setup.py.diff @@ -0,0 +1,55 @@ +diff -r -u ../Python-3.1/setup.py ./setup.py +--- ../Python-3.1/setup.py 2009-05-24 02:13:14.000000000 +0900 ++++ ./setup.py 2015-08-15 13:29:18.300777605 +0900 +@@ -14,6 +14,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -293,10 +294,33 @@ + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ with open(tmpfile) as fp: ++ multiarch_path_component = fp.readline().strip() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. +@@ -1203,8 +1203,7 @@ + # End multiprocessing + + # Platform-specific libraries +- if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', +- 'freebsd7', 'freebsd8'): ++ if platform.startswith('linux') or platform.startswith('freebsd'): + exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) + else: + missing.append('ossaudiodev') diff --git a/plugins/python-build/share/python-build/patches/3.1.1/Python-3.1.1/010_ssl_no_ssl2_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.1.1/Python-3.1.1/010_ssl_no_ssl2_no_ssl3.patch new file mode 100644 index 0000000..5501db4 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.1.1/Python-3.1.1/010_ssl_no_ssl2_no_ssl3.patch @@ -0,0 +1,96 @@ +diff -r -u ../Python-3.1.2.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.1.2.orig/Lib/ssl.py 2010-01-18 09:16:17.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-20 07:36:08.545346519 +0000 +@@ -60,20 +60,23 @@ + + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import (PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, +- PROTOCOL_TLSv1) +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import ( +- SSL_ERROR_ZERO_RETURN, +- SSL_ERROR_WANT_READ, +- SSL_ERROR_WANT_WRITE, +- SSL_ERROR_WANT_X509_LOOKUP, +- SSL_ERROR_SYSCALL, +- SSL_ERROR_SSL, +- SSL_ERROR_WANT_CONNECT, +- SSL_ERROR_EOF, +- SSL_ERROR_INVALID_ERROR_CODE, +- ) ++from _ssl import RAND_status, RAND_add ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + + from socket import getnameinfo as _getnameinfo + from socket import error as socket_error +@@ -415,7 +418,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.1.2.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.1.2.orig/Modules/_ssl.c 2010-03-02 22:49:30.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-20 07:35:02.675100987 +0000 +@@ -62,8 +62,12 @@ + }; + + enum py_ssl_version { ++#ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, ++#endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1, + }; +@@ -299,10 +303,14 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif ++#ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ ++#endif + else if (proto_version == PY_SSL_VERSION_SSL23) + self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ + PySSL_END_ALLOW_THREADS +@@ -1698,10 +1706,14 @@ + PY_SSL_CERT_REQUIRED); + + /* protocol versions */ ++#ifndef OPENSSL_NO_SSL2 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); ++#endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.1.2/Python-3.1.2/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/3.1.2/Python-3.1.2/000_patch-setup.py.diff new file mode 100644 index 0000000..b57d888 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.1.2/Python-3.1.2/000_patch-setup.py.diff @@ -0,0 +1,55 @@ +diff -r -u ../Python-3.1/setup.py ./setup.py +--- ../Python-3.1/setup.py 2009-05-24 02:13:14.000000000 +0900 ++++ ./setup.py 2015-08-15 13:29:18.300777605 +0900 +@@ -14,6 +14,7 @@ + from distutils.command.build_ext import build_ext + from distutils.command.install import install + from distutils.command.install_lib import install_lib ++from distutils.spawn import find_executable + + # This global variable is used to hold the list of modules to be disabled. + disabled_module_list = [] +@@ -293,10 +294,33 @@ + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ with open(tmpfile) as fp: ++ multiarch_path_component = fp.readline().strip() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. +@@ -1207,8 +1207,7 @@ + # End multiprocessing + + # Platform-specific libraries +- if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', +- 'freebsd7', 'freebsd8'): ++ if platform.startswith('linux') or platform.startswith('freebsd'): + exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) + else: + missing.append('ossaudiodev') diff --git a/plugins/python-build/share/python-build/patches/3.1.2/Python-3.1.2/010_ssl_no_ssl2_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.1.2/Python-3.1.2/010_ssl_no_ssl2_no_ssl3.patch new file mode 100644 index 0000000..5501db4 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.1.2/Python-3.1.2/010_ssl_no_ssl2_no_ssl3.patch @@ -0,0 +1,96 @@ +diff -r -u ../Python-3.1.2.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.1.2.orig/Lib/ssl.py 2010-01-18 09:16:17.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-20 07:36:08.545346519 +0000 +@@ -60,20 +60,23 @@ + + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import (PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, +- PROTOCOL_TLSv1) +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import ( +- SSL_ERROR_ZERO_RETURN, +- SSL_ERROR_WANT_READ, +- SSL_ERROR_WANT_WRITE, +- SSL_ERROR_WANT_X509_LOOKUP, +- SSL_ERROR_SYSCALL, +- SSL_ERROR_SSL, +- SSL_ERROR_WANT_CONNECT, +- SSL_ERROR_EOF, +- SSL_ERROR_INVALID_ERROR_CODE, +- ) ++from _ssl import RAND_status, RAND_add ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + + from socket import getnameinfo as _getnameinfo + from socket import error as socket_error +@@ -415,7 +418,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.1.2.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.1.2.orig/Modules/_ssl.c 2010-03-02 22:49:30.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-20 07:35:02.675100987 +0000 +@@ -62,8 +62,12 @@ + }; + + enum py_ssl_version { ++#ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, ++#endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1, + }; +@@ -299,10 +303,14 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif ++#ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ ++#endif + else if (proto_version == PY_SSL_VERSION_SSL23) + self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ + PySSL_END_ALLOW_THREADS +@@ -1698,10 +1706,14 @@ + PY_SSL_CERT_REQUIRED); + + /* protocol versions */ ++#ifndef OPENSSL_NO_SSL2 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); ++#endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.1.3/Python-3.1.3/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/3.1.3/Python-3.1.3/000_patch-setup.py.diff new file mode 100644 index 0000000..4edf36a --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.1.3/Python-3.1.3/000_patch-setup.py.diff @@ -0,0 +1,56 @@ + +# HG changeset patch +# User Barry Warsaw +# Date 1302190091 14400 +# Node ID bd0f73a9538e05f526feaf05821e68bdcff498fa +# Parent 2e4cdaffe493e879fb5367a4aa454491de451137 +Backport for Python 2.7 of issue 11715 support for building Python on +multiarch Debian/Ubuntu. + +diff -r -u setup.py setup.py +--- setup.py.orig ++++ setup.py +@@ -345,10 +345,33 @@ class PyBuildExt(build_ext): + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ with open(tmpfile) as fp: ++ multiarch_path_component = fp.readline().strip() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. +@@ -1321,8 +1321,7 @@ + # End multiprocessing + + # Platform-specific libraries +- if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', +- 'freebsd7', 'freebsd8'): ++ if platform.startswith('linux') or platform.startswith('freebsd'): + exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) + else: + missing.append('ossaudiodev') diff --git a/plugins/python-build/share/python-build/patches/3.1.3/Python-3.1.3/002_readline63.patch b/plugins/python-build/share/python-build/patches/3.1.3/Python-3.1.3/002_readline63.patch new file mode 100644 index 0000000..ed29626 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.1.3/Python-3.1.3/002_readline63.patch @@ -0,0 +1,70 @@ +diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 +@@ -231,8 +231,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -774,14 +773,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -819,7 +826,7 @@ + (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { + goto error; + } +- Py_XDECREF(r); r=NULL; ++ Py_CLEAR(r); + + if (0) { + error: +@@ -877,7 +884,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -936,12 +943,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/3.1.3/Python-3.1.3/010_ssl_no_ssl2_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.1.3/Python-3.1.3/010_ssl_no_ssl2_no_ssl3.patch new file mode 100644 index 0000000..1a4cafe --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.1.3/Python-3.1.3/010_ssl_no_ssl2_no_ssl3.patch @@ -0,0 +1,96 @@ +diff -r -u ../Python-3.1.3.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.1.3.orig/Lib/ssl.py 2010-09-14 14:47:08.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-20 07:32:44.351880682 +0000 +@@ -60,20 +60,23 @@ + + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import (PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, +- PROTOCOL_TLSv1) +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import ( +- SSL_ERROR_ZERO_RETURN, +- SSL_ERROR_WANT_READ, +- SSL_ERROR_WANT_WRITE, +- SSL_ERROR_WANT_X509_LOOKUP, +- SSL_ERROR_SYSCALL, +- SSL_ERROR_SSL, +- SSL_ERROR_WANT_CONNECT, +- SSL_ERROR_EOF, +- SSL_ERROR_INVALID_ERROR_CODE, +- ) ++from _ssl import RAND_status, RAND_add ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + + from socket import getnameinfo as _getnameinfo + from socket import error as socket_error +@@ -408,7 +411,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.1.3.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.1.3.orig/Modules/_ssl.c 2010-10-13 22:20:48.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-20 07:31:44.644359788 +0000 +@@ -63,8 +63,12 @@ + }; + + enum py_ssl_version { ++#ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, ++#endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -304,10 +308,14 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif ++#ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ ++#endif + else if (proto_version == PY_SSL_VERSION_SSL23) + self->ctx = SSL_CTX_new(SSLv23_method()); /* Set up context */ + PySSL_END_ALLOW_THREADS +@@ -1785,10 +1793,14 @@ + PY_SSL_CERT_REQUIRED); + + /* protocol versions */ ++#ifndef OPENSSL_NO_SSL2 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); ++#endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.1.4/Python-3.1.4/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/3.1.4/Python-3.1.4/000_patch-setup.py.diff new file mode 100644 index 0000000..ae14c68 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.1.4/Python-3.1.4/000_patch-setup.py.diff @@ -0,0 +1,12 @@ +--- setup.py.orig 2012-04-10 01:25:37.000000000 +0200 ++++ setup.py 2021-09-03 10:16:58.575042300 +0200 +@@ -1344,8 +1344,7 @@ + # End multiprocessing + + # Platform-specific libraries +- if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', +- 'freebsd7', 'freebsd8'): ++ if platform.startswith('linux') or platform.startswith('freebsd'): + exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) + else: + missing.append('ossaudiodev') diff --git a/plugins/python-build/share/python-build/patches/3.1.4/Python-3.1.4/002_readline63.patch b/plugins/python-build/share/python-build/patches/3.1.4/Python-3.1.4/002_readline63.patch new file mode 100644 index 0000000..ed29626 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.1.4/Python-3.1.4/002_readline63.patch @@ -0,0 +1,70 @@ +diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 +@@ -231,8 +231,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -774,14 +773,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -819,7 +826,7 @@ + (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { + goto error; + } +- Py_XDECREF(r); r=NULL; ++ Py_CLEAR(r); + + if (0) { + error: +@@ -877,7 +884,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -936,12 +943,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/3.1.4/Python-3.1.4/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.1.4/Python-3.1.4/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..02aac66 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.1.4/Python-3.1.4/010_ssl_no_ssl3.patch @@ -0,0 +1,97 @@ +diff -r -u ../Python-3.1.5.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.1.5.orig/Lib/ssl.py 2012-04-09 23:25:35.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-20 07:28:44.015492213 +0000 +@@ -60,30 +60,28 @@ + + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import ( +- SSL_ERROR_ZERO_RETURN, +- SSL_ERROR_WANT_READ, +- SSL_ERROR_WANT_WRITE, +- SSL_ERROR_WANT_X509_LOOKUP, +- SSL_ERROR_SYSCALL, +- SSL_ERROR_SSL, +- SSL_ERROR_WANT_CONNECT, +- SSL_ERROR_EOF, +- SSL_ERROR_INVALID_ERROR_CODE, +- ) +-from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++from _ssl import RAND_status, RAND_add + try: +- from _ssl import PROTOCOL_SSLv2 ++ from _ssl import RAND_egd + except ImportError: ++ # LibreSSL does not provide RAND_egd + pass +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} ++ ++try: ++ _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 ++except NameError: ++ _SSLv2_IF_EXISTS = None + + from socket import getnameinfo as _getnameinfo + from socket import error as socket_error +@@ -418,7 +416,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.1.5.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.1.5.orig/Modules/_ssl.c 2012-04-09 23:25:36.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-20 07:27:06.620775506 +0000 +@@ -66,7 +66,9 @@ + #ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, + #endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3=1, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -306,8 +308,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +@@ -1796,8 +1800,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.1.5/Python-3.1.5/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/3.1.5/Python-3.1.5/000_patch-setup.py.diff new file mode 100644 index 0000000..ae14c68 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.1.5/Python-3.1.5/000_patch-setup.py.diff @@ -0,0 +1,12 @@ +--- setup.py.orig 2012-04-10 01:25:37.000000000 +0200 ++++ setup.py 2021-09-03 10:16:58.575042300 +0200 +@@ -1344,8 +1344,7 @@ + # End multiprocessing + + # Platform-specific libraries +- if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', +- 'freebsd7', 'freebsd8'): ++ if platform.startswith('linux') or platform.startswith('freebsd'): + exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) + else: + missing.append('ossaudiodev') diff --git a/plugins/python-build/share/python-build/patches/3.1.5/Python-3.1.5/002_readline63.patch b/plugins/python-build/share/python-build/patches/3.1.5/Python-3.1.5/002_readline63.patch new file mode 100644 index 0000000..ed29626 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.1.5/Python-3.1.5/002_readline63.patch @@ -0,0 +1,70 @@ +diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 +@@ -231,8 +231,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -774,14 +773,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -819,7 +826,7 @@ + (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { + goto error; + } +- Py_XDECREF(r); r=NULL; ++ Py_CLEAR(r); + + if (0) { + error: +@@ -877,7 +884,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -936,12 +943,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/3.1.5/Python-3.1.5/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.1.5/Python-3.1.5/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..02aac66 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.1.5/Python-3.1.5/010_ssl_no_ssl3.patch @@ -0,0 +1,97 @@ +diff -r -u ../Python-3.1.5.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.1.5.orig/Lib/ssl.py 2012-04-09 23:25:35.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-20 07:28:44.015492213 +0000 +@@ -60,30 +60,28 @@ + + from _ssl import SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import ( +- SSL_ERROR_ZERO_RETURN, +- SSL_ERROR_WANT_READ, +- SSL_ERROR_WANT_WRITE, +- SSL_ERROR_WANT_X509_LOOKUP, +- SSL_ERROR_SYSCALL, +- SSL_ERROR_SSL, +- SSL_ERROR_WANT_CONNECT, +- SSL_ERROR_EOF, +- SSL_ERROR_INVALID_ERROR_CODE, +- ) +-from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++from _ssl import RAND_status, RAND_add + try: +- from _ssl import PROTOCOL_SSLv2 ++ from _ssl import RAND_egd + except ImportError: ++ # LibreSSL does not provide RAND_egd + pass +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} ++ ++try: ++ _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 ++except NameError: ++ _SSLv2_IF_EXISTS = None + + from socket import getnameinfo as _getnameinfo + from socket import error as socket_error +@@ -418,7 +416,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.1.5.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.1.5.orig/Modules/_ssl.c 2012-04-09 23:25:36.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-20 07:27:06.620775506 +0000 +@@ -66,7 +66,9 @@ + #ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, + #endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3=1, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -306,8 +308,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + self->ctx = SSL_CTX_new(TLSv1_method()); /* Set up context */ ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + self->ctx = SSL_CTX_new(SSLv3_method()); /* Set up context */ ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + self->ctx = SSL_CTX_new(SSLv2_method()); /* Set up context */ +@@ -1796,8 +1800,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.10.0/Python-3.10.0/0001-bpo-45350-Rerun-autoreconf-with-the-pkg-config-macro.patch b/plugins/python-build/share/python-build/patches/3.10.0/Python-3.10.0/0001-bpo-45350-Rerun-autoreconf-with-the-pkg-config-macro.patch new file mode 100644 index 0000000..a87681e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.10.0/Python-3.10.0/0001-bpo-45350-Rerun-autoreconf-with-the-pkg-config-macro.patch @@ -0,0 +1,535 @@ +From f146ca36f81075f222aa3a1595042597d96dfad3 Mon Sep 17 00:00:00 2001 +From: Pablo Galindo Salgado +Date: Mon, 4 Oct 2021 00:39:54 +0100 +Subject: [PATCH] bpo-45350: Rerun autoreconf with the pkg-config macros + (GH-28707) + +diff --git a/aclocal.m4 b/aclocal.m4 +index 987bfdf215..2f1bd37528 100644 +--- a/aclocal.m4 ++++ b/aclocal.m4 +@@ -275,3 +275,347 @@ AC_DEFUN([AX_CHECK_OPENSSL], [ + AC_SUBST([OPENSSL_LDFLAGS]) + ]) + ++# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- ++# serial 11 (pkg-config-0.29.1) ++ ++dnl Copyright © 2004 Scott James Remnant . ++dnl Copyright © 2012-2015 Dan Nicholson ++dnl ++dnl This program is free software; you can redistribute it and/or modify ++dnl it under the terms of the GNU General Public License as published by ++dnl the Free Software Foundation; either version 2 of the License, or ++dnl (at your option) any later version. ++dnl ++dnl This program is distributed in the hope that it will be useful, but ++dnl WITHOUT ANY WARRANTY; without even the implied warranty of ++dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++dnl General Public License for more details. ++dnl ++dnl You should have received a copy of the GNU General Public License ++dnl along with this program; if not, write to the Free Software ++dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA ++dnl 02111-1307, USA. ++dnl ++dnl As a special exception to the GNU General Public License, if you ++dnl distribute this file as part of a program that contains a ++dnl configuration script generated by Autoconf, you may include it under ++dnl the same distribution terms that you use for the rest of that ++dnl program. ++ ++dnl PKG_PREREQ(MIN-VERSION) ++dnl ----------------------- ++dnl Since: 0.29 ++dnl ++dnl Verify that the version of the pkg-config macros are at least ++dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's ++dnl installed version of pkg-config, this checks the developer's version ++dnl of pkg.m4 when generating configure. ++dnl ++dnl To ensure that this macro is defined, also add: ++dnl m4_ifndef([PKG_PREREQ], ++dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) ++dnl ++dnl See the "Since" comment for each macro you use to see what version ++dnl of the macros you require. ++m4_defun([PKG_PREREQ], ++[m4_define([PKG_MACROS_VERSION], [0.29.1]) ++m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, ++ [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ++])dnl PKG_PREREQ ++ ++dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) ++dnl ---------------------------------- ++dnl Since: 0.16 ++dnl ++dnl Search for the pkg-config tool and set the PKG_CONFIG variable to ++dnl first found in the path. Checks that the version of pkg-config found ++dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is ++dnl used since that's the first version where most current features of ++dnl pkg-config existed. ++AC_DEFUN([PKG_PROG_PKG_CONFIG], ++[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) ++m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) ++m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) ++AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) ++AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) ++AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) ++ ++if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then ++ AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) ++fi ++if test -n "$PKG_CONFIG"; then ++ _pkg_min_version=m4_default([$1], [0.9.0]) ++ AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) ++ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then ++ AC_MSG_RESULT([yes]) ++ else ++ AC_MSG_RESULT([no]) ++ PKG_CONFIG="" ++ fi ++fi[]dnl ++])dnl PKG_PROG_PKG_CONFIG ++ ++dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) ++dnl ------------------------------------------------------------------- ++dnl Since: 0.18 ++dnl ++dnl Check to see whether a particular set of modules exists. Similar to ++dnl PKG_CHECK_MODULES(), but does not set variables or print errors. ++dnl ++dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) ++dnl only at the first occurence in configure.ac, so if the first place ++dnl it's called might be skipped (such as if it is within an "if", you ++dnl have to call PKG_CHECK_EXISTS manually ++AC_DEFUN([PKG_CHECK_EXISTS], ++[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl ++if test -n "$PKG_CONFIG" && \ ++ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then ++ m4_default([$2], [:]) ++m4_ifvaln([$3], [else ++ $3])dnl ++fi]) ++ ++dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) ++dnl --------------------------------------------- ++dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting ++dnl pkg_failed based on the result. ++m4_define([_PKG_CONFIG], ++[if test -n "$$1"; then ++ pkg_cv_[]$1="$$1" ++ elif test -n "$PKG_CONFIG"; then ++ PKG_CHECK_EXISTS([$3], ++ [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` ++ test "x$?" != "x0" && pkg_failed=yes ], ++ [pkg_failed=yes]) ++ else ++ pkg_failed=untried ++fi[]dnl ++])dnl _PKG_CONFIG ++ ++dnl _PKG_SHORT_ERRORS_SUPPORTED ++dnl --------------------------- ++dnl Internal check to see if pkg-config supports short errors. ++AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], ++[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) ++if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then ++ _pkg_short_errors_supported=yes ++else ++ _pkg_short_errors_supported=no ++fi[]dnl ++])dnl _PKG_SHORT_ERRORS_SUPPORTED ++ ++ ++dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], ++dnl [ACTION-IF-NOT-FOUND]) ++dnl -------------------------------------------------------------- ++dnl Since: 0.4.0 ++dnl ++dnl Note that if there is a possibility the first call to ++dnl PKG_CHECK_MODULES might not happen, you should be sure to include an ++dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac ++AC_DEFUN([PKG_CHECK_MODULES], ++[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl ++AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl ++AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl ++ ++pkg_failed=no ++AC_MSG_CHECKING([for $1]) ++ ++_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) ++_PKG_CONFIG([$1][_LIBS], [libs], [$2]) ++ ++m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS ++and $1[]_LIBS to avoid the need to call pkg-config. ++See the pkg-config man page for more details.]) ++ ++if test $pkg_failed = yes; then ++ AC_MSG_RESULT([no]) ++ _PKG_SHORT_ERRORS_SUPPORTED ++ if test $_pkg_short_errors_supported = yes; then ++ $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` ++ else ++ $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` ++ fi ++ # Put the nasty error message in config.log where it belongs ++ echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD ++ ++ m4_default([$4], [AC_MSG_ERROR( ++[Package requirements ($2) were not met: ++ ++$$1_PKG_ERRORS ++ ++Consider adjusting the PKG_CONFIG_PATH environment variable if you ++installed software in a non-standard prefix. ++ ++_PKG_TEXT])[]dnl ++ ]) ++elif test $pkg_failed = untried; then ++ AC_MSG_RESULT([no]) ++ m4_default([$4], [AC_MSG_FAILURE( ++[The pkg-config script could not be found or is too old. Make sure it ++is in your PATH or set the PKG_CONFIG environment variable to the full ++path to pkg-config. ++ ++_PKG_TEXT ++ ++To get pkg-config, see .])[]dnl ++ ]) ++else ++ $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS ++ $1[]_LIBS=$pkg_cv_[]$1[]_LIBS ++ AC_MSG_RESULT([yes]) ++ $3 ++fi[]dnl ++])dnl PKG_CHECK_MODULES ++ ++ ++dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], ++dnl [ACTION-IF-NOT-FOUND]) ++dnl --------------------------------------------------------------------- ++dnl Since: 0.29 ++dnl ++dnl Checks for existence of MODULES and gathers its build flags with ++dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags ++dnl and VARIABLE-PREFIX_LIBS from --libs. ++dnl ++dnl Note that if there is a possibility the first call to ++dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to ++dnl include an explicit call to PKG_PROG_PKG_CONFIG in your ++dnl configure.ac. ++AC_DEFUN([PKG_CHECK_MODULES_STATIC], ++[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl ++_save_PKG_CONFIG=$PKG_CONFIG ++PKG_CONFIG="$PKG_CONFIG --static" ++PKG_CHECK_MODULES($@) ++PKG_CONFIG=$_save_PKG_CONFIG[]dnl ++])dnl PKG_CHECK_MODULES_STATIC ++ ++ ++dnl PKG_INSTALLDIR([DIRECTORY]) ++dnl ------------------------- ++dnl Since: 0.27 ++dnl ++dnl Substitutes the variable pkgconfigdir as the location where a module ++dnl should install pkg-config .pc files. By default the directory is ++dnl $libdir/pkgconfig, but the default can be changed by passing ++dnl DIRECTORY. The user can override through the --with-pkgconfigdir ++dnl parameter. ++AC_DEFUN([PKG_INSTALLDIR], ++[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) ++m4_pushdef([pkg_description], ++ [pkg-config installation directory @<:@]pkg_default[@:>@]) ++AC_ARG_WITH([pkgconfigdir], ++ [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, ++ [with_pkgconfigdir=]pkg_default) ++AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) ++m4_popdef([pkg_default]) ++m4_popdef([pkg_description]) ++])dnl PKG_INSTALLDIR ++ ++ ++dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) ++dnl -------------------------------- ++dnl Since: 0.27 ++dnl ++dnl Substitutes the variable noarch_pkgconfigdir as the location where a ++dnl module should install arch-independent pkg-config .pc files. By ++dnl default the directory is $datadir/pkgconfig, but the default can be ++dnl changed by passing DIRECTORY. The user can override through the ++dnl --with-noarch-pkgconfigdir parameter. ++AC_DEFUN([PKG_NOARCH_INSTALLDIR], ++[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) ++m4_pushdef([pkg_description], ++ [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) ++AC_ARG_WITH([noarch-pkgconfigdir], ++ [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, ++ [with_noarch_pkgconfigdir=]pkg_default) ++AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) ++m4_popdef([pkg_default]) ++m4_popdef([pkg_description]) ++])dnl PKG_NOARCH_INSTALLDIR ++ ++ ++dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, ++dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) ++dnl ------------------------------------------- ++dnl Since: 0.28 ++dnl ++dnl Retrieves the value of the pkg-config variable for the given module. ++AC_DEFUN([PKG_CHECK_VAR], ++[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl ++AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl ++ ++_PKG_CONFIG([$1], [variable="][$3]["], [$2]) ++AS_VAR_COPY([$1], [pkg_cv_][$1]) ++ ++AS_VAR_IF([$1], [""], [$5], [$4])dnl ++])dnl PKG_CHECK_VAR ++ ++dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, ++dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], ++dnl [DESCRIPTION], [DEFAULT]) ++dnl ------------------------------------------ ++dnl ++dnl Prepare a "--with-" configure option using the lowercase ++dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and ++dnl PKG_CHECK_MODULES in a single macro. ++AC_DEFUN([PKG_WITH_MODULES], ++[ ++m4_pushdef([with_arg], m4_tolower([$1])) ++ ++m4_pushdef([description], ++ [m4_default([$5], [build with ]with_arg[ support])]) ++ ++m4_pushdef([def_arg], [m4_default([$6], [auto])]) ++m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) ++m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) ++ ++m4_case(def_arg, ++ [yes],[m4_pushdef([with_without], [--without-]with_arg)], ++ [m4_pushdef([with_without],[--with-]with_arg)]) ++ ++AC_ARG_WITH(with_arg, ++ AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, ++ [AS_TR_SH([with_]with_arg)=def_arg]) ++ ++AS_CASE([$AS_TR_SH([with_]with_arg)], ++ [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], ++ [auto],[PKG_CHECK_MODULES([$1],[$2], ++ [m4_n([def_action_if_found]) $3], ++ [m4_n([def_action_if_not_found]) $4])]) ++ ++m4_popdef([with_arg]) ++m4_popdef([description]) ++m4_popdef([def_arg]) ++ ++])dnl PKG_WITH_MODULES ++ ++dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, ++dnl [DESCRIPTION], [DEFAULT]) ++dnl ----------------------------------------------- ++dnl ++dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES ++dnl check._[VARIABLE-PREFIX] is exported as make variable. ++AC_DEFUN([PKG_HAVE_WITH_MODULES], ++[ ++PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) ++ ++AM_CONDITIONAL([HAVE_][$1], ++ [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) ++])dnl PKG_HAVE_WITH_MODULES ++ ++dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, ++dnl [DESCRIPTION], [DEFAULT]) ++dnl ------------------------------------------------------ ++dnl ++dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after ++dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make ++dnl and preprocessor variable. ++AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], ++[ ++PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) ++ ++AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], ++ [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) ++])dnl PKG_HAVE_DEFINE_WITH_MODULES ++ +diff --git a/configure b/configure +index 753f956469..02d882ed39 100755 +--- a/configure ++++ b/configure +@@ -630,7 +630,6 @@ OPENSSL_RPATH + OPENSSL_LDFLAGS + OPENSSL_LIBS + OPENSSL_INCLUDES +-PKG_CONFIG + ENSUREPIP + SRCDIRS + THREADHEADERS +@@ -662,6 +661,9 @@ DTRACE + TCLTK_LIBS + TCLTK_INCLUDES + LIBFFI_INCLUDEDIR ++PKG_CONFIG_LIBDIR ++PKG_CONFIG_PATH ++PKG_CONFIG + TZPATH + SHLIBS + CFLAGSFORSHARED +@@ -873,7 +875,10 @@ LDFLAGS + LIBS + CPPFLAGS + CPP +-PROFILE_TASK' ++PROFILE_TASK ++PKG_CONFIG ++PKG_CONFIG_PATH ++PKG_CONFIG_LIBDIR' + + + # Initialize some variables set by options. +@@ -1637,6 +1642,11 @@ Some influential environment variables: + CPP C preprocessor + PROFILE_TASK + Python args for PGO generation task ++ PKG_CONFIG path to pkg-config utility ++ PKG_CONFIG_PATH ++ directories to add to pkg-config's search path ++ PKG_CONFIG_LIBDIR ++ path overriding pkg-config's built-in search path + + Use these variables to override the choices made by `configure' or to help + it to find libraries and programs with nonstandard names/locations. +@@ -10542,7 +10552,126 @@ $as_echo "no" >&6; } + fi + + +-PKG_PROG_PKG_CONFIG ++ ++ ++ ++ ++ ++ ++ ++if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then ++ if test -n "$ac_tool_prefix"; then ++ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. ++set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++$as_echo_n "checking for $ac_word... " >&6; } ++if ${ac_cv_path_PKG_CONFIG+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ case $PKG_CONFIG in ++ [\\/]* | ?:[\\/]*) ++ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ++ ;; ++ *) ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" ++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++ done ++IFS=$as_save_IFS ++ ++ ;; ++esac ++fi ++PKG_CONFIG=$ac_cv_path_PKG_CONFIG ++if test -n "$PKG_CONFIG"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 ++$as_echo "$PKG_CONFIG" >&6; } ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++fi ++ ++ ++fi ++if test -z "$ac_cv_path_PKG_CONFIG"; then ++ ac_pt_PKG_CONFIG=$PKG_CONFIG ++ # Extract the first word of "pkg-config", so it can be a program name with args. ++set dummy pkg-config; ac_word=$2 ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 ++$as_echo_n "checking for $ac_word... " >&6; } ++if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : ++ $as_echo_n "(cached) " >&6 ++else ++ case $ac_pt_PKG_CONFIG in ++ [\\/]* | ?:[\\/]*) ++ ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ++ ;; ++ *) ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" ++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++ done ++IFS=$as_save_IFS ++ ++ ;; ++esac ++fi ++ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG ++if test -n "$ac_pt_PKG_CONFIG"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 ++$as_echo "$ac_pt_PKG_CONFIG" >&6; } ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++fi ++ ++ if test "x$ac_pt_PKG_CONFIG" = x; then ++ PKG_CONFIG="" ++ else ++ case $cross_compiling:$ac_tool_warned in ++yes:) ++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 ++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ++ac_tool_warned=yes ;; ++esac ++ PKG_CONFIG=$ac_pt_PKG_CONFIG ++ fi ++else ++ PKG_CONFIG="$ac_cv_path_PKG_CONFIG" ++fi ++ ++fi ++if test -n "$PKG_CONFIG"; then ++ _pkg_min_version=0.9.0 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 ++$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } ++ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++$as_echo "yes" >&6; } ++ else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++ PKG_CONFIG="" ++ fi ++fi + + # Check for use of the system expat library + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-system-expat" >&5 +-- +2.29.2.windows.2 + diff --git a/plugins/python-build/share/python-build/patches/3.10.0/Python-3.10.0/0002-bpo-45405-Prevent-internal-configure-error-when-runn.patch b/plugins/python-build/share/python-build/patches/3.10.0/Python-3.10.0/0002-bpo-45405-Prevent-internal-configure-error-when-runn.patch new file mode 100644 index 0000000..9ffe04d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.10.0/Python-3.10.0/0002-bpo-45405-Prevent-internal-configure-error-when-runn.patch @@ -0,0 +1,80 @@ +From c8ee4dc57dd995e96ef9af0a04957b61ae1a7ac9 Mon Sep 17 00:00:00 2001 +From: David Bohman +Date: Tue, 12 Oct 2021 17:10:26 -0700 +Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running + ``configure`` with recent versions of non-Apple clang. (#28845) + +Change the configure logic to function properly on macOS when the compiler +outputs a platform triplet for option --print-multiarch. + +Co-authored-by: Ned Deily +--- + .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ + configure | 8 +++++--- + configure.ac | 8 +++++--- + 3 files changed, 12 insertions(+), 6 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst + +diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +new file mode 100644 +index 0000000000..a2dc5bcc32 +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +@@ -0,0 +1,2 @@ ++Prevent ``internal configure error`` when running ``configure`` ++with recent versions of non-Apple clang. Patch by David Bohman. +diff --git a/configure b/configure +index cc37185068..f238470c17 100755 +--- a/configure ++++ b/configure +@@ -5226,9 +5226,6 @@ $as_echo "$as_me: + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 + $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } + cat >> conftest.c <&6; } + fi + rm -f conftest.c conftest.out + ++if test x$PLATFORM_TRIPLET != xdarwin; then ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null) ++fi ++ ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 +diff --git a/configure.ac b/configure.ac +index 3e6c07c279..dd68777b6a 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -717,9 +717,6 @@ then + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +-AC_SUBST(MULTIARCH) +- + AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) + cat >> conftest.c </dev/null) ++fi ++AC_SUBST(MULTIARCH) ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) +-- +2.29.2.windows.2 + diff --git a/plugins/python-build/share/python-build/patches/3.10.0/Python-3.10.0/0003-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.10.0/Python-3.10.0/0003-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.10.0/Python-3.10.0/0003-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.10.1/Python-3.10.1/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.10.1/Python-3.10.1/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.10.1/Python-3.10.1/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.10.10/Python-3.10.10/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.10.10/Python-3.10.10/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.10.10/Python-3.10.10/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.10.11/Python-3.10.11/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.10.11/Python-3.10.11/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.10.11/Python-3.10.11/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.10.12/Python-3.10.12/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.10.12/Python-3.10.12/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.10.12/Python-3.10.12/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.10.13/Python-3.10.13/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.10.13/Python-3.10.13/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.10.13/Python-3.10.13/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.10.14/Python-3.10.14/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.10.14/Python-3.10.14/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.10.14/Python-3.10.14/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.10.15/Python-3.10.15/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.10.15/Python-3.10.15/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.10.15/Python-3.10.15/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.10.16/Python-3.10.16/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.10.16/Python-3.10.16/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.10.16/Python-3.10.16/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.10.17/Python-3.10.17/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.10.17/Python-3.10.17/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.10.17/Python-3.10.17/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.10.18/Python-3.10.18/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.10.18/Python-3.10.18/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.10.18/Python-3.10.18/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.10.19/Python-3.10.19/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.10.19/Python-3.10.19/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.10.19/Python-3.10.19/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.10.2/Python-3.10.2/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.10.2/Python-3.10.2/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.10.2/Python-3.10.2/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.10.3/Python-3.10.3/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.10.3/Python-3.10.3/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.10.3/Python-3.10.3/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.10.4/Python-3.10.4/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.10.4/Python-3.10.4/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.10.4/Python-3.10.4/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.10.5/Python-3.10.5/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.10.5/Python-3.10.5/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.10.5/Python-3.10.5/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.10.6/Python-3.10.6/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.10.6/Python-3.10.6/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.10.6/Python-3.10.6/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.10.7/Python-3.10.7/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.10.7/Python-3.10.7/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.10.7/Python-3.10.7/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.10.8/Python-3.10.8/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.10.8/Python-3.10.8/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.10.8/Python-3.10.8/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.10.9/Python-3.10.9/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.10.9/Python-3.10.9/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.10.9/Python-3.10.9/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.11.0/Python-3.11.0/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.11.0/Python-3.11.0/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.11.0/Python-3.11.0/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.11.0/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch b/plugins/python-build/share/python-build/patches/3.11.0/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch new file mode 100644 index 0000000..e7088e5 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.11.0/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch @@ -0,0 +1,12 @@ +diff --git a/test/v3ext.c b/test/v3ext.c +index 7a240cd706..6cec6f1a9b 100644 +--- a/test/v3ext.c ++++ b/test/v3ext.c +@@ -15,6 +15,7 @@ + #include + #include "internal/nelem.h" + ++#include + #include "testutil.h" + + static const char *infile; diff --git a/plugins/python-build/share/python-build/patches/3.11.1/Python-3.11.1/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.11.1/Python-3.11.1/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.11.1/Python-3.11.1/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.11.10/Python-3.11.10/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.11.10/Python-3.11.10/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.11.10/Python-3.11.10/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.11.11/Python-3.11.11/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.11.11/Python-3.11.11/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.11.11/Python-3.11.11/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.11.12/Python-3.11.12/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.11.12/Python-3.11.12/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.11.12/Python-3.11.12/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.11.13/Python-3.11.13/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.11.13/Python-3.11.13/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.11.13/Python-3.11.13/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.11.14/Python-3.11.14/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.11.14/Python-3.11.14/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.11.14/Python-3.11.14/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.11.2/Python-3.11.2/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.11.2/Python-3.11.2/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.11.2/Python-3.11.2/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.11.3/Python-3.11.3/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.11.3/Python-3.11.3/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.11.3/Python-3.11.3/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.11.4/Python-3.11.4/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.11.4/Python-3.11.4/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.11.4/Python-3.11.4/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.11.5/Python-3.11.5/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.11.5/Python-3.11.5/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.11.5/Python-3.11.5/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.11.6/Python-3.11.6/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.11.6/Python-3.11.6/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.11.6/Python-3.11.6/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.11.7/Python-3.11.7/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.11.7/Python-3.11.7/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.11.7/Python-3.11.7/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.11.8/Python-3.11.8/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.11.8/Python-3.11.8/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.11.8/Python-3.11.8/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.11.9/Python-3.11.9/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.11.9/Python-3.11.9/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.11.9/Python-3.11.9/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.2.0/Python-3.2/000_patch-setup.py.diff b/plugins/python-build/share/python-build/patches/3.2.0/Python-3.2/000_patch-setup.py.diff new file mode 100644 index 0000000..f4c361e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.2.0/Python-3.2/000_patch-setup.py.diff @@ -0,0 +1,38 @@ +--- setup.py.orig 2011-07-07 20:26:15.000000000 +0900 ++++ setup.py 2011-07-07 20:29:28.735543350 +0900 +@@ -370,12 +370,35 @@ + return platform + return sys.platform + ++ def add_multiarch_paths(self): ++ # Debian/Ubuntu multiarch support. ++ # https://wiki.ubuntu.com/MultiarchSpec ++ if not find_executable('dpkg-architecture'): ++ return ++ tmpfile = os.path.join(self.build_temp, 'multiarch') ++ if not os.path.exists(self.build_temp): ++ os.makedirs(self.build_temp) ++ ret = os.system( ++ 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' % ++ tmpfile) ++ try: ++ if ret >> 8 == 0: ++ with open(tmpfile) as fp: ++ multiarch_path_component = fp.readline().strip() ++ add_dir_to_list(self.compiler.library_dirs, ++ '/usr/lib/' + multiarch_path_component) ++ add_dir_to_list(self.compiler.include_dirs, ++ '/usr/include/' + multiarch_path_component) ++ finally: ++ os.unlink(tmpfile) ++ + def detect_modules(self): + # Ensure that /usr/local is always used, but the local build + # directories (i.e. '.' and 'Include') must be first. See issue + # 10520. + add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') + add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') ++ self.add_multiarch_paths() + + # Add paths specified in the environment variables LDFLAGS and + # CPPFLAGS for header and library files. diff --git a/plugins/python-build/share/python-build/patches/3.2.0/Python-3.2/002_readline63.patch b/plugins/python-build/share/python-build/patches/3.2.0/Python-3.2/002_readline63.patch new file mode 100644 index 0000000..ed29626 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.2.0/Python-3.2/002_readline63.patch @@ -0,0 +1,70 @@ +diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 +@@ -231,8 +231,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -774,14 +773,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -819,7 +826,7 @@ + (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { + goto error; + } +- Py_XDECREF(r); r=NULL; ++ Py_CLEAR(r); + + if (0) { + error: +@@ -877,7 +884,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -936,12 +943,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/3.2.0/Python-3.2/010_ssl_no_ssl2_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.2.0/Python-3.2/010_ssl_no_ssl2_no_ssl3.patch new file mode 100644 index 0000000..1a3bb9a --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.2.0/Python-3.2/010_ssl_no_ssl2_no_ssl3.patch @@ -0,0 +1,100 @@ +diff -r -u ../Python-3.2.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.2.orig/Lib/ssl.py 2010-10-22 18:19:07.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-20 07:12:00.759323661 +0000 +@@ -62,23 +62,26 @@ + from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION + from _ssl import _SSLContext, SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import (PROTOCOL_SSLv2, PROTOCOL_SSLv3, PROTOCOL_SSLv23, +- PROTOCOL_TLSv1) +-from _ssl import OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1 +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import ( +- SSL_ERROR_ZERO_RETURN, +- SSL_ERROR_WANT_READ, +- SSL_ERROR_WANT_WRITE, +- SSL_ERROR_WANT_X509_LOOKUP, +- SSL_ERROR_SYSCALL, +- SSL_ERROR_SSL, +- SSL_ERROR_WANT_CONNECT, +- SSL_ERROR_EOF, +- SSL_ERROR_INVALID_ERROR_CODE, +- ) ++from _ssl import RAND_status, RAND_add ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ + from _ssl import HAS_SNI + ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} ++ + from socket import getnameinfo as _getnameinfo + from socket import error as socket_error + from socket import socket, AF_INET, SOCK_STREAM +@@ -518,7 +521,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.2.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.2.orig/Modules/_ssl.c 2011-01-29 11:31:20.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-20 07:10:38.285929662 +0000 +@@ -63,8 +63,12 @@ + }; + + enum py_ssl_version { ++#ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, ++#endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -1448,10 +1452,14 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + ctx = SSL_CTX_new(TLSv1_method()); ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + ctx = SSL_CTX_new(SSLv3_method()); ++#endif ++#ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + ctx = SSL_CTX_new(SSLv2_method()); ++#endif + else if (proto_version == PY_SSL_VERSION_SSL23) + ctx = SSL_CTX_new(SSLv23_method()); + else +@@ -2110,10 +2118,14 @@ + PY_SSL_CERT_REQUIRED); + + /* protocol versions */ ++#ifndef OPENSSL_NO_SSL2 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); ++#endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.2.1/Python-3.2.1/002_readline63.patch b/plugins/python-build/share/python-build/patches/3.2.1/Python-3.2.1/002_readline63.patch new file mode 100644 index 0000000..ed29626 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.2.1/Python-3.2.1/002_readline63.patch @@ -0,0 +1,70 @@ +diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 +@@ -231,8 +231,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -774,14 +773,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -819,7 +826,7 @@ + (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { + goto error; + } +- Py_XDECREF(r); r=NULL; ++ Py_CLEAR(r); + + if (0) { + error: +@@ -877,7 +884,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -936,12 +943,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/3.2.1/Python-3.2.1/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.2.1/Python-3.2.1/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..7e2d6b0 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.2.1/Python-3.2.1/010_ssl_no_ssl3.patch @@ -0,0 +1,101 @@ +diff -r -u ../Python-3.2.1.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.2.1.orig/Lib/ssl.py 2011-07-09 06:58:49.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-20 07:06:01.609146268 +0000 +@@ -62,32 +62,30 @@ + from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION + from _ssl import _SSLContext, SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1 +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import ( +- SSL_ERROR_ZERO_RETURN, +- SSL_ERROR_WANT_READ, +- SSL_ERROR_WANT_WRITE, +- SSL_ERROR_WANT_X509_LOOKUP, +- SSL_ERROR_SYSCALL, +- SSL_ERROR_SSL, +- SSL_ERROR_WANT_CONNECT, +- SSL_ERROR_EOF, +- SSL_ERROR_INVALID_ERROR_CODE, +- ) +-from _ssl import HAS_SNI +-from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++from _ssl import RAND_status, RAND_add + try: +- from _ssl import PROTOCOL_SSLv2 ++ from _ssl import RAND_egd + except ImportError: ++ # LibreSSL does not provide RAND_egd + pass +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ ++from _ssl import HAS_SNI ++ ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} ++ ++try: ++ _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 ++except NameError: ++ _SSLv2_IF_EXISTS = None + + from socket import getnameinfo as _getnameinfo + from socket import error as socket_error +@@ -545,7 +543,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.2.1.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.2.1.orig/Modules/_ssl.c 2011-07-09 06:58:54.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-20 07:04:34.878266042 +0000 +@@ -66,7 +66,9 @@ + #ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, + #endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3=1, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -1450,8 +1452,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + ctx = SSL_CTX_new(TLSv1_method()); ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + ctx = SSL_CTX_new(SSLv3_method()); ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + ctx = SSL_CTX_new(SSLv2_method()); +@@ -2118,8 +2122,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.2.2/Python-3.2.2/002_readline63.patch b/plugins/python-build/share/python-build/patches/3.2.2/Python-3.2.2/002_readline63.patch new file mode 100644 index 0000000..ed29626 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.2.2/Python-3.2.2/002_readline63.patch @@ -0,0 +1,70 @@ +diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 +@@ -231,8 +231,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -774,14 +773,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -819,7 +826,7 @@ + (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { + goto error; + } +- Py_XDECREF(r); r=NULL; ++ Py_CLEAR(r); + + if (0) { + error: +@@ -877,7 +884,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -936,12 +943,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/3.2.2/Python-3.2.2/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.2.2/Python-3.2.2/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..f8de55f --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.2.2/Python-3.2.2/010_ssl_no_ssl3.patch @@ -0,0 +1,102 @@ +diff -r -u ../Python-3.2.2.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.2.2.orig/Lib/ssl.py 2011-09-03 16:16:42.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-20 07:01:09.947260656 +0000 +@@ -62,34 +62,30 @@ + from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION + from _ssl import _SSLContext, SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1 +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import ( +- SSL_ERROR_ZERO_RETURN, +- SSL_ERROR_WANT_READ, +- SSL_ERROR_WANT_WRITE, +- SSL_ERROR_WANT_X509_LOOKUP, +- SSL_ERROR_SYSCALL, +- SSL_ERROR_SSL, +- SSL_ERROR_WANT_CONNECT, +- SSL_ERROR_EOF, +- SSL_ERROR_INVALID_ERROR_CODE, +- ) ++from _ssl import RAND_status, RAND_add ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ + from _ssl import HAS_SNI +-from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 + from _ssl import _OPENSSL_API_VERSION + +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + try: +- from _ssl import PROTOCOL_SSLv2 +-except ImportError: +- pass +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" ++ _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 ++except NameError: ++ _SSLv2_IF_EXISTS = None + + from socket import getnameinfo as _getnameinfo + from socket import error as socket_error +@@ -547,7 +543,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.2.2.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.2.2.orig/Modules/_ssl.c 2011-09-03 16:16:46.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-20 06:59:12.632993190 +0000 +@@ -66,7 +66,9 @@ + #ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, + #endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3=1, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -1450,8 +1452,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + ctx = SSL_CTX_new(TLSv1_method()); ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + ctx = SSL_CTX_new(SSLv3_method()); ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + ctx = SSL_CTX_new(SSLv2_method()); +@@ -2136,8 +2140,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.2.3/Python-3.2.3/002_readline63.patch b/plugins/python-build/share/python-build/patches/3.2.3/Python-3.2.3/002_readline63.patch new file mode 100644 index 0000000..ed29626 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.2.3/Python-3.2.3/002_readline63.patch @@ -0,0 +1,70 @@ +diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 +@@ -231,8 +231,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -774,14 +773,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -819,7 +826,7 @@ + (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { + goto error; + } +- Py_XDECREF(r); r=NULL; ++ Py_CLEAR(r); + + if (0) { + error: +@@ -877,7 +884,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -936,12 +943,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/3.2.3/Python-3.2.3/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.2.3/Python-3.2.3/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..11a9439 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.2.3/Python-3.2.3/010_ssl_no_ssl3.patch @@ -0,0 +1,100 @@ +diff -r -u ../Python-3.2.6.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.2.6.orig/Lib/ssl.py 2014-10-12 06:52:02.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-20 06:40:11.895384463 +0000 +@@ -62,35 +62,30 @@ + from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION + from _ssl import _SSLContext, SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1 + from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import ( +- SSL_ERROR_ZERO_RETURN, +- SSL_ERROR_WANT_READ, +- SSL_ERROR_WANT_WRITE, +- SSL_ERROR_WANT_X509_LOOKUP, +- SSL_ERROR_SYSCALL, +- SSL_ERROR_SSL, +- SSL_ERROR_WANT_CONNECT, +- SSL_ERROR_EOF, +- SSL_ERROR_INVALID_ERROR_CODE, +- ) ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ + from _ssl import HAS_SNI +-from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 + from _ssl import _OPENSSL_API_VERSION + +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + try: +- from _ssl import PROTOCOL_SSLv2 + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +-except ImportError: ++except NameError: + _SSLv2_IF_EXISTS = None +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + + from socket import getnameinfo as _getnameinfo + from socket import error as socket_error +@@ -557,7 +552,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.2.6.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.2.6.orig/Modules/_ssl.c 2014-10-12 06:52:03.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-20 06:37:10.124337227 +0000 +@@ -66,7 +66,9 @@ + #ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, + #endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3=1, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -1512,8 +1514,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + ctx = SSL_CTX_new(TLSv1_method()); ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + ctx = SSL_CTX_new(SSLv3_method()); ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + ctx = SSL_CTX_new(SSLv2_method()); +@@ -2199,8 +2203,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.2.4/Python-3.2.4/002_readline63.patch b/plugins/python-build/share/python-build/patches/3.2.4/Python-3.2.4/002_readline63.patch new file mode 100644 index 0000000..ed29626 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.2.4/Python-3.2.4/002_readline63.patch @@ -0,0 +1,70 @@ +diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 +@@ -231,8 +231,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -774,14 +773,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -819,7 +826,7 @@ + (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { + goto error; + } +- Py_XDECREF(r); r=NULL; ++ Py_CLEAR(r); + + if (0) { + error: +@@ -877,7 +884,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -936,12 +943,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/3.2.4/Python-3.2.4/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.2.4/Python-3.2.4/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..11a9439 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.2.4/Python-3.2.4/010_ssl_no_ssl3.patch @@ -0,0 +1,100 @@ +diff -r -u ../Python-3.2.6.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.2.6.orig/Lib/ssl.py 2014-10-12 06:52:02.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-20 06:40:11.895384463 +0000 +@@ -62,35 +62,30 @@ + from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION + from _ssl import _SSLContext, SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1 + from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import ( +- SSL_ERROR_ZERO_RETURN, +- SSL_ERROR_WANT_READ, +- SSL_ERROR_WANT_WRITE, +- SSL_ERROR_WANT_X509_LOOKUP, +- SSL_ERROR_SYSCALL, +- SSL_ERROR_SSL, +- SSL_ERROR_WANT_CONNECT, +- SSL_ERROR_EOF, +- SSL_ERROR_INVALID_ERROR_CODE, +- ) ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ + from _ssl import HAS_SNI +-from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 + from _ssl import _OPENSSL_API_VERSION + +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + try: +- from _ssl import PROTOCOL_SSLv2 + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +-except ImportError: ++except NameError: + _SSLv2_IF_EXISTS = None +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + + from socket import getnameinfo as _getnameinfo + from socket import error as socket_error +@@ -557,7 +552,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.2.6.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.2.6.orig/Modules/_ssl.c 2014-10-12 06:52:03.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-20 06:37:10.124337227 +0000 +@@ -66,7 +66,9 @@ + #ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, + #endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3=1, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -1512,8 +1514,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + ctx = SSL_CTX_new(TLSv1_method()); ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + ctx = SSL_CTX_new(SSLv3_method()); ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + ctx = SSL_CTX_new(SSLv2_method()); +@@ -2199,8 +2203,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.2.5/Python-3.2.5/002_readline63.patch b/plugins/python-build/share/python-build/patches/3.2.5/Python-3.2.5/002_readline63.patch new file mode 100644 index 0000000..ed29626 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.2.5/Python-3.2.5/002_readline63.patch @@ -0,0 +1,70 @@ +diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 +@@ -231,8 +231,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -774,14 +773,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -819,7 +826,7 @@ + (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { + goto error; + } +- Py_XDECREF(r); r=NULL; ++ Py_CLEAR(r); + + if (0) { + error: +@@ -877,7 +884,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -936,12 +943,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/3.2.5/Python-3.2.5/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.2.5/Python-3.2.5/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..11a9439 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.2.5/Python-3.2.5/010_ssl_no_ssl3.patch @@ -0,0 +1,100 @@ +diff -r -u ../Python-3.2.6.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.2.6.orig/Lib/ssl.py 2014-10-12 06:52:02.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-20 06:40:11.895384463 +0000 +@@ -62,35 +62,30 @@ + from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION + from _ssl import _SSLContext, SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1 + from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import ( +- SSL_ERROR_ZERO_RETURN, +- SSL_ERROR_WANT_READ, +- SSL_ERROR_WANT_WRITE, +- SSL_ERROR_WANT_X509_LOOKUP, +- SSL_ERROR_SYSCALL, +- SSL_ERROR_SSL, +- SSL_ERROR_WANT_CONNECT, +- SSL_ERROR_EOF, +- SSL_ERROR_INVALID_ERROR_CODE, +- ) ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ + from _ssl import HAS_SNI +-from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 + from _ssl import _OPENSSL_API_VERSION + +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + try: +- from _ssl import PROTOCOL_SSLv2 + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +-except ImportError: ++except NameError: + _SSLv2_IF_EXISTS = None +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + + from socket import getnameinfo as _getnameinfo + from socket import error as socket_error +@@ -557,7 +552,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.2.6.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.2.6.orig/Modules/_ssl.c 2014-10-12 06:52:03.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-20 06:37:10.124337227 +0000 +@@ -66,7 +66,9 @@ + #ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, + #endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3=1, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -1512,8 +1514,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + ctx = SSL_CTX_new(TLSv1_method()); ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + ctx = SSL_CTX_new(SSLv3_method()); ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + ctx = SSL_CTX_new(SSLv2_method()); +@@ -2199,8 +2203,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.2.6/Python-3.2.6/002_readline63.patch b/plugins/python-build/share/python-build/patches/3.2.6/Python-3.2.6/002_readline63.patch new file mode 100644 index 0000000..ed29626 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.2.6/Python-3.2.6/002_readline63.patch @@ -0,0 +1,70 @@ +diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 +@@ -231,8 +231,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -774,14 +773,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -819,7 +826,7 @@ + (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { + goto error; + } +- Py_XDECREF(r); r=NULL; ++ Py_CLEAR(r); + + if (0) { + error: +@@ -877,7 +884,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -936,12 +943,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/3.2.6/Python-3.2.6/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.2.6/Python-3.2.6/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..11a9439 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.2.6/Python-3.2.6/010_ssl_no_ssl3.patch @@ -0,0 +1,100 @@ +diff -r -u ../Python-3.2.6.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.2.6.orig/Lib/ssl.py 2014-10-12 06:52:02.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-20 06:40:11.895384463 +0000 +@@ -62,35 +62,30 @@ + from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION + from _ssl import _SSLContext, SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1 + from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import ( +- SSL_ERROR_ZERO_RETURN, +- SSL_ERROR_WANT_READ, +- SSL_ERROR_WANT_WRITE, +- SSL_ERROR_WANT_X509_LOOKUP, +- SSL_ERROR_SYSCALL, +- SSL_ERROR_SSL, +- SSL_ERROR_WANT_CONNECT, +- SSL_ERROR_EOF, +- SSL_ERROR_INVALID_ERROR_CODE, +- ) ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ + from _ssl import HAS_SNI +-from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 + from _ssl import _OPENSSL_API_VERSION + +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + try: +- from _ssl import PROTOCOL_SSLv2 + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +-except ImportError: ++except NameError: + _SSLv2_IF_EXISTS = None +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + + from socket import getnameinfo as _getnameinfo + from socket import error as socket_error +@@ -557,7 +552,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.2.6.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.2.6.orig/Modules/_ssl.c 2014-10-12 06:52:03.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-20 06:37:10.124337227 +0000 +@@ -66,7 +66,9 @@ + #ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, + #endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3=1, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -1512,8 +1514,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + ctx = SSL_CTX_new(TLSv1_method()); ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + ctx = SSL_CTX_new(SSLv3_method()); ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + ctx = SSL_CTX_new(SSLv2_method()); +@@ -2199,8 +2203,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.3.0/Python-3.3.0/002_readline63.patch b/plugins/python-build/share/python-build/patches/3.3.0/Python-3.3.0/002_readline63.patch new file mode 100644 index 0000000..ed29626 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.3.0/Python-3.3.0/002_readline63.patch @@ -0,0 +1,70 @@ +diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 +@@ -231,8 +231,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -774,14 +773,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -819,7 +826,7 @@ + (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { + goto error; + } +- Py_XDECREF(r); r=NULL; ++ Py_CLEAR(r); + + if (0) { + error: +@@ -877,7 +884,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -936,12 +943,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/3.3.0/Python-3.3.0/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.3.0/Python-3.3.0/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..44d321e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.3.0/Python-3.3.0/010_ssl_no_ssl3.patch @@ -0,0 +1,102 @@ +diff -r -u ../Python-3.3.6.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.3.6.orig/Lib/ssl.py 2014-10-12 07:03:53.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-20 06:43:59.175134734 +0000 +@@ -66,47 +66,32 @@ + SSLSyscallError, SSLEOFError, + ) + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import ( +- OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1, +- OP_CIPHER_SERVER_PREFERENCE, OP_SINGLE_DH_USE +- ) +-try: +- from _ssl import OP_NO_COMPRESSION +-except ImportError: +- pass ++from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes + try: +- from _ssl import OP_SINGLE_ECDH_USE ++ from _ssl import RAND_egd + except ImportError: ++ # LibreSSL does not provide RAND_egd + pass +-from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes +-from _ssl import ( +- SSL_ERROR_ZERO_RETURN, +- SSL_ERROR_WANT_READ, +- SSL_ERROR_WANT_WRITE, +- SSL_ERROR_WANT_X509_LOOKUP, +- SSL_ERROR_SYSCALL, +- SSL_ERROR_SSL, +- SSL_ERROR_WANT_CONNECT, +- SSL_ERROR_EOF, +- SSL_ERROR_INVALID_ERROR_CODE, +- ) ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ + from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN +-from _ssl import (PROTOCOL_SSLv3, PROTOCOL_SSLv23, +- PROTOCOL_TLSv1) ++ + from _ssl import _OPENSSL_API_VERSION + +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} ++ + try: +- from _ssl import PROTOCOL_SSLv2 + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +-except ImportError: ++except NameError: + _SSLv2_IF_EXISTS = None +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + + from socket import getnameinfo as _getnameinfo + from socket import error as socket_error +@@ -664,7 +649,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.3.6.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.3.6.orig/Modules/_ssl.c 2014-10-12 07:03:53.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-20 06:42:45.773667904 +0000 +@@ -1746,8 +1746,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + ctx = SSL_CTX_new(TLSv1_method()); ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + ctx = SSL_CTX_new(SSLv3_method()); ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + ctx = SSL_CTX_new(SSLv2_method()); +@@ -2842,8 +2844,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.3.1/Python-3.3.1/002_readline63.patch b/plugins/python-build/share/python-build/patches/3.3.1/Python-3.3.1/002_readline63.patch new file mode 100644 index 0000000..ed29626 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.3.1/Python-3.3.1/002_readline63.patch @@ -0,0 +1,70 @@ +diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 +@@ -231,8 +231,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -774,14 +773,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -819,7 +826,7 @@ + (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { + goto error; + } +- Py_XDECREF(r); r=NULL; ++ Py_CLEAR(r); + + if (0) { + error: +@@ -877,7 +884,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -936,12 +943,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/3.3.1/Python-3.3.1/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.3.1/Python-3.3.1/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..44d321e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.3.1/Python-3.3.1/010_ssl_no_ssl3.patch @@ -0,0 +1,102 @@ +diff -r -u ../Python-3.3.6.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.3.6.orig/Lib/ssl.py 2014-10-12 07:03:53.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-20 06:43:59.175134734 +0000 +@@ -66,47 +66,32 @@ + SSLSyscallError, SSLEOFError, + ) + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import ( +- OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1, +- OP_CIPHER_SERVER_PREFERENCE, OP_SINGLE_DH_USE +- ) +-try: +- from _ssl import OP_NO_COMPRESSION +-except ImportError: +- pass ++from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes + try: +- from _ssl import OP_SINGLE_ECDH_USE ++ from _ssl import RAND_egd + except ImportError: ++ # LibreSSL does not provide RAND_egd + pass +-from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes +-from _ssl import ( +- SSL_ERROR_ZERO_RETURN, +- SSL_ERROR_WANT_READ, +- SSL_ERROR_WANT_WRITE, +- SSL_ERROR_WANT_X509_LOOKUP, +- SSL_ERROR_SYSCALL, +- SSL_ERROR_SSL, +- SSL_ERROR_WANT_CONNECT, +- SSL_ERROR_EOF, +- SSL_ERROR_INVALID_ERROR_CODE, +- ) ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ + from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN +-from _ssl import (PROTOCOL_SSLv3, PROTOCOL_SSLv23, +- PROTOCOL_TLSv1) ++ + from _ssl import _OPENSSL_API_VERSION + +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} ++ + try: +- from _ssl import PROTOCOL_SSLv2 + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +-except ImportError: ++except NameError: + _SSLv2_IF_EXISTS = None +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + + from socket import getnameinfo as _getnameinfo + from socket import error as socket_error +@@ -664,7 +649,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.3.6.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.3.6.orig/Modules/_ssl.c 2014-10-12 07:03:53.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-20 06:42:45.773667904 +0000 +@@ -1746,8 +1746,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + ctx = SSL_CTX_new(TLSv1_method()); ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + ctx = SSL_CTX_new(SSLv3_method()); ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + ctx = SSL_CTX_new(SSLv2_method()); +@@ -2842,8 +2844,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.3.2/Python-3.3.2/002_readline63.patch b/plugins/python-build/share/python-build/patches/3.3.2/Python-3.3.2/002_readline63.patch new file mode 100644 index 0000000..ed29626 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.3.2/Python-3.3.2/002_readline63.patch @@ -0,0 +1,70 @@ +diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 +@@ -231,8 +231,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -774,14 +773,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -819,7 +826,7 @@ + (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { + goto error; + } +- Py_XDECREF(r); r=NULL; ++ Py_CLEAR(r); + + if (0) { + error: +@@ -877,7 +884,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -936,12 +943,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/3.3.2/Python-3.3.2/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.3.2/Python-3.3.2/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..44d321e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.3.2/Python-3.3.2/010_ssl_no_ssl3.patch @@ -0,0 +1,102 @@ +diff -r -u ../Python-3.3.6.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.3.6.orig/Lib/ssl.py 2014-10-12 07:03:53.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-20 06:43:59.175134734 +0000 +@@ -66,47 +66,32 @@ + SSLSyscallError, SSLEOFError, + ) + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import ( +- OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1, +- OP_CIPHER_SERVER_PREFERENCE, OP_SINGLE_DH_USE +- ) +-try: +- from _ssl import OP_NO_COMPRESSION +-except ImportError: +- pass ++from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes + try: +- from _ssl import OP_SINGLE_ECDH_USE ++ from _ssl import RAND_egd + except ImportError: ++ # LibreSSL does not provide RAND_egd + pass +-from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes +-from _ssl import ( +- SSL_ERROR_ZERO_RETURN, +- SSL_ERROR_WANT_READ, +- SSL_ERROR_WANT_WRITE, +- SSL_ERROR_WANT_X509_LOOKUP, +- SSL_ERROR_SYSCALL, +- SSL_ERROR_SSL, +- SSL_ERROR_WANT_CONNECT, +- SSL_ERROR_EOF, +- SSL_ERROR_INVALID_ERROR_CODE, +- ) ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ + from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN +-from _ssl import (PROTOCOL_SSLv3, PROTOCOL_SSLv23, +- PROTOCOL_TLSv1) ++ + from _ssl import _OPENSSL_API_VERSION + +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} ++ + try: +- from _ssl import PROTOCOL_SSLv2 + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +-except ImportError: ++except NameError: + _SSLv2_IF_EXISTS = None +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + + from socket import getnameinfo as _getnameinfo + from socket import error as socket_error +@@ -664,7 +649,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.3.6.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.3.6.orig/Modules/_ssl.c 2014-10-12 07:03:53.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-20 06:42:45.773667904 +0000 +@@ -1746,8 +1746,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + ctx = SSL_CTX_new(TLSv1_method()); ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + ctx = SSL_CTX_new(SSLv3_method()); ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + ctx = SSL_CTX_new(SSLv2_method()); +@@ -2842,8 +2844,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.3.3/Python-3.3.3/002_readline63.patch b/plugins/python-build/share/python-build/patches/3.3.3/Python-3.3.3/002_readline63.patch new file mode 100644 index 0000000..ed29626 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.3.3/Python-3.3.3/002_readline63.patch @@ -0,0 +1,70 @@ +diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 +@@ -231,8 +231,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -774,14 +773,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -819,7 +826,7 @@ + (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { + goto error; + } +- Py_XDECREF(r); r=NULL; ++ Py_CLEAR(r); + + if (0) { + error: +@@ -877,7 +884,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -936,12 +943,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/3.3.3/Python-3.3.3/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.3.3/Python-3.3.3/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..44d321e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.3.3/Python-3.3.3/010_ssl_no_ssl3.patch @@ -0,0 +1,102 @@ +diff -r -u ../Python-3.3.6.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.3.6.orig/Lib/ssl.py 2014-10-12 07:03:53.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-20 06:43:59.175134734 +0000 +@@ -66,47 +66,32 @@ + SSLSyscallError, SSLEOFError, + ) + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import ( +- OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1, +- OP_CIPHER_SERVER_PREFERENCE, OP_SINGLE_DH_USE +- ) +-try: +- from _ssl import OP_NO_COMPRESSION +-except ImportError: +- pass ++from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes + try: +- from _ssl import OP_SINGLE_ECDH_USE ++ from _ssl import RAND_egd + except ImportError: ++ # LibreSSL does not provide RAND_egd + pass +-from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes +-from _ssl import ( +- SSL_ERROR_ZERO_RETURN, +- SSL_ERROR_WANT_READ, +- SSL_ERROR_WANT_WRITE, +- SSL_ERROR_WANT_X509_LOOKUP, +- SSL_ERROR_SYSCALL, +- SSL_ERROR_SSL, +- SSL_ERROR_WANT_CONNECT, +- SSL_ERROR_EOF, +- SSL_ERROR_INVALID_ERROR_CODE, +- ) ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ + from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN +-from _ssl import (PROTOCOL_SSLv3, PROTOCOL_SSLv23, +- PROTOCOL_TLSv1) ++ + from _ssl import _OPENSSL_API_VERSION + +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} ++ + try: +- from _ssl import PROTOCOL_SSLv2 + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +-except ImportError: ++except NameError: + _SSLv2_IF_EXISTS = None +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + + from socket import getnameinfo as _getnameinfo + from socket import error as socket_error +@@ -664,7 +649,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.3.6.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.3.6.orig/Modules/_ssl.c 2014-10-12 07:03:53.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-20 06:42:45.773667904 +0000 +@@ -1746,8 +1746,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + ctx = SSL_CTX_new(TLSv1_method()); ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + ctx = SSL_CTX_new(SSLv3_method()); ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + ctx = SSL_CTX_new(SSLv2_method()); +@@ -2842,8 +2844,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.3.4/Python-3.3.4/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.3.4/Python-3.3.4/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..44d321e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.3.4/Python-3.3.4/010_ssl_no_ssl3.patch @@ -0,0 +1,102 @@ +diff -r -u ../Python-3.3.6.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.3.6.orig/Lib/ssl.py 2014-10-12 07:03:53.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-20 06:43:59.175134734 +0000 +@@ -66,47 +66,32 @@ + SSLSyscallError, SSLEOFError, + ) + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import ( +- OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1, +- OP_CIPHER_SERVER_PREFERENCE, OP_SINGLE_DH_USE +- ) +-try: +- from _ssl import OP_NO_COMPRESSION +-except ImportError: +- pass ++from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes + try: +- from _ssl import OP_SINGLE_ECDH_USE ++ from _ssl import RAND_egd + except ImportError: ++ # LibreSSL does not provide RAND_egd + pass +-from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes +-from _ssl import ( +- SSL_ERROR_ZERO_RETURN, +- SSL_ERROR_WANT_READ, +- SSL_ERROR_WANT_WRITE, +- SSL_ERROR_WANT_X509_LOOKUP, +- SSL_ERROR_SYSCALL, +- SSL_ERROR_SSL, +- SSL_ERROR_WANT_CONNECT, +- SSL_ERROR_EOF, +- SSL_ERROR_INVALID_ERROR_CODE, +- ) ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ + from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN +-from _ssl import (PROTOCOL_SSLv3, PROTOCOL_SSLv23, +- PROTOCOL_TLSv1) ++ + from _ssl import _OPENSSL_API_VERSION + +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} ++ + try: +- from _ssl import PROTOCOL_SSLv2 + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +-except ImportError: ++except NameError: + _SSLv2_IF_EXISTS = None +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + + from socket import getnameinfo as _getnameinfo + from socket import error as socket_error +@@ -664,7 +649,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.3.6.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.3.6.orig/Modules/_ssl.c 2014-10-12 07:03:53.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-20 06:42:45.773667904 +0000 +@@ -1746,8 +1746,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + ctx = SSL_CTX_new(TLSv1_method()); ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + ctx = SSL_CTX_new(SSLv3_method()); ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + ctx = SSL_CTX_new(SSLv2_method()); +@@ -2842,8 +2844,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.3.5/Python-3.3.5/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.3.5/Python-3.3.5/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..44d321e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.3.5/Python-3.3.5/010_ssl_no_ssl3.patch @@ -0,0 +1,102 @@ +diff -r -u ../Python-3.3.6.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.3.6.orig/Lib/ssl.py 2014-10-12 07:03:53.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-20 06:43:59.175134734 +0000 +@@ -66,47 +66,32 @@ + SSLSyscallError, SSLEOFError, + ) + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import ( +- OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1, +- OP_CIPHER_SERVER_PREFERENCE, OP_SINGLE_DH_USE +- ) +-try: +- from _ssl import OP_NO_COMPRESSION +-except ImportError: +- pass ++from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes + try: +- from _ssl import OP_SINGLE_ECDH_USE ++ from _ssl import RAND_egd + except ImportError: ++ # LibreSSL does not provide RAND_egd + pass +-from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes +-from _ssl import ( +- SSL_ERROR_ZERO_RETURN, +- SSL_ERROR_WANT_READ, +- SSL_ERROR_WANT_WRITE, +- SSL_ERROR_WANT_X509_LOOKUP, +- SSL_ERROR_SYSCALL, +- SSL_ERROR_SSL, +- SSL_ERROR_WANT_CONNECT, +- SSL_ERROR_EOF, +- SSL_ERROR_INVALID_ERROR_CODE, +- ) ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ + from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN +-from _ssl import (PROTOCOL_SSLv3, PROTOCOL_SSLv23, +- PROTOCOL_TLSv1) ++ + from _ssl import _OPENSSL_API_VERSION + +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} ++ + try: +- from _ssl import PROTOCOL_SSLv2 + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +-except ImportError: ++except NameError: + _SSLv2_IF_EXISTS = None +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + + from socket import getnameinfo as _getnameinfo + from socket import error as socket_error +@@ -664,7 +649,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.3.6.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.3.6.orig/Modules/_ssl.c 2014-10-12 07:03:53.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-20 06:42:45.773667904 +0000 +@@ -1746,8 +1746,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + ctx = SSL_CTX_new(TLSv1_method()); ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + ctx = SSL_CTX_new(SSLv3_method()); ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + ctx = SSL_CTX_new(SSLv2_method()); +@@ -2842,8 +2844,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.3.6/Python-3.3.6/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.3.6/Python-3.3.6/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..44d321e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.3.6/Python-3.3.6/010_ssl_no_ssl3.patch @@ -0,0 +1,102 @@ +diff -r -u ../Python-3.3.6.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.3.6.orig/Lib/ssl.py 2014-10-12 07:03:53.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-20 06:43:59.175134734 +0000 +@@ -66,47 +66,32 @@ + SSLSyscallError, SSLEOFError, + ) + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import ( +- OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1, +- OP_CIPHER_SERVER_PREFERENCE, OP_SINGLE_DH_USE +- ) +-try: +- from _ssl import OP_NO_COMPRESSION +-except ImportError: +- pass ++from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes + try: +- from _ssl import OP_SINGLE_ECDH_USE ++ from _ssl import RAND_egd + except ImportError: ++ # LibreSSL does not provide RAND_egd + pass +-from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes +-from _ssl import ( +- SSL_ERROR_ZERO_RETURN, +- SSL_ERROR_WANT_READ, +- SSL_ERROR_WANT_WRITE, +- SSL_ERROR_WANT_X509_LOOKUP, +- SSL_ERROR_SYSCALL, +- SSL_ERROR_SSL, +- SSL_ERROR_WANT_CONNECT, +- SSL_ERROR_EOF, +- SSL_ERROR_INVALID_ERROR_CODE, +- ) ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ + from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN +-from _ssl import (PROTOCOL_SSLv3, PROTOCOL_SSLv23, +- PROTOCOL_TLSv1) ++ + from _ssl import _OPENSSL_API_VERSION + +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} ++ + try: +- from _ssl import PROTOCOL_SSLv2 + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +-except ImportError: ++except NameError: + _SSLv2_IF_EXISTS = None +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + + from socket import getnameinfo as _getnameinfo + from socket import error as socket_error +@@ -664,7 +649,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.3.6.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.3.6.orig/Modules/_ssl.c 2014-10-12 07:03:53.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-20 06:42:45.773667904 +0000 +@@ -1746,8 +1746,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + ctx = SSL_CTX_new(TLSv1_method()); ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + ctx = SSL_CTX_new(SSLv3_method()); ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + ctx = SSL_CTX_new(SSLv2_method()); +@@ -2842,8 +2844,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.3.7/Python-3.3.7/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.3.7/Python-3.3.7/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..44d321e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.3.7/Python-3.3.7/010_ssl_no_ssl3.patch @@ -0,0 +1,102 @@ +diff -r -u ../Python-3.3.6.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.3.6.orig/Lib/ssl.py 2014-10-12 07:03:53.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-20 06:43:59.175134734 +0000 +@@ -66,47 +66,32 @@ + SSLSyscallError, SSLEOFError, + ) + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import ( +- OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1, +- OP_CIPHER_SERVER_PREFERENCE, OP_SINGLE_DH_USE +- ) +-try: +- from _ssl import OP_NO_COMPRESSION +-except ImportError: +- pass ++from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes + try: +- from _ssl import OP_SINGLE_ECDH_USE ++ from _ssl import RAND_egd + except ImportError: ++ # LibreSSL does not provide RAND_egd + pass +-from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes +-from _ssl import ( +- SSL_ERROR_ZERO_RETURN, +- SSL_ERROR_WANT_READ, +- SSL_ERROR_WANT_WRITE, +- SSL_ERROR_WANT_X509_LOOKUP, +- SSL_ERROR_SYSCALL, +- SSL_ERROR_SSL, +- SSL_ERROR_WANT_CONNECT, +- SSL_ERROR_EOF, +- SSL_ERROR_INVALID_ERROR_CODE, +- ) ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ + from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN +-from _ssl import (PROTOCOL_SSLv3, PROTOCOL_SSLv23, +- PROTOCOL_TLSv1) ++ + from _ssl import _OPENSSL_API_VERSION + +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} ++ + try: +- from _ssl import PROTOCOL_SSLv2 + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +-except ImportError: ++except NameError: + _SSLv2_IF_EXISTS = None +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + + from socket import getnameinfo as _getnameinfo + from socket import error as socket_error +@@ -664,7 +649,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.3.6.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.3.6.orig/Modules/_ssl.c 2014-10-12 07:03:53.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-20 06:42:45.773667904 +0000 +@@ -1746,8 +1746,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + ctx = SSL_CTX_new(TLSv1_method()); ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + ctx = SSL_CTX_new(SSLv3_method()); ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + ctx = SSL_CTX_new(SSLv2_method()); +@@ -2842,8 +2844,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.4.0/Python-3.4.0/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.4.0/Python-3.4.0/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..f66fa46 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.4.0/Python-3.4.0/010_ssl_no_ssl3.patch @@ -0,0 +1,72 @@ +diff -r -u ../Python-3.4.2.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.4.2.orig/Lib/ssl.py 2014-10-08 08:18:12.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-18 13:34:24.530051626 +0000 +@@ -106,7 +106,12 @@ + from _ssl import (VERIFY_DEFAULT, VERIFY_CRL_CHECK_LEAF, VERIFY_CRL_CHECK_CHAIN, + VERIFY_X509_STRICT) + from _ssl import txt2obj as _txt2obj, nid2obj as _nid2obj +-from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes ++from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass + + def _import_symbols(prefix): + for n in dir(_ssl): +@@ -116,18 +121,14 @@ + _import_symbols('OP_') + _import_symbols('ALERT_DESCRIPTION_') + _import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') + + from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN + +-from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 + from _ssl import _OPENSSL_API_VERSION + + +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + try: + from _ssl import PROTOCOL_SSLv2 + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +@@ -922,7 +923,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.4.2.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.4.2.orig/Modules/_ssl.c 2014-10-08 08:18:15.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-18 13:32:44.967611074 +0000 +@@ -2016,8 +2016,10 @@ + else if (proto_version == PY_SSL_VERSION_TLS1_2) + ctx = SSL_CTX_new(TLSv1_2_method()); + #endif ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + ctx = SSL_CTX_new(SSLv3_method()); ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + ctx = SSL_CTX_new(SSLv2_method()); +@@ -4071,8 +4073,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.4.1/Python-3.4.1/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.4.1/Python-3.4.1/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..f66fa46 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.4.1/Python-3.4.1/010_ssl_no_ssl3.patch @@ -0,0 +1,72 @@ +diff -r -u ../Python-3.4.2.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.4.2.orig/Lib/ssl.py 2014-10-08 08:18:12.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-18 13:34:24.530051626 +0000 +@@ -106,7 +106,12 @@ + from _ssl import (VERIFY_DEFAULT, VERIFY_CRL_CHECK_LEAF, VERIFY_CRL_CHECK_CHAIN, + VERIFY_X509_STRICT) + from _ssl import txt2obj as _txt2obj, nid2obj as _nid2obj +-from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes ++from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass + + def _import_symbols(prefix): + for n in dir(_ssl): +@@ -116,18 +121,14 @@ + _import_symbols('OP_') + _import_symbols('ALERT_DESCRIPTION_') + _import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') + + from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN + +-from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 + from _ssl import _OPENSSL_API_VERSION + + +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + try: + from _ssl import PROTOCOL_SSLv2 + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +@@ -922,7 +923,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.4.2.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.4.2.orig/Modules/_ssl.c 2014-10-08 08:18:15.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-18 13:32:44.967611074 +0000 +@@ -2016,8 +2016,10 @@ + else if (proto_version == PY_SSL_VERSION_TLS1_2) + ctx = SSL_CTX_new(TLSv1_2_method()); + #endif ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + ctx = SSL_CTX_new(SSLv3_method()); ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + ctx = SSL_CTX_new(SSLv2_method()); +@@ -4071,8 +4073,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.4.2/Python-3.4.2/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/3.4.2/Python-3.4.2/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..f66fa46 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.4.2/Python-3.4.2/010_ssl_no_ssl3.patch @@ -0,0 +1,72 @@ +diff -r -u ../Python-3.4.2.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.4.2.orig/Lib/ssl.py 2014-10-08 08:18:12.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-18 13:34:24.530051626 +0000 +@@ -106,7 +106,12 @@ + from _ssl import (VERIFY_DEFAULT, VERIFY_CRL_CHECK_LEAF, VERIFY_CRL_CHECK_CHAIN, + VERIFY_X509_STRICT) + from _ssl import txt2obj as _txt2obj, nid2obj as _nid2obj +-from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes ++from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass + + def _import_symbols(prefix): + for n in dir(_ssl): +@@ -116,18 +121,14 @@ + _import_symbols('OP_') + _import_symbols('ALERT_DESCRIPTION_') + _import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') + + from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN + +-from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 + from _ssl import _OPENSSL_API_VERSION + + +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + try: + from _ssl import PROTOCOL_SSLv2 + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +@@ -922,7 +923,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.4.2.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.4.2.orig/Modules/_ssl.c 2014-10-08 08:18:15.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-18 13:32:44.967611074 +0000 +@@ -2016,8 +2016,10 @@ + else if (proto_version == PY_SSL_VERSION_TLS1_2) + ctx = SSL_CTX_new(TLSv1_2_method()); + #endif ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + ctx = SSL_CTX_new(SSLv3_method()); ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + ctx = SSL_CTX_new(SSLv2_method()); +@@ -4071,8 +4073,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0001-bpo-27987-pymalloc-align-by-16bytes-on-64bit-platfor.patch b/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0001-bpo-27987-pymalloc-align-by-16bytes-on-64bit-platfor.patch new file mode 100644 index 0000000..66a873c --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0001-bpo-27987-pymalloc-align-by-16bytes-on-64bit-platfor.patch @@ -0,0 +1,43 @@ +From 112cceb514e79b4c9805f9e5ea037a205be428da Mon Sep 17 00:00:00 2001 +From: Inada Naoki +Date: Tue, 14 May 2019 18:51:15 +0900 +Subject: [PATCH 1/2] bpo-27987: pymalloc: align by 16bytes on 64bit platform + (GH-12850) + +--- + .../2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst | 3 +++ + Objects/obmalloc.c | 6 ++++++ + 2 files changed, 9 insertions(+) + create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst + +diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst +new file mode 100644 +index 0000000000..b0f32a5c6c +--- /dev/null ++++ b/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst +@@ -0,0 +1,3 @@ ++pymalloc returns memory blocks aligned by 16 bytes, instead of 8 bytes, on ++64-bit platforms to conform x86-64 ABI. Recent compilers assume this alignment ++more often. Patch by Inada Naoki. +diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c +index 9dd8421a33..da9029c4a6 100644 +--- a/Objects/obmalloc.c ++++ b/Objects/obmalloc.c +@@ -540,8 +540,14 @@ static int running_on_valgrind = -1; + * + * You shouldn't change this unless you know what you are doing. + */ ++ ++#if SIZEOF_VOID_P > 4 ++#define ALIGNMENT 16 /* must be 2^N */ ++#define ALIGNMENT_SHIFT 4 ++#else + #define ALIGNMENT 8 /* must be 2^N */ + #define ALIGNMENT_SHIFT 3 ++#endif + + /* Return the number of bytes in size class I, as a uint. */ + #define INDEX2SIZE(I) (((uint)(I) + 1) << ALIGNMENT_SHIFT) +-- +2.38.4 + diff --git a/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0002-bpo-27987-align-PyGC_Head-to-alignof-long-double-GH-.patch b/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0002-bpo-27987-align-PyGC_Head-to-alignof-long-double-GH-.patch new file mode 100644 index 0000000..ace6e27 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0002-bpo-27987-align-PyGC_Head-to-alignof-long-double-GH-.patch @@ -0,0 +1,40 @@ +From 618ef35426ecc57da1bee50f8dc5896f5fb178a9 Mon Sep 17 00:00:00 2001 +From: Inada Naoki +Date: Sat, 25 May 2019 21:13:33 +0900 +Subject: [PATCH 2/2] bpo-27987: align PyGC_Head to alignof(long double) + (GH-13335) + +--- + Include/objimpl.h | 6 +++++- + .../2019-05-15-18-28-43.bpo-27987.FaxuLy.rst | 2 ++ + 2 files changed, 7 insertions(+), 1 deletion(-) + create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst + +diff --git a/Include/objimpl.h b/Include/objimpl.h +index 65b6d91c36..eaf57975c8 100644 +--- a/Include/objimpl.h ++++ b/Include/objimpl.h +@@ -250,7 +250,11 @@ typedef union _gc_head { + union _gc_head *gc_prev; + Py_ssize_t gc_refs; + } gc; +- double dummy; /* force worst-case alignment */ ++ long double dummy; /* force worst-case alignment */ ++ // malloc returns memory block aligned for any built-in types and ++ // long double is the largest standard C type. ++ // On amd64 linux, long double requires 16 byte alignment. ++ // See bpo-27987 for more discussion. + } PyGC_Head; + + extern PyGC_Head *_PyGC_generation0; +diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst +new file mode 100644 +index 0000000000..97ca37b262 +--- /dev/null ++++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst +@@ -0,0 +1,2 @@ ++``PyGC_Head`` structure is aligned to ``long double``. This is needed to ++GC-ed objects are aligned properly. Patch by Inada Naoki. +-- +2.38.4 + diff --git a/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0003-bpo-45405-Prevent-internal-configure-error-when-runn.patch b/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0003-bpo-45405-Prevent-internal-configure-error-when-runn.patch new file mode 100644 index 0000000..ccf192e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0003-bpo-45405-Prevent-internal-configure-error-when-runn.patch @@ -0,0 +1,86 @@ +From 655f26bb742d6bd32c388e9fea14b64eb25fd4de Mon Sep 17 00:00:00 2001 +From: Ned Deily +Date: Tue, 15 Mar 2022 03:18:39 -0400 +Subject: [PATCH] bpo-45405: Prevent internal configure error when running + configure with recent versions of clang. (GH-28845) (GH-31890) + +Change the configure logic to function properly on macOS when the compiler +outputs a platform triplet for option --print-multiarch. +The Apple Clang included with Xcode 13.3 now supports --print-multiarch +causing configure to fail without this change. + +Co-authored-by: Ned Deily +(cherry picked from commit 9c4766772cda67648184f8ddba546a5fc0167f91) + +Co-authored-by: David Bohman +(cherry picked from commit 720bb456dc711b0776bae837d1f9a0b10c28ddf2) +--- + .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ + configure | 8 +++++--- + configure.ac | 8 +++++--- + 3 files changed, 12 insertions(+), 6 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst + +diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +new file mode 100644 +index 0000000000..13c93d1b8a +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +@@ -0,0 +1,2 @@ ++Prevent ``internal configure error`` when running ``configure`` ++with recent versions of clang. Patch by David Bohman. +diff --git a/configure b/configure +index fb0a499145..67e6e69b5f 100755 +--- a/configure ++++ b/configure +@@ -5203,9 +5203,6 @@ $as_echo "$as_me: + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 + $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } + cat >> conftest.c <&6; } + fi + rm -f conftest.c conftest.out + ++if test x$PLATFORM_TRIPLET != xdarwin; then ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null) ++fi ++ ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 +diff --git a/configure.ac b/configure.ac +index d86dad9a7c..468ad6070f 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -747,9 +747,6 @@ then + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +-AC_SUBST(MULTIARCH) +- + AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) + cat >> conftest.c </dev/null) ++fi ++AC_SUBST(MULTIARCH) ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) +-- +2.32.0 (Apple Git-132) + diff --git a/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0004-Detect-arm64-in-configure.patch b/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0004-Detect-arm64-in-configure.patch new file mode 100644 index 0000000..d87123f --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0004-Detect-arm64-in-configure.patch @@ -0,0 +1,41 @@ +From 002501946bad91a308f37a09204393c172f03c3e Mon Sep 17 00:00:00 2001 +From: Takumi Sueda +Date: Sat, 11 Sep 2021 16:50:14 +0900 +Subject: [PATCH 2/6] Detect arm64 in configure + +--- + configure | 3 +++ + configure.ac | 3 +++ + 2 files changed, 6 insertions(+) + +diff --git a/configure b/configure +index e39c16eee2..8dc1fc7595 100755 +--- a/configure ++++ b/configure +@@ -9230,6 +9230,9 @@ fi + ppc) + MACOSX_DEFAULT_ARCH="ppc64" + ;; ++ arm64) ++ MACOSX_DEFAULT_ARCH="arm64" ++ ;; + *) + as_fn_error $? "Unexpected output of 'arch' on OSX" "$LINENO" 5 + ;; +diff --git a/configure.ac b/configure.ac +index cf280506bd..34846a7df3 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -2435,6 +2435,9 @@ case $ac_sys_system/$ac_sys_release in + ppc) + MACOSX_DEFAULT_ARCH="ppc64" + ;; ++ arm64) ++ MACOSX_DEFAULT_ARCH="arm64" ++ ;; + *) + AC_MSG_ERROR([Unexpected output of 'arch' on OSX]) + ;; +-- +2.30.1 (Apple Git-130) + diff --git a/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0005-BPO-41100-Support-macOS-11-when-building-GH-21113.patch b/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0005-BPO-41100-Support-macOS-11-when-building-GH-21113.patch new file mode 100644 index 0000000..9d48c81 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0005-BPO-41100-Support-macOS-11-when-building-GH-21113.patch @@ -0,0 +1,48 @@ +From 8ea6353f60625c96ce96588c70ff24a77f8c71f9 Mon Sep 17 00:00:00 2001 +From: Ronald Oussoren +Date: Thu, 25 Jun 2020 16:55:48 +0200 +Subject: [PATCH] BPO-41100: Support macOS 11 when building (GH-21113) + +--- + Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst | 1 + + configure | 2 +- + configure.ac | 2 +- + 3 files changed, 3 insertions(+), 2 deletions(-) + create mode 100644 Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst + +diff --git a/Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst b/Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst +new file mode 100644 +index 0000000000..ded66b567a +--- /dev/null ++++ b/Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst +@@ -0,0 +1 @@ ++Support macOS 11 when building. +diff --git a/configure b/configure +index c51f396824..5024860ca4 100755 +--- a/configure ++++ b/configure +@@ -3375,7 +3375,7 @@ $as_echo "#define _BSD_SOURCE 1" >>confdefs.h + # has no effect, don't bother defining them + Darwin/[6789].*) + define_xopen_source=no;; +- Darwin/1[0-9].*) ++ Darwin/[12][0-9].*) + define_xopen_source=no;; + # On AIX 4 and 5.1, mbstate_t is defined only when _XOPEN_SOURCE == 500 but + # used in wcsnrtombs() and mbsnrtowcs() even if _XOPEN_SOURCE is not defined +diff --git a/configure.ac b/configure.ac +index 70deefb6b9..5a3e340aa3 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -495,7 +495,7 @@ case $ac_sys_system/$ac_sys_release in + # has no effect, don't bother defining them + Darwin/@<:@6789@:>@.*) + define_xopen_source=no;; +- Darwin/1@<:@0-9@:>@.*) ++ Darwin/@<:@[12]@:>@@<:@0-9@:>@.*) + define_xopen_source=no;; + # On AIX 4 and 5.1, mbstate_t is defined only when _XOPEN_SOURCE == 500 but + # used in wcsnrtombs() and mbsnrtowcs() even if _XOPEN_SOURCE is not defined +-- +2.30.1 (Apple Git-130) + diff --git a/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0006-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch b/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0006-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch new file mode 100644 index 0000000..12022a4 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0006-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch @@ -0,0 +1,37 @@ +From 604d95e235d86465b8c17f02095edcaf18464d4c Mon Sep 17 00:00:00 2001 +From: Lawrence D'Anna <64555057+lawrence-danna-apple@users.noreply.github.com> +Date: Tue, 30 Jun 2020 02:15:46 -0700 +Subject: [PATCH] bpo-41100: fix _decimal for arm64 Mac OS (GH-21228) + +Patch by Lawrence Danna. +--- + .../Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst | 1 + + Modules/_decimal/libmpdec/mpdecimal.h | 3 +++ + 2 files changed, 4 insertions(+) + create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst + +diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst +new file mode 100644 +index 0000000000..d6176d69f0 +--- /dev/null ++++ b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst +@@ -0,0 +1 @@ ++add arm64 to the allowable Mac OS arches in mpdecimal.h +\ No newline at end of file +diff --git a/Modules/_decimal/libmpdec/mpdecimal.h b/Modules/_decimal/libmpdec/mpdecimal.h +index 108b76efa8..35ce429f60 100644 +--- a/Modules/_decimal/libmpdec/mpdecimal.h ++++ b/Modules/_decimal/libmpdec/mpdecimal.h +@@ -135,6 +135,9 @@ const char *mpd_version(void); + #elif defined(__x86_64__) + #define CONFIG_64 + #define ASM ++ #elif defined(__arm64__) ++ #define CONFIG_64 ++ #define ANSI + #else + #error "unknown architecture for universal build." + #endif +-- +2.30.1 (Apple Git-130) + diff --git a/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0007-Port-ctypes-and-system-libffi-patch-for-arm64-macOS-.patch b/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0007-Port-ctypes-and-system-libffi-patch-for-arm64-macOS-.patch new file mode 100644 index 0000000..e5876b1 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0007-Port-ctypes-and-system-libffi-patch-for-arm64-macOS-.patch @@ -0,0 +1,132 @@ +From 409b4ecef88643996ce00482b650c0246a977a4b Mon Sep 17 00:00:00 2001 +From: Chaim Halbert +Date: Sun, 26 Feb 2023 06:21:54 -0700 +Subject: [PATCH] Port ctypes and system libffi patch for arm64/macOS 10.15+ to + Python 3.5.10 + +This backports the following ctypes and libffi pyenv patch for Python +3.6.15 to Python 3.5.10: + +* `0004-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch` + +This patch enables use of system libffi (fixing a broken `ctypes` module +on arm64 targets) and enables calling variadic functions on arm64. +--- + setup.py | 65 +++++++++++++++++++++++++++++++++++++++++++------------- + 1 file changed, 50 insertions(+), 15 deletions(-) + +diff --git a/setup.py b/setup.py +index 2944c9dd6f..ab8065866f 100644 +--- a/setup.py ++++ b/setup.py +@@ -73,6 +73,13 @@ def macosx_sdk_root(): + sysroot = m.group(1) + return sysroot + ++def is_macosx_at_least(vers): ++ if host_platform == 'darwin': ++ dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') ++ if dep_target: ++ return tuple(map(int, str(dep_target).split('.'))) >= vers ++ return False ++ + def is_macosx_sdk_path(path): + """ + Returns True if 'path' can be located in an OSX SDK +@@ -81,6 +88,13 @@ def is_macosx_sdk_path(path): + or path.startswith('/System/') + or path.startswith('/Library/') ) + ++def grep_headers_for(function, headers): ++ for header in headers: ++ with open(header, 'r') as f: ++ if function in f.read(): ++ return True ++ return False ++ + def find_file(filename, std_dirs, paths): + """Searches for the directory where a given file is located, + and returns a possibly-empty list of additional directories, or None +@@ -1939,7 +1953,11 @@ class PyBuildExt(build_ext): + return True + + def detect_ctypes(self, inc_dirs, lib_dirs): +- self.use_system_libffi = False ++ if not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and is_macosx_at_least((10,15)): ++ self.use_system_libffi = True ++ else: ++ self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS") ++ + include_dirs = [] + extra_compile_args = [] + extra_link_args = [] +@@ -1986,19 +2004,29 @@ class PyBuildExt(build_ext): + libraries=math_libs) + self.extensions.extend([ext, ext_test]) + +- if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"): +- return ++ ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR") ++ ffi_lib = None + + if host_platform == 'darwin': +- # OS X 10.5 comes with libffi.dylib; the include files are +- # in /usr/include/ffi +- inc_dirs.append('/usr/include/ffi') +- +- ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] +- if not ffi_inc or ffi_inc[0] == '': +- ffi_inc = find_file('ffi.h', [], inc_dirs) +- if ffi_inc is not None: +- ffi_h = ffi_inc[0] + '/ffi.h' ++ if not self.use_system_libffi: ++ return ++ ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi") ++ if os.path.exists(ffi_in_sdk): ++ ffi_inc = ffi_in_sdk ++ ffi_lib = 'ffi' ++ else: ++ # OS X 10.5 comes with libffi.dylib; the include files are ++ # in /usr/include/ffi ++ inc_dirs.append('/usr/include/ffi') ++ elif '--without-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"): ++ return ++ ++ if not ffi_inc: ++ found = find_file('ffi.h', [], inc_dirs) ++ if found: ++ ffi_inc = found[0] ++ if ffi_inc: ++ ffi_h = ffi_inc + '/ffi.h' + with open(ffi_h) as f: + for line in f: + line = line.strip() +@@ -2009,15 +2037,22 @@ class PyBuildExt(build_ext): + ffi_inc = None + print('Header file {} does not define LIBFFI_H or ' + 'ffi_wrapper_h'.format(ffi_h)) +- ffi_lib = None +- if ffi_inc is not None: ++ if ffi_lib is None and ffi_inc is not None: + for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'): + if (self.compiler.find_library_file(lib_dirs, lib_name)): + ffi_lib = lib_name + break + + if ffi_inc and ffi_lib: +- ext.include_dirs.extend(ffi_inc) ++ ffi_headers = glob(os.path.join(ffi_inc, '*.h')) ++ if grep_headers_for('ffi_closure_alloc', ffi_headers): ++ try: ++ sources.remove('_ctypes/malloc_closure.c') ++ except ValueError: ++ pass ++ if grep_headers_for('ffi_prep_cif_var', ffi_headers): ++ ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1") ++ ext.include_dirs.append(ffi_inc) + ext.libraries.append(ffi_lib) + self.use_system_libffi = True + +-- +2.39.2 + diff --git a/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0008-bpo-36231-Support-building-on-macOS-without-usr-incl.patch b/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0008-bpo-36231-Support-building-on-macOS-without-usr-incl.patch new file mode 100644 index 0000000..c7891f7 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0008-bpo-36231-Support-building-on-macOS-without-usr-incl.patch @@ -0,0 +1,93 @@ +From 2ad0bb719f5ce416d3bfa366814ebcf3b654f081 Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Sat, 10 Jun 2023 20:17:25 +0300 +Subject: [PATCH] bpo-36231: Support building on macOS without /usr/include + (GH-13773) (GH-14208) + +--- + .../2019-06-03-05-49-49.bpo-36231.RfmW_p.rst | 3 ++ + setup.py | 53 ++++++++++++++++--- + 2 files changed, 49 insertions(+), 7 deletions(-) + create mode 100644 Misc/NEWS.d/next/macOS/2019-06-03-05-49-49.bpo-36231.RfmW_p.rst + +diff --git a/Misc/NEWS.d/next/macOS/2019-06-03-05-49-49.bpo-36231.RfmW_p.rst b/Misc/NEWS.d/next/macOS/2019-06-03-05-49-49.bpo-36231.RfmW_p.rst +new file mode 100644 +index 0000000000..c82e54c12c +--- /dev/null ++++ b/Misc/NEWS.d/next/macOS/2019-06-03-05-49-49.bpo-36231.RfmW_p.rst +@@ -0,0 +1,3 @@ ++Support building Python on macOS without /usr/include installed. As of macOS ++10.14, system header files are only available within an SDK provided by ++either the Command Line Tools or the Xcode app. +diff --git a/setup.py b/setup.py +index ab8065866f..28dc801845 100644 +--- a/setup.py ++++ b/setup.py +@@ -60,18 +60,57 @@ def add_dir_to_list(dirlist, dir): + return + dirlist.insert(0, dir) + ++MACOS_SDK_ROOT = None ++ + def macosx_sdk_root(): ++ """Return the directory of the current macOS SDK. ++ ++ If no SDK was explicitly configured, call the compiler to find which ++ include files paths are being searched by default. Use '/' if the ++ compiler is searching /usr/include (meaning system header files are ++ installed) or use the root of an SDK if that is being searched. ++ (The SDK may be supplied via Xcode or via the Command Line Tools). ++ The SDK paths used by Apple-supplied tool chains depend on the ++ setting of various variables; see the xcrun man page for more info. + """ +- Return the directory of the current OSX SDK, +- or '/' if no SDK was specified. +- """ ++ global MACOS_SDK_ROOT ++ ++ # If already called, return cached result. ++ if MACOS_SDK_ROOT: ++ return MACOS_SDK_ROOT ++ + cflags = sysconfig.get_config_var('CFLAGS') + m = re.search(r'-isysroot\s+(\S+)', cflags) +- if m is None: +- sysroot = '/' ++ if m is not None: ++ MACOS_SDK_ROOT = m.group(1) + else: +- sysroot = m.group(1) +- return sysroot ++ MACOS_SDK_ROOT = '/' ++ cc = sysconfig.get_config_var('CC') ++ tmpfile = '/tmp/setup_sdk_root.%d' % os.getpid() ++ try: ++ os.unlink(tmpfile) ++ except: ++ pass ++ ret = os.system('%s -E -v - %s 1>/dev/null' % (cc, tmpfile)) ++ in_incdirs = False ++ try: ++ if ret >> 8 == 0: ++ with open(tmpfile) as fp: ++ for line in fp.readlines(): ++ if line.startswith("#include <...>"): ++ in_incdirs = True ++ elif line.startswith("End of search list"): ++ in_incdirs = False ++ elif in_incdirs: ++ line = line.strip() ++ if line == '/usr/include': ++ MACOS_SDK_ROOT = '/' ++ elif line.endswith(".sdk/usr/include"): ++ MACOS_SDK_ROOT = line[:-12] ++ finally: ++ os.unlink(tmpfile) ++ ++ return MACOS_SDK_ROOT + + def is_macosx_at_least(vers): + if host_platform == 'darwin': +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0009-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch b/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0009-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch new file mode 100644 index 0000000..e5540cc --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0009-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch @@ -0,0 +1,28 @@ +From 3cc28dc409d0db3752278379e7a8d4c23e0f2e29 Mon Sep 17 00:00:00 2001 +From: Ronald Oussoren +Date: Sat, 14 Nov 2020 16:07:47 +0100 +Subject: [PATCH] bpo-42351: Avoid error when opening header with non-UTF8 + encoding (GH-23279) + +grep_headers_for() would error out when a header contained +text that cannot be interpreted as UTF-8. +--- + setup.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/setup.py b/setup.py +index 28dc801845..dd50485213 100644 +--- a/setup.py ++++ b/setup.py +@@ -129,7 +129,7 @@ def is_macosx_sdk_path(path): + + def grep_headers_for(function, headers): + for header in headers: +- with open(header, 'r') as f: ++ with open(header, 'r', errors='surrogateescape') as f: + if function in f.read(): + return True + return False +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0010-bpo-36106-Resolve-sinpi-name-clash-with-libm-IEEE-75.patch b/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0010-bpo-36106-Resolve-sinpi-name-clash-with-libm-IEEE-75.patch new file mode 100644 index 0000000..9a40901 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0010-bpo-36106-Resolve-sinpi-name-clash-with-libm-IEEE-75.patch @@ -0,0 +1,68 @@ +From f57cd8288dbe6aba99c057f37ad6d58f8db75350 Mon Sep 17 00:00:00 2001 +From: Dima Pasechnik +Date: Tue, 26 Feb 2019 06:36:11 +0000 +Subject: [PATCH] bpo-36106: Resolve sinpi name clash with libm (IEEE-754 + violation). (GH-12027) + +The standard math library (libm) may follow IEEE-754 recommendation to +include an implementation of sinPi(), i.e. sinPi(x):=sin(pi*x). +And this triggers a name clash, found by FreeBSD developer +Steve Kargl, who worken on putting sinpi into libm used on FreeBSD +(it has to be named "sinpi", not "sinPi", cf. e.g. +https://en.cppreference.com/w/c/experimental/fpext4). +--- + .../next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst | 1 + + Modules/mathmodule.c | 8 ++++---- + 2 files changed, 5 insertions(+), 4 deletions(-) + create mode 100644 Misc/NEWS.d/next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst + +diff --git a/Misc/NEWS.d/next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst b/Misc/NEWS.d/next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst +new file mode 100644 +index 00000000000..36e17508cd4 +--- /dev/null ++++ b/Misc/NEWS.d/next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst +@@ -0,0 +1 @@ ++Resolve potential name clash with libm's sinpi(). Patch by Dmitrii Pasechnik. +diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c +index 2272f622f0b..fd0eb327c74 100644 +--- a/Modules/mathmodule.c ++++ b/Modules/mathmodule.c +@@ -100,7 +100,7 @@ static const double sqrtpi = 1.772453850905516027298167483341145182798; + } + + static double +-sinpi(double x) ++m_sinpi(double x) + { + double y, r; + int n; +@@ -328,7 +328,7 @@ m_tgamma(double x) + integer. */ + if (absx > 200.0) { + if (x < 0.0) { +- return 0.0/sinpi(x); ++ return 0.0/m_sinpi(x); + } + else { + errno = ERANGE; +@@ -352,7 +352,7 @@ m_tgamma(double x) + } + z = z * lanczos_g / y; + if (x < 0.0) { +- r = -pi / sinpi(absx) / absx * exp(y) / lanczos_sum(absx); ++ r = -pi / m_sinpi(absx) / absx * exp(y) / lanczos_sum(absx); + r -= z * r; + if (absx < 140.0) { + r /= pow(y, absx - 0.5); +@@ -423,7 +423,7 @@ m_lgamma(double x) + r += (absx - 0.5) * (log(absx + lanczos_g - 0.5) - 1); + if (x < 0.0) + /* Use reflection formula to get value for negative x. */ +- r = logpi - log(fabs(sinpi(absx))) - log(absx) - r; ++ r = logpi - log(fabs(m_sinpi(absx))) - log(absx) - r; + if (Py_IS_INFINITY(r)) + errno = ERANGE; + return r; +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0011-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0011-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..e98e845 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.5.10/Python-3.5.10/0011-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,29 @@ +From ed9010349e8f6351a64ba2c7005fa0c3e40655bd Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index 467362813dc..a3623c577af 100644 +--- a/setup.py ++++ b/setup.py +@@ -277,8 +277,10 @@ class PyBuildExt(build_ext): + build_ext.__init__(self, dist) + self.failed = [] + self.failed_on_import = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ m=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', '')) ++ if m is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True ++ del m + + def build_extensions(self): + +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.5.2/Python-3.5.2/venv.patch b/plugins/python-build/share/python-build/patches/3.5.2/Python-3.5.2/venv.patch new file mode 100644 index 0000000..7e2858a --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.5.2/Python-3.5.2/venv.patch @@ -0,0 +1,23 @@ + +# HG changeset patch +# User Brett Cannon +# Date 1467312199 25200 +# Node ID 8d7bde14d7a48f747b1ea2f77385352c507da6b9 +# Parent f2d1dba10a0e9db6c77889ff8ca18718ce1e76c6# Parent 4fc0154ec84a65feb580e62729ac1d26ddfcbfa1 +Merge from 3.5 for issue #26664 + +diff --git a/Lib/venv/scripts/posix/activate.fish b/Lib/venv/scripts/posix/activate.fish +--- a/Lib/venv/scripts/posix/activate.fish ++++ b/Lib/venv/scripts/posix/activate.fish +@@ -55,8 +55,8 @@ if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # with the original prompt function renamed, we can override with our own. + function fish_prompt + # Prompt override? +- if test -n "$__VENV_PROMPT__" +- printf "%s%s%s" "$__VENV_PROMPT__" (set_color normal) (_old_fish_prompt) ++ if test -n "__VENV_PROMPT__" ++ printf "%s%s%s" "__VENV_PROMPT__" (set_color normal) (_old_fish_prompt) + return + end + # ...Otherwise, prepend env + diff --git a/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0001-Detect-arm64-in-configure.patch b/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0001-Detect-arm64-in-configure.patch new file mode 100644 index 0000000..d87123f --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0001-Detect-arm64-in-configure.patch @@ -0,0 +1,41 @@ +From 002501946bad91a308f37a09204393c172f03c3e Mon Sep 17 00:00:00 2001 +From: Takumi Sueda +Date: Sat, 11 Sep 2021 16:50:14 +0900 +Subject: [PATCH 2/6] Detect arm64 in configure + +--- + configure | 3 +++ + configure.ac | 3 +++ + 2 files changed, 6 insertions(+) + +diff --git a/configure b/configure +index e39c16eee2..8dc1fc7595 100755 +--- a/configure ++++ b/configure +@@ -9230,6 +9230,9 @@ fi + ppc) + MACOSX_DEFAULT_ARCH="ppc64" + ;; ++ arm64) ++ MACOSX_DEFAULT_ARCH="arm64" ++ ;; + *) + as_fn_error $? "Unexpected output of 'arch' on OSX" "$LINENO" 5 + ;; +diff --git a/configure.ac b/configure.ac +index cf280506bd..34846a7df3 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -2435,6 +2435,9 @@ case $ac_sys_system/$ac_sys_release in + ppc) + MACOSX_DEFAULT_ARCH="ppc64" + ;; ++ arm64) ++ MACOSX_DEFAULT_ARCH="arm64" ++ ;; + *) + AC_MSG_ERROR([Unexpected output of 'arch' on OSX]) + ;; +-- +2.30.1 (Apple Git-130) + diff --git a/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/00012-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/00012-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..e98e845 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/00012-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,29 @@ +From ed9010349e8f6351a64ba2c7005fa0c3e40655bd Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index 467362813dc..a3623c577af 100644 +--- a/setup.py ++++ b/setup.py +@@ -277,8 +277,10 @@ class PyBuildExt(build_ext): + build_ext.__init__(self, dist) + self.failed = [] + self.failed_on_import = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ m=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', '')) ++ if m is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True ++ del m + + def build_extensions(self): + +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0002-bpo-36231-Support-building-on-macOS-without-usr-incl.patch b/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0002-bpo-36231-Support-building-on-macOS-without-usr-incl.patch new file mode 100644 index 0000000..f95099a --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0002-bpo-36231-Support-building-on-macOS-without-usr-incl.patch @@ -0,0 +1,93 @@ +From c7302116573d853d3181133477d9d0e4d4d3abfd Mon Sep 17 00:00:00 2001 +From: Ned Deily +Date: Tue, 18 Jun 2019 16:28:13 -0400 +Subject: [PATCH] bpo-36231: Support building on macOS without /usr/include + (GH-13773) (GH-14208) + +--- + .../2019-06-03-05-49-49.bpo-36231.RfmW_p.rst | 3 ++ + setup.py | 53 ++++++++++++++++--- + 2 files changed, 49 insertions(+), 7 deletions(-) + create mode 100644 Misc/NEWS.d/next/macOS/2019-06-03-05-49-49.bpo-36231.RfmW_p.rst + +diff --git a/Misc/NEWS.d/next/macOS/2019-06-03-05-49-49.bpo-36231.RfmW_p.rst b/Misc/NEWS.d/next/macOS/2019-06-03-05-49-49.bpo-36231.RfmW_p.rst +new file mode 100644 +index 0000000000..c82e54c12c +--- /dev/null ++++ b/Misc/NEWS.d/next/macOS/2019-06-03-05-49-49.bpo-36231.RfmW_p.rst +@@ -0,0 +1,3 @@ ++Support building Python on macOS without /usr/include installed. As of macOS ++10.14, system header files are only available within an SDK provided by ++either the Command Line Tools or the Xcode app. +diff --git a/setup.py b/setup.py +index bcc4bfa89d..5e0cd02430 100644 +--- a/setup.py ++++ b/setup.py +@@ -90,18 +90,57 @@ def sysroot_paths(make_vars, subdirs): + break + return dirs + ++MACOS_SDK_ROOT = None ++ + def macosx_sdk_root(): ++ """Return the directory of the current macOS SDK. ++ ++ If no SDK was explicitly configured, call the compiler to find which ++ include files paths are being searched by default. Use '/' if the ++ compiler is searching /usr/include (meaning system header files are ++ installed) or use the root of an SDK if that is being searched. ++ (The SDK may be supplied via Xcode or via the Command Line Tools). ++ The SDK paths used by Apple-supplied tool chains depend on the ++ setting of various variables; see the xcrun man page for more info. + """ +- Return the directory of the current OSX SDK, +- or '/' if no SDK was specified. +- """ ++ global MACOS_SDK_ROOT ++ ++ # If already called, return cached result. ++ if MACOS_SDK_ROOT: ++ return MACOS_SDK_ROOT ++ + cflags = sysconfig.get_config_var('CFLAGS') + m = re.search(r'-isysroot\s+(\S+)', cflags) +- if m is None: +- sysroot = '/' ++ if m is not None: ++ MACOS_SDK_ROOT = m.group(1) + else: +- sysroot = m.group(1) +- return sysroot ++ MACOS_SDK_ROOT = '/' ++ cc = sysconfig.get_config_var('CC') ++ tmpfile = '/tmp/setup_sdk_root.%d' % os.getpid() ++ try: ++ os.unlink(tmpfile) ++ except: ++ pass ++ ret = os.system('%s -E -v - %s 1>/dev/null' % (cc, tmpfile)) ++ in_incdirs = False ++ try: ++ if ret >> 8 == 0: ++ with open(tmpfile) as fp: ++ for line in fp.readlines(): ++ if line.startswith("#include <...>"): ++ in_incdirs = True ++ elif line.startswith("End of search list"): ++ in_incdirs = False ++ elif in_incdirs: ++ line = line.strip() ++ if line == '/usr/include': ++ MACOS_SDK_ROOT = '/' ++ elif line.endswith(".sdk/usr/include"): ++ MACOS_SDK_ROOT = line[:-12] ++ finally: ++ os.unlink(tmpfile) ++ ++ return MACOS_SDK_ROOT + + def is_macosx_sdk_path(path): + """ +-- +2.30.1 (Apple Git-130) + diff --git a/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0003-Fix-macOS-_tkinter-use-of-Tck-Tk-in-Library-Framewor.patch b/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0003-Fix-macOS-_tkinter-use-of-Tck-Tk-in-Library-Framewor.patch new file mode 100644 index 0000000..62da083 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0003-Fix-macOS-_tkinter-use-of-Tck-Tk-in-Library-Framewor.patch @@ -0,0 +1,240 @@ +From 942db3e6b96225ef8330f5329c702d62483c6ef8 Mon Sep 17 00:00:00 2001 +From: Takumi Sueda +Date: Sat, 11 Sep 2021 17:14:34 +0900 +Subject: [PATCH 3/6] Fix macOS _tkinter use of Tck/Tk in /Library/Framework + +Modified and imported from https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch +--- + setup.py | 147 ++++++++++++++++++++++++++++++++++++++++--------------- + 1 file changed, 107 insertions(+), 40 deletions(-) + +diff --git a/setup.py b/setup.py +index e2c1898253..8e03c77997 100644 +--- a/setup.py ++++ b/setup.py +@@ -91,6 +91,7 @@ def sysroot_paths(make_vars, subdirs): + return dirs + + MACOS_SDK_ROOT = None ++MACOS_SDK_SPECIFIED = None + + def macosx_sdk_root(): + """Return the directory of the current macOS SDK. +@@ -102,8 +103,9 @@ def macosx_sdk_root(): + (The SDK may be supplied via Xcode or via the Command Line Tools). + The SDK paths used by Apple-supplied tool chains depend on the + setting of various variables; see the xcrun man page for more info. ++ Also sets MACOS_SDK_SPECIFIED for use by macosx_sdk_specified(). + """ +- global MACOS_SDK_ROOT ++ global MACOS_SDK_ROOT, MACOS_SDK_SPECIFIED + + # If already called, return cached result. + if MACOS_SDK_ROOT: +@@ -113,8 +115,10 @@ def macosx_sdk_root(): + m = re.search(r'-isysroot\s+(\S+)', cflags) + if m is not None: + MACOS_SDK_ROOT = m.group(1) ++ MACOS_SDK_SPECIFIED = MACOS_SDK_ROOT != '/' + else: + MACOS_SDK_ROOT = '/' ++ MACOS_SDK_SPECIFIED = False + cc = sysconfig.get_config_var('CC') + tmpfile = '/tmp/setup_sdk_root.%d' % os.getpid() + try: +@@ -142,6 +146,27 @@ def macosx_sdk_root(): + + return MACOS_SDK_ROOT + ++def macosx_sdk_specified(): ++ """Returns true if an SDK was explicitly configured. ++ ++ True if an SDK was selected at configure time, either by specifying ++ --enable-universalsdk=(something other than no or /) or by adding a ++ -isysroot option to CFLAGS. In some cases, like when making ++ decisions about macOS Tk framework paths, we need to be able to ++ know whether the user explicitly asked to build with an SDK versus ++ the implicit use of an SDK when header files are no longer ++ installed on a running system by the Command Line Tools. ++ """ ++ global MACOS_SDK_SPECIFIED ++ ++ # If already called, return cached result. ++ if MACOS_SDK_SPECIFIED: ++ return MACOS_SDK_SPECIFIED ++ ++ # Find the sdk root and set MACOS_SDK_SPECIFIED ++ macosx_sdk_root() ++ return MACOS_SDK_SPECIFIED ++ + def is_macosx_sdk_path(path): + """ + Returns True if 'path' can be located in an OSX SDK +@@ -1758,31 +1783,72 @@ class PyBuildExt(build_ext): + return 1 + + def detect_tkinter_darwin(self, inc_dirs, lib_dirs): +- # The _tkinter module, using frameworks. Since frameworks are quite +- # different the UNIX search logic is not sharable. +- from os.path import join, exists +- framework_dirs = [ +- '/Library/Frameworks', +- '/System/Library/Frameworks/', +- join(os.getenv('HOME'), '/Library/Frameworks') +- ] ++ # Build default _tkinter on macOS using Tcl and Tk frameworks. ++ # ++ # The macOS native Tk (AKA Aqua Tk) and Tcl are most commonly ++ # built and installed as macOS framework bundles. However, ++ # for several reasons, we cannot take full advantage of the ++ # Apple-supplied compiler chain's -framework options here. ++ # Instead, we need to find and pass to the compiler the ++ # absolute paths of the Tcl and Tk headers files we want to use ++ # and the absolute path to the directory containing the Tcl ++ # and Tk frameworks for linking. ++ # ++ # We want to handle here two common use cases on macOS: ++ # 1. Build and link with system-wide third-party or user-built ++ # Tcl and Tk frameworks installed in /Library/Frameworks. ++ # 2. Build and link using a user-specified macOS SDK so that the ++ # built Python can be exported to other systems. In this case, ++ # search only the SDK's /Library/Frameworks (normally empty) ++ # and /System/Library/Frameworks. ++ # ++ # Any other use case should be able to be handled explicitly by ++ # using the options described above in detect_tkinter_explicitly(). ++ # In particular it would be good to handle here the case where ++ # you want to build and link with a framework build of Tcl and Tk ++ # that is not in /Library/Frameworks, say, in your private ++ # $HOME/Library/Frameworks directory or elsewhere. It turns ++ # out to be difficult to make that work automtically here ++ # without bringing into play more tools and magic. That case ++ # can be hamdled using a recipe with the right arguments ++ # to detect_tkinter_explicitly(). ++ # ++ # Note also that the fallback case here is to try to use the ++ # Apple-supplied Tcl and Tk frameworks in /System/Library but ++ # be forewarned that they are deprecated by Apple and typically ++ # out-of-date and buggy; their use should be avoided if at ++ # all possible by installing a newer version of Tcl and Tk in ++ # /Library/Frameworks before bwfore building Python without ++ # an explicit SDK or by configuring build arguments explicitly. + +- sysroot = macosx_sdk_root() ++ from os.path import join, exists ++ sysroot = macosx_sdk_root() # path to the SDK or '/' ++ ++ if macosx_sdk_specified(): ++ # Use case #2: an SDK other than '/' was specified. ++ # Only search there. ++ framework_dirs = [ ++ join(sysroot, 'Library', 'Frameworks'), ++ join(sysroot, 'System', 'Library', 'Frameworks'), ++ ] ++ else: ++ # Use case #1: no explicit SDK selected. ++ # Search the local system-wide /Library/Frameworks, ++ # not the one in the default SDK, othewise fall back to ++ # /System/Library/Frameworks whose header files may be in ++ # the default SDK or, on older systems, actually installed. ++ framework_dirs = [ ++ join('/', 'Library', 'Frameworks'), ++ join(sysroot, 'System', 'Library', 'Frameworks'), ++ ] + +- # Find the directory that contains the Tcl.framework and Tk.framework +- # bundles. +- # XXX distutils should support -F! ++ # Find the directory that contains the Tcl.framework and ++ # Tk.framework bundles. + for F in framework_dirs: + # both Tcl.framework and Tk.framework should be present +- +- + for fw in 'Tcl', 'Tk': +- if is_macosx_sdk_path(F): +- if not exists(join(sysroot, F[1:], fw + '.framework')): +- break +- else: +- if not exists(join(F, fw + '.framework')): +- break ++ if not exists(join(F, fw + '.framework')): ++ break + else: + # ok, F is now directory with both frameworks. Continure + # building +@@ -1792,24 +1858,16 @@ class PyBuildExt(build_ext): + # will now resume. + return 0 + +- # For 8.4a2, we must add -I options that point inside the Tcl and Tk +- # frameworks. In later release we should hopefully be able to pass +- # the -F option to gcc, which specifies a framework lookup path. +- # + include_dirs = [ + join(F, fw + '.framework', H) + for fw in ('Tcl', 'Tk') +- for H in ('Headers', 'Versions/Current/PrivateHeaders') ++ for H in ('Headers',) + ] + +- # For 8.4a2, the X11 headers are not included. Rather than include a +- # complicated search, this is a hard-coded path. It could bail out +- # if X11 libs are not found... +- include_dirs.append('/usr/X11R6/include') +- frameworks = ['-framework', 'Tcl', '-framework', 'Tk'] ++ # Add the base framework directory as well ++ compile_args = ['-F', F] + +- # All existing framework builds of Tcl/Tk don't support 64-bit +- # architectures. ++ # Do not build tkinter for archs that this Tk was not built with. + cflags = sysconfig.get_config_vars('CFLAGS')[0] + archs = re.findall(r'-arch\s+(\w+)', cflags) + +@@ -1819,10 +1877,7 @@ class PyBuildExt(build_ext): + + # Note: cannot use os.popen or subprocess here, that + # requires extensions that are not available here. +- if is_macosx_sdk_path(F): +- os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(os.path.join(sysroot, F[1:]), tmpfile)) +- else: +- os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(F, tmpfile)) ++ os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(F, tmpfile)) + + with open(tmpfile) as fp: + detected_archs = [] +@@ -1832,16 +1887,26 @@ class PyBuildExt(build_ext): + detected_archs.append(ln.split()[-1]) + os.unlink(tmpfile) + ++ arch_args = [] + for a in detected_archs: +- frameworks.append('-arch') +- frameworks.append(a) ++ arch_args.append('-arch') ++ arch_args.append(a) ++ ++ compile_args += arch_args ++ link_args = [','.join(['-Wl', '-F', F, '-framework', 'Tcl', '-framework', 'Tk'])] + arch_args ++ ++ # The X11/xlib.h file bundled in the Tk sources can cause function ++ # prototype warnings from the compiler. Since we cannot easily fix ++ # that, suppress the warnings here instead. ++ if '-Wstrict-prototypes' in cflags.split(): ++ compile_args.append('-Wno-strict-prototypes') + + ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'], + define_macros=[('WITH_APPINIT', 1)], + include_dirs = include_dirs, + libraries = [], +- extra_compile_args = frameworks[2:], +- extra_link_args = frameworks, ++ extra_compile_args = compile_args, ++ extra_link_args = link_args, + ) + self.extensions.append(ext) + return 1 +-- +2.30.1 (Apple Git-130) + diff --git a/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0004-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch b/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0004-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch new file mode 100644 index 0000000..c69db8b --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0004-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch @@ -0,0 +1,314 @@ +From: Christian Hammond +Date: Wed, 15 Dec 2021 23:12:36 -0800 +Subject: Port ctypes and system libffi patches for arm64/macOS 10.15+ to Python 3.6.15 + +This ports the following ctypes and libffi pyenv patches for Python +2.7.18 to Python 3.6.15: + +* `0004-Use-system-libffi-for-Mac-OS-10.15-and-up.patch` +* `0005-ctypes-use-the-correct-ABI-for-variadic-functions.patch` +* `0006-ctypes-probe-libffi-for-ffi_closure_alloc-and-ffi_pr.patch` + +These patches enable use of system libffi (fixing a broken `ctypes` +module on arm64 targets) and enable calling variadic functions on arm64. +They've been combined from patches port from Homebrew to pyenv by Takumi +Sueda, updated to work on the Python 3.6.15 codebase. + +The Homebrew patches are themselves backports of changes in Python 3.9 +and 3.10. That patch can be found at: + +https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch + +diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst +index a7cc0c84df..f25f3c78d9 100644 +--- a/Doc/library/ctypes.rst ++++ b/Doc/library/ctypes.rst +@@ -1551,6 +1551,13 @@ They are instances of a private class: + value usable as argument (integer, string, ctypes instance). This allows + defining adapters that can adapt custom objects as function parameters. + ++ .. attribute:: variadic ++ ++ Assign a boolean to specify that the function takes a variable number of ++ arguments. This does not matter on most platforms, but for Apple arm64 ++ platforms variadic functions have a different calling convention than ++ normal functions. ++ + .. attribute:: errcheck + + Assign a Python function or another callable to this attribute. The +diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py +index 56ab0ad732..013b1e9ce7 100644 +--- a/Lib/test/test_unicode.py ++++ b/Lib/test/test_unicode.py +@@ -2443,11 +2443,14 @@ class CAPITest(unittest.TestCase): + def test_from_format(self): + support.import_module('ctypes') + from ctypes import ( ++ c_char_p, + pythonapi, py_object, sizeof, + c_int, c_long, c_longlong, c_ssize_t, + c_uint, c_ulong, c_ulonglong, c_size_t, c_void_p) + name = "PyUnicode_FromFormat" + _PyUnicode_FromFormat = getattr(pythonapi, name) ++ _PyUnicode_FromFormat.argtypes = (c_char_p,) ++ _PyUnicode_FromFormat.variadic = True + _PyUnicode_FromFormat.restype = py_object + + def PyUnicode_FromFormat(format, *args): +diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c +index 24d64858ed..351f274ad3 100644 +--- a/Modules/_ctypes/_ctypes.c ++++ b/Modules/_ctypes/_ctypes.c +@@ -3120,6 +3120,34 @@ PyCFuncPtr_get_restype(PyCFuncPtrObject *self, void *Py_UNUSED(ignored)) + } + } + ++static int ++PyCFuncPtr_set_variadic(PyCFuncPtrObject *self, PyObject *ob) ++{ ++ StgDictObject *dict = PyObject_stgdict((PyObject *)self); ++ assert(dict); ++ int r = PyObject_IsTrue(ob); ++ if (r == 1) { ++ dict->flags |= FUNCFLAG_VARIADIC; ++ return 0; ++ } else if (r == 0) { ++ dict->flags &= ~FUNCFLAG_VARIADIC; ++ return 0; ++ } else { ++ return -1; ++ } ++} ++ ++static PyObject * ++PyCFuncPtr_get_variadic(PyCFuncPtrObject *self) ++{ ++ StgDictObject *dict = PyObject_stgdict((PyObject *)self); ++ assert(dict); /* Cannot be NULL for PyCFuncPtrObject instances */ ++ if (dict->flags & FUNCFLAG_VARIADIC) ++ Py_RETURN_TRUE; ++ else ++ Py_RETURN_FALSE; ++} ++ + static int + PyCFuncPtr_set_argtypes(PyCFuncPtrObject *self, PyObject *ob, void *Py_UNUSED(ignored)) + { +@@ -3166,6 +3194,8 @@ static PyGetSetDef PyCFuncPtr_getsets[] = { + { "argtypes", (getter)PyCFuncPtr_get_argtypes, + (setter)PyCFuncPtr_set_argtypes, + "specify the argument types", NULL }, ++ { "variadic", (getter)PyCFuncPtr_get_variadic, (setter)PyCFuncPtr_set_variadic, ++ "specify if function takes variable number of arguments", NULL }, + { NULL, NULL } + }; + +@@ -5576,6 +5606,7 @@ PyInit__ctypes(void) + PyModule_AddObject(m, "FUNCFLAG_USE_ERRNO", PyLong_FromLong(FUNCFLAG_USE_ERRNO)); + PyModule_AddObject(m, "FUNCFLAG_USE_LASTERROR", PyLong_FromLong(FUNCFLAG_USE_LASTERROR)); + PyModule_AddObject(m, "FUNCFLAG_PYTHONAPI", PyLong_FromLong(FUNCFLAG_PYTHONAPI)); ++ PyModule_AddObject(m, "FUNCFLAG_VARIADIC", PyLong_FromLong(FUNCFLAG_VARIADIC)); + PyModule_AddStringConstant(m, "__version__", "1.1.0"); + + PyModule_AddObject(m, "_memmove_addr", PyLong_FromVoidPtr(memmove)); +diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c +index 2bb289bce0..12951eadbf 100644 +--- a/Modules/_ctypes/callproc.c ++++ b/Modules/_ctypes/callproc.c +@@ -752,7 +754,8 @@ static int _call_function_pointer(int flags, + ffi_type **atypes, + ffi_type *restype, + void *resmem, +- int argcount) ++ int argcount, ++ int argtypecount) + { + #ifdef WITH_THREAD + PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */ +@@ -780,15 +783,39 @@ static int _call_function_pointer(int flags, + if ((flags & FUNCFLAG_CDECL) == 0) + cc = FFI_STDCALL; + #endif +- if (FFI_OK != ffi_prep_cif(&cif, +- cc, +- argcount, +- restype, +- atypes)) { +- PyErr_SetString(PyExc_RuntimeError, +- "ffi_prep_cif failed"); +- return -1; ++ ++#if HAVE_FFI_PREP_CIF_VAR ++ /* Everyone SHOULD set f.variadic=True on variadic function pointers, but ++ * lots of existing code will not. If there's at least one arg and more ++ * args are passed than are defined in the prototype, then it must be a ++ * variadic function. */ ++ if ((flags & FUNCFLAG_VARIADIC) || ++ (argtypecount != 0 && argcount > argtypecount)) ++ { ++ if (FFI_OK != ffi_prep_cif_var(&cif, ++ cc, ++ argtypecount, ++ argcount, ++ restype, ++ atypes)) { ++ PyErr_SetString(PyExc_RuntimeError, ++ "ffi_prep_cif_var failed"); ++ return -1; ++ } ++ } else { ++#endif ++ if (FFI_OK != ffi_prep_cif(&cif, ++ cc, ++ argcount, ++ restype, ++ atypes)) { ++ PyErr_SetString(PyExc_RuntimeError, ++ "ffi_prep_cif failed"); ++ return -1; ++ } ++#if HAVE_FFI_PREP_CIF_VAR + } ++#endif + + if (flags & (FUNCFLAG_USE_ERRNO | FUNCFLAG_USE_LASTERROR)) { + error_object = _ctypes_get_errobj(&space); +@@ -1181,9 +1208,8 @@ PyObject *_ctypes_callproc(PPROC pProc, + + if (-1 == _call_function_pointer(flags, pProc, avalues, atypes, + rtype, resbuf, +- Py_SAFE_DOWNCAST(argcount, +- Py_ssize_t, +- int))) ++ Py_SAFE_DOWNCAST(argcount, Py_ssize_t, int), ++ Py_SAFE_DOWNCAST(argtype_count, Py_ssize_t, int))) + goto cleanup; + + #ifdef WORDS_BIGENDIAN +diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h +index 5d3b966338..1299ec25aa 100644 +--- a/Modules/_ctypes/ctypes.h ++++ b/Modules/_ctypes/ctypes.h +@@ -285,6 +285,7 @@ PyObject *_ctypes_callproc(PPROC pProc, + #define FUNCFLAG_PYTHONAPI 0x4 + #define FUNCFLAG_USE_ERRNO 0x8 + #define FUNCFLAG_USE_LASTERROR 0x10 ++#define FUNCFLAG_VARIADIC 0x20 + + #define TYPEFLAG_ISPOINTER 0x100 + #define TYPEFLAG_HASPOINTER 0x200 +diff --git a/setup.py b/setup.py +index 8e03c77997..3b124c4b7b 100644 +--- a/setup.py ++++ b/setup.py +@@ -167,6 +167,13 @@ def macosx_sdk_specified(): + macosx_sdk_root() + return MACOS_SDK_SPECIFIED + ++def is_macosx_at_least(vers): ++ if host_platform == 'darwin': ++ dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') ++ if dep_target: ++ return tuple(map(int, str(dep_target).split('.'))) >= vers ++ return False ++ + def is_macosx_sdk_path(path): + """ + Returns True if 'path' can be located in an OSX SDK +@@ -175,6 +182,13 @@ def is_macosx_sdk_path(path): + or path.startswith('/System/') + or path.startswith('/Library/') ) + ++def grep_headers_for(function, headers): ++ for header in headers: ++ with open(header, 'r') as f: ++ if function in f.read(): ++ return True ++ return False ++ + def find_file(filename, std_dirs, paths): + """Searches for the directory where a given file is located, + and returns a possibly-empty list of additional directories, or None +@@ -2115,7 +2129,11 @@ class PyBuildExt(build_ext): + return True + + def detect_ctypes(self, inc_dirs, lib_dirs): +- self.use_system_libffi = False ++ if not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and is_macosx_at_least((10,15)): ++ self.use_system_libffi = True ++ else: ++ self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS") ++ + include_dirs = [] + extra_compile_args = [] + extra_link_args = [] +@@ -2162,20 +2180,29 @@ class PyBuildExt(build_ext): + libraries=math_libs) + self.extensions.extend([ext, ext_test]) + ++ ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR") ++ ffi_lib = None ++ + if host_platform == 'darwin': +- if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"): +- return +- # OS X 10.5 comes with libffi.dylib; the include files are +- # in /usr/include/ffi +- inc_dirs.append('/usr/include/ffi') ++ if not self.use_system_libffi: ++ return ++ ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi") ++ if os.path.exists(ffi_in_sdk): ++ ffi_inc = ffi_in_sdk ++ ffi_lib = 'ffi' ++ else: ++ # OS X 10.5 comes with libffi.dylib; the include files are ++ # in /usr/include/ffi ++ inc_dirs.append('/usr/include/ffi') + elif '--without-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"): + return + +- ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] +- if not ffi_inc or ffi_inc[0] == '': +- ffi_inc = find_file('ffi.h', [], inc_dirs) +- if ffi_inc is not None: +- ffi_h = ffi_inc[0] + '/ffi.h' ++ if not ffi_inc: ++ found = find_file('ffi.h', [], inc_dirs) ++ if found: ++ ffi_inc = found[0] ++ if ffi_inc: ++ ffi_h = ffi_inc + '/ffi.h' + with open(ffi_h) as f: + for line in f: + line = line.strip() +@@ -2186,15 +2213,22 @@ class PyBuildExt(build_ext): + ffi_inc = None + print('Header file {} does not define LIBFFI_H or ' + 'ffi_wrapper_h'.format(ffi_h)) +- ffi_lib = None +- if ffi_inc is not None: ++ if ffi_lib is None and ffi_inc is not None: + for lib_name in ('ffi', 'ffi_pic'): + if (self.compiler.find_library_file(lib_dirs, lib_name)): + ffi_lib = lib_name + break + + if ffi_inc and ffi_lib: +- ext.include_dirs.extend(ffi_inc) ++ ffi_headers = glob(os.path.join(ffi_inc, '*.h')) ++ if grep_headers_for('ffi_closure_alloc', ffi_headers): ++ try: ++ sources.remove('_ctypes/malloc_closure.c') ++ except ValueError: ++ pass ++ if grep_headers_for('ffi_prep_cif_var', ffi_headers): ++ ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1") ++ ext.include_dirs.append(ffi_inc) + ext.libraries.append(ffi_lib) + self.use_system_libffi = True + +-- +2.30.1 (Apple Git-130) + diff --git a/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0005-BPO-41100-Support-macOS-11-when-building-GH-21113.patch b/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0005-BPO-41100-Support-macOS-11-when-building-GH-21113.patch new file mode 100644 index 0000000..9d48c81 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0005-BPO-41100-Support-macOS-11-when-building-GH-21113.patch @@ -0,0 +1,48 @@ +From 8ea6353f60625c96ce96588c70ff24a77f8c71f9 Mon Sep 17 00:00:00 2001 +From: Ronald Oussoren +Date: Thu, 25 Jun 2020 16:55:48 +0200 +Subject: [PATCH] BPO-41100: Support macOS 11 when building (GH-21113) + +--- + Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst | 1 + + configure | 2 +- + configure.ac | 2 +- + 3 files changed, 3 insertions(+), 2 deletions(-) + create mode 100644 Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst + +diff --git a/Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst b/Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst +new file mode 100644 +index 0000000000..ded66b567a +--- /dev/null ++++ b/Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst +@@ -0,0 +1 @@ ++Support macOS 11 when building. +diff --git a/configure b/configure +index c51f396824..5024860ca4 100755 +--- a/configure ++++ b/configure +@@ -3375,7 +3375,7 @@ $as_echo "#define _BSD_SOURCE 1" >>confdefs.h + # has no effect, don't bother defining them + Darwin/[6789].*) + define_xopen_source=no;; +- Darwin/1[0-9].*) ++ Darwin/[12][0-9].*) + define_xopen_source=no;; + # On AIX 4 and 5.1, mbstate_t is defined only when _XOPEN_SOURCE == 500 but + # used in wcsnrtombs() and mbsnrtowcs() even if _XOPEN_SOURCE is not defined +diff --git a/configure.ac b/configure.ac +index 70deefb6b9..5a3e340aa3 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -495,7 +495,7 @@ case $ac_sys_system/$ac_sys_release in + # has no effect, don't bother defining them + Darwin/@<:@6789@:>@.*) + define_xopen_source=no;; +- Darwin/1@<:@0-9@:>@.*) ++ Darwin/@<:@[12]@:>@@<:@0-9@:>@.*) + define_xopen_source=no;; + # On AIX 4 and 5.1, mbstate_t is defined only when _XOPEN_SOURCE == 500 but + # used in wcsnrtombs() and mbsnrtowcs() even if _XOPEN_SOURCE is not defined +-- +2.30.1 (Apple Git-130) + diff --git a/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0006-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch b/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0006-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch new file mode 100644 index 0000000..12022a4 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0006-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch @@ -0,0 +1,37 @@ +From 604d95e235d86465b8c17f02095edcaf18464d4c Mon Sep 17 00:00:00 2001 +From: Lawrence D'Anna <64555057+lawrence-danna-apple@users.noreply.github.com> +Date: Tue, 30 Jun 2020 02:15:46 -0700 +Subject: [PATCH] bpo-41100: fix _decimal for arm64 Mac OS (GH-21228) + +Patch by Lawrence Danna. +--- + .../Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst | 1 + + Modules/_decimal/libmpdec/mpdecimal.h | 3 +++ + 2 files changed, 4 insertions(+) + create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst + +diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst +new file mode 100644 +index 0000000000..d6176d69f0 +--- /dev/null ++++ b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst +@@ -0,0 +1 @@ ++add arm64 to the allowable Mac OS arches in mpdecimal.h +\ No newline at end of file +diff --git a/Modules/_decimal/libmpdec/mpdecimal.h b/Modules/_decimal/libmpdec/mpdecimal.h +index 108b76efa8..35ce429f60 100644 +--- a/Modules/_decimal/libmpdec/mpdecimal.h ++++ b/Modules/_decimal/libmpdec/mpdecimal.h +@@ -135,6 +135,9 @@ const char *mpd_version(void); + #elif defined(__x86_64__) + #define CONFIG_64 + #define ASM ++ #elif defined(__arm64__) ++ #define CONFIG_64 ++ #define ANSI + #else + #error "unknown architecture for universal build." + #endif +-- +2.30.1 (Apple Git-130) + diff --git a/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0007-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch b/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0007-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch new file mode 100644 index 0000000..ea67343 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0007-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch @@ -0,0 +1,30 @@ +From d9782f66445c9fa5d835ad29c23b22be85cde354 Mon Sep 17 00:00:00 2001 +From: Ronald Oussoren +Date: Sat, 14 Nov 2020 16:07:47 +0100 +Subject: [PATCH] bpo-42351: Avoid error when opening header with non-UTF8 + encoding (GH-23279) + +grep_headers_for() would error out when a header contained +text that cannot be interpreted as UTF-8. + +cherry-picked from 7a27c7ed4b by Pedro Fonini +--- + setup.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/setup.py b/setup.py +index 4aaa51e0d4..3556bbe041 100644 +--- a/setup.py ++++ b/setup.py +@@ -184,7 +184,7 @@ def is_macosx_sdk_path(path): + + def grep_headers_for(function, headers): + for header in headers: +- with open(header, 'r') as f: ++ with open(header, 'r', errors='surrogateescape') as f: + if function in f.read(): + return True + return False +-- +2.34.1 + diff --git a/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0008-bpo-45405-Prevent-internal-configure-error-when-runn.patch b/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0008-bpo-45405-Prevent-internal-configure-error-when-runn.patch new file mode 100644 index 0000000..ccf192e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0008-bpo-45405-Prevent-internal-configure-error-when-runn.patch @@ -0,0 +1,86 @@ +From 655f26bb742d6bd32c388e9fea14b64eb25fd4de Mon Sep 17 00:00:00 2001 +From: Ned Deily +Date: Tue, 15 Mar 2022 03:18:39 -0400 +Subject: [PATCH] bpo-45405: Prevent internal configure error when running + configure with recent versions of clang. (GH-28845) (GH-31890) + +Change the configure logic to function properly on macOS when the compiler +outputs a platform triplet for option --print-multiarch. +The Apple Clang included with Xcode 13.3 now supports --print-multiarch +causing configure to fail without this change. + +Co-authored-by: Ned Deily +(cherry picked from commit 9c4766772cda67648184f8ddba546a5fc0167f91) + +Co-authored-by: David Bohman +(cherry picked from commit 720bb456dc711b0776bae837d1f9a0b10c28ddf2) +--- + .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ + configure | 8 +++++--- + configure.ac | 8 +++++--- + 3 files changed, 12 insertions(+), 6 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst + +diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +new file mode 100644 +index 0000000000..13c93d1b8a +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +@@ -0,0 +1,2 @@ ++Prevent ``internal configure error`` when running ``configure`` ++with recent versions of clang. Patch by David Bohman. +diff --git a/configure b/configure +index fb0a499145..67e6e69b5f 100755 +--- a/configure ++++ b/configure +@@ -5203,9 +5203,6 @@ $as_echo "$as_me: + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 + $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } + cat >> conftest.c <&6; } + fi + rm -f conftest.c conftest.out + ++if test x$PLATFORM_TRIPLET != xdarwin; then ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null) ++fi ++ ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 +diff --git a/configure.ac b/configure.ac +index d86dad9a7c..468ad6070f 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -747,9 +747,6 @@ then + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +-AC_SUBST(MULTIARCH) +- + AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) + cat >> conftest.c </dev/null) ++fi ++AC_SUBST(MULTIARCH) ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) +-- +2.32.0 (Apple Git-132) + diff --git a/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0009-bpo-27987-pymalloc-align-by-16bytes-on-64bit-platfor.patch b/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0009-bpo-27987-pymalloc-align-by-16bytes-on-64bit-platfor.patch new file mode 100644 index 0000000..ef8d1d4 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0009-bpo-27987-pymalloc-align-by-16bytes-on-64bit-platfor.patch @@ -0,0 +1,43 @@ +From 54dc627769bf112b0181972a52c4b45e4a02da57 Mon Sep 17 00:00:00 2001 +From: Inada Naoki +Date: Tue, 14 May 2019 18:51:15 +0900 +Subject: [PATCH 09/10] bpo-27987: pymalloc: align by 16bytes on 64bit platform + (GH-12850) + +--- + .../2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst | 3 +++ + Objects/obmalloc.c | 6 ++++++ + 2 files changed, 9 insertions(+) + create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst + +diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst +new file mode 100644 +index 0000000000..b0f32a5c6c +--- /dev/null ++++ b/Misc/NEWS.d/next/Core and Builtins/2019-04-16-11-52-21.bpo-27987.n2_DcQ.rst +@@ -0,0 +1,3 @@ ++pymalloc returns memory blocks aligned by 16 bytes, instead of 8 bytes, on ++64-bit platforms to conform x86-64 ABI. Recent compilers assume this alignment ++more often. Patch by Inada Naoki. +diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c +index d46d149311..47283354f4 100644 +--- a/Objects/obmalloc.c ++++ b/Objects/obmalloc.c +@@ -650,8 +650,14 @@ static int running_on_valgrind = -1; + * + * You shouldn't change this unless you know what you are doing. + */ ++ ++#if SIZEOF_VOID_P > 4 ++#define ALIGNMENT 16 /* must be 2^N */ ++#define ALIGNMENT_SHIFT 4 ++#else + #define ALIGNMENT 8 /* must be 2^N */ + #define ALIGNMENT_SHIFT 3 ++#endif + + /* Return the number of bytes in size class I, as a uint. */ + #define INDEX2SIZE(I) (((uint)(I) + 1) << ALIGNMENT_SHIFT) +-- +2.38.4 + diff --git a/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0010-bpo-27987-align-PyGC_Head-to-alignof-long-double-GH-.patch b/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0010-bpo-27987-align-PyGC_Head-to-alignof-long-double-GH-.patch new file mode 100644 index 0000000..f9da87a --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0010-bpo-27987-align-PyGC_Head-to-alignof-long-double-GH-.patch @@ -0,0 +1,40 @@ +From e68ff170dc6764b22886e703f583fb53e90367ef Mon Sep 17 00:00:00 2001 +From: Inada Naoki +Date: Sat, 25 May 2019 21:13:33 +0900 +Subject: [PATCH 10/10] bpo-27987: align PyGC_Head to alignof(long double) + (GH-13335) + +--- + Include/objimpl.h | 6 +++++- + .../2019-05-15-18-28-43.bpo-27987.FaxuLy.rst | 2 ++ + 2 files changed, 7 insertions(+), 1 deletion(-) + create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst + +diff --git a/Include/objimpl.h b/Include/objimpl.h +index e7a3696d7a..90d71b87ea 100644 +--- a/Include/objimpl.h ++++ b/Include/objimpl.h +@@ -255,7 +255,11 @@ typedef union _gc_head { + union _gc_head *gc_prev; + Py_ssize_t gc_refs; + } gc; +- double dummy; /* force worst-case alignment */ ++ long double dummy; /* force worst-case alignment */ ++ // malloc returns memory block aligned for any built-in types and ++ // long double is the largest standard C type. ++ // On amd64 linux, long double requires 16 byte alignment. ++ // See bpo-27987 for more discussion. + } PyGC_Head; + + extern PyGC_Head *_PyGC_generation0; +diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst b/Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst +new file mode 100644 +index 0000000000..97ca37b262 +--- /dev/null ++++ b/Misc/NEWS.d/next/Core and Builtins/2019-05-15-18-28-43.bpo-27987.FaxuLy.rst +@@ -0,0 +1,2 @@ ++``PyGC_Head`` structure is aligned to ``long double``. This is needed to ++GC-ed objects are aligned properly. Patch by Inada Naoki. +-- +2.38.4 + diff --git a/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0011-bpo-36106-Resolve-sinpi-name-clash-with-libm-IEEE-75.patch b/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0011-bpo-36106-Resolve-sinpi-name-clash-with-libm-IEEE-75.patch new file mode 100644 index 0000000..9a40901 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0011-bpo-36106-Resolve-sinpi-name-clash-with-libm-IEEE-75.patch @@ -0,0 +1,68 @@ +From f57cd8288dbe6aba99c057f37ad6d58f8db75350 Mon Sep 17 00:00:00 2001 +From: Dima Pasechnik +Date: Tue, 26 Feb 2019 06:36:11 +0000 +Subject: [PATCH] bpo-36106: Resolve sinpi name clash with libm (IEEE-754 + violation). (GH-12027) + +The standard math library (libm) may follow IEEE-754 recommendation to +include an implementation of sinPi(), i.e. sinPi(x):=sin(pi*x). +And this triggers a name clash, found by FreeBSD developer +Steve Kargl, who worken on putting sinpi into libm used on FreeBSD +(it has to be named "sinpi", not "sinPi", cf. e.g. +https://en.cppreference.com/w/c/experimental/fpext4). +--- + .../next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst | 1 + + Modules/mathmodule.c | 8 ++++---- + 2 files changed, 5 insertions(+), 4 deletions(-) + create mode 100644 Misc/NEWS.d/next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst + +diff --git a/Misc/NEWS.d/next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst b/Misc/NEWS.d/next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst +new file mode 100644 +index 00000000000..36e17508cd4 +--- /dev/null ++++ b/Misc/NEWS.d/next/Library/2019-02-25-13-21-43.bpo-36106.VuhEiQ.rst +@@ -0,0 +1 @@ ++Resolve potential name clash with libm's sinpi(). Patch by Dmitrii Pasechnik. +diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c +index 2272f622f0b..fd0eb327c74 100644 +--- a/Modules/mathmodule.c ++++ b/Modules/mathmodule.c +@@ -100,7 +100,7 @@ static const double sqrtpi = 1.772453850905516027298167483341145182798; + } + + static double +-sinpi(double x) ++m_sinpi(double x) + { + double y, r; + int n; +@@ -328,7 +328,7 @@ m_tgamma(double x) + integer. */ + if (absx > 200.0) { + if (x < 0.0) { +- return 0.0/sinpi(x); ++ return 0.0/m_sinpi(x); + } + else { + errno = ERANGE; +@@ -352,7 +352,7 @@ m_tgamma(double x) + } + z = z * lanczos_g / y; + if (x < 0.0) { +- r = -pi / sinpi(absx) / absx * exp(y) / lanczos_sum(absx); ++ r = -pi / m_sinpi(absx) / absx * exp(y) / lanczos_sum(absx); + r -= z * r; + if (absx < 140.0) { + r /= pow(y, absx - 0.5); +@@ -423,7 +423,7 @@ m_lgamma(double x) + r += (absx - 0.5) * (log(absx + lanczos_g - 0.5) - 1); + if (x < 0.0) + /* Use reflection formula to get value for negative x. */ +- r = logpi - log(fabs(sinpi(absx))) - log(absx) - r; ++ r = logpi - log(fabs(m_sinpi(absx))) - log(absx) - r; + if (Py_IS_INFINITY(r)) + errno = ERANGE; + return r; +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.7.10/Python-3.7.10/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch b/plugins/python-build/share/python-build/patches/3.7.10/Python-3.7.10/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch new file mode 100644 index 0000000..17c9ed8 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.10/Python-3.7.10/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch @@ -0,0 +1,80 @@ +From 35ddc7ad61b20a18496ba9410aa31b405e23fe78 Mon Sep 17 00:00:00 2001 +From: David Bohman +Date: Tue, 12 Oct 2021 17:10:26 -0700 +Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running + ``configure`` with recent versions of non-Apple clang. (#28845) + +Change the configure logic to function properly on macOS when the compiler +outputs a platform triplet for option --print-multiarch. + +Co-authored-by: Ned Deily +--- + .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ + configure | 8 +++++--- + configure.ac | 8 +++++--- + 3 files changed, 12 insertions(+), 6 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst + +diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +new file mode 100644 +index 0000000000..a2dc5bcc32 +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +@@ -0,0 +1,2 @@ ++Prevent ``internal configure error`` when running ``configure`` ++with recent versions of non-Apple clang. Patch by David Bohman. +diff --git a/configure b/configure +index 829dd69bb8..455481bc50 100755 +--- a/configure ++++ b/configure +@@ -5183,9 +5183,6 @@ $as_echo "$as_me: + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 + $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } + cat >> conftest.c <&6; } + fi + rm -f conftest.c conftest.out + ++if test x$PLATFORM_TRIPLET != xdarwin; then ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null) ++fi ++ ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 +diff --git a/configure.ac b/configure.ac +index f1cc8e9bcb..1afcba3307 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -724,9 +724,6 @@ then + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +-AC_SUBST(MULTIARCH) +- + AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) + cat >> conftest.c </dev/null) ++fi ++AC_SUBST(MULTIARCH) ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) +-- +2.29.2.windows.2 + diff --git a/plugins/python-build/share/python-build/patches/3.7.11/Python-3.7.11/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch b/plugins/python-build/share/python-build/patches/3.7.11/Python-3.7.11/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch new file mode 100644 index 0000000..9019b1e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.11/Python-3.7.11/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch @@ -0,0 +1,80 @@ +From 0c2fd7c1de5121ea636134f131cf7ebada023acf Mon Sep 17 00:00:00 2001 +From: David Bohman +Date: Tue, 12 Oct 2021 17:10:26 -0700 +Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running + ``configure`` with recent versions of non-Apple clang. (#28845) + +Change the configure logic to function properly on macOS when the compiler +outputs a platform triplet for option --print-multiarch. + +Co-authored-by: Ned Deily +--- + .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ + configure | 8 +++++--- + configure.ac | 8 +++++--- + 3 files changed, 12 insertions(+), 6 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst + +diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +new file mode 100644 +index 0000000000..a2dc5bcc32 +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +@@ -0,0 +1,2 @@ ++Prevent ``internal configure error`` when running ``configure`` ++with recent versions of non-Apple clang. Patch by David Bohman. +diff --git a/configure b/configure +index 829dd69bb8..455481bc50 100755 +--- a/configure ++++ b/configure +@@ -5183,9 +5183,6 @@ $as_echo "$as_me: + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 + $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } + cat >> conftest.c <&6; } + fi + rm -f conftest.c conftest.out + ++if test x$PLATFORM_TRIPLET != xdarwin; then ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null) ++fi ++ ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 +diff --git a/configure.ac b/configure.ac +index f1cc8e9bcb..1afcba3307 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -724,9 +724,6 @@ then + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +-AC_SUBST(MULTIARCH) +- + AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) + cat >> conftest.c </dev/null) ++fi ++AC_SUBST(MULTIARCH) ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) +-- +2.29.2.windows.2 + diff --git a/plugins/python-build/share/python-build/patches/3.7.12/Python-3.7.12/0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch b/plugins/python-build/share/python-build/patches/3.7.12/Python-3.7.12/0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch new file mode 100644 index 0000000..f23946d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.12/Python-3.7.12/0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch @@ -0,0 +1,310 @@ +From: Christian Hammond +Date: Wed, 15 Dec 2021 23:12:36 -0800 +Subject: Port ctypes and system libffi patches for arm64/macOS 10.15+ to Python 3.7.12 + +This ports the following ctypes and libffi pyenv patches for Python +2.7.18 to Python 3.7.12: + +* `0004-Use-system-libffi-for-Mac-OS-10.15-and-up.patch` +* `0005-ctypes-use-the-correct-ABI-for-variadic-functions.patch` +* `0006-ctypes-probe-libffi-for-ffi_closure_alloc-and-ffi_pr.patch` + +These patches enable use of system libffi (fixing a broken `ctypes` +module on arm64 targets) and enable calling variadic functions on arm64. +They've been combined from patches port from Homebrew to pyenv by Takumi +Sueda, updated to work on the Python 3.7.12 codebase. + +The Homebrew patches are themselves backports of changes in Python 3.9 +and 3.10. That patch can be found at: + +https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch + +diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst +index 715d595b24..7743144978 100644 +--- a/Doc/library/ctypes.rst ++++ b/Doc/library/ctypes.rst +@@ -1551,6 +1551,13 @@ They are instances of a private class: + value usable as argument (integer, string, ctypes instance). This allows + defining adapters that can adapt custom objects as function parameters. + ++ .. attribute:: variadic ++ ++ Assign a boolean to specify that the function takes a variable number of ++ arguments. This does not matter on most platforms, but for Apple arm64 ++ platforms variadic functions have a different calling convention than ++ normal functions. ++ + .. attribute:: errcheck + + Assign a Python function or another callable to this attribute. The +diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py +index 4ebd82d3e0..7b73c190b6 100644 +--- a/Lib/test/test_unicode.py ++++ b/Lib/test/test_unicode.py +@@ -2458,11 +2458,14 @@ class CAPITest(unittest.TestCase): + def test_from_format(self): + support.import_module('ctypes') + from ctypes import ( ++ c_char_p, + pythonapi, py_object, sizeof, + c_int, c_long, c_longlong, c_ssize_t, + c_uint, c_ulong, c_ulonglong, c_size_t, c_void_p) + name = "PyUnicode_FromFormat" + _PyUnicode_FromFormat = getattr(pythonapi, name) ++ _PyUnicode_FromFormat.argtypes = (c_char_p,) ++ _PyUnicode_FromFormat.variadic = True + _PyUnicode_FromFormat.restype = py_object + + def PyUnicode_FromFormat(format, *args): +diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c +index dd0c61fd8a..79137e1dc7 100644 +--- a/Modules/_ctypes/_ctypes.c ++++ b/Modules/_ctypes/_ctypes.c +@@ -3174,6 +3174,34 @@ PyCFuncPtr_get_restype(PyCFuncPtrObject *self, void *Py_UNUSED(ignored)) + } + } + ++static int ++PyCFuncPtr_set_variadic(PyCFuncPtrObject *self, PyObject *ob) ++{ ++ StgDictObject *dict = PyObject_stgdict((PyObject *)self); ++ assert(dict); ++ int r = PyObject_IsTrue(ob); ++ if (r == 1) { ++ dict->flags |= FUNCFLAG_VARIADIC; ++ return 0; ++ } else if (r == 0) { ++ dict->flags &= ~FUNCFLAG_VARIADIC; ++ return 0; ++ } else { ++ return -1; ++ } ++} ++ ++static PyObject * ++PyCFuncPtr_get_variadic(PyCFuncPtrObject *self) ++{ ++ StgDictObject *dict = PyObject_stgdict((PyObject *)self); ++ assert(dict); /* Cannot be NULL for PyCFuncPtrObject instances */ ++ if (dict->flags & FUNCFLAG_VARIADIC) ++ Py_RETURN_TRUE; ++ else ++ Py_RETURN_FALSE; ++} ++ + static int + PyCFuncPtr_set_argtypes(PyCFuncPtrObject *self, PyObject *ob, void *Py_UNUSED(ignored)) + { +@@ -3219,6 +3247,8 @@ static PyGetSetDef PyCFuncPtr_getsets[] = { + { "argtypes", (getter)PyCFuncPtr_get_argtypes, + (setter)PyCFuncPtr_set_argtypes, + "specify the argument types", NULL }, ++ { "variadic", (getter)PyCFuncPtr_get_variadic, (setter)PyCFuncPtr_set_variadic, ++ "specify if function takes variable number of arguments", NULL }, + { NULL, NULL } + }; + +@@ -5632,6 +5662,7 @@ PyInit__ctypes(void) + PyModule_AddObject(m, "FUNCFLAG_USE_ERRNO", PyLong_FromLong(FUNCFLAG_USE_ERRNO)); + PyModule_AddObject(m, "FUNCFLAG_USE_LASTERROR", PyLong_FromLong(FUNCFLAG_USE_LASTERROR)); + PyModule_AddObject(m, "FUNCFLAG_PYTHONAPI", PyLong_FromLong(FUNCFLAG_PYTHONAPI)); ++ PyModule_AddObject(m, "FUNCFLAG_VARIADIC", PyLong_FromLong(FUNCFLAG_VARIADIC)); + PyModule_AddStringConstant(m, "__version__", "1.1.0"); + + PyModule_AddObject(m, "_memmove_addr", PyLong_FromVoidPtr(memmove)); +diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c +index 9cbf9801ad..e7fe11176b 100644 +--- a/Modules/_ctypes/callproc.c ++++ b/Modules/_ctypes/callproc.c +@@ -754,7 +756,8 @@ static int _call_function_pointer(int flags, + ffi_type **atypes, + ffi_type *restype, + void *resmem, +- int argcount) ++ int argcount, ++ int argtypecount) + { + PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */ + PyObject *error_object = NULL; +@@ -780,15 +783,39 @@ static int _call_function_pointer(int flags, + if ((flags & FUNCFLAG_CDECL) == 0) + cc = FFI_STDCALL; + #endif +- if (FFI_OK != ffi_prep_cif(&cif, +- cc, +- argcount, +- restype, +- atypes)) { +- PyErr_SetString(PyExc_RuntimeError, +- "ffi_prep_cif failed"); +- return -1; ++ ++#if HAVE_FFI_PREP_CIF_VAR ++ /* Everyone SHOULD set f.variadic=True on variadic function pointers, but ++ * lots of existing code will not. If there's at least one arg and more ++ * args are passed than are defined in the prototype, then it must be a ++ * variadic function. */ ++ if ((flags & FUNCFLAG_VARIADIC) || ++ (argtypecount != 0 && argcount > argtypecount)) ++ { ++ if (FFI_OK != ffi_prep_cif_var(&cif, ++ cc, ++ argtypecount, ++ argcount, ++ restype, ++ atypes)) { ++ PyErr_SetString(PyExc_RuntimeError, ++ "ffi_prep_cif_var failed"); ++ return -1; ++ } ++ } else { ++#endif ++ if (FFI_OK != ffi_prep_cif(&cif, ++ cc, ++ argcount, ++ restype, ++ atypes)) { ++ PyErr_SetString(PyExc_RuntimeError, ++ "ffi_prep_cif failed"); ++ return -1; ++ } ++#if HAVE_FFI_PREP_CIF_VAR + } ++#endif + + if (flags & (FUNCFLAG_USE_ERRNO | FUNCFLAG_USE_LASTERROR)) { + error_object = _ctypes_get_errobj(&space); +@@ -1187,9 +1214,8 @@ PyObject *_ctypes_callproc(PPROC pProc, + + if (-1 == _call_function_pointer(flags, pProc, avalues, atypes, + rtype, resbuf, +- Py_SAFE_DOWNCAST(argcount, +- Py_ssize_t, +- int))) ++ Py_SAFE_DOWNCAST(argcount, Py_ssize_t, int), ++ Py_SAFE_DOWNCAST(argtype_count, Py_ssize_t, int))) + goto cleanup; + + #ifdef WORDS_BIGENDIAN +diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h +index e58f85233c..e45975f6ad 100644 +--- a/Modules/_ctypes/ctypes.h ++++ b/Modules/_ctypes/ctypes.h +@@ -285,6 +285,7 @@ PyObject *_ctypes_callproc(PPROC pProc, + #define FUNCFLAG_PYTHONAPI 0x4 + #define FUNCFLAG_USE_ERRNO 0x8 + #define FUNCFLAG_USE_LASTERROR 0x10 ++#define FUNCFLAG_VARIADIC 0x20 + + #define TYPEFLAG_ISPOINTER 0x100 + #define TYPEFLAG_HASPOINTER 0x200 +diff --git a/setup.py b/setup.py +index bf90600eaa..48ff120e9a 100644 +--- a/setup.py ++++ b/setup.py +@@ -142,6 +142,13 @@ def macosx_sdk_root(): + + return MACOS_SDK_ROOT + ++def is_macosx_at_least(vers): ++ if host_platform == 'darwin': ++ dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') ++ if dep_target: ++ return tuple(map(int, str(dep_target).split('.'))) >= vers ++ return False ++ + def is_macosx_sdk_path(path): + """ + Returns True if 'path' can be located in an OSX SDK +@@ -150,6 +157,13 @@ def is_macosx_sdk_path(path): + or path.startswith('/System/') + or path.startswith('/Library/') ) + ++def grep_headers_for(function, headers): ++ for header in headers: ++ with open(header, 'r') as f: ++ if function in f.read(): ++ return True ++ return False ++ + def find_file(filename, std_dirs, paths): + """Searches for the directory where a given file is located, + and returns a possibly-empty list of additional directories, or None +@@ -1972,7 +1986,11 @@ class PyBuildExt(build_ext): + return True + + def detect_ctypes(self, inc_dirs, lib_dirs): +- self.use_system_libffi = False ++ if not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and is_macosx_at_least((10,15)): ++ self.use_system_libffi = True ++ else: ++ self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS") ++ + include_dirs = [] + extra_compile_args = [] + extra_link_args = [] +@@ -2018,30 +2036,47 @@ class PyBuildExt(build_ext): + libraries=['m']) + self.extensions.extend([ext, ext_test]) + ++ ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR") ++ ffi_lib = None ++ + if host_platform == 'darwin': +- if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"): ++ if not self.use_system_libffi: + return +- # OS X 10.5 comes with libffi.dylib; the include files are +- # in /usr/include/ffi +- inc_dirs.append('/usr/include/ffi') +- +- ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] +- if not ffi_inc or ffi_inc[0] == '': +- ffi_inc = find_file('ffi.h', [], inc_dirs) +- if ffi_inc is not None: +- ffi_h = ffi_inc[0] + '/ffi.h' ++ ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi") ++ if os.path.exists(ffi_in_sdk): ++ ffi_inc = ffi_in_sdk ++ ffi_lib = 'ffi' ++ else: ++ # OS X 10.5 comes with libffi.dylib; the include files are ++ # in /usr/include/ffi ++ inc_dirs.append('/usr/include/ffi') ++ ++ if not ffi_inc: ++ found = find_file('ffi.h', [], inc_dirs) ++ if found: ++ ffi_inc = found[0] ++ if ffi_inc: ++ ffi_h = ffi_inc + '/ffi.h' + if not os.path.exists(ffi_h): + ffi_inc = None + print('Header file {} does not exist'.format(ffi_h)) +- ffi_lib = None +- if ffi_inc is not None: +- for lib_name in ('ffi', 'ffi_pic'): ++ ++ if ffi_lib is None and ffi_inc: ++ for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'): + if (self.compiler.find_library_file(lib_dirs, lib_name)): + ffi_lib = lib_name + break + + if ffi_inc and ffi_lib: +- ext.include_dirs.extend(ffi_inc) ++ ffi_headers = glob(os.path.join(ffi_inc, '*.h')) ++ if grep_headers_for('ffi_closure_alloc', ffi_headers): ++ try: ++ sources.remove('_ctypes/malloc_closure.c') ++ except ValueError: ++ pass ++ if grep_headers_for('ffi_prep_cif_var', ffi_headers): ++ ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1") ++ ext.include_dirs.append(ffi_inc) + ext.libraries.append(ffi_lib) + self.use_system_libffi = True + +-- +2.30.1 (Apple Git-130) + diff --git a/plugins/python-build/share/python-build/patches/3.7.12/Python-3.7.12/0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch b/plugins/python-build/share/python-build/patches/3.7.12/Python-3.7.12/0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch new file mode 100644 index 0000000..dd47660 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.12/Python-3.7.12/0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch @@ -0,0 +1,36 @@ +From 604d95e235d86465b8c17f02095edcaf18464d4c Mon Sep 17 00:00:00 2001 +From: Lawrence D'Anna <64555057+lawrence-danna-apple@users.noreply.github.com> +Date: Tue, 30 Jun 2020 02:15:46 -0700 +Subject: [PATCH] bpo-41100: fix _decimal for arm64 Mac OS (GH-21228) + +Patch by Lawrence Danna. +--- + .../Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst | 1 + + Modules/_decimal/libmpdec/mpdecimal.h | 3 +++ + 2 files changed, 4 insertions(+) + create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst + +diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst +new file mode 100644 +index 0000000000..d6176d69f0 +--- /dev/null ++++ b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst +@@ -0,0 +1 @@ ++add arm64 to the allowable Mac OS arches in mpdecimal.h +\ No newline at end of file +diff --git a/Modules/_decimal/libmpdec/mpdecimal.h b/Modules/_decimal/libmpdec/mpdecimal.h +index 108b76efa8..35ce429f60 100644 +--- a/Modules/_decimal/libmpdec/mpdecimal.h ++++ b/Modules/_decimal/libmpdec/mpdecimal.h +@@ -135,6 +135,9 @@ const char *mpd_version(void); + #elif defined(__x86_64__) + #define CONFIG_64 + #define ASM ++ #elif defined(__arm64__) ++ #define CONFIG_64 ++ #define ANSI + #else + #error "unknown architecture for universal build." + #endif +-- +2.30.1 (Apple Git-130) diff --git a/plugins/python-build/share/python-build/patches/3.7.12/Python-3.7.12/0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch b/plugins/python-build/share/python-build/patches/3.7.12/Python-3.7.12/0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch new file mode 100644 index 0000000..773b69f --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.12/Python-3.7.12/0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch @@ -0,0 +1,30 @@ +From 245427d207ee88a4ba26a66c3de350bcbcc036f2 Mon Sep 17 00:00:00 2001 +From: Ronald Oussoren +Date: Sat, 14 Nov 2020 16:07:47 +0100 +Subject: [PATCH] bpo-42351: Avoid error when opening header with non-UTF8 + encoding (GH-23279) + +grep_headers_for() would error out when a header contained +text that cannot be interpreted as UTF-8. + +cherry-picked from 7a27c7ed4b by Pedro Fonini +--- + setup.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/setup.py b/setup.py +index f211989aac..467362813d 100644 +--- a/setup.py ++++ b/setup.py +@@ -159,7 +159,7 @@ def is_macosx_sdk_path(path): + + def grep_headers_for(function, headers): + for header in headers: +- with open(header, 'r') as f: ++ with open(header, 'r', errors='surrogateescape') as f: + if function in f.read(): + return True + return False +-- +2.34.1 + diff --git a/plugins/python-build/share/python-build/patches/3.7.12/Python-3.7.12/0004-bpo-45405-Prevent-internal-configure-error-when-runn.patch b/plugins/python-build/share/python-build/patches/3.7.12/Python-3.7.12/0004-bpo-45405-Prevent-internal-configure-error-when-runn.patch new file mode 100644 index 0000000..d0ff77c --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.12/Python-3.7.12/0004-bpo-45405-Prevent-internal-configure-error-when-runn.patch @@ -0,0 +1,43 @@ +From 720bb456dc711b0776bae837d1f9a0b10c28ddf2 Mon Sep 17 00:00:00 2001 +From: Ned Deily +Date: Tue, 15 Mar 2022 03:18:39 -0400 +Subject: [PATCH] bpo-45405: Prevent internal configure error when running + configure with recent versions of clang. (GH-28845) (GH-31890) + +Change the configure logic to function properly on macOS when the compiler +outputs a platform triplet for option --print-multiarch. +The Apple Clang included with Xcode 13.3 now supports --print-multiarch +causing configure to fail without this change. +--- + configure | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git configure configure +index 829dd69bb8..455481bc50 100755 +--- a/configure ++++ b/configure +@@ -5183,9 +5183,6 @@ $as_echo "$as_me: + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 + $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } + cat >> conftest.c <&6; } + fi + rm -f conftest.c conftest.out + ++if test x$PLATFORM_TRIPLET != xdarwin; then ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null) ++fi ++ ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 +-- +2.35.1 + diff --git a/plugins/python-build/share/python-build/patches/3.7.13/Python-3.7.13/0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch b/plugins/python-build/share/python-build/patches/3.7.13/Python-3.7.13/0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch new file mode 100644 index 0000000..f23946d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.13/Python-3.7.13/0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch @@ -0,0 +1,310 @@ +From: Christian Hammond +Date: Wed, 15 Dec 2021 23:12:36 -0800 +Subject: Port ctypes and system libffi patches for arm64/macOS 10.15+ to Python 3.7.12 + +This ports the following ctypes and libffi pyenv patches for Python +2.7.18 to Python 3.7.12: + +* `0004-Use-system-libffi-for-Mac-OS-10.15-and-up.patch` +* `0005-ctypes-use-the-correct-ABI-for-variadic-functions.patch` +* `0006-ctypes-probe-libffi-for-ffi_closure_alloc-and-ffi_pr.patch` + +These patches enable use of system libffi (fixing a broken `ctypes` +module on arm64 targets) and enable calling variadic functions on arm64. +They've been combined from patches port from Homebrew to pyenv by Takumi +Sueda, updated to work on the Python 3.7.12 codebase. + +The Homebrew patches are themselves backports of changes in Python 3.9 +and 3.10. That patch can be found at: + +https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch + +diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst +index 715d595b24..7743144978 100644 +--- a/Doc/library/ctypes.rst ++++ b/Doc/library/ctypes.rst +@@ -1551,6 +1551,13 @@ They are instances of a private class: + value usable as argument (integer, string, ctypes instance). This allows + defining adapters that can adapt custom objects as function parameters. + ++ .. attribute:: variadic ++ ++ Assign a boolean to specify that the function takes a variable number of ++ arguments. This does not matter on most platforms, but for Apple arm64 ++ platforms variadic functions have a different calling convention than ++ normal functions. ++ + .. attribute:: errcheck + + Assign a Python function or another callable to this attribute. The +diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py +index 4ebd82d3e0..7b73c190b6 100644 +--- a/Lib/test/test_unicode.py ++++ b/Lib/test/test_unicode.py +@@ -2458,11 +2458,14 @@ class CAPITest(unittest.TestCase): + def test_from_format(self): + support.import_module('ctypes') + from ctypes import ( ++ c_char_p, + pythonapi, py_object, sizeof, + c_int, c_long, c_longlong, c_ssize_t, + c_uint, c_ulong, c_ulonglong, c_size_t, c_void_p) + name = "PyUnicode_FromFormat" + _PyUnicode_FromFormat = getattr(pythonapi, name) ++ _PyUnicode_FromFormat.argtypes = (c_char_p,) ++ _PyUnicode_FromFormat.variadic = True + _PyUnicode_FromFormat.restype = py_object + + def PyUnicode_FromFormat(format, *args): +diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c +index dd0c61fd8a..79137e1dc7 100644 +--- a/Modules/_ctypes/_ctypes.c ++++ b/Modules/_ctypes/_ctypes.c +@@ -3174,6 +3174,34 @@ PyCFuncPtr_get_restype(PyCFuncPtrObject *self, void *Py_UNUSED(ignored)) + } + } + ++static int ++PyCFuncPtr_set_variadic(PyCFuncPtrObject *self, PyObject *ob) ++{ ++ StgDictObject *dict = PyObject_stgdict((PyObject *)self); ++ assert(dict); ++ int r = PyObject_IsTrue(ob); ++ if (r == 1) { ++ dict->flags |= FUNCFLAG_VARIADIC; ++ return 0; ++ } else if (r == 0) { ++ dict->flags &= ~FUNCFLAG_VARIADIC; ++ return 0; ++ } else { ++ return -1; ++ } ++} ++ ++static PyObject * ++PyCFuncPtr_get_variadic(PyCFuncPtrObject *self) ++{ ++ StgDictObject *dict = PyObject_stgdict((PyObject *)self); ++ assert(dict); /* Cannot be NULL for PyCFuncPtrObject instances */ ++ if (dict->flags & FUNCFLAG_VARIADIC) ++ Py_RETURN_TRUE; ++ else ++ Py_RETURN_FALSE; ++} ++ + static int + PyCFuncPtr_set_argtypes(PyCFuncPtrObject *self, PyObject *ob, void *Py_UNUSED(ignored)) + { +@@ -3219,6 +3247,8 @@ static PyGetSetDef PyCFuncPtr_getsets[] = { + { "argtypes", (getter)PyCFuncPtr_get_argtypes, + (setter)PyCFuncPtr_set_argtypes, + "specify the argument types", NULL }, ++ { "variadic", (getter)PyCFuncPtr_get_variadic, (setter)PyCFuncPtr_set_variadic, ++ "specify if function takes variable number of arguments", NULL }, + { NULL, NULL } + }; + +@@ -5632,6 +5662,7 @@ PyInit__ctypes(void) + PyModule_AddObject(m, "FUNCFLAG_USE_ERRNO", PyLong_FromLong(FUNCFLAG_USE_ERRNO)); + PyModule_AddObject(m, "FUNCFLAG_USE_LASTERROR", PyLong_FromLong(FUNCFLAG_USE_LASTERROR)); + PyModule_AddObject(m, "FUNCFLAG_PYTHONAPI", PyLong_FromLong(FUNCFLAG_PYTHONAPI)); ++ PyModule_AddObject(m, "FUNCFLAG_VARIADIC", PyLong_FromLong(FUNCFLAG_VARIADIC)); + PyModule_AddStringConstant(m, "__version__", "1.1.0"); + + PyModule_AddObject(m, "_memmove_addr", PyLong_FromVoidPtr(memmove)); +diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c +index 9cbf9801ad..e7fe11176b 100644 +--- a/Modules/_ctypes/callproc.c ++++ b/Modules/_ctypes/callproc.c +@@ -754,7 +756,8 @@ static int _call_function_pointer(int flags, + ffi_type **atypes, + ffi_type *restype, + void *resmem, +- int argcount) ++ int argcount, ++ int argtypecount) + { + PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */ + PyObject *error_object = NULL; +@@ -780,15 +783,39 @@ static int _call_function_pointer(int flags, + if ((flags & FUNCFLAG_CDECL) == 0) + cc = FFI_STDCALL; + #endif +- if (FFI_OK != ffi_prep_cif(&cif, +- cc, +- argcount, +- restype, +- atypes)) { +- PyErr_SetString(PyExc_RuntimeError, +- "ffi_prep_cif failed"); +- return -1; ++ ++#if HAVE_FFI_PREP_CIF_VAR ++ /* Everyone SHOULD set f.variadic=True on variadic function pointers, but ++ * lots of existing code will not. If there's at least one arg and more ++ * args are passed than are defined in the prototype, then it must be a ++ * variadic function. */ ++ if ((flags & FUNCFLAG_VARIADIC) || ++ (argtypecount != 0 && argcount > argtypecount)) ++ { ++ if (FFI_OK != ffi_prep_cif_var(&cif, ++ cc, ++ argtypecount, ++ argcount, ++ restype, ++ atypes)) { ++ PyErr_SetString(PyExc_RuntimeError, ++ "ffi_prep_cif_var failed"); ++ return -1; ++ } ++ } else { ++#endif ++ if (FFI_OK != ffi_prep_cif(&cif, ++ cc, ++ argcount, ++ restype, ++ atypes)) { ++ PyErr_SetString(PyExc_RuntimeError, ++ "ffi_prep_cif failed"); ++ return -1; ++ } ++#if HAVE_FFI_PREP_CIF_VAR + } ++#endif + + if (flags & (FUNCFLAG_USE_ERRNO | FUNCFLAG_USE_LASTERROR)) { + error_object = _ctypes_get_errobj(&space); +@@ -1187,9 +1214,8 @@ PyObject *_ctypes_callproc(PPROC pProc, + + if (-1 == _call_function_pointer(flags, pProc, avalues, atypes, + rtype, resbuf, +- Py_SAFE_DOWNCAST(argcount, +- Py_ssize_t, +- int))) ++ Py_SAFE_DOWNCAST(argcount, Py_ssize_t, int), ++ Py_SAFE_DOWNCAST(argtype_count, Py_ssize_t, int))) + goto cleanup; + + #ifdef WORDS_BIGENDIAN +diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h +index e58f85233c..e45975f6ad 100644 +--- a/Modules/_ctypes/ctypes.h ++++ b/Modules/_ctypes/ctypes.h +@@ -285,6 +285,7 @@ PyObject *_ctypes_callproc(PPROC pProc, + #define FUNCFLAG_PYTHONAPI 0x4 + #define FUNCFLAG_USE_ERRNO 0x8 + #define FUNCFLAG_USE_LASTERROR 0x10 ++#define FUNCFLAG_VARIADIC 0x20 + + #define TYPEFLAG_ISPOINTER 0x100 + #define TYPEFLAG_HASPOINTER 0x200 +diff --git a/setup.py b/setup.py +index bf90600eaa..48ff120e9a 100644 +--- a/setup.py ++++ b/setup.py +@@ -142,6 +142,13 @@ def macosx_sdk_root(): + + return MACOS_SDK_ROOT + ++def is_macosx_at_least(vers): ++ if host_platform == 'darwin': ++ dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') ++ if dep_target: ++ return tuple(map(int, str(dep_target).split('.'))) >= vers ++ return False ++ + def is_macosx_sdk_path(path): + """ + Returns True if 'path' can be located in an OSX SDK +@@ -150,6 +157,13 @@ def is_macosx_sdk_path(path): + or path.startswith('/System/') + or path.startswith('/Library/') ) + ++def grep_headers_for(function, headers): ++ for header in headers: ++ with open(header, 'r') as f: ++ if function in f.read(): ++ return True ++ return False ++ + def find_file(filename, std_dirs, paths): + """Searches for the directory where a given file is located, + and returns a possibly-empty list of additional directories, or None +@@ -1972,7 +1986,11 @@ class PyBuildExt(build_ext): + return True + + def detect_ctypes(self, inc_dirs, lib_dirs): +- self.use_system_libffi = False ++ if not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and is_macosx_at_least((10,15)): ++ self.use_system_libffi = True ++ else: ++ self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS") ++ + include_dirs = [] + extra_compile_args = [] + extra_link_args = [] +@@ -2018,30 +2036,47 @@ class PyBuildExt(build_ext): + libraries=['m']) + self.extensions.extend([ext, ext_test]) + ++ ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR") ++ ffi_lib = None ++ + if host_platform == 'darwin': +- if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"): ++ if not self.use_system_libffi: + return +- # OS X 10.5 comes with libffi.dylib; the include files are +- # in /usr/include/ffi +- inc_dirs.append('/usr/include/ffi') +- +- ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] +- if not ffi_inc or ffi_inc[0] == '': +- ffi_inc = find_file('ffi.h', [], inc_dirs) +- if ffi_inc is not None: +- ffi_h = ffi_inc[0] + '/ffi.h' ++ ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi") ++ if os.path.exists(ffi_in_sdk): ++ ffi_inc = ffi_in_sdk ++ ffi_lib = 'ffi' ++ else: ++ # OS X 10.5 comes with libffi.dylib; the include files are ++ # in /usr/include/ffi ++ inc_dirs.append('/usr/include/ffi') ++ ++ if not ffi_inc: ++ found = find_file('ffi.h', [], inc_dirs) ++ if found: ++ ffi_inc = found[0] ++ if ffi_inc: ++ ffi_h = ffi_inc + '/ffi.h' + if not os.path.exists(ffi_h): + ffi_inc = None + print('Header file {} does not exist'.format(ffi_h)) +- ffi_lib = None +- if ffi_inc is not None: +- for lib_name in ('ffi', 'ffi_pic'): ++ ++ if ffi_lib is None and ffi_inc: ++ for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'): + if (self.compiler.find_library_file(lib_dirs, lib_name)): + ffi_lib = lib_name + break + + if ffi_inc and ffi_lib: +- ext.include_dirs.extend(ffi_inc) ++ ffi_headers = glob(os.path.join(ffi_inc, '*.h')) ++ if grep_headers_for('ffi_closure_alloc', ffi_headers): ++ try: ++ sources.remove('_ctypes/malloc_closure.c') ++ except ValueError: ++ pass ++ if grep_headers_for('ffi_prep_cif_var', ffi_headers): ++ ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1") ++ ext.include_dirs.append(ffi_inc) + ext.libraries.append(ffi_lib) + self.use_system_libffi = True + +-- +2.30.1 (Apple Git-130) + diff --git a/plugins/python-build/share/python-build/patches/3.7.13/Python-3.7.13/0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch b/plugins/python-build/share/python-build/patches/3.7.13/Python-3.7.13/0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch new file mode 100644 index 0000000..dd47660 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.13/Python-3.7.13/0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch @@ -0,0 +1,36 @@ +From 604d95e235d86465b8c17f02095edcaf18464d4c Mon Sep 17 00:00:00 2001 +From: Lawrence D'Anna <64555057+lawrence-danna-apple@users.noreply.github.com> +Date: Tue, 30 Jun 2020 02:15:46 -0700 +Subject: [PATCH] bpo-41100: fix _decimal for arm64 Mac OS (GH-21228) + +Patch by Lawrence Danna. +--- + .../Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst | 1 + + Modules/_decimal/libmpdec/mpdecimal.h | 3 +++ + 2 files changed, 4 insertions(+) + create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst + +diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst +new file mode 100644 +index 0000000000..d6176d69f0 +--- /dev/null ++++ b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst +@@ -0,0 +1 @@ ++add arm64 to the allowable Mac OS arches in mpdecimal.h +\ No newline at end of file +diff --git a/Modules/_decimal/libmpdec/mpdecimal.h b/Modules/_decimal/libmpdec/mpdecimal.h +index 108b76efa8..35ce429f60 100644 +--- a/Modules/_decimal/libmpdec/mpdecimal.h ++++ b/Modules/_decimal/libmpdec/mpdecimal.h +@@ -135,6 +135,9 @@ const char *mpd_version(void); + #elif defined(__x86_64__) + #define CONFIG_64 + #define ASM ++ #elif defined(__arm64__) ++ #define CONFIG_64 ++ #define ANSI + #else + #error "unknown architecture for universal build." + #endif +-- +2.30.1 (Apple Git-130) diff --git a/plugins/python-build/share/python-build/patches/3.7.13/Python-3.7.13/0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch b/plugins/python-build/share/python-build/patches/3.7.13/Python-3.7.13/0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch new file mode 100644 index 0000000..773b69f --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.13/Python-3.7.13/0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch @@ -0,0 +1,30 @@ +From 245427d207ee88a4ba26a66c3de350bcbcc036f2 Mon Sep 17 00:00:00 2001 +From: Ronald Oussoren +Date: Sat, 14 Nov 2020 16:07:47 +0100 +Subject: [PATCH] bpo-42351: Avoid error when opening header with non-UTF8 + encoding (GH-23279) + +grep_headers_for() would error out when a header contained +text that cannot be interpreted as UTF-8. + +cherry-picked from 7a27c7ed4b by Pedro Fonini +--- + setup.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/setup.py b/setup.py +index f211989aac..467362813d 100644 +--- a/setup.py ++++ b/setup.py +@@ -159,7 +159,7 @@ def is_macosx_sdk_path(path): + + def grep_headers_for(function, headers): + for header in headers: +- with open(header, 'r') as f: ++ with open(header, 'r', errors='surrogateescape') as f: + if function in f.read(): + return True + return False +-- +2.34.1 + diff --git a/plugins/python-build/share/python-build/patches/3.7.14/Python-3.7.14/0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch b/plugins/python-build/share/python-build/patches/3.7.14/Python-3.7.14/0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch new file mode 100644 index 0000000..f23946d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.14/Python-3.7.14/0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch @@ -0,0 +1,310 @@ +From: Christian Hammond +Date: Wed, 15 Dec 2021 23:12:36 -0800 +Subject: Port ctypes and system libffi patches for arm64/macOS 10.15+ to Python 3.7.12 + +This ports the following ctypes and libffi pyenv patches for Python +2.7.18 to Python 3.7.12: + +* `0004-Use-system-libffi-for-Mac-OS-10.15-and-up.patch` +* `0005-ctypes-use-the-correct-ABI-for-variadic-functions.patch` +* `0006-ctypes-probe-libffi-for-ffi_closure_alloc-and-ffi_pr.patch` + +These patches enable use of system libffi (fixing a broken `ctypes` +module on arm64 targets) and enable calling variadic functions on arm64. +They've been combined from patches port from Homebrew to pyenv by Takumi +Sueda, updated to work on the Python 3.7.12 codebase. + +The Homebrew patches are themselves backports of changes in Python 3.9 +and 3.10. That patch can be found at: + +https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch + +diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst +index 715d595b24..7743144978 100644 +--- a/Doc/library/ctypes.rst ++++ b/Doc/library/ctypes.rst +@@ -1551,6 +1551,13 @@ They are instances of a private class: + value usable as argument (integer, string, ctypes instance). This allows + defining adapters that can adapt custom objects as function parameters. + ++ .. attribute:: variadic ++ ++ Assign a boolean to specify that the function takes a variable number of ++ arguments. This does not matter on most platforms, but for Apple arm64 ++ platforms variadic functions have a different calling convention than ++ normal functions. ++ + .. attribute:: errcheck + + Assign a Python function or another callable to this attribute. The +diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py +index 4ebd82d3e0..7b73c190b6 100644 +--- a/Lib/test/test_unicode.py ++++ b/Lib/test/test_unicode.py +@@ -2458,11 +2458,14 @@ class CAPITest(unittest.TestCase): + def test_from_format(self): + support.import_module('ctypes') + from ctypes import ( ++ c_char_p, + pythonapi, py_object, sizeof, + c_int, c_long, c_longlong, c_ssize_t, + c_uint, c_ulong, c_ulonglong, c_size_t, c_void_p) + name = "PyUnicode_FromFormat" + _PyUnicode_FromFormat = getattr(pythonapi, name) ++ _PyUnicode_FromFormat.argtypes = (c_char_p,) ++ _PyUnicode_FromFormat.variadic = True + _PyUnicode_FromFormat.restype = py_object + + def PyUnicode_FromFormat(format, *args): +diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c +index dd0c61fd8a..79137e1dc7 100644 +--- a/Modules/_ctypes/_ctypes.c ++++ b/Modules/_ctypes/_ctypes.c +@@ -3174,6 +3174,34 @@ PyCFuncPtr_get_restype(PyCFuncPtrObject *self, void *Py_UNUSED(ignored)) + } + } + ++static int ++PyCFuncPtr_set_variadic(PyCFuncPtrObject *self, PyObject *ob) ++{ ++ StgDictObject *dict = PyObject_stgdict((PyObject *)self); ++ assert(dict); ++ int r = PyObject_IsTrue(ob); ++ if (r == 1) { ++ dict->flags |= FUNCFLAG_VARIADIC; ++ return 0; ++ } else if (r == 0) { ++ dict->flags &= ~FUNCFLAG_VARIADIC; ++ return 0; ++ } else { ++ return -1; ++ } ++} ++ ++static PyObject * ++PyCFuncPtr_get_variadic(PyCFuncPtrObject *self) ++{ ++ StgDictObject *dict = PyObject_stgdict((PyObject *)self); ++ assert(dict); /* Cannot be NULL for PyCFuncPtrObject instances */ ++ if (dict->flags & FUNCFLAG_VARIADIC) ++ Py_RETURN_TRUE; ++ else ++ Py_RETURN_FALSE; ++} ++ + static int + PyCFuncPtr_set_argtypes(PyCFuncPtrObject *self, PyObject *ob, void *Py_UNUSED(ignored)) + { +@@ -3219,6 +3247,8 @@ static PyGetSetDef PyCFuncPtr_getsets[] = { + { "argtypes", (getter)PyCFuncPtr_get_argtypes, + (setter)PyCFuncPtr_set_argtypes, + "specify the argument types", NULL }, ++ { "variadic", (getter)PyCFuncPtr_get_variadic, (setter)PyCFuncPtr_set_variadic, ++ "specify if function takes variable number of arguments", NULL }, + { NULL, NULL } + }; + +@@ -5632,6 +5662,7 @@ PyInit__ctypes(void) + PyModule_AddObject(m, "FUNCFLAG_USE_ERRNO", PyLong_FromLong(FUNCFLAG_USE_ERRNO)); + PyModule_AddObject(m, "FUNCFLAG_USE_LASTERROR", PyLong_FromLong(FUNCFLAG_USE_LASTERROR)); + PyModule_AddObject(m, "FUNCFLAG_PYTHONAPI", PyLong_FromLong(FUNCFLAG_PYTHONAPI)); ++ PyModule_AddObject(m, "FUNCFLAG_VARIADIC", PyLong_FromLong(FUNCFLAG_VARIADIC)); + PyModule_AddStringConstant(m, "__version__", "1.1.0"); + + PyModule_AddObject(m, "_memmove_addr", PyLong_FromVoidPtr(memmove)); +diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c +index 9cbf9801ad..e7fe11176b 100644 +--- a/Modules/_ctypes/callproc.c ++++ b/Modules/_ctypes/callproc.c +@@ -754,7 +756,8 @@ static int _call_function_pointer(int flags, + ffi_type **atypes, + ffi_type *restype, + void *resmem, +- int argcount) ++ int argcount, ++ int argtypecount) + { + PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */ + PyObject *error_object = NULL; +@@ -780,15 +783,39 @@ static int _call_function_pointer(int flags, + if ((flags & FUNCFLAG_CDECL) == 0) + cc = FFI_STDCALL; + #endif +- if (FFI_OK != ffi_prep_cif(&cif, +- cc, +- argcount, +- restype, +- atypes)) { +- PyErr_SetString(PyExc_RuntimeError, +- "ffi_prep_cif failed"); +- return -1; ++ ++#if HAVE_FFI_PREP_CIF_VAR ++ /* Everyone SHOULD set f.variadic=True on variadic function pointers, but ++ * lots of existing code will not. If there's at least one arg and more ++ * args are passed than are defined in the prototype, then it must be a ++ * variadic function. */ ++ if ((flags & FUNCFLAG_VARIADIC) || ++ (argtypecount != 0 && argcount > argtypecount)) ++ { ++ if (FFI_OK != ffi_prep_cif_var(&cif, ++ cc, ++ argtypecount, ++ argcount, ++ restype, ++ atypes)) { ++ PyErr_SetString(PyExc_RuntimeError, ++ "ffi_prep_cif_var failed"); ++ return -1; ++ } ++ } else { ++#endif ++ if (FFI_OK != ffi_prep_cif(&cif, ++ cc, ++ argcount, ++ restype, ++ atypes)) { ++ PyErr_SetString(PyExc_RuntimeError, ++ "ffi_prep_cif failed"); ++ return -1; ++ } ++#if HAVE_FFI_PREP_CIF_VAR + } ++#endif + + if (flags & (FUNCFLAG_USE_ERRNO | FUNCFLAG_USE_LASTERROR)) { + error_object = _ctypes_get_errobj(&space); +@@ -1187,9 +1214,8 @@ PyObject *_ctypes_callproc(PPROC pProc, + + if (-1 == _call_function_pointer(flags, pProc, avalues, atypes, + rtype, resbuf, +- Py_SAFE_DOWNCAST(argcount, +- Py_ssize_t, +- int))) ++ Py_SAFE_DOWNCAST(argcount, Py_ssize_t, int), ++ Py_SAFE_DOWNCAST(argtype_count, Py_ssize_t, int))) + goto cleanup; + + #ifdef WORDS_BIGENDIAN +diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h +index e58f85233c..e45975f6ad 100644 +--- a/Modules/_ctypes/ctypes.h ++++ b/Modules/_ctypes/ctypes.h +@@ -285,6 +285,7 @@ PyObject *_ctypes_callproc(PPROC pProc, + #define FUNCFLAG_PYTHONAPI 0x4 + #define FUNCFLAG_USE_ERRNO 0x8 + #define FUNCFLAG_USE_LASTERROR 0x10 ++#define FUNCFLAG_VARIADIC 0x20 + + #define TYPEFLAG_ISPOINTER 0x100 + #define TYPEFLAG_HASPOINTER 0x200 +diff --git a/setup.py b/setup.py +index bf90600eaa..48ff120e9a 100644 +--- a/setup.py ++++ b/setup.py +@@ -142,6 +142,13 @@ def macosx_sdk_root(): + + return MACOS_SDK_ROOT + ++def is_macosx_at_least(vers): ++ if host_platform == 'darwin': ++ dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') ++ if dep_target: ++ return tuple(map(int, str(dep_target).split('.'))) >= vers ++ return False ++ + def is_macosx_sdk_path(path): + """ + Returns True if 'path' can be located in an OSX SDK +@@ -150,6 +157,13 @@ def is_macosx_sdk_path(path): + or path.startswith('/System/') + or path.startswith('/Library/') ) + ++def grep_headers_for(function, headers): ++ for header in headers: ++ with open(header, 'r') as f: ++ if function in f.read(): ++ return True ++ return False ++ + def find_file(filename, std_dirs, paths): + """Searches for the directory where a given file is located, + and returns a possibly-empty list of additional directories, or None +@@ -1972,7 +1986,11 @@ class PyBuildExt(build_ext): + return True + + def detect_ctypes(self, inc_dirs, lib_dirs): +- self.use_system_libffi = False ++ if not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and is_macosx_at_least((10,15)): ++ self.use_system_libffi = True ++ else: ++ self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS") ++ + include_dirs = [] + extra_compile_args = [] + extra_link_args = [] +@@ -2018,30 +2036,47 @@ class PyBuildExt(build_ext): + libraries=['m']) + self.extensions.extend([ext, ext_test]) + ++ ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR") ++ ffi_lib = None ++ + if host_platform == 'darwin': +- if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"): ++ if not self.use_system_libffi: + return +- # OS X 10.5 comes with libffi.dylib; the include files are +- # in /usr/include/ffi +- inc_dirs.append('/usr/include/ffi') +- +- ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] +- if not ffi_inc or ffi_inc[0] == '': +- ffi_inc = find_file('ffi.h', [], inc_dirs) +- if ffi_inc is not None: +- ffi_h = ffi_inc[0] + '/ffi.h' ++ ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi") ++ if os.path.exists(ffi_in_sdk): ++ ffi_inc = ffi_in_sdk ++ ffi_lib = 'ffi' ++ else: ++ # OS X 10.5 comes with libffi.dylib; the include files are ++ # in /usr/include/ffi ++ inc_dirs.append('/usr/include/ffi') ++ ++ if not ffi_inc: ++ found = find_file('ffi.h', [], inc_dirs) ++ if found: ++ ffi_inc = found[0] ++ if ffi_inc: ++ ffi_h = ffi_inc + '/ffi.h' + if not os.path.exists(ffi_h): + ffi_inc = None + print('Header file {} does not exist'.format(ffi_h)) +- ffi_lib = None +- if ffi_inc is not None: +- for lib_name in ('ffi', 'ffi_pic'): ++ ++ if ffi_lib is None and ffi_inc: ++ for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'): + if (self.compiler.find_library_file(lib_dirs, lib_name)): + ffi_lib = lib_name + break + + if ffi_inc and ffi_lib: +- ext.include_dirs.extend(ffi_inc) ++ ffi_headers = glob(os.path.join(ffi_inc, '*.h')) ++ if grep_headers_for('ffi_closure_alloc', ffi_headers): ++ try: ++ sources.remove('_ctypes/malloc_closure.c') ++ except ValueError: ++ pass ++ if grep_headers_for('ffi_prep_cif_var', ffi_headers): ++ ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1") ++ ext.include_dirs.append(ffi_inc) + ext.libraries.append(ffi_lib) + self.use_system_libffi = True + +-- +2.30.1 (Apple Git-130) + diff --git a/plugins/python-build/share/python-build/patches/3.7.14/Python-3.7.14/0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch b/plugins/python-build/share/python-build/patches/3.7.14/Python-3.7.14/0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch new file mode 100644 index 0000000..8ad6c82 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.14/Python-3.7.14/0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch @@ -0,0 +1,37 @@ +From f2595c038ed7bfd182d9d05d83786106ebd02ca0 Mon Sep 17 00:00:00 2001 +From: Lawrence D'Anna <64555057+lawrence-danna-apple@users.noreply.github.com> +Date: Tue, 30 Jun 2020 02:15:46 -0700 +Subject: [PATCH] bpo-41100: fix _decimal for arm64 Mac OS (GH-21228) + +Patch by Lawrence Danna. +--- + .../Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst | 1 + + Modules/_decimal/libmpdec/mpdecimal.h | 3 +++ + 2 files changed, 4 insertions(+) + create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst + +diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst +new file mode 100644 +index 0000000000..d6176d69f0 +--- /dev/null ++++ b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst +@@ -0,0 +1 @@ ++add arm64 to the allowable Mac OS arches in mpdecimal.h +\ No newline at end of file +diff --git a/Modules/_decimal/libmpdec/mpdecimal.h b/Modules/_decimal/libmpdec/mpdecimal.h +index a67dd9bc12..3e9c8185c3 100644 +--- a/Modules/_decimal/libmpdec/mpdecimal.h ++++ b/Modules/_decimal/libmpdec/mpdecimal.h +@@ -135,6 +135,9 @@ const char *mpd_version(void); + #elif defined(__x86_64__) + #define CONFIG_64 + #define ASM ++ #elif defined(__arm64__) ++ #define CONFIG_64 ++ #define ANSI + #else + #error "unknown architecture for universal build." + #endif +-- +2.37.3 + diff --git a/plugins/python-build/share/python-build/patches/3.7.14/Python-3.7.14/0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch b/plugins/python-build/share/python-build/patches/3.7.14/Python-3.7.14/0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch new file mode 100644 index 0000000..773b69f --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.14/Python-3.7.14/0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch @@ -0,0 +1,30 @@ +From 245427d207ee88a4ba26a66c3de350bcbcc036f2 Mon Sep 17 00:00:00 2001 +From: Ronald Oussoren +Date: Sat, 14 Nov 2020 16:07:47 +0100 +Subject: [PATCH] bpo-42351: Avoid error when opening header with non-UTF8 + encoding (GH-23279) + +grep_headers_for() would error out when a header contained +text that cannot be interpreted as UTF-8. + +cherry-picked from 7a27c7ed4b by Pedro Fonini +--- + setup.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/setup.py b/setup.py +index f211989aac..467362813d 100644 +--- a/setup.py ++++ b/setup.py +@@ -159,7 +159,7 @@ def is_macosx_sdk_path(path): + + def grep_headers_for(function, headers): + for header in headers: +- with open(header, 'r') as f: ++ with open(header, 'r', errors='surrogateescape') as f: + if function in f.read(): + return True + return False +-- +2.34.1 + diff --git a/plugins/python-build/share/python-build/patches/3.7.15/Python-3.7.15/0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch b/plugins/python-build/share/python-build/patches/3.7.15/Python-3.7.15/0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch new file mode 100644 index 0000000..f23946d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.15/Python-3.7.15/0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch @@ -0,0 +1,310 @@ +From: Christian Hammond +Date: Wed, 15 Dec 2021 23:12:36 -0800 +Subject: Port ctypes and system libffi patches for arm64/macOS 10.15+ to Python 3.7.12 + +This ports the following ctypes and libffi pyenv patches for Python +2.7.18 to Python 3.7.12: + +* `0004-Use-system-libffi-for-Mac-OS-10.15-and-up.patch` +* `0005-ctypes-use-the-correct-ABI-for-variadic-functions.patch` +* `0006-ctypes-probe-libffi-for-ffi_closure_alloc-and-ffi_pr.patch` + +These patches enable use of system libffi (fixing a broken `ctypes` +module on arm64 targets) and enable calling variadic functions on arm64. +They've been combined from patches port from Homebrew to pyenv by Takumi +Sueda, updated to work on the Python 3.7.12 codebase. + +The Homebrew patches are themselves backports of changes in Python 3.9 +and 3.10. That patch can be found at: + +https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch + +diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst +index 715d595b24..7743144978 100644 +--- a/Doc/library/ctypes.rst ++++ b/Doc/library/ctypes.rst +@@ -1551,6 +1551,13 @@ They are instances of a private class: + value usable as argument (integer, string, ctypes instance). This allows + defining adapters that can adapt custom objects as function parameters. + ++ .. attribute:: variadic ++ ++ Assign a boolean to specify that the function takes a variable number of ++ arguments. This does not matter on most platforms, but for Apple arm64 ++ platforms variadic functions have a different calling convention than ++ normal functions. ++ + .. attribute:: errcheck + + Assign a Python function or another callable to this attribute. The +diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py +index 4ebd82d3e0..7b73c190b6 100644 +--- a/Lib/test/test_unicode.py ++++ b/Lib/test/test_unicode.py +@@ -2458,11 +2458,14 @@ class CAPITest(unittest.TestCase): + def test_from_format(self): + support.import_module('ctypes') + from ctypes import ( ++ c_char_p, + pythonapi, py_object, sizeof, + c_int, c_long, c_longlong, c_ssize_t, + c_uint, c_ulong, c_ulonglong, c_size_t, c_void_p) + name = "PyUnicode_FromFormat" + _PyUnicode_FromFormat = getattr(pythonapi, name) ++ _PyUnicode_FromFormat.argtypes = (c_char_p,) ++ _PyUnicode_FromFormat.variadic = True + _PyUnicode_FromFormat.restype = py_object + + def PyUnicode_FromFormat(format, *args): +diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c +index dd0c61fd8a..79137e1dc7 100644 +--- a/Modules/_ctypes/_ctypes.c ++++ b/Modules/_ctypes/_ctypes.c +@@ -3174,6 +3174,34 @@ PyCFuncPtr_get_restype(PyCFuncPtrObject *self, void *Py_UNUSED(ignored)) + } + } + ++static int ++PyCFuncPtr_set_variadic(PyCFuncPtrObject *self, PyObject *ob) ++{ ++ StgDictObject *dict = PyObject_stgdict((PyObject *)self); ++ assert(dict); ++ int r = PyObject_IsTrue(ob); ++ if (r == 1) { ++ dict->flags |= FUNCFLAG_VARIADIC; ++ return 0; ++ } else if (r == 0) { ++ dict->flags &= ~FUNCFLAG_VARIADIC; ++ return 0; ++ } else { ++ return -1; ++ } ++} ++ ++static PyObject * ++PyCFuncPtr_get_variadic(PyCFuncPtrObject *self) ++{ ++ StgDictObject *dict = PyObject_stgdict((PyObject *)self); ++ assert(dict); /* Cannot be NULL for PyCFuncPtrObject instances */ ++ if (dict->flags & FUNCFLAG_VARIADIC) ++ Py_RETURN_TRUE; ++ else ++ Py_RETURN_FALSE; ++} ++ + static int + PyCFuncPtr_set_argtypes(PyCFuncPtrObject *self, PyObject *ob, void *Py_UNUSED(ignored)) + { +@@ -3219,6 +3247,8 @@ static PyGetSetDef PyCFuncPtr_getsets[] = { + { "argtypes", (getter)PyCFuncPtr_get_argtypes, + (setter)PyCFuncPtr_set_argtypes, + "specify the argument types", NULL }, ++ { "variadic", (getter)PyCFuncPtr_get_variadic, (setter)PyCFuncPtr_set_variadic, ++ "specify if function takes variable number of arguments", NULL }, + { NULL, NULL } + }; + +@@ -5632,6 +5662,7 @@ PyInit__ctypes(void) + PyModule_AddObject(m, "FUNCFLAG_USE_ERRNO", PyLong_FromLong(FUNCFLAG_USE_ERRNO)); + PyModule_AddObject(m, "FUNCFLAG_USE_LASTERROR", PyLong_FromLong(FUNCFLAG_USE_LASTERROR)); + PyModule_AddObject(m, "FUNCFLAG_PYTHONAPI", PyLong_FromLong(FUNCFLAG_PYTHONAPI)); ++ PyModule_AddObject(m, "FUNCFLAG_VARIADIC", PyLong_FromLong(FUNCFLAG_VARIADIC)); + PyModule_AddStringConstant(m, "__version__", "1.1.0"); + + PyModule_AddObject(m, "_memmove_addr", PyLong_FromVoidPtr(memmove)); +diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c +index 9cbf9801ad..e7fe11176b 100644 +--- a/Modules/_ctypes/callproc.c ++++ b/Modules/_ctypes/callproc.c +@@ -754,7 +756,8 @@ static int _call_function_pointer(int flags, + ffi_type **atypes, + ffi_type *restype, + void *resmem, +- int argcount) ++ int argcount, ++ int argtypecount) + { + PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */ + PyObject *error_object = NULL; +@@ -780,15 +783,39 @@ static int _call_function_pointer(int flags, + if ((flags & FUNCFLAG_CDECL) == 0) + cc = FFI_STDCALL; + #endif +- if (FFI_OK != ffi_prep_cif(&cif, +- cc, +- argcount, +- restype, +- atypes)) { +- PyErr_SetString(PyExc_RuntimeError, +- "ffi_prep_cif failed"); +- return -1; ++ ++#if HAVE_FFI_PREP_CIF_VAR ++ /* Everyone SHOULD set f.variadic=True on variadic function pointers, but ++ * lots of existing code will not. If there's at least one arg and more ++ * args are passed than are defined in the prototype, then it must be a ++ * variadic function. */ ++ if ((flags & FUNCFLAG_VARIADIC) || ++ (argtypecount != 0 && argcount > argtypecount)) ++ { ++ if (FFI_OK != ffi_prep_cif_var(&cif, ++ cc, ++ argtypecount, ++ argcount, ++ restype, ++ atypes)) { ++ PyErr_SetString(PyExc_RuntimeError, ++ "ffi_prep_cif_var failed"); ++ return -1; ++ } ++ } else { ++#endif ++ if (FFI_OK != ffi_prep_cif(&cif, ++ cc, ++ argcount, ++ restype, ++ atypes)) { ++ PyErr_SetString(PyExc_RuntimeError, ++ "ffi_prep_cif failed"); ++ return -1; ++ } ++#if HAVE_FFI_PREP_CIF_VAR + } ++#endif + + if (flags & (FUNCFLAG_USE_ERRNO | FUNCFLAG_USE_LASTERROR)) { + error_object = _ctypes_get_errobj(&space); +@@ -1187,9 +1214,8 @@ PyObject *_ctypes_callproc(PPROC pProc, + + if (-1 == _call_function_pointer(flags, pProc, avalues, atypes, + rtype, resbuf, +- Py_SAFE_DOWNCAST(argcount, +- Py_ssize_t, +- int))) ++ Py_SAFE_DOWNCAST(argcount, Py_ssize_t, int), ++ Py_SAFE_DOWNCAST(argtype_count, Py_ssize_t, int))) + goto cleanup; + + #ifdef WORDS_BIGENDIAN +diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h +index e58f85233c..e45975f6ad 100644 +--- a/Modules/_ctypes/ctypes.h ++++ b/Modules/_ctypes/ctypes.h +@@ -285,6 +285,7 @@ PyObject *_ctypes_callproc(PPROC pProc, + #define FUNCFLAG_PYTHONAPI 0x4 + #define FUNCFLAG_USE_ERRNO 0x8 + #define FUNCFLAG_USE_LASTERROR 0x10 ++#define FUNCFLAG_VARIADIC 0x20 + + #define TYPEFLAG_ISPOINTER 0x100 + #define TYPEFLAG_HASPOINTER 0x200 +diff --git a/setup.py b/setup.py +index bf90600eaa..48ff120e9a 100644 +--- a/setup.py ++++ b/setup.py +@@ -142,6 +142,13 @@ def macosx_sdk_root(): + + return MACOS_SDK_ROOT + ++def is_macosx_at_least(vers): ++ if host_platform == 'darwin': ++ dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') ++ if dep_target: ++ return tuple(map(int, str(dep_target).split('.'))) >= vers ++ return False ++ + def is_macosx_sdk_path(path): + """ + Returns True if 'path' can be located in an OSX SDK +@@ -150,6 +157,13 @@ def is_macosx_sdk_path(path): + or path.startswith('/System/') + or path.startswith('/Library/') ) + ++def grep_headers_for(function, headers): ++ for header in headers: ++ with open(header, 'r') as f: ++ if function in f.read(): ++ return True ++ return False ++ + def find_file(filename, std_dirs, paths): + """Searches for the directory where a given file is located, + and returns a possibly-empty list of additional directories, or None +@@ -1972,7 +1986,11 @@ class PyBuildExt(build_ext): + return True + + def detect_ctypes(self, inc_dirs, lib_dirs): +- self.use_system_libffi = False ++ if not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and is_macosx_at_least((10,15)): ++ self.use_system_libffi = True ++ else: ++ self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS") ++ + include_dirs = [] + extra_compile_args = [] + extra_link_args = [] +@@ -2018,30 +2036,47 @@ class PyBuildExt(build_ext): + libraries=['m']) + self.extensions.extend([ext, ext_test]) + ++ ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR") ++ ffi_lib = None ++ + if host_platform == 'darwin': +- if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"): ++ if not self.use_system_libffi: + return +- # OS X 10.5 comes with libffi.dylib; the include files are +- # in /usr/include/ffi +- inc_dirs.append('/usr/include/ffi') +- +- ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] +- if not ffi_inc or ffi_inc[0] == '': +- ffi_inc = find_file('ffi.h', [], inc_dirs) +- if ffi_inc is not None: +- ffi_h = ffi_inc[0] + '/ffi.h' ++ ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi") ++ if os.path.exists(ffi_in_sdk): ++ ffi_inc = ffi_in_sdk ++ ffi_lib = 'ffi' ++ else: ++ # OS X 10.5 comes with libffi.dylib; the include files are ++ # in /usr/include/ffi ++ inc_dirs.append('/usr/include/ffi') ++ ++ if not ffi_inc: ++ found = find_file('ffi.h', [], inc_dirs) ++ if found: ++ ffi_inc = found[0] ++ if ffi_inc: ++ ffi_h = ffi_inc + '/ffi.h' + if not os.path.exists(ffi_h): + ffi_inc = None + print('Header file {} does not exist'.format(ffi_h)) +- ffi_lib = None +- if ffi_inc is not None: +- for lib_name in ('ffi', 'ffi_pic'): ++ ++ if ffi_lib is None and ffi_inc: ++ for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'): + if (self.compiler.find_library_file(lib_dirs, lib_name)): + ffi_lib = lib_name + break + + if ffi_inc and ffi_lib: +- ext.include_dirs.extend(ffi_inc) ++ ffi_headers = glob(os.path.join(ffi_inc, '*.h')) ++ if grep_headers_for('ffi_closure_alloc', ffi_headers): ++ try: ++ sources.remove('_ctypes/malloc_closure.c') ++ except ValueError: ++ pass ++ if grep_headers_for('ffi_prep_cif_var', ffi_headers): ++ ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1") ++ ext.include_dirs.append(ffi_inc) + ext.libraries.append(ffi_lib) + self.use_system_libffi = True + +-- +2.30.1 (Apple Git-130) + diff --git a/plugins/python-build/share/python-build/patches/3.7.15/Python-3.7.15/0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch b/plugins/python-build/share/python-build/patches/3.7.15/Python-3.7.15/0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch new file mode 100644 index 0000000..8ad6c82 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.15/Python-3.7.15/0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch @@ -0,0 +1,37 @@ +From f2595c038ed7bfd182d9d05d83786106ebd02ca0 Mon Sep 17 00:00:00 2001 +From: Lawrence D'Anna <64555057+lawrence-danna-apple@users.noreply.github.com> +Date: Tue, 30 Jun 2020 02:15:46 -0700 +Subject: [PATCH] bpo-41100: fix _decimal for arm64 Mac OS (GH-21228) + +Patch by Lawrence Danna. +--- + .../Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst | 1 + + Modules/_decimal/libmpdec/mpdecimal.h | 3 +++ + 2 files changed, 4 insertions(+) + create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst + +diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst +new file mode 100644 +index 0000000000..d6176d69f0 +--- /dev/null ++++ b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst +@@ -0,0 +1 @@ ++add arm64 to the allowable Mac OS arches in mpdecimal.h +\ No newline at end of file +diff --git a/Modules/_decimal/libmpdec/mpdecimal.h b/Modules/_decimal/libmpdec/mpdecimal.h +index a67dd9bc12..3e9c8185c3 100644 +--- a/Modules/_decimal/libmpdec/mpdecimal.h ++++ b/Modules/_decimal/libmpdec/mpdecimal.h +@@ -135,6 +135,9 @@ const char *mpd_version(void); + #elif defined(__x86_64__) + #define CONFIG_64 + #define ASM ++ #elif defined(__arm64__) ++ #define CONFIG_64 ++ #define ANSI + #else + #error "unknown architecture for universal build." + #endif +-- +2.37.3 + diff --git a/plugins/python-build/share/python-build/patches/3.7.15/Python-3.7.15/0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch b/plugins/python-build/share/python-build/patches/3.7.15/Python-3.7.15/0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch new file mode 100644 index 0000000..773b69f --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.15/Python-3.7.15/0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch @@ -0,0 +1,30 @@ +From 245427d207ee88a4ba26a66c3de350bcbcc036f2 Mon Sep 17 00:00:00 2001 +From: Ronald Oussoren +Date: Sat, 14 Nov 2020 16:07:47 +0100 +Subject: [PATCH] bpo-42351: Avoid error when opening header with non-UTF8 + encoding (GH-23279) + +grep_headers_for() would error out when a header contained +text that cannot be interpreted as UTF-8. + +cherry-picked from 7a27c7ed4b by Pedro Fonini +--- + setup.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/setup.py b/setup.py +index f211989aac..467362813d 100644 +--- a/setup.py ++++ b/setup.py +@@ -159,7 +159,7 @@ def is_macosx_sdk_path(path): + + def grep_headers_for(function, headers): + for header in headers: +- with open(header, 'r') as f: ++ with open(header, 'r', errors='surrogateescape') as f: + if function in f.read(): + return True + return False +-- +2.34.1 + diff --git a/plugins/python-build/share/python-build/patches/3.7.15/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch b/plugins/python-build/share/python-build/patches/3.7.15/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch new file mode 100644 index 0000000..e7088e5 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.15/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch @@ -0,0 +1,12 @@ +diff --git a/test/v3ext.c b/test/v3ext.c +index 7a240cd706..6cec6f1a9b 100644 +--- a/test/v3ext.c ++++ b/test/v3ext.c +@@ -15,6 +15,7 @@ + #include + #include "internal/nelem.h" + ++#include + #include "testutil.h" + + static const char *infile; diff --git a/plugins/python-build/share/python-build/patches/3.7.16/Python-3.7.16/0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch b/plugins/python-build/share/python-build/patches/3.7.16/Python-3.7.16/0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch new file mode 100644 index 0000000..f23946d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.16/Python-3.7.16/0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch @@ -0,0 +1,310 @@ +From: Christian Hammond +Date: Wed, 15 Dec 2021 23:12:36 -0800 +Subject: Port ctypes and system libffi patches for arm64/macOS 10.15+ to Python 3.7.12 + +This ports the following ctypes and libffi pyenv patches for Python +2.7.18 to Python 3.7.12: + +* `0004-Use-system-libffi-for-Mac-OS-10.15-and-up.patch` +* `0005-ctypes-use-the-correct-ABI-for-variadic-functions.patch` +* `0006-ctypes-probe-libffi-for-ffi_closure_alloc-and-ffi_pr.patch` + +These patches enable use of system libffi (fixing a broken `ctypes` +module on arm64 targets) and enable calling variadic functions on arm64. +They've been combined from patches port from Homebrew to pyenv by Takumi +Sueda, updated to work on the Python 3.7.12 codebase. + +The Homebrew patches are themselves backports of changes in Python 3.9 +and 3.10. That patch can be found at: + +https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch + +diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst +index 715d595b24..7743144978 100644 +--- a/Doc/library/ctypes.rst ++++ b/Doc/library/ctypes.rst +@@ -1551,6 +1551,13 @@ They are instances of a private class: + value usable as argument (integer, string, ctypes instance). This allows + defining adapters that can adapt custom objects as function parameters. + ++ .. attribute:: variadic ++ ++ Assign a boolean to specify that the function takes a variable number of ++ arguments. This does not matter on most platforms, but for Apple arm64 ++ platforms variadic functions have a different calling convention than ++ normal functions. ++ + .. attribute:: errcheck + + Assign a Python function or another callable to this attribute. The +diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py +index 4ebd82d3e0..7b73c190b6 100644 +--- a/Lib/test/test_unicode.py ++++ b/Lib/test/test_unicode.py +@@ -2458,11 +2458,14 @@ class CAPITest(unittest.TestCase): + def test_from_format(self): + support.import_module('ctypes') + from ctypes import ( ++ c_char_p, + pythonapi, py_object, sizeof, + c_int, c_long, c_longlong, c_ssize_t, + c_uint, c_ulong, c_ulonglong, c_size_t, c_void_p) + name = "PyUnicode_FromFormat" + _PyUnicode_FromFormat = getattr(pythonapi, name) ++ _PyUnicode_FromFormat.argtypes = (c_char_p,) ++ _PyUnicode_FromFormat.variadic = True + _PyUnicode_FromFormat.restype = py_object + + def PyUnicode_FromFormat(format, *args): +diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c +index dd0c61fd8a..79137e1dc7 100644 +--- a/Modules/_ctypes/_ctypes.c ++++ b/Modules/_ctypes/_ctypes.c +@@ -3174,6 +3174,34 @@ PyCFuncPtr_get_restype(PyCFuncPtrObject *self, void *Py_UNUSED(ignored)) + } + } + ++static int ++PyCFuncPtr_set_variadic(PyCFuncPtrObject *self, PyObject *ob) ++{ ++ StgDictObject *dict = PyObject_stgdict((PyObject *)self); ++ assert(dict); ++ int r = PyObject_IsTrue(ob); ++ if (r == 1) { ++ dict->flags |= FUNCFLAG_VARIADIC; ++ return 0; ++ } else if (r == 0) { ++ dict->flags &= ~FUNCFLAG_VARIADIC; ++ return 0; ++ } else { ++ return -1; ++ } ++} ++ ++static PyObject * ++PyCFuncPtr_get_variadic(PyCFuncPtrObject *self) ++{ ++ StgDictObject *dict = PyObject_stgdict((PyObject *)self); ++ assert(dict); /* Cannot be NULL for PyCFuncPtrObject instances */ ++ if (dict->flags & FUNCFLAG_VARIADIC) ++ Py_RETURN_TRUE; ++ else ++ Py_RETURN_FALSE; ++} ++ + static int + PyCFuncPtr_set_argtypes(PyCFuncPtrObject *self, PyObject *ob, void *Py_UNUSED(ignored)) + { +@@ -3219,6 +3247,8 @@ static PyGetSetDef PyCFuncPtr_getsets[] = { + { "argtypes", (getter)PyCFuncPtr_get_argtypes, + (setter)PyCFuncPtr_set_argtypes, + "specify the argument types", NULL }, ++ { "variadic", (getter)PyCFuncPtr_get_variadic, (setter)PyCFuncPtr_set_variadic, ++ "specify if function takes variable number of arguments", NULL }, + { NULL, NULL } + }; + +@@ -5632,6 +5662,7 @@ PyInit__ctypes(void) + PyModule_AddObject(m, "FUNCFLAG_USE_ERRNO", PyLong_FromLong(FUNCFLAG_USE_ERRNO)); + PyModule_AddObject(m, "FUNCFLAG_USE_LASTERROR", PyLong_FromLong(FUNCFLAG_USE_LASTERROR)); + PyModule_AddObject(m, "FUNCFLAG_PYTHONAPI", PyLong_FromLong(FUNCFLAG_PYTHONAPI)); ++ PyModule_AddObject(m, "FUNCFLAG_VARIADIC", PyLong_FromLong(FUNCFLAG_VARIADIC)); + PyModule_AddStringConstant(m, "__version__", "1.1.0"); + + PyModule_AddObject(m, "_memmove_addr", PyLong_FromVoidPtr(memmove)); +diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c +index 9cbf9801ad..e7fe11176b 100644 +--- a/Modules/_ctypes/callproc.c ++++ b/Modules/_ctypes/callproc.c +@@ -754,7 +756,8 @@ static int _call_function_pointer(int flags, + ffi_type **atypes, + ffi_type *restype, + void *resmem, +- int argcount) ++ int argcount, ++ int argtypecount) + { + PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */ + PyObject *error_object = NULL; +@@ -780,15 +783,39 @@ static int _call_function_pointer(int flags, + if ((flags & FUNCFLAG_CDECL) == 0) + cc = FFI_STDCALL; + #endif +- if (FFI_OK != ffi_prep_cif(&cif, +- cc, +- argcount, +- restype, +- atypes)) { +- PyErr_SetString(PyExc_RuntimeError, +- "ffi_prep_cif failed"); +- return -1; ++ ++#if HAVE_FFI_PREP_CIF_VAR ++ /* Everyone SHOULD set f.variadic=True on variadic function pointers, but ++ * lots of existing code will not. If there's at least one arg and more ++ * args are passed than are defined in the prototype, then it must be a ++ * variadic function. */ ++ if ((flags & FUNCFLAG_VARIADIC) || ++ (argtypecount != 0 && argcount > argtypecount)) ++ { ++ if (FFI_OK != ffi_prep_cif_var(&cif, ++ cc, ++ argtypecount, ++ argcount, ++ restype, ++ atypes)) { ++ PyErr_SetString(PyExc_RuntimeError, ++ "ffi_prep_cif_var failed"); ++ return -1; ++ } ++ } else { ++#endif ++ if (FFI_OK != ffi_prep_cif(&cif, ++ cc, ++ argcount, ++ restype, ++ atypes)) { ++ PyErr_SetString(PyExc_RuntimeError, ++ "ffi_prep_cif failed"); ++ return -1; ++ } ++#if HAVE_FFI_PREP_CIF_VAR + } ++#endif + + if (flags & (FUNCFLAG_USE_ERRNO | FUNCFLAG_USE_LASTERROR)) { + error_object = _ctypes_get_errobj(&space); +@@ -1187,9 +1214,8 @@ PyObject *_ctypes_callproc(PPROC pProc, + + if (-1 == _call_function_pointer(flags, pProc, avalues, atypes, + rtype, resbuf, +- Py_SAFE_DOWNCAST(argcount, +- Py_ssize_t, +- int))) ++ Py_SAFE_DOWNCAST(argcount, Py_ssize_t, int), ++ Py_SAFE_DOWNCAST(argtype_count, Py_ssize_t, int))) + goto cleanup; + + #ifdef WORDS_BIGENDIAN +diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h +index e58f85233c..e45975f6ad 100644 +--- a/Modules/_ctypes/ctypes.h ++++ b/Modules/_ctypes/ctypes.h +@@ -285,6 +285,7 @@ PyObject *_ctypes_callproc(PPROC pProc, + #define FUNCFLAG_PYTHONAPI 0x4 + #define FUNCFLAG_USE_ERRNO 0x8 + #define FUNCFLAG_USE_LASTERROR 0x10 ++#define FUNCFLAG_VARIADIC 0x20 + + #define TYPEFLAG_ISPOINTER 0x100 + #define TYPEFLAG_HASPOINTER 0x200 +diff --git a/setup.py b/setup.py +index bf90600eaa..48ff120e9a 100644 +--- a/setup.py ++++ b/setup.py +@@ -142,6 +142,13 @@ def macosx_sdk_root(): + + return MACOS_SDK_ROOT + ++def is_macosx_at_least(vers): ++ if host_platform == 'darwin': ++ dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') ++ if dep_target: ++ return tuple(map(int, str(dep_target).split('.'))) >= vers ++ return False ++ + def is_macosx_sdk_path(path): + """ + Returns True if 'path' can be located in an OSX SDK +@@ -150,6 +157,13 @@ def is_macosx_sdk_path(path): + or path.startswith('/System/') + or path.startswith('/Library/') ) + ++def grep_headers_for(function, headers): ++ for header in headers: ++ with open(header, 'r') as f: ++ if function in f.read(): ++ return True ++ return False ++ + def find_file(filename, std_dirs, paths): + """Searches for the directory where a given file is located, + and returns a possibly-empty list of additional directories, or None +@@ -1972,7 +1986,11 @@ class PyBuildExt(build_ext): + return True + + def detect_ctypes(self, inc_dirs, lib_dirs): +- self.use_system_libffi = False ++ if not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and is_macosx_at_least((10,15)): ++ self.use_system_libffi = True ++ else: ++ self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS") ++ + include_dirs = [] + extra_compile_args = [] + extra_link_args = [] +@@ -2018,30 +2036,47 @@ class PyBuildExt(build_ext): + libraries=['m']) + self.extensions.extend([ext, ext_test]) + ++ ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR") ++ ffi_lib = None ++ + if host_platform == 'darwin': +- if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"): ++ if not self.use_system_libffi: + return +- # OS X 10.5 comes with libffi.dylib; the include files are +- # in /usr/include/ffi +- inc_dirs.append('/usr/include/ffi') +- +- ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] +- if not ffi_inc or ffi_inc[0] == '': +- ffi_inc = find_file('ffi.h', [], inc_dirs) +- if ffi_inc is not None: +- ffi_h = ffi_inc[0] + '/ffi.h' ++ ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi") ++ if os.path.exists(ffi_in_sdk): ++ ffi_inc = ffi_in_sdk ++ ffi_lib = 'ffi' ++ else: ++ # OS X 10.5 comes with libffi.dylib; the include files are ++ # in /usr/include/ffi ++ inc_dirs.append('/usr/include/ffi') ++ ++ if not ffi_inc: ++ found = find_file('ffi.h', [], inc_dirs) ++ if found: ++ ffi_inc = found[0] ++ if ffi_inc: ++ ffi_h = ffi_inc + '/ffi.h' + if not os.path.exists(ffi_h): + ffi_inc = None + print('Header file {} does not exist'.format(ffi_h)) +- ffi_lib = None +- if ffi_inc is not None: +- for lib_name in ('ffi', 'ffi_pic'): ++ ++ if ffi_lib is None and ffi_inc: ++ for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'): + if (self.compiler.find_library_file(lib_dirs, lib_name)): + ffi_lib = lib_name + break + + if ffi_inc and ffi_lib: +- ext.include_dirs.extend(ffi_inc) ++ ffi_headers = glob(os.path.join(ffi_inc, '*.h')) ++ if grep_headers_for('ffi_closure_alloc', ffi_headers): ++ try: ++ sources.remove('_ctypes/malloc_closure.c') ++ except ValueError: ++ pass ++ if grep_headers_for('ffi_prep_cif_var', ffi_headers): ++ ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1") ++ ext.include_dirs.append(ffi_inc) + ext.libraries.append(ffi_lib) + self.use_system_libffi = True + +-- +2.30.1 (Apple Git-130) + diff --git a/plugins/python-build/share/python-build/patches/3.7.16/Python-3.7.16/0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch b/plugins/python-build/share/python-build/patches/3.7.16/Python-3.7.16/0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch new file mode 100644 index 0000000..8ad6c82 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.16/Python-3.7.16/0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch @@ -0,0 +1,37 @@ +From f2595c038ed7bfd182d9d05d83786106ebd02ca0 Mon Sep 17 00:00:00 2001 +From: Lawrence D'Anna <64555057+lawrence-danna-apple@users.noreply.github.com> +Date: Tue, 30 Jun 2020 02:15:46 -0700 +Subject: [PATCH] bpo-41100: fix _decimal for arm64 Mac OS (GH-21228) + +Patch by Lawrence Danna. +--- + .../Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst | 1 + + Modules/_decimal/libmpdec/mpdecimal.h | 3 +++ + 2 files changed, 4 insertions(+) + create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst + +diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst +new file mode 100644 +index 0000000000..d6176d69f0 +--- /dev/null ++++ b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst +@@ -0,0 +1 @@ ++add arm64 to the allowable Mac OS arches in mpdecimal.h +\ No newline at end of file +diff --git a/Modules/_decimal/libmpdec/mpdecimal.h b/Modules/_decimal/libmpdec/mpdecimal.h +index a67dd9bc12..3e9c8185c3 100644 +--- a/Modules/_decimal/libmpdec/mpdecimal.h ++++ b/Modules/_decimal/libmpdec/mpdecimal.h +@@ -135,6 +135,9 @@ const char *mpd_version(void); + #elif defined(__x86_64__) + #define CONFIG_64 + #define ASM ++ #elif defined(__arm64__) ++ #define CONFIG_64 ++ #define ANSI + #else + #error "unknown architecture for universal build." + #endif +-- +2.37.3 + diff --git a/plugins/python-build/share/python-build/patches/3.7.16/Python-3.7.16/0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch b/plugins/python-build/share/python-build/patches/3.7.16/Python-3.7.16/0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch new file mode 100644 index 0000000..773b69f --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.16/Python-3.7.16/0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch @@ -0,0 +1,30 @@ +From 245427d207ee88a4ba26a66c3de350bcbcc036f2 Mon Sep 17 00:00:00 2001 +From: Ronald Oussoren +Date: Sat, 14 Nov 2020 16:07:47 +0100 +Subject: [PATCH] bpo-42351: Avoid error when opening header with non-UTF8 + encoding (GH-23279) + +grep_headers_for() would error out when a header contained +text that cannot be interpreted as UTF-8. + +cherry-picked from 7a27c7ed4b by Pedro Fonini +--- + setup.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/setup.py b/setup.py +index f211989aac..467362813d 100644 +--- a/setup.py ++++ b/setup.py +@@ -159,7 +159,7 @@ def is_macosx_sdk_path(path): + + def grep_headers_for(function, headers): + for header in headers: +- with open(header, 'r') as f: ++ with open(header, 'r', errors='surrogateescape') as f: + if function in f.read(): + return True + return False +-- +2.34.1 + diff --git a/plugins/python-build/share/python-build/patches/3.7.16/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch b/plugins/python-build/share/python-build/patches/3.7.16/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch new file mode 100644 index 0000000..e7088e5 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.16/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch @@ -0,0 +1,12 @@ +diff --git a/test/v3ext.c b/test/v3ext.c +index 7a240cd706..6cec6f1a9b 100644 +--- a/test/v3ext.c ++++ b/test/v3ext.c +@@ -15,6 +15,7 @@ + #include + #include "internal/nelem.h" + ++#include + #include "testutil.h" + + static const char *infile; diff --git a/plugins/python-build/share/python-build/patches/3.7.17/Python-3.7.17/0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch b/plugins/python-build/share/python-build/patches/3.7.17/Python-3.7.17/0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch new file mode 100644 index 0000000..f23946d --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.17/Python-3.7.17/0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch @@ -0,0 +1,310 @@ +From: Christian Hammond +Date: Wed, 15 Dec 2021 23:12:36 -0800 +Subject: Port ctypes and system libffi patches for arm64/macOS 10.15+ to Python 3.7.12 + +This ports the following ctypes and libffi pyenv patches for Python +2.7.18 to Python 3.7.12: + +* `0004-Use-system-libffi-for-Mac-OS-10.15-and-up.patch` +* `0005-ctypes-use-the-correct-ABI-for-variadic-functions.patch` +* `0006-ctypes-probe-libffi-for-ffi_closure_alloc-and-ffi_pr.patch` + +These patches enable use of system libffi (fixing a broken `ctypes` +module on arm64 targets) and enable calling variadic functions on arm64. +They've been combined from patches port from Homebrew to pyenv by Takumi +Sueda, updated to work on the Python 3.7.12 codebase. + +The Homebrew patches are themselves backports of changes in Python 3.9 +and 3.10. That patch can be found at: + +https://github.com/Homebrew/formula-patches/blob/master/python/3.8.7.patch + +diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst +index 715d595b24..7743144978 100644 +--- a/Doc/library/ctypes.rst ++++ b/Doc/library/ctypes.rst +@@ -1551,6 +1551,13 @@ They are instances of a private class: + value usable as argument (integer, string, ctypes instance). This allows + defining adapters that can adapt custom objects as function parameters. + ++ .. attribute:: variadic ++ ++ Assign a boolean to specify that the function takes a variable number of ++ arguments. This does not matter on most platforms, but for Apple arm64 ++ platforms variadic functions have a different calling convention than ++ normal functions. ++ + .. attribute:: errcheck + + Assign a Python function or another callable to this attribute. The +diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py +index 4ebd82d3e0..7b73c190b6 100644 +--- a/Lib/test/test_unicode.py ++++ b/Lib/test/test_unicode.py +@@ -2458,11 +2458,14 @@ class CAPITest(unittest.TestCase): + def test_from_format(self): + support.import_module('ctypes') + from ctypes import ( ++ c_char_p, + pythonapi, py_object, sizeof, + c_int, c_long, c_longlong, c_ssize_t, + c_uint, c_ulong, c_ulonglong, c_size_t, c_void_p) + name = "PyUnicode_FromFormat" + _PyUnicode_FromFormat = getattr(pythonapi, name) ++ _PyUnicode_FromFormat.argtypes = (c_char_p,) ++ _PyUnicode_FromFormat.variadic = True + _PyUnicode_FromFormat.restype = py_object + + def PyUnicode_FromFormat(format, *args): +diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c +index dd0c61fd8a..79137e1dc7 100644 +--- a/Modules/_ctypes/_ctypes.c ++++ b/Modules/_ctypes/_ctypes.c +@@ -3174,6 +3174,34 @@ PyCFuncPtr_get_restype(PyCFuncPtrObject *self, void *Py_UNUSED(ignored)) + } + } + ++static int ++PyCFuncPtr_set_variadic(PyCFuncPtrObject *self, PyObject *ob) ++{ ++ StgDictObject *dict = PyObject_stgdict((PyObject *)self); ++ assert(dict); ++ int r = PyObject_IsTrue(ob); ++ if (r == 1) { ++ dict->flags |= FUNCFLAG_VARIADIC; ++ return 0; ++ } else if (r == 0) { ++ dict->flags &= ~FUNCFLAG_VARIADIC; ++ return 0; ++ } else { ++ return -1; ++ } ++} ++ ++static PyObject * ++PyCFuncPtr_get_variadic(PyCFuncPtrObject *self) ++{ ++ StgDictObject *dict = PyObject_stgdict((PyObject *)self); ++ assert(dict); /* Cannot be NULL for PyCFuncPtrObject instances */ ++ if (dict->flags & FUNCFLAG_VARIADIC) ++ Py_RETURN_TRUE; ++ else ++ Py_RETURN_FALSE; ++} ++ + static int + PyCFuncPtr_set_argtypes(PyCFuncPtrObject *self, PyObject *ob, void *Py_UNUSED(ignored)) + { +@@ -3219,6 +3247,8 @@ static PyGetSetDef PyCFuncPtr_getsets[] = { + { "argtypes", (getter)PyCFuncPtr_get_argtypes, + (setter)PyCFuncPtr_set_argtypes, + "specify the argument types", NULL }, ++ { "variadic", (getter)PyCFuncPtr_get_variadic, (setter)PyCFuncPtr_set_variadic, ++ "specify if function takes variable number of arguments", NULL }, + { NULL, NULL } + }; + +@@ -5632,6 +5662,7 @@ PyInit__ctypes(void) + PyModule_AddObject(m, "FUNCFLAG_USE_ERRNO", PyLong_FromLong(FUNCFLAG_USE_ERRNO)); + PyModule_AddObject(m, "FUNCFLAG_USE_LASTERROR", PyLong_FromLong(FUNCFLAG_USE_LASTERROR)); + PyModule_AddObject(m, "FUNCFLAG_PYTHONAPI", PyLong_FromLong(FUNCFLAG_PYTHONAPI)); ++ PyModule_AddObject(m, "FUNCFLAG_VARIADIC", PyLong_FromLong(FUNCFLAG_VARIADIC)); + PyModule_AddStringConstant(m, "__version__", "1.1.0"); + + PyModule_AddObject(m, "_memmove_addr", PyLong_FromVoidPtr(memmove)); +diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c +index 9cbf9801ad..e7fe11176b 100644 +--- a/Modules/_ctypes/callproc.c ++++ b/Modules/_ctypes/callproc.c +@@ -754,7 +756,8 @@ static int _call_function_pointer(int flags, + ffi_type **atypes, + ffi_type *restype, + void *resmem, +- int argcount) ++ int argcount, ++ int argtypecount) + { + PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */ + PyObject *error_object = NULL; +@@ -780,15 +783,39 @@ static int _call_function_pointer(int flags, + if ((flags & FUNCFLAG_CDECL) == 0) + cc = FFI_STDCALL; + #endif +- if (FFI_OK != ffi_prep_cif(&cif, +- cc, +- argcount, +- restype, +- atypes)) { +- PyErr_SetString(PyExc_RuntimeError, +- "ffi_prep_cif failed"); +- return -1; ++ ++#if HAVE_FFI_PREP_CIF_VAR ++ /* Everyone SHOULD set f.variadic=True on variadic function pointers, but ++ * lots of existing code will not. If there's at least one arg and more ++ * args are passed than are defined in the prototype, then it must be a ++ * variadic function. */ ++ if ((flags & FUNCFLAG_VARIADIC) || ++ (argtypecount != 0 && argcount > argtypecount)) ++ { ++ if (FFI_OK != ffi_prep_cif_var(&cif, ++ cc, ++ argtypecount, ++ argcount, ++ restype, ++ atypes)) { ++ PyErr_SetString(PyExc_RuntimeError, ++ "ffi_prep_cif_var failed"); ++ return -1; ++ } ++ } else { ++#endif ++ if (FFI_OK != ffi_prep_cif(&cif, ++ cc, ++ argcount, ++ restype, ++ atypes)) { ++ PyErr_SetString(PyExc_RuntimeError, ++ "ffi_prep_cif failed"); ++ return -1; ++ } ++#if HAVE_FFI_PREP_CIF_VAR + } ++#endif + + if (flags & (FUNCFLAG_USE_ERRNO | FUNCFLAG_USE_LASTERROR)) { + error_object = _ctypes_get_errobj(&space); +@@ -1187,9 +1214,8 @@ PyObject *_ctypes_callproc(PPROC pProc, + + if (-1 == _call_function_pointer(flags, pProc, avalues, atypes, + rtype, resbuf, +- Py_SAFE_DOWNCAST(argcount, +- Py_ssize_t, +- int))) ++ Py_SAFE_DOWNCAST(argcount, Py_ssize_t, int), ++ Py_SAFE_DOWNCAST(argtype_count, Py_ssize_t, int))) + goto cleanup; + + #ifdef WORDS_BIGENDIAN +diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h +index e58f85233c..e45975f6ad 100644 +--- a/Modules/_ctypes/ctypes.h ++++ b/Modules/_ctypes/ctypes.h +@@ -285,6 +285,7 @@ PyObject *_ctypes_callproc(PPROC pProc, + #define FUNCFLAG_PYTHONAPI 0x4 + #define FUNCFLAG_USE_ERRNO 0x8 + #define FUNCFLAG_USE_LASTERROR 0x10 ++#define FUNCFLAG_VARIADIC 0x20 + + #define TYPEFLAG_ISPOINTER 0x100 + #define TYPEFLAG_HASPOINTER 0x200 +diff --git a/setup.py b/setup.py +index bf90600eaa..48ff120e9a 100644 +--- a/setup.py ++++ b/setup.py +@@ -142,6 +142,13 @@ def macosx_sdk_root(): + + return MACOS_SDK_ROOT + ++def is_macosx_at_least(vers): ++ if host_platform == 'darwin': ++ dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') ++ if dep_target: ++ return tuple(map(int, str(dep_target).split('.'))) >= vers ++ return False ++ + def is_macosx_sdk_path(path): + """ + Returns True if 'path' can be located in an OSX SDK +@@ -150,6 +157,13 @@ def is_macosx_sdk_path(path): + or path.startswith('/System/') + or path.startswith('/Library/') ) + ++def grep_headers_for(function, headers): ++ for header in headers: ++ with open(header, 'r') as f: ++ if function in f.read(): ++ return True ++ return False ++ + def find_file(filename, std_dirs, paths): + """Searches for the directory where a given file is located, + and returns a possibly-empty list of additional directories, or None +@@ -1972,7 +1986,11 @@ class PyBuildExt(build_ext): + return True + + def detect_ctypes(self, inc_dirs, lib_dirs): +- self.use_system_libffi = False ++ if not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and is_macosx_at_least((10,15)): ++ self.use_system_libffi = True ++ else: ++ self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS") ++ + include_dirs = [] + extra_compile_args = [] + extra_link_args = [] +@@ -2018,30 +2036,47 @@ class PyBuildExt(build_ext): + libraries=['m']) + self.extensions.extend([ext, ext_test]) + ++ ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR") ++ ffi_lib = None ++ + if host_platform == 'darwin': +- if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"): ++ if not self.use_system_libffi: + return +- # OS X 10.5 comes with libffi.dylib; the include files are +- # in /usr/include/ffi +- inc_dirs.append('/usr/include/ffi') +- +- ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")] +- if not ffi_inc or ffi_inc[0] == '': +- ffi_inc = find_file('ffi.h', [], inc_dirs) +- if ffi_inc is not None: +- ffi_h = ffi_inc[0] + '/ffi.h' ++ ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi") ++ if os.path.exists(ffi_in_sdk): ++ ffi_inc = ffi_in_sdk ++ ffi_lib = 'ffi' ++ else: ++ # OS X 10.5 comes with libffi.dylib; the include files are ++ # in /usr/include/ffi ++ inc_dirs.append('/usr/include/ffi') ++ ++ if not ffi_inc: ++ found = find_file('ffi.h', [], inc_dirs) ++ if found: ++ ffi_inc = found[0] ++ if ffi_inc: ++ ffi_h = ffi_inc + '/ffi.h' + if not os.path.exists(ffi_h): + ffi_inc = None + print('Header file {} does not exist'.format(ffi_h)) +- ffi_lib = None +- if ffi_inc is not None: +- for lib_name in ('ffi', 'ffi_pic'): ++ ++ if ffi_lib is None and ffi_inc: ++ for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'): + if (self.compiler.find_library_file(lib_dirs, lib_name)): + ffi_lib = lib_name + break + + if ffi_inc and ffi_lib: +- ext.include_dirs.extend(ffi_inc) ++ ffi_headers = glob(os.path.join(ffi_inc, '*.h')) ++ if grep_headers_for('ffi_closure_alloc', ffi_headers): ++ try: ++ sources.remove('_ctypes/malloc_closure.c') ++ except ValueError: ++ pass ++ if grep_headers_for('ffi_prep_cif_var', ffi_headers): ++ ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1") ++ ext.include_dirs.append(ffi_inc) + ext.libraries.append(ffi_lib) + self.use_system_libffi = True + +-- +2.30.1 (Apple Git-130) + diff --git a/plugins/python-build/share/python-build/patches/3.7.17/Python-3.7.17/0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch b/plugins/python-build/share/python-build/patches/3.7.17/Python-3.7.17/0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch new file mode 100644 index 0000000..8ad6c82 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.17/Python-3.7.17/0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch @@ -0,0 +1,37 @@ +From f2595c038ed7bfd182d9d05d83786106ebd02ca0 Mon Sep 17 00:00:00 2001 +From: Lawrence D'Anna <64555057+lawrence-danna-apple@users.noreply.github.com> +Date: Tue, 30 Jun 2020 02:15:46 -0700 +Subject: [PATCH] bpo-41100: fix _decimal for arm64 Mac OS (GH-21228) + +Patch by Lawrence Danna. +--- + .../Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst | 1 + + Modules/_decimal/libmpdec/mpdecimal.h | 3 +++ + 2 files changed, 4 insertions(+) + create mode 100644 Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst + +diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst +new file mode 100644 +index 0000000000..d6176d69f0 +--- /dev/null ++++ b/Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst +@@ -0,0 +1 @@ ++add arm64 to the allowable Mac OS arches in mpdecimal.h +\ No newline at end of file +diff --git a/Modules/_decimal/libmpdec/mpdecimal.h b/Modules/_decimal/libmpdec/mpdecimal.h +index a67dd9bc12..3e9c8185c3 100644 +--- a/Modules/_decimal/libmpdec/mpdecimal.h ++++ b/Modules/_decimal/libmpdec/mpdecimal.h +@@ -135,6 +135,9 @@ const char *mpd_version(void); + #elif defined(__x86_64__) + #define CONFIG_64 + #define ASM ++ #elif defined(__arm64__) ++ #define CONFIG_64 ++ #define ANSI + #else + #error "unknown architecture for universal build." + #endif +-- +2.37.3 + diff --git a/plugins/python-build/share/python-build/patches/3.7.17/Python-3.7.17/0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch b/plugins/python-build/share/python-build/patches/3.7.17/Python-3.7.17/0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch new file mode 100644 index 0000000..773b69f --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.17/Python-3.7.17/0003-bpo-42351-Avoid-error-when-opening-header-with-non-U.patch @@ -0,0 +1,30 @@ +From 245427d207ee88a4ba26a66c3de350bcbcc036f2 Mon Sep 17 00:00:00 2001 +From: Ronald Oussoren +Date: Sat, 14 Nov 2020 16:07:47 +0100 +Subject: [PATCH] bpo-42351: Avoid error when opening header with non-UTF8 + encoding (GH-23279) + +grep_headers_for() would error out when a header contained +text that cannot be interpreted as UTF-8. + +cherry-picked from 7a27c7ed4b by Pedro Fonini +--- + setup.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/setup.py b/setup.py +index f211989aac..467362813d 100644 +--- a/setup.py ++++ b/setup.py +@@ -159,7 +159,7 @@ def is_macosx_sdk_path(path): + + def grep_headers_for(function, headers): + for header in headers: +- with open(header, 'r') as f: ++ with open(header, 'r', errors='surrogateescape') as f: + if function in f.read(): + return True + return False +-- +2.34.1 + diff --git a/plugins/python-build/share/python-build/patches/3.7.17/Python-3.7.17/0004-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.7.17/Python-3.7.17/0004-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..e98e845 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.17/Python-3.7.17/0004-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,29 @@ +From ed9010349e8f6351a64ba2c7005fa0c3e40655bd Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index 467362813dc..a3623c577af 100644 +--- a/setup.py ++++ b/setup.py +@@ -277,8 +277,10 @@ class PyBuildExt(build_ext): + build_ext.__init__(self, dist) + self.failed = [] + self.failed_on_import = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ m=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', '')) ++ if m is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True ++ del m + + def build_extensions(self): + +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.7.8/Python-3.7.8/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch b/plugins/python-build/share/python-build/patches/3.7.8/Python-3.7.8/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch new file mode 100644 index 0000000..ff0a7d2 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.8/Python-3.7.8/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch @@ -0,0 +1,80 @@ +From 5b79a7da20953f107657dea5192ed77cc8554ff0 Mon Sep 17 00:00:00 2001 +From: David Bohman +Date: Tue, 12 Oct 2021 17:10:26 -0700 +Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running + ``configure`` with recent versions of non-Apple clang. (#28845) + +Change the configure logic to function properly on macOS when the compiler +outputs a platform triplet for option --print-multiarch. + +Co-authored-by: Ned Deily +--- + .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ + configure | 8 +++++--- + configure.ac | 8 +++++--- + 3 files changed, 12 insertions(+), 6 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst + +diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +new file mode 100644 +index 0000000000..a2dc5bcc32 +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +@@ -0,0 +1,2 @@ ++Prevent ``internal configure error`` when running ``configure`` ++with recent versions of non-Apple clang. Patch by David Bohman. +diff --git a/configure b/configure +index c807c98e56..51a7d60f54 100755 +--- a/configure ++++ b/configure +@@ -5183,9 +5183,6 @@ $as_echo "$as_me: + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 + $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } + cat >> conftest.c <&6; } + fi + rm -f conftest.c conftest.out + ++if test x$PLATFORM_TRIPLET != xdarwin; then ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null) ++fi ++ ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 +diff --git a/configure.ac b/configure.ac +index 805c0bba08..ede2197cb3 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -724,9 +724,6 @@ then + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +-AC_SUBST(MULTIARCH) +- + AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) + cat >> conftest.c </dev/null) ++fi ++AC_SUBST(MULTIARCH) ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) +-- +2.29.2.windows.2 + diff --git a/plugins/python-build/share/python-build/patches/3.7.9/Python-3.7.9/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch b/plugins/python-build/share/python-build/patches/3.7.9/Python-3.7.9/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch new file mode 100644 index 0000000..48ab96a --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.7.9/Python-3.7.9/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch @@ -0,0 +1,80 @@ +From 1d6f94126d0af2370ba0e4c7d8befc1c7ecf35d8 Mon Sep 17 00:00:00 2001 +From: David Bohman +Date: Tue, 12 Oct 2021 17:10:26 -0700 +Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running + ``configure`` with recent versions of non-Apple clang. (#28845) + +Change the configure logic to function properly on macOS when the compiler +outputs a platform triplet for option --print-multiarch. + +Co-authored-by: Ned Deily +--- + .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ + configure | 8 +++++--- + configure.ac | 8 +++++--- + 3 files changed, 12 insertions(+), 6 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst + +diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +new file mode 100644 +index 0000000000..a2dc5bcc32 +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +@@ -0,0 +1,2 @@ ++Prevent ``internal configure error`` when running ``configure`` ++with recent versions of non-Apple clang. Patch by David Bohman. +diff --git a/configure b/configure +index 829dd69bb8..455481bc50 100755 +--- a/configure ++++ b/configure +@@ -5183,9 +5183,6 @@ $as_echo "$as_me: + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 + $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } + cat >> conftest.c <&6; } + fi + rm -f conftest.c conftest.out + ++if test x$PLATFORM_TRIPLET != xdarwin; then ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null) ++fi ++ ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 +diff --git a/configure.ac b/configure.ac +index f1cc8e9bcb..1afcba3307 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -724,9 +724,6 @@ then + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +-AC_SUBST(MULTIARCH) +- + AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) + cat >> conftest.c </dev/null) ++fi ++AC_SUBST(MULTIARCH) ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) +-- +2.29.2.windows.2 + diff --git a/plugins/python-build/share/python-build/patches/3.8.10/Python-3.8.10/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch b/plugins/python-build/share/python-build/patches/3.8.10/Python-3.8.10/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch new file mode 100644 index 0000000..44f99d6 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.8.10/Python-3.8.10/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch @@ -0,0 +1,80 @@ +From 8ced1a904558ff9499673083cf13abf03a76b7d0 Mon Sep 17 00:00:00 2001 +From: David Bohman +Date: Tue, 12 Oct 2021 17:10:26 -0700 +Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running + ``configure`` with recent versions of non-Apple clang. (#28845) + +Change the configure logic to function properly on macOS when the compiler +outputs a platform triplet for option --print-multiarch. + +Co-authored-by: Ned Deily +--- + .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ + configure | 8 +++++--- + configure.ac | 8 +++++--- + 3 files changed, 12 insertions(+), 6 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst + +diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +new file mode 100644 +index 0000000000..a2dc5bcc32 +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +@@ -0,0 +1,2 @@ ++Prevent ``internal configure error`` when running ``configure`` ++with recent versions of non-Apple clang. Patch by David Bohman. +diff --git a/configure b/configure +index 936f3d4596..c091865aff 100755 +--- a/configure ++++ b/configure +@@ -5160,9 +5160,6 @@ $as_echo "$as_me: + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 + $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } + cat >> conftest.c <&6; } + fi + rm -f conftest.c conftest.out + ++if test x$PLATFORM_TRIPLET != xdarwin; then ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null) ++fi ++ ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 +diff --git a/configure.ac b/configure.ac +index e02cc2c656..de83332dd3 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -719,9 +719,6 @@ then + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +-AC_SUBST(MULTIARCH) +- + AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) + cat >> conftest.c </dev/null) ++fi ++AC_SUBST(MULTIARCH) ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) +-- +2.36.0 + diff --git a/plugins/python-build/share/python-build/patches/3.8.11/Python-3.8.11/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch b/plugins/python-build/share/python-build/patches/3.8.11/Python-3.8.11/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch new file mode 100644 index 0000000..6cffa25 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.8.11/Python-3.8.11/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch @@ -0,0 +1,80 @@ +From 7f35b41fa1e13fb9915fd476eaec2b15e2082c4f Mon Sep 17 00:00:00 2001 +From: David Bohman +Date: Tue, 12 Oct 2021 17:10:26 -0700 +Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running + ``configure`` with recent versions of non-Apple clang. (#28845) + +Change the configure logic to function properly on macOS when the compiler +outputs a platform triplet for option --print-multiarch. + +Co-authored-by: Ned Deily +--- + .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ + configure | 8 +++++--- + configure.ac | 8 +++++--- + 3 files changed, 12 insertions(+), 6 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst + +diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +new file mode 100644 +index 0000000000..a2dc5bcc32 +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +@@ -0,0 +1,2 @@ ++Prevent ``internal configure error`` when running ``configure`` ++with recent versions of non-Apple clang. Patch by David Bohman. +diff --git a/configure b/configure +index 936f3d4596..c091865aff 100755 +--- a/configure ++++ b/configure +@@ -5160,9 +5160,6 @@ $as_echo "$as_me: + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 + $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } + cat >> conftest.c <&6; } + fi + rm -f conftest.c conftest.out + ++if test x$PLATFORM_TRIPLET != xdarwin; then ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null) ++fi ++ ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 +diff --git a/configure.ac b/configure.ac +index e02cc2c656..de83332dd3 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -719,9 +719,6 @@ then + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +-AC_SUBST(MULTIARCH) +- + AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) + cat >> conftest.c </dev/null) ++fi ++AC_SUBST(MULTIARCH) ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) +-- +2.36.0 + diff --git a/plugins/python-build/share/python-build/patches/3.8.12/Python-3.8.12/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch b/plugins/python-build/share/python-build/patches/3.8.12/Python-3.8.12/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch new file mode 100644 index 0000000..9072959 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.8.12/Python-3.8.12/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch @@ -0,0 +1,80 @@ +From c4379ecd43dab0d2c836787d82bce4f20eed892b Mon Sep 17 00:00:00 2001 +From: David Bohman +Date: Tue, 12 Oct 2021 17:10:26 -0700 +Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running + ``configure`` with recent versions of non-Apple clang. (#28845) + +Change the configure logic to function properly on macOS when the compiler +outputs a platform triplet for option --print-multiarch. + +Co-authored-by: Ned Deily +--- + .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ + configure | 8 +++++--- + configure.ac | 8 +++++--- + 3 files changed, 12 insertions(+), 6 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst + +diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +new file mode 100644 +index 0000000000..a2dc5bcc32 +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +@@ -0,0 +1,2 @@ ++Prevent ``internal configure error`` when running ``configure`` ++with recent versions of non-Apple clang. Patch by David Bohman. +diff --git a/configure b/configure +index 936f3d4596..c091865aff 100755 +--- a/configure ++++ b/configure +@@ -5160,9 +5160,6 @@ $as_echo "$as_me: + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 + $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } + cat >> conftest.c <&6; } + fi + rm -f conftest.c conftest.out + ++if test x$PLATFORM_TRIPLET != xdarwin; then ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null) ++fi ++ ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 +diff --git a/configure.ac b/configure.ac +index e02cc2c656..de83332dd3 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -719,9 +719,6 @@ then + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +-AC_SUBST(MULTIARCH) +- + AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) + cat >> conftest.c </dev/null) ++fi ++AC_SUBST(MULTIARCH) ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) +-- +2.36.0 + diff --git a/plugins/python-build/share/python-build/patches/3.8.15/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch b/plugins/python-build/share/python-build/patches/3.8.15/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch new file mode 100644 index 0000000..e7088e5 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.8.15/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch @@ -0,0 +1,12 @@ +diff --git a/test/v3ext.c b/test/v3ext.c +index 7a240cd706..6cec6f1a9b 100644 +--- a/test/v3ext.c ++++ b/test/v3ext.c +@@ -15,6 +15,7 @@ + #include + #include "internal/nelem.h" + ++#include + #include "testutil.h" + + static const char *infile; diff --git a/plugins/python-build/share/python-build/patches/3.8.16/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch b/plugins/python-build/share/python-build/patches/3.8.16/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch new file mode 100644 index 0000000..e7088e5 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.8.16/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch @@ -0,0 +1,12 @@ +diff --git a/test/v3ext.c b/test/v3ext.c +index 7a240cd706..6cec6f1a9b 100644 +--- a/test/v3ext.c ++++ b/test/v3ext.c +@@ -15,6 +15,7 @@ + #include + #include "internal/nelem.h" + ++#include + #include "testutil.h" + + static const char *infile; diff --git a/plugins/python-build/share/python-build/patches/3.8.20/Python-3.8.20/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.8.20/Python-3.8.20/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..d896c24 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.8.20/Python-3.8.20/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 89a756fe5d31962b8daf5d31c445556c42dfb764 Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index 57be07a7e0f..e55cfb88c35 100644 +--- a/setup.py ++++ b/setup.py +@@ -288,8 +288,8 @@ class PyBuildExt(build_ext): + self.failed = [] + self.failed_on_import = [] + self.missing = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.8.4/Python-3.8.4/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch b/plugins/python-build/share/python-build/patches/3.8.4/Python-3.8.4/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch new file mode 100644 index 0000000..5a05ffb --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.8.4/Python-3.8.4/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch @@ -0,0 +1,80 @@ +From 3af555f75a53a82fa074572b24cb6516d3db0645 Mon Sep 17 00:00:00 2001 +From: David Bohman +Date: Tue, 12 Oct 2021 17:10:26 -0700 +Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running + ``configure`` with recent versions of non-Apple clang. (#28845) + +Change the configure logic to function properly on macOS when the compiler +outputs a platform triplet for option --print-multiarch. + +Co-authored-by: Ned Deily +--- + .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ + configure | 8 +++++--- + configure.ac | 8 +++++--- + 3 files changed, 12 insertions(+), 6 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst + +diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +new file mode 100644 +index 0000000000..a2dc5bcc32 +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +@@ -0,0 +1,2 @@ ++Prevent ``internal configure error`` when running ``configure`` ++with recent versions of non-Apple clang. Patch by David Bohman. +diff --git a/configure b/configure +index 96dcd0dcd5..1fb735bf8b 100755 +--- a/configure ++++ b/configure +@@ -5167,9 +5167,6 @@ $as_echo "$as_me: + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 + $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } + cat >> conftest.c <&6; } + fi + rm -f conftest.c conftest.out + ++if test x$PLATFORM_TRIPLET != xdarwin; then ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null) ++fi ++ ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 +diff --git a/configure.ac b/configure.ac +index 18a044629a..6d841d928d 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -706,9 +706,6 @@ then + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +-AC_SUBST(MULTIARCH) +- + AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) + cat >> conftest.c </dev/null) ++fi ++AC_SUBST(MULTIARCH) ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) +-- +2.36.0 + diff --git a/plugins/python-build/share/python-build/patches/3.8.5/Python-3.8.5/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch b/plugins/python-build/share/python-build/patches/3.8.5/Python-3.8.5/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch new file mode 100644 index 0000000..832a136 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.8.5/Python-3.8.5/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch @@ -0,0 +1,80 @@ +From 988821dfd8b087368dfee462d73f518ca4cfbfe0 Mon Sep 17 00:00:00 2001 +From: David Bohman +Date: Tue, 12 Oct 2021 17:10:26 -0700 +Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running + ``configure`` with recent versions of non-Apple clang. (#28845) + +Change the configure logic to function properly on macOS when the compiler +outputs a platform triplet for option --print-multiarch. + +Co-authored-by: Ned Deily +--- + .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ + configure | 8 +++++--- + configure.ac | 8 +++++--- + 3 files changed, 12 insertions(+), 6 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst + +diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +new file mode 100644 +index 0000000000..a2dc5bcc32 +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +@@ -0,0 +1,2 @@ ++Prevent ``internal configure error`` when running ``configure`` ++with recent versions of non-Apple clang. Patch by David Bohman. +diff --git a/configure b/configure +index 96dcd0dcd5..1fb735bf8b 100755 +--- a/configure ++++ b/configure +@@ -5167,9 +5167,6 @@ $as_echo "$as_me: + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 + $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } + cat >> conftest.c <&6; } + fi + rm -f conftest.c conftest.out + ++if test x$PLATFORM_TRIPLET != xdarwin; then ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null) ++fi ++ ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 +diff --git a/configure.ac b/configure.ac +index 18a044629a..6d841d928d 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -706,9 +706,6 @@ then + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +-AC_SUBST(MULTIARCH) +- + AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) + cat >> conftest.c </dev/null) ++fi ++AC_SUBST(MULTIARCH) ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) +-- +2.36.0 + diff --git a/plugins/python-build/share/python-build/patches/3.8.6/Python-3.8.6/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch b/plugins/python-build/share/python-build/patches/3.8.6/Python-3.8.6/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch new file mode 100644 index 0000000..1402dca --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.8.6/Python-3.8.6/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch @@ -0,0 +1,80 @@ +From 7ec2de6bb20a934424df28c6566e6fc3a5eab6d4 Mon Sep 17 00:00:00 2001 +From: David Bohman +Date: Tue, 12 Oct 2021 17:10:26 -0700 +Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running + ``configure`` with recent versions of non-Apple clang. (#28845) + +Change the configure logic to function properly on macOS when the compiler +outputs a platform triplet for option --print-multiarch. + +Co-authored-by: Ned Deily +--- + .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ + configure | 8 +++++--- + configure.ac | 8 +++++--- + 3 files changed, 12 insertions(+), 6 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst + +diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +new file mode 100644 +index 0000000000..a2dc5bcc32 +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +@@ -0,0 +1,2 @@ ++Prevent ``internal configure error`` when running ``configure`` ++with recent versions of non-Apple clang. Patch by David Bohman. +diff --git a/configure b/configure +index 96dcd0dcd5..1fb735bf8b 100755 +--- a/configure ++++ b/configure +@@ -5167,9 +5167,6 @@ $as_echo "$as_me: + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 + $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } + cat >> conftest.c <&6; } + fi + rm -f conftest.c conftest.out + ++if test x$PLATFORM_TRIPLET != xdarwin; then ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null) ++fi ++ ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 +diff --git a/configure.ac b/configure.ac +index 18a044629a..6d841d928d 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -706,9 +706,6 @@ then + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +-AC_SUBST(MULTIARCH) +- + AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) + cat >> conftest.c </dev/null) ++fi ++AC_SUBST(MULTIARCH) ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) +-- +2.36.0 + diff --git a/plugins/python-build/share/python-build/patches/3.8.7/Python-3.8.7/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch b/plugins/python-build/share/python-build/patches/3.8.7/Python-3.8.7/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch new file mode 100644 index 0000000..2987719 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.8.7/Python-3.8.7/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch @@ -0,0 +1,80 @@ +From 97f07c98cac3d095c5c3f5816e4c7b3fe7b9c251 Mon Sep 17 00:00:00 2001 +From: David Bohman +Date: Tue, 12 Oct 2021 17:10:26 -0700 +Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running + ``configure`` with recent versions of non-Apple clang. (#28845) + +Change the configure logic to function properly on macOS when the compiler +outputs a platform triplet for option --print-multiarch. + +Co-authored-by: Ned Deily +--- + .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ + configure | 8 +++++--- + configure.ac | 8 +++++--- + 3 files changed, 12 insertions(+), 6 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst + +diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +new file mode 100644 +index 0000000000..a2dc5bcc32 +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +@@ -0,0 +1,2 @@ ++Prevent ``internal configure error`` when running ``configure`` ++with recent versions of non-Apple clang. Patch by David Bohman. +diff --git a/configure b/configure +index c164d68c4e..dcc0795296 100755 +--- a/configure ++++ b/configure +@@ -5167,9 +5167,6 @@ $as_echo "$as_me: + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 + $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } + cat >> conftest.c <&6; } + fi + rm -f conftest.c conftest.out + ++if test x$PLATFORM_TRIPLET != xdarwin; then ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null) ++fi ++ ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 +diff --git a/configure.ac b/configure.ac +index fc082a3cd2..5c9bee2850 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -706,9 +706,6 @@ then + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +-AC_SUBST(MULTIARCH) +- + AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) + cat >> conftest.c </dev/null) ++fi ++AC_SUBST(MULTIARCH) ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) +-- +2.36.0 + diff --git a/plugins/python-build/share/python-build/patches/3.8.8/Python-3.8.8/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch b/plugins/python-build/share/python-build/patches/3.8.8/Python-3.8.8/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch new file mode 100644 index 0000000..4d0f421 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.8.8/Python-3.8.8/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch @@ -0,0 +1,80 @@ +From cb51d8b90c5668e77b9ed8ded562eeaabf518f5c Mon Sep 17 00:00:00 2001 +From: David Bohman +Date: Tue, 12 Oct 2021 17:10:26 -0700 +Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running + ``configure`` with recent versions of non-Apple clang. (#28845) + +Change the configure logic to function properly on macOS when the compiler +outputs a platform triplet for option --print-multiarch. + +Co-authored-by: Ned Deily +--- + .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ + configure | 8 +++++--- + configure.ac | 8 +++++--- + 3 files changed, 12 insertions(+), 6 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst + +diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +new file mode 100644 +index 0000000000..a2dc5bcc32 +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +@@ -0,0 +1,2 @@ ++Prevent ``internal configure error`` when running ``configure`` ++with recent versions of non-Apple clang. Patch by David Bohman. +diff --git a/configure b/configure +index c164d68c4e..dcc0795296 100755 +--- a/configure ++++ b/configure +@@ -5167,9 +5167,6 @@ $as_echo "$as_me: + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 + $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } + cat >> conftest.c <&6; } + fi + rm -f conftest.c conftest.out + ++if test x$PLATFORM_TRIPLET != xdarwin; then ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null) ++fi ++ ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 +diff --git a/configure.ac b/configure.ac +index fc082a3cd2..5c9bee2850 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -706,9 +706,6 @@ then + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +-AC_SUBST(MULTIARCH) +- + AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) + cat >> conftest.c </dev/null) ++fi ++AC_SUBST(MULTIARCH) ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) +-- +2.36.0 + diff --git a/plugins/python-build/share/python-build/patches/3.8.9/Python-3.8.9/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch b/plugins/python-build/share/python-build/patches/3.8.9/Python-3.8.9/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch new file mode 100644 index 0000000..db48ed8 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.8.9/Python-3.8.9/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch @@ -0,0 +1,80 @@ +From 9d066808637164f1386ece0d3b26b8e4262c4dfd Mon Sep 17 00:00:00 2001 +From: David Bohman +Date: Tue, 12 Oct 2021 17:10:26 -0700 +Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running + ``configure`` with recent versions of non-Apple clang. (#28845) + +Change the configure logic to function properly on macOS when the compiler +outputs a platform triplet for option --print-multiarch. + +Co-authored-by: Ned Deily +--- + .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ + configure | 8 +++++--- + configure.ac | 8 +++++--- + 3 files changed, 12 insertions(+), 6 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst + +diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +new file mode 100644 +index 0000000000..a2dc5bcc32 +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +@@ -0,0 +1,2 @@ ++Prevent ``internal configure error`` when running ``configure`` ++with recent versions of non-Apple clang. Patch by David Bohman. +diff --git a/configure b/configure +index c737256c15..97a371c6da 100755 +--- a/configure ++++ b/configure +@@ -5155,9 +5155,6 @@ $as_echo "$as_me: + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 + $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } + cat >> conftest.c <&6; } + fi + rm -f conftest.c conftest.out + ++if test x$PLATFORM_TRIPLET != xdarwin; then ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null) ++fi ++ ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 +diff --git a/configure.ac b/configure.ac +index 040ddfc791..0969bb5b0c 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -713,9 +713,6 @@ then + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +-AC_SUBST(MULTIARCH) +- + AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) + cat >> conftest.c </dev/null) ++fi ++AC_SUBST(MULTIARCH) ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) +-- +2.36.0 + diff --git a/plugins/python-build/share/python-build/patches/3.9.0/Python-3.9.0/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch b/plugins/python-build/share/python-build/patches/3.9.0/Python-3.9.0/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch new file mode 100644 index 0000000..e9b491b --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.9.0/Python-3.9.0/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch @@ -0,0 +1,80 @@ +From b8f6adaf38973076542c54e5d9a4fd7c6665c8f2 Mon Sep 17 00:00:00 2001 +From: David Bohman +Date: Tue, 12 Oct 2021 17:10:26 -0700 +Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running + ``configure`` with recent versions of non-Apple clang. (#28845) + +Change the configure logic to function properly on macOS when the compiler +outputs a platform triplet for option --print-multiarch. + +Co-authored-by: Ned Deily +--- + .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ + configure | 8 +++++--- + configure.ac | 8 +++++--- + 3 files changed, 12 insertions(+), 6 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst + +diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +new file mode 100644 +index 0000000000..a2dc5bcc32 +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +@@ -0,0 +1,2 @@ ++Prevent ``internal configure error`` when running ``configure`` ++with recent versions of non-Apple clang. Patch by David Bohman. +diff --git a/configure b/configure +index 9e6fd46583..80c3a6589a 100755 +--- a/configure ++++ b/configure +@@ -5193,9 +5193,6 @@ $as_echo "$as_me: + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 + $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } + cat >> conftest.c <&6; } + fi + rm -f conftest.c conftest.out + ++if test x$PLATFORM_TRIPLET != xdarwin; then ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null) ++fi ++ ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 +diff --git a/configure.ac b/configure.ac +index d60f05251a..110318545d 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -718,9 +718,6 @@ then + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +-AC_SUBST(MULTIARCH) +- + AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) + cat >> conftest.c </dev/null) ++fi ++AC_SUBST(MULTIARCH) ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) +-- +2.36.0 + diff --git a/plugins/python-build/share/python-build/patches/3.9.1/Python-3.9.1/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch b/plugins/python-build/share/python-build/patches/3.9.1/Python-3.9.1/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch new file mode 100644 index 0000000..20e23c8 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.9.1/Python-3.9.1/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch @@ -0,0 +1,80 @@ +From 8ada29fb655f9803bab4777308c77db8c1f74735 Mon Sep 17 00:00:00 2001 +From: David Bohman +Date: Tue, 12 Oct 2021 17:10:26 -0700 +Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running + ``configure`` with recent versions of non-Apple clang. (#28845) + +Change the configure logic to function properly on macOS when the compiler +outputs a platform triplet for option --print-multiarch. + +Co-authored-by: Ned Deily +--- + .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ + configure | 8 +++++--- + configure.ac | 8 +++++--- + 3 files changed, 12 insertions(+), 6 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst + +diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +new file mode 100644 +index 0000000000..a2dc5bcc32 +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +@@ -0,0 +1,2 @@ ++Prevent ``internal configure error`` when running ``configure`` ++with recent versions of non-Apple clang. Patch by David Bohman. +diff --git a/configure b/configure +index 2d379feb4b..e36d8d523d 100755 +--- a/configure ++++ b/configure +@@ -5193,9 +5193,6 @@ $as_echo "$as_me: + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 + $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } + cat >> conftest.c <&6; } + fi + rm -f conftest.c conftest.out + ++if test x$PLATFORM_TRIPLET != xdarwin; then ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null) ++fi ++ ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 +diff --git a/configure.ac b/configure.ac +index c968d149c2..a16e475bc2 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -718,9 +718,6 @@ then + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +-AC_SUBST(MULTIARCH) +- + AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) + cat >> conftest.c </dev/null) ++fi ++AC_SUBST(MULTIARCH) ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) +-- +2.36.0 + diff --git a/plugins/python-build/share/python-build/patches/3.9.15/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch b/plugins/python-build/share/python-build/patches/3.9.15/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch new file mode 100644 index 0000000..e7088e5 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.9.15/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch @@ -0,0 +1,12 @@ +diff --git a/test/v3ext.c b/test/v3ext.c +index 7a240cd706..6cec6f1a9b 100644 +--- a/test/v3ext.c ++++ b/test/v3ext.c +@@ -15,6 +15,7 @@ + #include + #include "internal/nelem.h" + ++#include + #include "testutil.h" + + static const char *infile; diff --git a/plugins/python-build/share/python-build/patches/3.9.16/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch b/plugins/python-build/share/python-build/patches/3.9.16/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch new file mode 100644 index 0000000..e7088e5 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.9.16/openssl-1.1.1q/openssl_1.1.1q_fix_c_include.patch @@ -0,0 +1,12 @@ +diff --git a/test/v3ext.c b/test/v3ext.c +index 7a240cd706..6cec6f1a9b 100644 +--- a/test/v3ext.c ++++ b/test/v3ext.c +@@ -15,6 +15,7 @@ + #include + #include "internal/nelem.h" + ++#include + #include "testutil.h" + + static const char *infile; diff --git a/plugins/python-build/share/python-build/patches/3.9.2/Python-3.9.2/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch b/plugins/python-build/share/python-build/patches/3.9.2/Python-3.9.2/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch new file mode 100644 index 0000000..51a4eef --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.9.2/Python-3.9.2/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch @@ -0,0 +1,80 @@ +From 9e317124ae4d1f133c18485e83b952360741519d Mon Sep 17 00:00:00 2001 +From: David Bohman +Date: Tue, 12 Oct 2021 17:10:26 -0700 +Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running + ``configure`` with recent versions of non-Apple clang. (#28845) + +Change the configure logic to function properly on macOS when the compiler +outputs a platform triplet for option --print-multiarch. + +Co-authored-by: Ned Deily +--- + .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ + configure | 8 +++++--- + configure.ac | 8 +++++--- + 3 files changed, 12 insertions(+), 6 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst + +diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +new file mode 100644 +index 0000000000..a2dc5bcc32 +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +@@ -0,0 +1,2 @@ ++Prevent ``internal configure error`` when running ``configure`` ++with recent versions of non-Apple clang. Patch by David Bohman. +diff --git a/configure b/configure +index 1252335472..0da9fa285e 100755 +--- a/configure ++++ b/configure +@@ -5193,9 +5193,6 @@ $as_echo "$as_me: + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 + $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } + cat >> conftest.c <&6; } + fi + rm -f conftest.c conftest.out + ++if test x$PLATFORM_TRIPLET != xdarwin; then ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null) ++fi ++ ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 +diff --git a/configure.ac b/configure.ac +index 972287a9c4..76252ad36c 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -718,9 +718,6 @@ then + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +-AC_SUBST(MULTIARCH) +- + AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) + cat >> conftest.c </dev/null) ++fi ++AC_SUBST(MULTIARCH) ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) +-- +2.36.0 + diff --git a/plugins/python-build/share/python-build/patches/3.9.25/Python-3.9.25/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch b/plugins/python-build/share/python-build/patches/3.9.25/Python-3.9.25/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch new file mode 100644 index 0000000..6da534e --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.9.25/Python-3.9.25/0001-Recognize-an-argument-to-j-in-MAKEFLAGS.patch @@ -0,0 +1,27 @@ +From 3fec519d6b326918f39ceb142ef762042ce8365f Mon Sep 17 00:00:00 2001 +From: Ivan Pozdeev +Date: Fri, 26 Dec 2025 13:39:21 +0300 +Subject: [PATCH] Recognize an argument to -j in MAKEFLAGS + +--- + setup.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/setup.py b/setup.py +index ad8fb81b218..5666deaf67b 100644 +--- a/setup.py ++++ b/setup.py +@@ -307,8 +307,8 @@ def __init__(self, dist): + self.failed_on_import = [] + self.missing = [] + self.disabled_configure = [] +- if '-j' in os.environ.get('MAKEFLAGS', ''): +- self.parallel = True ++ if (m:=re.search(r'(?:^|\s)(?:-j|--jobs)(?:\s+|=)?(\d*)',os.environ.get('MAKEFLAGS', ''))) is not None: ++ self.parallel = int(m.group(1)) if m.group(1) else True + + def add(self, ext): + self.extensions.append(ext) +-- +2.36.1.windows.1 + diff --git a/plugins/python-build/share/python-build/patches/3.9.4/Python-3.9.4/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch b/plugins/python-build/share/python-build/patches/3.9.4/Python-3.9.4/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch new file mode 100644 index 0000000..89f5705 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.9.4/Python-3.9.4/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch @@ -0,0 +1,80 @@ +From d93aaf050384705ac744a4e6cbbab1408e770c0a Mon Sep 17 00:00:00 2001 +From: David Bohman +Date: Tue, 12 Oct 2021 17:10:26 -0700 +Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running + ``configure`` with recent versions of non-Apple clang. (#28845) + +Change the configure logic to function properly on macOS when the compiler +outputs a platform triplet for option --print-multiarch. + +Co-authored-by: Ned Deily +--- + .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ + configure | 8 +++++--- + configure.ac | 8 +++++--- + 3 files changed, 12 insertions(+), 6 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst + +diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +new file mode 100644 +index 0000000000..a2dc5bcc32 +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +@@ -0,0 +1,2 @@ ++Prevent ``internal configure error`` when running ``configure`` ++with recent versions of non-Apple clang. Patch by David Bohman. +diff --git a/configure b/configure +index c7a7291fea..708c9215e4 100755 +--- a/configure ++++ b/configure +@@ -5193,9 +5193,6 @@ $as_echo "$as_me: + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 + $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } + cat >> conftest.c <&6; } + fi + rm -f conftest.c conftest.out + ++if test x$PLATFORM_TRIPLET != xdarwin; then ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null) ++fi ++ ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 +diff --git a/configure.ac b/configure.ac +index 45e0af4493..559a40eda9 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -725,9 +725,6 @@ then + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +-AC_SUBST(MULTIARCH) +- + AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) + cat >> conftest.c </dev/null) ++fi ++AC_SUBST(MULTIARCH) ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) +-- +2.36.0 + diff --git a/plugins/python-build/share/python-build/patches/3.9.5/Python-3.9.5/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch b/plugins/python-build/share/python-build/patches/3.9.5/Python-3.9.5/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch new file mode 100644 index 0000000..c0238e8 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.9.5/Python-3.9.5/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch @@ -0,0 +1,80 @@ +From 16a65fb399eb8d1a5cfecd597e579a4402b2e4c8 Mon Sep 17 00:00:00 2001 +From: David Bohman +Date: Tue, 12 Oct 2021 17:10:26 -0700 +Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running + ``configure`` with recent versions of non-Apple clang. (#28845) + +Change the configure logic to function properly on macOS when the compiler +outputs a platform triplet for option --print-multiarch. + +Co-authored-by: Ned Deily +--- + .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ + configure | 8 +++++--- + configure.ac | 8 +++++--- + 3 files changed, 12 insertions(+), 6 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst + +diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +new file mode 100644 +index 0000000000..a2dc5bcc32 +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +@@ -0,0 +1,2 @@ ++Prevent ``internal configure error`` when running ``configure`` ++with recent versions of non-Apple clang. Patch by David Bohman. +diff --git a/configure b/configure +index 8dcdbf1989..ac03aff210 100755 +--- a/configure ++++ b/configure +@@ -5196,9 +5196,6 @@ $as_echo "$as_me: + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 + $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } + cat >> conftest.c <&6; } + fi + rm -f conftest.c conftest.out + ++if test x$PLATFORM_TRIPLET != xdarwin; then ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null) ++fi ++ ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 +diff --git a/configure.ac b/configure.ac +index b1e4c6ce19..94102dd324 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -727,9 +727,6 @@ then + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +-AC_SUBST(MULTIARCH) +- + AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) + cat >> conftest.c </dev/null) ++fi ++AC_SUBST(MULTIARCH) ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) +-- +2.36.0 + diff --git a/plugins/python-build/share/python-build/patches/3.9.6/Python-3.9.6/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch b/plugins/python-build/share/python-build/patches/3.9.6/Python-3.9.6/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch new file mode 100644 index 0000000..fd2b603 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.9.6/Python-3.9.6/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch @@ -0,0 +1,80 @@ +From 9b7f2f9ce024d2cceb90f9a9d939b37090c525e2 Mon Sep 17 00:00:00 2001 +From: David Bohman +Date: Tue, 12 Oct 2021 17:10:26 -0700 +Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running + ``configure`` with recent versions of non-Apple clang. (#28845) + +Change the configure logic to function properly on macOS when the compiler +outputs a platform triplet for option --print-multiarch. + +Co-authored-by: Ned Deily +--- + .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ + configure | 8 +++++--- + configure.ac | 8 +++++--- + 3 files changed, 12 insertions(+), 6 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst + +diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +new file mode 100644 +index 0000000000..a2dc5bcc32 +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +@@ -0,0 +1,2 @@ ++Prevent ``internal configure error`` when running ``configure`` ++with recent versions of non-Apple clang. Patch by David Bohman. +diff --git a/configure b/configure +index ffa61c1dc5..18597d4de8 100755 +--- a/configure ++++ b/configure +@@ -5196,9 +5196,6 @@ $as_echo "$as_me: + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 + $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } + cat >> conftest.c <&6; } + fi + rm -f conftest.c conftest.out + ++if test x$PLATFORM_TRIPLET != xdarwin; then ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null) ++fi ++ ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 +diff --git a/configure.ac b/configure.ac +index 8fe5fa5742..577ce9040f 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -727,9 +727,6 @@ then + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +-AC_SUBST(MULTIARCH) +- + AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) + cat >> conftest.c </dev/null) ++fi ++AC_SUBST(MULTIARCH) ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) +-- +2.36.0 + diff --git a/plugins/python-build/share/python-build/patches/3.9.7/Python-3.9.7/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch b/plugins/python-build/share/python-build/patches/3.9.7/Python-3.9.7/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch new file mode 100644 index 0000000..439d0e3 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/3.9.7/Python-3.9.7/0001-bpo-45405-Prevent-internal-configure-error-when-runn.patch @@ -0,0 +1,80 @@ +From 785de1ab8b4ab8b89d0e62ffd7521b5b2636923a Mon Sep 17 00:00:00 2001 +From: David Bohman +Date: Tue, 12 Oct 2021 17:10:26 -0700 +Subject: [PATCH] bpo-45405: Prevent ``internal configure error`` when running + ``configure`` with recent versions of non-Apple clang. (#28845) + +Change the configure logic to function properly on macOS when the compiler +outputs a platform triplet for option --print-multiarch. + +Co-authored-by: Ned Deily +--- + .../next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst | 2 ++ + configure | 8 +++++--- + configure.ac | 8 +++++--- + 3 files changed, 12 insertions(+), 6 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst + +diff --git a/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +new file mode 100644 +index 0000000000..a2dc5bcc32 +--- /dev/null ++++ b/Misc/NEWS.d/next/Build/2021-10-11-16-27-38.bpo-45405.iSfdW5.rst +@@ -0,0 +1,2 @@ ++Prevent ``internal configure error`` when running ``configure`` ++with recent versions of non-Apple clang. Patch by David Bohman. +diff --git a/configure b/configure +index ffa61c1dc5..18597d4de8 100755 +--- a/configure ++++ b/configure +@@ -5196,9 +5196,6 @@ $as_echo "$as_me: + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +- +- + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the platform triplet based on compiler characteristics" >&5 + $as_echo_n "checking for the platform triplet based on compiler characteristics... " >&6; } + cat >> conftest.c <&6; } + fi + rm -f conftest.c conftest.out + ++if test x$PLATFORM_TRIPLET != xdarwin; then ++ MULTIARCH=$($CC --print-multiarch 2>/dev/null) ++fi ++ ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 +diff --git a/configure.ac b/configure.ac +index 8fe5fa5742..577ce9040f 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -727,9 +727,6 @@ then + fi + + +-MULTIARCH=$($CC --print-multiarch 2>/dev/null) +-AC_SUBST(MULTIARCH) +- + AC_MSG_CHECKING([for the platform triplet based on compiler characteristics]) + cat >> conftest.c </dev/null) ++fi ++AC_SUBST(MULTIARCH) ++ + if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then + if test x$PLATFORM_TRIPLET != x$MULTIARCH; then + AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) +-- +2.36.0 + diff --git a/plugins/python-build/share/python-build/patches/cinder-3.10-dev/Cinder-3.10-dev/001-disable-werror.patch b/plugins/python-build/share/python-build/patches/cinder-3.10-dev/Cinder-3.10-dev/001-disable-werror.patch new file mode 100644 index 0000000..3014b81 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/cinder-3.10-dev/Cinder-3.10-dev/001-disable-werror.patch @@ -0,0 +1,30 @@ +diff --git a/configure b/configure +index 5c74f00a..8bb51f40 100755 +--- a/configure ++++ b/configure +@@ -7057,8 +7057,8 @@ $as_echo "$ac_cv_extra_warnings" >&6; } + + if test $ac_cv_extra_warnings = yes + then +- CFLAGS_NODIST="$CFLAGS_NODIST -Wextra -Werror" +- CXXFLAGS_NODIST="$CXXFLAGS_NODIST -Wextra -Werror -Wno-implicit-fallthrough" ++ CFLAGS_NODIST="$CFLAGS_NODIST -Wextra" ++ CXXFLAGS_NODIST="$CXXFLAGS_NODIST -Wextra -Wno-implicit-fallthrough" + fi + + # Python doesn't violate C99 aliasing rules, but older versions of +diff --git a/configure.ac b/configure.ac +index c06b992d..6dee6632 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1622,8 +1622,8 @@ yes) + + if test $ac_cv_extra_warnings = yes + then +- CFLAGS_NODIST="$CFLAGS_NODIST -Wextra -Werror" +- CXXFLAGS_NODIST="$CXXFLAGS_NODIST -Wextra -Werror -Wno-implicit-fallthrough" ++ CFLAGS_NODIST="$CFLAGS_NODIST -Wextra" ++ CXXFLAGS_NODIST="$CXXFLAGS_NODIST -Wextra -Wno-implicit-fallthrough" + fi + + # Python doesn't violate C99 aliasing rules, but older versions of diff --git a/plugins/python-build/share/python-build/patches/cinder-3.8-dev/Cinder-3.8-dev/001-disable-werror.patch b/plugins/python-build/share/python-build/patches/cinder-3.8-dev/Cinder-3.8-dev/001-disable-werror.patch new file mode 100644 index 0000000..bbcd9a1 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/cinder-3.8-dev/Cinder-3.8-dev/001-disable-werror.patch @@ -0,0 +1,30 @@ +diff --git a/configure b/configure +index 0df332f7..df8143cf 100755 +--- a/configure ++++ b/configure +@@ -6952,8 +6952,8 @@ $as_echo "$ac_cv_extra_warnings" >&6; } + + if test $ac_cv_extra_warnings = yes + then +- CFLAGS_NODIST="$CFLAGS_NODIST -Wextra -Werror" +- CXXFLAGS_NODIST="$CXXFLAGS_NODIST -Wextra -Werror -Wno-implicit-fallthrough" ++ CFLAGS_NODIST="$CFLAGS_NODIST -Wextra" ++ CXXFLAGS_NODIST="$CXXFLAGS_NODIST -Wextra -Wno-implicit-fallthrough" + fi + + # Python doesn't violate C99 aliasing rules, but older versions of +diff --git a/configure.ac b/configure.ac +index f6718e36..0a651e7d 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1579,8 +1579,8 @@ yes) + + if test $ac_cv_extra_warnings = yes + then +- CFLAGS_NODIST="$CFLAGS_NODIST -Wextra -Werror" +- CXXFLAGS_NODIST="$CXXFLAGS_NODIST -Wextra -Werror -Wno-implicit-fallthrough" ++ CFLAGS_NODIST="$CFLAGS_NODIST -Wextra" ++ CXXFLAGS_NODIST="$CXXFLAGS_NODIST -Wextra -Wno-implicit-fallthrough" + fi + + # Python doesn't violate C99 aliasing rules, but older versions of diff --git a/plugins/python-build/share/python-build/patches/stackless-3.2.2/stackless-322-export/002_readline63.patch b/plugins/python-build/share/python-build/patches/stackless-3.2.2/stackless-322-export/002_readline63.patch new file mode 100644 index 0000000..ed29626 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/stackless-3.2.2/stackless-322-export/002_readline63.patch @@ -0,0 +1,70 @@ +diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 +@@ -231,8 +231,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -774,14 +773,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -819,7 +826,7 @@ + (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { + goto error; + } +- Py_XDECREF(r); r=NULL; ++ Py_CLEAR(r); + + if (0) { + error: +@@ -877,7 +884,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -936,12 +943,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/stackless-3.2.2/stackless-322-export/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/stackless-3.2.2/stackless-322-export/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..f8de55f --- /dev/null +++ b/plugins/python-build/share/python-build/patches/stackless-3.2.2/stackless-322-export/010_ssl_no_ssl3.patch @@ -0,0 +1,102 @@ +diff -r -u ../Python-3.2.2.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.2.2.orig/Lib/ssl.py 2011-09-03 16:16:42.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-20 07:01:09.947260656 +0000 +@@ -62,34 +62,30 @@ + from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION + from _ssl import _SSLContext, SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1 +-from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import ( +- SSL_ERROR_ZERO_RETURN, +- SSL_ERROR_WANT_READ, +- SSL_ERROR_WANT_WRITE, +- SSL_ERROR_WANT_X509_LOOKUP, +- SSL_ERROR_SYSCALL, +- SSL_ERROR_SSL, +- SSL_ERROR_WANT_CONNECT, +- SSL_ERROR_EOF, +- SSL_ERROR_INVALID_ERROR_CODE, +- ) ++from _ssl import RAND_status, RAND_add ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ + from _ssl import HAS_SNI +-from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 + from _ssl import _OPENSSL_API_VERSION + +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + try: +- from _ssl import PROTOCOL_SSLv2 +-except ImportError: +- pass +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" ++ _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 ++except NameError: ++ _SSLv2_IF_EXISTS = None + + from socket import getnameinfo as _getnameinfo + from socket import error as socket_error +@@ -547,7 +543,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.2.2.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.2.2.orig/Modules/_ssl.c 2011-09-03 16:16:46.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-20 06:59:12.632993190 +0000 +@@ -66,7 +66,9 @@ + #ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, + #endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3=1, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -1450,8 +1452,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + ctx = SSL_CTX_new(TLSv1_method()); ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + ctx = SSL_CTX_new(SSLv3_method()); ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + ctx = SSL_CTX_new(SSLv2_method()); +@@ -2136,8 +2140,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/patches/stackless-3.2.5/stackless-325-export/002_readline63.patch b/plugins/python-build/share/python-build/patches/stackless-3.2.5/stackless-325-export/002_readline63.patch new file mode 100644 index 0000000..ed29626 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/stackless-3.2.5/stackless-325-export/002_readline63.patch @@ -0,0 +1,70 @@ +diff -r -u ../Python-3.3.3.orig/Modules/readline.c ./Modules/readline.c +--- ../Python-3.3.3.orig/Modules/readline.c 2013-11-17 16:23:01.000000000 +0900 ++++ ./Modules/readline.c 2014-03-29 16:22:10.219305878 +0900 +@@ -231,8 +231,7 @@ + if (!PyArg_ParseTuple(args, buf, &function)) + return NULL; + if (function == Py_None) { +- Py_XDECREF(*hook_var); +- *hook_var = NULL; ++ Py_CLEAR(*hook_var); + } + else if (PyCallable_Check(function)) { + PyObject *tmp = *hook_var; +@@ -774,14 +773,22 @@ + } + + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_startup_hook(void) ++#else ++on_startup_hook() ++#endif + { + return on_hook(startup_hook); + } + + #ifdef HAVE_RL_PRE_INPUT_HOOK + static int ++#if defined(_RL_FUNCTION_TYPEDEF) + on_pre_input_hook(void) ++#else ++on_pre_input_hook() ++#endif + { + return on_hook(pre_input_hook); + } +@@ -819,7 +826,7 @@ + (r != Py_None && PyLong_AsLong(r) == -1 && PyErr_Occurred())) { + goto error; + } +- Py_XDECREF(r); r=NULL; ++ Py_CLEAR(r); + + if (0) { + error: +@@ -877,7 +884,7 @@ + * before calling the normal completer */ + + static char ** +-flex_complete(char *text, int start, int end) ++flex_complete(const char *text, int start, int end) + { + #ifdef HAVE_RL_COMPLETION_APPEND_CHARACTER + rl_completion_append_character ='\0'; +@@ -936,12 +943,12 @@ + rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); + rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); + /* Set our hook functions */ +- rl_startup_hook = (Function *)on_startup_hook; ++ rl_startup_hook = on_startup_hook; + #ifdef HAVE_RL_PRE_INPUT_HOOK +- rl_pre_input_hook = (Function *)on_pre_input_hook; ++ rl_pre_input_hook = on_pre_input_hook; + #endif + /* Set our completion function */ +- rl_attempted_completion_function = (CPPFunction *)flex_complete; ++ rl_attempted_completion_function = flex_complete; + /* Set Python word break characters */ + completer_word_break_characters = + rl_completer_word_break_characters = diff --git a/plugins/python-build/share/python-build/patches/stackless-3.2.5/stackless-325-export/010_ssl_no_ssl3.patch b/plugins/python-build/share/python-build/patches/stackless-3.2.5/stackless-325-export/010_ssl_no_ssl3.patch new file mode 100644 index 0000000..11a9439 --- /dev/null +++ b/plugins/python-build/share/python-build/patches/stackless-3.2.5/stackless-325-export/010_ssl_no_ssl3.patch @@ -0,0 +1,100 @@ +diff -r -u ../Python-3.2.6.orig/Lib/ssl.py ./Lib/ssl.py +--- ../Python-3.2.6.orig/Lib/ssl.py 2014-10-12 06:52:02.000000000 +0000 ++++ ./Lib/ssl.py 2015-12-20 06:40:11.895384463 +0000 +@@ -62,35 +62,30 @@ + from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION + from _ssl import _SSLContext, SSLError + from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +-from _ssl import OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1 + from _ssl import RAND_status, RAND_egd, RAND_add +-from _ssl import ( +- SSL_ERROR_ZERO_RETURN, +- SSL_ERROR_WANT_READ, +- SSL_ERROR_WANT_WRITE, +- SSL_ERROR_WANT_X509_LOOKUP, +- SSL_ERROR_SYSCALL, +- SSL_ERROR_SSL, +- SSL_ERROR_WANT_CONNECT, +- SSL_ERROR_EOF, +- SSL_ERROR_INVALID_ERROR_CODE, +- ) ++try: ++ from _ssl import RAND_egd ++except ImportError: ++ # LibreSSL does not provide RAND_egd ++ pass ++ ++def _import_symbols(prefix): ++ for n in dir(_ssl): ++ if n.startswith(prefix): ++ globals()[n] = getattr(_ssl, n) ++ ++_import_symbols('OP_') ++_import_symbols('SSL_ERROR_') ++_import_symbols('PROTOCOL_') ++ + from _ssl import HAS_SNI +-from _ssl import PROTOCOL_SSLv3, PROTOCOL_SSLv23, PROTOCOL_TLSv1 + from _ssl import _OPENSSL_API_VERSION + +-_PROTOCOL_NAMES = { +- PROTOCOL_TLSv1: "TLSv1", +- PROTOCOL_SSLv23: "SSLv23", +- PROTOCOL_SSLv3: "SSLv3", +-} ++_PROTOCOL_NAMES = {value: name for name, value in globals().items() if name.startswith('PROTOCOL_')} + try: +- from _ssl import PROTOCOL_SSLv2 + _SSLv2_IF_EXISTS = PROTOCOL_SSLv2 +-except ImportError: ++except NameError: + _SSLv2_IF_EXISTS = None +-else: +- _PROTOCOL_NAMES[PROTOCOL_SSLv2] = "SSLv2" + + from socket import getnameinfo as _getnameinfo + from socket import error as socket_error +@@ -557,7 +552,7 @@ + d = pem_cert_string.strip()[len(PEM_HEADER):-len(PEM_FOOTER)] + return base64.decodebytes(d.encode('ASCII', 'strict')) + +-def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv3, ca_certs=None): ++def get_server_certificate(addr, ssl_version=PROTOCOL_SSLv23, ca_certs=None): + """Retrieve the certificate from the server at the specified address, + and return it as a PEM-encoded string. + If 'ca_certs' is specified, validate the server cert against it. +diff -r -u ../Python-3.2.6.orig/Modules/_ssl.c ./Modules/_ssl.c +--- ../Python-3.2.6.orig/Modules/_ssl.c 2014-10-12 06:52:03.000000000 +0000 ++++ ./Modules/_ssl.c 2015-12-20 06:37:10.124337227 +0000 +@@ -66,7 +66,9 @@ + #ifndef OPENSSL_NO_SSL2 + PY_SSL_VERSION_SSL2, + #endif ++#ifndef OPENSSL_NO_SSL3 + PY_SSL_VERSION_SSL3=1, ++#endif + PY_SSL_VERSION_SSL23, + PY_SSL_VERSION_TLS1 + }; +@@ -1512,8 +1514,10 @@ + PySSL_BEGIN_ALLOW_THREADS + if (proto_version == PY_SSL_VERSION_TLS1) + ctx = SSL_CTX_new(TLSv1_method()); ++#ifndef OPENSSL_NO_SSL3 + else if (proto_version == PY_SSL_VERSION_SSL3) + ctx = SSL_CTX_new(SSLv3_method()); ++#endif + #ifndef OPENSSL_NO_SSL2 + else if (proto_version == PY_SSL_VERSION_SSL2) + ctx = SSL_CTX_new(SSLv2_method()); +@@ -2199,8 +2203,10 @@ + PyModule_AddIntConstant(m, "PROTOCOL_SSLv2", + PY_SSL_VERSION_SSL2); + #endif ++#ifndef OPENSSL_NO_SSL3 + PyModule_AddIntConstant(m, "PROTOCOL_SSLv3", + PY_SSL_VERSION_SSL3); ++#endif + PyModule_AddIntConstant(m, "PROTOCOL_SSLv23", + PY_SSL_VERSION_SSL23); + PyModule_AddIntConstant(m, "PROTOCOL_TLSv1", diff --git a/plugins/python-build/share/python-build/pypy-1.5-src b/plugins/python-build/share/python-build/pypy-1.5-src new file mode 100644 index 0000000..cab008b --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-1.5-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy-1.5-src" "https://foss.heptapod.net/pypy/pypy/-/archive/release-1.5/pypy-release-1.5.tar.gz" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy-1.6 b/plugins/python-build/share/python-build/pypy-1.6 new file mode 100644 index 0000000..516aaf7 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-1.6 @@ -0,0 +1,23 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_package "pypy-1.6" "https://downloads.python.org/pypy/pypy-1.6-linux.tar.bz2#1266c8b5918d84432b8649535fb5c84f6b977331c242bf45c5944033562ce0b2" "pypy" verify_py27 ensurepip + ;; +"linux64" ) + install_package "pypy-1.6" "https://downloads.python.org/pypy/pypy-1.6-linux64.tar.bz2#95b229c496339a51c4c1e9749bf8dbd11e4f698521803c089b52577be2cdbab8" "pypy" verify_py27 ensurepip + ;; +"osx64" ) + install_package "pypy-1.6" "https://downloads.python.org/pypy/pypy-1.6-osx64.tar.bz2#147a0e34b3d3a568d5c5926252a2c27e137677b3121cd8daab1d746df2d91e38" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy-1.6" "https://downloads.python.org/pypy/pypy-1.6-win32-c.zip#75bf79f08e2d65fce51b14fb8fe0309f136ffc368f977017dc3029baf8426e53" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-1.7 b/plugins/python-build/share/python-build/pypy-1.7 new file mode 100644 index 0000000..4b84d14 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-1.7 @@ -0,0 +1,24 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_package "pypy-1.7" "https://downloads.python.org/pypy/pypy-1.7-linux.tar.bz2#d8f6af52dd5c32ca65de8b1507ef49490188ec131d53a68db6f81201943b4227" "pypy" verify_py27 ensurepip + ;; +"linux64" ) + install_package "pypy-1.7" "https://downloads.python.org/pypy/pypy-1.7-linux64.tar.bz2#cd7ff7a4beaaa78c3b9dbcd567fb0b2d672258051f837e727d4fd636788552ca" "pypy" verify_py27 ensurepip + ;; +"osx64" ) + install_package "pypy-1.7" "https://downloads.python.org/pypy/pypy-1.7-osx64.tar.bz2#9ad01f6e194b1a3d5f2fa82cd6760b4f9e8a791d5ca28cc156c5f03fe43a08ac" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy-1.7" "https://downloads.python.org/pypy/pypy-1.7-win32.zip#1d70faaed00f2f69c634dfbb61b54901df64f093d07d976e035578f812ed31ea" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy-1.7-dev' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-1.8 b/plugins/python-build/share/python-build/pypy-1.8 new file mode 100644 index 0000000..96259b7 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-1.8 @@ -0,0 +1,24 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_package "pypy-1.8" "https://downloads.python.org/pypy/pypy-1.8-linux.tar.bz2#9c293d8540780260718f8fd8dc433c97b614a31b115ccfe2d68df720ad7e55b1" "pypy" verify_py27 ensurepip + ;; +"linux64" ) + install_package "pypy-1.8" "https://downloads.python.org/pypy/pypy-1.8-linux64.tar.bz2#1045606cceb993844a016b76c55aa43a9924bcf526f91a0572fc97cee69b61dc" "pypy" verify_py27 ensurepip + ;; +"osx64" ) + install_package "pypy-1.8" "https://downloads.python.org/pypy/pypy-1.8-osx64.tar.bz2#b823b6b919082cfb67861b8253313b877618672377164086c0364fa8eaa88b8a" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy-1.8" "https://downloads.python.org/pypy/pypy-1.8-win32.zip#a844f54551805d300beffd10b18684e0c08fa080c1b6f7be52bb7fbdfdf38292" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy-1.8-dev' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-1.9 b/plugins/python-build/share/python-build/pypy-1.9 new file mode 100644 index 0000000..353f6cd --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-1.9 @@ -0,0 +1,24 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_package "pypy-1.9" "https://downloads.python.org/pypy/pypy-1.9-linux.tar.bz2#1e3f9c3d06f8bbfa0dcb1301b40c298096249a7d7c2b4594b3fb1c3e7b9888f2" "pypy" verify_py27 ensurepip + ;; +"linux64" ) + install_package "pypy-1.9" "https://downloads.python.org/pypy/pypy-1.9-linux64.tar.bz2#4298252515e78c96f4ecd9f25be957411c060ece02d9213eef8d781cf528d18f" "pypy" verify_py27 ensurepip + ;; +"osx64" ) + install_package "pypy-1.9" "https://downloads.python.org/pypy/pypy-1.9-osx64.tar.bz2#4858f200e32c1070c77c1234ea0e9473eeda98bcd3832c4231f3e46e4e3b74b1" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy-1.9" "https://downloads.python.org/pypy/pypy-1.9-win32.zip#54fafe8c69df390d2a460bab022145aaacd2c62c4a569873b22fdc7475f31581" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy-1.9-dev' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-2.0 b/plugins/python-build/share/python-build/pypy-2.0 new file mode 100644 index 0000000..0f9e807 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.0 @@ -0,0 +1,34 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + require_distro "Ubuntu 10.04" || true + install_package "pypy-2.0" "https://downloads.python.org/pypy/pypy-2.0-linux.tar.bz2#275dbbee67eac527a1177403a0386b17d008740f83030544800d87994edd46b9" "pypy" verify_py27 ensurepip + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-2.0-alpha-arm" "https://downloads.python.org/pypy/pypy-2.0-alpha-arm-armel.tar.bz2#2f8f252d43a15661602a98f93d3292e333423459c5facb43eb2de1bda8eb8495" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-2.0-alpha-arm" "https://downloads.python.org/pypy/pypy-2.0-alpha-arm-armhf.tar.bz2#00e678e5a226be0692ee18438ace1c91d346256cfab8f32e34a24584d018ca34" "pypy" verify_py27 ensurepip + ;; +"linux64" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-2.0" "https://downloads.python.org/pypy/pypy-2.0-linux64.tar.bz2#14c716d53a507eece89606d547456b886dbdfc0ba6e3fb29062fafe86d1b6038" "pypy" verify_py27 ensurepip + ;; +"osx64" ) + install_package "pypy-2.0" "https://downloads.python.org/pypy/pypy-2.0-osx64.tar.bz2#6d190f32c9dce9d36d4a2bb91faed581a50fb7fa6249eee201dbf5dbc3e3c7d7" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy-2.0" "https://downloads.python.org/pypy/pypy-2.0-win32.zip#2f1d5a0d2cb2fa61902eba5479b100d6d26aab211149b06d5acf64089dd20fe1" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy-2.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-2.0-src b/plugins/python-build/share/python-build/pypy-2.0-src new file mode 100644 index 0000000..375b5a9 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy-2.0-src" "https://downloads.python.org/pypy/pypy-2.0-src.tar.bz2#d92dfd418beac915d3efc28f8a2090f3c13a89ec653419deff3d7112c5c111f3" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy-2.0.1 b/plugins/python-build/share/python-build/pypy-2.0.1 new file mode 100644 index 0000000..4d1b96a --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.0.1 @@ -0,0 +1,26 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + require_distro "Ubuntu 10.04" || true + install_package "pypy-2.0.1" "https://downloads.python.org/pypy/pypy-2.0.1-linux.tar.bz2#548686c5b95b424c79586d9a303ed41fca8eba52bd35c1527f39f5cd8fa35ea9" "pypy" verify_py27 ensurepip + ;; +"linux64" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-2.0.1" "https://downloads.python.org/pypy/pypy-2.0.1-linux64.tar.bz2#0eb57e28f2bd5f2a4ad396df322de5adf711eb7d9a2bfeb8be2d9eb9e125c5cc" "pypy" verify_py27 ensurepip + ;; +"osx64" ) + install_package "pypy-2.0.1" "https://downloads.python.org/pypy/pypy-2.0.1-osx64.tar.bz2#337f2fda672827f2d706fd98e3344a83a8b80675e21b83dd6933da38d110c857" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy-2.0.1" "https://downloads.python.org/pypy/pypy-2.0.1-win32.zip#78fff168c10176a3a7f6a5b97d2048ed87f3cd9a6284b5afa86115baa19af946" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy-2.0.1-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-2.0.1-src b/plugins/python-build/share/python-build/pypy-2.0.1-src new file mode 100644 index 0000000..a8203af --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.0.1-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy-2.0.1-src" "https://downloads.python.org/pypy/pypy-2.0.1-src.tar.bz2#d1327bc325545939236ac609ec509548a545f97b1c933dedbe42f2482a130aa0" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy-2.0.2 b/plugins/python-build/share/python-build/pypy-2.0.2 new file mode 100644 index 0000000..2e605a9 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.0.2 @@ -0,0 +1,26 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + require_distro "Ubuntu 10.04" || true + install_package "pypy-2.0.2" "https://downloads.python.org/pypy/pypy-2.0.2-linux.tar.bz2#3b43c1ac147f6bb11981dd7f8c5458b95d6bdcf1adceb8043c32ca5e8fcab4da" "pypy" verify_py27 ensurepip + ;; +"linux64" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-2.0.2" "https://downloads.python.org/pypy/pypy-2.0.2-linux64.tar.bz2#3f9bc07959a2d6058a0c1b84da837e2ec457642fe03ac46123d145c419a7b5cd" "pypy" verify_py27 ensurepip + ;; +"osx64" ) + install_package "pypy-2.0.2" "https://downloads.python.org/pypy/pypy-2.0.2-osx64.tar.bz2#34f5a7bf22a8bca3b9d79ae3186016c34638669ab19b4af6e38412181c757761" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy-2.0.2" "https://downloads.python.org/pypy/pypy-2.0.2-win32.zip#f3cfa54740076c59e6ef02e1411f62551230df5cd20a247e81b6e589478afe66" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy-2.0.2-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-2.0.2-src b/plugins/python-build/share/python-build/pypy-2.0.2-src new file mode 100644 index 0000000..b1fd1ce --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.0.2-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy-2.0.2-src" "https://downloads.python.org/pypy/pypy-2.0.2-src.tar.bz2#1991c90d6b98e2408b3790d4b57b71ec1c69346328b8321505ce8f6ab4544c3c" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy-2.1 b/plugins/python-build/share/python-build/pypy-2.1 new file mode 100644 index 0000000..6cb58d3 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.1 @@ -0,0 +1,38 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + require_distro "Ubuntu 10.04" || true + install_package "pypy-2.1" "https://downloads.python.org/pypy/pypy-2.1-linux.tar.bz2#9c0a38a40d3b4e642a159e51abef2827b33e3f7a254365daa24eae85d840eaf5" "pypy" verify_py27 ensurepip + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-2.1" "https://downloads.python.org/pypy/pypy-2.1-linux-armel.tar.bz2#15af2d7485c9e4363805ad5b63bf8a67cd9516e7e34c4abb822229a2a41aee1d" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy-2.1" "https://downloads.python.org/pypy/pypy-2.1-linux-armhf-raspbian.tar.bz2#b11c27447051af00928fcc3d1f20f1441c285045a3acb8cfba8721c63ee90df3" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy-2.1" "https://downloads.python.org/pypy/pypy-2.1-linux-armhf-raring.tar.bz2#fbab31154848f309ef72b6e845e289285907eda950f6b632963217c463b5d4de" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-2.1" "https://downloads.python.org/pypy/pypy-2.1-linux64.tar.bz2#80f90bb473635a0249049e87c5cc7cf738e13537c1f1e2857b6345848a3e6d20" "pypy" verify_py27 ensurepip + ;; +"osx64" ) + install_package "pypy-2.1" "https://downloads.python.org/pypy/pypy-2.1-osx64.tar.bz2#d0d788c6d54bb866ace67a1740133cb5bc62357b5ca4783244097f1f648876f0" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy-2.1" "https://downloads.python.org/pypy/pypy-2.1-win32.zip#c425a35a6c4938e314ad48014816e05c8e5246d770abe135e11a1f9821eecf53" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy-2.1-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-2.1-src b/plugins/python-build/share/python-build/pypy-2.1-src new file mode 100644 index 0000000..55e38ba --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.1-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy-2.1-src" "https://downloads.python.org/pypy/pypy-2.1-src.tar.bz2#31b3066c9739b117d6bb1bdc485a919dc3b67370ec00437de1b74069943f7f17" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy-2.2 b/plugins/python-build/share/python-build/pypy-2.2 new file mode 100644 index 0000000..08403fe --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.2 @@ -0,0 +1,38 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + require_distro "Ubuntu 10.04" || true + install_package "pypy-2.2-linux" "https://downloads.python.org/pypy/pypy-2.2-linux.tar.bz2#2bdab70106f6b6d0dd97e42535ce73711c987887fb81fb821801f6fdcd92cdc4" "pypy" verify_py27 ensurepip + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-2.2-linux-armel" "https://downloads.python.org/pypy/pypy-2.2-linux-armel.tar.bz2#98bfc524f9cf4fd96225f9fc9b0a3a379b8a1a06231b058c51bb875b363f4d75" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy-2.2-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-2.2-linux-armhf-raspbian.tar.bz2#4856151d9a6dda82edd9d74f872e97243df3676fc25bbf661f976982194caa47" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy-2.2-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-2.2-linux-armhf-raring.tar.bz2#d64eeeac0a73bd073d8f875210b0e85ed8f0d9655d3f3cc8abb68093a1eb7366" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-2.2-linux64" "https://downloads.python.org/pypy/pypy-2.2-linux64.tar.bz2#1583af0122c6ccb0cb95f8c3732925551ce3ca6d5ea0657e21523f8bf97837a3" "pypy" verify_py27 ensurepip + ;; +"osx64" ) + install_package "pypy-2.2-osx64" "https://downloads.python.org/pypy/pypy-2.2-osx64.tar.bz2#8aa943de7ec38f13fa836b6964dbf58b45142e4fe7b3fdd5fffe37fdcf974e01" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy-2.2-win32" "https://downloads.python.org/pypy/pypy-2.2-win32.zip#c7a6682cde9034835b337be95415aee21cb4de85049d65a4674efe15d214dfb9" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy-2.2-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-2.2-src b/plugins/python-build/share/python-build/pypy-2.2-src new file mode 100644 index 0000000..4aaf4fa --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.2-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy-2.2-src" "https://downloads.python.org/pypy/pypy-2.2-src.tar.bz2#50fffcb86039e019530a63d656580bc53c173e5f19768bddd8699cd08448e04e" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy-2.2.1 b/plugins/python-build/share/python-build/pypy-2.2.1 new file mode 100644 index 0000000..172bed0 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.2.1 @@ -0,0 +1,38 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + require_distro "Ubuntu 10.04" || true + install_package "pypy-2.2.1-linux" "https://downloads.python.org/pypy/pypy-2.2.1-linux.tar.bz2#4d13483a0e13fc617a7b3d36918ed0e63cf07a7d2827c0a08132b80bc401a55a" "pypy" verify_py27 ensurepip + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-2.2.1-linux-armel" "https://downloads.python.org/pypy/pypy-2.2.1-linux-armel.tar.bz2#f0a15c7f4d66f152c58d73475314b906dcd3052fc422a8bb8cf88ae1ca0a8b19" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy-2.2.1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-2.2.1-linux-armhf-raspbian.tar.bz2#31d921a8139ec6accf9749df2baff4aed844f6f46eeb37184119ff9c7d6fca55" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy-2.2.1-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-2.2.1-linux-armhf-raring.tar.bz2#6f5fe3285a32d1ea8fe148265467f870c6863ae00bc2e279b31b94d2d7f80102" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-2.2.1-linux64" "https://downloads.python.org/pypy/pypy-2.2.1-linux64.tar.bz2#022d611ac62a276890d3e262f4f7cc839fcf9f5e1416df01dcd83ba335eacb16" "pypy" verify_py27 ensurepip + ;; +"osx64" ) + install_package "pypy-2.2.1-osx64" "https://downloads.python.org/pypy/pypy-2.2.1-osx64.tar.bz2#93e215dcffc9073acf41c63518f47fb59de60386aca4416cfe32190c7a096f29" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy-2.2.1-win32" "https://downloads.python.org/pypy/pypy-2.2.1-win32.zip#d36f4f1b4f146b3a0a623abef9b5a837c08f66e67c90023c724dfdcd8e0133bb" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy-2.2.1-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-2.2.1-src b/plugins/python-build/share/python-build/pypy-2.2.1-src new file mode 100644 index 0000000..e191f52 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.2.1-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy-2.2.1-src" "https://downloads.python.org/pypy/pypy-2.2.1-src.tar.bz2#252045187e443656a2beb412dadac9296e8fe8db0f75a66ed5265db58c35035f" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy-2.3 b/plugins/python-build/share/python-build/pypy-2.3 new file mode 100644 index 0000000..08b7ccb --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.3 @@ -0,0 +1,38 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + require_distro "Ubuntu 10.04" || true + install_package "pypy-2.3-linux" "https://downloads.python.org/pypy/pypy-2.3-linux.tar.bz2#9071072d42344fb37cc588429864b00fff447bd5d33d51008641fe6822823f1b" "pypy" verify_py27 ensurepip + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-2.3-linux-armel" "https://downloads.python.org/pypy/pypy-2.3-linux-armel.tar.bz2#18394acc9ce356d109cbd92224a9d724a7eb53a0505ce0ec5de36ee20b288a07" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy-2.3-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-2.3-linux-armhf-raspbian.tar.bz2#92584cfccde188b6a3a850ecf226daa9924788a1da8574c57c10a7551fb127d4" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy-2.3-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-2.3-linux-armhf-raring.tar.bz2#c8c4a4da406db8ea6dfec074951e1ac150619b0709317ceaafb6bdd837acf96e" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-2.3-linux64" "https://downloads.python.org/pypy/pypy-2.3-linux64.tar.bz2#777dbdd9c67ad1b8906288b01ae76bc9f7b80c95e967836f9a700a1679b80008" "pypy" verify_py27 ensurepip + ;; +"osx64" ) + install_package "pypy-2.3-osx64" "https://downloads.python.org/pypy/pypy-2.3-osx64.tar.bz2#df7ca23ba6c8a63149d910b482be04f069b26dd1f7d0ca15e6342cac94e759d7" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy-2.3-win32" "https://downloads.python.org/pypy/pypy-2.3-win32.zip#72f46afe69281147ad9abc88a7b39d1840e112e626a8be251a5f9f7308c559c7" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy-2.3-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-2.3-src b/plugins/python-build/share/python-build/pypy-2.3-src new file mode 100644 index 0000000..96c7251 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.3-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy-pypy-394146e9bb67" "https://downloads.python.org/pypy/pypy-2.3-src.tar.bz2#be2c271e7f9d7c0059a551ba1501713c00336e551e7f13107f0f34c721d95b0c" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy-2.3.1 b/plugins/python-build/share/python-build/pypy-2.3.1 new file mode 100644 index 0000000..ffaaeca --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.3.1 @@ -0,0 +1,44 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then + install_package "pypy-2.3.1-linux" "https://downloads.python.org/pypy/pypy-2.3.1-linux.tar.bz2#3eed698e8533cca7cbd2c2c87fce39dc14baa7dec03f4b082d870131d2a470e4" "pypy" verify_py27 ensurepip + else + install_package "pypy-2.3.1-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-2.3.1-linux_i686-portable.tar.bz2#d8784020f6b8a5812fd8b3f5e1df8afb176fd56c2a929d4408d28d4a925525fa" "pypy" verify_py27 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-2.3.1-linux-armel" "https://downloads.python.org/pypy/pypy-2.3.1-linux-armel.tar.bz2#4d71679597b4e971d7e566d9696851dd2ec1a90a04696184d2d0f6b5446d9706" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy-2.3.1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-2.3.1-linux-armhf-raspbian.tar.bz2#74ac62f8cf6dfa0b2f04debd8bbedaed21a12a1a4d4da22856410d06dc0c971c" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy-2.3.1-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-2.3.1-linux-armhf-raring.tar.bz2#f65ad31c364e8122f55d77388026cf4750c6a8774af361b79dc9942612c3a8c1" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" 1>/dev/null 2>&1; then + install_package "pypy-2.3.1-linux64" "https://downloads.python.org/pypy/pypy-2.3.1-linux64.tar.bz2#dab7940496d96f1f255a8ef402fa96b94444775e373484e057d2fcabc3928b42" "pypy" verify_py27 ensurepip + else + install_package "pypy-2.3.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-2.3.1-linux_x86_64-portable.tar.bz2#453bd1291f0372e25ceab6b37b7a8d1756bebd3e708fcce1379ef931ccf9f75a" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + install_package "pypy-2.3.1-osx64" "https://downloads.python.org/pypy/pypy-2.3.1-osx64.tar.bz2#12e363bf5ea3a508600e043b68c47d4148359ca3d999ee207665bb139f8fbf37" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy-2.3.1-win32" "https://downloads.python.org/pypy/pypy-2.3.1-win32.zip#c8db46d0e5199420dae583f6d2901eb4d4023ced75f035a6e26c232f229f8e0a" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy-2.3.1-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-2.3.1-src b/plugins/python-build/share/python-build/pypy-2.3.1-src new file mode 100644 index 0000000..326536e --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.3.1-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy-pypy-32f35069a16d" "https://downloads.python.org/pypy/pypy-2.3.1-src.tar.bz2#6b10efab2be5502b475a25181870616e9ff83296b225aa2c7a7ec617c0ff78ef" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy-2.4.0 b/plugins/python-build/share/python-build/pypy-2.4.0 new file mode 100644 index 0000000..513570c --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.4.0 @@ -0,0 +1,44 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then + install_package "pypy-2.4.0-linux" "https://downloads.python.org/pypy/pypy-2.4.0-linux.tar.bz2#a24adb366f87ac0eba829d7188a156a7d897e71893689fab06502c3f4152ac0e" "pypy" verify_py27 ensurepip + else + install_package "pypy-2.4-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-2.4-linux_i686-portable.tar.bz2#2a330bbeae038c143366982f2104bf4096752f1ec7520fc5608f0527c124b0c2" "pypy" verify_py27 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-2.4.0-linux-armel" "https://downloads.python.org/pypy/pypy-2.4.0-linux-armel.tar.bz2#8362d634bf86fbfb3b99b578b13c0a9fd673b2b7580d6d65b4a181934c659ccd" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy-2.4.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-2.4.0-linux-armhf-raspbian.tar.bz2#5e0ba69b28ffbd5b61b0b6be2a130ab0c80e7d2da289d9530b0b6eac4302d5fa" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy-2.4.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-2.4.0-linux-armhf-raring.tar.bz2#ddbdd6207c41cf82d8c96d52a2a204a2cdada9301cb577f9b323f22394bb1f0a" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" 1>/dev/null 2>&1; then + install_package "pypy-2.4.0-linux64" "https://downloads.python.org/pypy/pypy-2.4.0-linux64.tar.bz2#27cdc0d6e8bce2637678f6d076fc780877dffe1bf9aec9e253f95219af9ed099" "pypy" verify_py27 ensurepip + else + install_package "pypy-2.4-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-2.4-linux_x86_64-portable.tar.bz2#b6ed31aff0ebcc9b40554576b1ce789fe4e8c93f7a34cd3983515e1a9a8a45b6" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + install_package "pypy-2.4.0-osx64" "https://downloads.python.org/pypy/pypy-2.4.0-osx64.tar.bz2#3eb8afdfa42bc9b08b4d3058e21d4ce978a52722fdcfdc67d6c3ee5013a51aaa" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy-2.4.0-win32" "https://downloads.python.org/pypy/pypy-2.4.0-win32.zip#297fa3820a3aa8da291f52b6e2398b23232192b69773638e3d06999d92a2b0aa" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy-2.4.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-2.4.0-src b/plugins/python-build/share/python-build/pypy-2.4.0-src new file mode 100644 index 0000000..3122ef9 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.4.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy-pypy-c6ad44ecf5d8" "https://downloads.python.org/pypy/pypy-2.4.0-src.tar.bz2#38810007aee4885ca0703b566db6594dd7649adaaa287df7a1012f10e067740f" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy-2.5.0 b/plugins/python-build/share/python-build/pypy-2.5.0 new file mode 100644 index 0000000..fd0f2fa --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.5.0 @@ -0,0 +1,44 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then + install_package "pypy-2.5.0-linux" "https://downloads.python.org/pypy/pypy-2.5.0-linux.tar.bz2#3dfd56a986d25929b4ed9f40a5484f72f1d513cd816cf8aaa683106c3391247c" "pypy" verify_py27 ensurepip + else + install_package "pypy-2.5-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-2.5-linux_i686-portable.tar.bz2#6cbe3e1a48900f22c8e4412f82906fba92dd4a165bac5fe6866a2a26383fe3b8" "pypy" verify_py27 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-2.5.0-linux-armel" "https://downloads.python.org/pypy/pypy-2.5.0-linux-armel.tar.bz2#277fa6c61d63af96893dafd19e1ffea7b988397c6a0fd66cd99dc0db1029be56" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy-2.5.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-2.5.0-linux-armhf-raspbian.tar.bz2#6c975e39f0e7d57176b49a987a08862a3cbd9aeb52f47eb4ab148ea334e747fd" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy-2.5.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-2.5.0-linux-armhf-raring.tar.bz2#1866bf2b8a8144c68d64f2ba982c6c545849913167b4602b762716332ec1fa0b" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy-2.5.0-linux64" "https://downloads.python.org/pypy/pypy-2.5.0-linux64.tar.bz2#7764fb6b662407f8709eaa334c542aac9cb6bfe3291ac198dad0980ca129f3c2" "pypy" verify_py27 ensurepip + else + install_package "pypy-2.5-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-2.5-linux_x86_64-portable.tar.bz2#26c5a0964b32b09be0282766c27937c843a12b6820ff2d440c6d47a6092837e0" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + install_package "pypy-2.5.0-osx64" "https://downloads.python.org/pypy/pypy-2.5.0-osx64.tar.bz2#30b392b969b54cde281b07f5c10865a7f2e11a229c46b8af384ca1d3fe8d4e6e" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy-2.5.0-win32" "https://downloads.python.org/pypy/pypy-2.5.0-win32.zip#692391434cf14016d74c6b8bda8f93135ef026f48c8327f3195bfa24d314317d" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy-2.5.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-2.5.0-src b/plugins/python-build/share/python-build/pypy-2.5.0-src new file mode 100644 index 0000000..6e5bfcc --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.5.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy-pypy-10f1b29a2bd2" "https://downloads.python.org/pypy/pypy-2.5.0-src.tar.bz2#8ff1e131d8fefd79032dd81bcf3fde927e152d3acde5105356f6ffc1aad33f81" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy-2.5.1 b/plugins/python-build/share/python-build/pypy-2.5.1 new file mode 100644 index 0000000..19326da --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.5.1 @@ -0,0 +1,44 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then + install_package "pypy-2.5.1-linux" "https://downloads.python.org/pypy/pypy-2.5.1-linux.tar.bz2#c0035a2650cafcb384050a8c476ddc41c9fd40b0c3677fab68026f57c715907a" "pypy" verify_py27 ensurepip + else + install_package "pypy-2.5.1-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-2.5.1-linux_i686-portable.tar.bz2#ed532ddde3332d10faa59af49854cacbca458c597889352e619a87ab22363063" "pypy" verify_py27 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-2.5.1-linux-armel" "https://downloads.python.org/pypy/pypy-2.5.1-linux-armel.tar.bz2#91d68551b6e738c1e47aaed869a6df8208abb8c60194a1647c6aa13c7363a61d" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy-2.5.1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-2.5.1-linux-armhf-raspbian.tar.bz2#2b730f86b56fcc72f5bfcfe6a38b5a6fe27654f73b2256e10297373af169a69e" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy-2.5.1-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-2.5.1-linux-armhf-raring.tar.bz2#0a5648c18cc604b0a8eaa559549cb332d18358fc551865e9b7ef051b796e4ec7" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy-2.5.1-linux64" "https://downloads.python.org/pypy/pypy-2.5.1-linux64.tar.bz2#68e0955dbc80a0d51dfa9a8a76d8623f34920ece1bcbc6d910c2be019a653ba8" "pypy" verify_py27 ensurepip + else + install_package "pypy-2.5.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-2.5.1-linux_x86_64-portable.tar.bz2#157bee6349878cf0ef575b0d7bfd6cbb837c00e83b2872c924580ef7bc32c0d7" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + install_package "pypy-2.5.1-osx64" "https://downloads.python.org/pypy/pypy-2.5.1-osx64.tar.bz2#db40dc8b5e95ef9c3322bd9897099e91555ef34188cf1c3852a92b081142d183" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy-2.5.1-win32" "https://downloads.python.org/pypy/pypy-2.5.1-win32.zip#0dbf90c30e848a91611bea99968a215244db02cf5f649114f10269cf1a15d607" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy-2.5.1-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-2.5.1-src b/plugins/python-build/share/python-build/pypy-2.5.1-src new file mode 100644 index 0000000..88f2c75 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.5.1-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy-2.5.1-src" "https://downloads.python.org/pypy/pypy-2.5.1-src.tar.bz2#ddb3a580b1ee99c5a699172d74be91c36dda9a38946d4731d8c6a63120a3ba2a" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy-2.6.0 b/plugins/python-build/share/python-build/pypy-2.6.0 new file mode 100644 index 0000000..b1e6b4f --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.6.0 @@ -0,0 +1,44 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then + install_package "pypy-2.6.0-linux" "https://downloads.python.org/pypy/pypy-2.6.0-linux.tar.bz2#6e0b052c40a59bf5a85ee239980bbcab8b031b4c2bc33b99efe1b072977d9910" "pypy" verify_py27 ensurepip + else + install_package "pypy-2.6-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-2.6-linux_i686-portable.tar.bz2#e01db0984f7fecd80dadfb1d5f65118e596e3984d12643b4d552e83f92bff549" "pypy" verify_py27 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-2.6.0-linux-armel" "https://downloads.python.org/pypy/pypy-2.6.0-linux-armel.tar.bz2#9d0cb9b15283f9c15f83c05293f8bd41d302c96090fd89b778f359df9bc8e619" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy-2.6.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-2.6.0-linux-armhf-raspbian.tar.bz2#e9f6a16c3e21f38bd571adb33757649ceef3f2ebfdd6d37eea923ce26ea6728c" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy-2.6.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-2.6.0-linux-armhf-raring.tar.bz2#ccb37a6d861b6dd69cd038337664885dcf91852a2ab6aef480dd7cfbda8de502" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy-2.6.0-linux64" "https://downloads.python.org/pypy/pypy-2.6.0-linux64.tar.bz2#f5d2b0e3594cec57e32d3e43a951041ec330e1e962a836be470d591633e51388" "pypy" verify_py27 ensurepip + else + install_package "pypy-2.6-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-2.6-linux_x86_64-portable.tar.bz2#97284b66476c5d1b17a62f5017569a0073730928e19f95b49d78d6bc60b69495" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + install_package "pypy-2.6.0-osx64" "https://downloads.python.org/pypy/pypy-2.6.0-osx64.tar.bz2#77f1d056484e40e0a8e2e2b2b489eedfe785605ef36b144ffce05f7b748f6acd" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy-2.6.0-win32" "https://downloads.python.org/pypy/pypy-2.6.0-win32.zip#de907e7fef7b9b6ceccfc8aa5f4781ee3bc4a49b119d4b22ab5e25eab21c6e8d" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy-2.6.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-2.6.0-src b/plugins/python-build/share/python-build/pypy-2.6.0-src new file mode 100644 index 0000000..1ebe1d9 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.6.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy-2.6.0-src" "https://downloads.python.org/pypy/pypy-2.6.0-src.tar.bz2#9bf353f22d25e97a85a6d3766619966055edea1ea1b2218445d683a8ad0399d9" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy-2.6.1 b/plugins/python-build/share/python-build/pypy-2.6.1 new file mode 100644 index 0000000..30d4444 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.6.1 @@ -0,0 +1,47 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"freebsd64" ) + install_package "pypy-2.6.1-freebsd64" "https://downloads.python.org/pypy/pypy-2.6.1-freebsd64.tar.bz2#58118e88ce01c1d48b31d293db40687efbdeba54334eb55ba96de9ecf3c39055" "pypy" verify_py27 ensurepip + ;; +"linux" ) + if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then + install_package "pypy-2.6.1-linux" "https://downloads.python.org/pypy/pypy-2.6.1-linux.tar.bz2#d010b1f1aafdb01beb107f16843985508ce81698260ce830690686d9b2768c88" "pypy" verify_py27 ensurepip + else + install_package "pypy-2.6.1-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-2.6.1-linux_i686-portable.tar.bz2#af8f05790fe21bffdb0619d39f2890e2ecabe47bbd3b21c2c97b9778e4cdb378" "pypy" verify_py27 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-2.6.1-linux-armel" "https://downloads.python.org/pypy/pypy-2.6.1-linux-armel.tar.bz2#0ca15d289e78a82f927b375a016b7c3246accac5d7eebded4e32a496fb3245ab" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy-2.6.1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-2.6.1-linux-armhf-raspbian.tar.bz2#13d983805ebc6d9a3627dea3c34898375a4e4e7b6f0171cfbde463c1c04a92aa" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy-2.6.1-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-2.6.1-linux-armhf-raring.tar.bz2#4caa7c1922a212cca4690bfa181cd368760a23b50163b3cbbd6d28401dd5cef5" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy-2.6.1-linux64" "https://downloads.python.org/pypy/pypy-2.6.1-linux64.tar.bz2#78a48490d1b2dba8571156c2bf822324ca7dae6f6a56a4bbb96d3e8e8885367b" "pypy" verify_py27 ensurepip + else + install_package "pypy-2.6.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-2.6.1-linux_x86_64-portable.tar.bz2#ed6a35dee4c982123af716e62975039e18920b599afc4f6a2f3c7c89d0403389" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + install_package "pypy-2.6.1-osx64" "https://downloads.python.org/pypy/pypy-2.6.1-osx64.tar.bz2#4a78ef76ec38a49a9de40225c337e89486fa09938c600df2bd2dd60110066f65" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy-2.6.1-win32" "https://downloads.python.org/pypy/pypy-2.6.1-win32.zip#ccea3940fdedc03e2fcb5acf6badfe6d9c1ae876d5faf0a004e1d94edd7fd856" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy-2.6.1-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-2.6.1-src b/plugins/python-build/share/python-build/pypy-2.6.1-src new file mode 100644 index 0000000..b1482d5 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-2.6.1-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy-2.6.1-src" "https://downloads.python.org/pypy/pypy-2.6.1-src.tar.bz2#7fddd414c9348c2f899f79ad86adc3fc2b19443855b5243f58487e1f0ac46560" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy-4.0.0 b/plugins/python-build/share/python-build/pypy-4.0.0 new file mode 100644 index 0000000..46ee1cd --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-4.0.0 @@ -0,0 +1,52 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then + install_package "pypy-4.0.0-linux" "https://downloads.python.org/pypy/pypy-4.0.0-linux.tar.bz2#365600947775bc73a902a5b1d11f8b96cf49f07cdbbab28bb47240097b4bb4c5" "pypy" verify_py27 ensurepip + else + install_package "pypy-4.0-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-4.0-linux_i686-portable.tar.bz2#8d6b775a1fdc79db453f80e6b50cd9979d89be3714cd71d3af21bf9f56745610" "pypy" verify_py27 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-4.0.0-linux-armel" "https://downloads.python.org/pypy/pypy-4.0.0-linux-armel.tar.bz2#612df41fa21c5bc95d8d3575e0d8c09f605de6f0684109222afa561672dd9c7b" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy-4.0.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-4.0.0-linux-armhf-raspbian.tar.bz2#fccd9d8436781cbeb8c94e2b37e590303c52e63bc50ed30c4a99a46f022c44bb" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy-4.0.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-4.0.0-linux-armhf-raring.tar.bz2#9586d9accdb8faa488a313132047e0dad73c8facc222201380d4935a2ba429b8" "pypy" verify_py27 ensurepip + fi + ;; +"linux-ppc64" ) + require_distro "Fedora 20" || true + install_package "pypy-4.0.0-ppc64" "https://downloads.python.org/pypy/pypy-4.0.0-ppc64.tar.bz2#729eab7fa84289a094d69fe1607ef97c8e7acc08588db5cd410c9dd26bdd4110" "pypy" verify_py27 ensurepip + ;; +"linux-ppc64le" ) + require_distro "Fedora 21" || true + install_package "pypy-4.0.0-ppc64le" "https://downloads.python.org/pypy/pypy-4.0.0-ppc64le.tar.bz2#0ba3c313afb48cba2798c9b46e9a27e24a597f90e092b649b6ac9cd8af4f7765" "pypy" verify_py27 ensurepip + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy-4.0.0-linux64" "https://downloads.python.org/pypy/pypy-4.0.0-linux64.tar.bz2#30365cf4fa6cd8e9ff44126f06dcaebefda35c2543ddcf9b9e8516c29cabe726" "pypy" verify_py27 ensurepip + else + install_package "pypy-4.0-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-4.0-linux_x86_64-portable.tar.bz2#61fb04eaa823763b8de777e16edc02b09116985586f53c14c6e85d531072a38f" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + install_package "pypy-4.0.0-osx64" "https://downloads.python.org/pypy/pypy-4.0.0-osx64.tar.bz2#d9e590fe5b9461bbdff56c76636e844ef90a297f82d0d2e204866c8a21759a50" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy-4.0.0-win32" "https://downloads.python.org/pypy/pypy-4.0.0-win32.zip#86493202261c62ba5b4b8840b1d0005bc9bf46af4f46d3b9a54ddbe8335da568" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy-4.0.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-4.0.0-src b/plugins/python-build/share/python-build/pypy-4.0.0-src new file mode 100644 index 0000000..451f0b5 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-4.0.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy-4.0.0-src" "https://downloads.python.org/pypy/pypy-4.0.0-src.tar.bz2#acff480e44ce92acd057f2e786775af36dc3c2cd12e9efc60a1ac6a562ad7b4d" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy-4.0.1 b/plugins/python-build/share/python-build/pypy-4.0.1 new file mode 100644 index 0000000..c2b70d9 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-4.0.1 @@ -0,0 +1,52 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then + install_package "pypy-4.0.1-linux" "https://downloads.python.org/pypy/pypy-4.0.1-linux.tar.bz2#721920fcbb6aefc9a98e868e32b7f4ea5fd68b7f9305d08d0a2595327c9c0611" "pypy" verify_py27 ensurepip + else + install_package "pypy-4.0.1-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-4.0.1-linux_i686-portable.tar.bz2#2a1078bf36372b1c2919c11c418860dd7f0d44c92e6772bb36490eaf793b5c47" "pypy" verify_py27 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-4.0.1-linux-armel" "https://downloads.python.org/pypy/pypy-4.0.1-linux-armel.tar.bz2#d1acdd45ebd34580dd632c63c95211f6bae5e9a8f7a46ffa6f0443286ff9f61b" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy-4.0.1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-4.0.1-linux-armhf-raspbian.tar.bz2#52eef495f560af59a787b9935367cb5f8c83b48e32a80ec3e7060bffac011ecc" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy-4.0.1-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-4.0.1-linux-armhf-raring.tar.bz2#e67278ce7423aa7bf99a95fd271cb76763eae3106930f4b7de1fba6a70a3f383" "pypy" verify_py27 ensurepip + fi + ;; +"linux-ppc64" ) + require_distro "Fedora 20" || true + install_package "pypy-4.0.1-ppc64" "https://downloads.python.org/pypy/pypy-4.0.1-ppc64.tar.bz2" "pypy" verify_py27 ensurepip + ;; +"linux-ppc64le" ) + require_distro "Fedora 21" || true + install_package "pypy-4.0.1-ppc64le" "https://downloads.python.org/pypy/pypy-4.0.1-ppc64le.tar.bz2" "pypy" verify_py27 ensurepip + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy-4.0.1-linux64" "https://downloads.python.org/pypy/pypy-4.0.1-linux64.tar.bz2#0d6090cee59f4b9bab91ddbea76580d0c232b78dae65aaa9e8fa8d4449ba25b4" "pypy" verify_py27 ensurepip + else + install_package "pypy-4.0.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-4.0.1-linux_x86_64-portable.tar.bz2#b3803f6dd9bbb964f7d322aa4aeb93191ff0ebe573428c1d2014ea26da49ff53" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + install_package "pypy-4.0.1-osx64" "https://downloads.python.org/pypy/pypy-4.0.1-osx64.tar.bz2#06be1299691f7ea558bf8e3bdf3d20debb8ba03cd7cadf04f2d6cbd5fd084430" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy-4.0.1-win32" "https://downloads.python.org/pypy/pypy-4.0.1-win32.zip#9a350a5e6f9b86fb525c6f1300b0c97c021ea8b1e37bfd32a8c4bb7a415d5329" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy-4.0.1-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-4.0.1-src b/plugins/python-build/share/python-build/pypy-4.0.1-src new file mode 100644 index 0000000..76aa78c --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-4.0.1-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy-4.0.1-src" "https://downloads.python.org/pypy/pypy-4.0.1-src.tar.bz2#29f5aa6ba17b34fd980e85172dfeb4086fdc373ad392b1feff2677d2d8aea23c" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy-5.0.0 b/plugins/python-build/share/python-build/pypy-5.0.0 new file mode 100644 index 0000000..f65f2cd --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-5.0.0 @@ -0,0 +1,52 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then + install_package "pypy-5.0.0-linux" "https://downloads.python.org/pypy/pypy-5.0.0-linux.tar.bz2#a9cc9afa94ff1cde811626a70081c477c9840e7816c0562d1903fd823d222ceb" "pypy" verify_py27 ensurepip + else + install_package "pypy-5.0-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.0-linux_i686-portable.tar.bz2#316e03afdd2f6212857789933c01f0d41a1665c80d28526c0fb4082b6d3f4f60" "pypy" verify_py27 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-5.0.0-linux-armel" "https://downloads.python.org/pypy/pypy-5.0.0-linux-armel.tar.bz2#87bd85441b16ecca0d45ba6e9c0e9d26bb7bd8867afbf79d80312cf79b032dc1" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy-5.0.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-5.0.0-linux-armhf-raspbian.tar.bz2#8033c0cc39e9f6771688f2eda95c726595f5453b3e73e1cd5f7ebbe3dae1f685" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy-5.0.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-5.0.0-linux-armhf-raring.tar.bz2#5bb52cf5db4ae8497c4e03cd8a70e49867e6b93d9f29ad335d030fcd3a375769" "pypy" verify_py27 ensurepip + fi + ;; +"linux-ppc64" ) + require_distro "Fedora 20" || true + install_package "pypy-5.0.0-ppc64" "https://downloads.python.org/pypy/pypy-5.0.0-ppc64.tar.bz2#334a37e68cb543cf2cbcdd12379b9b770064bb70ba7fd104f1e451cfa10cdda5" "pypy" verify_py27 ensurepip + ;; +"linux-ppc64le" ) + require_distro "Fedora 21" || true + install_package "pypy-5.0.0-ppc64le" "https://downloads.python.org/pypy/pypy-5.0.0-ppc64le.tar.bz2#e72fe5c094186f79c997000ddbaa01616def652a8d1338b75a27dfa3755eb86c" "pypy" verify_py27 ensurepip + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy-5.0.0-linux64" "https://downloads.python.org/pypy/pypy-5.0.0-linux64.tar.bz2#b9c73be8e3c3b0835df83bdb86335712005240071cdd4dc245ac30b457063ae0" "pypy" verify_py27 ensurepip + else + install_package "pypy-5.0-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.0-linux_x86_64-portable.tar.bz2#57c9ea251bf1e7074e14aeecdd1ac8bb2fc53dbf3f90a9613d03e33076a7fa08" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + install_package "pypy-5.0.0-osx64" "https://downloads.python.org/pypy/pypy-5.0.0-osx64.tar.bz2#45ed8bf799d0fd8eb051cbcc427173fba74dc9c2f6c309d7a3cc90f4917e6a10" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy-5.0.0-win32" "https://downloads.python.org/pypy/pypy-5.0.0-win32.zip#c53f0946703f5e4885484c7cde2554a0320537135bf8965e054757c214412438" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy-5.0.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-5.0.0-src b/plugins/python-build/share/python-build/pypy-5.0.0-src new file mode 100644 index 0000000..e8d3b11 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-5.0.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy-5.0.0-src" "https://downloads.python.org/pypy/pypy-5.0.0-src.tar.bz2#89027b1b33553b53ff7733dc4838f0a76af23552c0d915d9f6de5875b8d7d4ab" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy-5.0.1 b/plugins/python-build/share/python-build/pypy-5.0.1 new file mode 100644 index 0000000..da95819 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-5.0.1 @@ -0,0 +1,44 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then + install_package "pypy-5.0.1-linux" "https://downloads.python.org/pypy/pypy-5.0.1-linux.tar.bz2#4b9a294033f917a1674c9ddcb2e7e8d32c4f4351f8216fd1fe23f6d2ad2b1a36" "pypy" verify_py27 ensurepip + else + install_package "pypy-5.0.1-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.0.1-linux_i686-portable.tar.bz2#96f1b487655c914a03f56747dfff9c20350175cae01e2911f19b1016442ed6b5" "pypy" verify_py27 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-5.0.1-linux-armel" "https://downloads.python.org/pypy/pypy-5.0.1-linux-armel.tar.bz2#17d55804b2253acd9de42276d756d4a08b7d1d2da09ef81dd325e14b18a1bcda" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy-5.0.1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-5.0.1-linux-armhf-raspbian.tar.bz2#338d1c32c1326e6321b222ae357711b38c4a0ffddf020c2a35536b5f69376e28" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy-5.0.1-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-5.0.1-linux-armhf-raring.tar.bz2#1e9146978cc7e7bd30683a518f304a824db7b9b1c6fae5e866eb703684ba3c98" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy-5.0.1-linux64" "https://downloads.python.org/pypy/pypy-5.0.1-linux64.tar.bz2#1b1363a48edd1c1b31ca5e995987eda3d460a3404f36c3bb2dd9f52c93eecff5" "pypy" verify_py27 ensurepip + else + install_package "pypy-5.0.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.0.1-linux_x86_64-portable.tar.bz2#14d65f84fe8228cfa2b8e924364cf4c71e2bc6b13649098fa340baf044606436" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + install_package "pypy-5.0.1-osx64" "https://downloads.python.org/pypy/pypy-5.0.1-osx64.tar.bz2#6ebdb9d91203f053b38e3c21841c11a72f416dc185f7b3b7c908229df15e924a" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy-5.0.1-win32" "https://downloads.python.org/pypy/pypy-5.0.1-win32.zip#c12254d8b1747322736d26e014744a426c6900d232c1799140fbb43f44319730" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy-5.0.1-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-5.0.1-src b/plugins/python-build/share/python-build/pypy-5.0.1-src new file mode 100644 index 0000000..070add6 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-5.0.1-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy-5.0.1-src" "https://downloads.python.org/pypy/pypy-5.0.1-src.tar.bz2#1573c9284d3ec236c8e6ef3b954753932dff29462c54b5885b761d1ee68b6e05" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy-5.1 b/plugins/python-build/share/python-build/pypy-5.1 new file mode 100644 index 0000000..0a12477 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-5.1 @@ -0,0 +1,52 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy-5.1.0-linux" "https://downloads.python.org/pypy/pypy-5.1.0-linux.tar.bz2#2f6c521b5b3c1082eab58be78655aa01ec400d19baeec93c455864a7483b8744" "pypy" verify_py27 ensurepip + else + install_package "pypy-5.1-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.1-linux_i686-portable.tar.bz2#893507603a58b8983b69924e60591de39b8f71f70ba36d6e3894db8f7c49c3ea" "pypy" verify_py27 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-5.1.0-linux-armel" "https://downloads.python.org/pypy/pypy-5.1.0-linux-armel.tar.bz2#ea7017449ff0630431866423220c3688fc55c1a0b80a96af0ae138dd0751b81c" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy-5.1.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-5.1.0-linux-armhf-raspbian.tar.bz2#3bfcd251b4f3fd1a09520b2741c647c364d16d50c82b813732a78ac60ccb2b69" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy-5.1.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-5.1.0-linux-armhf-raring.tar.bz2#a3e13083591bccc301fb974ff0a6c7e4ab4e611e4b31c0932898b981c794462b" "pypy" verify_py27 ensurepip + fi + ;; +"linux-ppc64" ) + require_distro "Fedora 20" || true + install_package "pypy-5.1.0-ppc64" "https://downloads.python.org/pypy/pypy-5.1.0-ppc64.tar.bz2#32a31b9ff5174d69f8cf8db711ba2a593fed49b52bdf590bcecd6b727419b6df" "pypy" verify_py27 ensurepip + ;; +"linux-ppc64le" ) + require_distro "Fedora 21" || true + install_package "pypy-5.1.0-ppc64le" "https://downloads.python.org/pypy/pypy-5.1.0-ppc64le.tar.bz2#303764f44154f81d7f0753258c89f8a14653658911a16ec2bcfee04055cbfab6" "pypy" verify_py27 ensurepip + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy-5.1.0-linux64" "https://downloads.python.org/pypy/pypy-5.1.0-linux64.tar.bz2#0e8913351d043a50740b98cb89d99852b8bd6d11225a41c8abfc0baf7084cbf6" "pypy" verify_py27 ensurepip + else + install_package "pypy-5.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.1-linux_x86_64-portable.tar.bz2#b2df9b0127457d1c3cc0dc9b8f027a53569ccd3ba5a79012d641e576d9cc003a" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + install_package "pypy-5.1.0-osx64" "https://downloads.python.org/pypy/pypy-5.1.0-osx64.tar.bz2#7e270c66347158dd794c101c4817f742f760ed805aa0d10abe19ba4a78a75118" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy-5.1.0-win32" "https://downloads.python.org/pypy/pypy-5.1.0-win32.zip#044e7f35223a443412b5948740e60e93069a6f8b0a72053cc9d472874bb1b6cc" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy-5.1.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-5.1-src b/plugins/python-build/share/python-build/pypy-5.1-src new file mode 100644 index 0000000..a401980 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-5.1-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy-5.1.0-src" "https://downloads.python.org/pypy/pypy-5.1.0-src.tar.bz2#16bab9501e942c0704abbf9cd6c4e950c6a76dc226cf1e447ea084916aef4714" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy-5.1.1 b/plugins/python-build/share/python-build/pypy-5.1.1 new file mode 100644 index 0000000..d84028d --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-5.1.1 @@ -0,0 +1,44 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy-5.1.1-linux" "https://downloads.python.org/pypy/pypy-5.1.1-linux.tar.bz2#7951fd2b87c9e621ec57c932c20da2b8a4a9e87d8daeb9e2b7373f9444219abc" "pypy" verify_py27 ensurepip + else + install_package "pypy-5.1.1-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.1.1-linux_i686-portable.tar.bz2#f00faf426f41f9980344d03fd74bb949875c0cf86048ad762dd445f72353eb8f" "pypy" verify_py27 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy-5.1.1-linux-armel" "https://downloads.python.org/pypy/pypy-5.1.1-linux-armel.tar.bz2#062b33641c24dfc8c6b5af955c2ddf3815b471de0af4bfc343020651b94d13bf" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy-5.1.1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy-5.1.1-linux-armhf-raspbian.tar.bz2#fc2a1f8719a7eca5d85d0bdcf499c6ab7409fc32aa312435bcbe66950b47e863" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy-5.1.1-linux-armhf-raring" "https://downloads.python.org/pypy/pypy-5.1.1-linux-armhf-raring.tar.bz2#c4bcdabccd15669ea44d1c715cd36b2ca55b340a27b63e1a92ef5ab6eb158a8d" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy-5.1.1-linux64" "https://downloads.python.org/pypy/pypy-5.1.1-linux64.tar.bz2#c852622e8bc81618c137da35fcf57b2349b956c07b6fd853300846e3cefa64fc" "pypy" verify_py27 ensurepip + else + install_package "pypy-5.1.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.1.1-linux_x86_64-portable.tar.bz2#c0502d8db1cc2b81513cc6047813669b0a561cb20e41d60e179f51fe8657a794" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + install_package "pypy-5.1.1-osx64" "https://downloads.python.org/pypy/pypy-5.1.1-osx64.tar.bz2#fe2bbb7cf95eb91b1724029f81e85d1dbb6025a2e9a005cfe7258fe07602f771" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy-5.1.1-win32" "https://downloads.python.org/pypy/pypy-5.1.1-win32.zip#22a780e328ef053e098f2edc2302957ac3119adf7bf11ff23e225931806e7bcd" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy-5.1.1-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-5.1.1-src b/plugins/python-build/share/python-build/pypy-5.1.1-src new file mode 100644 index 0000000..a8aed02 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-5.1.1-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy-5.1.1-src" "https://downloads.python.org/pypy/pypy-5.1.1-src.tar.bz2#ca3d943d7fbd78bb957ee9e5833ada4bb8506ac99a41b7628790e286a65ed2be" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy-5.3 b/plugins/python-build/share/python-build/pypy-5.3 new file mode 100644 index 0000000..5e09899 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-5.3 @@ -0,0 +1 @@ +source "${BASH_SOURCE%/*}/pypy2-5.3" diff --git a/plugins/python-build/share/python-build/pypy-5.3-src b/plugins/python-build/share/python-build/pypy-5.3-src new file mode 100644 index 0000000..0dd878b --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-5.3-src @@ -0,0 +1 @@ +source "${BASH_SOURCE%/*}/pypy2-5.3-src" diff --git a/plugins/python-build/share/python-build/pypy-5.3.1 b/plugins/python-build/share/python-build/pypy-5.3.1 new file mode 100644 index 0000000..1039292 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-5.3.1 @@ -0,0 +1 @@ +source "${BASH_SOURCE%/*}/pypy2-5.3.1" diff --git a/plugins/python-build/share/python-build/pypy-5.3.1-src b/plugins/python-build/share/python-build/pypy-5.3.1-src new file mode 100644 index 0000000..f2e7ebc --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-5.3.1-src @@ -0,0 +1 @@ +source "${BASH_SOURCE%/*}/pypy2-5.3.1-src" diff --git a/plugins/python-build/share/python-build/pypy-5.4 b/plugins/python-build/share/python-build/pypy-5.4 new file mode 100644 index 0000000..2e2bc9e --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-5.4 @@ -0,0 +1 @@ +source "${BASH_SOURCE%/*}/pypy2-5.4" diff --git a/plugins/python-build/share/python-build/pypy-5.4-src b/plugins/python-build/share/python-build/pypy-5.4-src new file mode 100644 index 0000000..8a7f781 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-5.4-src @@ -0,0 +1 @@ +source "${BASH_SOURCE%/*}/pypy2-5.4-src" diff --git a/plugins/python-build/share/python-build/pypy-5.4.1 b/plugins/python-build/share/python-build/pypy-5.4.1 new file mode 100644 index 0000000..984b558 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-5.4.1 @@ -0,0 +1 @@ +source "${BASH_SOURCE%/*}/pypy2-5.4.1" diff --git a/plugins/python-build/share/python-build/pypy-5.4.1-src b/plugins/python-build/share/python-build/pypy-5.4.1-src new file mode 100644 index 0000000..4752268 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-5.4.1-src @@ -0,0 +1 @@ +source "${BASH_SOURCE%/*}/pypy2-5.4.1-src" diff --git a/plugins/python-build/share/python-build/pypy-5.6.0 b/plugins/python-build/share/python-build/pypy-5.6.0 new file mode 100644 index 0000000..45ed94c --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-5.6.0 @@ -0,0 +1 @@ +source "${BASH_SOURCE%/*}/pypy2-5.6.0" diff --git a/plugins/python-build/share/python-build/pypy-5.6.0-src b/plugins/python-build/share/python-build/pypy-5.6.0-src new file mode 100644 index 0000000..bc93237 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-5.6.0-src @@ -0,0 +1 @@ +source "${BASH_SOURCE%/*}/pypy2-5.6.0-src" diff --git a/plugins/python-build/share/python-build/pypy-5.7.0 b/plugins/python-build/share/python-build/pypy-5.7.0 new file mode 100644 index 0000000..b4b8304 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-5.7.0 @@ -0,0 +1 @@ +source "${BASH_SOURCE%/*}/pypy2-5.7.0" diff --git a/plugins/python-build/share/python-build/pypy-5.7.0-src b/plugins/python-build/share/python-build/pypy-5.7.0-src new file mode 100644 index 0000000..ab8791e --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-5.7.0-src @@ -0,0 +1 @@ +source "${BASH_SOURCE%/*}/pypy2-5.7.0-src" diff --git a/plugins/python-build/share/python-build/pypy-5.7.1 b/plugins/python-build/share/python-build/pypy-5.7.1 new file mode 100644 index 0000000..2fbd9c8 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-5.7.1 @@ -0,0 +1 @@ +source "${BASH_SOURCE%/*}/pypy2-5.7.1" diff --git a/plugins/python-build/share/python-build/pypy-5.7.1-src b/plugins/python-build/share/python-build/pypy-5.7.1-src new file mode 100644 index 0000000..df8712f --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-5.7.1-src @@ -0,0 +1 @@ +source "${BASH_SOURCE%/*}/pypy2-5.7.2-src" diff --git a/plugins/python-build/share/python-build/pypy-c-jit-latest b/plugins/python-build/share/python-build/pypy-c-jit-latest new file mode 100644 index 0000000..1f8ebf1 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-c-jit-latest @@ -0,0 +1,37 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_nightly_package "pypy-c-jit-latest-linux" "http://buildbot.pypy.org/nightly/trunk/pypy-c-jit-latest-linux.tar.bz2" "pypy-c-jit-*-linux" "pypy" verify_py27 ensurepip + ;; +"linux-armel" ) + install_nightly_package "pypy-c-jit-latest-linux-armel" "http://buildbot.pypy.org/nightly/trunk/pypy-c-jit-latest-linux-armel.tar.bz2" "pypy-c-jit-*-linux-armel" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_nightly_package "pypy-c-jit-latest-linux-armhf-raspbian" "http://buildbot.pypy.org/nightly/trunk/pypy-c-jit-latest-linux-armhf-raspbian.tar.bz2" "pypy-c-jit-*-linux-armhf-raspbian" "pypy" verify_py27 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + fi + ;; +"linux64" ) + install_nightly_package "pypy-c-jit-latest-linux64" "http://buildbot.pypy.org/nightly/trunk/pypy-c-jit-latest-linux64.tar.bz2" "pypy-c-jit-*-linux64" "pypy" verify_py27 ensurepip + ;; +"osx64" ) + install_nightly_package "pypy-c-jit-latest-osx64" "http://buildbot.pypy.org/nightly/trunk/pypy-c-jit-latest-osx64.tar.bz2" "pypy-c-jit-*-osx64" "pypy" verify_py27 ensurepip + ;; +"win32" ) + install_zip "pypy-c-jit-latest-win32" "http://buildbot.pypy.org/nightly/trunk/pypy-c-jit-latest-win32.zip" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-dev b/plugins/python-build/share/python-build/pypy-dev new file mode 100644 index 0000000..02960d3 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-dev @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_hg "pypy-dev" "https://foss.heptapod.net/pypy/pypy" "default" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy-stm-2.3 b/plugins/python-build/share/python-build/pypy-stm-2.3 new file mode 100644 index 0000000..da7efdc --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-stm-2.3 @@ -0,0 +1,14 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux64" ) + require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" || true + install_package "pypy-stm-2.3-linux64" "https://downloads.python.org/pypy/pypy-stm-2.3-linux64.tar.bz2#2a489280c679503442219782a87a2d16504a1467cac85ad4be1361a21d1f4d54" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy-STM is not available for $(pypy_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy-stm-2.5.1 b/plugins/python-build/share/python-build/pypy-stm-2.5.1 new file mode 100644 index 0000000..cdcc704 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy-stm-2.5.1 @@ -0,0 +1,14 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux64" ) + require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" || true + install_package "pypy-stm-2.5.1-linux64" "https://downloads.python.org/pypy/pypy-stm-2.5.1-linux64.tar.bz2#f280788002f2acf8690b8f9c479bb5b6f0e699ebb42f8bf203da3f70f1a38134" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy-STM is not available for $(pypy_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy2-5.3 b/plugins/python-build/share/python-build/pypy2-5.3 new file mode 100644 index 0000000..3185aa1 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2-5.3 @@ -0,0 +1,56 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy2-v5.3.0-linux" "https://downloads.python.org/pypy/pypy2-v5.3.0-linux32.tar.bz2#bd422fe9d0b7d525d1da3f32855b047bc39ba397d0cf708d8f4f96fe874424f2" "pypy" verify_py27 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy2-5.3-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy2-v5.3.0-linux-armel" "https://downloads.python.org/pypy/pypy2-v5.3.0-linux-armel.tar.bz2#81b6f589a947d7353bb69408c46d4833d6e9cb501f3c3f0c73bd28d0e3df69aa" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy2-v5.3.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy2-v5.3.0-linux-armhf-raspbian.tar.bz2#87b3566b6bbb8bf31c2f0d72bf31d95142fdce004d987812336a59d788005bed" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy2-v5.3.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy2-v5.3.0-linux-armhf-raring.tar.bz2#bdb911a87e773a292334061b9c33b907f46d987e403fe94cc627a3b9b1c9cb19" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy2-v5.3.0-linux64" "https://downloads.python.org/pypy/pypy2-v5.3.0-linux64.tar.bz2#ac336e8877ed676bf87a9a546d5926b6afc4679fa2d3fdf9f3ca56f28ec40588" "pypy" verify_py27 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy2-5.3-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"osx64" ) + install_package "pypy2-v5.3.0-osx64" "https://downloads.python.org/pypy/pypy2-v5.3.0-osx64.tar.bz2#1b103bacbdcdbbc490660ec0c7b3d99d1ff1cfc2f13cd403db21c27f03d36a1d" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy2-v5.3.0-win32" "https://downloads.python.org/pypy/pypy2-v5.3.0-win32.zip#32a9e5286fc344165f63b529a9f84e521e9368e717c583488115654676428a20" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy-5.3-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy2-5.3-src b/plugins/python-build/share/python-build/pypy2-5.3-src new file mode 100644 index 0000000..e5d6829 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2-5.3-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy2-v5.3.0-src" "https://downloads.python.org/pypy/pypy2-v5.3.0-src.tar.bz2#4142eb8f403810bc88a4911792bb5a502e152df95806e33e69050c828cd160d5" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy2-5.3.1 b/plugins/python-build/share/python-build/pypy2-5.3.1 new file mode 100644 index 0000000..01c4e10 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2-5.3.1 @@ -0,0 +1,44 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy2-v5.3.1-linux" "https://downloads.python.org/pypy/pypy2-v5.3.1-linux32.tar.bz2#da69f4280b288e524387103eaa3eb4d036965724c3e546da27135c15a77bd2eb" "pypy" verify_py27 ensurepip + else + install_package "pypy-5.3.1-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.3.1-linux_i686-portable.tar.bz2#4460dad6376406c221406676208abae989c126115b0f0b2e46c8b8a027bf978a" "pypy" verify_py27 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy2-v5.3.1-linux-armel" "https://downloads.python.org/pypy/pypy2-v5.3.1-linux-armel.tar.bz2#0425f2022c35ef7f0bb3d2b854c5bcbe500b1aba511a0d83581ba6c784913961" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy2-v5.3.1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy2-v5.3.1-linux-armhf-raspbian.tar.bz2#5c93eb3c54fbb2c7d7332f775a096671512e590565e6051196bbc5039c5033b5" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy2-v5.3.1-linux-armhf-raring" "https://downloads.python.org/pypy/pypy2-v5.3.1-linux-armhf-raring.tar.bz2#b4859496099bde4b17c1e56cc5749dcdcd25b4c68fde1d2ea426de84130e84cc" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy2-v5.3.1-linux64" "https://downloads.python.org/pypy/pypy2-v5.3.1-linux64.tar.bz2#6d0e8b14875b76b1e77f06a2ee3f1fb5015a645a951ba7a7586289344d4d9c22" "pypy" verify_py27 ensurepip + else + install_package "pypy-5.3.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.3.1-linux_x86_64-portable.tar.bz2#73014c3840609a62c0984b9c383652097f0a8c52fb74dd9de70d9df2a9a743ff" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + install_package "pypy2-v5.3.1-osx64" "https://downloads.python.org/pypy/pypy2-v5.3.1-osx64.tar.bz2#7a242d7373b4f18c7f5fe6c2fe6f15e2a405d9adf1f4f934c89b875e60ac5def" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy2-v5.3.1-win32" "https://downloads.python.org/pypy/pypy2-v5.3.1-win32.zip#d83477e2c5f032ebd8c7f47afce03dc8adbeb41a3c74f7db50d9de317dcf3a4a" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy2-5.3.1-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy2-5.3.1-src b/plugins/python-build/share/python-build/pypy2-5.3.1-src new file mode 100644 index 0000000..04ae2f0 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2-5.3.1-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy2-v5.3.1-src" "https://downloads.python.org/pypy/pypy2-v5.3.1-src.tar.bz2#31a52bab584abf3a0f0defd1bf9a29131dab08df43885e7eeddfc7dc9b71836e" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy2-5.4 b/plugins/python-build/share/python-build/pypy2-5.4 new file mode 100644 index 0000000..ae563e4 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2-5.4 @@ -0,0 +1,44 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy2-v5.4.0-linux" "https://downloads.python.org/pypy/pypy2-v5.4.0-linux32.tar.bz2#ce581270464b14cdecd13dedb9bd7bf98232f767ac4ac282229a405d8e807af1" "pypy" verify_py27 ensurepip + else + install_package "pypy-5.4-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.4-linux_i686-portable.tar.bz2#7d7d253f009bb2624f43db6b8caeeb73d29177c4166a643a581a231a099c8689" "pypy" verify_py27 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy2-v5.4.0-linux-armel" "https://downloads.python.org/pypy/pypy2-v5.4.0-linux-armel.tar.bz2#04509044f21bb41ee6d3fafcf637fc0c586c248d4cdae6ac3357606a7b660fdb" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy2-v5.4.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy2-v5.4.0-linux-armhf-raspbian.tar.bz2#839b08db89b7e20cb670b8cf02596e033ea0b76fb8336af7bedfbb04b6b502da" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy2-v5.4.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy2-v5.4.0-linux-armhf-raring.tar.bz2#95c690bcae6771ebce6cf06c7c2842e0662e007e35162afc963337aa597b471a" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy2-v5.4.0-linux64" "https://downloads.python.org/pypy/pypy2-v5.4.0-linux64.tar.bz2#bdfea513d59dcd580970cb6f79f3a250d00191fd46b68133d5327e924ca845f8" "pypy" verify_py27 ensurepip + else + install_package "pypy-5.4-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.4-linux_x86_64-portable.tar.bz2#0a48c7ba7163589b1ade9cfe184f422d1bc9a0f988321b2fdcbd924d90594d9a" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + install_package "pypy2-v5.4.0-osx64" "https://downloads.python.org/pypy/pypy2-v5.4.0-osx64.tar.bz2#3adf21c2bf3432759c99123f21240d71a72aba81d73129e48ef912c34631b723" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy2-v5.4.0-win32" "https://downloads.python.org/pypy/pypy2-v5.4.0-win32.zip#442c0a917781b6155bf78d2648f1ccd9a36c321926a043f83efcea22a99960b4" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy2-5.4-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy2-5.4-src b/plugins/python-build/share/python-build/pypy2-5.4-src new file mode 100644 index 0000000..a89eb6a --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2-5.4-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy2-v5.4.0-src" "https://downloads.python.org/pypy/pypy2-v5.4.0-src.tar.bz2#d9568ebe9a14d0eaefde887d78f3cba63d665e95c0d234bb583932341f55a655" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy2-5.4.1 b/plugins/python-build/share/python-build/pypy2-5.4.1 new file mode 100644 index 0000000..0c17c56 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2-5.4.1 @@ -0,0 +1,44 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy2-v5.4.1-linux32" "https://downloads.python.org/pypy/pypy2-v5.4.1-linux32.tar.bz2#6d1e2386ec1e05dffed493aa2d5e6db5cf5de18d7350d44b85f2e45aa5c9a774" "pypy" verify_py27 ensurepip + else + install_package "pypy-5.4.1-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.4.1-linux_i686-portable.tar.bz2#190e1df78886f0b2bd700f110b7d312d91cafc84886c5de3c5d55c10fe1a5e75" "pypy" verify_py27 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy2-v5.4.1-linux-armel" "https://downloads.python.org/pypy/pypy2-v5.4.1-linux-armel.tar.bz2#a1eb5f672aae62606176305e52a51b060ba974b6181ebefcd2c555ecf5f8614f" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy2-v5.4.1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy2-v5.4.1-linux-armhf-raspbian.tar.bz2#b38646519ee1a888c68f8f4713c122867b4b36693c8acabb38eb827a9d2d51f9" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy2-v5.4.1-linux-armhf-raring" "https://downloads.python.org/pypy/pypy2-v5.4.1-linux-armhf-raring.tar.bz2#2c4befc4517adec874155a8b6fa0b9d18388943d4ffe778002072db7783e417a" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy2-v5.4.1-linux64" "https://downloads.python.org/pypy/pypy2-v5.4.1-linux64.tar.bz2#9c85319778224d7fb0c348f55fe3fada15bb579c5f3870a13ad63b42a737dd72" "pypy" verify_py27 ensurepip + else + install_package "pypy-5.4.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.4.1-linux_x86_64-portable.tar.bz2#0b59f8e69c7883d454fce6364ab01a5ec6a481ed7f0cc0f1612c3b0c253f7da4" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + install_package "pypy2-v5.4.1-osx64" "https://downloads.python.org/pypy/pypy2-v5.4.1-osx64.tar.bz2#ae9329c8f0a6df431c6224c27c634f998688ac803e8d100cee9a774e6bba38b5" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy2-v5.4.1-win32" "https://downloads.python.org/pypy/pypy2-v5.4.1-win32.zip#ec729218a820bc2aa2cf1fcacf9de0fee9e04144fe138596198a6b4615505e03" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy2-5.4.1-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy2-5.4.1-src b/plugins/python-build/share/python-build/pypy2-5.4.1-src new file mode 100644 index 0000000..527c21a --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2-5.4.1-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy2-v5.4.1-src" "https://downloads.python.org/pypy/pypy2-v5.4.1-src.tar.bz2#45dbc50c81498f6f1067201b8fc887074b43b84ee32cc47f15e7db17571e9352" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy2-5.6.0 b/plugins/python-build/share/python-build/pypy2-5.6.0 new file mode 100644 index 0000000..6cc1e53 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2-5.6.0 @@ -0,0 +1,44 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy2-v5.6.0-linux32" "https://downloads.python.org/pypy/pypy2-v5.6.0-linux32.tar.bz2#5d4ad43aed5c5e147f7e7c84766c729f34f63b714b6d224e912a2bb42dc95d62" "pypy" verify_py27 ensurepip + else + install_package "pypy-5.6-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.6-linux_i686-portable.tar.bz2#1f220e05ddd4423882794f0e9d3e2dfdecee259d00f1151a52dd244607313399" "pypy" verify_py27 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy2-v5.6.0-linux-armel" "https://downloads.python.org/pypy/pypy2-v5.6.0-linux-armel.tar.bz2#2d1c7820f6368c92bb43a153d2c995f70aa183ff8f1df6916b0d2e57838d8a30" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy2-v5.6.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy2-v5.6.0-linux-armhf-raspbian.tar.bz2#0f69c40a38d72254bf12094620bda9d2face758f763cd0d989588642d81eccae" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy2-v5.6.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy2-v5.6.0-linux-armhf-raring.tar.bz2#2c430240cecb562102c677598f106aa57899f00cd37f719989e18ed9ca44bd01" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy2-v5.6.0-linux64" "https://downloads.python.org/pypy/pypy2-v5.6.0-linux64.tar.bz2#aad55328cb0673a60b2633dcc3c36cf452917ac906b577eb3aed5876a7666fca" "pypy" verify_py27 ensurepip + else + install_package "pypy-5.6-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.6-linux_x86_64-portable.tar.bz2#9bd220bc54000e142bd4929435959305efeef8c832fbe3c907211cc5214095ce" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + install_package "pypy2-v5.6.0-osx64" "https://downloads.python.org/pypy/pypy2-v5.6.0-osx64.tar.bz2#6121f791f440564d3a0a41315e9f2d2d61bc484654acffd85d9e1c6e92b85c36" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy2-v5.6.0-win32" "https://downloads.python.org/pypy/pypy2-v5.6.0-win32.zip#bab4fa37ef2d32660e291393d955a4e951d5e883abea8bee83be1ec044ddcaac" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy2-5.6.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy2-5.6.0-src b/plugins/python-build/share/python-build/pypy2-5.6.0-src new file mode 100644 index 0000000..21894f5 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2-5.6.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy2-v5.6.0-src" "https://downloads.python.org/pypy/pypy2-v5.6.0-src.tar.bz2#7411448045f77eb9e087afdce66fe7eafda1876c9e17aad88cf891f762b608b0" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy2-5.7.0 b/plugins/python-build/share/python-build/pypy2-5.7.0 new file mode 100644 index 0000000..19df20d --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2-5.7.0 @@ -0,0 +1,42 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy2-v5.7.0-linux32" "https://downloads.python.org/pypy/pypy2-v5.7.0-linux32.tar.bz2#aaa55085d11a49cb982b059b4159495d7a4fb9afcfda7bfd680cc0175e9fa33b" "pypy" verify_py27 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy2-v5.7.0-linux-armel" "https://downloads.python.org/pypy/pypy2-v5.7.0-linux-armel.tar.bz2#3bc0d2616cacef9f544e739d4c25a89e16d7aa8c1ccb18c32dceeb021ed73711" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy2-v5.7.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy2-v5.7.0-linux-armhf-raspbian.tar.bz2#6328e4767cf20d20a290739db2d1ec769f3c9c360fa9824f61581b3356add79b" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy2-v5.7.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy2-v5.7.0-linux-armhf-raring.tar.bz2#413df8097c87a8e79cc46df65837b1d533de83b7cb06ce88b168697807fff696" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy2-v5.7.0-linux64" "https://downloads.python.org/pypy/pypy2-v5.7.0-linux64.tar.bz2#64bed80e299b09c13296f577a0f52c5d4be9f7c699a390ca6026f967aeff3846" "pypy" verify_py27 ensurepip + else + install_package "pypy-5.7-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.7-linux_x86_64-portable.tar.bz2#209d2224fe461d85afb201a0c8da18df21219687defadd4550b60420a120bacb" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + install_package "pypy2-v5.7.0-osx64" "https://downloads.python.org/pypy/pypy2-v5.7.0-osx64.tar.bz2#9204aa1b55771a374a3118bb43e498c88caca8c33710eecf3249855c4dd1352a" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy2-v5.7.0-win32" "https://downloads.python.org/pypy/pypy2-v5.7.0-win32.zip#09c8da3a7e09cea821f9b300c6f4f52f4a571d949d91839ecbce93b84a08d570" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy2-5.7.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy2-5.7.0-src b/plugins/python-build/share/python-build/pypy2-5.7.0-src new file mode 100644 index 0000000..1674718 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2-5.7.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy2-v5.7.0-src" "https://downloads.python.org/pypy/pypy2-v5.7.0-src.tar.bz2#e522ea7ca51b16ee5505f22b86803664b762a263a6d69ba84c359fcf8365ad3e" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy2-5.7.1 b/plugins/python-build/share/python-build/pypy2-5.7.1 new file mode 100644 index 0000000..eb9bedd --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2-5.7.1 @@ -0,0 +1,42 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy2-v5.7.1-linux32" "https://downloads.python.org/pypy/pypy2-v5.7.1-linux32.tar.bz2#f125a227f8c814ba1698168a639ea6ca59bb69c280529639eed29076d8429a73" "pypy" verify_py27 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy2-v5.7.1-linux-armel" "https://downloads.python.org/pypy/pypy2-v5.7.1-linux-armel.tar.bz2#591a4a73cc945a1125848f3615a28559692db8febf677d7087eaef40cb119a8d" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy2-v5.7.1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy2-v5.7.1-linux-armhf-raspbian.tar.bz2#67544f8c4b284db71cf1af74edef290722f97f82476cbdaff2015fdab244c6ee" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy2-v5.7.1-linux-armhf-raring" "https://downloads.python.org/pypy/pypy2-v5.7.1-linux-armhf-raring.tar.bz2#c1b1a0968b22c58672f7492dc7900bc85e3bd02c791f219f31401a00ef387207" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy2-v5.7.1-linux64" "https://downloads.python.org/pypy/pypy2-v5.7.1-linux64.tar.bz2#c4fa3da42156bed4a9d912433b618a141e0c5161d7cc8c328786736ea5d1c2da" "pypy" verify_py27 ensurepip + else + install_package "pypy-5.7.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.7.1-linux_x86_64-portable.tar.bz2#8a6a194963eb58d582413c4bcdef6119f9f9f117a05032d1fb13192d934510c6" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + install_package "pypy2-v5.7.1-osx64" "https://downloads.python.org/pypy/pypy2-v5.7.1-osx64.tar.bz2#4e99ba356432861534917a9477ace0ccee617bd631512759a530f8383e153a3d" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy2-v5.7.1-win32" "https://downloads.python.org/pypy/pypy2-v5.7.1-win32.zip#a3ba7c946635236836f8536d8767a0f456b3b9a86876cb5c3173a04522bf451b" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy2-5.7.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy2-5.7.1-src b/plugins/python-build/share/python-build/pypy2-5.7.1-src new file mode 100644 index 0000000..1674718 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2-5.7.1-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy2-v5.7.0-src" "https://downloads.python.org/pypy/pypy2-v5.7.0-src.tar.bz2#e522ea7ca51b16ee5505f22b86803664b762a263a6d69ba84c359fcf8365ad3e" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy2.7-5.10.0 b/plugins/python-build/share/python-build/pypy2.7-5.10.0 new file mode 100644 index 0000000..e88a59d --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-5.10.0 @@ -0,0 +1,47 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy2-v5.10.0-linux32" "https://downloads.python.org/pypy/pypy2-v5.10.0-linux32.tar.bz2#ee1980467ac8cc9fa9d609f7da93c5282503e59a548781248fe1914a7199d540" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + if require_distro "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then + install_package "pypy2-v5.10.0-linux64" "https://downloads.python.org/pypy/pypy2-v5.10.0-linux64.tar.bz2#da85af9240220179493ad66c857934dc7ea91aef8f168cd293a2d99af8346ee2" "pypy" verify_py27 ensurepip + else + install_package "pypy-5.10.0-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.10.0-linux_x86_64-portable.tar.bz2#c966124497ba8728654ce1161fa4c46b035ff30f289be70960f58292e5897cc8" "pypy" verify_py27 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy2-v5.10.0-linux-armel" "https://downloads.python.org/pypy/pypy2-v5.10.0-linux-armel.tar.bz2#6fdd55dd8f674efd06f76edb60a09a03b9b04a5fbc56741f416a94a0b9d2ff91" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy2-v5.10.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy2-v5.10.0-linux-armhf-raspbian.tar.bz2#5ec3617bb9a07a0a0b2f3c8fbe69912345da4696cdb0a2aca7889b6f1e74435c" "pypy" verify_py27 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy2.7-5.10.0-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"osx64" ) + install_package "pypy2-v5.10.0-osx64" "https://downloads.python.org/pypy/pypy2-v5.10.0-osx64.tar.bz2#7e4120f0a83529a6851cbae0ec107dc7085ba8a4aeff4e7bd9da9aadb1ef37a4" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy2-v5.10.0-win32" "https://downloads.python.org/pypy/pypy2-v5.10.0-win32.zip#350914f9b70404781674f2f188f84d440d9d25da46ed9733b3f98269a510e033" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy2.7-5.10.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy2.7-5.10.0-src b/plugins/python-build/share/python-build/pypy2.7-5.10.0-src new file mode 100644 index 0000000..5a1a85a --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-5.10.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy2-v5.10.0-src" "https://downloads.python.org/pypy/pypy2-v5.10.0-src.tar.bz2#1209f2db718e6afda17528baa5138177a14a0938588a7d3e1b7c722c483079a8" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy2.7-5.8.0 b/plugins/python-build/share/python-build/pypy2.7-5.8.0 new file mode 100644 index 0000000..645498f --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-5.8.0 @@ -0,0 +1,42 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy2-v5.8.0-linux32" "https://downloads.python.org/pypy/pypy2-v5.8.0-linux32.tar.bz2#a0b125a5781f7e5ddfc3baca46503b14f4ee6a0e234e8d72bfcf3afdf4120bef" "pypy" verify_py27 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy2-v5.8.0-linux-armel" "https://downloads.python.org/pypy/pypy2-v5.8.0-linux-armel.tar.bz2#28b7fd0cc7418ffc66c71520728e87941be40ebf4b82675c57e25598a2a702b0" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy2-v5.8.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy2-v5.8.0-linux-armhf-raspbian.tar.bz2#da58279a0e3706889fc0df06087cea08f8cfd22322139fe9bae73ef9b2d119b7" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy2-v5.8.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy2-v5.8.0-linux-armhf-raring.tar.bz2#ddceca9c5c9a456d4bf1beab177660adffbbdf255a922244e1cc05f20318be46" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + if require_distro "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy2-v5.8.0-linux64" "https://downloads.python.org/pypy/pypy2-v5.8.0-linux64.tar.bz2#6274292d0e954a2609b15978cde6efa30942ba20aa5d2acbbf1c70c0a54e9b1e" "pypy" verify_py27 ensurepip + else + install_package "pypy-5.8-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.8-1-linux_x86_64-portable.tar.bz2#52556230af5769c656173ae8a1bdcb2e16aef46e3993ed89f3aec3d220aec862" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + install_package "pypy2-v5.8.0-osx64" "https://downloads.python.org/pypy/pypy2-v5.8.0-osx64.tar.bz2#04b61d1cf13aaca6d0420e854c820b8bd049dc88be16c02542abe8ca26eb075c" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy2-v5.8.0-win32" "https://downloads.python.org/pypy/pypy2-v5.8.0-win32.zip#43d6217653e5bdc09e3ff8cb56fb52c4eb019429063d80107be4e88eef79ea8d" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy2.7-5.8.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy2.7-5.8.0-src b/plugins/python-build/share/python-build/pypy2.7-5.8.0-src new file mode 100644 index 0000000..6f97bef --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-5.8.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy2-v5.8.0-src" "https://downloads.python.org/pypy/pypy2-v5.8.0-src.tar.bz2#504c2d522595baf8775ae1045a217a2b120732537861d31b889d47c340b58bd5" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy2.7-5.9.0 b/plugins/python-build/share/python-build/pypy2.7-5.9.0 new file mode 100644 index 0000000..e41a552 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-5.9.0 @@ -0,0 +1,42 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy2-v5.9.0-linux32" "https://downloads.python.org/pypy/pypy2-v5.9.0-linux32.tar.bz2#a2431a9e4ef879da1a2b56b111013b4a6efb87d4173a37bf650de47834ac5fe4" "pypy" verify_py27 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy2-v5.9.0-linux-armel" "https://downloads.python.org/pypy/pypy2-v5.9.0-linux-armel.tar.bz2#ac0676d91dfb388c799ec5c2845f42018a666423376f52f3ae13d61fd2e6f87d" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy2-v5.9.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy2-v5.9.0-linux-armhf-raspbian.tar.bz2#b8a20042a3f34486a372ff7c751539b2e16859c0a7ea69d5a73af92f0fdcb25a" "pypy" verify_py27 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy2-v5.9.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy2-v5.9.0-linux-armhf-raring.tar.bz2#2597b7b21acdef4f2b81074a594157c9450363c74a17f005548c6b102f93cff4" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + if require_distro "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy2-v5.9.0-linux64" "https://downloads.python.org/pypy/pypy2-v5.9.0-linux64.tar.bz2#790febd4f09e22d6e2f81154efc7dc4b2feec72712aaf4f82aa91b550abb4b48" "pypy" verify_py27 ensurepip + else + install_package "pypy-5.9-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-5.9-linux_x86_64-portable.tar.bz2#8d39eb98df3adf7882a7f3551f47b8c7cff47a0e20d6aabc57bb592f155c2616" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + install_package "pypy2-v5.9.0-osx64" "https://downloads.python.org/pypy/pypy2-v5.9.0-osx64.tar.bz2#94de50ed80c7f6392ed356c03fd54cdc84858df43ad21e9e971d1b6da0f6b867" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy2-v5.9.0-win32" "https://downloads.python.org/pypy/pypy2-v5.9.0-win32.zip#b61081e24e05b83d8110da1262be19f0094532c6cacc293e318a1c186d926533" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy2.7-5.9.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy2.7-5.9.0-src b/plugins/python-build/share/python-build/pypy2.7-5.9.0-src new file mode 100644 index 0000000..3504169 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-5.9.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy2-v5.9.0-src" "https://downloads.python.org/pypy/pypy2-v5.9.0-src.tar.bz2#de4bf05df47f1349dbac97233d9277bbaf1ef3331663ea2557fd5da3dbcfd0a7" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy2.7-6.0.0 b/plugins/python-build/share/python-build/pypy2.7-6.0.0 new file mode 100644 index 0000000..6024fac --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-6.0.0 @@ -0,0 +1,55 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy2-v6.0.0-linux32" "https://downloads.python.org/pypy/pypy2-v6.0.0-linux32.tar.bz2#ad1082d4328ae8f32617b14628648583b82b6d29df3aa42b97bd1853c08c4bc8" "pypy" verify_py27 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy3.5-6.0.0-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy2-v6.0.0-linux-armel" "https://downloads.python.org/pypy/pypy2-v6.0.0-linux-armel.tar.bz2#924ca3f90aa28e8961859508c25752c95253b842318a0f267267ffe90f56a916" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy2-v6.0.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy2-v6.0.0-linux-armhf-raspbian.tar.bz2#6506ce739e31981e5596d3cc2e2c7f5b086ee77bb4d97773082b62b2f283eef2" "pypy" verify_py27 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy2-6.0.0-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy2-v6.0.0-linux64" "https://downloads.python.org/pypy/pypy2-v6.0.0-linux64.tar.bz2#6cbf942ba7c90f504d8d6a2e45d4244e3bf146c8722d64e9410b85eac6b5af67" "pypy" verify_py27 ensurepip + else + install_package "pypy-6.0.0-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-6.0.0-linux_x86_64-portable.tar.bz2#1d2a833680f9432b6b5f6b8503f656535f429eeb6c4bc5408abe5b637bfb9b94" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + install_package "pypy2-v6.0.0-osx64" "https://downloads.python.org/pypy/pypy2-v6.0.0-osx64.tar.bz2#d7dc443e6bb9a45212e8d8f5a63e9f6ce23f1d88c50709efea1c75b76c8bc186" "pypy" verify_py27 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy2-v6.0.0-win32" "https://downloads.python.org/pypy/pypy2-v6.0.0-win32.zip#6e2210dae1ae721ed4eb9cba19f15453514b64111511c84f24843c4fdefdaf7f" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy2-6.0.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy2.7-6.0.0-src b/plugins/python-build/share/python-build/pypy2.7-6.0.0-src new file mode 100644 index 0000000..423f0ca --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-6.0.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy2-v6.0.0-src" "https://downloads.python.org/pypy/pypy2-v6.0.0-src.tar.bz2#6097ec5ee23d0d34d8cd27a1072bed041c8a080ad48731190a03a2223029212d" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy2.7-7.0.0 b/plugins/python-build/share/python-build/pypy2.7-7.0.0 new file mode 100644 index 0000000..1aea960 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.0.0 @@ -0,0 +1,47 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then + install_package "pypy2.7-v7.0.0-linux32" "https://downloads.python.org/pypy/pypy2.7-v7.0.0-linux32.tar.bz2#446fc208dd77a0048368da830564e6e4180bcd786e524b5369c61785af5c903a" "pypy" verify_py27 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy2.7-7.0.0-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then + install_package "pypy2.7-v7.0.0-linux64" "https://downloads.python.org/pypy/pypy2.7-v7.0.0-linux64.tar.bz2#971b1909f9fe960c4c643a6940d3f8a60d9a7a2937119535ab0cfaf83498ecd7" "pypy" verify_py27 ensurepip + else + install_package "pypy-7.0.0-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-7.0.0-linux_x86_64-portable.tar.bz2#fd71f2bef69c342e492239c2de04a67676bbc08b262d31948bef9e1385a44646" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy2.7-v7.0.0-osx64" "https://downloads.python.org/pypy/pypy2.7-v7.0.0-osx64.tar.bz2#e7ecb029d9c7a59388838fc4820a50a2f5bee6536010031060e3dfa882730dc8" "pypy" verify_py27 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy2.7-7.0.0-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win32" ) + install_zip "pypy2.7-v7.0.0-win32" "https://downloads.python.org/pypy/pypy2.7-v7.0.0-win32.zip#04477a41194240cd71e485c3f41dec35a787d1b3bc030f9aa59e5e81bcf4118b" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy2.7-7.0.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy2.7-7.0.0-src b/plugins/python-build/share/python-build/pypy2.7-7.0.0-src new file mode 100644 index 0000000..b5856cb --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.0.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy2.7-v7.0.0-src" "https://downloads.python.org/pypy/pypy2.7-v7.0.0-src.tar.bz2#f51d8bbfc4e73a8a01820b7871a45d13c59f1399822cdf8a19388c69eb20c18c" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy2.7-7.1.0 b/plugins/python-build/share/python-build/pypy2.7-7.1.0 new file mode 100644 index 0000000..7f9aaeb --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.1.0 @@ -0,0 +1,47 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then + install_package "pypy2.7-v7.1.0-linux32" "https://downloads.python.org/pypy/pypy2.7-v7.1.0-linux32.tar.bz2#44ec91e8cb01caab289d8763c203f3aaf288d14325a6c42692bd1ac4e870d758" "pypy" verify_py27 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy2.7-7.1.0-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then + install_package "pypy2.7-v7.1.0-linux64" "https://downloads.python.org/pypy/pypy2.7-v7.1.0-linux64.tar.bz2#fef176a29a2ef068c00c8098e59dab935ca6e956f089672b3f7351da95a034f5" "pypy" verify_py27 ensurepip + else + install_package "pypy-7.1.0-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-7.1.0-linux_x86_64-portable.tar.bz2#ee917d9d72fb6a7d15e31e6c5e470ce561a940f112e99f29ac5dd6b41f512657" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy2.7-v7.1.0-osx64" "https://downloads.python.org/pypy/pypy2.7-v7.1.0-osx64.tar.bz2#8be43685ce718b0768387450fc6dc395d60809b778b6146c353ef67826022153" "pypy" verify_py27 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy2.7-7.1.0-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win32" ) + install_zip "pypy2.7-v7.1.0-win32" "https://downloads.python.org/pypy/pypy2.7-v7.1.0-win32.zip#76658c9ad679d562b8b6a09d006caa666406337b9834ff56db16980c5e549f20" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy2.7-7.1.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy2.7-7.1.0-src b/plugins/python-build/share/python-build/pypy2.7-7.1.0-src new file mode 100644 index 0000000..5c0a935 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.1.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy2.7-v7.1.0-src" "https://downloads.python.org/pypy/pypy2.7-v7.1.0-src.tar.bz2#b051a71ea5b4fa27d0a744b28e6054661adfce8904dcc82500716b5edff5ce4b" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy2.7-7.1.1 b/plugins/python-build/share/python-build/pypy2.7-7.1.1 new file mode 100644 index 0000000..5f12e5f --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.1.1 @@ -0,0 +1,47 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then + install_package "pypy2.7-v7.1.1-linux32" "https://downloads.python.org/pypy/pypy2.7-v7.1.1-linux32.tar.bz2#41ca390a76ca0d47b8353a0d6a20d5aab5fad8b0bb647b960d8c33e873d18ef5" "pypy" verify_py27 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy2.7-7.1.1-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then + install_package "pypy2.7-v7.1.1-linux64" "https://downloads.python.org/pypy/pypy2.7-v7.1.1-linux64.tar.bz2#73b09ef0860eb9ad7997af3030b22909806a273d90786d78420926df53279d66" "pypy" verify_py27 ensurepip + else + install_package "pypy-7.1.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy-7.1.1-linux_x86_64-portable.tar.bz2#d0b226d2dd656c622cee4e3e982225e1b346653823b49f736d8b0ddc06fd0c73" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy2.7-v7.1.1-osx64" "https://downloads.python.org/pypy/pypy2.7-v7.1.1-osx64.tar.bz2#31a17294dec96c2191885c776b4ee02112957dc874f7ba03e570537a77b78c35" "pypy" verify_py27 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy2.7-7.1.1-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win32" ) + install_zip "pypy2.7-v7.1.1-win32" "https://downloads.python.org/pypy/pypy2.7-v7.1.1-win32.zip#9c59226311f216a181e70ee7b5aa4d9665a15d00f24ae02acec9af7d96355f63" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy2.7-7.1.1-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy2.7-7.1.1-src b/plugins/python-build/share/python-build/pypy2.7-7.1.1-src new file mode 100644 index 0000000..060e3eb --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.1.1-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy2.7-v7.1.1-src" "https://downloads.python.org/pypy/pypy2.7-v7.1.1-src.tar.bz2#5f06bede6d71dce8dfbfe797aab26c8e35cb990e16b826914652dc093ad74451" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy2.7-7.2.0 b/plugins/python-build/share/python-build/pypy2.7-7.2.0 new file mode 100644 index 0000000..dca6d6e --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.2.0 @@ -0,0 +1,47 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then + install_package "pypy2.7-v7.2.0-linux32" "https://downloads.python.org/pypy/pypy2.7-v7.2.0-linux32.tar.bz2#76d666e5aee54b519d6ec1af4ef0cbdc85f7f9276dd554e97deb026adfd0c936" "pypy" verify_py27 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy2.7-7.2.0-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then + install_package "pypy2.7-v7.2.0-linux64" "https://downloads.python.org/pypy/pypy2.7-v7.2.0-linux64.tar.bz2#05acf28e6a243026ecad933b9361d8f74b41f00818071b76b38c4694cc4c9599" "pypy" verify_py27 ensurepip + else + install_package "pypy-7.2.0-linux_x86_64-portable" "https://github.com/squeaky-pl/portable-pypy/releases/download/pypy-7.2.0/pypy-7.2.0-linux_x86_64-portable.tar.bz2#a4f301e7629aafe4691ed1c3e9a39cf2158d86524f6ce584e5b850303e77ad81" "pypy" verify_py27 ensurepip + fi + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy2.7-v7.2.0-osx64" "https://downloads.python.org/pypy/pypy2.7-v7.2.0-osx64.tar.bz2#36aa2f2440e762333569118dd0b3d5371d575c40966effa194d116c5453ddb52" "pypy" verify_py27 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy2.7-7.2.0-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win32" ) + install_zip "pypy2.7-v7.2.0-win32" "https://downloads.python.org/pypy/pypy2.7-v7.2.0-win32.zip#956eeaaaac053e5d0917e77a3d2ad1933ab5561eb3e6e71235780b5aa5fd2bb7" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy2.7-7.2.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy2.7-7.2.0-src b/plugins/python-build/share/python-build/pypy2.7-7.2.0-src new file mode 100644 index 0000000..abdb3e6 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.2.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy2.7-v7.2.0-src" "https://downloads.python.org/pypy/pypy2.7-v7.2.0-src.tar.bz2#55cb7757784fbe3952102447f65b27d80e6c885a464a7af1a9ce264492439dcc" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.0 b/plugins/python-build/share/python-build/pypy2.7-7.3.0 new file mode 100644 index 0000000..a8143ae --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.0 @@ -0,0 +1,39 @@ +VERSION='7.3.0' +PYVER='2.7' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#eac1308b7d523003a5f6d20f58406d52ab14611bcec750122ae513a5a35110db" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux64" ) + install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#f4950a54378ac637da2a6defa52d6ffed96af12fcd5d74e1182fb834883c9826" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux-aarch64" ) + install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#a3dd8d5e2a656849fa344dce4679d854a19bc4a096a0cf62b46a1be127a5d56c" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#ca7b056b243a6221ad04fa7fc8696e36a2fb858396999dcaa31dbbae53c54474" "pypy" "verify_py${PYVER//./}" ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win32" ) + install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#a9e3c5c983edba0313a41d3c1ab55b080816c4129e67a6c272c53b9dbcdd97ec" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.0-src b/plugins/python-build/share/python-build/pypy2.7-7.3.0-src new file mode 100644 index 0000000..ea593c5 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy2.7-v7.3.0-src" "https://downloads.python.org/pypy/pypy2.7-v7.3.0-src.tar.bz2#b0b25c7f8938ab0fedd8dedf26b9e73c490913b002b484c1b2f19d5844a518de" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.1 b/plugins/python-build/share/python-build/pypy2.7-7.3.1 new file mode 100644 index 0000000..0c90a80 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.1 @@ -0,0 +1,39 @@ +VERSION='7.3.1' +PYVER='2.7' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#cd155d06cd0956d9de4a16e8a6bdf0722cb45b5bc4bbf805825d393ebd6690ad" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux64" ) + install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#be74886547df7bf7094096a11fc0a48496779d0d1b71901797b0c816f92caca3" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux-aarch64" ) + install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#094f23ab262e666d8740bf27459a6b1215a628dad9b6c2a88f1ed5c793fab267" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#dfd4651243441d2f8f1c348e9ecc09848642d0c31bb323aa8ac320e5b9f232f0" "pypy" "verify_py${PYVER//./}" ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win32" ) + install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#e3c0dfb385d9825dd7723f26576d55d43ed92f1178f2399ab39e9fa11621a47b" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.1-src b/plugins/python-build/share/python-build/pypy2.7-7.3.1-src new file mode 100644 index 0000000..5a22502 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.1-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "pypy2.7-v7.3.1-src" "https://downloads.python.org/pypy/pypy2.7-v7.3.1-src.tar.bz2#fa3771514c8a354969be9bd3b26d65a489c30e28f91d350e4ad2f4081a9c9321" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.10 b/plugins/python-build/share/python-build/pypy2.7-7.3.10 new file mode 100644 index 0000000..378ccd2 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.10 @@ -0,0 +1,81 @@ +VERSION='7.3.10' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +aarch64_hash=274342f0e75e99d60ba7a0cfb0e13792e7664163e01450d2f7f2f7825603a0ae +linux32_hash=0b17132f62d2a0c3c4572c57eb53820f25611afad71f3d6a310202942baed6e1 +linux64_hash=461fb6df524208af9e94ffb16989f628b585bdb4b9e97d81e668899fc3a064a3 +osarm64_hash=14b178f005603e3df6db7574b77b9c65ae79feda1a629214cafcb4eee7da679d +osx64_hash=188551185ee945d5e42a3a619205d02ac31db77bdd5d98b6c11469e125c3bdb5 +s390x_hash=0fac1ec1e05c70941f758be05d40ce7ffe6a42c0416e70b55d40a7523e3e70ae + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.10-src b/plugins/python-build/share/python-build/pypy2.7-7.3.10-src new file mode 100644 index 0000000..2b638e2 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.10-src @@ -0,0 +1,14 @@ +VERSION='7.3.10' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +hash=35e2cf4519cb51c4d5ffb4493ee24f0c7f42b4b04944903ca4b33981a04a3bc5 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.11 b/plugins/python-build/share/python-build/pypy2.7-7.3.11 new file mode 100644 index 0000000..b46c2df --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.11 @@ -0,0 +1,81 @@ +VERSION='7.3.11' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +aarch64_hash=ea924da1defe9325ef760e288b04f984614e405580f5321eb6a5c8f539bd415a +linux32_hash=30fd245fab7068c96a75b9ff1323ac55174c64fc8c4751cceb4b7a9bedc1851e +linux64_hash=ba8ed958a905c0735a4cfff2875c25089954dc020e087d982b0ffa5b9da316cd +osarm64_hash=cc5696ab4f93cd3481c1e4990b5dedd7ba60ac0602fa1890d368889a6c5bf771 +osx64_hash=56deee9c22640f5686c35b9d64fdb1ce3abd044583e4078f0b171ca2fd2a198e +s390x_hash=8fe9481c473178e53266983678684a70fe0c42bafc95f1807bf3ef28770316d4 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.11-src b/plugins/python-build/share/python-build/pypy2.7-7.3.11-src new file mode 100644 index 0000000..b3d38cd --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.11-src @@ -0,0 +1,14 @@ +VERSION='7.3.11' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +hash=1117afb66831da4ea6f39d8d2084787a74689fd0229de0be301f9ed9b255093c + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.12 b/plugins/python-build/share/python-build/pypy2.7-7.3.12 new file mode 100644 index 0000000..930fd6b --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.12 @@ -0,0 +1,81 @@ +VERSION='7.3.12' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +aarch64_hash=e04dcb6286a7b4724ec3f0e50d3cc1ba8583301dd1658c06d7f37599e4201c59 +linux32_hash=abf3ae477bd0e526ac6dcefe0bfa845e1535aa053342c0d641219bfcde4b9b56 +linux64_hash=1a61a2574b79466f606010f2999a2b995bd96cd085f91a78ebdd3d5c2c40e81d +osarm64_hash=6b747aa076ae8597e49603c5dec4ca5935a1a0a132d7404a559be96a260d9bf7 +osx64_hash=6e89ffdd15537ce4ffce3145b65ee57c2e9c952892bd95b934012d2f009f503b +s390x_hash=80c0154d8b0949f9dc6a227c322abbc9590c8ae4c9f11c13bf4022aa38b82064 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.12-src b/plugins/python-build/share/python-build/pypy2.7-7.3.12-src new file mode 100644 index 0000000..6a62e74 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.12-src @@ -0,0 +1,14 @@ +VERSION='7.3.12' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +hash=dd61d88da274c2ce2cec77667d4a3df9a652bcc50e26f90991d4dd0af66bccf4 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.13 b/plugins/python-build/share/python-build/pypy2.7-7.3.13 new file mode 100644 index 0000000..0239066 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.13 @@ -0,0 +1,81 @@ +VERSION='7.3.13' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +aarch64_hash=f1e20f833cc86a097c1f1318069fc17d01c3988678c1438fe27ed567fcb5cfd0 +linux32_hash=b727d2e759a740f45bab1e333029d001c4384b52949bcbb4bd2ad7912eae8dad +linux64_hash=e41ceb5dc6c4d3a9311ed5f88edfeedbf3e8abbd1ed3c4f2e151a90a5cf4e1d7 +osarm64_hash=5b86cf0750abc188a0355380d10c7bab1dec51b610cde23ce78f30a9ef296618 +osx64_hash=50769df0091e8fa51c9e4356e0cb204e6f6aa54f502ec5a6e55aef03d0ac5675 +s390x_hash=fbb2f3d92831c02b094f17e9609b95a6202d4bdcddae437e380ab14388d4556e + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.13-src b/plugins/python-build/share/python-build/pypy2.7-7.3.13-src new file mode 100644 index 0000000..4704161 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.13-src @@ -0,0 +1,14 @@ +VERSION='7.3.13' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +hash=976984bc6ca5ec9d37ae4e219b020cbed2751d1a02267033f59ed700ba8cec40 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.14 b/plugins/python-build/share/python-build/pypy2.7-7.3.14 new file mode 100644 index 0000000..e7af928 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.14 @@ -0,0 +1,81 @@ +VERSION='7.3.14' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +aarch64_hash=98468f4cc704a2821401afdd001ebddd367e594e05a70c7767fb86f1364fb21a +linux32_hash=b12b4b587da55c8f212ae854e31d29258451e069c65aca596e577644e520bc8b +linux64_hash=5938c3c6cddb2e8eb5e435cd3bf61d15134b94a9ac026e26a533bdda6c28a4a0 +osarm64_hash=a428e18fcf1470b032fb1f4d75795aeed9216b4314a4c8a3e4d7e13f10f8607e +osx64_hash=8af24683621937e65c518fbca1eb34e17ffc741c2ac917e4ca20694348157d78 +s390x_hash=5abc6a0f55a89c08def13b5f410b8e7bd706fe1b472f31db01ecbc4d0a49e8dc + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.14-src b/plugins/python-build/share/python-build/pypy2.7-7.3.14-src new file mode 100644 index 0000000..1cc47f0 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.14-src @@ -0,0 +1,14 @@ +VERSION='7.3.14' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +hash=e096fe67ce2d8d4d5e7dceb84fe1ca854498f00766d31b27d32c8d8833131373 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.15 b/plugins/python-build/share/python-build/pypy2.7-7.3.15 new file mode 100644 index 0000000..6e14667 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.15 @@ -0,0 +1,81 @@ +VERSION='7.3.15' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +aarch64_hash=31b41fca7280636d7818713b7a0fab8f34ece9c82cc88e51d305d43b3e6306d6 +linux32_hash=cb5c1da62a8ca31050173c4f6f537bc3ff316026895e5f1897b9bb526babae79 +linux64_hash=e857553bdc4f25ba9670a5c173a057a9ff71262d5c5da73a6ddef9d7dc5d4f5e +osarm64_hash=618d33df7ac6570d88a58183e3e15c56f63f862968cecbd2ee896eac6255cea6 +osx64_hash=72dac262fc63115b6ccd2c3c15e7afd1b2e7a65d7e97265c116246d1cf2cdffd +s390x_hash=eb442279ec3f1eb17da296e38b531d3ca50c6418eab208a020bca4646a1dea46 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.15-src b/plugins/python-build/share/python-build/pypy2.7-7.3.15-src new file mode 100644 index 0000000..65082f7 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.15-src @@ -0,0 +1,14 @@ +VERSION='7.3.15' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +hash=a66ddaed39544a35bb7ab7a17dbf673a020c7cb3a614bd2b61a54776888daf2c + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.16 b/plugins/python-build/share/python-build/pypy2.7-7.3.16 new file mode 100644 index 0000000..b77482f --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.16 @@ -0,0 +1,81 @@ +VERSION='7.3.16' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +aarch64_hash=be44e65dd8c00d2388b2580dbe2af6a5179f951a8f4979efc74360f92f3c7e96 +linux32_hash=a19712d7a6bd4f6d113e352c5271803c583b5129b76a357d387b1fa85204f8e5 +linux64_hash=04b2fceb712d6f811274825b8a471ee392d3d1b53afc83eb3f42439ce00d8e07 +osarm64_hash=9cc13f4d6c4096820e1e0ddabb3959f853e45150ce0166a39aa23867e99f0145 +osx64_hash=e8744c1cef8b9e4eb2d2b6b368ed19a1c5cde482c7ef750f2d9f0807bb77fd1c +s390x_hash=09eb70b932e6aac484cf4b5f2de5845f71589f2cbb53e5ed37a497613b43cd53 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.16-src b/plugins/python-build/share/python-build/pypy2.7-7.3.16-src new file mode 100644 index 0000000..fdf2005 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.16-src @@ -0,0 +1,14 @@ +VERSION='7.3.16' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +hash=43721cc0c397f0f3560b325c20c70b11f7c76c27910d3df09f8418cec4f9c2ad + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.17 b/plugins/python-build/share/python-build/pypy2.7-7.3.17 new file mode 100644 index 0000000..54138c4 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.17 @@ -0,0 +1,77 @@ +VERSION='7.3.17' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +aarch64_hash=a8df5ce1650f4756933f8780870c91a0a40e7c9870d74629bf241392bcb5c2e3 +linux32_hash=a3aa0867cc837a34941047ece0fbb6ca190410fae6ad35fae4999d03bf178750 +linux64_hash=9f3497f87b3372d17e447369e0016a4bec99a6b4d2a59aba774a25bfe4353474 +osarm64_hash=8573172db377ee0831bf20492cdee9bac4e0b194e3dfe8bf7c44ee257a824766 +osx64_hash=e3e1af1d6ad15e51d8d19ea36e1ac65c4c792314cc8b8dc5cf771ec4353b50f8 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.17-src b/plugins/python-build/share/python-build/pypy2.7-7.3.17-src new file mode 100644 index 0000000..28c84dc --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.17-src @@ -0,0 +1,14 @@ +VERSION='7.3.17' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +hash=50e06840f4bbde91448080a4118068a89b8fbcae25ff8da1e2bb1402dc9a0346 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.18 b/plugins/python-build/share/python-build/pypy2.7-7.3.18 new file mode 100644 index 0000000..c95bee6 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.18 @@ -0,0 +1,77 @@ +VERSION='7.3.18' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +aarch64_hash=d647cad5be915df65f44277fd051c8d52e708d22838b5cb21b2de033530acc80 +linux32_hash=54990fb1ae2266c260a7ce694b84ab91a8d0d298da440cd5695ac671dc5615e2 +linux64_hash=1da34354e5fa59400609e94c00ba6feccf5aa575abb26fb6caf9c2ac16100ff4 +osarm64_hash=48927b1931a4feadea945f7c988c429b42e9fb6567af3810ab86ad95efbe98bc +osx64_hash=db9d2bcc8dbe089b34a19083a11116697e8679acc2c47a2862264429810f666e + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.18-src b/plugins/python-build/share/python-build/pypy2.7-7.3.18-src new file mode 100644 index 0000000..792a48f --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.18-src @@ -0,0 +1,14 @@ +VERSION='7.3.18' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +hash=737435ddfc5afa5b97a7209c87d70d5f1062426c053b9bb8b99a0347cb4891fa + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.19 b/plugins/python-build/share/python-build/pypy2.7-7.3.19 new file mode 100644 index 0000000..9bbba97 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.19 @@ -0,0 +1,77 @@ +VERSION='7.3.19' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +aarch64_hash=fe89d4fd4af13f76dfe7315975003518cf176520e3ccec1544a88d174f50910e +linux32_hash=cc52df02b6926bd8645c1651cd7f6637ce51c2f352d0fb3c6b9330d15194b409 +linux64_hash=d38445508c2eaf14ebb380d9c1ded321c5ebeae31c7e66800173d83cb8ddf423 +osarm64_hash=28780e0b908ad6db4b4e096f4237124be79ecc9731946d840d9c8749eb67a759 +osx64_hash=6be28d448d8e64fffc586d9b0ae4d09064a83ccaeb5b8060c651c5cd9ae06878 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.19-src b/plugins/python-build/share/python-build/pypy2.7-7.3.19-src new file mode 100644 index 0000000..30aec5e --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.19-src @@ -0,0 +1,14 @@ +VERSION='7.3.19' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +hash=8703cdcb01f9f82966dd43b6a6018f140399db51ebb43c125c1f9a215e7bb003 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.2 b/plugins/python-build/share/python-build/pypy2.7-7.3.2 new file mode 100644 index 0000000..17f7d38 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.2 @@ -0,0 +1,39 @@ +VERSION='7.3.2' +PYVER='2.7' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#78f30ac17abe3cc077fc2456ef55adb51b052c5126011b2a32bacc858acaca7d" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux64" ) + install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#8d4f08116a97153a0f739de8981874d544b564cbc87dd064cca33f36c29da13b" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux-aarch64" ) + install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#fce1f06f20ab8bcacb9ac1c33572d6425033de53c3a93fbd5391189cc3e106cb" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#10ca57050793923aea3808b9c8669cf53b7342c90c091244e9660bf797d397c7" "pypy" "verify_py${PYVER//./}" ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win32" ) + install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#0fd62265e0421a02432f10a294a712a5e784a8e061375e6d8ea5fd619be1be62" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.2-src b/plugins/python-build/share/python-build/pypy2.7-7.3.2-src new file mode 100644 index 0000000..736cd0c --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.2-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "pypy2.7-v7.3.2-src" "https://downloads.python.org/pypy/pypy2.7-v7.3.2-src.tar.bz2#8189480d8350ad6364d05c2b39fd7d832644d4b1cd018f785126389df45928d1" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.20 b/plugins/python-build/share/python-build/pypy2.7-7.3.20 new file mode 100644 index 0000000..4e1d62f --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.20 @@ -0,0 +1,77 @@ +VERSION='7.3.20' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +aarch64_hash=f22a1be607deeaa4f9be6bc63aae09fe4fb5b990d6a23aa4e7c5960dc5d93c96 +linux32_hash=9d554c5efcb6ef80146bb82965f5d8404d6848e6f04b25c378852a095768a69c +linux64_hash=aa3bb92dbb529fa2d4920895b16d67a810b0c709207857d56cfe4a6e3b41e02a +osarm64_hash=be3ffbb243316b1ffbf63ac60d72e099d5b64702e4429eeeb18a0608fb3b8dcc +osx64_hash=9e7cf34e9d4c8d890439fcd10b09a2c0825d8709c63dd4cbf85645711bfb15b7 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.20-src b/plugins/python-build/share/python-build/pypy2.7-7.3.20-src new file mode 100644 index 0000000..b4a81b4 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.20-src @@ -0,0 +1,14 @@ +VERSION='7.3.20' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +hash=bf958498445f7bf78338723c8d86bd6711e8792461725d2481df77a9566a3e62 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.22 b/plugins/python-build/share/python-build/pypy2.7-7.3.22 new file mode 100644 index 0000000..fd0dc19 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.22 @@ -0,0 +1,77 @@ +VERSION='7.3.22' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +aarch64_hash=49829ef97a36d50870b0a4a7d6d67c4817d98a0bbd936e7a86ac6ef615b07205 +linux32_hash=3512d44a9005b52611ad2d84e63c575c8b592fb1dd1a708a00f787b46e6ee07b +linux64_hash=c47a4030542cbd34d0cb673a0de1956c94c1ebe6c6b094f2ae6a167c55375f68 +osarm64_hash=83f7c9aab17f090a8fc54d917fb627ebf45f57e37e951e25d34cc94f796cb62a +osx64_hash=25adfddbf502a479d57f1948e19881a90162180b2b6dc7e3c2efacead1353438 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.22-src b/plugins/python-build/share/python-build/pypy2.7-7.3.22-src new file mode 100644 index 0000000..5b3b1d8 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.22-src @@ -0,0 +1,14 @@ +VERSION='7.3.22' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +hash=f4445c1a835effe4d3b26521e73a7780893dec02520aa6799a377c9a0fcdd8ad + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.3 b/plugins/python-build/share/python-build/pypy2.7-7.3.3 new file mode 100644 index 0000000..7bf6c58 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.3 @@ -0,0 +1,39 @@ +VERSION='7.3.3' +PYVER='2.7' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#bfbc81874b137837a8ba8c517b97de29f5a336f7ec500c52f2bfdbd3580d1703" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux64" ) + install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#f412b602ccd6912ddee0e7523e0e38f4b2c7a144449c2cad078cffbdb66fd7b1" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux-aarch64" ) + install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#23b145b7cfbaeefb6ee76fc8216c83b652ab1daffac490558718edbbd60082d8" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#f34dc4f5ded1f6bcea05841aa9781b9307329e3ab755607917148568824ae0b0" "pypy" "verify_py${PYVER//./}" ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win32" ) + install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#b3e660dae8d25d8278fd6a0db77e76a16ac9a8c1dca22e7e103d39ed696dc69e" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.3-src b/plugins/python-build/share/python-build/pypy2.7-7.3.3-src new file mode 100644 index 0000000..8d5b49c --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.3-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "pypy2.7-v7.3.3-src" "https://downloads.python.org/pypy/pypy2.7-v7.3.3-src.tar.bz2#f63488051ba877fd65840bf8d53822a9c6423d947839023b8720139f4b6e2336" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.4 b/plugins/python-build/share/python-build/pypy2.7-7.3.4 new file mode 100644 index 0000000..e373b35 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.4 @@ -0,0 +1,39 @@ +VERSION='7.3.4' +PYVER='2.7' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#653cc3f0612399e494021027f4463d62639dffa4345736a16d0704f3f8a61d5f" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux64" ) + install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#d3f7b0625e770d9be62201765d7d2316febc463372fba9c93a12969d26ae03dd" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux-aarch64" ) + install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#9e741162ce486b14fbcf5aa377796d26b0529a9352fb602ee8b66c005f8420d1" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#ee7bf42ce843596521e02c763408a5164d18f23c9617f1b8e032ce0675686582" "pypy" "verify_py${PYVER//./}" ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win32" ) + install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#1080012d7a3cea65182528259b51d52b1f61a3717377c2d9ba11ef36e06162d5" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.4-src b/plugins/python-build/share/python-build/pypy2.7-7.3.4-src new file mode 100644 index 0000000..0824a39 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.4-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "pypy2.7-v7.3.4-src" "https://downloads.python.org/pypy/pypy2.7-v7.3.4-src.tar.bz2#ff9b928237767efe08ccfba79dae489519b3c768fb6e3af52d39c2a8a1c21ca4" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.5 b/plugins/python-build/share/python-build/pypy2.7-7.3.5 new file mode 100644 index 0000000..280411e --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.5 @@ -0,0 +1,39 @@ +VERSION='7.3.5' +PYVER='2.7' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#35bb5cb1dcca8e05dc58ba0a4b4d54f8b4787f24dfc93f7562f049190e4f0d94" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux64" ) + install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#4858b347801fba3249ad90af015b3aaec9d57f54d038a58d806a1bd3217d5150" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux-aarch64" ) + install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#8dc2c753f8a94eca1a304d7736c99b439c09274f492eaa3446770c6c32ed010e" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#8b10442ef31c3b28048816f858adde6d6858a190d9367001a49648e669cbebb6" "pypy" "verify_py${PYVER//./}" ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win32" ) + install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#0b90eded11ba89a526c4288f17fff7e75000914ac071bd6d67912748ae89d761" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.5-src b/plugins/python-build/share/python-build/pypy2.7-7.3.5-src new file mode 100644 index 0000000..c846078 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.5-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "pypy2.7-v7.3.5-src" "https://downloads.python.org/pypy/pypy2.7-v7.3.5-src.tar.bz2#c0444fd9873058c1c0d99e13a934e92285cb05992c9968bf523c32bf9bec0a9d" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.6 b/plugins/python-build/share/python-build/pypy2.7-7.3.6 new file mode 100644 index 0000000..b1040e1 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.6 @@ -0,0 +1,39 @@ +VERSION='7.3.6' +PYVER='2.7' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#7a1145f3a278ffab4da0e2d4c4bd024ab8d67106a502e4bb7f6d67337e7af2b7" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux64" ) + install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#82127f43fae6ce75d47d6c4539f8c1ea372e9c2dbfa40fae8b58351d522793a4" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux-aarch64" ) + install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#90e9aafb310314938f54678d4d6d7db1163b57c9343e640b447112f74d7f9151" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#9a97de82037d4be1949ec0c35a4d638ba635e8b34948549ae2fa08abd2cbaa8c" "pypy" "verify_py${PYVER//./}" ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win32" ) + install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#fcc8f6b3b472a77eaa754951f288fe234b4953bfba845888dd839b9b862cb891" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.6-src b/plugins/python-build/share/python-build/pypy2.7-7.3.6-src new file mode 100644 index 0000000..a7f411c --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.6-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "pypy2.7-v7.3.6-src" "https://downloads.python.org/pypy/pypy2.7-v7.3.6-src.tar.bz2#0114473c8c57169cdcab1a69c60ad7fef7089731fdbe6f46af55060b29be41e4" "pypy_builder" verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.8 b/plugins/python-build/share/python-build/pypy2.7-7.3.8 new file mode 100644 index 0000000..ca2b4ef --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.8 @@ -0,0 +1,81 @@ +VERSION='7.3.8' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +aarch64_hash=ca1f8d3146c83002ee97615906b0930e821297dcce3063b5b28933a0690ef298 +linux32_hash=7c84f173bbcd73d0eb10909259d11b5cc253d4c6ea4492e6da8f2532df9b3da5 +linux64_hash=1f2e84fb539ffce233c34769d2f11647955f894be091e85419e05f48011e8940 +osx64_hash=e5c1ff39ad9916ea23e3deb8012fe42367b6b19284cf13b1a1ea2b2f53a43add +s390x_hash=b4ae4e708ba84602d976ad6ae391ef2eef4b1896d831b8f2b2ec69927dd92014 +win64_hash=806a29a6c5550b1e669d8870683d3379138d3d43eb1e07bdf26d65a0691265f2 + +### end of manual settings - following lines same for every download + +function pypy_pkg_data { + # pypy architecture + local ARCH="${1}" + + local basesrc="pypy${PYVER}-${VERSION}-src" + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local url="${baseurl}-${pkg}.tar.bz2" # use bz2 + local hash='' # undefined + + case "${pkg}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + url="${baseurl}-aarch64.tar.bz2" # diff url + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' # package name revised + url="${baseurl}-${pkg}.tar.bz2" # new url + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try '${basesrc}' to build from source." + echo + } >&2 + exit 1 + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + 'win64' ) + hash="${win64_hash}" + cmd='install_zip' # diff command + url="${baseurl}-${pkg}.zip" # zip rather than bz2 + ;; + * ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try '${basesrc}' to build from source." + echo + } >&2 + exit 1 + ;; + esac + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${url}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.8-src b/plugins/python-build/share/python-build/pypy2.7-7.3.8-src new file mode 100644 index 0000000..91dd043 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.8-src @@ -0,0 +1,14 @@ +VERSION='7.3.8' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +hash=0cdad270c62d3ccc53cc87eeb069a6dc46acaf95521b584624bcd6697d94fa1c + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.9 b/plugins/python-build/share/python-build/pypy2.7-7.3.9 new file mode 100644 index 0000000..4606967 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.9 @@ -0,0 +1,81 @@ +VERSION='7.3.9' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +aarch64_hash=aff4e4dbab53448f662cd01acb2251571d60f836d2f48382a7d8da54ca5b3442 +linux32_hash=bbf4e7343d43c8217099a9bffeed6a1781f4b5a3e186ed1a0befca65e647aeb9 +linux64_hash=172a928b0096a7e00b7d58f523f57300c35c3de7f822491e2a7bc845375c23f8 +osx64_hash=77314f5a6b2cc35d24e6f952bef89f5da612b90e4127a8034aed708d9ae483c4 +s390x_hash=62481dd3c6472393ca05eb3a0880c96e4f5921747157607dbaa772a7369cab77 +win64_hash=ca7b0f4c576995b388cfb4c796e3f6f20b037e5314571bf267daa068a3a2af31 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' # windows is always diff... + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH, windows has ext of zip + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + 'win64' ) + hash="${win64_hash}" + cmd='install_zip' # diff command + ext='zip' # zip rather than bz2 + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.9-src b/plugins/python-build/share/python-build/pypy2.7-7.3.9-src new file mode 100644 index 0000000..c0d4bb4 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.9-src @@ -0,0 +1,14 @@ +VERSION='7.3.9' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +hash=39b0972956f6548ce5828019dbae12503c32d6cbe91a2becf88d3e42cc52197b + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3-2.3.1 b/plugins/python-build/share/python-build/pypy3-2.3.1 new file mode 100644 index 0000000..1e7910c --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3-2.3.1 @@ -0,0 +1,44 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then + install_package "pypy3-2.3.1-linux" "https://downloads.python.org/pypy/pypy3-2.3.1-linux.tar.bz2#7eddc6826e58c9c89e68b59ec8caf1596b76401517ad8d26ad5e18e0ffa45db9" "pypy" verify_py32 ensurepip + else + install_package "pypy3-2.3.1-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3-2.3.1-linux_i686-portable.tar.bz2#32a5b3fd4299b13aedf7bc6262eee0f6be9a27744ccf787718553d973ec38abb" "pypy" verify_py32 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy3-2.3.1-linux-armel" "https://downloads.python.org/pypy/pypy3-2.3.1-linux-armel.tar.bz2#37ccdc68df322ba1bafe4177593b4ca293d1fffd60d72f2cf2326d090677f04f" "pypy" verify_py32 ensurepip + ;; +"linux-armhf") + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy3-2.3.1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy3-2.3.1-linux-armhf-raspbian.tar.bz2#033ccca1e3d7156d05ca8accd58b6371e15efc17468bbc3f963625b0c829b66b" "pypy" verify_py32 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy3-2.3.1-linux-armhf-raring" "https://downloads.python.org/pypy/pypy3-2.3.1-linux-armhf-raring.tar.bz2#bd7c19bde4b18158da42534a677f27c9b23855968e7cc3d4178cc9d1620a250a" "pypy" verify_py32 ensurepip + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" 1>/dev/null 2>&1; then + install_package "pypy3-2.3.1-linux64" "https://downloads.python.org/pypy/pypy3-2.3.1-linux64.tar.bz2#303df2cf4766db20ec77786d9091dce284fdab01d7173c5828a35e86bc931b99" "pypy" verify_py32 ensurepip + else + install_package "pypy3-2.3.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3-2.3.1-linux_x86_64-portable.tar.bz2#cb56b5bde8f444d44a0ea9cd475ddeed00aa895f3dcc89fd37577a51439540aa" "pypy" verify_py32 ensurepip + fi + ;; +"osx64" ) + install_package "pypy3-2.3.1-osx64" "https://downloads.python.org/pypy/pypy3-2.3.1-osx64.tar.bz2#600d4dad2039b8035582c0e0ce9b71e8236d95db26cff48c84c6d1e0ea6814c1" "pypy" verify_py32 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy3-2.3.1-win32" "https://downloads.python.org/pypy/pypy3-2.3.1-win32.zip#3f3566a39100da9b0fb730ff629352b48c5ae322546fce2c528c58fc0a652b26" "pypy" verify_py32 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3-2.3.1-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3-2.3.1-src b/plugins/python-build/share/python-build/pypy3-2.3.1-src new file mode 100644 index 0000000..ec83799 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3-2.3.1-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy3-2.3.1-src" "https://downloads.python.org/pypy/pypy3-2.3.1-src.tar.bz2#924ca36bf85e02469c71d451c145f9a6d19b905df473a3d1c25179c63ea79d74" "pypy_builder" verify_py32 ensurepip diff --git a/plugins/python-build/share/python-build/pypy3-2.4.0 b/plugins/python-build/share/python-build/pypy3-2.4.0 new file mode 100644 index 0000000..38065d9 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3-2.4.0 @@ -0,0 +1,44 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then + install_package "pypy3-2.4.0-linux" "https://downloads.python.org/pypy/pypy3-2.4.0-linux.tar.bz2#108fdcccfddb9b2cb2fc3cbca5e6f7902ed3ab74a24c8ae29da7fbdadbab4345" "pypy" verify_py32 ensurepip + else + install_package "pypy3-2.4-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3-2.4-linux_i686-portable.tar.bz2#7ce050b4928dc58f7e9dd01e3e48c443c85616ca83f4bcc9147f1078d0fd126c" "pypy" verify_py32 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" || true + install_package "pypy3-2.4.0-linux-armel" "https://downloads.python.org/pypy/pypy3-2.4.0-linux-armel.tar.bz2#322ddc863006a97d48edc302a73bb0981bbc142951237ed161ca0ca2cd02831f" "pypy" verify_py32 ensurepip + ;; +"linux-armhf") + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy3-2.4.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy3-2.4.0-linux-armhf-raspbian.tar.bz2#ad8f00255c85bf3c1012d56d5638c7aee12bc9f1ddcdaad35985bbd65a16c602" "pypy" verify_py32 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy3-2.4.0-linux-armhf-raring" "https://downloads.python.org/pypy/pypy3-2.4.0-linux-armhf-raring.tar.bz2#eb41a3ee62741199aeeab818553ded460db991911609acf36e5710f491e5ac0a" "pypy" verify_py32 ensurepip + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" 1>/dev/null 2>&1; then + install_package "pypy3-2.4.0-linux64" "https://downloads.python.org/pypy/pypy3-2.4.0-linux64.tar.bz2#24e680b1742af7361107876a421dd793f5ef852dd5f097546f84b1378f7f70cc" "pypy" verify_py32 ensurepip + else + install_package "pypy3-2.4-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3-2.4-linux_x86_64-portable.tar.bz2#7b3e0f0bc924bd0d68d85c0b566979e74a2b366595db3d81502267367370a5fb" "pypy" verify_py32 ensurepip + fi + ;; +"osx64" ) + install_package "pypy3-2.4.0-osx64" "https://downloads.python.org/pypy/pypy3-2.4.0-osx64.tar.bz2#dcd86bdb753e93dbf55e1f3af3ffa97eea328b8b77aa60e92ea2260a6258cedb" "pypy" verify_py32 ensurepip + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy3-2.4.0-win32" "https://downloads.python.org/pypy/pypy3-2.4.0-win32.zip#7ea499993b07405898dee9435836220d8c7b8abfa1b1f760c4a1c04b43945797" "pypy" verify_py32 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3-2.4.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3-2.4.0-src b/plugins/python-build/share/python-build/pypy3-2.4.0-src new file mode 100644 index 0000000..9cee067 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3-2.4.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy3-2.4.0-src" "https://downloads.python.org/pypy/pypy3-2.4.0-src.tar.bz2#d9ba207d6eecf8a0dc4414e9f4e92db1abd143e8cc6ec4a6bdcac75b29f104f3" "pypy_builder" verify_py32 ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.12 b/plugins/python-build/share/python-build/pypy3.10-7.3.12 new file mode 100644 index 0000000..24128b7 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.12 @@ -0,0 +1,81 @@ +VERSION='7.3.12' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +aarch64_hash=26208b5a134d9860a08f74cce60960005758e82dc5f0e3566a48ed863a1f16a1 +linux32_hash=811667825ae58ada4b7c3d8bc1b5055b9f9d6a377e51aedfbe0727966603f60e +linux64_hash=6c577993160b6f5ee8cab73cd1a807affcefafe2f7441c87bd926c10505e8731 +osarm64_hash=45671b1e9437f95ccd790af10dbeb57733cca1ed9661463b727d3c4f5caa7ba0 +osx64_hash=dbc15d8570560d5f79366883c24bc42231a92855ac19a0f28cb0adeb11242666 +s390x_hash=043c13a585479428b463ab69575a088db74aadc16798d6e677d97f563585fee3 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.12-src b/plugins/python-build/share/python-build/pypy3.10-7.3.12-src new file mode 100644 index 0000000..cb91866 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.12-src @@ -0,0 +1,14 @@ +VERSION='7.3.12' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +hash=86e4e4eacc36046c6182f43018796537fe33a60e1d2a2cc6b8e7f91a5dcb3e42 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.13 b/plugins/python-build/share/python-build/pypy3.10-7.3.13 new file mode 100644 index 0000000..1690b6e --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.13 @@ -0,0 +1,81 @@ +VERSION='7.3.13' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +aarch64_hash=ac476f01c9653358404f2e4b52f62307b2f64ccdb8c96dadcbfe355824d81a63 +linux32_hash=bfba57eb1f859dd0ad0d6fe841bb12e1256f1f023c7fbca083b536cccbc1233b +linux64_hash=54936eeafd9350a5ea0375b036272a260871b9bca82e1b0bb3201deea9f5a442 +osarm64_hash=efb3007b7aace0af6e3b30d381088a5bbc175973a6627b6b0d624a2ca2dc63ce +osx64_hash=2c6238b9ece7b94ffdfd1d9b50619edef4b169a5c78adcdb691fce6709cd6610 +s390x_hash=3c813c7efa6a026b281313b299c186c585155fc164c7538e65d41efdabff87c9 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.13-src b/plugins/python-build/share/python-build/pypy3.10-7.3.13-src new file mode 100644 index 0000000..4ebe5f2 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.13-src @@ -0,0 +1,14 @@ +VERSION='7.3.13' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +hash=4ac1733c19d014d3193c804e7f40ffccbf6924bcaaee1b6089b82b9bf9353a6d + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.14 b/plugins/python-build/share/python-build/pypy3.10-7.3.14 new file mode 100644 index 0000000..1446657 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.14 @@ -0,0 +1,81 @@ +VERSION='7.3.14' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +aarch64_hash=fbef65dfc69dcd6006d843553d268b331f1b13dfc3938492bd35f0f477b5bcf4 +linux32_hash=d37e7c7a03bed5dceca2ab7f821ad7655808cccf6908155f78f0effd811b7f4f +linux64_hash=a83879891dc0a6c1504da0954fba1125b21a2591782897231a8168100ea72b94 +osarm64_hash=0f09584e21ed8f45e8ff1e3dd1582f077ebdd23a1068298f45006f67bc692632 +osx64_hash=31ce62b7ea3b5b5bde68241ae9404f0a68f5a7d0094ef651062b7a64caecfd4e +s390x_hash=363e87ad3b6547cc68981c665cf049449bed44cf9e49cabbbcc61df73ea2d40b + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.14-src b/plugins/python-build/share/python-build/pypy3.10-7.3.14-src new file mode 100644 index 0000000..7f469f9 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.14-src @@ -0,0 +1,14 @@ +VERSION='7.3.14' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +hash=a3481af466103fa13740db4e27780e0423dcf8626b3340f60d3d3c28fbc11ae0 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.15 b/plugins/python-build/share/python-build/pypy3.10-7.3.15 new file mode 100644 index 0000000..e7e49cf --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.15 @@ -0,0 +1,81 @@ +VERSION='7.3.15' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +aarch64_hash=52146fccaf64e87e71d178dda8de63c01577ec3923073dc69e1519622bcacb74 +linux32_hash=75dd58c9abd8b9d78220373148355bc3119febcf27a2c781d64ad85e7232c4aa +linux64_hash=33c584e9a70a71afd0cb7dd8ba9996720b911b3b8ed0156aea298d4487ad22c3 +osarm64_hash=d927c5105ea7880f7596fe459183e35cc17c853ef5105678b2ad62a8d000a548 +osx64_hash=559b61ba7e7c5a5c23cef5370f1fab47ccdb939ac5d2b42b4bef091abe3f6964 +s390x_hash=209e57596381e13c9914d1332f359dc4b78de06576739747eb797bdbf85062b8 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.15-src b/plugins/python-build/share/python-build/pypy3.10-7.3.15-src new file mode 100644 index 0000000..1cf78ac --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.15-src @@ -0,0 +1,14 @@ +VERSION='7.3.15' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +hash=837622130b36603a1893899bd9f529961a8e4a56c9eb67268d72ddf8920c9579 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.16 b/plugins/python-build/share/python-build/pypy3.10-7.3.16 new file mode 100644 index 0000000..4f7085e --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.16 @@ -0,0 +1,81 @@ +VERSION='7.3.16' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +aarch64_hash=fc720999bc5050e1d3706b3b6445e695cf42bfc71ebc7c88ed6bb88828b1d385 +linux32_hash=0df48aa780159e879ac89a805d143e4a6cd1b842f98046f5a3f865814bfaa2a4 +linux64_hash=404e6180d6caf9258eaab0c02c72018e9aa8eb03ab9094a0ff17ee5e3b265ac1 +osarm64_hash=6c003376667a95c7a228544649677b9927b8210d6444b901817aad24b8719b93 +osx64_hash=490f2c6ba2489f405444f3b4ad42166da6e2eb73489a9535b206067eaaf21737 +s390x_hash=af97efe498a209ba18c7bc7d084164a9907fb3736588b6864955177e19d5216a + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.16-src b/plugins/python-build/share/python-build/pypy3.10-7.3.16-src new file mode 100644 index 0000000..fede582 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.16-src @@ -0,0 +1,14 @@ +VERSION='7.3.16' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +hash=4a3a3177d0a1f51d59982bb981d1d485403bda3419d5437b9e077f55f59424ff + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.17 b/plugins/python-build/share/python-build/pypy3.10-7.3.17 new file mode 100644 index 0000000..44cdf64 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.17 @@ -0,0 +1,77 @@ +VERSION='7.3.17' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +aarch64_hash=53b6e5907df869c49e4eae7aca09fba16d150741097efb245892c1477d2395f2 +linux32_hash=e534110e1047da37c1d586c392f74de3424f871d906a2083de6d41f2a8cc9164 +linux64_hash=fdcdb9b24f1a7726003586503fdeb264fd68fc37fbfcea022dcfe825a7fee18b +osarm64_hash=a050e25e8d686853dd5afc363e55625165825dacfb55f8753d8225ebe417cfd2 +osx64_hash=6c2c5f2300d7564e711421b4968abd63243cb96f76e363975dd648ebf4a362ee + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.17-src b/plugins/python-build/share/python-build/pypy3.10-7.3.17-src new file mode 100644 index 0000000..e94a3a8 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.17-src @@ -0,0 +1,14 @@ +VERSION='7.3.17' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +hash=6ad74bc578e9c6d3a8a1c51503313058e3c58c35df86f7485453c4be6ab24bf7 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.18 b/plugins/python-build/share/python-build/pypy3.10-7.3.18 new file mode 100644 index 0000000..81805cb --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.18 @@ -0,0 +1,77 @@ +VERSION='7.3.18' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +aarch64_hash=e843aecd48eb06b625af67891b99e3440313cfb64c6851fc37df1e5572c8ef9e +linux32_hash=34ef09a481254aad0f22bf09fd7c99efb65ffef4f79f5b4222505f55f8d9c22e +linux64_hash=834ccd4544bb47112a66977add7e47f30619f74061ae990876bcba95d98c27c5 +osarm64_hash=1d47da22bc9f7b5329f97c9c7b3ee0b051252ff1e82ca76999ad2d44758be41f +osx64_hash=b7031cbf815b7ba26ed2503b76ee3e73d7322b55f3671219019e8385042e212f + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.18-src b/plugins/python-build/share/python-build/pypy3.10-7.3.18-src new file mode 100644 index 0000000..3b041ee --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.18-src @@ -0,0 +1,14 @@ +VERSION='7.3.18' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +hash=08eb70e866987e4abe88ae9f54a98f919df92b595f7cdf4041703e8802b11552 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.19 b/plugins/python-build/share/python-build/pypy3.10-7.3.19 new file mode 100644 index 0000000..13df1c3 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.19 @@ -0,0 +1,77 @@ +VERSION='7.3.19' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +aarch64_hash=af27a589178f11198e2244ab65ca510630ba97c131d7ccc4021eb5bc58de7f57 +linux32_hash=e63a4fcad2641ee541e852918befb513abf04ce7070f743a50778cae9f9da80e +linux64_hash=c73ac2cc2380ac9227fd297482bf2a3e17a80618ba46db7544d535515321ec1e +osarm64_hash=3db8a03fc496164801646844d7f3b12baa0adb3ad9a0b7cb124521bc2e168a36 +osx64_hash=2c5e5c2a33ac882551d7f28b98d19d486b8995aa50824a73b4edcc6aeec35c63 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.19-src b/plugins/python-build/share/python-build/pypy3.10-7.3.19-src new file mode 100644 index 0000000..625d016 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.19-src @@ -0,0 +1,14 @@ +VERSION='7.3.19' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +hash=a7c22930b918f40870865ed8a74147f4434ef84d3d6ca2b3c1eba9355d4929c8 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.11-7.3.18 b/plugins/python-build/share/python-build/pypy3.11-7.3.18 new file mode 100644 index 0000000..cd4daa8 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.11-7.3.18 @@ -0,0 +1,77 @@ +VERSION='7.3.18' +PYVER='3.11' + +# https://www.pypy.org/checksums.html +aarch64_hash=95bc3021cb9be2aa766ecb776c215e97ae8c0dda99dd48840b40b5b87d90bc45 +linux32_hash=70357a69cdbf4ce449b5743901fcd36208e0a89eadcfb4d2ebdc9b4711a0612c +linux64_hash=df5fa534800ff09d990e50ca4fdb02d8a06b9ed948dbcb3a09bea0739ef42de7 +osarm64_hash=cc4d6dd621dffd474eb9a2d01e5844d1b6a6f88b404aac2c48a9c267b5370df4 +osx64_hash=4f2274ffb4b787fd5b5f15cd61f7fef5a3710bf0ecbd4293bf0251035b468865 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.11-7.3.18-src b/plugins/python-build/share/python-build/pypy3.11-7.3.18-src new file mode 100644 index 0000000..970fe1c --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.11-7.3.18-src @@ -0,0 +1,14 @@ +VERSION='7.3.18' +PYVER='3.11' + +# https://www.pypy.org/checksums.html +hash=fbc82b8ff67b942e6fce49980dc0f0f83193b005173f9bddd39d6396fb6b939d + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.11-7.3.19 b/plugins/python-build/share/python-build/pypy3.11-7.3.19 new file mode 100644 index 0000000..1f737ee --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.11-7.3.19 @@ -0,0 +1,77 @@ +VERSION='7.3.19' +PYVER='3.11' + +# https://www.pypy.org/checksums.html +aarch64_hash=13207dbf81ce24e96da760b1b863627b77bb20b1fb4c95191e02a0b72383df74 +linux32_hash=5c6cdafd0a0abd14ca59926ed1b6aeb13b228c18b4b46de655aae48734c731ad +linux64_hash=9177d9e0bb91b05f921c642cb0ff71a0f3653b5d29a42d40d6a078c15b75720f +osarm64_hash=7704e0d5302e53920d32dcfe9afeeb10436d4c94233e8830cf603aa955a861c1 +osx64_hash=a2439f9d30dfdae96a5e9101c7dc54a8a68b56c9d7314ea399b0a25d3e87ebb2 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.11-7.3.19-src b/plugins/python-build/share/python-build/pypy3.11-7.3.19-src new file mode 100644 index 0000000..3944137 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.11-7.3.19-src @@ -0,0 +1,14 @@ +VERSION='7.3.19' +PYVER='3.11' + +# https://www.pypy.org/checksums.html +hash=4817c044bb469a3274e60aa3645770f81eb4f9166ea7fdc4e6c351345554c8d8 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.11-7.3.20 b/plugins/python-build/share/python-build/pypy3.11-7.3.20 new file mode 100644 index 0000000..63249f1 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.11-7.3.20 @@ -0,0 +1,77 @@ +VERSION='7.3.20' +PYVER='3.11' + +# https://www.pypy.org/checksums.html +aarch64_hash=9347fe691a07fd9df17a1b186554fb9d9e6210178ffef19520a579ce1f9eb741 +linux32_hash=d08ce15dd61e9ace5e010b047104f0137110a258184e448ea8239472f10cf99b +linux64_hash=1410db3a7ae47603e2b7cbfd7ff6390b891b2e041c9eb4f1599f333677bccb3e +osarm64_hash=84a48e09c97f57df62cc9f01b7a6d8c3e306b6270671d871aa8ab8c06945940d +osx64_hash=bb3ae80cf5fca5044af2e42933e7692c7c5e76a828ce0eb6404a5d5da83b313c + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.11-7.3.20-src b/plugins/python-build/share/python-build/pypy3.11-7.3.20-src new file mode 100644 index 0000000..fddb57f --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.11-7.3.20-src @@ -0,0 +1,14 @@ +VERSION='7.3.20' +PYVER='3.11' + +# https://www.pypy.org/checksums.html +hash=7786dda760003e2ea7409c1037e50200c578ec427ce0245ac4cd758710b206fb + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.11-7.3.22 b/plugins/python-build/share/python-build/pypy3.11-7.3.22 new file mode 100644 index 0000000..de50d2d --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.11-7.3.22 @@ -0,0 +1,77 @@ +VERSION='7.3.22' +PYVER='3.11' + +# https://www.pypy.org/checksums.html +aarch64_hash=c29a8933e2084f52df74c829aa0d8f5652b9d5919f68e9fb89cab3afe35dd884 +linux32_hash=6fdad58d6d376810cf6291be1d396032f4da8109517357de0091adc3874f04c9 +linux64_hash=c0c239a6b0d381338bcccf852d0690b9daca632e0216389a3796f8817fd66e0e +osarm64_hash=5de96e2b68a8b347fb24f8b3f5345ce0724605d4122ce194e1decce4dab8d5a0 +osx64_hash=26adf960b6f57cacb39a9f0e8fd87e9de7986762b467c75b3aaf94177aa7af87 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.11-7.3.22-src b/plugins/python-build/share/python-build/pypy3.11-7.3.22-src new file mode 100644 index 0000000..183c06f --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.11-7.3.22-src @@ -0,0 +1,14 @@ +VERSION='7.3.22' +PYVER='3.11' + +# https://www.pypy.org/checksums.html +hash=9f885a47a232b957f9b5cc4307264af229570ddea62a9c175351afa3a6321820 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.3-5.2-alpha1 b/plugins/python-build/share/python-build/pypy3.3-5.2-alpha1 new file mode 100644 index 0000000..52d3b10 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.3-5.2-alpha1 @@ -0,0 +1,40 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 10.04" 1>/dev/null 2>&1; then + install_package "pypy3.3-v5.2.0-alpha1-linux" "https://downloads.python.org/pypy/pypy3.3-v5.2.0-alpha1-linux32.tar.bz2#351aec101bdedddae7ea1b63845a5654b1a95fc9393894ef84a66749f6945f17" "pypy" verify_py33 ensurepip + else + install_package "pypy3.3-5.2-alpha-20160602-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.3-5.2-alpha-20160602-linux_i686-portable.tar.bz2#6f2412167c63d6711b41062a23794828f95a75400082a6957595867762cb170d" "pypy" verify_py33 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy3.3-v5.2.0-alpha1-linux-armel" "https://downloads.python.org/pypy/pypy3.3-v5.2.0-alpha1-linux-armel.tar.bz2#ac83e632213f078ab60045e6ad0564b146d65dcd9a52c130026fab6dd85bf2dc" "pypy" verify_py33 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy3.3-v5.2.0-alpha1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy3.3-v5.2.0-alpha1-linux-armhf-raspbian.tar.bz2#ba9a5d0cbac1c622363315b30df288ab2cf8fcccf7e2882bf5946115dbfa657e" "pypy" verify_py33 ensurepip + else + require_distro "Ubuntu 13.04" || true + install_package "pypy3.3-v5.2.0-alpha1-linux-armhf-raring" "https://downloads.python.org/pypy/pypy3.3-v5.2.0-alpha1-linux-armhf-raring.tar.bz2#b4d847d33c1bf9b3956d1d17b9e37505eb32f68e341c9333a74a82010a63e799" "pypy" verify_py33 ensurepip + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy3.3-v5.2.0-alpha1-linux64" "https://downloads.python.org/pypy/pypy3.3-v5.2.0-alpha1-linux64.tar.bz2#f5e66ab24267d6ddf662d07c512d06c10ebc732ae62093dabbd775ac63b9060a" "pypy" verify_py33 ensurepip + else + install_package "pypy3.3-5.2-alpha-20160602-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.3-5.2-alpha-20160602-linux_x86_64-portable.tar.bz2#4d1e7dd727448c1b2caa90c943713c0aa10b32e9d977c2c3b348835f515a3ad4" "pypy" verify_py33 ensurepip + fi + ;; +"osx64" ) + install_package "pypy3.3-v5.2.0-alpha1-osx64" "https://downloads.python.org/pypy/pypy3.3-v5.2.0-alpha1-osx64.tar.bz2#abaceab5d2790f49e04e0d80669283da41f94b77cf483b30ac0de48d3c19f304" "pypy" verify_py33 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3.3-5.2-alpha1-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.3-5.2-alpha1-src b/plugins/python-build/share/python-build/pypy3.3-5.2-alpha1-src new file mode 100644 index 0000000..6242535 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.3-5.2-alpha1-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy3.3-v5.2.0-alpha1-src" "https://downloads.python.org/pypy/pypy3.3-v5.2.0-alpha1-src.tar.bz2#344c2f088c82ea1274964bb0505ab80d3f9e538cc03f91aa109325ddbaa61426" "pypy_builder" verify_py33 ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.3-5.5-alpha b/plugins/python-build/share/python-build/pypy3.3-5.5-alpha new file mode 100644 index 0000000..328b5b5 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.3-5.5-alpha @@ -0,0 +1,45 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy3.3-v5.5.0-linux32" "https://downloads.python.org/pypy/pypy3.3-v5.5.0-alpha-linux32.tar.bz2#966ee7951ad497ac907e01554fe48da77cc64a5e35a1307477c2f78652eba622" "pypy" verify_py33 ensurepip + else + install_package "pypy3.3-5.5-alpha-20161014-linux_i686-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.3-5.5-alpha-20161014-linux_i686-portable.tar.bz2#af32420f368bc3276d15a5cf4e2e8cb0bef16f711ee830a636ad117e55c3268f" "pypy" verify_py33 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy3-v5.5.0-linux-armel" "https://downloads.python.org/pypy/pypy3.3-v5.5.0-alpha-linux-armel.tar.bz2#9f081041867f434f18456f936befbacd9f40c0ede24137cbf80f9f45ff37b69f" "pypy" verify_py33 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy3-v5.5.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy3.3-v5.5.0-alpha-linux-armhf-raspbian.tar.bz2#d8e94c834307081d5c4be863fab935e34df360a77b06e8bc833624c4b712b2aa" "pypy" verify_py33 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3.3-5.5-alpha-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy3-v5.5.0-linux64" "https://downloads.python.org/pypy/pypy3.3-v5.5.0-alpha-linux64.tar.bz2#41ef7c25fd04eeb20deaa83c5d88c10aef2bbc8bcfd9e53e7cc61136220861cc" "pypy" verify_py33 ensurepip + else + install_package "pypy3.3-5.5-alpha-20161013-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.3-5.5-alpha-20161013-linux_x86_64-portable.tar.bz2#1cd7a00da376b2db29b3e1f3e9bb7a77afc8ad988b3f13fd0805f37b23960a34" "pypy" verify_py33 ensurepip + fi + ;; +"osx64" ) + install_package "pypy3-v5.5.0-osx64" "https://downloads.python.org/pypy/pypy3.3-v5.5.0-alpha-osx64.tar.bz2#fa45f861a6c40ae44f99ec94c521adfb6b64b0c9c0b6fc6e9df018241a648986" "pypy" verify_py33 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3.3-5.5-alpha-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.3-5.5-alpha-src b/plugins/python-build/share/python-build/pypy3.3-5.5-alpha-src new file mode 100644 index 0000000..9bdeed5 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.3-5.5-alpha-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy3-v5.5.0-src" "https://downloads.python.org/pypy/pypy3.3-v5.5.0-alpha-src.tar.bz2#d5591c34d77253e9ed57d182b6f49585b95f7c09c3e121f0e8630e5a7e75ab5f" "pypy_builder" verify_py33 ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.5-5.10.0 b/plugins/python-build/share/python-build/pypy3.5-5.10.0 new file mode 100644 index 0000000..7fb0347 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.5-5.10.0 @@ -0,0 +1,51 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy3-v5.10.0-linux32" "https://downloads.python.org/pypy/pypy3-v5.10.0-linux32.tar.bz2#529bc3b11edbdcdd676d90c805b8f607f6eedd5f0ec457a31bbe09c03f5bebfe" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + if require_distro "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then + install_package "pypy3-v5.10.0-linux64" "https://downloads.python.org/pypy/pypy3-v5.10.0-linux64.tar.bz2#aa4fb52fb858d973dd838dcf8d74f30705e5afdf1150acb8e056eb99353dfe77" "pypy" verify_py27 ensurepip + else + install_package "pypy3.5-5.10.0-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.5-5.10.0-linux_x86_64-portable.tar.bz2#d03f81f26e5e67d808569c5c69d56ceb007df78f7e36ab1c50da4d9096cebde0" "pypy" verify_py35 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy3-v5.10.0-linux-armel" "https://downloads.python.org/pypy/pypy3-v5.10.0-linux-armel.tar.bz2#c2cc529befb3e1f2ef8bd4e96af4a823c52ef2d180b0b3bd87511c5b47d59210" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy3-v5.10.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy3-v5.10.0-linux-armhf-raspbian.tar.bz2#4e902e0e79f62f2a9049c1c71310ff4fc801011bec4d25082edb5c537d3f15c9" "pypy" verify_py27 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3.5-5.10.0-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy3-v5.10.0-osx64" "https://downloads.python.org/pypy/pypy3-v5.10.0-osx64.tar.bz2#7e389a103f560de1eead1271ec3a2df9424c6ccffe7cbae8e95e6e81ae811a16" "pypy" verify_py27 ensurepip + else + install_package "pypy3-v5.10.0-osx64-2" "https://downloads.python.org/pypy/pypy3-v5.10.0-osx64-2.tar.bz2#f5ced20934fff78e55c72aa82a4703954349a5a8099b94e77d74b96a94326a2c" "pypy" verify_py27 ensurepip + fi + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy3-v5.10.0-win32" "https://downloads.python.org/pypy/pypy3-v5.10.0-win32.zip#2d93bf2bd7b1d031b96331d3fde6cacdda95673ce6875d6d1669c4c0ea2a52bc" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3.5-5.10.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.5-5.10.0-src b/plugins/python-build/share/python-build/pypy3.5-5.10.0-src new file mode 100644 index 0000000..c829916 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.5-5.10.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy3-v5.10.0-src" "https://downloads.python.org/pypy/pypy3-v5.10.0-src.tar.bz2#a6e4cffde71e3f08b6e1befa5c0352a9bcc5f4e9f5cbf395001e0763a1a0d9e3" "pypy_builder" verify_py35 ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.5-5.10.1 b/plugins/python-build/share/python-build/pypy3.5-5.10.1 new file mode 100644 index 0000000..43c0a31 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.5-5.10.1 @@ -0,0 +1,58 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy3-v5.10.1-linux32" "https://downloads.python.org/pypy/pypy3-v5.10.1-linux32.tar.bz2#a6ceca9ee5dc511de7902164464b88311fec9366c5673d0c00528eda862bbe54" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + if require_distro "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then + install_package "pypy3-v5.10.1-linux64" "https://downloads.python.org/pypy/pypy3-v5.10.1-linux64.tar.bz2#75a276e1ee1863967bbacb70c5bff636de200768c0ec90e72f7ec17aace0aefe" "pypy" verify_py27 ensurepip + else + install_package "pypy3.5-5.10.1-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.5-5.10.1-linux_x86_64-portable.tar.bz2#b7c7b0e0905208ce8a8061b1a0ae136a702e5218d0d350cb5216ad5a7c20d12e" "pypy" verify_py35 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy3-v5.10.1-linux-armel" "https://downloads.python.org/pypy/pypy3-v5.10.1-linux-armel.tar.bz2#5065e9ad958d06b9612ba974f43997d20168d4245c054dd43270e4b458782282" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy3-v5.10.1-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy3-v5.10.1-linux-armhf-raspbian.tar.bz2#203dd595fbad7055340b23326f20c85b0d6c11c4877e3559a437611fc2ac40c2" "pypy" verify_py27 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3.5-5.10.1-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy3-v5.10.1-osx64" "https://downloads.python.org/pypy/pypy3-v5.10.1-osx64.tar.bz2#52f006611513c995fdebba6e72d394186d4085460408cbbe086e5467bf3fb9b6" "pypy" verify_py27 ensurepip + else + # install_package "pypy3-v5.10.1-osx64-2" "https://downloads.python.org/pypy/pypy3-v5.10.1-osx64.tar.bz2#52f006611513c995fdebba6e72d394186d4085460408cbbe086e5467bf3fb9b6" "pypy" verify_py27 ensurepip + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy3.5-5.10.1-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy3-v5.10.1-win32" "https://downloads.python.org/pypy/pypy3-v5.10.1-win32.zip#4edf4f021689a529e5a631c5cca72a1a9dc19a6ea2091e64289cdd5b60eaf929" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3.5-5.10.1-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.5-5.10.1-src b/plugins/python-build/share/python-build/pypy3.5-5.10.1-src new file mode 100644 index 0000000..90e283b --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.5-5.10.1-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy3-v5.10.1-src" "https://downloads.python.org/pypy/pypy3-v5.10.1-src.tar.bz2#f5548e06e2fc0c24ec8b6e3c5b09f90081818f7caa3e436dc312592611724713" "pypy_builder" verify_py35 ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.5-5.7-beta b/plugins/python-build/share/python-build/pypy3.5-5.7-beta new file mode 100644 index 0000000..8cfe37a --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.5-5.7-beta @@ -0,0 +1,18 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy3-v5.7.0-linux64" "https://downloads.python.org/pypy/pypy3-v5.7.0-linux64.tar.bz2#921894884a647220a712ecdaad516d9c22fbadf3b4bb3a5db8f3635c60eabc7b" "pypy" verify_py35 ensurepip + else + install_package "pypy3.5-5.7-beta-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.5-5.7-beta-linux_x86_64-portable.tar.bz2#d289ff7c32fd4263c3889994c8191c626891513e8ab60a65ba41a58b331db92c" "pypy" verify_py35 ensurepip + fi + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3.5-5.7-beta-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.5-5.7-beta-src b/plugins/python-build/share/python-build/pypy3.5-5.7-beta-src new file mode 100644 index 0000000..d58b755 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.5-5.7-beta-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy3-v5.7.0-src" "https://downloads.python.org/pypy/pypy3-v5.7.0-src.tar.bz2#f0f563b74f8b82ec33b022393219b93cc0d81e9f9500614fe8417b67a52e9569" "pypy_builder" verify_py35 ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.5-5.7.1-beta b/plugins/python-build/share/python-build/pypy3.5-5.7.1-beta new file mode 100644 index 0000000..b9a8d70 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.5-5.7.1-beta @@ -0,0 +1,18 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 12.10" "Ubuntu 13.04" "Ubuntu 13.10" "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy3-v5.7.1-linux64" "https://downloads.python.org/pypy/pypy3-v5.7.1-linux64.tar.bz2#2abaa54d88c9b70b64c37083e7e430a1d3a8f78f8de92e484a988b7aca1e50a7" "pypy" verify_py35 ensurepip + else + install_package "pypy3.5-5.7.1-beta-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.5-5.7.1-beta-linux_x86_64-portable.tar.bz2#3d1b02f6ef50d4e9069885e0b3f19f26491c7f4f9c5ccc8aa118e38fd6a23997" "pypy" verify_py35 ensurepip + fi + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3.5-5.7-beta-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.5-5.7.1-beta-src b/plugins/python-build/share/python-build/pypy3.5-5.7.1-beta-src new file mode 100644 index 0000000..9755431 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.5-5.7.1-beta-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy3-v5.7.1-src" "https://downloads.python.org/pypy/pypy3-v5.7.1-src.tar.bz2#40ece0145282980ac121390f13709404c0532896507d5767496381180b631bd0" "pypy_builder" verify_py35 ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.5-5.8.0 b/plugins/python-build/share/python-build/pypy3.5-5.8.0 new file mode 100644 index 0000000..502b216 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.5-5.8.0 @@ -0,0 +1,18 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux64" ) + if require_distro "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy3-v5.8.0-linux64" "https://downloads.python.org/pypy/pypy3-v5.8.0-linux64.tar.bz2#57d871a7f1135719c138cee4e3533c3275d682a76a40ff668e95150c65923035" "pypy" verify_py35 ensurepip + else + install_package "pypy3.5-5.8-beta-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.5-5.8-1-beta-linux_x86_64-portable.tar.bz2#cab20a6d315a1bb05aa953ebc37d8deaa34dcbe298cb5938e373c42c05542b99" "pypy" verify_py35 ensurepip + fi + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3.5-5.8.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.5-5.8.0-src b/plugins/python-build/share/python-build/pypy3.5-5.8.0-src new file mode 100644 index 0000000..cd8d4e8 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.5-5.8.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy3-v5.8.0-src" "https://downloads.python.org/pypy/pypy3-v5.8.0-src.tar.bz2#9d090127335c3c0fd2b14c8835bf91752e62756e55ea06aad3353f24a6854223" "pypy_builder" verify_py35 ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.5-5.9.0 b/plugins/python-build/share/python-build/pypy3.5-5.9.0 new file mode 100644 index 0000000..4aed1a4 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.5-5.9.0 @@ -0,0 +1,18 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux64" ) + if require_distro "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy3-v5.9.0-linux64" "https://downloads.python.org/pypy/pypy3-v5.9.0-linux64.tar.bz2#d8c41ede3758127718944cc2fd6bf78ed4303d946f85596cac91281ccce36165" "pypy" verify_py35 ensurepip + else + install_package "pypy3.5-5.9-beta-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.5-5.9-beta-linux_x86_64-portable.tar.bz2#b0a79dabe2c48b0374d567936139ecf1379904a504d4a645be5c3e7e35140575" "pypy" verify_py35 ensurepip + fi + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3.5-5.9.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.5-5.9.0-src b/plugins/python-build/share/python-build/pypy3.5-5.9.0-src new file mode 100644 index 0000000..de3ab84 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.5-5.9.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy3-v5.9.0-src" "https://downloads.python.org/pypy/pypy3-v5.9.0-src.tar.bz2#a014f47f50a1480f871a0b82705f904b38c93c4ca069850eb37653fedafb1b97" "pypy_builder" verify_py35 ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.5-6.0.0 b/plugins/python-build/share/python-build/pypy3.5-6.0.0 new file mode 100644 index 0000000..e9349a3 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.5-6.0.0 @@ -0,0 +1,57 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 14.04" 1>/dev/null 2>&1; then + install_package "pypy3-v6.0.0-linux32" "https://downloads.python.org/pypy/pypy3-v6.0.0-linux32.tar.bz2#b04eeee5160e6cb5f8962de80f077ea1dc7be34e77d74bf075519c23603f5ff9" "pypy" verify_py27 ensurepip + fi + ;; +"linux64" ) + if require_distro "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then + install_package "pypy3-v6.0.0-linux64" "https://downloads.python.org/pypy/pypy3-v6.0.0-linux64.tar.bz2#4cfffa292b9ef34bb6ba39cdbaa196c5c5cbbc5aa3faaa157cf45d7e34027048" "pypy" verify_py27 ensurepip + else + install_package "pypy3.5-6.0.0-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.5-6.0.0-linux_x86_64-portable.tar.bz2#07f16282d126abfa759702baea869b0f661aa97f4c553ebec66c624bda28155f" "pypy" verify_py35 ensurepip + fi + ;; +"linux-armel" ) + require_distro "Ubuntu 12.04" || true + install_package "pypy3-v6.0.0-linux-armel" "https://downloads.python.org/pypy/pypy3-v6.0.0-linux-armel.tar.bz2#6a6888a55192f58594838b8b3d2e7daaad43d3bf4293afab3dd8987d0bbd1124" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_package "pypy3-v6.0.0-linux-armhf-raspbian" "https://downloads.python.org/pypy/pypy3-v6.0.0-linux-armhf-raspbian.tar.bz2#8a0420dda23413925400538bbfc0cff2bbb2ab0de984eef6faaeab6d3309cbcc" "pypy" verify_py27 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3.5-6.0.0-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy3-v6.0.0-osx64" "https://downloads.python.org/pypy/pypy3-v6.0.0-osx64.tar.bz2#938b8034e30f5f5060d2a079070c56c3be5559bc7ae9cc0c8395fe6fc45cfe4c" "pypy" verify_py27 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy3.5-6.0.0-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win32" ) + # FIXME: never tested on Windows + install_zip "pypy3-v6.0.0-win32" "https://downloads.python.org/pypy/pypy3-v6.0.0-win32.zip#72dddb3746a51f7672c77d619c818e27efe899e08ae82762448e50dbfdc2f5f3" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3.5-6.0.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.5-6.0.0-src b/plugins/python-build/share/python-build/pypy3.5-6.0.0-src new file mode 100644 index 0000000..fc82748 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.5-6.0.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy3-v6.0.0-src" "https://downloads.python.org/pypy/pypy3-v6.0.0-src.tar.bz2#ed8005202b46d6fc6831df1d13a4613bc40084bfa42f275068edadf8954034a3" "pypy_builder" verify_py35 ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.5-7.0.0 b/plugins/python-build/share/python-build/pypy3.5-7.0.0 new file mode 100644 index 0000000..06af24f --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.5-7.0.0 @@ -0,0 +1,47 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then + install_package "pypy3.5-v7.0.0-linux32" "https://downloads.python.org/pypy/pypy3.5-v7.0.0-linux32.tar.bz2#b8db8fbca9621de8ea8cd7184b322f2dddb2f385e8e5a63dfb75bb3fea4b2e3f" "pypy" verify_py35 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3.5-7.0.0-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then + install_package "pypy3.5-v7.0.0-linux64" "https://downloads.python.org/pypy/pypy3.5-v7.0.0-linux64.tar.bz2#729e3c54325969c98bd3658c6342b9f5987b96bad1d6def04250a08401b54c4b" "pypy" verify_py35 ensurepip + else + install_package "pypy3.5-7.0.0-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.5-7.0.0-linux_x86_64-portable.tar.bz2#b0fa200f25a5a0ef90b8776ab1d0665c47d47c607d2ef057cce1da1ad2568e1f" "pypy" verify_py35 ensurepip + fi + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy3.5-v7.0.0-osx64" "https://downloads.python.org/pypy/pypy3.5-v7.0.0-osx64.tar.bz2#7c6d71653d9b1a7946d1eeebbf24b454fe934fba8b0c39f648bdc545fb2895ce" "pypy" verify_py35 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy3.5-7.0.0-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win32" ) + install_zip "pypy3.5-v7.0.0-win32" "https://downloads.python.org/pypy/pypy3.5-v7.0.0-win32.zip#a840305c24f426e11d8bb3f062cacec1edf7fcbce6a99122d59f73e1984bc5c0" "pypy" verify_py35 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3.5-7.0.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.5-7.0.0-src b/plugins/python-build/share/python-build/pypy3.5-7.0.0-src new file mode 100644 index 0000000..00c828b --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.5-7.0.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy3.5-v7.0.0-src" "https://downloads.python.org/pypy/pypy3.5-v7.0.0-src.tar.bz2#b2ddb0f45cb4e0384fb498ef7fcca2ac96c730b9000affcf8d730169397f017f" "pypy_builder" verify_py35 ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.5-c-jit-latest b/plugins/python-build/share/python-build/pypy3.5-c-jit-latest new file mode 100644 index 0000000..538acbf --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.5-c-jit-latest @@ -0,0 +1,49 @@ +echo +colorize 1 "WARNING" +echo ": This may eat your kittens/ affect timespace in alternate dimensions/" +echo "cause you to complain more. Nightly builds are meant for testing only." +echo +echo "To report bugs/regressions, please see:" +echo +echo "http://doc.pypy.org/en/latest/faq.html#how-should-i-report-a-bug" +echo + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_nightly_package "pypy-c-jit-latest-linux" "http://buildbot.pypy.org/nightly/py3.5/pypy-c-jit-latest-linux.tar.bz2" "pypy-c-jit-*-linux" "pypy" verify_py27 ensurepip + ;; +"linux-armel" ) + install_nightly_package "pypy-c-jit-latest-linux-armel" "http://buildbot.pypy.org/nightly/py3.5/pypy-c-jit-latest-linux-armel.tar.bz2" "pypy-c-jit-*-linux-armel" "pypy" verify_py27 ensurepip + ;; +"linux-armhf" ) + if [[ "$(cat /etc/issue 2>/dev/null || true)" == "Raspbian"* ]]; then + install_nightly_package "pypy-c-jit-latest-linux-armhf-raspbian" "http://buildbot.pypy.org/nightly/py3.5/pypy-c-jit-latest-linux-armhf-raspbian.tar.bz2" "pypy-c-jit-*-linux-armhf-raspbian" "pypy" verify_py27 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The latest nightly build of PyPy 3.5 is not available for $(pypy_architecture 2>/dev/null || true)," + echo "Please check http://buildbot.pypy.org/nightly/py3.5/ for previous builds." + echo + } >&2 + exit 1 + fi + ;; +"linux64" ) + install_nightly_package "pypy3.5-c-jit-latest-linux64" "http://buildbot.pypy.org/nightly/py3.5/pypy-c-jit-latest-linux64.tar.bz2" "pypy-c-jit-*-linux64" "pypy" verify_py35 ensurepip + ;; +"osx64" ) + install_nightly_package "pypy-c-jit-latest-osx64" "http://buildbot.pypy.org/nightly/py3.5/pypy-c-jit-latest-osx64.tar.bz2" "pypy-c-jit-*-osx64" "pypy" verify_py27 ensurepip + ;; +"win32" ) + install_zip "pypy-c-jit-latest-win32" "http://buildbot.pypy.org/nightly/py3.5/pypy-c-jit-latest-win32.zip" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The latest nightly build of PyPy 3.5 is not available for $(pypy_architecture 2>/dev/null || true)," + echo "Please check http://buildbot.pypy.org/nightly/py3.5/ for previous builds." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.6-7.0.0 b/plugins/python-build/share/python-build/pypy3.6-7.0.0 new file mode 100644 index 0000000..f49ad7c --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.6-7.0.0 @@ -0,0 +1,43 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3.6-7.0.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then + install_package "pypy3.6-v7.0.0-linux64" "https://downloads.python.org/pypy/pypy3.6-v7.0.0-linux64.tar.bz2#8576bde0760c239040706cf4952995eb0e77938b175885392a465a0d1616173d" "pypy" verify_py36 ensurepip + else + install_package "pypy3.6-7.0.0-alpha-20190209-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.6-7.0.0-alpha-20190209-linux_x86_64-portable.tar.bz2#ef8a5254b9a082dec23a6e029b1bb674a122a789c29d9c452452a9e97498bcbe" "pypy" verify_py36 ensurepip + fi + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy3.6-v7.0.0-osx64" "https://downloads.python.org/pypy/pypy3.6-v7.0.0-osx64.tar.bz2#4a95ffd61fd2d626a9c099db6e44889c2a7eecee9cb1cbc29e06603c218ba8e2" "pypy" verify_py36 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy3.6-7.0.0-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win32" ) + install_zip "pypy3.6-v7.0.0-win32" "https://downloads.python.org/pypy/pypy3.6-v7.0.0-win32.zip#645d81472d16922fd592e9261da449cb19847ff7d5eaa89bcf05d9214b6b2698" "pypy" verify_py36 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3.6-7.0.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.6-7.0.0-src b/plugins/python-build/share/python-build/pypy3.6-7.0.0-src new file mode 100644 index 0000000..6bec495 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.6-7.0.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy3.6-v7.0.0-src" "https://downloads.python.org/pypy/pypy3.6-v7.0.0-src.tar.bz2#7ccbf81db5c647fa0c27636c7d18d059d2570fff7eaffc03857c67bee84b8a26" "pypy_builder" verify_py36 ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.6-7.1.0 b/plugins/python-build/share/python-build/pypy3.6-7.1.0 new file mode 100644 index 0000000..593a810 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.6-7.1.0 @@ -0,0 +1,47 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then + install_package "pypy3.6-v7.1.0-linux32" "https://downloads.python.org/pypy/pypy3.6-v7.1.0-linux32.tar.bz2#031bfac61210a6e161bace0691b854dc15d01b0e624dc0588c544ee5e1621a83" "pypy" verify_py27 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3.6-7.1.0-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then + install_package "pypy3.6-v7.1.0-linux64" "https://downloads.python.org/pypy/pypy3.6-v7.1.0-linux64.tar.bz2#270dd06633cf03337e6f815d7235e790e90dabba6f4b6345c9745121006925fc" "pypy" verify_py36 ensurepip + else + install_package "pypy3.6-7.1.0-beta-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.6-7.1.0-beta-linux_x86_64-portable.tar.bz2#d1bde814fb0c3645dfc0bdab67c335c8aa259b83fb39106e2e11b0112bcbb602" "pypy" verify_py36 ensurepip + fi + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy3.6-v7.1.0-osx64" "https://downloads.python.org/pypy/pypy3.6-v7.1.0-osx64.tar.bz2#d46e005ba095cb4a7006079ffbf4fe63c18cf5e9d8ce9ce8383efc1a4863ab5b" "pypy" verify_py36 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy3.6-7.1.0-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win32" ) + install_zip "pypy3.6-v7.1.0-win32" "https://downloads.python.org/pypy/pypy3.6-v7.1.0-win32.zip#77a0576a3d518210467f0df2d0d9a1892c664566dc02f25d974c2dbc6b4749e7" "pypy" verify_py36 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3.6-7.1.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.6-7.1.0-src b/plugins/python-build/share/python-build/pypy3.6-7.1.0-src new file mode 100644 index 0000000..623a8fe --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.6-7.1.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy3.6-v7.1.0-src" "https://downloads.python.org/pypy/pypy3.6-v7.1.0-src.tar.bz2#faa81f469bb2a7cbd22c64f22d4b4ddc5a1f7c798d43b7919b629b932f9b1c6f" "pypy_builder" verify_py36 ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.6-7.1.1 b/plugins/python-build/share/python-build/pypy3.6-7.1.1 new file mode 100644 index 0000000..6a1534b --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.6-7.1.1 @@ -0,0 +1,47 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then + install_package "pypy3.6-v7.1.1-linux32" "https://downloads.python.org/pypy/pypy3.6-v7.1.1-linux32.tar.bz2#cb11ef4b0df569c28390b1ee93029159e1b90bfbad98df6abd629d5203b2abd9" "pypy" verify_py27 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3.6-7.1.1-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then + install_package "pypy3.6-v7.1.1-linux64" "https://downloads.python.org/pypy/pypy3.6-v7.1.1-linux64.tar.bz2#8014f63b1a34b155548852c7bf73aab2d41ebddf2c8fb603dc9dd8509be93db0" "pypy" verify_py36 ensurepip + else + install_package "pypy3.6-7.1.1-beta-linux_x86_64-portable" "https://bitbucket-archive.softwareheritage.org/static/14/140b7b14-aa94-424e-b191-9cd3438381f7/attachments/pypy3.6-7.1.1-beta-linux_x86_64-portable.tar.bz2#82c878b61ad34fc2cf1686fa600a7a002d352e1b33a99a43007eec486ecd068e" "pypy" verify_py36 ensurepip + fi + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy3.6-v7.1.1-osx64" "https://downloads.python.org/pypy/pypy3.6-v7.1.1-osx64.tar.bz2#a5c2f2bfa2b4a4d29e8a67baab95699b169054066df218a14f171bb84a6df0c0" "pypy" verify_py36 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy3.6-7.1.1-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win32" ) + install_zip "pypy3.6-v7.1.1-win32" "https://downloads.python.org/pypy/pypy3.6-v7.1.1-win32.zip#8b513b254de5f31890f5956569de9aec3a0a91d7aba72fc89d66901f4a8ccf49" "pypy" verify_py36 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3.6-7.1.1-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.6-7.1.1-src b/plugins/python-build/share/python-build/pypy3.6-7.1.1-src new file mode 100644 index 0000000..2f50fdf --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.6-7.1.1-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy3.6-v7.1.1-src" "https://downloads.python.org/pypy/pypy3.6-v7.1.1-src.tar.bz2#6a3ef876e3691a54f4cff045028ec3be94ab9beb2e99f051b83175302c1899a8" "pypy_builder" verify_py36 ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.6-7.2.0 b/plugins/python-build/share/python-build/pypy3.6-7.2.0 new file mode 100644 index 0000000..45dbdc4 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.6-7.2.0 @@ -0,0 +1,47 @@ +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then + install_package "pypy3.6-v7.2.0-linux32" "https://downloads.python.org/pypy/pypy3.6-v7.2.0-linux32.tar.bz2#45e99de197cb3e974cfc8d45e0076ad2066852e61e56b3eafd1237efafd2c43e" "pypy" verify_py27 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3.6-7.2.0-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"linux64" ) + if require_distro "Ubuntu 12.04" "Ubuntu 14.04" "Ubuntu 16.04" 1>/dev/null 2>&1; then + install_package "pypy3.6-v7.2.0-linux64" "https://downloads.python.org/pypy/pypy3.6-v7.2.0-linux64.tar.bz2#aa128e555ad0fe5c4c15104ae0903052bd232b6e3a73f5fe023d27b8fd0d6089" "pypy" verify_py36 ensurepip + else + install_package "pypy3.6-7.2.0-beta-linux_x86_64-portable" "https://github.com/squeaky-pl/portable-pypy/releases/download/pypy3.6-7.2.0/pypy3.6-7.2.0-linux_x86_64-portable.tar.bz2#59099546b4dee56edcde2c9ff706687e35bb2aa94354cd56daa78aca036bd3d8" "pypy" verify_py36 ensurepip + fi + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy3.6-v7.2.0-osx64" "https://downloads.python.org/pypy/pypy3.6-v7.2.0-osx64.tar.bz2#836abb0ec303b90a684533711ed3b8269d3e8c64805b595e410920abdea678ac" "pypy" verify_py36 ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy3.6-7.2.0-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win32" ) + install_zip "pypy3.6-v7.2.0-win32" "https://downloads.python.org/pypy/pypy3.6-v7.2.0-win32.zip#c926f622bec24a8b348591d631717ace83b3a6c3c2dac02b157b622b97d1fc9c" "pypy" verify_py36 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy3.6-7.2.0-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.6-7.2.0-src b/plugins/python-build/share/python-build/pypy3.6-7.2.0-src new file mode 100644 index 0000000..ebd7d95 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.6-7.2.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy3.6-v7.2.0-src" "https://downloads.python.org/pypy/pypy3.6-v7.2.0-src.tar.bz2#0d7c707df5041f1593fe82f29c40056c21e4d6cb66554bbd66769bd80bcbfafc" "pypy_builder" verify_py36 ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.6-7.3.0 b/plugins/python-build/share/python-build/pypy3.6-7.3.0 new file mode 100644 index 0000000..f5deb33 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.6-7.3.0 @@ -0,0 +1,39 @@ +VERSION='7.3.0' +PYVER='3.6' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#7045b295d38ba0b5ee65bd3f078ca249fcf1de73fedeaab2d6ad78de2eab0f0e" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux64" ) + install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#d3d549e8f43de820ac3385b698b83fa59b4d7dd6cf3fe34c115f731e26ad8856" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux-aarch64" ) + install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#b900241bca7152254c107a632767f49edede99ca6360b9a064141267b47ef598" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#87b2545dad75fe3027b4b2108aceb9fdadcdd24e61ae312ac48b449fdd452bf3" "pypy" "verify_py${PYVER//./}" ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win32" ) + install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#30e6870c4f3d8ef91890a6556a98080758000ba7c207cccdd86a8f5d358998c1" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.6-7.3.0-src b/plugins/python-build/share/python-build/pypy3.6-7.3.0-src new file mode 100644 index 0000000..7ee8b4e --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.6-7.3.0-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "pypy3.6-v7.3.0-src" "https://downloads.python.org/pypy/pypy3.6-v7.3.0-src.tar.bz2#48d12c15fbcbcf4a32882a883195e1f922997cde78e7a16d4342b9b521eefcfa" "pypy_builder" verify_py36 ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.6-7.3.1 b/plugins/python-build/share/python-build/pypy3.6-7.3.1 new file mode 100644 index 0000000..690e4d6 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.6-7.3.1 @@ -0,0 +1,39 @@ +VERSION='7.3.1' +PYVER='3.6' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#2e7a818c67f3ac0708e4d8cdf1961f30cf9586b3f3ca2f215d93437c5ea4567b" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux64" ) + install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#f67cf1664a336a3e939b58b3cabfe47d893356bdc01f2e17bc912aaa6605db12" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux-aarch64" ) + install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#0069bc3c1570b935f1687f5e128cf050cd7229309e48fad2a2bf2140d43ffcee" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#d9c1778cd1ba37e129b495ea0f35ccdd9b68f5cd9d33ef0ce24e955c16d8840b" "pypy" "verify_py${PYVER//./}" ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win32" ) + install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#752fbe8c4abee6468e5ce22af82818f821daded36faa65f3d69423f9c217007a" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.6-7.3.1-src b/plugins/python-build/share/python-build/pypy3.6-7.3.1-src new file mode 100644 index 0000000..019dd3c --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.6-7.3.1-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "pypy3.6-v7.3.1-src" "https://downloads.python.org/pypy/pypy3.6-v7.3.1-src.tar.bz2#0c2cc3229da36c6984baee128c8ff8bb4516d69df1d73275dc4622bf249afa83" "pypy_builder" verify_py36 ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.6-7.3.2 b/plugins/python-build/share/python-build/pypy3.6-7.3.2 new file mode 100644 index 0000000..bf2bbc6 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.6-7.3.2 @@ -0,0 +1,39 @@ +VERSION='7.3.2' +PYVER='3.6' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#6fa871dedf5e60372231362d2ccb0f28f623d42267cabb49be11a3e10bee2726" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux64" ) + install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#d7a91f179076aaa28115ffc0a81e46c6a787785b2bc995c926fe3b02f0e9ad83" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux-aarch64" ) + install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#164d6a0503c83dd328e1a6bf7fcb2b2e977c1d27c6fcc491a7174fd37bc32a12" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#fd457bfeaf54aa69417b6aa4817df40e702dc8aaaf7e83ba005d391a1bddfa96" "pypy" "verify_py${PYVER//./}" ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win32" ) + install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#13a39d46340afed20f11de24e9068968386e4bb7c8bd168662711916e2bf1da6" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.6-7.3.2-src b/plugins/python-build/share/python-build/pypy3.6-7.3.2-src new file mode 100644 index 0000000..3dc4a75 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.6-7.3.2-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "pypy3.6-v7.3.2-src" "https://downloads.python.org/pypy/pypy3.6-v7.3.2-src.tar.bz2#fd6175fed63ff9fccd7886068078853078948d98afae9bd4f5554c6f7873c10d" "pypy_builder" verify_py36 ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.6-7.3.3 b/plugins/python-build/share/python-build/pypy3.6-7.3.3 new file mode 100644 index 0000000..7898372 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.6-7.3.3 @@ -0,0 +1,39 @@ +VERSION='7.3.3' +PYVER='3.6' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#f183c61e66fd2c536a65695bd7ff770748c2884c235a589b9c6ac63690770c69" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux64" ) + install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#4fb85fdd516482cab727bb9473b066ff8fb672940dedf7ccc32bf92957d29e0a" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux-aarch64" ) + install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#bc82cf7f0182b942a2cfad4a0d167f364bfbf18f434e100a2fe62bc88547ac9b" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#84126fcb957f260de221244222152c981643144df1d817329781f555daa52e35" "pypy" "verify_py${PYVER//./}" ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win32" ) + install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#b935253877b703d29b1b11f79e66944f1f88adb8a76f871abf765d4de9d25f8a" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.6-7.3.3-src b/plugins/python-build/share/python-build/pypy3.6-7.3.3-src new file mode 100644 index 0000000..173f87a --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.6-7.3.3-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "pypy3.6-v7.3.3-src" "https://downloads.python.org/pypy/pypy3.6-v7.3.3-src.tar.bz2#a23d21ca0de0f613732af4b4abb0b0db1cc56134b5bf0e33614eca87ab8805af" "pypy_builder" verify_py36 ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.7-7.3.2 b/plugins/python-build/share/python-build/pypy3.7-7.3.2 new file mode 100644 index 0000000..e8c5a49 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.7-7.3.2 @@ -0,0 +1,39 @@ +VERSION='7.3.2' +PYVER='3.7' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#34c7e1c7bd06e437ad43cc90a20f9444be1f0a264d0955e32098294c30274784" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux64" ) + install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#a285ddcbc909d68c648585fae4f33b0ba24961bb4e8fafe5874cf725d6e83df6" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux-aarch64" ) + install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#c5c35a37917f759c19e2a6b3df3b4d56298faa2fae83c143469bcbda42ca5dd2" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#337dd4d9e529d2f221e0beb092236c18430e0564ab835c6bba425a1daf7c9958" "pypy" "verify_py${PYVER//./}" ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win32" ) + install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#e3c589be07760bc3042981c379b7fd1603e832a4db426075f09e090473846a96" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.7-7.3.2-src b/plugins/python-build/share/python-build/pypy3.7-7.3.2-src new file mode 100644 index 0000000..b0beb7c --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.7-7.3.2-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "pypy3.7-v7.3.2-src" "https://downloads.python.org/pypy/pypy3.7-v7.3.2-src.tar.bz2#9274186eb0c28716a8c6134803b1df857bc3f496e25e50e605c4d95201c8817d" "pypy_builder" verify_py37 ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.7-7.3.3 b/plugins/python-build/share/python-build/pypy3.7-7.3.3 new file mode 100644 index 0000000..1b177cb --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.7-7.3.3 @@ -0,0 +1,39 @@ +VERSION='7.3.3' +PYVER='3.7' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#7d81b8e9fcd07c067cfe2f519ab770ec62928ee8787f952cadf2d2786246efc8" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux64" ) + install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#37e2804c4661c86c857d709d28c7de716b000d31e89766599fdf5a98928b7096" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux-aarch64" ) + install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#ee4aa041558b58de6063dd6df93b3def221c4ca4c900d6a9db5b1b52135703a8" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#d72b27d5bb60813273f14f07378a08822186a66e216c5d1a768ad295b582438d" "pypy" "verify_py${PYVER//./}" ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win32" ) + install_zip "pypy${PYVER}-v${VERSION}-win32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win32.zip#a282ce40aa4f853e877a5dbb38f0a586a29e563ae9ba82fd50c7e5dc465fb649" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.7-7.3.3-src b/plugins/python-build/share/python-build/pypy3.7-7.3.3-src new file mode 100644 index 0000000..1b8e6ab --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.7-7.3.3-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "pypy3.7-v7.3.3-src" "https://downloads.python.org/pypy/pypy3.7-v7.3.3-src.tar.bz2#f6c96401f76331e474cca2d14437eb3b2f68a0f27220a6dcbc537445fe9d5b78" "pypy_builder" verify_py37 ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.7-7.3.4 b/plugins/python-build/share/python-build/pypy3.7-7.3.4 new file mode 100644 index 0000000..57b4627 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.7-7.3.4 @@ -0,0 +1,39 @@ +VERSION='7.3.4' +PYVER='3.7' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#04de1a2e80530f3d74abcf133ec046a0fb12d81956bc043dee8ab4799f3b77eb" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux64" ) + install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#09d7298b44a38648a87995ec06e1e093761644e50f547c8bb0b2d7f4fe433548" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux-aarch64" ) + install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#a4148fa73b74a091e004e1f378b278c0b8830984cbcb91e10fa31fd915c43efe" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#8a4f0e6c7e3845820202bf7f46b48e36886ceb820ff0767963fd74091c4f5d13" "pypy" "verify_py${PYVER//./}" ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win64" ) + install_zip "pypy${PYVER}-v${VERSION}-win64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win64.zip#0ff4e4653f1ff0653f105680eb101c64c857fa8f828a54a61b02f65c94b5d262" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.7-7.3.4-src b/plugins/python-build/share/python-build/pypy3.7-7.3.4-src new file mode 100644 index 0000000..5eda9e3 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.7-7.3.4-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "pypy3.7-v7.3.4-src" "https://downloads.python.org/pypy/pypy3.7-v7.3.4-src.tar.bz2#74d3c1e79f3fc7d384ffb32d3d2a95c2d5f61b81091eccce12ac76030d96ad08" "pypy_builder" verify_py37 ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.7-7.3.5 b/plugins/python-build/share/python-build/pypy3.7-7.3.5 new file mode 100644 index 0000000..00289a0 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.7-7.3.5 @@ -0,0 +1,40 @@ +VERSION='7.3.5' +PYVER='3.7' + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#3dd8b565203d372829e53945c599296fa961895130342ea13791b17c84ed06c4" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux64" ) + install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#9000db3e87b54638e55177e68cbeb30a30fe5d17b6be48a9eb43d65b3ebcfc26" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux-aarch64" ) + install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#85d83093b3ef5b863f641bc4073d057cc98bb821e16aa9361a5ff4898e70e8ee" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#b3a7d3099ad83de7c267bb79ae609d5ce73b01800578ffd91ba7e221b13f80db" "pypy" "verify_py${PYVER//./}" ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"win64" ) + install_zip "pypy${PYVER}-v${VERSION}-win64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win64.zip#072bd22427178dc4e65d961f50281bd2f56e11c4e4d9f16311c703f69f46ae24" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac + diff --git a/plugins/python-build/share/python-build/pypy3.7-7.3.5-src b/plugins/python-build/share/python-build/pypy3.7-7.3.5-src new file mode 100644 index 0000000..a3ba97e --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.7-7.3.5-src @@ -0,0 +1,3 @@ +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "pypy3.7-v7.3.5-src" "https://downloads.python.org/pypy/pypy3.7-v7.3.5-src.tar.bz2#d920fe409a9ecad9d074aa8568ca5f3ed3581be66f66e5d8988b7ec66e6d99a2" "pypy_builder" verify_py37 ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.7-7.3.6 b/plugins/python-build/share/python-build/pypy3.7-7.3.6 new file mode 100644 index 0000000..53c471f --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.7-7.3.6 @@ -0,0 +1,43 @@ +VERSION='7.3.6' +PYVER='3.7' +# https://www.pypy.org/checksums.html + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#459e77c845b31fa9367f7b1b1122155f0ba7888b1d4ce4455c35d2111eeeb275" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux64" ) + install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#c41d07063b1d002a91ad2a0763b4baaca2b306ec635889c2e4826e706cc7f9ca" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux-aarch64" ) + install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#d446b6987eeaa03d706603863e83d6b99df69232cf1e06d3ee5706add6a84cd6" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#26f0c5c2a5f4a2ce35281d2fa760aa10715300dd110387eac43699a78ed32365" "pypy" "verify_py${PYVER//./}" ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"s390x" ) + install_package "pypy${PYVER}-v${VERSION}-s390x" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-s390x.tar.bz2#3659bf96a177a53426ffc38d3619c6ee307e600c80e924edc9cee604680c141d" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"win64" ) + install_zip "pypy${PYVER}-v${VERSION}-win64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win64.zip#341e69a369da5a1f4f69dbbd47e7dff5e745439b203e28c7afcf98308a24b003" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.7-7.3.6-src b/plugins/python-build/share/python-build/pypy3.7-7.3.6-src new file mode 100644 index 0000000..945f29e --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.7-7.3.6-src @@ -0,0 +1,6 @@ +VERSION='7.3.6' +PYVER='3.7' + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "pypy${PYVER}-v${VERSION}-src" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-src.tar.bz2#9252ccaa130094205b3c7f0a2cad5adc0d9dfba31658ff3172f788dec1fdb348" "pypy_builder" "verify_py${PYVER//./}" ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.7-7.3.7 b/plugins/python-build/share/python-build/pypy3.7-7.3.7 new file mode 100644 index 0000000..73dc42d --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.7-7.3.7 @@ -0,0 +1,43 @@ +VERSION='7.3.7' +PYVER='3.7' +# https://www.pypy.org/checksums.html + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#0ab9e2e8ae1ac463bb811b9d3ba24d138f41f7378c17ca9e2d8dee51bf151d19" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux64" ) + install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#8332f923755441fedfe4767a84601c94f4d6f8475384406cb5f259ad8d0b2002" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux-aarch64" ) + install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#a1a84882525dd574c4b051b66e9b7ef0e132392acc2f729420d7825f96835216" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#edc9df7d0f7c56f7ee05b24117bdb6c03aa65e768471e210c05ccdbbfd11a866" "pypy" "verify_py${PYVER//./}" ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"s390x" ) + install_package "pypy${PYVER}-v${VERSION}-s390x" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-s390x.tar.bz2#7f91efc65a69e727519cc885ca6351f4bfdd6b90580dced2fdcc9ae1bf10013b" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"win64" ) + install_zip "pypy${PYVER}-v${VERSION}-win64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win64.zip#53505dc0b57590290efd7656117ee5384bcd036f7f7c4f0bc3f5cd10299037d1" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.7-7.3.7-src b/plugins/python-build/share/python-build/pypy3.7-7.3.7-src new file mode 100644 index 0000000..c2faa3a --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.7-7.3.7-src @@ -0,0 +1,7 @@ +VERSION='7.3.7' +PYVER='3.7' +# https://www.pypy.org/checksums.html + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "pypy${PYVER}-v${VERSION}-src" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-src.tar.bz2#2ed02ac9e710859c41bc82deafb08619792bb9a27eeaa1676c741ededd214dd7" "pypy_builder" "verify_py${PYVER//./}" ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.7-7.3.8 b/plugins/python-build/share/python-build/pypy3.7-7.3.8 new file mode 100644 index 0000000..c6e964b --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.7-7.3.8 @@ -0,0 +1,81 @@ +VERSION='7.3.8' +PYVER='3.7' + +# https://www.pypy.org/checksums.html +aarch64_hash=4fb2f8281f3aaca72e6fe62ecc5fc054fcc79cd061ca3e0eea730f7d82d610d4 +linux32_hash=38429ec6ea1aca391821ee4fbda7358ae86de4600146643f2af2fe2c085af839 +linux64_hash=409085db79a6d90bfcf4f576dca1538498e65937acfbe03bd4909bdc262ff378 +osx64_hash=76b8eef5b059a7e478f525615482d2a6e9feb83375e3f63c16381d80521a693f +s390x_hash=5c2cd3f7cf04cb96f6bcc6b02e271f5d7275867763978e66651b8d1605ef3141 +win64_hash=96df67492bc8d62b2e71dddf5f6c58965a26cac9799c5f4081401af0494b3bcc + +### end of manual settings - following lines same for every download + +function pypy_pkg_data { + # pypy architecture + local ARCH="${1}" + + local basesrc="pypy${PYVER}-${VERSION}-src" + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local url="${baseurl}-${pkg}.tar.bz2" # use bz2 + local hash='' # undefined + + case "${pkg}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + url="${baseurl}-aarch64.tar.bz2" # diff url + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' # package name revised + url="${baseurl}-${pkg}.tar.bz2" # new url + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try '${basesrc}' to build from source." + echo + } >&2 + exit 1 + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + 'win64' ) + hash="${win64_hash}" + cmd='install_zip' # diff command + url="${baseurl}-${pkg}.zip" # zip rather than bz2 + ;; + * ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try '${basesrc}' to build from source." + echo + } >&2 + exit 1 + ;; + esac + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${url}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.7-7.3.8-src b/plugins/python-build/share/python-build/pypy3.7-7.3.8-src new file mode 100644 index 0000000..f120f5e --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.7-7.3.8-src @@ -0,0 +1,14 @@ +VERSION='7.3.8' +PYVER='3.7' + +# https://www.pypy.org/checksums.html +hash=35752be62b148fa6f7fb69e58e1f993c7cc319bea54928eb03ed2e75b8248d5f + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.7-7.3.9 b/plugins/python-build/share/python-build/pypy3.7-7.3.9 new file mode 100644 index 0000000..d38cff1 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.7-7.3.9 @@ -0,0 +1,81 @@ +VERSION='7.3.9' +PYVER='3.7' + +# https://www.pypy.org/checksums.html +aarch64_hash=dfc62f2c453fb851d10a1879c6e75c31ffebbf2a44d181bb06fcac4750d023fc +linux32_hash=3398cece0167b81baa219c9cd54a549443d8c0a6b553ec8ec13236281e0d86cd +linux64_hash=c58195124d807ecc527499ee19bc511ed753f4f2e418203ca51bc7e3b124d5d1 +osx64_hash=12d92f578a200d50959e55074b20f29f93c538943e9a6e6522df1a1cc9cef542 +s390x_hash=fcab3b9e110379948217cf592229542f53c33bfe881006f95ce30ac815a6df48 +win64_hash=8acb184b48fb3c854de0662e4d23a66b90e73b1ab73a86695022c12c745d8b00 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' # windows is always diff... + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH, windows has ext of zip + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + 'win64' ) + hash="${win64_hash}" + cmd='install_zip' # diff command + ext='zip' # zip rather than bz2 + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.7-7.3.9-src b/plugins/python-build/share/python-build/pypy3.7-7.3.9-src new file mode 100644 index 0000000..e48b458 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.7-7.3.9-src @@ -0,0 +1,14 @@ +VERSION='7.3.9' +PYVER='3.7' + +# https://www.pypy.org/checksums.html +hash=70426163b194ee46009986eea6d9426098a3ffb552d9cdbd3dfaa64a47373f49 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.7-c-jit-latest b/plugins/python-build/share/python-build/pypy3.7-c-jit-latest new file mode 100644 index 0000000..e1e7fe6 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.7-c-jit-latest @@ -0,0 +1,39 @@ +echo +colorize 1 "WARNING" +echo ": This may eat your kittens/ affect timespace in alternate dimensions/" +echo "cause you to complain more. Nightly builds are meant for testing only." +echo "Current pypy py3.7 development status:" +echo +echo "https://foss.heptapod.net/pypy/pypy/-/wikis/py3.7%20status" +echo +echo "for the latest status updates. To report bugs/regressions, please see:" +echo +echo "https://doc.pypy.org/en/latest/faq.html#how-should-i-report-a-bug" +echo + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_nightly_package "pypy-c-jit-latest-linux" "https://buildbot.pypy.org/nightly/py3.7/pypy-c-jit-latest-linux.tar.bz2" "pypy-c-jit-*-linux" "pypy" verify_py27 ensurepip + ;; +"linux64" ) + install_nightly_package "pypy3.7-c-jit-latest-linux64" "https://buildbot.pypy.org/nightly/py3.7/pypy-c-jit-latest-linux64.tar.bz2" "pypy-c-jit-*-linux64" "pypy" verify_py35 ensurepip + ;; +"linux-aarch64" ) + install_nightly_package "pypy3.7-c-jit-latest-aarch64" "https://buildbot.pypy.org/nightly/py3.7/pypy-c-jit-latest-aarch64.tar.bz2" "pypy-c-jit-*-aarch64" "pypy" verify_py35 ensurepip + ;; +"osx64" ) + install_nightly_package "pypy-c-jit-latest-osx64" "https://buildbot.pypy.org/nightly/py3.7/pypy-c-jit-latest-osx64.tar.bz2" "pypy-c-jit-*-osx64" "pypy" verify_py27 ensurepip + ;; +"win32" ) + install_zip "pypy-c-jit-latest-win32" "https://buildbot.pypy.org/nightly/py3.7/pypy-c-jit-latest-win32.zip" "pypy" verify_py27 ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The latest nightly build of PyPy 3.7 is not available for $(pypy_architecture 2>/dev/null || true)," + echo "Please check https://buildbot.pypy.org/nightly/py3.7/ for previous builds." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.8-7.3.10 b/plugins/python-build/share/python-build/pypy3.8-7.3.10 new file mode 100644 index 0000000..6877e30 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.8-7.3.10 @@ -0,0 +1,81 @@ +VERSION='7.3.10' +PYVER='3.8' + +# https://www.pypy.org/checksums.html +aarch64_hash=e4caa1a545f22cfee87d5b9aa6f8852347f223643ad7d2562e0b2a2f4663ad98 +linux32_hash=b70ed7fdc73a74ebdc04f07439f7bad1a849aaca95e26b4a74049d0e483f071c +linux64_hash=ceef6496fd4ab1c99e3ec22ce657b8f10f8bb77a32427fadfb5e1dd943806011 +osarm64_hash=6cb1429371e4854b718148a509d80143f801e3abfc72fef58d88aeeee1e98f9e +osx64_hash=399eb1ce4c65f62f6a096b7c273536601b7695e3c0dc0457393a659b95b7615b +s390x_hash=c294f8e815158388628fe77ac5b8ad6cd93c8db1359091fa02d41cf6da4d61a1 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.8-7.3.10-src b/plugins/python-build/share/python-build/pypy3.8-7.3.10-src new file mode 100644 index 0000000..5530b66 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.8-7.3.10-src @@ -0,0 +1,14 @@ +VERSION='7.3.10' +PYVER='3.8' + +# https://www.pypy.org/checksums.html +hash=218a1e062f17aba89f61bc398e8498f13c048b9fcf294343f5d9d56c3ac9b882 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.8-7.3.11 b/plugins/python-build/share/python-build/pypy3.8-7.3.11 new file mode 100644 index 0000000..9dc9108 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.8-7.3.11 @@ -0,0 +1,81 @@ +VERSION='7.3.11' +PYVER='3.8' + +# https://www.pypy.org/checksums.html +aarch64_hash=9a2fa0b8d92b7830aa31774a9a76129b0ff81afbd22cd5c41fbdd9119e859f55 +linux32_hash=a79b31fce8f5bc1f9940b6777134189a1d3d18bda4b1c830384cda90077c9176 +linux64_hash=470330e58ac105c094041aa07bb05676b06292bc61409e26f5c5593ebb2292d9 +osarm64_hash=78cdc79ff964c4bfd13eb45a7d43a011cbe8d8b513323d204891f703fdc4fa1a +osx64_hash=194ca0b4d91ae409a9cb1a59eb7572d7affa8a451ea3daf26539aa515443433a +s390x_hash=eab7734d86d96549866f1cba67f4f9c73c989f6a802248beebc504080d4c3fcd + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.8-7.3.11-src b/plugins/python-build/share/python-build/pypy3.8-7.3.11-src new file mode 100644 index 0000000..3dce018 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.8-7.3.11-src @@ -0,0 +1,14 @@ +VERSION='7.3.11' +PYVER='3.8' + +# https://www.pypy.org/checksums.html +hash=4d6769bfca73734e8666fd70503b7ceb06a6e259110e617331bb3899ca4e6058 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.8-7.3.6 b/plugins/python-build/share/python-build/pypy3.8-7.3.6 new file mode 100644 index 0000000..5f26156 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.8-7.3.6 @@ -0,0 +1,43 @@ +VERSION='7.3.6' +PYVER='3.8' +# https://www.pypy.org/checksums.html + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#e857a04a76285f0ef5bae84f6f5e9943ca415d499204c531b1c33fe8f015b48d" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux64" ) + install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#8579ea990e95d2b7e101ef47fd9ebf25a9500d5086e8f708c43f9bae83306ece" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux-aarch64" ) + install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#704d5303096e8a3173e73435f3bb204e31a8bf02ed5ba617a4a0f1e7491edf50" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#8195e52a20cf2a4f42c2d7e4969fbf44fe349c1f80f758e20525dd0f8c134bec" "pypy" "verify_py${PYVER//./}" ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"s390x" ) + install_package "pypy${PYVER}-v${VERSION}-s390x" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-s390x.zip#a36208d5e950ec4b630b33d0aede8ca3da383d973fc5ca387082c7e5bad8d245" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"win64" ) + install_zip "pypy${PYVER}-v${VERSION}-win64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win64.zip#1b216fd75f8f0a48633cc21dce7d6f25ba65016142df758842e1df661269b458" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.8-7.3.6-src b/plugins/python-build/share/python-build/pypy3.8-7.3.6-src new file mode 100644 index 0000000..238381c --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.8-7.3.6-src @@ -0,0 +1,7 @@ +VERSION='7.3.6' +PYVER='3.8' +# https://www.pypy.org/checksums.html + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "pypy${PYVER}-v${VERSION}-src" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-src.tar.bz2#f234c56eb0d4ab0afb196232fb38cd1ca8e19b1c65cf7b65eb691695499be259" "pypy_builder" "verify_py${PYVER//./}" ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.8-7.3.7 b/plugins/python-build/share/python-build/pypy3.8-7.3.7 new file mode 100644 index 0000000..dbc4683 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.8-7.3.7 @@ -0,0 +1,43 @@ +VERSION='7.3.7' +PYVER='3.8' +# https://www.pypy.org/checksums.html + +case "$(pypy_architecture 2>/dev/null || true)" in +"linux" ) + install_package "pypy${PYVER}-v${VERSION}-linux32" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux32.tar.bz2#dfb9d005f0fc917edc60fd618143e4934c412f9168b55166f5519ba0a3b1a835" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux64" ) + install_package "pypy${PYVER}-v${VERSION}-linux64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-linux64.tar.bz2#5dee37c7c3cb8b160028fbde3a5901c68043dfa545a16794502b897d4bc40d7e" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"linux-aarch64" ) + install_package "pypy${PYVER}-v${VERSION}-aarch64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-aarch64.tar.bz2#cbd44e0a9146b3c03a9d14b265774a848f387ed846316c3e984847e278d0efd3" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"osx64" ) + if require_osx_version "10.13"; then + install_package "pypy${PYVER}-v${VERSION}-osx64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-osx64.tar.bz2#1f044fe7bbdd443b7913ecf554683dab6dade5dcd7f47d4e6d01f4bb4cf84836" "pypy" "verify_py${PYVER//./}" ensurepip + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + fi + ;; +"s390x" ) + install_package "pypy${PYVER}-v${VERSION}-s390x" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-s390x.zip#ae7d6a76490b317a74b87788d596610c7ffd0ae2d3ffa2433d5bb5300f6b4b77" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +"win64" ) + install_zip "pypy${PYVER}-v${VERSION}-win64" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-win64.zip#8ceb03d2f7b73c6ce0758290bc42ba366a45c46e033eda36f1779d957a905735" "pypy" "verify_py${PYVER//./}" ensurepip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try 'pypy${PYVER}-${VERSION}-src' to build from source." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pypy3.8-7.3.7-src b/plugins/python-build/share/python-build/pypy3.8-7.3.7-src new file mode 100644 index 0000000..0d9fbd6 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.8-7.3.7-src @@ -0,0 +1,7 @@ +VERSION='7.3.7' +PYVER='3.8' +# https://www.pypy.org/checksums.html + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "pypy${PYVER}-v${VERSION}-src" "https://downloads.python.org/pypy/pypy${PYVER}-v${VERSION}-src.tar.bz2#21ae339f4f5016d6ca7300305f3e3b554373835cb3c39a9041fe30e6811c80c6" "pypy_builder" "verify_py${PYVER//./}" ensurepip diff --git a/plugins/python-build/share/python-build/pypy3.8-7.3.8 b/plugins/python-build/share/python-build/pypy3.8-7.3.8 new file mode 100644 index 0000000..2a4db0e --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.8-7.3.8 @@ -0,0 +1,81 @@ +VERSION='7.3.8' +PYVER='3.8' + +# https://www.pypy.org/checksums.html +aarch64_hash=fe41df391f87239925e573e195e631a9d03d37f471eb1479790ee13ca47a28af +linux32_hash=bea4b275decd492af6462157d293dd6fcf08a949859f8aec0959537b40afd032 +linux64_hash=089f8e3e357d6130815964ddd3507c13bd53e4976ccf0a89b5c36a9a6775a188 +osx64_hash=de1b283ff112d76395c0162a1cf11528e192bdc230ee3f1b237f7694c7518dee +s390x_hash=0c46527770ec1322b98942860ad3551767d3e09d4481bcb49abd92001a293840 +win64_hash=0894c468e7de758c509a602a28ef0ba4fbf197ccdf946c7853a7283d9bb2a345 + +### end of manual settings - following lines same for every download + +function pypy_pkg_data { + # pypy architecture + local ARCH="${1}" + + local basesrc="pypy${PYVER}-${VERSION}-src" + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local url="${baseurl}-${pkg}.tar.bz2" # use bz2 + local hash='' # undefined + + case "${pkg}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + url="${baseurl}-aarch64.tar.bz2" # diff url + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' # package name revised + url="${baseurl}-${pkg}.tar.bz2" # new url + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try '${basesrc}' to build from source." + echo + } >&2 + exit 1 + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + 'win64' ) + hash="${win64_hash}" + cmd='install_zip' # diff command + url="${baseurl}-${pkg}.zip" # zip rather than bz2 + ;; + * ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try '${basesrc}' to build from source." + echo + } >&2 + exit 1 + ;; + esac + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${url}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.8-7.3.8-src b/plugins/python-build/share/python-build/pypy3.8-7.3.8-src new file mode 100644 index 0000000..89c4c7c --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.8-7.3.8-src @@ -0,0 +1,14 @@ +VERSION='7.3.8' +PYVER='3.8' + +# https://www.pypy.org/checksums.html +hash=f1a378b264cdbfb0e03d77dfc4d105d02f91d542bd7c9c957d1f8083a9808f1f + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.8-7.3.9 b/plugins/python-build/share/python-build/pypy3.8-7.3.9 new file mode 100644 index 0000000..168a953 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.8-7.3.9 @@ -0,0 +1,81 @@ +VERSION='7.3.9' +PYVER='3.8' + +# https://www.pypy.org/checksums.html +aarch64_hash=5e124455e207425e80731dff317f0432fa0aba1f025845ffca813770e2447e32 +linux32_hash=4b261516c6c59078ab0c8bd7207327a1b97057b4ec1714ed5e79a026f9efd492 +linux64_hash=08be25ec82fc5d23b78563eda144923517daba481a90af0ace7a047c9c9a3c34 +osx64_hash=91a5c2c1facd5a4931a8682b7d792f7cf4f2ba25cd2e7e44e982139a6d5e4840 +s390x_hash=c6177a0016c9145c7b99fddb5d74cc2e518ccdb216a6deb51ef6a377510cc930 +win64_hash=05022baaa55db2b60880f2422312d9e4025e1267303ac57f33e8253559d0be88 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' # windows is always diff... + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH, windows has ext of zip + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + 'win64' ) + hash="${win64_hash}" + cmd='install_zip' # diff command + ext='zip' # zip rather than bz2 + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.8-7.3.9-src b/plugins/python-build/share/python-build/pypy3.8-7.3.9-src new file mode 100644 index 0000000..21d2bfe --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.8-7.3.9-src @@ -0,0 +1,14 @@ +VERSION='7.3.9' +PYVER='3.8' + +# https://www.pypy.org/checksums.html +hash=5b5d9d9256f12a129af8384e2f581bdfab3bc0fbbe3a0a480d9c1d2e95490eb1 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.10 b/plugins/python-build/share/python-build/pypy3.9-7.3.10 new file mode 100644 index 0000000..9810b2a --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.10 @@ -0,0 +1,81 @@ +VERSION='7.3.10' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +aarch64_hash=657a04fd9a5a992a2f116a9e7e9132ea0c578721f59139c9fb2083775f71e514 +linux32_hash=b6db59613b9a1c0c1ab87bc103f52ee95193423882dc8a848b68850b8ba59cc5 +linux64_hash=95cf99406179460d63ddbfe1ec870f889d05f7767ce81cef14b88a3a9e127266 +osarm64_hash=e2a6bec7408e6497c7de8165aa4a1b15e2416aec4a72f2578f793fb06859ccba +osx64_hash=f90c8619b41e68ec9ffd7d5e913fe02e60843da43d3735b1c1bc75bcfe638d97 +s390x_hash=ca6525a540cf0c682d1592ae35d3fbc97559a97260e4b789255cc76dde7a14f0 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.10-src b/plugins/python-build/share/python-build/pypy3.9-7.3.10-src new file mode 100644 index 0000000..ef4c5f3 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.10-src @@ -0,0 +1,14 @@ +VERSION='7.3.10' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +hash=3738d32575ed2513e3e66878e4e4c6c208caed267570f3f9f814748830002967 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.11 b/plugins/python-build/share/python-build/pypy3.9-7.3.11 new file mode 100644 index 0000000..800c0aa --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.11 @@ -0,0 +1,81 @@ +VERSION='7.3.11' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +aarch64_hash=09175dc652ed895d98e9ad63d216812bf3ee7e398d900a9bf9eb2906ba8302b9 +linux32_hash=0099d72c2897b229057bff7e2c343624aeabdc60d6fb43ca882bff082f1ffa48 +linux64_hash=d506172ca11071274175d74e9c581c3166432d0179b036470e3b9e8d20eae581 +osarm64_hash=91ad7500f1a39531dbefa0b345a3dcff927ff9971654e8d2e9ef7c5ae311f57e +osx64_hash=d33f40b207099872585afd71873575ca6ea638a27d823bc621238c5ae82542ed +s390x_hash=e1f30f2ddbe3f446ddacd79677b958d56c07463b20171fb2abf8f9a3178b79fc + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.11-src b/plugins/python-build/share/python-build/pypy3.9-7.3.11-src new file mode 100644 index 0000000..a5b4b3b --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.11-src @@ -0,0 +1,14 @@ +VERSION='7.3.11' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +hash=b0f3166fb2a5aadfd5ceb9db5cdd5f7929a0eccca02b4a26c0dae0492f7ca8ea + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.12 b/plugins/python-build/share/python-build/pypy3.9-7.3.12 new file mode 100644 index 0000000..0ff0a64 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.12 @@ -0,0 +1,81 @@ +VERSION='7.3.12' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +aarch64_hash=e9327fb9edaf2ad91935d5b8563ec5ff24193bddb175c1acaaf772c025af1824 +linux32_hash=aa04370d38f451683ccc817d76c2b3e0f471dbb879e0bd618d9affbdc9cd37a4 +linux64_hash=84c89b966fab2b58f451a482ee30ca7fec3350435bd0b9614615c61dc6da2390 +osarm64_hash=0e8a1a3468b9790c734ac698f5b00cc03fc16899ccc6ce876465fac0b83980e3 +osx64_hash=64f008ffa070c407e5ef46c8256b2e014de7196ea5d858385861254e7959f4eb +s390x_hash=20d84658a6899bdd2ca35b00ead33a2f56cff2c40dce1af630466d27952f6d4f + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.12-src b/plugins/python-build/share/python-build/pypy3.9-7.3.12-src new file mode 100644 index 0000000..ef5c784 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.12-src @@ -0,0 +1,14 @@ +VERSION='7.3.12' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +hash=e7a2046c7e6c25fc386abbb5132e92a7cc2491e3935699a946cb5dcbb342c2aa + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.13 b/plugins/python-build/share/python-build/pypy3.9-7.3.13 new file mode 100644 index 0000000..5614ebc --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.13 @@ -0,0 +1,81 @@ +VERSION='7.3.13' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +aarch64_hash=317d7876c5825a086f854253648b967a432b993ce87695d2895d3ad6ed0d2716 +linux32_hash=ac695238b4a3635ac6b482e74e04e2ea78b31acca0decd5de601dfd2f4ebf35a +linux64_hash=323b05a9f607e932cda1995cbe77a96e4ea35994631aa6d734c8035e8479b74e +osarm64_hash=a07b17a790a1952b551e69d47d77a5546ad5e666ed1bd90b9ad60baaca6aa51e +osx64_hash=180802aa0122d4a05ec480bf3130c78591ba88fdde25d8e65a92d4a798b318a3 +s390x_hash=213c88f652a99c4dc4e8e00b4b5b58f381c7f7e9ea1a9b65801fc0eb1e50df0a + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.13-src b/plugins/python-build/share/python-build/pypy3.9-7.3.13-src new file mode 100644 index 0000000..07ff989 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.13-src @@ -0,0 +1,14 @@ +VERSION='7.3.13' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +hash=bc6147268105e7cb3bd57b401e6d97f66aa4ede269104b2712a7cdd9f02f68cd + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.14 b/plugins/python-build/share/python-build/pypy3.9-7.3.14 new file mode 100644 index 0000000..340bcf5 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.14 @@ -0,0 +1,81 @@ +VERSION='7.3.14' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +aarch64_hash=14b842f32f60ce2d9d130971f9bcbdb6875824a0e78fac36806d267e0982179c +linux32_hash=4ad89a22369a6f2f83a7d8d047e0fc4cf5597f0921fa7afa23499ed05f663503 +linux64_hash=febd770a616641ca8419c381c7fb224e515b892551d0db49a1231397ed38859d +osarm64_hash=4f8f2464a743f855b8fc8bda7ce7994a674616db3b5c2c1955cd08502fa782ca +osx64_hash=0e2fea9b2dadb82b7acf05f21c0144f7bb1cfaaa39c693ab1eba4aef5ed52680 +s390x_hash=ba2451e9081db5bc724a05530a7f98817231de83ff6fdf15bad21a4e9b6dfeae + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.14-src b/plugins/python-build/share/python-build/pypy3.9-7.3.14-src new file mode 100644 index 0000000..e572a8f --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.14-src @@ -0,0 +1,14 @@ +VERSION='7.3.14' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +hash=560fe6161e159557e1fe612aaadf9b293eefded1da372e70b8e3b23bba598366 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.15 b/plugins/python-build/share/python-build/pypy3.9-7.3.15 new file mode 100644 index 0000000..2fbadb3 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.15 @@ -0,0 +1,81 @@ +VERSION='7.3.15' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +aarch64_hash=03e35fcba290454bb0ccf7ee57fb42d1e63108d10d593776a382c0a2fe355de0 +linux32_hash=c6209380977066c9e8b96e8258821c70f996004ce1bc8659ae83d4fd5a89ff5c +linux64_hash=f062be307200bde434817e1620cebc13f563d6ab25309442c5f4d0f0d68f0912 +osarm64_hash=300541c32125767a91b182b03d9cc4257f04971af32d747ecd4d62549d72acfd +osx64_hash=18ad7c9cb91c5e8ef9d40442b2fd1f6392ae113794c5b6b7d3a45e04f19edec6 +s390x_hash=deeb5e54c36a0fd9cfefd16e63a0d5bed4f4a43e6bbc01c23f0ed8f7f1c0aaf3 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.15-src b/plugins/python-build/share/python-build/pypy3.9-7.3.15-src new file mode 100644 index 0000000..510cc52 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.15-src @@ -0,0 +1,14 @@ +VERSION='7.3.15' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +hash=6bb9537d85aa7ad13c0aad2e41ff7fd55080bc9b4d1361b8f502df51db816e18 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.16 b/plugins/python-build/share/python-build/pypy3.9-7.3.16 new file mode 100644 index 0000000..afa539f --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.16 @@ -0,0 +1,81 @@ +VERSION='7.3.16' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +aarch64_hash=de3f2ed3581b30555ac0dd3e4df78a262ec736a36fb2e8f28259f8539b278ef4 +linux32_hash=583b6d6dd4e8c07cbc04da04a7ec2bdfa6674825289c2378c5e018d5abe779ea +linux64_hash=16f9c5b808c848516e742986e826b833cdbeda09ad8764e8704595adbe791b23 +osarm64_hash=88f824e7a2d676440d09bc90fc959ae0fd3557d7e2f14bfbbe53d41d159a47fe +osx64_hash=fda015431621e7e5aa16359d114f2c45a77ed936992c1efff86302e768a6b21c +s390x_hash=7a56ebb27dba3110dc1ff52d8e0449cdb37fe5c2275f7faf11432e4e164833ba + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.16-src b/plugins/python-build/share/python-build/pypy3.9-7.3.16-src new file mode 100644 index 0000000..b8c0cc6 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.16-src @@ -0,0 +1,14 @@ +VERSION='7.3.16' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +hash=5b75af3f8e76041e79c1ef5ce22ce63f8bd131733e9302081897d8f650e81843 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.8 b/plugins/python-build/share/python-build/pypy3.9-7.3.8 new file mode 100644 index 0000000..8d8c01e --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.8 @@ -0,0 +1,81 @@ +VERSION='7.3.8' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +aarch64_hash=89d7ee12a8c416e83fae80af82482531fc6502321e75e5b7a0cc01d756ee5f0e +linux32_hash=0894c468e7de758c509a602a28ef0ba4fbf197ccdf946c7853a7283d9bb2a345 +linux64_hash=129a055032bba700cd1d0acacab3659cf6b7180e25b1b2f730e792f06d5b3010 +osx64_hash=95bd88ac8d6372cd5b7b5393de7b7d5c615a0c6e42fdb1eb67f2d2d510965aee +s390x_hash=37b596bfe76707ead38ffb565629697e9b6fa24e722acc3c632b41ec624f5d95 +win64_hash=c1b2e4cde2dcd1208d41ef7b7df8e5c90564a521e7a5db431673da335a1ba697 + +### end of manual settings - following lines same for every download + +function pypy_pkg_data { + # pypy architecture + local ARCH="${1}" + + local basesrc="pypy${PYVER}-${VERSION}-src" + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local url="${baseurl}-${pkg}.tar.bz2" # use bz2 + local hash='' # undefined + + case "${pkg}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + url="${baseurl}-aarch64.tar.bz2" # diff url + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' # package name revised + url="${baseurl}-${pkg}.tar.bz2" # new url + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + else + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true), OS X < 10.13." + echo "try '${basesrc}' to build from source." + echo + } >&2 + exit 1 + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + 'win64' ) + hash="${win64_hash}" + cmd='install_zip' # diff command + url="${baseurl}-${pkg}.zip" # zip rather than bz2 + ;; + * ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for $(pypy_architecture 2>/dev/null || true)." + echo "try '${basesrc}' to build from source." + echo + } >&2 + exit 1 + ;; + esac + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${url}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.8-src b/plugins/python-build/share/python-build/pypy3.9-7.3.8-src new file mode 100644 index 0000000..ddd32e8 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.8-src @@ -0,0 +1,14 @@ +VERSION='7.3.8' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +hash=546b7fc3789728869d5ada7b6a95ce9d03047e8489b92ada84613c900e431ee9 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.9 b/plugins/python-build/share/python-build/pypy3.9-7.3.9 new file mode 100644 index 0000000..a59ee36 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.9 @@ -0,0 +1,81 @@ +VERSION='7.3.9' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +aarch64_hash=2e1ae193d98bc51439642a7618d521ea019f45b8fb226940f7e334c548d2b4b9 +linux32_hash=0de4b9501cf28524cdedcff5052deee9ea4630176a512bdc408edfa30914bae7 +linux64_hash=46818cb3d74b96b34787548343d266e2562b531ddbaf330383ba930ff1930ed5 +osx64_hash=59c8852168b2b1ba1f0211ff043c678760380d2f9faf2f95042a8878554dbc25 +s390x_hash=774dca83bcb4403fb99b3d155e7bd572ef8c52b9fe87a657109f64e75ad71732 +win64_hash=be48ab42f95c402543a7042c999c9433b17e55477c847612c8733a583ca6dff5 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' # windows is always diff... + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH, windows has ext of zip + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + 'win64' ) + hash="${win64_hash}" + cmd='install_zip' # diff command + ext='zip' # zip rather than bz2 + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.9-src b/plugins/python-build/share/python-build/pypy3.9-7.3.9-src new file mode 100644 index 0000000..1e3c8cd --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.9-src @@ -0,0 +1,14 @@ +VERSION='7.3.9' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +hash=2abaa1e9fe1ec0e233c9fbc377a0c8e9a0634080a8f4f30eb6898301f6618c12 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pyston-2.2 b/plugins/python-build/share/python-build/pyston-2.2 new file mode 100644 index 0000000..31a5c15 --- /dev/null +++ b/plugins/python-build/share/python-build/pyston-2.2 @@ -0,0 +1,19 @@ +echo +colorize 1 "WARNING" +echo ": Pyston only runs on x86_64 platforms, and only has been tested on Ubuntu" +echo "so, your mileage may vary with other Linux distributions." +echo + +case "$(pyston_architecture 2>/dev/null || true)" in +"linux64" ) + install_package "pyston_2.2" "https://github.com/pyston/pyston/releases/download/pyston_2.2/pyston_2.2_portable.tar.gz#d113cc4d1f6821c0f117f7a84978823d8ac751d7970fa7841eb994663ec5a59f" "pyston2_2" verify_py38 get_pip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": A Pyston 2.2 binary is not available for $(pyston_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pyston-2.3 b/plugins/python-build/share/python-build/pyston-2.3 new file mode 100644 index 0000000..25d5b41 --- /dev/null +++ b/plugins/python-build/share/python-build/pyston-2.3 @@ -0,0 +1,19 @@ +echo +colorize 1 "WARNING" +echo ": Pyston only runs on x86_64 platforms, and only has been tested on Ubuntu" +echo "so, your mileage may vary with other Linux distributions." +echo + +case "$(pyston_architecture 2>/dev/null || true)" in +"linux64" ) + install_package "pyston_2.3" "https://github.com/pyston/pyston/releases/download/v2.3/pyston_2.3_portable-v2.tar.gz#90185e29e4a1a19562c095f2bb4e81a5d0715150fa10eca363ec1188b5ba7ee7" "pyston2_2" verify_py38 get_pip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": A Pyston 2.3 binary is not available for $(pyston_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pyston-2.3.1 b/plugins/python-build/share/python-build/pyston-2.3.1 new file mode 100644 index 0000000..c6a4435 --- /dev/null +++ b/plugins/python-build/share/python-build/pyston-2.3.1 @@ -0,0 +1,19 @@ +echo +colorize 1 "WARNING" +echo ": Pyston only runs on x86_64 platforms, and only has been tested on Ubuntu" +echo "so, your mileage may vary with other Linux distributions." +echo + +case "$(pyston_architecture 2>/dev/null || true)" in +"linux64" ) + install_package "pyston_2.3.1" "https://github.com/pyston/pyston/releases/download/pyston_2.3.1/pyston_2.3.1_portable_v2.tar.gz#4e16df1eaf5f226c0629f2db1e63033454c94cb9e29f50154177819662df5b15" "pyston" verify_py38 get_pip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": A Pyston 2.3.1 binary is not available for $(pyston_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pyston-2.3.2 b/plugins/python-build/share/python-build/pyston-2.3.2 new file mode 100644 index 0000000..38717b5 --- /dev/null +++ b/plugins/python-build/share/python-build/pyston-2.3.2 @@ -0,0 +1,19 @@ +echo +colorize 1 "WARNING" +echo ": Pyston only runs on x86_64 platforms, and only has been tested on Ubuntu" +echo "so, your mileage may vary with other Linux distributions." +echo + +case "$(pyston_architecture 2>/dev/null || true)" in +"linux64" ) + install_package "pyston_2.3.2" "https://github.com/pyston/pyston/releases/download/pyston_2.3.2/pyston_2.3.2_portable.tar.gz#80e71dd2db504e09951ee835e04c9e1183c79412da9aa11d98a6d3f44b95bec1" "pyston" verify_py38 get_pip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": A Pyston 2.3.2 binary is not available for $(pyston_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pyston-2.3.3 b/plugins/python-build/share/python-build/pyston-2.3.3 new file mode 100644 index 0000000..ac20542 --- /dev/null +++ b/plugins/python-build/share/python-build/pyston-2.3.3 @@ -0,0 +1,16 @@ +case "$(pyston_architecture 2>/dev/null || true)" in +"linux64" ) + install_package "pyston_2.3.3_portable_amd64" "https://github.com/pyston/pyston/releases/download/pyston_2.3.3/pyston_2.3.3_portable_amd64.tar.gz#7a38e2bd2fed38e6daba4d513bae32af0d5ba6185cadf37cb1af6bcc4de0cb57" "pyston" verify_py38 get_pip + ;; +"linux-aarch64" ) + install_package "pyston_2.3.3_portable_arm64" "https://github.com/pyston/pyston/releases/download/pyston_2.3.3/pyston_2.3.3_portable_arm64.tar.gz#f93f55b59120f576e5755bd8f86fa38361a30ca5389dbadc68450051ee2dccb1" "pyston" verify_py38 get_pip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": A Pyston 2.3.3 binary is not available for $(pyston_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pyston-2.3.4 b/plugins/python-build/share/python-build/pyston-2.3.4 new file mode 100644 index 0000000..e61eb09 --- /dev/null +++ b/plugins/python-build/share/python-build/pyston-2.3.4 @@ -0,0 +1,23 @@ +# sha256sum used for checksum values + +# version of pyston +VER='2.3.4' +# alias for download location +DOWNLOAD='https://github.com/pyston/pyston/releases/download' + +case "$(pyston_architecture 2>/dev/null || true)" in +"linux64" ) + install_package "pyston_${VER}_portable_amd64" "${DOWNLOAD}/pyston_${VER}/pyston_${VER}_portable_amd64.tar.gz#f8274bdead746f839791d785a5edad8a0b8723016b38751321c8eaf16ebd22db" "pyston" verify_py38 get_pip + ;; +"linux-aarch64" ) + install_package "pyston_${VER}_portable_arm64" "${DOWNLOAD}/pyston_${VER}/pyston_${VER}_portable_arm64.tar.gz#0733d120562c73f129af5633f8ea7faad3fdcab931f2234c02cd81f21eada2cd" "pyston" verify_py38 get_pip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": A Pyston ${VER} binary is not available for $(pyston_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/pyston-2.3.5 b/plugins/python-build/share/python-build/pyston-2.3.5 new file mode 100644 index 0000000..caaac6b --- /dev/null +++ b/plugins/python-build/share/python-build/pyston-2.3.5 @@ -0,0 +1,23 @@ +# sha256sum used for checksum values + +# version of pyston +VER='2.3.5' +# alias for download location +DOWNLOAD='https://github.com/pyston/pyston/releases/download' + +case "$(pyston_architecture 2>/dev/null || true)" in +"linux64" ) + install_package "pyston_${VER}_portable_amd64" "${DOWNLOAD}/pyston_${VER}/pyston_${VER}_portable_amd64.tar.gz#c71c711d60a9c18f243a9e30fd35e0818674ae96f534c67c27b0cdfbc9132ef8" "pyston" verify_py38 get_pip + ;; +"linux-aarch64" ) + install_package "pyston_${VER}_portable_arm64" "${DOWNLOAD}/pyston_${VER}/pyston_${VER}_portable_arm64.tar.gz#c578cb806c62d9dca8728f190a87e172305bd80887e206df42c4c5658ab469c1" "pyston" verify_py38 get_pip + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": A Pyston ${VER} binary is not available for $(pyston_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/stackless-2.7-dev b/plugins/python-build/share/python-build/stackless-2.7-dev new file mode 100644 index 0000000..bad55dc --- /dev/null +++ b/plugins/python-build/share/python-build/stackless-2.7-dev @@ -0,0 +1,4 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_git "stackless-2.7-dev" "https://github.com/stackless-dev/stackless/" "2.7-slp" standard verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/stackless-2.7.10 b/plugins/python-build/share/python-build/stackless-2.7.10 new file mode 100644 index 0000000..599dba2 --- /dev/null +++ b/plugins/python-build/share/python-build/stackless-2.7.10 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "stackless-dev-stackless-b6b4c928e880" "http://www.stackless.com/binaries/stackless-2710-export.tar.xz#8af1318f95965138de51e290a509dc3d" standard verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/stackless-2.7.11 b/plugins/python-build/share/python-build/stackless-2.7.11 new file mode 100644 index 0000000..942263a --- /dev/null +++ b/plugins/python-build/share/python-build/stackless-2.7.11 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "stackless-dev-stackless-456e93659e69" "http://www.stackless.com/binaries/stackless-2711-export.tar.xz#d5229693498a4ccc0b3245f7bf8e2b09" standard verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/stackless-2.7.12 b/plugins/python-build/share/python-build/stackless-2.7.12 new file mode 100644 index 0000000..f1f222a --- /dev/null +++ b/plugins/python-build/share/python-build/stackless-2.7.12 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "stackless-dev-stackless-82aaa252fbdc" "http://www.stackless.com/binaries/stackless-2712-export.tar.xz#c610611b39ee374ae36e891c5c739f39" standard verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/stackless-2.7.14 b/plugins/python-build/share/python-build/stackless-2.7.14 new file mode 100644 index 0000000..67f37b9 --- /dev/null +++ b/plugins/python-build/share/python-build/stackless-2.7.14 @@ -0,0 +1,4 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "stackless-2.7.14-slp" "https://github.com/stackless-dev/stackless/archive/v2.7.14-slp.tar.gz#e67f60984d034bfd80fef58d26df9d5a1cdecb429c55ac7bc8d932cff6f88ab8" standard verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/stackless-2.7.16 b/plugins/python-build/share/python-build/stackless-2.7.16 new file mode 100644 index 0000000..a39d08e --- /dev/null +++ b/plugins/python-build/share/python-build/stackless-2.7.16 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "stackless-dev-stackless-43302de87df4" "http://www.stackless.com/binaries/stackless-2716-export.tar.xz#2db64fbd47567a1c0683fba7a54387892d2299915f9848b54c450b5eb95358dc" standard verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/stackless-2.7.2 b/plugins/python-build/share/python-build/stackless-2.7.2 new file mode 100644 index 0000000..159e81a --- /dev/null +++ b/plugins/python-build/share/python-build/stackless-2.7.2 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "stackless-272-export" "http://www.stackless.com/binaries/stackless-272-export.tar.bz2#e2e2706b22839e3e3f45085d0ec8030dd7374d8a65d3297981b7189a7c613197" standard verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/stackless-2.7.3 b/plugins/python-build/share/python-build/stackless-2.7.3 new file mode 100644 index 0000000..fff6977 --- /dev/null +++ b/plugins/python-build/share/python-build/stackless-2.7.3 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "stackless-273-export" "http://www.stackless.com/binaries/stackless-273-export.tar.bz2#77bee863bfd16dc4eca7fc078b12db608db7dd6e2481981bb68250118e001dfc" standard verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/stackless-2.7.4 b/plugins/python-build/share/python-build/stackless-2.7.4 new file mode 100644 index 0000000..8167972 --- /dev/null +++ b/plugins/python-build/share/python-build/stackless-2.7.4 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "stackless-274-export" "http://www.stackless.com/binaries/stackless-274-export.tar.bz2#ba566b18c66b095b65addbcfc4d814fc84f163c9fcffa1d0678755c581e64f45" standard verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/stackless-2.7.5 b/plugins/python-build/share/python-build/stackless-2.7.5 new file mode 100644 index 0000000..b6c8fba --- /dev/null +++ b/plugins/python-build/share/python-build/stackless-2.7.5 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "stackless-275-export" "http://www.stackless.com/binaries/stackless-275-export.tar.bz2#5a389357762b32c590e1154a86b098cc379c71d10238b458a3e9b4fa4aac60d4" standard verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/stackless-2.7.6 b/plugins/python-build/share/python-build/stackless-2.7.6 new file mode 100644 index 0000000..e7ce3d6 --- /dev/null +++ b/plugins/python-build/share/python-build/stackless-2.7.6 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "stackless-276-export" "http://www.stackless.com/binaries/stackless-276-export.tar.bz2#1e905deaf74e8922f49b99139aa48e6670e9456c55fec8e60c47501f78c38ff5" standard verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/stackless-2.7.7 b/plugins/python-build/share/python-build/stackless-2.7.7 new file mode 100644 index 0000000..2038004 --- /dev/null +++ b/plugins/python-build/share/python-build/stackless-2.7.7 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "stackless-dev-stackless-a182f63395c3" "http://www.stackless.com/binaries/stackless-277-export.tar.bz2#4ac0a1e95bc12d6733d9e7f3c221ec4a" standard verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/stackless-2.7.8 b/plugins/python-build/share/python-build/stackless-2.7.8 new file mode 100644 index 0000000..a0b6414 --- /dev/null +++ b/plugins/python-build/share/python-build/stackless-2.7.8 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "stackless-dev-stackless-ff29dd4f67de" "http://www.stackless.com/binaries/stackless-278-export.tar.bz2#2880f05e599020eb8f2624ce3796592b" standard verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/stackless-2.7.9 b/plugins/python-build/share/python-build/stackless-2.7.9 new file mode 100644 index 0000000..d668f7e --- /dev/null +++ b/plugins/python-build/share/python-build/stackless-2.7.9 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "stackless-dev-stackless-43302de87df4" "http://www.stackless.com/binaries/stackless-279-export.tar.xz#35307558796389aa51d96b0bc83f6f6f" standard verify_py27 ensurepip diff --git a/plugins/python-build/share/python-build/stackless-3.2.2 b/plugins/python-build/share/python-build/stackless-3.2.2 new file mode 100644 index 0000000..1ed5128 --- /dev/null +++ b/plugins/python-build/share/python-build/stackless-3.2.2 @@ -0,0 +1,5 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "stackless-322-export" "http://www.stackless.com/binaries/stackless-322-export.tar.bz2#779700f12b451a350fe7af4cd2849842adc7006dc83fe14712dd1a0999277b07" standard verify_py32 +install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python +install_package "pip-7.1.2" "https://pypi.python.org/packages/source/p/pip/pip-7.1.2.tar.gz#ca047986f0528cfa975a14fb9f7f106271d4e0c3fe1ddced6c1db2e7ae57a477" python diff --git a/plugins/python-build/share/python-build/stackless-3.2.5 b/plugins/python-build/share/python-build/stackless-3.2.5 new file mode 100644 index 0000000..569588e --- /dev/null +++ b/plugins/python-build/share/python-build/stackless-3.2.5 @@ -0,0 +1,5 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "stackless-325-export" "http://www.stackless.com/binaries/stackless-325-export.tar.bz2#b021125e578ddd267d38feee9e1cbdb675f6aab247a2b88f4494abcf23babb05" standard verify_py32 +install_package "setuptools-17.1.1" "https://pypi.python.org/packages/source/s/setuptools/setuptools-17.1.1.tar.gz#5bf42dbf406fd58a41029f53cffff1c90db5de1c5e0e560b5545cf2ec949c431" python +install_package "pip-7.1.2" "https://pypi.python.org/packages/source/p/pip/pip-7.1.2.tar.gz#ca047986f0528cfa975a14fb9f7f106271d4e0c3fe1ddced6c1db2e7ae57a477" python diff --git a/plugins/python-build/share/python-build/stackless-3.3.5 b/plugins/python-build/share/python-build/stackless-3.3.5 new file mode 100644 index 0000000..57c14a6 --- /dev/null +++ b/plugins/python-build/share/python-build/stackless-3.3.5 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "stackless-dev-stackless-c856cc204b1c" "http://www.stackless.com/binaries/stackless-335-export.tar.xz#d839295b932eb10443f2ddfecf2c25e9" standard verify_py33 ensurepip diff --git a/plugins/python-build/share/python-build/stackless-3.3.7 b/plugins/python-build/share/python-build/stackless-3.3.7 new file mode 100644 index 0000000..21f65b9 --- /dev/null +++ b/plugins/python-build/share/python-build/stackless-3.3.7 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "stackless-3.3.7-slp" "https://github.com/stackless-dev/stackless/archive/v3.3.7-slp.tar.gz#f05b8ff8a0e318aa5880dc995518ab4453894d068a26a171b89e21b98da5a5c1" standard verify_py33 ensurepip diff --git a/plugins/python-build/share/python-build/stackless-3.4-dev b/plugins/python-build/share/python-build/stackless-3.4-dev new file mode 100644 index 0000000..b704f95 --- /dev/null +++ b/plugins/python-build/share/python-build/stackless-3.4-dev @@ -0,0 +1,4 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_git "stackless-3.4-dev" "https://github.com/stackless-dev/stackless/" "3.4-slp" standard verify_py34 ensurepip diff --git a/plugins/python-build/share/python-build/stackless-3.4.2 b/plugins/python-build/share/python-build/stackless-3.4.2 new file mode 100644 index 0000000..908b57b --- /dev/null +++ b/plugins/python-build/share/python-build/stackless-3.4.2 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "stackless-dev-stackless-587417070fe4" "http://www.stackless.com/binaries/stackless-342-export.tar.xz#dd6ae57cc8a162690a24f21ce1f0c4d96e096c24e17137783bacc9182b96b6dc" standard verify_py34 ensurepip diff --git a/plugins/python-build/share/python-build/stackless-3.4.7 b/plugins/python-build/share/python-build/stackless-3.4.7 new file mode 100644 index 0000000..d79e4a8 --- /dev/null +++ b/plugins/python-build/share/python-build/stackless-3.4.7 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "stackless-3.4.7-slp" "https://github.com/stackless-dev/stackless/archive/v3.4.7-slp.tar.gz#e41959afcfc9381cbc9ac14c12110e3e748e65ceeec4fe61fb1c34cabcb9e6bf" standard verify_py34 ensurepip diff --git a/plugins/python-build/share/python-build/stackless-3.5.4 b/plugins/python-build/share/python-build/stackless-3.5.4 new file mode 100644 index 0000000..27b7dc8 --- /dev/null +++ b/plugins/python-build/share/python-build/stackless-3.5.4 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "stackless-3.5.4-slp" "https://github.com/stackless-dev/stackless/archive/v3.5.4-slp.tar.gz#ddb65a8118c754f66875f65c4d5d2a4937d67858ec8c361a6c5b386f5e4d9fce" standard verify_py35 ensurepip diff --git a/plugins/python-build/share/python-build/stackless-3.7.5 b/plugins/python-build/share/python-build/stackless-3.7.5 new file mode 100644 index 0000000..c804c8a --- /dev/null +++ b/plugins/python-build/share/python-build/stackless-3.7.5 @@ -0,0 +1,3 @@ +install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_package "stackless-3.7.5-slp" "https://github.com/stackless-dev/stackless/archive/v3.7.5-slp.tar.gz#e2562a8d235adc19be5451c170837f53ef916aec4cd5cd17d9e0ab1f1b875d3f" standard verify_py37 ensurepip diff --git a/plugins/python-build/share/python-build/stackless-dev b/plugins/python-build/share/python-build/stackless-dev new file mode 100644 index 0000000..03ba3ec --- /dev/null +++ b/plugins/python-build/share/python-build/stackless-dev @@ -0,0 +1,4 @@ +prefer_openssl11 +install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_git "stackless-dev" "https://github.com/stackless-dev/stackless/" "master-slp" standard verify_py35 ensurepip diff --git a/plugins/python-build/test/arguments.bats b/plugins/python-build/test/arguments.bats new file mode 100644 index 0000000..55dfeff --- /dev/null +++ b/plugins/python-build/test/arguments.bats @@ -0,0 +1,23 @@ +#!/usr/bin/env bats + +load test_helper + +@test "not enough arguments for python-build" { + # use empty inline definition so nothing gets built anyway + local definition="${BATS_TEST_TMPDIR}/build-definition" + echo '' > "$definition" + + run python-build "$definition" + assert_failure + assert_output_contains 'Usage: python-build' +} + +@test "extra arguments for python-build" { + # use empty inline definition so nothing gets built anyway + local definition="${BATS_TEST_TMPDIR}/build-definition" + echo '' > "$definition" + + run python-build "$definition" "${BATS_TEST_TMPDIR}/install" "" + assert_failure + assert_output_contains 'Usage: python-build' +} diff --git a/plugins/python-build/test/build.bats b/plugins/python-build/test/build.bats new file mode 100644 index 0000000..7d787ea --- /dev/null +++ b/plugins/python-build/test/build.bats @@ -0,0 +1,1305 @@ +#!/usr/bin/env bats + +load test_helper +_setup() { + export PYTHON_BUILD_CACHE_PATH="$BATS_TEST_TMPDIR/cache" + export MAKE=make + export MAKE_OPTS="-j 2" + export CC=cc + export -n PYTHON_CONFIGURE_OPTS + + mkdir -p "$INSTALL_ROOT" + stub md5 false + stub curl false +} + +executable() { + local file="$1" + mkdir -p "${file%/*}" + cat > "$file" + chmod +x "$file" +} + +cached_tarball() { + mkdir -p "$PYTHON_BUILD_CACHE_PATH" + pushd "$PYTHON_BUILD_CACHE_PATH" >/dev/null + tarball "$@" + popd >/dev/null +} + +tarball() { + local name="$1" + shift + local path="$PWD/$name" + local configure="$1" + if [[ ${configure:0:1} == "-" ]]; then configure=""; fi + configure="$path/${configure:-configure}" + shift || true + local extra_vars var_name + if [[ $# -gt 0 ]]; then + for var_name in "$@"; do + extra_vars="${extra_vars:+$extra_vars }$var_name=\$$var_name" + done + fi + + executable "$configure" <> build.log +echo "$name:" "\$@" \${PYTHONOPT:+PYTHONOPT=\$PYTHONOPT} >> build.log +${extra_vars:+echo $name: $extra_vars >>build.log} +OUT + + for file; do + mkdir -p "$(dirname "${path}/${file}")" + touch "${path}/${file}" + done + + tar czf "${path}.tar.gz" -C "${path%/*}" "$name" +} + +stub_make_install() { + stub "$MAKE" \ + " : echo \"$MAKE \$@\" >> build.log" \ + "${1:-install} : echo \"$MAKE \$@\" >> build.log && cat build.log >> '$INSTALL_ROOT/build.log'" +} + +assert_build_log() { + run cat "$INSTALL_ROOT/build.log" + assert_output +} + +stub_tcltk() { + local tcltk_prefix="${1:?}" + mkdir -p "$tcltk_prefix/lib" + cat >"$tcltk_prefix/lib/tclConfig.sh" <"$tcltk_prefix/lib/tkConfig.sh" <> build.log' + + TMPDIR="$BATS_TEST_TMPDIR" install_fixture --patch definitions/needs-yaml <<<"" + assert_success + + unstub uname + unstub make + unstub patch + + assert_build_log <> build.log' + + TMPDIR="$BATS_TEST_TMPDIR" install_fixture --patch definitions/needs-yaml <<<"diff --git a/script.py" + assert_success + + unstub uname + unstub make + unstub patch + + assert_build_log <>"$tcl_tk_libdir/lib/tclConfig.sh" <>"$tcl_tk_libdir/lib/tclConfig.sh" <> build.log' + stub_make_install + + export PYTHON_CONFIGURE="${BATS_TEST_TMPDIR}/custom-configure" + run_inline_definition <&2; echo 4.2.1' + + run_inline_definition < ./configure < "${BATS_TEST_TMPDIR}/definitions/2.7.8-test" + mkdir -p "${BATS_TEST_TMPDIR}/other" + echo false > "${BATS_TEST_TMPDIR}/other/2.7.8-test" + run python-build "2.7.8-test" "${BATS_TEST_TMPDIR}/install" + assert_success "" +} + +@test "installing nonexistent definition" { + run python-build "nonexistent" "${BATS_TEST_TMPDIR}/install" + assert [ "$status" -eq 2 ] + assert_output "python-build: definition not found: nonexistent" +} + +@test "sorting Python versions" { + export PYTHON_BUILD_ROOT="$BATS_TEST_TMPDIR" + mkdir -p "${PYTHON_BUILD_ROOT}/share/python-build" + expected="2.7-dev +2.7 +2.7.1 +2.7.2 +2.7.3 +3.4.0 +3.4-dev +3.4.1 +3.4.2 +jython-dev +jython-2.5.0 +jython-2.5-dev +jython-2.5.1 +jython-2.5.2 +jython-2.5.3 +jython-2.5.4-rc1 +jython-2.7-beta1 +jython-2.7-beta2 +jython-2.7-beta3" + while IFS=$'\n' read -r ver; do + touch "${PYTHON_BUILD_ROOT}/share/python-build/$ver" + done <<<"$expected" + run python-build --definitions + assert_success "$expected" +} + +@test "removing duplicate Python versions" { + export PYTHON_BUILD_ROOT="$BATS_TEST_TMPDIR" + export PYTHON_BUILD_DEFINITIONS="${PYTHON_BUILD_ROOT}/share/python-build" + mkdir -p "$PYTHON_BUILD_DEFINITIONS" + touch "${PYTHON_BUILD_DEFINITIONS}/2.7.8" + touch "${PYTHON_BUILD_DEFINITIONS}/3.4.2" + + run python-build --definitions + assert_success + assert_output < http://example.com/packages/package-1.0.0.tar.gz" + assert_output_contains "error: failed to download package-1.0.0.tar.gz" +} + +@test "using aria2c if available" { + export PYTHON_BUILD_ARIA2_OPTS= + export -n PYTHON_BUILD_HTTP_CLIENT + stub aria2c "--allow-overwrite=true --no-conf=true -d * -o * http://example.com/* : cp $FIXTURE_ROOT/\${7##*/} \$6" + + install_fixture definitions/without-checksum + assert_success + assert_output < http://example.com/packages/package-1.0.0.tar.gz +Installing package-1.0.0... +Installed package-1.0.0 to ${BATS_TEST_TMPDIR}/install +OUT + unstub aria2c +} + +@test "fetching from git repository" { + stub git "clone --depth 1 --branch master http://example.com/packages/package.git package-dev : mkdir package-dev" + + run_inline_definition <V*n@s0Fj|-^#A|> literal 0 HcmV?d00001 diff --git a/plugins/python-build/test/hooks.bats b/plugins/python-build/test/hooks.bats new file mode 100644 index 0000000..3ad7c92 --- /dev/null +++ b/plugins/python-build/test/hooks.bats @@ -0,0 +1,94 @@ +#!/usr/bin/env bats + +load test_helper + +_setup() { + export PYENV_ROOT="${BATS_TEST_TMPDIR}/pyenv" + export HOOK_PATH="${BATS_TEST_TMPDIR}/i has hooks" + mkdir -p "$HOOK_PATH" +} + +@test "pyenv-install hooks" { + cat > "${HOOK_PATH}/install.bash" < "$definition" <<<"echo python-build" + run pyenv-install "$definition" + + assert_success + assert_output <<-OUT +before: ${PYENV_ROOT}/versions/3.6.2 +python-build +after: 0 +rehashed +OUT +} + +@test "pyenv-uninstall hooks" { + cat > "${HOOK_PATH}/uninstall.bash" < "${HOOK_PATH}/uninstall.bash" <&2 + + assert_success + assert [ -x "${INSTALL_ROOT}/bin/package" ] + + unstub curl + unstub shasum +} + + +@test "package URL with checksum but no shasum support bypasses mirror" { + stub shasum false + stub curl "-q -o * -*S* http://example.com/* : cp $FIXTURE_ROOT/\${5##*/} \$3" + + install_fixture definitions/with-checksum + + assert_success + assert [ -x "${INSTALL_ROOT}/bin/package" ] + + unstub curl + unstub shasum +} + + +@test "package URL with checksum hits mirror first" { + local checksum="ba988b1bb4250dee0b9dd3d4d722f9c64b2bacfc805d1b6eba7426bda72dd3c5" + local mirror_url="${PYTHON_BUILD_MIRROR_URL}/$checksum" + + stub shasum true "echo $checksum" + stub curl "-*I* $mirror_url : true" \ + "-q -o * -*S* $mirror_url : cp $FIXTURE_ROOT/package-1.0.0.tar.gz \$3" + + install_fixture definitions/with-checksum + + assert_success + assert [ -x "${INSTALL_ROOT}/bin/package" ] + + unstub curl + unstub shasum +} + + +@test "package is fetched from original URL if mirror download fails" { + local checksum="ba988b1bb4250dee0b9dd3d4d722f9c64b2bacfc805d1b6eba7426bda72dd3c5" + local mirror_url="${PYTHON_BUILD_MIRROR_URL}/$checksum" + + stub shasum true "echo $checksum" + stub curl "-*I* $mirror_url : false" \ + "-q -o * -*S* http://example.com/* : cp $FIXTURE_ROOT/\${5##*/} \$3" + + install_fixture definitions/with-checksum + + assert_success + assert [ -x "${INSTALL_ROOT}/bin/package" ] + + unstub curl + unstub shasum +} + +@test "package is fetched from mirror when checksum is invalid if SKIP_CHECKSUM set" { + export PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM=1 + export PYTHON_BUILD_MIRROR_URL=https://custom.mirror.org + export URL_BASE=example.com + local checksum="ba988b1bb4250dee0b9dd3d4d722f9c64b2bacfc805d1b6eba7426bda72dd3c5" + + stub shasum false + stub curl "-*I* : true" \ + "-q -o * -*S* https://custom.mirror.org/* : cp $FIXTURE_ROOT/package-1.0.0.tar.gz \$3" \ + + install_fixture definitions/with-checksum + + assert_success + assert [ -x "${INSTALL_ROOT}/bin/package" ] + + unstub curl + unstub shasum + unset PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM +} + + +@test "package is fetched from original URL if mirror download checksum is invalid" { + local checksum="ba988b1bb4250dee0b9dd3d4d722f9c64b2bacfc805d1b6eba7426bda72dd3c5" + local mirror_url="${PYTHON_BUILD_MIRROR_URL}/$checksum" + + stub shasum true "echo invalid" "echo $checksum" + stub curl "-*I* $mirror_url : true" \ + "-q -o * -*S* $mirror_url : cp $FIXTURE_ROOT/package-1.0.0.tar.gz \$3" \ + "-q -o * -*S* http://example.com/* : cp $FIXTURE_ROOT/\${5##*/} \$3" + + install_fixture definitions/with-checksum + echo "$output" >&2 + + assert_success + assert [ -x "${INSTALL_ROOT}/bin/package" ] + + unstub curl + unstub shasum +} + + +@test "default mirror URL" { + export PYTHON_BUILD_MIRROR_URL= + local checksum="ba988b1bb4250dee0b9dd3d4d722f9c64b2bacfc805d1b6eba7426bda72dd3c5" + + stub shasum true "echo $checksum" + stub curl "-*I* : true" \ + "-q -o * -*S* https://?*/$checksum : cp $FIXTURE_ROOT/package-1.0.0.tar.gz \$3" \ + + install_fixture definitions/with-checksum + + assert_success + assert [ -x "${INSTALL_ROOT}/bin/package" ] + + unstub curl + unstub shasum +} + + +@test "package URL with ruby-lang CDN with default mirror URL will bypasses mirror" { + export PYTHON_BUILD_MIRROR_URL= + local checksum="ba988b1bb4250dee0b9dd3d4d722f9c64b2bacfc805d1b6eba7426bda72dd3c5" + + stub shasum true "echo $checksum" + stub curl "-q -o * -*S* https://www.python.org/* : cp $FIXTURE_ROOT/\${5##*/} \$3" + + run_inline_definition <&2 && exit 2' + stub_python_build "--definitions : echo 2.6.9 2.7.9-rc1 2.7.9-rc2 3.4.2 | tr ' ' $'\\n'" + + mkdir "$BATS_TEST_TMPDIR/.git" + #Faking the Pyenv installation prefix may break things. + # May have to move some dependent stuff into the fake root for the code to find it + # or introduce an overriding test variable in the code specifically for the hint. + _PYENV_INSTALL_PREFIX="$BATS_TEST_TMPDIR" run pyenv-install 2.7.9 + assert_failure + assert_output <&2 && exit 2' \ + "--definitions : true" + + _PYENV_INSTALL_PREFIX="$BATS_TEST_TMPDIR" run pyenv-install 1.9.3 + assert_failure + assert_output < "$file" + chmod +x "$file" +} + +cached_tarball() { + mkdir -p "$PYTHON_BUILD_CACHE_PATH" + pushd "$PYTHON_BUILD_CACHE_PATH" >/dev/null + tarball "$@" + popd >/dev/null +} + +tarball() { + local name="$1" + local path="$PWD/$name" + local configure="$path/configure" + shift 1 + + executable "$configure" <> build.log +echo "$name: \$@" \${PYTHONOPT:+PYTHONOPT=\$PYTHONOPT} >> build.log +OUT + + for file; do + mkdir -p "$(dirname "${path}/${file}")" + touch "${path}/${file}" + done + + tar czf "${path}.tar.gz" -C "${path%/*}" "$name" +} + +stub_make_install() { + stub "$MAKE" \ + " : echo \"$MAKE \$@\" >> build.log" \ + "install : echo \"$MAKE \$@\" >> build.log && cat build.log >> '$INSTALL_ROOT/build.log'" +} + +assert_build_log() { + run cat "$INSTALL_ROOT/build.log" + assert_output +} + +install_patch() { + local name="$1" + local patch="$2" + [ -n "$patch" ] || patch="python.patch" + + mkdir -p "${TMP_FIXTURES}/${name%/*}/patches/${name##*/}/${patch%/*}" + cat > "${TMP_FIXTURES}/${name%/*}/patches/${name##*/}/${patch}" +} + +install_tmp_fixture() { + local args + + while [ "${1#-}" != "$1" ]; do + args="$args $1" + shift 1 + done + + local name="$1" + local destination="$2" + [ -n "$destination" ] || destination="$INSTALL_ROOT" + + # Copy fixture to temporary path + mkdir -p "${TMP_FIXTURES}/${name%/*}" + cp "${FIXTURE_ROOT}/${name}" "${TMP_FIXTURES}/${name}" + + run python-build $args "$TMP_FIXTURES/$name" "$destination" +} + +resolve_link() { + $(type -P greadlink readlink | head -n1) "$1" +} + +run_inline_definition_with_name() { + local definition_name="build-definition" + case "$1" in + "--name="* ) + local definition_name="${1#--name=}" + shift 1 + ;; + esac + local definition="${BATS_TEST_TMPDIR}/${definition_name}" + cat > "$definition" + run python-build "$definition" "${1:-$INSTALL_ROOT}" +} + +@test "apply built-in python patch before building" { + cached_tarball "Python-3.6.2" + + stub brew false + stub_make_install + stub patch ' : echo patch "$@" | sed -E "s/\.[[:alnum:]]+$/.XXX/" >> build.log' + + echo | install_patch definitions/vanilla-python "Python-3.6.2/empty.patch" + + # yyuu/pyenv#257 + stub uname '-s : echo Linux' + stub uname '-s : echo Linux' + + TMPDIR="$BATS_TEST_TMPDIR" install_tmp_fixture definitions/vanilla-python < /dev/null + assert_success + + assert_build_log <> build.log' + + echo "foo" | install_patch definitions/vanilla-python "Python-3.6.2/foo.patch" + echo "bar" | install_patch definitions/vanilla-python "Python-3.6.2/bar.patch" + echo "baz" | install_patch definitions/vanilla-python "Python-3.6.2/baz.patch" + + stub uname '-s : echo Linux' + + TMPDIR="$BATS_TEST_TMPDIR" install_tmp_fixture definitions/vanilla-python < /dev/null + assert_success + + assert_build_log <> build.log" \ + " : echo \"$MAKE \$@\" >> build.log && cat build.log >> '$INSTALL_ROOT/build.log'" + + stub uname '-s : echo Darwin' + + PYTHON_MAKE_INSTALL_TARGET="altinstall" TMPDIR="$BATS_TEST_TMPDIR" install_tmp_fixture definitions/vanilla-python < /dev/null + assert_success + + assert_build_log < "${INSTALL_ROOT}/bin/python" +#!$BASH +echo "python \$@" >> "${INSTALL_ROOT}/build.log" +OUT + chmod +x "${INSTALL_ROOT}/bin/python" + + PYTHON_MAKE_INSTALL_TARGET="" TMPDIR="$BATS_TEST_TMPDIR" run_inline_definition < "${INSTALL_ROOT}/bin/python" +#!$BASH +echo "python \$@" >> "${INSTALL_ROOT}/build.log" +OUT + chmod +x "${INSTALL_ROOT}/bin/python" + + PYTHON_MAKE_INSTALL_TARGET="altinstall" TMPDIR="$BATS_TEST_TMPDIR" run_inline_definition <> build.log" \ + " : echo \"$MAKE \$@\" >> build.log && cat build.log >> '$INSTALL_ROOT/build.log'" + + PYTHON_CONFIGURE_OPTS="--enable-unicode=ucs2" TMPDIR="$BATS_TEST_TMPDIR" install_tmp_fixture definitions/vanilla-python < /dev/null + assert_success + + assert_build_log <>"${!_STUB_LOG}"; fi + +[ -e "${!_STUB_PLAN}" ] || exit 1 +[ -n "${!_STUB_RUN}" ] || eval "${_STUB_RUN}"="${BATS_TEST_TMPDIR}/${program}-stub-run" + + +# Initialize or load the stub run information. +eval "${_STUB_INDEX}"=1 +eval "${_STUB_RESULT}"=0 +if test -e "${!_STUB_RUN}"; then source "${!_STUB_RUN}"; fi + + +# Loop over each line in the plan. +index=0 +while IFS= read -r line; do + index=$(($index + 1)) + + if [ -z "${!_STUB_END}" ] && [ $index -eq "${!_STUB_INDEX}" ]; then + # We found the plan line we're interested in. + # Start off by assuming success. + result=0 + + # Split the line into an array of arguments to + # match and a command to run to produce output. + command=" $line" + if [ "$command" != "${command/ : }" ]; then + patterns="${command%% : *}" + command="${command#* : }" + fi + + # Naively split patterns by whitespace for now. + # In the future, use a sed script to split while + # respecting quoting. + set -f + patterns=($patterns) + set +f + arguments=("$@") + + # Match the expected argument patterns to actual + # arguments. + for (( i=0; i<${#patterns[@]}; i++ )); do + pattern="${patterns[$i]}" + argument="${arguments[$i]}" + + case "$argument" in + $pattern ) ;; + * ) result=1 ;; + esac + done + + # If the arguments matched, evaluate the command + # in a subshell. Otherwise, log the failure. + if [ $result -eq 0 ] ; then + set +e + ( eval "$command" ) + status="$?" + set -e + else + eval "${_STUB_RESULT}"=1 + fi + fi +done < "${!_STUB_PLAN}" + + +if [ -n "${!_STUB_END}" ]; then + # If the number of lines in the plan is larger than + # the requested index, we failed. + if [ $index -ge "${!_STUB_INDEX}" ]; then + eval "${_STUB_RESULT}"=1 + fi + if [ "${!_STUB_RESULT}" -ne 0 ]; then + { + echo "index: $index; stub index: ${!_STUB_INDEX}" + echo "plan:" + cat "${!_STUB_PLAN}" || true + echo "run:" + cat "${!_STUB_RUN}" || true + echo "log:" + cat "${!_STUB_LOG}" || true + } >&2 + fi + + # Clean up the run file. + rm -f "${!_STUB_RUN}" + rm -f "${!_STUB_LOG}" + + # Return the result. + exit "${!_STUB_RESULT}" + +else + # If the requested index is larger than the number + # of lines in the plan file, we failed. + if [ "${!_STUB_INDEX}" -gt $index ]; then + eval "${_STUB_RESULT}"=1 + fi + + # Write out the run information. + { echo "${_STUB_INDEX}=$((${!_STUB_INDEX} + 1))" + echo "${_STUB_RESULT}=${!_STUB_RESULT}" + } > "${!_STUB_RUN}" + + exit "$status" + +fi diff --git a/plugins/python-build/test/test_helper.bash b/plugins/python-build/test/test_helper.bash new file mode 100644 index 0000000..82321e5 --- /dev/null +++ b/plugins/python-build/test/test_helper.bash @@ -0,0 +1,164 @@ +setup() { + export PYTHON_BUILD_CURL_OPTS= + export PYTHON_BUILD_HTTP_CLIENT="curl" + + export FIXTURE_ROOT="${BATS_TEST_DIRNAME}/fixtures" + export INSTALL_ROOT="${BATS_TEST_TMPDIR}/install" + PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin" + PATH="${BATS_TEST_DIRNAME}/../bin:$PATH" + PATH="${BATS_TEST_TMPDIR}/bin:$PATH" + export PATH + + # If test specific setup exist, run it + if [[ $(type -t _setup) == function ]];then + _setup + fi +} + +stub() { + local program="$1" + local prefix="$(echo "$program" | tr a-z- A-Z_)" + shift + + export "${prefix}_STUB_PLAN"="${BATS_TEST_TMPDIR}/${program}-stub-plan" + export "${prefix}_STUB_RUN"="${BATS_TEST_TMPDIR}/${program}-stub-run" + export "${prefix}_STUB_LOG"="${BATS_TEST_TMPDIR}/${program}-stub-log" + export "${prefix}_STUB_END"= + + mkdir -p "${BATS_TEST_TMPDIR}/bin" + cp "${BATS_TEST_DIRNAME}/stubs/stub" "${BATS_TEST_TMPDIR}/bin/${program}" + + touch "${BATS_TEST_TMPDIR}/${program}-stub-plan" + for arg in "$@"; do printf "%s\n" "$arg" >> "${BATS_TEST_TMPDIR}/${program}-stub-plan"; done +} + +unstub() { + local program="$1" + local prefix="$(echo "$program" | tr a-z- A-Z_)" + local path="${BATS_TEST_TMPDIR}/bin/${program}" + + export "${prefix}_STUB_END"=1 + + local STATUS=0 + "$path" || STATUS="$?" + + rm -f "$path" + rm -f "${BATS_TEST_TMPDIR}/${program}-stub-plan" "${BATS_TEST_TMPDIR}/${program}-stub-run" + return "$STATUS" +} + +run_inline_definition() { + local definition="${BATS_TEST_TMPDIR}/build-definition" + cat > "$definition" + run python-build "$definition" "${1:-$INSTALL_ROOT}" +} + +install_fixture() { + local args + + while [ "${1#-}" != "$1" ]; do + args="$args $1" + shift 1 + done + + local name="$1" + local destination="$2" + [ -n "$destination" ] || destination="$INSTALL_ROOT" + + run python-build $args "$FIXTURE_ROOT/$name" "$destination" +} + +assert() { + if ! "$@"; then + flunk "failed: $@" + fi +} + +refute() { + if "$@"; then + flunk "expected to fail: $@" + fi +} + +flunk() { + { if [ "$#" -eq 0 ]; then cat - + else echo "$@" + fi + } | sed "s:${BATS_TEST_TMPDIR}:\${BATS_TEST_TMPDIR}:g" >&2 + return 1 +} + +assert_success() { + if [ "$status" -ne 0 ]; then + { echo "command failed with exit status $status" + echo "output: $output" + } | flunk + elif [ "$#" -gt 0 ]; then + assert_output "$1" + fi +} + +assert_failure() { + if [ "$status" -eq 0 ]; then + flunk "expected failed exit status" + elif [ "$#" -gt 0 ]; then + assert_output "$1" + fi +} + +assert_equal() { + if [ "$1" != "$2" ]; then + { echo "expected:" + echo "$1" + echo "actual:" + echo "$2" + } | flunk + fi +} + +assert_output() { + local expected + if [ $# -eq 0 ]; then expected="$(cat -)" + else expected="$1" + fi + assert_equal "$expected" "$output" +} + +assert_output_contains() { + local expected="$1" + if [ -z "$expected" ]; then + echo "assert_output_contains needs an argument" >&2 + return 1 + fi + echo "$output" | $(type -P ggrep grep | head -n1) -F "$expected" >/dev/null || { + { echo "expected output to contain $expected" + echo "actual: $output" + } | flunk + } +} + +# Output a modified PATH that ensures that the given executable is not present, +# but in which system utils necessary for pyenv operation are still available. +path_without() { + local path=":${PATH}:" + for exe; do + local found alt util + for found in $(PATH="$path" type -aP "$exe"); do + found="${found%/*}" + if [ "$found" != "${PYENV_ROOT}/shims" ]; then + alt="${PYENV_TEST_DIR}/$(echo "${found#/}" | tr '/' '-')" + mkdir -p "$alt" + for util in bash head cut readlink greadlink; do + if [ -x "${found}/$util" ]; then + ln -s "${found}/$util" "${alt}/$util" + fi + done + path="${path/:${found}:/:${alt}:}" + fi + done + done + path="${path#:}" + path="${path%:}" + echo "$path" +} + diff --git a/plugins/python-build/test/version.bats b/plugins/python-build/test/version.bats new file mode 100644 index 0000000..8c9fc77 --- /dev/null +++ b/plugins/python-build/test/version.bats @@ -0,0 +1,38 @@ +#!/usr/bin/env bats + +load test_helper + +python_build_bin="${BATS_TEST_DIRNAME}/../bin/python-build" +static_version="$(grep VERSION "$python_build_bin" | head -n1 | cut -d'"' -f 2)" + +@test "python-build static version" { + stub git 'echo "ASPLODE" >&2; exit 1' + run python-build --version + assert_success "python-build ${static_version}" + unstub git +} + +@test "python-build git version" { + stub git \ + 'remote -v : echo origin https://github.com/pyenv/pyenv.git' \ + "describe --tags HEAD : echo v1984-12-gSHA" + run python-build --version + assert_success "python-build 1984-12-gSHA" + unstub git +} + +@test "git describe fails" { + stub git \ + 'remote -v : echo origin https://github.com/pyenv/pyenv.git' \ + "describe --tags HEAD : echo ASPLODE >&2; exit 1" + run python-build --version + assert_success "python-build ${static_version}" + unstub git +} + +@test "git remote doesn't match" { + stub git \ + 'remote -v : echo origin https://github.com/Homebrew/homebrew.git' + run python-build --version + assert_success "python-build ${static_version}" +} diff --git a/pyenv.d/exec/pip-rehash.bash b/pyenv.d/exec/pip-rehash.bash new file mode 100644 index 0000000..4f0f37b --- /dev/null +++ b/pyenv.d/exec/pip-rehash.bash @@ -0,0 +1,16 @@ +PYENV_PIP_REHASH_ROOT="${BASH_SOURCE[0]%/*}/pip-rehash" +PYENV_REHASH_COMMAND="${PYENV_COMMAND##*/}" + +# Remove any version information, from e.g. "pip2" or "pip3.10". +if [[ $PYENV_REHASH_COMMAND =~ ^(pip|easy_install)[23](\.[0-9]+)?$ ]]; then + PYENV_REHASH_COMMAND="${BASH_REMATCH[1]}" +# Check for ` -m pip ` in arguments +elif [[ "$*" =~ [[:space:]]-m[[:space:]]pip[[:space:]] ]]; then + PYENV_REHASH_COMMAND="pip" +fi + +if [ -x "${PYENV_PIP_REHASH_ROOT}/${PYENV_REHASH_COMMAND}" ]; then + PYENV_COMMAND_PATH="${PYENV_PIP_REHASH_ROOT}/${PYENV_REHASH_COMMAND##*/}" + PYENV_BIN_PATH="${PYENV_PIP_REHASH_ROOT}" + export PYENV_REHASH_REAL_COMMAND="${PYENV_COMMAND##*/}" +fi diff --git a/pyenv.d/exec/pip-rehash/conda b/pyenv.d/exec/pip-rehash/conda new file mode 100755 index 0000000..ee5aefe --- /dev/null +++ b/pyenv.d/exec/pip-rehash/conda @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +# Remove pyenv-pip-rehash/libexec from PATH to avoid infinite loops in `pyenv-which` (yyuu/pyenv#146) +_PATH=":${PATH}:" +_HERE="$(dirname "${BASH_SOURCE[0]}")" # remove this from PATH +_PATH="${_PATH//:${_HERE}:/:}" +_PATH="${_PATH#:}" +_PATH="${_PATH%:}" +PATH="${_PATH}" + +PYENV_COMMAND_PATH="$(pyenv-which "${PYENV_REHASH_REAL_COMMAND}")" +PYENV_BIN_PATH="${PYENV_COMMAND_PATH%/*}" + +export PATH="${PYENV_BIN_PATH}:${PATH}" + +STATUS=0 +"$PYENV_COMMAND_PATH" "$@" || STATUS="$?" + +# Run `pyenv-rehash` after a successful installation. +if [ "$STATUS" == "0" ]; then + case "$1" in + "install" | "remove" | "uninstall") pyenv-rehash;; + esac +fi + +exit "$STATUS" diff --git a/pyenv.d/exec/pip-rehash/easy_install b/pyenv.d/exec/pip-rehash/easy_install new file mode 100755 index 0000000..cf559dc --- /dev/null +++ b/pyenv.d/exec/pip-rehash/easy_install @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +# Remove pyenv-pip-rehash/libexec from PATH to avoid infinite loops in `pyenv-which` (yyuu/pyenv#146) +_PATH=":${PATH}:" +_HERE="$(dirname "${BASH_SOURCE[0]}")" # remove this from PATH +_PATH="${_PATH//:${_HERE}:/:}" +_PATH="${_PATH#:}" +_PATH="${_PATH%:}" +PATH="${_PATH}" + +PYENV_COMMAND_PATH="$(pyenv-which "${PYENV_REHASH_REAL_COMMAND}")" +PYENV_BIN_PATH="${PYENV_COMMAND_PATH%/*}" + +export PATH="${PYENV_BIN_PATH}:${PATH}" + +STATUS=0 +"$PYENV_COMMAND_PATH" "$@" || STATUS="$?" + +# Run `pyenv-rehash` after a successful installation. +if [ "$STATUS" == "0" ]; then + pyenv-rehash +fi + +exit "$STATUS" diff --git a/pyenv.d/exec/pip-rehash/pip b/pyenv.d/exec/pip-rehash/pip new file mode 100755 index 0000000..1d30593 --- /dev/null +++ b/pyenv.d/exec/pip-rehash/pip @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +set -e +[ -n "$PYENV_DEBUG" ] && set -x + +# Remove pyenv-pip-rehash/libexec from PATH to avoid infinite loops in `pyenv-which` (yyuu/pyenv#146) +_PATH=":${PATH}:" +_HERE="$(dirname "${BASH_SOURCE[0]}")" # remove this from PATH +_PATH="${_PATH//:${_HERE}:/:}" +_PATH="${_PATH#:}" +_PATH="${_PATH%:}" +PATH="${_PATH}" + +PYENV_COMMAND_PATH="$(pyenv-which "${PYENV_REHASH_REAL_COMMAND}")" +PYENV_BIN_PATH="${PYENV_COMMAND_PATH%/*}" + +export PATH="${PYENV_BIN_PATH}:${PATH}" + +STATUS=0 +"$PYENV_COMMAND_PATH" "$@" || STATUS="$?" + +# Run `pyenv-rehash` after a successful installation. +if [ "$STATUS" == "0" ]; then + for piparg in "$@"; do + case ${piparg} in + "install" | "uninstall" ) pyenv-rehash ; break;; + esac + done +fi + +exit "$STATUS" diff --git a/pyenv.d/install/latest.bash b/pyenv.d/install/latest.bash new file mode 100644 index 0000000..c99162b --- /dev/null +++ b/pyenv.d/install/latest.bash @@ -0,0 +1,25 @@ +pyenv_install_resolve_latest() { + local DEFINITION_PREFIX DEFINITION_TYPE + local -a DEFINITION_CANDIDATES + local DEFINITION="$1" + + DEFINITION_PREFIX="${DEFINITION%%:*}" + DEFINITION_TYPE="${DEFINITION_PREFIX%%-*}" # TODO: support non-CPython versions + if [[ "${DEFINITION}" != "${DEFINITION_PREFIX}" ]]; then + DEFINITION_CANDIDATES=(\ + $(python-build --definitions | \ + grep -F "${DEFINITION_PREFIX}" | \ + grep "^${DEFINITION_TYPE}" | \ + sed -E -e '/-dev$/d' -e '/-src$/d' -e '/(b|rc)[0-9]+$/d' -e '/[0-9]+t$/d' | \ + sort -t. -k1,1r -k 2,2nr -k 3,3nr \ + || true)) + DEFINITION="${DEFINITION_CANDIDATES}" + fi + echo "$DEFINITION" +} + +for i in ${!DEFINITIONS[*]}; do + DEFINITIONS[$i]="$(pyenv_install_resolve_latest "${DEFINITIONS[$i]}")" +done + +unset pyenv_install_resolve_latest diff --git a/pyenv.d/rehash/conda.bash b/pyenv.d/rehash/conda.bash new file mode 100644 index 0000000..ab17ca1 --- /dev/null +++ b/pyenv.d/rehash/conda.bash @@ -0,0 +1,72 @@ +# Anaconda comes with binaries of system packages (e.g. `openssl`, `curl`). +# Creating shims for those binaries will prevent pyenv users to run those +# commands normally when not using Anaconda. +# +# This hooks is intended to skip creating shims for those executables. + +conda_exists() { + shopt -s dotglob nullglob + local condas=($(echo "${PYENV_ROOT}/versions/"*"/bin/conda" "${PYENV_ROOT}/versions/"*"/envs/"*"/bin/conda")) + shopt -u dotglob nullglob + [ -n "${condas}" ] +} + +if conda_exists; then + + # Reads the list of `blacklisted` conda binaries + # from `conda.d/default.list` and creates a function + # `conda_shim` to skip creating shims for those binaries. + build_conda_exclusion_list() { + shims=() + for shim in $(sed 's/#.*$//; /^[[:space:]]*$/d' "${BASH_SOURCE%/*}/conda.d/default.list"); do + if [ -n "${shim##*/}" ]; then + shims[${#shims[*]}]="${shim})return 0;;" + fi + done + eval \ +"conda_shim() { + case \"\${1##*/}\" in + ${shims[@]} + *) return 1;; + esac +}" + } + + # override `make_shims` to avoid conflict between pyenv-virtualenv's `envs.bash` + # https://github.com/pyenv/pyenv-virtualenv/blob/v20160716/etc/pyenv.d/rehash/envs.bash + # The only difference between this `make_shims` and the `make_shims` defined + # in `libexec/pyenv-rehash` is that this one calls `conda_shim` to check + # if shim is blacklisted. If blacklisted -> skip creating shim. + make_shims() { + local file shim + for file do + shim="${file##*/}" + if ! conda_shim "${shim}" 1>&2; then + register_shim "$shim" + fi + done + } + + deregister_conda_shims() { + # adapted for Bash 4.x's associative array (#1749) + if declare -p registered_shims 2> /dev/null | grep -Eq '^(declare|typeset) -A'; then + for shim in ${!registered_shims[*]}; do + if conda_shim "${shim}" 1>&2; then + unset registered_shims[${shim}] + fi + done + else + local shim + local shims=() + for shim in ${registered_shims}; do + if ! conda_shim "${shim}" 1>&2; then + shims[${#shims[*]}]="${shim}" + fi + done + registered_shims=" ${shims[@]} " + fi + } + + build_conda_exclusion_list + deregister_conda_shims +fi diff --git a/pyenv.d/rehash/conda.d/.gitignore b/pyenv.d/rehash/conda.d/.gitignore new file mode 100644 index 0000000..655d89c --- /dev/null +++ b/pyenv.d/rehash/conda.d/.gitignore @@ -0,0 +1,3 @@ +* +!/.gitignore +!/default.list diff --git a/pyenv.d/rehash/conda.d/default.list b/pyenv.d/rehash/conda.d/default.list new file mode 100644 index 0000000..3c906b4 --- /dev/null +++ b/pyenv.d/rehash/conda.d/default.list @@ -0,0 +1,195 @@ +bunzip2 +clear +# curl +curl +curl-config +# fontconfig +fc-cache +fc-cat +fc-list +fc-match +fc-pattern +fc-query +fc-scan +fc-validate +# freetype +freetype-config +# libglib2.0-bin +gapplication +gdbus +gresource +gsettings +gio-querymodules +glib-compile-resources +glib-compile-schemas +infocmp +# libpng +libpng-config +# libxml2 +xml2-config +# libxml2-utils +xmlcatalog +xmllint +# ncurses +tput +# openssl +openssl +# qtchooser +assistant +designer +lconvert +linguist +lrelease +lupdate +moc +pixeltool +qcollectiongenerator +qdbus +qdbuscpp2xml +qdbusviewer +qdbusxml2cpp +qhelpconverter +qhelpgenerator +qmake +qmlplugindump +qmlviewer +qtconfig +rcc +uic +xmlpatterns +xmlpatternsvalidator +# redis +redis-benchmark +redis-check-aof +redis-check-dump +redis-cli +redis-server +# sed +sed +# sqlite3 +sqlite3 +# xslt-config +xslt-config +# xsltproc +xsltproc +# xz +unxz +xz +xzcat +xzcmd +xzdiff +xzegrep +xzfgrep +xzgrep +xzless +xzmore +reset +# --- start exclusions from coreutils +[ +b2sum +base32 +base64 +basename +basenc +cat +chcon +chgrp +chmod +chown +chroot +cksum +comm +cp +csplit +cut +date +dd +df +dir +dircolors +dirname +du +echo +env +expand +expr +factor +false +fmt +fold +greadlink +groups +head +hostid +id +install +join +kill +link +ln +logname +ls +md5sum +mkdir +mkfifo +mknod +mktemp +mv +nice +nl +nohup +nproc +numfmt +od +paste +pathchk +pinky +pr +printenv +printf +ptx +pwd +readlink +realpath +rm +rmdir +runcon +seq +sha1sum +sha224sum +sha256sum +sha384sum +sha512sum +shred +shuf +sleep +sort +split +stat +stdbuf +stty +sum +sync +tac +tail +tee +test +timeout +touch +tr +true +truncate +tsort +tty +uname +unexpand +uniq +unlink +uptime +users +vdir +wc +who +whoami +yes +# --- end exclusions from coreutils \ No newline at end of file diff --git a/pyenv.d/rehash/source.bash b/pyenv.d/rehash/source.bash new file mode 100644 index 0000000..8e38fb4 --- /dev/null +++ b/pyenv.d/rehash/source.bash @@ -0,0 +1,31 @@ +PROTOTYPE_SOURCE_SHIM_PATH="${SHIM_PATH}/.pyenv-source-shim" + +shims=() +shopt -s nullglob +for shim in $(sort -u "${BASH_SOURCE%/*}/source.d/"*".list" | sed -e 's/#.*$//' -e '/^[[:space:]]*$/d'); do + if [ -n "${shim##*/}" ]; then + shims[${#shims[*]}]="${shim})return 0;;" + fi +done +shopt -u nullglob +eval "source_shim(){ case \"\${1##*/}\" in ${shims[@]} *)return 1;;esac;}" + +cat > "${PROTOTYPE_SOURCE_SHIM_PATH}" </dev/null; then + CC=gcc + else + echo "warning: gcc not found; using CC=cc" >&2 + CC=cc + fi +fi + +if ! type -p "$CC" >/dev/null; then + echo "aborted: compiler not found: $CC" >&2 + exit 1 +fi + +case "$(uname -s)" in +Darwin* ) + host_os="darwin$(uname -r)" + ;; +FreeBSD* ) + host_os="freebsd$(uname -r)" + ;; +OpenBSD* ) + host_os="openbsd$(uname -r)" + ;; +* ) + host_os="linux-gnu" +esac + +eval "$("$src_dir"/shobj-conf -C "$CC" -o "$host_os")" + +sed " + s#@CC@#${CC}# + s#@CFLAGS@#${CFLAGS}# + s#@LOCAL_CFLAGS@#${LOCAL_CFLAGS}# + s#@DEFS@#${DEFS}# + s#@LOCAL_DEFS@#${LOCAL_DEFS}# + s#@SHOBJ_CC@#${SHOBJ_CC}# + s#@SHOBJ_CFLAGS@#${SHOBJ_CFLAGS}# + s#@SHOBJ_LD@#${SHOBJ_LD}# + s#@SHOBJ_LDFLAGS@#${SHOBJ_LDFLAGS}# + s#@SHOBJ_XLDFLAGS@#${SHOBJ_XLDFLAGS}# + s#@SHOBJ_LIBS@#${SHOBJ_LIBS}# + s#@SHOBJ_STATUS@#${SHOBJ_STATUS}# +" "$src_dir"/Makefile.in > "$src_dir"/Makefile diff --git a/src/realpath.c b/src/realpath.c new file mode 100644 index 0000000..6c0c9f3 --- /dev/null +++ b/src/realpath.c @@ -0,0 +1,43 @@ +#include "bash.h" +#include +#include + +int realpath_builtin(list) +WORD_LIST *list; +{ + int es; + char *realbuf, *p; + + if (list == 0) { + // builtin_usage(); + return (EX_USAGE); + } + + for (es = EXECUTION_SUCCESS; list; list = list->next) { + p = list->word->word; + realbuf = realpath(p, NULL); + if (realbuf == NULL) { + es = EXECUTION_FAILURE; + // builtin_error("%s: cannot resolve: %s", p, strerror(errno)); + } else { + printf("%s\n", realbuf); + free(realbuf); + } + } + return es; +} + +char *realpath_doc[] = { + "Display each PATHNAME argument, resolving symbolic links. The exit status", + "is 0 if each PATHNAME was resolved; non-zero otherwise.", + (char *)NULL +}; + +struct builtin realpath_struct = { + "realpath", + realpath_builtin, + BUILTIN_ENABLED, + realpath_doc, + "realpath pathname [pathname...]", + 0 +}; diff --git a/src/shobj-conf b/src/shobj-conf new file mode 100755 index 0000000..1f64433 --- /dev/null +++ b/src/shobj-conf @@ -0,0 +1,594 @@ +#! /bin/sh +# +# shobj-conf -- output a series of variable assignments to be substituted +# into a Makefile by configure which specify system-dependent +# information for creating shared objects that may be loaded +# into bash with `enable -f' +# +# usage: shobj-conf [-C compiler] -c host_cpu -o host_os -v host_vendor +# +# Chet Ramey +# chet@po.cwru.edu + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# +# This file is part of GNU Bash, the Bourne Again SHell. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# +# defaults +# +SHOBJ_STATUS=supported +SHLIB_STATUS=supported + +SHOBJ_CC=cc +SHOBJ_CFLAGS= +SHOBJ_LD= +SHOBJ_LDFLAGS= +SHOBJ_XLDFLAGS= +SHOBJ_LIBS= + +SHLIB_XLDFLAGS= +SHLIB_LIBS= + +SHLIB_DOT='.' +SHLIB_LIBPREF='lib' +SHLIB_LIBSUFF='so' + +SHLIB_LIBVERSION='$(SHLIB_LIBSUFF)' +SHLIB_DLLVERSION='$(SHLIB_MAJOR)' + +PROGNAME=`basename $0` +USAGE="$PROGNAME [-C compiler] -c host_cpu -o host_os -v host_vendor" + +while [ $# -gt 0 ]; do + case "$1" in + -C) shift; SHOBJ_CC="$1"; shift ;; + -c) shift; host_cpu="$1"; shift ;; + -o) shift; host_os="$1"; shift ;; + -v) shift; host_vendor="$1"; shift ;; + *) echo "$USAGE" >&2 ; exit 2;; + esac +done + +case "${host_os}-${SHOBJ_CC}-${host_vendor}" in +nsk-cc-tandem) + SHOBJ_CFLAGS=-Wglobalized + case `uname -m` in + NSR*) + SHOBJ_CFLAGS="${SHOBJ_CFLAGS} -Wcall_shared" # default on TNS/E, needed on TNS/R + SHOBJ_LD=/usr/bin/ld # for TNS/R + ;; + NSE*|NEO*) + SHOBJ_LD=/usr/bin/eld + ;; + esac + SHOBJ_LDFLAGS='-shared -bglobalized -unres_symbols ignore' + ;; + +sunos4*-*gcc*) + SHOBJ_CFLAGS=-fpic + SHOBJ_LD=/usr/bin/ld + SHOBJ_LDFLAGS='-assert pure-text' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' + ;; + +sunos4*) + SHOBJ_CFLAGS=-pic + SHOBJ_LD=/usr/bin/ld + SHOBJ_LDFLAGS='-assert pure-text' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' + ;; + +sunos5*-*gcc*|solaris2*-*gcc*) + SHOBJ_LD='${CC}' + ld_used=`gcc -print-prog-name=ld` + if ${ld_used} -V 2>&1 | grep GNU >/dev/null 2>&1; then + # This line works for the GNU ld + SHOBJ_LDFLAGS='-shared -Wl,-h,$@' + # http://sourceware.org/ml/binutils/2001-08/msg00361.html + SHOBJ_CFLAGS=-fPIC + else + # This line works for the Solaris linker in /usr/ccs/bin/ld + SHOBJ_LDFLAGS='-shared -Wl,-i -Wl,-h,$@' + SHOBJ_CFLAGS=-fpic + fi + +# SHLIB_XLDFLAGS='-R $(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sunos5*|solaris2*) + SHOBJ_CFLAGS='-K pic' + SHOBJ_LD=/usr/ccs/bin/ld + SHOBJ_LDFLAGS='-G -dy -z text -i -h $@' + +# SHLIB_XLDFLAGS='-R $(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +# All versions of Linux (including Gentoo/FreeBSD) or the semi-mythical GNU Hurd. +linux*-*|gnu*-*|k*bsd*-gnu-*|freebsd*-gentoo) + SHOBJ_CFLAGS=-fPIC + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' + + SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir) -Wl,-soname,`basename $@ $(SHLIB_MINOR)`' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' + ;; + +freebsd2*) + SHOBJ_CFLAGS=-fpic + SHOBJ_LD=ld + SHOBJ_LDFLAGS='-x -Bshareable' + + SHLIB_XLDFLAGS='-R$(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' + ;; + +# FreeBSD-3.x ELF +freebsd3*|freebsdaout*) + SHOBJ_CFLAGS=-fPIC + SHOBJ_LD='${CC}' + + if [ -x /usr/bin/objformat ] && [ "`/usr/bin/objformat`" = "elf" ]; then + SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' + + SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + else + SHOBJ_LDFLAGS='-shared' + + SHLIB_XLDFLAGS='-R$(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' + fi + ;; + +# FreeBSD-4.x and later have only ELF +freebsd[4-9]*|freebsd1[0-9]*|freebsdelf*|dragonfly*) + SHOBJ_CFLAGS=-fPIC + SHOBJ_LD='${CC}' + + SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' + SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir)' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +# Darwin/MacOS X +darwin*) + # Common definitions for all darwin/mac os x versions + SHOBJ_CFLAGS='-fno-common' + + SHOBJ_LD='${CC}' + + SHLIB_LIBVERSION='$(SHLIB_MAJOR)$(SHLIB_MINOR).$(SHLIB_LIBSUFF)' + SHLIB_LIBSUFF='dylib' + + # unused at this time + SHLIB_SONAME='$(libdir)/`echo $@ | sed "s:\\..*::"`.$(SHLIB_MAJOR).$(SHLIB_LIBSUFF)' + + case "${host_os}" in + # Darwin versions 1, 5, 6, 7 correspond to Mac OS X 10.0, 10.1, 10.2, + # and 10.3, respectively. + darwin[1-7].*) + SHOBJ_STATUS=unsupported + SHOBJ_LDFLAGS='-dynamic' + SHLIB_XLDFLAGS='-arch_only `/usr/bin/arch` -install_name $(libdir)/`echo $@ | sed "s:\\..*::"`.$(SHLIB_MAJOR).$(SHLIB_LIBSUFF) -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v' + ;; + # Darwin 8 == Mac OS X 10.4; Mac OS X 10.N == Darwin N+4 + *) + case "${host_os}" in + darwin[89]*|darwin1[012]*) + SHOBJ_ARCHFLAGS='-arch_only `/usr/bin/arch`' + ;; + *) # Mac OS X 10.9 (Mavericks) and later + SHOBJ_ARCHFLAGS= + # for 32 and 64bit universal library + #SHOBJ_ARCHFLAGS='-arch i386 -arch x86_64' + #SHOBJ_CFLAGS=${SHOBJ_CFLAGS}' -arch i386 -arch x86_64' + ;; + esac + SHOBJ_LDFLAGS="-dynamiclib -dynamic -undefined dynamic_lookup ${SHOBJ_ARCHFLAGS}" + SHLIB_XLDFLAGS="-dynamiclib ${SHOBJ_ARCHFLAGS}"' -install_name $(libdir)/`echo $@ | sed "s:\\..*::"`.$(SHLIB_MAJOR).$(SHLIB_LIBSUFF) -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v' + ;; + esac + + SHLIB_LIBS='-lncurses' # see if -lcurses works on MacOS X 10.1 + ;; + +openbsd*|netbsd*|mirbsd*) + SHOBJ_CFLAGS=-fPIC + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared' + + SHLIB_XLDFLAGS='-R$(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' + ;; + +bsdi2*) + SHOBJ_CC=shlicc2 + SHOBJ_CFLAGS= + SHOBJ_LD=ld + SHOBJ_LDFLAGS=-r + SHOBJ_LIBS=-lc_s.2.1.0 + + # BSD/OS 2.x and 3.x `shared libraries' are too much of a pain in + # the ass -- they require changing {/usr/lib,etc}/shlib.map on + # each system, and the library creation process is byzantine + SHLIB_STATUS=unsupported + ;; + +bsdi3*) + SHOBJ_CC=shlicc2 + SHOBJ_CFLAGS= + SHOBJ_LD=ld + SHOBJ_LDFLAGS=-r + SHOBJ_LIBS=-lc_s.3.0.0 + + # BSD/OS 2.x and 3.x `shared libraries' are too much of a pain in + # the ass -- they require changing {/usr/lib,etc}/shlib.map on + # each system, and the library creation process is byzantine + SHLIB_STATUS=unsupported + ;; + +bsdi4*) + # BSD/OS 4.x now supports ELF and SunOS-style dynamically-linked + # shared libraries. gcc 2.x is the standard compiler, and the + # `normal' gcc options should work as they do in Linux. + + SHOBJ_CFLAGS=-fPIC + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' + + SHLIB_XLDFLAGS='-Wl,-soname,`basename $@ $(SHLIB_MINOR)`' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)$(SHLIB_MINOR)' + ;; + +osf*-*gcc*) + # Fix to use gcc linker driver from bfischer@TechFak.Uni-Bielefeld.DE + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' + + SHLIB_XLDFLAGS='-rpath $(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +osf*) + SHOBJ_LD=ld + SHOBJ_LDFLAGS='-shared -soname $@ -expect_unresolved "*"' + + SHLIB_XLDFLAGS='-rpath $(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +aix4.[2-9]*-*gcc*|aix[5-9].*-*gcc*) # lightly tested by jik@cisco.com + SHOBJ_CFLAGS=-fpic + SHOBJ_LD='ld' + SHOBJ_LDFLAGS='-bdynamic -bnoentry -bexpall' + SHOBJ_XLDFLAGS='-G' + + SHLIB_XLDFLAGS='-bM:SRE' + SHLIB_LIBS='-lcurses -lc' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +aix4.[2-9]*|aix[5-9].*) + SHOBJ_CFLAGS=-K + SHOBJ_LD='ld' + SHOBJ_LDFLAGS='-bdynamic -bnoentry -bexpall' + SHOBJ_XLDFLAGS='-G' + + SHLIB_XLDFLAGS='-bM:SRE' + SHLIB_LIBS='-lcurses -lc' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +# +# THE FOLLOWING ARE UNTESTED -- and some may not support the dlopen interface +# +irix[56]*-*gcc*) + SHOBJ_CFLAGS='-fpic' + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared -Wl,-soname,$@' + + SHLIB_XLDFLAGS='-Wl,-rpath,$(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +irix[56]*) + SHOBJ_CFLAGS='-K PIC' + SHOBJ_LD=ld +# SHOBJ_LDFLAGS='-call_shared -hidden_symbol -no_unresolved -soname $@' +# Change from David Kaelbling . If you have problems, +# remove the `-no_unresolved' + SHOBJ_LDFLAGS='-shared -no_unresolved -soname $@' + + SHLIB_XLDFLAGS='-rpath $(libdir)' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +hpux9*-*gcc*) + # must use gcc; the bundled cc cannot compile PIC code + SHOBJ_CFLAGS='-fpic' + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared -Wl,-b -Wl,+s' + + SHLIB_XLDFLAGS='-Wl,+b,$(libdir)' + SHLIB_LIBSUFF='sl' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +hpux9*) + SHOBJ_STATUS=unsupported + SHLIB_STATUS=unsupported + + # If you are using the HP ANSI C compiler, you can uncomment and use + # this code (I have not tested it) +# SHOBJ_STATUS=supported +# SHLIB_STATUS=supported +# +# SHOBJ_CFLAGS='+z' +# SHOBJ_LD='ld' +# SHOBJ_LDFLAGS='-b +s' +# +# SHLIB_XLDFLAGS='+b $(libdir)' +# SHLIB_LIBSUFF='sl' +# SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + + ;; + +hpux10*-*gcc*) + # must use gcc; the bundled cc cannot compile PIC code + SHOBJ_CFLAGS='-fpic' + SHOBJ_LD='${CC}' + # if you have problems linking here, moving the `-Wl,+h,$@' from + # SHLIB_XLDFLAGS to SHOBJ_LDFLAGS has been reported to work + SHOBJ_LDFLAGS='-shared -fpic -Wl,-b -Wl,+s' + + SHLIB_XLDFLAGS='-Wl,+h,$@ -Wl,+b,$(libdir)' + SHLIB_LIBSUFF='sl' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +hpux10*) + SHOBJ_STATUS=unsupported + SHLIB_STATUS=unsupported + + # If you are using the HP ANSI C compiler, you can uncomment and use + # this code (I have not tested it) +# SHOBJ_STATUS=supported +# SHLIB_STATUS=supported +# +# SHOBJ_CFLAGS='+z' +# SHOBJ_LD='ld' +# SHOBJ_LDFLAGS='-b +s +h $@' +# +# SHLIB_XLDFLAGS='+b $(libdir)' +# SHLIB_LIBSUFF='sl' +# SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + + ;; + +hpux11*-*gcc*) + # must use gcc; the bundled cc cannot compile PIC code + SHOBJ_CFLAGS='-fpic' + SHOBJ_LD='${CC}' +# SHOBJ_LDFLAGS='-shared -Wl,-b -Wl,-B,symbolic -Wl,+s -Wl,+std -Wl,+h,$@' + SHOBJ_LDFLAGS='-shared -fpic -Wl,-b -Wl,+s -Wl,+h,$@' + + SHLIB_XLDFLAGS='-Wl,+b,$(libdir)' + SHLIB_LIBSUFF='sl' + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +hpux11*) + SHOBJ_STATUS=unsupported + SHLIB_STATUS=unsupported + + # If you are using the HP ANSI C compiler, you can uncomment and use + # this code (I have not tested it) +# SHOBJ_STATUS=supported +# SHLIB_STATUS=supported +# +# SHOBJ_CFLAGS='+z' +# SHOBJ_LD='ld' +# SHOBJ_LDFLAGS='-b +s +h $@' +# +# SHLIB_XLDFLAGS='+b $(libdir)' +# SHLIB_LIBSUFF='sl' +# SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + + ;; + +sysv4*-*gcc*) + SHOBJ_CFLAGS=-shared + SHOBJ_LDFLAGS='-shared -h $@' + SHOBJ_LD='${CC}' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sysv4*) + SHOBJ_CFLAGS='-K PIC' + SHOBJ_LD=ld + SHOBJ_LDFLAGS='-dy -z text -G -h $@' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sco3.2v5*-*gcc*) + SHOBJ_CFLAGS='-fpic' # DEFAULTS TO ELF + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sco3.2v5*) + SHOBJ_CFLAGS='-K pic -b elf' + SHOBJ_LD=ld + SHOBJ_LDFLAGS='-G -b elf -dy -z text -h $@' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sysv5uw7*-*gcc*) + SHOBJ_CFLAGS='-fpic' + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sysv5uw7*) + SHOBJ_CFLAGS='-K PIC' + SHOBJ_LD=ld + SHOBJ_LDFLAGS='-G -dy -z text -h $@' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sysv5UnixWare*-*gcc*) + SHOBJ_CFLAGS=-fpic + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sysv5UnixWare*) + SHOBJ_CFLAGS='-K PIC' + SHOBJ_LD=ld + SHOBJ_LDFLAGS='-G -dy -z text -h $@' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sysv5OpenUNIX*-*gcc*) + SHOBJ_CFLAGS=-fpic + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +sysv5OpenUNIX*) + SHOBJ_CFLAGS='-K PIC' + SHOBJ_LD=ld + SHOBJ_LDFLAGS='-G -dy -z text -h $@' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +dgux*-*gcc*) + SHOBJ_CFLAGS=-fpic + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +dgux*) + SHOBJ_CFLAGS='-K pic' + SHOBJ_LD=ld + SHOBJ_LDFLAGS='-G -dy -h $@' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +msdos*) + SHOBJ_STATUS=unsupported + SHLIB_STATUS=unsupported + ;; + +cygwin*) + SHOBJ_LD='$(CC)' + SHOBJ_LDFLAGS='-shared -Wl,--enable-auto-import -Wl,--enable-auto-image-base -Wl,--export-all -Wl,--out-implib=$(@).a' + SHLIB_LIBPREF='cyg' + SHLIB_LIBSUFF='dll' + SHLIB_LIBVERSION='$(SHLIB_DLLVERSION).$(SHLIB_LIBSUFF)' + SHLIB_LIBS='$(TERMCAP_LIB)' + + SHLIB_DOT= + # For official cygwin releases, DLLVERSION will be defined in the + # environment of configure, and will be incremented any time the API + # changes in a non-backwards compatible manner. Otherwise, it is just + # SHLIB_MAJOR. + if [ -n "$DLLVERSION" ] ; then + SHLIB_DLLVERSION="$DLLVERSION" + fi + ;; + +mingw*) + SHOBJ_LD='$(CC)' + SHOBJ_LDFLAGS='-shared -Wl,--enable-auto-import -Wl,--enable-auto-image-base -Wl,--export-all -Wl,--out-implib=$(@).a' + SHLIB_LIBSUFF='dll' + SHLIB_LIBVERSION='$(SHLIB_DLLVERSION).$(SHLIB_LIBSUFF)' + SHLIB_LIBS='$(TERMCAP_LIB)' + + SHLIB_DOT= + # For official cygwin releases, DLLVERSION will be defined in the + # environment of configure, and will be incremented any time the API + # changes in a non-backwards compatible manner. Otherwise, it is just + # SHLIB_MAJOR. + if [ -n "$DLLVERSION" ] ; then + SHLIB_DLLVERSION="$DLLVERSION" + fi + ;; + +# +# Rely on correct gcc configuration for everything else +# +*-*gcc*) + SHOBJ_CFLAGS=-fpic + SHOBJ_LD='${CC}' + SHOBJ_LDFLAGS='-shared' + + SHLIB_LIBVERSION='$(SHLIB_LIBSUFF).$(SHLIB_MAJOR)' + ;; + +*) + SHOBJ_STATUS=unsupported + SHLIB_STATUS=unsupported + ;; + +esac + +echo SHOBJ_CC=\'"$SHOBJ_CC"\' +echo SHOBJ_CFLAGS=\'"$SHOBJ_CFLAGS"\' +echo SHOBJ_LD=\'"$SHOBJ_LD"\' +echo SHOBJ_LDFLAGS=\'"$SHOBJ_LDFLAGS"\' +echo SHOBJ_XLDFLAGS=\'"$SHOBJ_XLDFLAGS"\' +echo SHOBJ_LIBS=\'"$SHOBJ_LIBS"\' + +echo SHLIB_XLDFLAGS=\'"$SHLIB_XLDFLAGS"\' +echo SHLIB_LIBS=\'"$SHLIB_LIBS"\' + +echo SHLIB_DOT=\'"$SHLIB_DOT"\' + +echo SHLIB_LIBPREF=\'"$SHLIB_LIBPREF"\' +echo SHLIB_LIBSUFF=\'"$SHLIB_LIBSUFF"\' + +echo SHLIB_LIBVERSION=\'"$SHLIB_LIBVERSION"\' +echo SHLIB_DLLVERSION=\'"$SHLIB_DLLVERSION"\' + +echo SHOBJ_STATUS=\'"$SHOBJ_STATUS"\' +echo SHLIB_STATUS=\'"$SHLIB_STATUS"\' + +exit 0 diff --git a/terminal_output.png b/terminal_output.png new file mode 100644 index 0000000000000000000000000000000000000000..44ecc6f29aba5ba9878cfa23d4b342fca062206b GIT binary patch literal 104764 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 z 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�fX5yb7E^LbT0+ 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 ~/.bashrc + WORKDIR /code/ + CMD ["bash"] diff --git a/test/README.md b/test/README.md new file mode 100644 index 0000000..682702e --- /dev/null +++ b/test/README.md @@ -0,0 +1,76 @@ +# TEST + +--- + +## Running test suite + +Test suite could be launch with `make` by providing the right target depending what you want to achieve. + +Under the hood, `pyenv` test suites use `bats` as a test framework and are run on the host or docker depending of the target provided to make. + + + +### Targets + +- `test` + - Run the whole test suite on the local host +- `test-docker` + - Run the whole test suite on docker + - Some volumes are used in read-only mode +- `test-unit` + - Run the unit test +- `test-plugin` + - Run the plugin test +- `test-unit-docker-[BASH_VERSION]` + - Run the unit test under **official** bash docker container (alpine/busybox) with the specified bash version if present is in the `Makefile` + - Some volumes are used in read-only mode +- `test-unit-docker-gnu-[BASH_VERSION]` + - Run the unit test under **official** bash docker container (alpine/busybox), completed by **GNU Tools**, with the specified bash version if present is in the `Makefile` + - Some volumes are used in read-only mode +- `test-plugin-docker-[BASH_VERSION]` + - Run the plugin test under **official** bash docker container (alpine/busybox), completed by **GNU Tools**, with the specified bash version if present is in the `Makefile` + - Some volumes are used in read-only mode +- `test-plugin-docker-gnu-[BASH_VERSION]` + - Run the plugin test under **official** bash docker container (alpine/busybox), completed by **GNU Tools**, with the specified bash version if present is in the `Makefile` + - Some volumes are used in read-only mode + +## Targeting specific test / test file + + By setting some environment variables, it is possible to filtering which test and/or test file who will be tested with bats + +- `BATS_FILE_FILTER` + + - Run test only with the specified file + +- `BATS_TEST_FILTER` + - Run test only who corresponding to the filter provided + + +### Examples + +```bash + $ BATS_TEST_FILTER=".*installed.*" BATS_FILE_FILTER="build.bats" make test-plugin-docker-gnu-3.2.57 + build.bats + ✓ yaml is installed for python + ✓ homebrew is used in Linux if Pyenv is installed with Homebrew + ✓ homebrew is not used in Linux if Pyenv is not installed with Homebrew + + 3 tests, 0 failures + + $ BATS_TEST_FILTER=".*installed.*" BATS_FILE_FILTER="build.bats" make test-plugin + build.bats + ✓ yaml is installed for python + ✓ homebrew is used in Linux if Pyenv is installed with Homebrew + ✓ homebrew is not used in Linux if Pyenv is not installed with Homebrew + + 3 tests, 0 failures +``` + + + +## Writing test + +To be reproducible, each test use/should use its own `TMPDIR` . +It's achieved by using the environment variable `BATS_TEST_TMPDIR` provided by bats that is automatically deleted at the end of each test. More info [here](https://bats-core.readthedocs.io/en/stable/writing-tests.html#special-variables) + +Another variable who could be used to source some file who need to be tested is `BATS_TEST_DIRNAME` who point to the directory in which the bats test file is located. \ No newline at end of file diff --git a/test/commands.bats b/test/commands.bats new file mode 100644 index 0000000..b0664a6 --- /dev/null +++ b/test/commands.bats @@ -0,0 +1,39 @@ +#!/usr/bin/env bats + +load test_helper + +@test "commands" { + run pyenv-commands + assert_success + assert_line "init" + assert_line "rehash" + assert_line "shell" + refute_line "sh-shell" + assert_line "echo" +} + +@test "commands --sh" { + run pyenv-commands --sh + assert_success + refute_line "init" + assert_line "shell" +} + +@test "commands in path with spaces" { + path="${PYENV_TEST_DIR}/my commands" + cmd="${path}/pyenv-sh-hello" + mkdir -p "$path" + touch "$cmd" + chmod +x "$cmd" + + PATH="${path}:$PATH" run pyenv-commands --sh + assert_success + assert_line "hello" +} + +@test "commands --no-sh" { + run pyenv-commands --no-sh + assert_success + assert_line "init" + refute_line "shell" +} diff --git a/test/completions.bats b/test/completions.bats new file mode 100644 index 0000000..e83e91e --- /dev/null +++ b/test/completions.bats @@ -0,0 +1,51 @@ +#!/usr/bin/env bats + +load test_helper + +create_command() { + bin="${PYENV_TEST_DIR}/bin" + mkdir -p "$bin" + echo "$2" > "${bin}/$1" + chmod +x "${bin}/$1" +} + +@test "command with no completion support" { + create_command "pyenv-hello" "#!$BASH + echo hello" + run pyenv-completions hello + assert_success "--help" +} + +@test "command with completion support" { + create_command "pyenv-hello" "#!$BASH +# Provide pyenv completions +if [[ \$1 = --complete ]]; then + echo hello +else + exit 1 +fi" + run pyenv-completions hello + assert_success + assert_output < .python-version + run -127 pyenv-exec nonexistent + assert_failure < "$PYENV_ROOT/version" + run pyenv-global + assert_success + assert_output "1.2.3" +} + +@test "set PYENV_ROOT/version" { + mkdir -p "$PYENV_ROOT/versions/1.2.3" + run pyenv-global "1.2.3" + assert_success + run pyenv-global + assert_success "1.2.3" +} + +@test "fail setting invalid PYENV_ROOT/version" { + mkdir -p "$PYENV_ROOT" + run pyenv-global "1.2.3" + assert_failure "pyenv: version \`1.2.3' not installed" +} diff --git a/test/help.bats b/test/help.bats new file mode 100644 index 0000000..db178c2 --- /dev/null +++ b/test/help.bats @@ -0,0 +1,115 @@ +#!/usr/bin/env bats + +load test_helper + +@test "without args shows summary of common commands" { + run pyenv-help + assert_success + assert_line "Usage: pyenv []" + assert_line "Some useful pyenv commands are:" +} + +@test "invalid command" { + run pyenv-help hello + assert_failure "pyenv: no such command \`hello'" +} + +@test "shows help for a specific command" { + mkdir -p "${PYENV_TEST_DIR}/bin" + cat > "${PYENV_TEST_DIR}/bin/pyenv-hello" < +# Summary: Says "hello" to you, from pyenv +# This command is useful for saying hello. +echo hello +SH + + run pyenv-help hello + assert_success + assert_output < + +This command is useful for saying hello. +SH +} + +@test "replaces missing extended help with summary text" { + mkdir -p "${PYENV_TEST_DIR}/bin" + cat > "${PYENV_TEST_DIR}/bin/pyenv-hello" < +# Summary: Says "hello" to you, from pyenv +echo hello +SH + + run pyenv-help hello + assert_success + assert_output < + +Says "hello" to you, from pyenv +SH +} + +@test "extracts only usage" { + mkdir -p "${PYENV_TEST_DIR}/bin" + cat > "${PYENV_TEST_DIR}/bin/pyenv-hello" < +# Summary: Says "hello" to you, from pyenv +# This extended help won't be shown. +echo hello +SH + + run pyenv-help --usage hello + assert_success "Usage: pyenv hello " +} + +@test "multiline usage section" { + mkdir -p "${PYENV_TEST_DIR}/bin" + cat > "${PYENV_TEST_DIR}/bin/pyenv-hello" < +# pyenv hi [everybody] +# pyenv hola --translate +# Summary: Says "hello" to you, from pyenv +# Help text. +echo hello +SH + + run pyenv-help hello + assert_success + assert_output < + pyenv hi [everybody] + pyenv hola --translate + +Help text. +SH +} + +@test "multiline extended help section" { + mkdir -p "${PYENV_TEST_DIR}/bin" + cat > "${PYENV_TEST_DIR}/bin/pyenv-hello" < +# Summary: Says "hello" to you, from pyenv +# This is extended help text. +# It can contain multiple lines. +# +# And paragraphs. + +echo hello +SH + + run pyenv-help hello + assert_success + assert_output < + +This is extended help text. +It can contain multiple lines. + +And paragraphs. +SH +} diff --git a/test/hooks.bats b/test/hooks.bats new file mode 100644 index 0000000..763f2b7 --- /dev/null +++ b/test/hooks.bats @@ -0,0 +1,70 @@ +#!/usr/bin/env bats + +load test_helper + +@test "prints usage help given no argument" { + run pyenv-hooks + assert_failure "Usage: pyenv hooks " +} + +@test "prints list of hooks" { + path1="${PYENV_TEST_DIR}/pyenv.d" + path2="${PYENV_TEST_DIR}/etc/pyenv_hooks" + PYENV_HOOK_PATH="$path1" + create_hook exec "hello.bash" + create_hook exec "ahoy.bash" + create_hook exec "invalid.sh" + create_hook which "boom.bash" + PYENV_HOOK_PATH="$path2" + create_hook exec "bueno.bash" + + PYENV_HOOK_PATH="$path1:$path2" run pyenv-hooks exec + assert_success + assert_output < myscript.sh </dev/null" +} + +@test "adds shims to PATH" { + export PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:/bin:/usr/local/bin" + run pyenv-init - bash + assert_success + assert_line 'export PATH="'${PYENV_ROOT}'/shims:${PATH}"' +} + +@test "adds shims to PATH (fish)" { + export PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:/bin:/usr/local/bin" + run pyenv-init - fish + assert_success + assert_line "set -gx PATH '${PYENV_ROOT}/shims' \$PATH" +} + +@test "adds shims to PATH (pwsh)" { + export PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:/bin:/usr/local/bin" + run pyenv-init - pwsh + assert_success + assert_line '$Env:PATH="'${PYENV_ROOT}'/shims:$Env:PATH"' +} + +@test "removes existing shims from PATH" { + OLDPATH="$PATH" + export PATH="${BATS_TEST_DIRNAME}/nonexistent:${PYENV_ROOT}/shims:$PATH" + run bash -e </dev/null || skip "-- fish not installed" + OLDPATH="$PATH" + export PATH="${BATS_TEST_DIRNAME}/nonexistent:${PYENV_ROOT}/shims:$PATH" + run fish </dev/null || skip "-- pwsh not installed" + OLDPATH="$PATH" + export PATH="${BATS_TEST_DIRNAME}/nonexistent:${PYENV_ROOT}/shims:$PATH" + run pwsh -noni -c - </dev/null || skip "-- fish not installed" + export PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:/bin:/usr/local/bin" + run fish </dev/null || skip "-- pwsh not installed" + PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:/bin:/usr/local/bin" + run pwsh -nop -c - </dev/null || skip "-- fish not installed" + export PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:${PYENV_ROOT}/shims:/bin:/usr/local/bin" + run fish </dev/null || skip "-- pwsh not installed" + PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:${PYENV_ROOT}/shims:/bin:/usr/local/bin" + run pwsh -nop -c - <] VAR + +if [[ $1 == -F* ]]; then + sep="${1:2}" + echo "${!2}" | tr "${sep:-:}" $'\n' +else + echo "${!1}" +fi diff --git a/test/local.bats b/test/local.bats new file mode 100644 index 0000000..9863967 --- /dev/null +++ b/test/local.bats @@ -0,0 +1,71 @@ +#!/usr/bin/env bats + +load test_helper + +_setup() { + mkdir -p "${PYENV_TEST_DIR}/myproject" + cd "${PYENV_TEST_DIR}/myproject" +} + +@test "no version" { + assert [ ! -e "${PWD}/.python-version" ] + run pyenv-local + assert_failure "pyenv: no local version configured for this directory" +} + +@test "local version" { + echo "1.2.3" > .python-version + run pyenv-local + assert_success "1.2.3" +} + +@test "discovers version file in parent directory" { + echo "1.2.3" > .python-version + mkdir -p "subdir" && cd "subdir" + run pyenv-local + assert_success "1.2.3" +} + +@test "ignores PYENV_DIR" { + echo "1.2.3" > .python-version + mkdir -p "$HOME" + echo "3.4-home" > "${HOME}/.python-version" + PYENV_DIR="$HOME" run pyenv-local + assert_success "1.2.3" +} + +@test "sets local version" { + mkdir -p "${PYENV_ROOT}/versions/1.2.3" + run pyenv-local 1.2.3 + assert_success "" + assert [ "$(cat .python-version)" = "1.2.3" ] +} + +@test "fails to set a nonexistent local version" { + run pyenv-local 1.2.3 + assert_failure "pyenv: version \`1.2.3' not installed" + assert [ ! -e .python-version ] +} + +@test "sets a nonexistent local version with --force" { + run pyenv-local -f 1.2.3 + assert_success "" + assert [ "$(cat .python-version)" = "1.2.3" ] +} + +@test "changes local version" { + echo "1.0-pre" > .python-version + mkdir -p "${PYENV_ROOT}/versions/1.2.3" + run pyenv-local + assert_success "1.0-pre" + run pyenv-local 1.2.3 + assert_success "" + assert [ "$(cat .python-version)" = "1.2.3" ] +} + +@test "unsets local version" { + touch .python-version + run pyenv-local --unset + assert_success "" + assert [ ! -e .python-version ] +} diff --git a/test/pip-rehash.bats b/test/pip-rehash.bats new file mode 100755 index 0000000..b8a1afa --- /dev/null +++ b/test/pip-rehash.bats @@ -0,0 +1,60 @@ +#!/usr/bin/env bats + +load test_helper + +copy_src_pyenvd() { + mkdir -p "${PYENV_ROOT}" + cp -r "${BATS_TEST_DIRNAME}/../pyenv.d" "${PYENV_ROOT}" +} + +@test "pip-rehash triggered when using 'pip'" { + export PYENV_VERSION="3.7.14" + create_alt_executable "example" + create_alt_executable "pip" + copy_src_pyenvd + run command -v example 2> /dev/null + assert_failure + run pyenv-exec pip install example + assert_success + run command -v example 2> /dev/null + assert_success +} + +@test "pip-rehash triggered when using 'pip3'" { + export PYENV_VERSION="3.7.14" + create_alt_executable "example" + create_alt_executable "pip3" + copy_src_pyenvd + run command -v example 2> /dev/null + assert_failure + run pyenv-exec pip3 install example + assert_success + run command -v example 2> /dev/null + assert_success +} + +@test "pip-rehash triggered when using 'pip3.x'" { + export PYENV_VERSION="3.7.14" + create_alt_executable "example" + create_alt_executable "pip3.7" + copy_src_pyenvd + run command -v example 2> /dev/null + assert_failure + run pyenv-exec pip3.7 install example + assert_success + run command -v example 2> /dev/null + assert_success +} + +@test "pip-rehash triggered when using 'python -m pip install'" { + export PYENV_VERSION="3.7.14" + create_alt_executable "example" + create_alt_executable "python" + copy_src_pyenvd + run command -v example 2> /dev/null + assert_failure + run pyenv-exec python -m pip install example + assert_success + run command -v example 2> /dev/null + assert_success +} diff --git a/test/prefix.bats b/test/prefix.bats new file mode 100644 index 0000000..f52e520 --- /dev/null +++ b/test/prefix.bats @@ -0,0 +1,51 @@ +#!/usr/bin/env bats + +load test_helper + +@test "prefix" { + mkdir -p "${PYENV_TEST_DIR}/myproject" + cd "${PYENV_TEST_DIR}/myproject" + echo "1.2.3" > .python-version + mkdir -p "${PYENV_ROOT}/versions/1.2.3" + run pyenv-prefix + assert_success "${PYENV_ROOT}/versions/1.2.3" +} + +@test "prefix for invalid version" { + PYENV_VERSION="1.2.3" run pyenv-prefix + assert_failure "pyenv: version \`1.2.3' not installed" +} + +@test "prefix for system" { + mkdir -p "${PYENV_TEST_DIR}/bin" + touch "${PYENV_TEST_DIR}/bin/python" + chmod +x "${PYENV_TEST_DIR}/bin/python" + PATH="${PYENV_TEST_DIR}/libexec:$PATH" PYENV_VERSION="system" run pyenv-prefix + assert_success "$PYENV_TEST_DIR" +} + +#Arch has Python at sbin as well as bin +@test "prefix for system in sbin" { + mkdir -p "${PYENV_TEST_DIR}/sbin" + touch "${PYENV_TEST_DIR}/sbin/python" + chmod +x "${PYENV_TEST_DIR}/sbin/python" + PATH="${PYENV_TEST_DIR}/sbin:$PATH" PYENV_VERSION="system" run pyenv-prefix + assert_success "$PYENV_TEST_DIR" +} + +@test "prefix for system in /" { + mkdir -p "${PYENV_TEST_DIR}/libexec" + cat >"${PYENV_TEST_DIR}/libexec/pyenv-which" </dev/null || true" +} + +@test "sh-rehash in bash (integration)" { + create_alt_executable_in_version "3.4" "python" + PYENV_SHELL=bash run eval "$(pyenv-sh-rehash)" + assert_success + assert [ -x "${PYENV_ROOT}/shims/python" ] +} + +@test "sh-rehash in fish" { + create_alt_executable_in_version "3.4" "python" + PYENV_SHELL=fish run pyenv-sh-rehash + assert_success "command pyenv rehash" +} + +@test "sh-rehash in fish (integration)" { + command -v fish >/dev/null || skip "-- fish not installed" + create_alt_executable_in_version "3.4" "python" + PYENV_SHELL=fish fish -Nc "source (pyenv-sh-rehash | psub)" + assert_success + assert [ -x "${PYENV_ROOT}/shims/python" ] +} + +@test "sh-rehash in pwsh" { + create_alt_executable_in_version "3.4" "python" + PYENV_SHELL=pwsh run pyenv-sh-rehash + assert_success "& (get-command pyenv -commandtype application) rehash" +} + +@test "sh-rehash in pwsh (integration)" { + command -v pwsh >/dev/null || skip "-- pwsh not installed" + assert [ ! -x "${PYENV_ROOT}/shims/python" ] + create_alt_executable_in_version "3.4" "python" + run pwsh -nop -c -<<'!' +$ErrorActionPreference = "Stop" +$PSNativeCommandUseErrorActionPreference = $true +iex ((& pyenv init - pwsh) -join "`n") +& pyenv rehash +! + assert_success "" + assert [ -x "${PYENV_ROOT}/shims/python" ] +} + +@test "shim sets _PYENV_SHIM_PATH when linked from elsewhere" { + export PYENV_VERSION="custom" + create_alt_executable python3 + #must stub pyenv before rehash 'cuz the path is hardcoded into shims + create_stub pyenv < .python-version + PYENV_VERSION="" run pyenv-sh-shell + assert_failure "pyenv: no shell-specific version configured" +} + +@test "shell version" { + PYENV_SHELL=bash PYENV_VERSION="1.2.3" run pyenv-sh-shell + assert_success 'echo "$PYENV_VERSION"' +} + +@test "shell version (fish)" { + PYENV_SHELL=fish PYENV_VERSION="1.2.3" run pyenv-sh-shell + assert_success 'echo "$PYENV_VERSION"' +} + +@test "shell version (pwsh)" { + PYENV_SHELL=pwsh PYENV_VERSION="1.2.3" run pyenv-sh-shell + assert_success 'echo "$PYENV_VERSION"' +} + +@test "shell revert" { + PYENV_SHELL=bash run pyenv-sh-shell - + assert_success + assert_line 0 'if [ -n "${PYENV_VERSION_OLD+x}" ]; then' +} + +@test "shell revert (fish)" { + PYENV_SHELL=fish run pyenv-sh-shell - + assert_success + assert_line 0 'if set -q PYENV_VERSION_OLD' +} + +@test "shell revert (pwsh)" { + PYENV_SHELL=pwsh run pyenv-sh-shell - + assert_success + assert_line 0 'if ( Get-Item -Path Env:\PYENV_VERSION* ) {' +} + +@test "shell unset" { + PYENV_SHELL=bash run pyenv-sh-shell --unset + assert_success + assert_output </dev/null; then + if [ -n "$PYENV_NATIVE_EXT" ]; then + echo "pyenv: failed to load \`realpath' builtin" >&2 + exit 1 + fi + fi + + local bats_test_tmpdir="$(realpath "${BATS_TEST_TMPDIR}")" + if [ -z "${bats_test_tmpdir}" ];then + # Use readlink if running in a container instead of realpath lib + bats_test_tmpdir="$(readlink -f "${BATS_TEST_TMPDIR}")" + fi + + # update BATS_TEST_TMPDIR discover by realpath/readlink to avoid "//" + export BATS_TEST_TMPDIR="${bats_test_tmpdir}" + export PYENV_TEST_DIR="${BATS_TEST_TMPDIR}/pyenv" + export PYENV_ROOT="${PYENV_TEST_DIR}/root" + export HOME="${PYENV_TEST_DIR}/home" + export PYENV_HOOK_PATH="${PYENV_ROOT}/pyenv.d" + + PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin + PATH="${PYENV_TEST_DIR}/bin:$PATH" + PATH="${_PYENV_INSTALL_PREFIX}/libexec:$PATH" + PATH="${BATS_TEST_DIRNAME}/libexec:$PATH" + PATH="${PYENV_ROOT}/shims:$PATH" + PATH="${BATS_TEST_TMPDIR}/stubs:$PATH" + + for xdg_var in `env 2>/dev/null | grep ^XDG_ | cut -d= -f1`; do unset "$xdg_var"; done + unset xdg_var + + # Workaround for Powershell. When tests are run from a terminal, + # and running a script fron a here-document, + # Powershell 7.5.4 erroneously prints ANSI escape sequences + # even if its output is redirected, breaking the comparison logic + export NO_COLOR=1 + + # If test specific setup exist, run it + if [[ $(type -t _setup) == function ]];then + _setup + fi +} + +flunk() { + { if [ "$#" -eq 0 ]; then cat - + else echo "$@" + fi + } | sed "s:${PYENV_TEST_DIR}:TEST_DIR:g" >&2 + return 1 +} + +assert_success() { + if [ "$status" -ne 0 ]; then + flunk "command failed with exit status $status" $'\n'\ + "output: $output" + elif [ "$#" -gt 0 ]; then + assert_output "$1" + fi +} + +assert_failure() { + if [ "$status" -eq 0 ]; then + flunk "expected failed exit status" $'\n'\ + "output: $output" + elif [ "$#" -gt 0 ]; then + assert_output "$1" + fi +} + +assert_equal() { + if [ "$1" != "$2" ]; then + { echo "expected: \`$1'" + echo "actual: \`$2'" + } | flunk + fi +} + +assert_output() { + local expected + if [ $# -eq 0 ]; then expected="$(cat -)" + else expected="$1" + fi + assert_equal "$expected" "$output" +} + +assert_line() { + if [ "$1" -ge 0 ] 2>/dev/null; then + assert_equal "$2" "${lines[$1]}" + else + local line + for line in "${lines[@]}"; do + if [ "$line" = "$1" ]; then return 0; fi + done + flunk "expected line \`$1'" $'\n'\ + "output: $output" + fi +} + +refute_line() { + if [ "$1" -ge 0 ] 2>/dev/null; then + local num_lines="${#lines[@]}" + if [ "$1" -lt "$num_lines" ]; then + flunk "output has $num_lines lines" + fi + else + local line + for line in "${lines[@]}"; do + if [ "$line" = "$1" ]; then + flunk "expected to not find line \`$line'" $'\n'\ + "output: $output" + fi + done + fi +} + +assert() { + if ! "$@"; then + flunk "failed: $@" + fi +} + +# Output a modified PATH that ensures that the given executable is not present, +# but in which system utils necessary for pyenv operation are still available. +path_without() { + local path=":${PATH}:" + for exe; do + local found alt util + for found in $(PATH="$path" type -aP "$exe"); do + found="${found%/*}" + if [ "$found" != "${PYENV_ROOT}/shims" ]; then + alt="${PYENV_TEST_DIR}/$(echo "${found#/}" | tr '/' '-')" + mkdir -p "$alt" + for util in bash head cut readlink greadlink tr sed xargs basename sort; do + if [ -x "${found}/$util" ]; then + ln -s "${found}/$util" "${alt}/$util" + fi + done + path="${path/:${found}:/:${alt}:}" + fi + done + done + path="${path#:}" + path="${path%:}" + echo "$path" +} + +create_path_executable() { + create_executable "${PYENV_TEST_DIR}/bin" "$@" +} + +create_alt_executable() { + create_alt_executable_in_version "${PYENV_VERSION}" "$@" +} + +create_alt_executable_in_version() { + local version="${1:?}" + shift 1 + create_executable "${PYENV_ROOT}/versions/$version/bin" "$@" +} + +create_stub() { + create_executable "${BATS_TEST_TMPDIR}/stubs" "$@" +} + +create_executable() { + local bin="${1:?}" + local name="${2:?}" + shift 2 + mkdir -p "$bin" + local payload + # Bats doesn't redirect stdin + if [[ $# -eq 0 && ! -t 0 ]]; then + payload="$(cat -)" + else + payload="$(printf '%s\n' "$@")" + fi + if [[ $payload != "#!/"* ]]; then + payload="#!$BASH"$'\n'"$payload" + fi + echo "$payload" > "${bin}/$name" + chmod +x "${bin}/$name" +} + +create_hook() { + mkdir -p "${PYENV_HOOK_PATH}/$1" + touch "${PYENV_HOOK_PATH}/$1/$2" + if [ ! -t 0 ]; then + cat > "${PYENV_HOOK_PATH}/$1/$2" + fi +} diff --git a/test/version-file-read.bats b/test/version-file-read.bats new file mode 100644 index 0000000..6563eb6 --- /dev/null +++ b/test/version-file-read.bats @@ -0,0 +1,118 @@ +#!/usr/bin/env bats + +load test_helper + +_setup() { + mkdir -p "${PYENV_TEST_DIR}/myproject" + cd "${PYENV_TEST_DIR}/myproject" +} + +@test "fails without arguments" { + run pyenv-version-file-read + assert_failure "" +} + +@test "fails for invalid file" { + run pyenv-version-file-read "non-existent" + assert_failure "" +} + +@test "fails for blank file" { + echo > my-version + run pyenv-version-file-read my-version + assert_failure "" +} + +@test "reads simple version file" { + cat > my-version <<<"3.3.5" + run pyenv-version-file-read my-version + assert_success "3.3.5" +} + +@test "ignores leading spaces" { + cat > my-version <<<" 3.3.5" + run pyenv-version-file-read my-version + assert_success "3.3.5" +} + +@test "reads only the first word from file" { + cat > my-version <<<"3.3.5 2.7.6 hi" + run pyenv-version-file-read my-version + assert_success "3.3.5" +} + +@test "loads *not* only the first line in file" { + cat > my-version < my-version < my-version + run pyenv-version-file-read my-version + assert_success "2.7.6" +} + +@test "ignores carriage returns" { + cat > my-version <<< $'3.3.5\r' + run pyenv-version-file-read my-version + assert_success "3.3.5" +} + +@test "skips comment lines" { + cat > my-version < my-version + run pyenv-version-file-read my-version + assert_failure "pyenv: invalid version \`..' ignored in \`my-version'" +} + +@test "skips glob path traversal" { + cat > my-version < my-version + run pyenv-version-file-read my-version + assert_success "${venv}" +} + +@test "skips relative paths that lead outside of versions" { + venv=../3.10.3/envs/test + mkdir -p "${PYENV_ROOT}/versions/${venv}" + echo -n "${venv}" > my-version + run pyenv-version-file-read my-version + assert_failure +} diff --git a/test/version-file-write.bats b/test/version-file-write.bats new file mode 100644 index 0000000..ae6694f --- /dev/null +++ b/test/version-file-write.bats @@ -0,0 +1,37 @@ +#!/usr/bin/env bats + +load test_helper + +_setup() { + mkdir -p "${PYENV_TEST_DIR}" + cd "$PYENV_TEST_DIR" +} + +@test "invocation without 2 arguments prints usage" { + run pyenv-version-file-write + assert_failure "Usage: pyenv version-file-write [-f|--force] [...]" + run pyenv-version-file-write "one" "" + assert_failure +} + +@test "setting nonexistent version fails" { + assert [ ! -e ".python-version" ] + run pyenv-version-file-write ".python-version" "2.7.6" + assert_failure "pyenv: version \`2.7.6' not installed" + assert [ ! -e ".python-version" ] +} + +@test "setting nonexistent version succeeds with force" { + assert [ ! -e ".python-version" ] + run pyenv-version-file-write --force ".python-version" "2.7.6" + assert_success + assert [ -e ".python-version" ] +} + +@test "writes value to arbitrary file" { + mkdir -p "${PYENV_ROOT}/versions/2.7.6" + assert [ ! -e "my-version" ] + run pyenv-version-file-write "${PWD}/my-version" "2.7.6" + assert_success "" + assert [ "$(cat my-version)" = "2.7.6" ] +} diff --git a/test/version-file.bats b/test/version-file.bats new file mode 100644 index 0000000..e2fb941 --- /dev/null +++ b/test/version-file.bats @@ -0,0 +1,75 @@ +#!/usr/bin/env bats + +load test_helper + +_setup() { + mkdir -p "${PYENV_TEST_DIR}" + cd "$PYENV_TEST_DIR" +} + +create_file() { + mkdir -p "$(dirname "$1")" + echo "system" > "$1" +} + +@test "detects global 'version' file" { + create_file "${PYENV_ROOT}/version" + run pyenv-version-file + assert_success "${PYENV_ROOT}/version" +} + +@test "prints global file if no version files exist" { + assert [ ! -e "${PYENV_ROOT}/version" ] + assert [ ! -e ".python-version" ] + run pyenv-version-file + assert_success "${PYENV_ROOT}/version" +} + +@test "in current directory" { + create_file ".python-version" + run pyenv-version-file + assert_success "${PYENV_TEST_DIR}/.python-version" +} + +@test "in parent directory" { + create_file ".python-version" + mkdir -p project + cd project + run pyenv-version-file + assert_success "${PYENV_TEST_DIR}/.python-version" +} + +@test "topmost file has precedence" { + create_file ".python-version" + create_file "project/.python-version" + cd project + run pyenv-version-file + assert_success "${PYENV_TEST_DIR}/project/.python-version" +} + +@test "PYENV_DIR has precedence over PWD" { + create_file "widget/.python-version" + create_file "project/.python-version" + cd project + PYENV_DIR="${PYENV_TEST_DIR}/widget" run pyenv-version-file + assert_success "${PYENV_TEST_DIR}/widget/.python-version" +} + +@test "PWD is searched if PYENV_DIR yields no results" { + mkdir -p "widget/blank" + create_file "project/.python-version" + cd project + PYENV_DIR="${PYENV_TEST_DIR}/widget/blank" run pyenv-version-file + assert_success "${PYENV_TEST_DIR}/project/.python-version" +} + +@test "finds version file in target directory" { + create_file "project/.python-version" + run pyenv-version-file "${PWD}/project" + assert_success "${PYENV_TEST_DIR}/project/.python-version" +} + +@test "fails when no version file in target directory" { + run pyenv-version-file "$PWD" + assert_failure "" +} diff --git a/test/version-name.bats b/test/version-name.bats new file mode 100644 index 0000000..cc179b9 --- /dev/null +++ b/test/version-name.bats @@ -0,0 +1,141 @@ +#!/usr/bin/env bats + +load test_helper + +create_version() { + mkdir -p "${PYENV_ROOT}/versions/$1" +} + +_setup() { + mkdir -p "${PYENV_TEST_DIR}" + cd "$PYENV_TEST_DIR" +} + +@test "no version selected" { + assert [ ! -d "${PYENV_ROOT}/versions" ] + run pyenv-version-name + assert_success "system" +} + +@test "system version is not checked for existence" { + PYENV_VERSION=system run pyenv-version-name + assert_success "system" +} + +@test "PYENV_VERSION can be overridden by hook" { + create_version "2.7.11" + create_version "3.5.1" + create_hook version-name test.bash <<<"PYENV_VERSION=3.5.1" + + PYENV_VERSION=2.7.11 run pyenv-version-name + assert_success "3.5.1" +} + +@test "carries original IFS within hooks" { + create_hook version-name hello.bash < ".python-version" <<<"2.7.11" + run pyenv-version-name + assert_success "2.7.11" + + PYENV_VERSION=3.5.1 run pyenv-version-name + assert_success "3.5.1" +} + +@test "local file has precedence over global" { + create_version "2.7.11" + create_version "3.5.1" + + cat > "${PYENV_ROOT}/version" <<<"2.7.11" + run pyenv-version-name + assert_success "2.7.11" + + cat > ".python-version" <<<"3.5.1" + run pyenv-version-name + assert_success "3.5.1" +} + +@test "missing version" { + PYENV_VERSION=1.2 run pyenv-version-name + assert_failure "pyenv: version \`1.2' is not installed (set by PYENV_VERSION environment variable)" +} + +@test "missing version with --force" { + PYENV_VERSION=1.2 run pyenv-version-name -f + assert_success "1.2" +} + +@test "one missing version (second missing)" { + create_version "3.5.1" + PYENV_VERSION="3.5.1:1.2" run pyenv-version-name + assert_failure + assert_output </dev/null +} + +@test "one missing version (without stderr)" { + create_version "3.5.1" + PYENV_VERSION="1.2:3.5.1" run pyenv-version-name-without-stderr + assert_failure + assert_output < ".python-version" <<<"python-2.7.11" + run pyenv-version-name + assert_success + assert_output "2.7.11" +} + +@test "falls back to pyenv-latest" { + create_version "2.7.11" + PYENV_VERSION="2.7" run pyenv-version-name + assert_success + assert_output "2.7.11" +} + +@test "pyenv-latest fallback with prefix in name" { + create_version "3.12.6" + PYENV_VERSION="python-3.12" run pyenv-version-name + assert_success + assert_output "3.12.6" +} + +@test "pyenv version started by python-" { + create_version "python-3.12.6" + PYENV_VERSION="python-3.12.6" run pyenv-version-name + assert_success + assert_output "python-3.12.6" +} diff --git a/test/version-origin.bats b/test/version-origin.bats new file mode 100644 index 0000000..da0565f --- /dev/null +++ b/test/version-origin.bats @@ -0,0 +1,56 @@ +#!/usr/bin/env bats + +load test_helper + +_setup() { + mkdir -p "${PYENV_TEST_DIR}" + cd "$PYENV_TEST_DIR" +} + +@test "reports global file even if it doesn't exist" { + assert [ ! -e "${PYENV_ROOT}/version" ] + run pyenv-version-origin + assert_success "${PYENV_ROOT}/version" +} + +@test "detects global file" { + mkdir -p "$PYENV_ROOT" + touch "${PYENV_ROOT}/version" + run pyenv-version-origin + assert_success "${PYENV_ROOT}/version" +} + +@test "detects PYENV_VERSION" { + PYENV_VERSION=1 run pyenv-version-origin + assert_success "PYENV_VERSION environment variable" +} + +@test "detects local file" { + echo "system" > .python-version + run pyenv-version-origin + assert_success "${PWD}/.python-version" +} + +@test "reports from hook" { + create_hook version-origin test.bash <<<"PYENV_VERSION_ORIGIN=plugin" + + PYENV_VERSION=1 run pyenv-version-origin + assert_success "plugin" +} + +@test "carries original IFS within hooks" { + create_hook version-origin hello.bash < ".python-version" <<<"3.3.3" + run pyenv-version + assert_success "3.3.3 (set by ${PWD}/.python-version)" +} + +@test "set by global file" { + create_version "3.3.3" + cat > "${PYENV_ROOT}/version" <<<"3.3.3" + run pyenv-version + assert_success "3.3.3 (set by ${PYENV_ROOT}/version)" +} + +@test "set by PYENV_VERSION, one missing" { + create_version "3.3.3" + PYENV_VERSION=3.3.3:1.2 run pyenv-version + assert_failure + assert_output </dev/null +} + +@test "set by PYENV_VERSION, one missing (stderr filtered)" { + create_version "3.3.3" + PYENV_VERSION=3.4.2:3.3.3 run pyenv-version-without-stderr + assert_failure + assert_output < "${PYENV_ROOT}/version" <<<"3.3.3" + run pyenv-versions + assert_success + assert_output < ".python-version" <<<"3.3.3" + run pyenv-versions + assert_success + assert_output </dev/null +if [ "\$1" == "--version-sort" ]; then + echo "${PYENV_ROOT}/versions/1.9.0" + echo "${PYENV_ROOT}/versions/1.53.0" + echo "${PYENV_ROOT}/versions/1.218.0" +else exit 1 +fi +SH + + run pyenv-versions --bare + assert_success + assert_output < 1.9.0 +OUT +} diff --git a/test/whence.bats b/test/whence.bats new file mode 100644 index 0000000..9223369 --- /dev/null +++ b/test/whence.bats @@ -0,0 +1,23 @@ +#!/usr/bin/env bats + +load test_helper + +@test "finds versions where present" { + create_alt_executable_in_version "2.7" "python" + create_alt_executable_in_version "2.7" "fab" + create_alt_executable_in_version "3.4" "python" + create_alt_executable_in_version "3.4" "py.test" + + run pyenv-whence python + assert_success + assert_output < "${PYENV_ROOT}/version" <<<"3.4" + create_alt_executable_in_version "3.4" "python" + + mkdir -p "$PYENV_TEST_DIR" + cd "$PYENV_TEST_DIR" + + PYENV_VERSION= run pyenv-which python + assert_success "${PYENV_ROOT}/versions/3.4/bin/python" +} + +@test "tolerates nonexistent versions from pyenv-version-name" { + mkdir -p "$PYENV_ROOT" + cat > "${PYENV_ROOT}/version" <

%9?XMJkwo=w^E{l>Im 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