1
0
mirror of https://github.com/pyenv/pyenv.git synced 2025-11-09 12:03:49 -05:00

Compare commits

...

37 Commits

Author SHA1 Message Date
Anton Petrov
05ca057bb2 Update pyenv---version 2021-10-05 17:32:37 +03:00
Anton Petrov
108a10a198 Update CHANGELOG.md 2021-10-05 17:32:15 +03:00
Anton Petrov
979e6f0a61 Merge pull request #2096 from ashwinvis/patch-1
Fix mambaforge-pypy3 build
2021-10-05 17:24:58 +03:00
Ashwin V. Mohanan
2a9c18372a Update mambaforge-pypy3
Fix typo `ase` -> `case`
2021-10-05 15:28:13 +02:00
native-api
8315e1528b Create FUNDING.yml 2021-10-05 12:27:48 +03:00
Anton Petrov
c81a28105f Merge pull request #2093 from Parnassius/py310
Add Python 3.10.0
2021-10-04 22:28:30 +03:00
Parnassius
d601efa0d5 Add Python 3.10.0 2021-10-04 21:16:19 +02:00
sandipanpanda
0688b17cc1 Add documentation for exec command (#2090) 2021-10-02 23:15:18 +03:00
sandipanpanda
bb6a747c02 Add documentation for shims command (#2091) 2021-10-02 23:10:37 +03:00
sandipanpanda
681d31bc36 Add documentation for hooks command (#2089) 2021-10-02 20:00:24 +03:00
sandipanpanda
3b1bc86031 Add documentation for root command (#2088)
* Add documentation for root command
2021-10-02 19:58:56 +03:00
sandipanpanda
6139b51af4 Add documentaion for prefix command (#2087) 2021-10-02 19:54:12 +03:00
Ivan Pozdeev
10a8c83888 Merge branch 'master' of https://github.com/pyenv/pyenv 2021-10-01 02:30:41 +03:00
Ivan Pozdeev
9985f7b436 Honor CONFIGURE_OPTS as well as PYTHON_CONFIGURE_OPTS when detecting options 2021-10-01 02:30:28 +03:00
Kevin Modzelewski
a7895e6ea8 Update to Pyston's v2 package of the 2.3.1 release (#2078)
This one gets rid of the extra "usr" subdirectory that we had and now fits the format that pyenv expects
2021-09-28 21:12:46 +03:00
Anton Petrov
7dd48d1665 Merge pull request #2075 from kmod/pyston_2.3.1
Add pyston-2.3.1 support
2021-09-27 21:45:33 +03:00
Kevin Modzelewski
11c54713bb This looks unnecessary now 2021-09-24 17:23:35 -04:00
Kevin Modzelewski
3051d21004 Add pyston-2.3.1 support
We changed the directory structure for pyston 2.3.1 slightly, where we now
include a top-level "pyston-2.3.1" directory when you unpack the tarball.
2021-09-24 15:10:50 -04:00
Anton Petrov
9ecfdd1073 Merge pull request #2074 from anton-petrov/master
Don't update conda when installing pip
2021-09-23 12:47:50 +03:00
Anton Petrov
47d3dee0bb Fix 2021-09-23 12:26:46 +03:00
Anton Petrov
0a3b72d890 Don't update conda when installing pip 2021-09-23 12:00:09 +03:00
native-api
f018056165 Merge pull request #2072 from aphedges/improve-add_miniconda 2021-09-21 08:07:42 +03:00
Alex Hedges
af55330d37 Add miniconda2-2.7-4.8.3, miniconda3-3.7-4.10.3, miniconda3-3.8-4.10.3, miniconda3-3.9-4.10.3 2021-09-21 08:06:57 +03:00
native-api
0211c345f7 Merge pull request #2073 from native-api/github_actions_tests
GitHub actions tests
2021-09-21 07:55:28 +03:00
Ivan Pozdeev
2f8c625a7d Fix test failures 2021-09-21 07:44:03 +03:00
Ivan Pozdeev
e28661c7e2 Fix random "broken pipe" 2021-09-21 07:43:58 +03:00
Ivan Pozdeev
6882be06a6 Bats: report unstub failure details 2021-09-21 07:43:58 +03:00
Ivan Pozdeev
c6c4e41eb9 Bats: show output on failed assertions 2021-09-21 05:07:17 +03:00
Ivan Pozdeev
f504b01818 consistent message 2021-09-21 05:07:12 +03:00
Ivan Pozdeev
876be1bb04 Bats: path_without: support multiple args 2021-09-21 05:07:12 +03:00
Ivan Pozdeev
6185bb55e6 allow for sys.executable to be different 2021-09-21 05:07:06 +03:00
Ivan Pozdeev
7f714c34ba Bats 1.2 requires readline from gnu coreutils in MacOS 2021-09-21 05:07:06 +03:00
Ivan Pozdeev
848e56e992 Add Pyenv tests to Github Actions
Now that Travis check has been removed from the repo
2021-09-21 05:07:06 +03:00
Alex Hedges
8b07b92c37 Support newer miniconda filenames 2021-09-20 19:47:26 -04:00
Alex Hedges
3a20ce7555 Add default verbosity to add_miniconda.py
Required to prevent a crash when no verbosity given.
2021-09-20 19:30:45 -04:00
rallyemax
0c6ad7c52b Fix sed commands (#2071)
In GNU `sed`, the `-iEe` argument is equivalent to `--in-place=Ee`, which would create `~/.profileEe` as backup of `~/.profile` if the command executed successfully. However, because the `e` is no longer being processed as an expression argument, `sed` does not correctly join the expressions and exits with `sed: -e expression #2, char 10: unexpected }`.

The intent is to use extended regex, perform the changes in-place, and use a series of expressions, so `-Ei -e` is used instead.
2021-09-21 00:30:11 +03:00
Takumi Sueda
1bd397112a Add Python 2.7.18 patches for Apple Silicon machines (#2061) 2021-09-20 22:10:58 +03:00
36 changed files with 1118 additions and 85 deletions

12
.github/FUNDING.yml vendored Normal file
View File

@@ -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']

35
.github/workflows/pyenv_tests.yml vendored Normal file
View File

@@ -0,0 +1,35 @@
name: pyenv_tests
on: [pull_request, push]
jobs:
pyenv_tests:
strategy:
fail-fast: false
matrix:
os:
- ubuntu-20.04
- ubuntu-18.04
- macos-11
- macos-10.15
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v2
# Normally, we would use the superbly maintained...
# - uses: actions/setup-python@v2
# with:
# python-version: ${{ matrix.python-version }}
# ... but in the repo, we want to test pyenv builds on Ubuntu
# - run: |
# sudo apt-get install -y build-essential libssl-dev zlib1g-dev libbz2-dev \
# libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
# xz-utils tk-dev libffi-dev liblzma-dev python-openssl git
# https://github.com/pyenv/pyenv#installation
- run: |
if test "$RUNNER_OS" == "macOS"; then brew install coreutils; fi
- run: pwd
- env:
PYENV_ROOT: /home/runner/work/pyenv/pyenv
run: |
echo $PYENV_ROOT
echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH
- run: |
make test

View File

@@ -12,7 +12,7 @@ jobs:
- 3.7.10
- 3.8.10
- 3.9.5
- 3.10.0rc2
- 3.10.0
runs-on: Ubuntu-20.04
steps:
- uses: actions/checkout@v2

View File

@@ -1,5 +1,21 @@
## Version History
## 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 documentaion 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)

View File

@@ -16,7 +16,11 @@ The most common subcommands are:
* [`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 hooks`](#pyenv-hooks)
* [`pyenv shims`](#pyenv-shims)
## `pyenv commands`
@@ -278,3 +282,66 @@ Lists all Python versions with the given command installed.
2.6.8
2.7.6
3.3.3
## `pyenv exec`
`Usage: pyenv exec <command> [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 directory where a Python version is installed. If no
version is given, `pyenv prefix` displays the location of the
currently selected version.
$ pyenv prefix 3.9.7
/home/user/.pyenv/versions/3.9.7
## `pyenv hooks`
Lists installed hook scripts for a given pyenv command.
Usage: pyenv hooks <command>
## `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

View File

@@ -239,7 +239,7 @@ easy to fork and contribute any changes back upstream.
~~~bash
# the sed invocation inserts the lines at the start of the file
# after any initial comment lines
sed -iEe '/^([^#]|$)/ {a \
sed -Ei -e '/^([^#]|$)/ {a \
export PYENV_ROOT="$HOME/.pyenv"
a \
export PATH="$PYENV_ROOT/bin:$PATH"
@@ -253,7 +253,7 @@ easy to fork and contribute any changes back upstream.
- **If your `~/.bash_profile` sources `~/.bashrc` (Red Hat, Fedora, CentOS):**
~~~ bash
sed -iEe '/^([^#]|$)/ {a \
sed -Ei -e '/^([^#]|$)/ {a \
export PYENV_ROOT="$HOME/.pyenv"
a \
export PATH="$PYENV_ROOT/bin:$PATH"

View File

@@ -12,7 +12,7 @@
set -e
[ -n "$PYENV_DEBUG" ] && set -x
version="2.0.7"
version="2.1.0"
git_revision=""
if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then

View File

@@ -44,8 +44,9 @@ extract_initial_comment_block() {
}
collect_documentation() {
# shellcheck disable=SC2016
$(type -P gawk awk | head -1) '
# `tail` prevents "broken pipe" errors due to `head` closing thge 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 -1) '
/^Summary:/ {
summary = substr($0, 10)
next

View File

@@ -858,8 +858,8 @@ build_package_jython_builder() {
( cd "dist" && build_package_jython )
}
build_package_pyston() {
# currently supported version 2.2 and upper
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
@@ -876,6 +876,11 @@ build_package_pyston() {
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"
@@ -1042,7 +1047,9 @@ build_package_anaconda() {
build_package_miniconda() {
build_package_anaconda "$@"
"${PREFIX_PATH}/bin/conda" install --yes "pip"
# 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() {
@@ -1647,7 +1654,7 @@ apply_python_patch() {
}
build_package_symlink_version_suffix() {
if [[ "$PYTHON_CONFIGURE_OPTS" == *"--enable-framework"* ]]; then
if [[ "$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-frameowrk` (#590)
rm -rf "${PREFIX_PATH}/bin.orig"
@@ -2096,7 +2103,7 @@ fi
package_option python configure --libdir="${PREFIX_PATH}/lib"
# python-build: Set `RPATH` if `--enable-shared` was given (#65, #66, #82)
if [[ "$CONFIGURE_OPTS" == *"--enable-shared"* ]] || [[ "$PYTHON_CONFIGURE_OPTS" == *"--enable-shared"* ]]; then
if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" == *"--enable-shared"* ]]; then
# The ld on Darwin embeds the full paths to each dylib by default
if [[ "$LDFLAGS" != *"-rpath="* ]] && ! is_mac; then
export LDFLAGS="-Wl,-rpath=${PREFIX_PATH}/lib ${LDFLAGS}"
@@ -2109,7 +2116,7 @@ if [[ "$PYPY_OPTS" == *"--shared"* ]]; then
fi
# Add support for framework installation (`--enable-framework`) of CPython (#55, #99)
if [[ "$PYTHON_CONFIGURE_OPTS" == *"--enable-framework"* ]]; then
if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" == *"--enable-framework"* ]]; then
if ! is_mac; then
echo "python-build: framework installation is not supported." >&2
exit 1
@@ -2130,7 +2137,7 @@ if [[ "$PYTHON_CONFIGURE_OPTS" == *"--enable-framework"* ]]; then
fi
# Build against universal SDK (#219, #220)
if [[ "$PYTHON_CONFIGURE_OPTS" == *"--enable-universalsdk"* ]]; then
if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" == *"--enable-universalsdk"* ]]; then
if ! is_mac; then
echo "python-build: universal installation is not supported." >&2
exit 1

View File

@@ -44,7 +44,7 @@ esac
install_line_fmt = """
"{os}-{arch}" )
install_script "Miniconda{suffix}-{version_str}-{os}-{arch}" "{repo}/Miniconda{suffix}-{version_str}-{os}-{arch}.sh#{md5}" "miniconda" verify_{py_version}
install_script "Miniconda{suffix}-{version_py_version}{version_str}-{os}-{arch}" "{repo}/Miniconda{suffix}-{version_py_version}{version_str}-{os}-{arch}.sh#{md5}" "miniconda" verify_{py_version}
;;
""".strip()
@@ -126,17 +126,29 @@ class VersionStr(str):
class MinicondaVersion(NamedTuple):
suffix: Suffix
version_str: VersionStr
py_version: Optional[PyVersion]
@classmethod
def from_str(cls, s):
miniconda_n, ver = s.split("-")
return MinicondaVersion(Suffix(miniconda_n[-1]), VersionStr(ver))
components = s.split("-")
if len(components) == 3:
miniconda_n, py_ver, ver = components
py_ver = PyVersion(f"py{py_ver.replace('.', '')}")
else:
miniconda_n, ver = components
py_ver = None
return MinicondaVersion(Suffix(miniconda_n[-1]), VersionStr(ver), py_ver)
def to_filename(self):
if self.py_version:
return f"miniconda{self.suffix}-{self.py_version.version()}-{self.version_str}"
else:
return f"miniconda{self.suffix}-{self.version_str}"
def default_py_version(self):
if self.suffix == Suffix.TWO:
if self.py_version:
return self.py_version
elif self.suffix == Suffix.TWO:
return PyVersion.PY27
elif self.version_str.info() < (4, 7):
# https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-python.html
@@ -146,7 +158,7 @@ class MinicondaVersion(NamedTuple):
def with_version_triple(self):
return MinicondaVersion(
self.suffix, VersionStr.from_info(self.version_str.info()[:3])
self.suffix, VersionStr.from_info(self.version_str.info()[:3]), self.py_version
)
@@ -160,8 +172,13 @@ class MinicondaSpec(NamedTuple):
@classmethod
def from_filestem(cls, stem, md5, py_version=None):
miniconda_n, ver, os, arch = stem.split("-")
if ver.startswith("py"):
py_ver, ver = ver.split("_", maxsplit=1)
py_ver = PyVersion(py_ver)
else:
py_ver = None
spec = MinicondaSpec(
MinicondaVersion(Suffix(miniconda_n[-1]), VersionStr(ver)),
MinicondaVersion(Suffix(miniconda_n[-1]), VersionStr(ver), py_ver),
SupportedOS(os),
SupportedArch(arch),
md5,
@@ -175,6 +192,7 @@ class MinicondaSpec(NamedTuple):
repo=MINICONDA_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,
@@ -250,7 +268,7 @@ if __name__ == "__main__":
help="Do not write scripts, just report them to stdout",
)
parser.add_argument(
"-v", "--verbose", action="count",
"-v", "--verbose", action="count", default=0,
help="Increase verbosity of logging",
)
parsed = parser.parse_args()

View File

@@ -4,7 +4,7 @@ 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.10.0rc2" "https://www.python.org/ftp/python/3.10.0/Python-3.10.0rc2.tar.xz#e75b56088548b7b9ad1f2571e6f5a2315e4808cb6b5fbe8288502afc802b2f24" standard verify_py310 copy_python_gdb ensurepip
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.0rc2" "https://www.python.org/ftp/python/3.10.0/Python-3.10.0rc2.tgz#0f8bf53dbe6f85785d502e73984aa3f12f67ac4958d9b8d8012019c35c646fe2" standard verify_py310 copy_python_gdb ensurepip
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

View File

@@ -1,4 +1,4 @@
ase "$(anaconda_architecture 2>/dev/null || true)" in
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
;;

View File

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

View File

@@ -0,0 +1,19 @@
case "$(anaconda_architecture 2>/dev/null || true)" in
"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-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

View File

@@ -0,0 +1,19 @@
case "$(anaconda_architecture 2>/dev/null || true)" in
"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-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

View File

@@ -0,0 +1,19 @@
case "$(anaconda_architecture 2>/dev/null || true)" in
"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-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

View File

@@ -0,0 +1,41 @@
From 5495fb4719fa67ea3abeda0434699c8b28c77bb3 Mon Sep 17 00:00:00 2001
From: Takumi Sueda <puhitaku@gmail.com>
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

View File

@@ -0,0 +1,237 @@
From f17b9e30bd295b1eec68105e3f04568477ce6286 Mon Sep 17 00:00:00 2001
From: Takumi Sueda <puhitaku@gmail.com>
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

View File

@@ -0,0 +1,34 @@
From d93a26fee21a5f91c51d8cb14ecaf29122f1b222 Mon Sep 17 00:00:00 2001
From: Takumi Sueda <puhitaku@gmail.com>
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

View File

@@ -0,0 +1,85 @@
From a1b08c7de72c27d80a86b92c263d1f5b351e581b Mon Sep 17 00:00:00 2001
From: Takumi Sueda <puhitaku@gmail.com>
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

View File

@@ -0,0 +1,221 @@
From 4394ec26842b04335b30b9a0595fcc8591c68496 Mon Sep 17 00:00:00 2001
From: Takumi Sueda <puhitaku@gmail.com>
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

View File

@@ -0,0 +1,108 @@
From 43819cd35cddd189cbe513032e76f1c1a6ec6d8c Mon Sep 17 00:00:00 2001
From: Takumi Sueda <puhitaku@gmail.com>
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

View File

@@ -0,0 +1,40 @@
From 41ee254166bb690feb665991fc2442e335631314 Mon Sep 17 00:00:00 2001
From: Takumi Sueda <puhitaku@gmail.com>
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

View File

@@ -6,7 +6,7 @@ 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" "pyston" verify_py38 get_pip
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

View File

@@ -6,7 +6,7 @@ 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" "pyston" verify_py38 get_pip
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

View File

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

View File

@@ -160,17 +160,15 @@ OUT
brew_libdir="$TMP/homebrew-yaml"
mkdir -p "$brew_libdir"
# pyenv/pyenv#1026
stub uname false false
stub uname '-s : echo Linux'
stub uname '-s : echo Darwin'
for i in {1..4}; do stub uname '-s : echo Darwin'; done
for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done
stub brew "--prefix libyaml : echo '$brew_libdir'" false false
stub_make_install
install_fixture definitions/needs-yaml
assert_success
unstub sw_vers
unstub uname
unstub brew
unstub make

View File

@@ -63,13 +63,9 @@ DEF
mkdir -p "$INSTALL_ROOT"
cd "$INSTALL_ROOT"
# pyenv/pyenv#1026
stub uname false '-s : echo Darwin' false '-s : echo Darwin' '-s : echo Darwin'
stub sw_vers '-productVersion : echo 10.10'
for i in {1..5}; do stub uname '-s : echo Darwin'; done
for i in {1..4}; do stub sw_vers '-productVersion : echo 10.10'; done
stub sw_vers '-productVersion : echo 10.10'
stub sw_vers '-productVersion : echo 10.10'
stub sw_vers '-productVersion : echo 10.10'
stub cc 'false'
stub brew 'false'
stub make \

View File

@@ -136,7 +136,7 @@ OUT
@test "apply built-in python patches should be sorted by its name" {
cached_tarball "Python-3.6.2"
stub brew false
for i in {1..2}; do stub brew '* : false'; done
stub_make_install
stub patch ' : for arg; do [[ "$arg" == "-"* ]] || sed -e "s/^/patch: /" "$arg"; done >> build.log'
@@ -144,9 +144,7 @@ OUT
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"
# yyuu/pyenv#257
stub uname '-s : echo Linux'
stub uname '-s : echo Linux'
for i in {1..2}; do stub uname '-s : echo Linux'; done
TMPDIR="$TMP" install_tmp_fixture definitions/vanilla-python < /dev/null
assert_success
@@ -173,9 +171,7 @@ OUT
" : echo \"$MAKE \$@\" >> build.log" \
" : echo \"$MAKE \$@\" >> build.log && cat build.log >> '$INSTALL_ROOT/build.log'"
# yyuu/pyenv#257
stub uname '-s : echo Linux'
stub uname '-s : echo Linux'
for i in {1..4}; do stub uname '-s : echo Darwin'; done
PYTHON_MAKE_INSTALL_TARGET="altinstall" TMPDIR="$TMP" install_tmp_fixture definitions/vanilla-python < /dev/null
assert_success
@@ -259,10 +255,7 @@ OUT
touch "${INSTALL_ROOT}/Library/Frameworks/Python.framework/Versions/Current/bin/python3.4-config"
chmod +x "${INSTALL_ROOT}/Library/Frameworks/Python.framework/Versions/Current/bin/python3.4-config"
# yyuu/pyenv#257
stub uname '-s : echo Darwin'
stub uname '-s : echo Darwin'
for i in {1..3}; do stub uname '-s : echo Darwin'; done
PYTHON_CONFIGURE_OPTS="--enable-framework" TMPDIR="$TMP" run_inline_definition <<OUT
echo "PYTHON_CONFIGURE_OPTS_ARRAY=(\${PYTHON_CONFIGURE_OPTS_ARRAY[@]})"
@@ -278,10 +271,8 @@ EOS
}
@test "enable universalsdk" {
# yyuu/pyenv#257
stub uname '-s : echo Darwin'
stub uname '-s : echo Darwin'
for i in {1..3}; do stub uname '-s : echo Darwin'; done
PYTHON_CONFIGURE_OPTS="--enable-universalsdk" TMPDIR="$TMP" run_inline_definition <<OUT
echo "PYTHON_CONFIGURE_OPTS_ARRAY=(\${PYTHON_CONFIGURE_OPTS_ARRAY[@]})"
@@ -295,7 +286,8 @@ EOS
@test "enable custom unicode configuration" {
cached_tarball "Python-3.6.2"
stub brew false
for i in {1..2}; do stub brew '* : false'; done
for i in {1..3}; do stub uname '-s : echo Linux'; done
stub "$MAKE" \
" : echo \"$MAKE \$@\" >> build.log" \
" : echo \"$MAKE \$@\" >> build.log && cat build.log >> '$INSTALL_ROOT/build.log'"
@@ -311,6 +303,8 @@ make install
OUT
unstub make
unstub uname
unstub brew
}
@test "default MACOSX_DEPLOYMENT_TARGET" {

View File

@@ -11,11 +11,10 @@ _STUB_RUN="${PROGRAM}_STUB_RUN"
_STUB_INDEX="${PROGRAM}_STUB_INDEX"
_STUB_RESULT="${PROGRAM}_STUB_RESULT"
_STUB_END="${PROGRAM}_STUB_END"
_STUB_DEBUG="${PROGRAM}_STUB_DEBUG"
_STUB_LOG="${PROGRAM}_STUB_LOG"
if [ -n "${!_STUB_DEBUG}" ]; then
echo "$program" "$@" >&${!_STUB_DEBUG}
fi
[ -n "${!_STUB_LOG}" ] || eval "${_STUB_LOG}"="${TMPDIR}/${program}-stub-log"
if test -z "${!_STUB_END}"; then echo "$program" "$@" >>"${!_STUB_LOG}"; fi
[ -e "${!_STUB_PLAN}" ] || exit 1
[ -n "${!_STUB_RUN}" ] || eval "${_STUB_RUN}"="${TMPDIR}/${program}-stub-run"
@@ -24,7 +23,7 @@ fi
# Initialize or load the stub run information.
eval "${_STUB_INDEX}"=1
eval "${_STUB_RESULT}"=0
[ ! -e "${!_STUB_RUN}" ] || source "${!_STUB_RUN}"
if test -e "${!_STUB_RUN}"; then source "${!_STUB_RUN}"; fi
# Loop over each line in the plan.
@@ -80,14 +79,39 @@ done < "${!_STUB_PLAN}"
if [ -n "${!_STUB_END}" ]; then
# Clean up the run file.
rm -f "${!_STUB_RUN}"
# 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
{
echo "index: $index; stub index: ${!_STUB_INDEX}"
echo "plan:"
cat "${!_STUB_PLAN}"
echo "run:"
cat "${!_STUB_RUN}"
echo "log:"
cat "${!_STUB_LOG}"
} >&2
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}"
# Clean up the run file.
rm -f "${!_STUB_RUN}"
rm -f "${!_STUB_LOG}"
# Return the result.
exit "${!_STUB_RESULT}"

View File

@@ -25,6 +25,7 @@ stub() {
export "${prefix}_STUB_PLAN"="${TMP}/${program}-stub-plan"
export "${prefix}_STUB_RUN"="${TMP}/${program}-stub-run"
export "${prefix}_STUB_LOG"="${TMP}/${program}-stub-log"
export "${prefix}_STUB_END"=
mkdir -p "${TMP}/bin"

View File

@@ -32,8 +32,7 @@ static_version="$(grep VERSION "$bats_bin" | head -1 | cut -d'"' -f 2)"
@test "git remote doesn't match" {
stub git \
'remote -v : echo origin https://github.com/Homebrew/homebrew.git' \
"describe --tags HEAD : echo v1984-12-gSHA"
'remote -v : echo origin https://github.com/Homebrew/homebrew.git'
run python-build --version
assert_success "python-build ${static_version}"
}

View File

@@ -79,7 +79,7 @@ OUT
}
@test "sys.executable with system version (#98)" {
system_python=$(which python3)
system_python="$(python3 -c 'import sys; print(sys.executable)')"
PYENV_VERSION="custom"
create_executable "python3" ""

View File

@@ -25,7 +25,7 @@ load test_helper
}
#Arch has Python at sbin as well as bin
@test "prefix for sbin system" {
@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"
@@ -46,6 +46,6 @@ OUT
}
@test "prefix for invalid system" {
PATH="$(path_without python)" run pyenv-prefix system
PATH="$(path_without python python2 python3)" run pyenv-prefix system
assert_failure "pyenv: system version not found in PATH"
}

View File

@@ -44,7 +44,8 @@ flunk() {
assert_success() {
if [ "$status" -ne 0 ]; then
flunk "command failed with exit status $status"
flunk "command failed with exit status $status" $'\n'\
"output: $output"
elif [ "$#" -gt 0 ]; then
assert_output "$1"
fi
@@ -52,7 +53,8 @@ assert_success() {
assert_failure() {
if [ "$status" -eq 0 ]; then
flunk "expected failed exit status"
flunk "expected failed exit status" $'\n'\
"output: $output"
elif [ "$#" -gt 0 ]; then
assert_output "$1"
fi
@@ -111,15 +113,15 @@ assert() {
# 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 exe="$1"
local path=":${PATH}:"
for exe; do
local found alt util
for found in $(which -a "$exe"); do
for found in $(PATH="$path" which -a "$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
for util in bash head cut readlink greadlink which; do
if [ -x "${found}/$util" ]; then
ln -s "${found}/$util" "${alt}/$util"
fi
@@ -127,8 +129,10 @@ path_without() {
path="${path/:${found}:/:${alt}:}"
fi
done
done
path="${path#:}"
echo "${path%:}"
path="${path%:}"
echo "$path"
}
create_hook() {

View File

@@ -25,7 +25,7 @@ stub_system_python() {
}
@test "not even system python available" {
PATH="$(path_without python)" run pyenv-versions
PATH="$(path_without python python2 python3)" run pyenv-versions
assert_failure
assert_output "Warning: no Python detected on the system"
}