mirror of
https://github.com/pyenv/pyenv.git
synced 2025-11-08 19:43:48 -05:00
Compare commits
29 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3f0dd1962f | ||
|
|
48b0224aaf | ||
|
|
a57106c932 | ||
|
|
189e73e5e8 | ||
|
|
8680247381 | ||
|
|
606ff454a1 | ||
|
|
b05d15f673 | ||
|
|
881ba40ff4 | ||
|
|
58bbbf8880 | ||
|
|
c1674cd552 | ||
|
|
74f923b5fc | ||
|
|
59c560893a | ||
|
|
4971d9e35e | ||
|
|
6d13db992f | ||
|
|
13d8568620 | ||
|
|
cc56f76733 | ||
|
|
4c261e6ea1 | ||
|
|
31355676f0 | ||
|
|
c162dcd932 | ||
|
|
0b6320d371 | ||
|
|
3bfaa33c1b | ||
|
|
cd2858aa17 | ||
|
|
19359de7b8 | ||
|
|
8dd46e3915 | ||
|
|
ed1083ec27 | ||
|
|
904fe964b0 | ||
|
|
036fd63bbd | ||
|
|
1250d7dd30 | ||
|
|
ad6a950734 |
11
.editorconfig
Normal file
11
.editorconfig
Normal file
@@ -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
|
||||||
5
.github/workflows/macos_build.yml
vendored
5
.github/workflows/macos_build.yml
vendored
@@ -1,5 +1,9 @@
|
|||||||
name: macos_build
|
name: macos_build
|
||||||
on: [pull_request, push]
|
on: [pull_request, push]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read # to fetch code (actions/checkout)
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
macos_build:
|
macos_build:
|
||||||
strategy:
|
strategy:
|
||||||
@@ -10,6 +14,7 @@ jobs:
|
|||||||
- "3.8"
|
- "3.8"
|
||||||
- "3.9"
|
- "3.9"
|
||||||
- "3.10"
|
- "3.10"
|
||||||
|
- "3.11"
|
||||||
runs-on: macos-11
|
runs-on: macos-11
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
|||||||
4
.github/workflows/no-response.yml
vendored
4
.github/workflows/no-response.yml
vendored
@@ -9,8 +9,12 @@ on:
|
|||||||
# Schedule for ten minutes after the hour, every hour
|
# Schedule for ten minutes after the hour, every hour
|
||||||
- cron: '10 * * * *'
|
- cron: '10 * * * *'
|
||||||
|
|
||||||
|
permissions: {}
|
||||||
jobs:
|
jobs:
|
||||||
noResponse:
|
noResponse:
|
||||||
|
permissions:
|
||||||
|
issues: write # to update issues (lee-dohm/no-response)
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: lee-dohm/no-response@v0.5.0
|
- uses: lee-dohm/no-response@v0.5.0
|
||||||
|
|||||||
4
.github/workflows/pyenv_tests.yml
vendored
4
.github/workflows/pyenv_tests.yml
vendored
@@ -1,5 +1,9 @@
|
|||||||
name: pyenv_tests
|
name: pyenv_tests
|
||||||
on: [pull_request, push]
|
on: [pull_request, push]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read # to fetch code (actions/checkout)
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
pyenv_tests:
|
pyenv_tests:
|
||||||
strategy:
|
strategy:
|
||||||
|
|||||||
5
.github/workflows/ubuntu_build.yml
vendored
5
.github/workflows/ubuntu_build.yml
vendored
@@ -1,5 +1,9 @@
|
|||||||
name: ubuntu_build
|
name: ubuntu_build
|
||||||
on: [pull_request, push]
|
on: [pull_request, push]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read # to fetch code (actions/checkout)
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
ubuntu_build:
|
ubuntu_build:
|
||||||
strategy:
|
strategy:
|
||||||
@@ -10,6 +14,7 @@ jobs:
|
|||||||
- "3.8"
|
- "3.8"
|
||||||
- "3.9"
|
- "3.9"
|
||||||
- "3.10"
|
- "3.10"
|
||||||
|
- "3.11"
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
|||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -8,3 +8,5 @@
|
|||||||
/src/*.o
|
/src/*.o
|
||||||
/bats/
|
/bats/
|
||||||
/default-packages
|
/default-packages
|
||||||
|
.idea
|
||||||
|
*.un~
|
||||||
|
|||||||
26
CHANGELOG.md
26
CHANGELOG.md
@@ -1,4 +1,28 @@
|
|||||||
## Version History
|
# Version History
|
||||||
|
|
||||||
|
## 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
|
## Release 2.3.6
|
||||||
|
|
||||||
|
|||||||
@@ -386,11 +386,12 @@ List existing pyenv shims.
|
|||||||
|
|
||||||
Configure the shell environment for pyenv
|
Configure the shell environment for pyenv
|
||||||
|
|
||||||
Usage: eval "$(pyenv init [-|--path] [--no-rehash] [<shell>])"
|
Usage: eval "$(pyenv init [-|--path] [--no-push-path] [--no-rehash] [<shell>])"
|
||||||
|
|
||||||
- Initialize shims directory, print PYENV_SHELL variable, completions path
|
- Initialize shims directory, print PYENV_SHELL variable, completions path
|
||||||
and shell function
|
and shell function
|
||||||
--path Print shims path
|
--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
|
--no-rehash Add no rehash command to output
|
||||||
|
|
||||||
## `pyenv completions`
|
## `pyenv completions`
|
||||||
|
|||||||
30
README.md
30
README.md
@@ -247,7 +247,9 @@ which does install native Windows Python versions.
|
|||||||
|
|
||||||
#### Automatic installer
|
#### Automatic installer
|
||||||
|
|
||||||
Visit our other project:
|
`curl https://pyenv.run | bash`
|
||||||
|
|
||||||
|
For more details visit our other project:
|
||||||
https://github.com/pyenv/pyenv-installer
|
https://github.com/pyenv/pyenv-installer
|
||||||
|
|
||||||
|
|
||||||
@@ -258,14 +260,14 @@ easy to fork and contribute any changes back upstream.
|
|||||||
|
|
||||||
* **Check out Pyenv where you want it installed.**
|
* **Check out Pyenv where you want it installed.**
|
||||||
A good place to choose is `$HOME/.pyenv` (but you can install it somewhere else):
|
A good place to choose is `$HOME/.pyenv` (but you can install it somewhere else):
|
||||||
|
```
|
||||||
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
|
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
|
||||||
|
```
|
||||||
* Optionally, try to compile a dynamic Bash extension to speed up Pyenv. Don't
|
* Optionally, try to compile a dynamic Bash extension to speed up Pyenv. Don't
|
||||||
worry if it fails; Pyenv will still work normally:
|
worry if it fails; Pyenv will still work normally:
|
||||||
|
```
|
||||||
cd ~/.pyenv && src/configure && make -C src
|
cd ~/.pyenv && src/configure && make -C src
|
||||||
|
```
|
||||||
|
|
||||||
### Set up your shell environment for Pyenv
|
### Set up your shell environment for Pyenv
|
||||||
|
|
||||||
@@ -404,21 +406,21 @@ please visit the wiki page about
|
|||||||
|
|
||||||
#### Prefix auto-resolution
|
#### Prefix auto-resolution
|
||||||
|
|
||||||
Pyenv automatically resolves full prefixes to the latest version in the corresponding version line.
|
All Pyenv subcommands except `uninstall` automatically resolve full prefixes to the latest version in the corresponding version line.
|
||||||
E.g. to install the latest 3.10 release:
|
|
||||||
|
`pyenv install` picks the latest known version while other subcommands -- the latest installed version.
|
||||||
|
|
||||||
|
E.g. to install and then switch to the latest 3.10 release:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
pyenv install 3.10
|
pyenv install 3.10
|
||||||
|
pyenv global 3.10
|
||||||
```
|
```
|
||||||
|
|
||||||
The same happens whenever Pyenv selects a version to use.
|
|
||||||
Installation selects the latest version known to Pyenv
|
|
||||||
while switching -- the latest installed version.
|
|
||||||
|
|
||||||
You can run [`pyenv latest <prefix>`](COMMANDS.md#pyenv-latest) to see
|
You can run [`pyenv latest <prefix>`](COMMANDS.md#pyenv-latest) to see
|
||||||
what a specific prefix would be resolved to.
|
what a specific prefix would be resolved to.
|
||||||
|
|
||||||
See the [`pyenv latest` documentation](COMMANDS.md#pyenv-latest) for details on the resolution process.
|
See the [`pyenv latest` documentation](COMMANDS.md#pyenv-latest) for details.
|
||||||
|
|
||||||
|
|
||||||
#### Python versions with extended support
|
#### Python versions with extended support
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
set -e
|
set -e
|
||||||
[ -n "$PYENV_DEBUG" ] && set -x
|
[ -n "$PYENV_DEBUG" ] && set -x
|
||||||
|
|
||||||
version="2.3.6"
|
version="2.3.8"
|
||||||
git_revision=""
|
git_revision=""
|
||||||
|
|
||||||
if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then
|
if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# Summary: Configure the shell environment for pyenv
|
# Summary: Configure the shell environment for pyenv
|
||||||
# Usage: eval "$(pyenv init [-|--path] [--no-rehash] [<shell>])"
|
# Usage: eval "$(pyenv init [-|--path] [--no-push-path] [--detect-shell] [--no-rehash] [<shell>])"
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
[ -n "$PYENV_DEBUG" ] && set -x
|
[ -n "$PYENV_DEBUG" ] && set -x
|
||||||
@@ -9,7 +9,9 @@ set -e
|
|||||||
if [ "$1" = "--complete" ]; then
|
if [ "$1" = "--complete" ]; then
|
||||||
echo -
|
echo -
|
||||||
echo --path
|
echo --path
|
||||||
|
echo --no-push-path
|
||||||
echo --no-rehash
|
echo --no-rehash
|
||||||
|
echo --detect-shell
|
||||||
echo bash
|
echo bash
|
||||||
echo fish
|
echo fish
|
||||||
echo ksh
|
echo ksh
|
||||||
@@ -19,6 +21,7 @@ fi
|
|||||||
|
|
||||||
mode="help"
|
mode="help"
|
||||||
no_rehash=""
|
no_rehash=""
|
||||||
|
no_push_path=""
|
||||||
for args in "$@"
|
for args in "$@"
|
||||||
do
|
do
|
||||||
if [ "$args" = "-" ]; then
|
if [ "$args" = "-" ]; then
|
||||||
@@ -31,6 +34,16 @@ do
|
|||||||
shift
|
shift
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ "$args" = "--detect-shell" ]; then
|
||||||
|
mode="detect-shell"
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$args" = "--no-push-path" ]; then
|
||||||
|
no_push_path=1
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "$args" = "--no-rehash" ]; then
|
if [ "$args" = "--no-rehash" ]; then
|
||||||
no_rehash=1
|
no_rehash=1
|
||||||
shift
|
shift
|
||||||
@@ -69,12 +82,17 @@ function main() {
|
|||||||
print_shell_function
|
print_shell_function
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
|
"detect-shell")
|
||||||
|
detect_profile
|
||||||
|
print_detect_shell
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
# should never get here
|
# should never get here
|
||||||
exit 2
|
exit 2
|
||||||
}
|
}
|
||||||
|
|
||||||
function help_() {
|
function detect_profile() {
|
||||||
case "$shell" in
|
case "$shell" in
|
||||||
bash )
|
bash )
|
||||||
if [ -e '~/.bash_profile' ]; then
|
if [ -e '~/.bash_profile' ]; then
|
||||||
@@ -98,7 +116,16 @@ function help_() {
|
|||||||
rc='your shell'\''s interactive startup file'
|
rc='your shell'\''s interactive startup file'
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
function print_detect_shell() {
|
||||||
|
echo "PYENV_SHELL_DETECT=$shell"
|
||||||
|
echo "PYENV_PROFILE_DETECT=$profile"
|
||||||
|
echo "PYENV_RC_DETECT=$rc"
|
||||||
|
}
|
||||||
|
|
||||||
|
function help_() {
|
||||||
|
detect_profile
|
||||||
{
|
{
|
||||||
case "$shell" in
|
case "$shell" in
|
||||||
fish )
|
fish )
|
||||||
@@ -141,28 +168,56 @@ function init_dirs() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function print_path() {
|
function print_path() {
|
||||||
case "$shell" in
|
# if no_push_path is set, guard the PATH manipulation with a check on whether
|
||||||
fish )
|
# the shim is already in the PATH.
|
||||||
echo 'while set index (contains -i -- '\'"${PYENV_ROOT}/shims"\'' $PATH)'
|
if [ -n "$no_push_path" ]; then
|
||||||
echo 'set -eg PATH[$index]; end; set -e index'
|
case "$shell" in
|
||||||
echo 'set -gx PATH '\'"${PYENV_ROOT}/shims"\'' $PATH'
|
fish )
|
||||||
;;
|
echo 'if not contains -- "'"${PYENV_ROOT}/shims"'" $PATH'
|
||||||
* )
|
print_path_prepend_shims
|
||||||
# Some distros (notably Debian-based) set Bash's SSH_SOURCE_BASHRC compilation option
|
echo 'end'
|
||||||
# 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
|
echo 'if [[ ":$PATH:" != *'\':"${PYENV_ROOT}"/shims:\''* ]]; then'
|
||||||
# (SSH provides /etc/ssh/sshrc and ~/.ssh/rc for that but no-one seems to use them for some reason).
|
print_path_prepend_shims
|
||||||
# This has caused an infinite `bashrc` execution loop for those people in the below nested Bash invocation (#2367).
|
echo 'fi'
|
||||||
# --norc negates this behavior of such a customized Bash.
|
;;
|
||||||
echo 'PATH="$(bash --norc -ec '\''IFS=:; paths=($PATH); '
|
esac
|
||||||
echo 'for i in ${!paths[@]}; do '
|
else
|
||||||
echo 'if [[ ${paths[i]} == "'\'\'"${PYENV_ROOT}/shims"\'\''" ]]; then unset '\'\\\'\''paths[i]'\'\\\'\''; '
|
case "$shell" in
|
||||||
echo 'fi; done; '
|
fish )
|
||||||
echo 'echo "${paths[*]}"'\'')"'
|
echo 'while set pyenv_index (contains -i -- "'"${PYENV_ROOT}/shims"'" $PATH)'
|
||||||
echo 'export PATH="'"${PYENV_ROOT}"'/shims:${PATH}"'
|
echo 'set -eg PATH[$pyenv_index]; end; set -e pyenv_index'
|
||||||
;;
|
print_path_prepend_shims
|
||||||
esac
|
;;
|
||||||
|
* )
|
||||||
|
# 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'
|
||||||
|
;;
|
||||||
|
* )
|
||||||
|
echo 'export PATH="'"${PYENV_ROOT}"'/shims:${PATH}"'
|
||||||
|
;;
|
||||||
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
function print_env() {
|
function print_env() {
|
||||||
|
|||||||
@@ -35,6 +35,12 @@ IFS=$'\n'
|
|||||||
else
|
else
|
||||||
DEFINITION_CANDIDATES=( $(python-build --definitions ) )
|
DEFINITION_CANDIDATES=( $(python-build --definitions ) )
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if printf '%s\n' "${DEFINITION_CANDIDATES[@]}" | grep -qxFe "$prefix"; then
|
||||||
|
echo "$prefix"
|
||||||
|
exit $exitcode;
|
||||||
|
fi
|
||||||
|
|
||||||
# https://stackoverflow.com/questions/11856054/is-there-an-easy-way-to-pass-a-raw-string-to-grep/63483807#63483807
|
# 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")"
|
prefix_re="$(sed 's/[^\^]/[&]/g;s/[\^]/\\&/g' <<< "$prefix")"
|
||||||
# FIXME: more reliable and readable would probably be to loop over them and transform in pure Bash
|
# FIXME: more reliable and readable would probably be to loop over them and transform in pure Bash
|
||||||
|
|||||||
@@ -360,12 +360,38 @@ http_head_aria2c() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
http_get_aria2c() {
|
http_get_aria2c() {
|
||||||
local out="${2:-$(mktemp "out.XXXXXX")}"
|
# aria2c always treats -o argument as a relative path
|
||||||
if aria2c --allow-overwrite=true --no-conf=true -o "${out}" ${ARIA2_OPTS} "$1" >&4; then
|
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 "${out}"
|
[ -n "$2" ] || cat "${out}"
|
||||||
else
|
else
|
||||||
false
|
false
|
||||||
fi
|
fi
|
||||||
|
ret=$?
|
||||||
|
|
||||||
|
if [[ -n "$2" && -n $aria2c_is_snap ]]; then
|
||||||
|
mv "$dir_out/$out" "$real_dir_out/$out"
|
||||||
|
fi
|
||||||
|
return "$ret"
|
||||||
}
|
}
|
||||||
|
|
||||||
http_head_curl() {
|
http_head_curl() {
|
||||||
@@ -1564,6 +1590,8 @@ use_homebrew_zlib() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
use_xcode_sdk_zlib() {
|
use_xcode_sdk_zlib() {
|
||||||
|
# If a custom compiler is used, including XCode SDK will likely break it
|
||||||
|
[[ "${CC:-clang}" != "clang" || "$(command -v clang 2>/dev/null || true)" != "/usr/bin/clang" ]] && return 1
|
||||||
local xc_sdk_path="$(xcrun --show-sdk-path 2>/dev/null || true)"
|
local xc_sdk_path="$(xcrun --show-sdk-path 2>/dev/null || true)"
|
||||||
if [ -d "$xc_sdk_path" ]; then
|
if [ -d "$xc_sdk_path" ]; then
|
||||||
echo "python-build: use zlib from xcode sdk"
|
echo "python-build: use zlib from xcode sdk"
|
||||||
|
|||||||
9
plugins/python-build/share/python-build/3.10.9
Normal file
9
plugins/python-build/share/python-build/3.10.9
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl11
|
||||||
|
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
|
||||||
10
plugins/python-build/share/python-build/3.11.1
Normal file
10
plugins/python-build/share/python-build/3.11.1
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
prefer_openssl11
|
||||||
|
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
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
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.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.0a1" "https://www.python.org/ftp/python/3.12.0/Python-3.12.0a1.tar.xz#7be2bd9b1fc9f64b334660581bb645f0eae0b344c80130f1eb22983a1c292f43" standard verify_py312 copy_python_gdb ensurepip
|
|
||||||
else
|
|
||||||
install_package "Python-3.12.0a1" "https://www.python.org/ftp/python/3.12.0/Python-3.12.0a1.tgz#db4dd2315715e11250175f5dc06fa9d32d4a9fed4db7b6774d4be72d7b94b7e3" standard verify_py312 copy_python_gdb ensurepip
|
|
||||||
fi
|
|
||||||
9
plugins/python-build/share/python-build/3.12.0a3
Normal file
9
plugins/python-build/share/python-build/3.12.0a3
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
prefer_openssl11
|
||||||
|
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=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.12.0a3" "https://www.python.org/ftp/python/3.12.0/Python-3.12.0a3.tar.xz#1b64b3075e0a9241974e580e09b09c9117a1c4e2be698039201ef1d8a73453d1" standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
else
|
||||||
|
install_package "Python-3.12.0a3" "https://www.python.org/ftp/python/3.12.0/Python-3.12.0a3.tgz#fd414e6b6520171f5cefc5cba1067265187a322417f7bdec8d024db7fc8fbe96" standard verify_py312 copy_python_gdb ensurepip
|
||||||
|
fi
|
||||||
9
plugins/python-build/share/python-build/3.7.16
Normal file
9
plugins/python-build/share/python-build/3.7.16
Normal file
@@ -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
|
||||||
9
plugins/python-build/share/python-build/3.8.16
Normal file
9
plugins/python-build/share/python-build/3.8.16
Normal file
@@ -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.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
|
||||||
9
plugins/python-build/share/python-build/3.9.16
Normal file
9
plugins/python-build/share/python-build/3.9.16
Normal file
@@ -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.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
|
||||||
@@ -0,0 +1,310 @@
|
|||||||
|
From: Christian Hammond <christian@beanbaginc.com>
|
||||||
|
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)
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
From 245427d207ee88a4ba26a66c3de350bcbcc036f2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ronald Oussoren <ronaldoussoren@mac.com>
|
||||||
|
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 <fonini@ip.tv>
|
||||||
|
---
|
||||||
|
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
|
||||||
|
|
||||||
@@ -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 <openssl/err.h>
|
||||||
|
#include "internal/nelem.h"
|
||||||
|
|
||||||
|
+#include <string.h>
|
||||||
|
#include "testutil.h"
|
||||||
|
|
||||||
|
static const char *infile;
|
||||||
@@ -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 <openssl/err.h>
|
||||||
|
#include "internal/nelem.h"
|
||||||
|
|
||||||
|
+#include <string.h>
|
||||||
|
#include "testutil.h"
|
||||||
|
|
||||||
|
static const char *infile;
|
||||||
@@ -21,7 +21,7 @@ setup() {
|
|||||||
@test "using aria2c if available" {
|
@test "using aria2c if available" {
|
||||||
export PYTHON_BUILD_ARIA2_OPTS=
|
export PYTHON_BUILD_ARIA2_OPTS=
|
||||||
export -n PYTHON_BUILD_HTTP_CLIENT
|
export -n PYTHON_BUILD_HTTP_CLIENT
|
||||||
stub aria2c "--allow-overwrite=true --no-conf=true -o * http://example.com/* : cp $FIXTURE_ROOT/\${5##*/} \$4"
|
stub aria2c "--allow-overwrite=true --no-conf=true -d * -o * http://example.com/* : cp $FIXTURE_ROOT/\${7##*/} \$6"
|
||||||
|
|
||||||
install_fixture definitions/without-checksum
|
install_fixture definitions/without-checksum
|
||||||
assert_success
|
assert_success
|
||||||
|
|||||||
@@ -2,5 +2,6 @@
|
|||||||
activate
|
activate
|
||||||
activate.csh
|
activate.csh
|
||||||
activate.fish
|
activate.fish
|
||||||
|
activate.nu
|
||||||
# gettext (#688)
|
# gettext (#688)
|
||||||
gettext.sh
|
gettext.sh
|
||||||
|
|||||||
@@ -98,7 +98,6 @@ echo "\$PATH"
|
|||||||
command -v fish >/dev/null || skip "-- fish not installed"
|
command -v fish >/dev/null || skip "-- fish not installed"
|
||||||
OLDPATH="$PATH"
|
OLDPATH="$PATH"
|
||||||
export PATH="${BATS_TEST_DIRNAME}/nonexistent:${PYENV_ROOT}/shims:$PATH"
|
export PATH="${BATS_TEST_DIRNAME}/nonexistent:${PYENV_ROOT}/shims:$PATH"
|
||||||
# fish 2 (Ubuntu Bionic) adds spurious messages when setting PATH, messing up the output
|
|
||||||
run fish <<!
|
run fish <<!
|
||||||
set -x PATH "$PATH"
|
set -x PATH "$PATH"
|
||||||
pyenv init - | source
|
pyenv init - | source
|
||||||
@@ -108,6 +107,50 @@ echo "\$PATH"
|
|||||||
assert_output "${PYENV_ROOT}/shims:${BATS_TEST_DIRNAME}/nonexistent:${OLDPATH//${PYENV_ROOT}\/shims:/}"
|
assert_output "${PYENV_ROOT}/shims:${BATS_TEST_DIRNAME}/nonexistent:${OLDPATH//${PYENV_ROOT}\/shims:/}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@test "adds shims to PATH with --no-push-path if they're not on PATH" {
|
||||||
|
export PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:/bin:/usr/local/bin"
|
||||||
|
run bash -e <<!
|
||||||
|
eval "\$(pyenv-init - --no-push-path)"
|
||||||
|
echo "\$PATH"
|
||||||
|
!
|
||||||
|
assert_success
|
||||||
|
assert_output "${PYENV_ROOT}/shims:${PATH}"
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "adds shims to PATH with --no-push-path if they're not on PATH (fish)" {
|
||||||
|
command -v fish >/dev/null || skip "-- fish not installed"
|
||||||
|
export PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:/bin:/usr/local/bin"
|
||||||
|
run fish <<!
|
||||||
|
set -x PATH "$PATH"
|
||||||
|
pyenv-init - --no-push-path| source
|
||||||
|
echo "\$PATH"
|
||||||
|
!
|
||||||
|
assert_success
|
||||||
|
assert_output "${PYENV_ROOT}/shims:${PATH}"
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "doesn't change PATH with --no-push-path if shims are already on PATH" {
|
||||||
|
export PATH="${BATS_TEST_DIRNAME}/../libexec:${PYENV_ROOT}/shims:/usr/bin:/bin:/usr/local/bin"
|
||||||
|
run bash -e <<!
|
||||||
|
eval "\$(pyenv-init - --no-push-path)"
|
||||||
|
echo "\$PATH"
|
||||||
|
!
|
||||||
|
assert_success
|
||||||
|
assert_output "${PATH}"
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "doesn't change PATH with --no-push-path if shims are already on PATH (fish)" {
|
||||||
|
command -v fish >/dev/null || skip "-- fish not installed"
|
||||||
|
export PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:${PYENV_ROOT}/shims:/bin:/usr/local/bin"
|
||||||
|
run fish <<!
|
||||||
|
set -x PATH "$PATH"
|
||||||
|
pyenv-init - --no-push-path| source
|
||||||
|
echo "\$PATH"
|
||||||
|
!
|
||||||
|
assert_success
|
||||||
|
assert_output "${PATH}"
|
||||||
|
}
|
||||||
|
|
||||||
@test "outputs sh-compatible syntax" {
|
@test "outputs sh-compatible syntax" {
|
||||||
run pyenv-init - bash
|
run pyenv-init - bash
|
||||||
assert_success
|
assert_success
|
||||||
|
|||||||
@@ -64,6 +64,21 @@ pyenv: no known versions match the prefix \`3.8'
|
|||||||
!
|
!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@test "complete name resolves to itself" {
|
||||||
|
create_executable pyenv-versions <<!
|
||||||
|
#!$BASH
|
||||||
|
echo foo
|
||||||
|
echo foo.bar
|
||||||
|
!
|
||||||
|
|
||||||
|
run pyenv-latest foo
|
||||||
|
assert_success
|
||||||
|
assert_output <<!
|
||||||
|
foo
|
||||||
|
!
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@test "sort CPython" {
|
@test "sort CPython" {
|
||||||
create_executable pyenv-versions <<!
|
create_executable pyenv-versions <<!
|
||||||
#!$BASH
|
#!$BASH
|
||||||
|
|||||||
Reference in New Issue
Block a user