diff --git a/README.md b/README.md
index d79b548e..3a87011f 100644
--- a/README.md
+++ b/README.md
@@ -17,18 +17,19 @@ What does it do?
| | macOS x86_64 | Windows 64bit | Windows 32bit | manylinux x86_64 | manylinux i686 | manylinux aarch64 | manylinux ppc64le | manylinux s390x |
|---|---|---|---|---|---|---|---|---|
-| CPython 2.7 | ✅ | ✅¹ | ✅¹ | ✅ | ✅ | | | |
-| CPython 3.5 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅² |
-| CPython 3.6 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅² |
-| CPython 3.7 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅² |
-| CPython 3.8 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅² |
-| CPython 3.9³ | 🛠 | 🛠 | 🛠 | 🛠 | 🛠 | 🛠 | 🛠 | |
-| PyPy 2.7 v7.3.0 | ✅ | | ✅ | ✅ | | | | |
-| PyPy 3.6 v7.3.0 | ✅ | | ✅ | ✅ | | | | |
+| CPython 2.7 | ✅ | ✅¹ | ✅¹ | ✅ | ✅ | | | |
+| CPython 3.5 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅² | ✅² | ✅³ |
+| CPython 3.6 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅² | ✅² | ✅³ |
+| CPython 3.7 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅² | ✅² | ✅³ |
+| CPython 3.8 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅² | ✅² | ✅³ |
+| CPython 3.9 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅² | ✅⁴ | ✅³ |
+| PyPy 2.7 v7.3.0 | ✅ | | ✅ | ✅ | | | | |
+| PyPy 3.6 v7.3.0 | ✅ | | ✅ | ✅ | | | | |
¹ Not supported on Travis
-² Beta support until Travis CI fixes a bug
-³ Python 3.9 is not yet ABI stable, so you shouldn't publish wheels with it yet. But if you want to check that your wheels build on Python 3.9, try our [`python3.9` branch](https://github.com/joerick/cibuildwheel/pull/382)!
+² Only supported on Travis
+³ Beta support until Travis CI fixes a bug
+⁴ Only Python 3.9 beta 3 is supported, until a bug in building the manylinux2014 is fixed
- Builds manylinux, macOS and Windows wheels for CPython and PyPy using Azure Pipelines, Travis CI, AppVeyor, and CircleCI
- Bundles shared library dependencies on Linux and macOS through [auditwheel](https://github.com/pypa/auditwheel) and [delocate](https://github.com/matthew-brett/delocate)
diff --git a/cibuildwheel/linux.py b/cibuildwheel/linux.py
index bb80fda8..ce0806c4 100644
--- a/cibuildwheel/linux.py
+++ b/cibuildwheel/linux.py
@@ -50,26 +50,31 @@ def get_python_configurations(build_selector: BuildSelector) -> List[PythonConfi
PythonConfiguration(version='3.6', identifier='cp36-manylinux_x86_64', path_str='/opt/python/cp36-cp36m'),
PythonConfiguration(version='3.7', identifier='cp37-manylinux_x86_64', path_str='/opt/python/cp37-cp37m'),
PythonConfiguration(version='3.8', identifier='cp38-manylinux_x86_64', path_str='/opt/python/cp38-cp38'),
+ PythonConfiguration(version='3.9', identifier='cp39-manylinux_x86_64', path_str='/opt/python/cp39-cp39'),
PythonConfiguration(version='2.7', identifier='cp27-manylinux_i686', path_str='/opt/python/cp27-cp27m'),
PythonConfiguration(version='2.7', identifier='cp27-manylinux_i686', path_str='/opt/python/cp27-cp27mu'),
PythonConfiguration(version='3.5', identifier='cp35-manylinux_i686', path_str='/opt/python/cp35-cp35m'),
PythonConfiguration(version='3.6', identifier='cp36-manylinux_i686', path_str='/opt/python/cp36-cp36m'),
PythonConfiguration(version='3.7', identifier='cp37-manylinux_i686', path_str='/opt/python/cp37-cp37m'),
PythonConfiguration(version='3.8', identifier='cp38-manylinux_i686', path_str='/opt/python/cp38-cp38'),
+ PythonConfiguration(version='3.9', identifier='cp39-manylinux_i686', path_str='/opt/python/cp39-cp39'),
PythonConfiguration(version='2.7', identifier='pp27-manylinux_x86_64', path_str='/opt/python/pp27-pypy_73'),
PythonConfiguration(version='3.6', identifier='pp36-manylinux_x86_64', path_str='/opt/python/pp36-pypy36_pp73'),
PythonConfiguration(version='3.5', identifier='cp35-manylinux_aarch64', path_str='/opt/python/cp35-cp35m'),
PythonConfiguration(version='3.6', identifier='cp36-manylinux_aarch64', path_str='/opt/python/cp36-cp36m'),
PythonConfiguration(version='3.7', identifier='cp37-manylinux_aarch64', path_str='/opt/python/cp37-cp37m'),
PythonConfiguration(version='3.8', identifier='cp38-manylinux_aarch64', path_str='/opt/python/cp38-cp38'),
+ PythonConfiguration(version='3.9', identifier='cp39-manylinux_aarch64', path_str='/opt/python/cp39-cp39'),
PythonConfiguration(version='3.5', identifier='cp35-manylinux_ppc64le', path_str='/opt/python/cp35-cp35m'),
PythonConfiguration(version='3.6', identifier='cp36-manylinux_ppc64le', path_str='/opt/python/cp36-cp36m'),
PythonConfiguration(version='3.7', identifier='cp37-manylinux_ppc64le', path_str='/opt/python/cp37-cp37m'),
PythonConfiguration(version='3.8', identifier='cp38-manylinux_ppc64le', path_str='/opt/python/cp38-cp38'),
+ PythonConfiguration(version='3.9', identifier='cp39-manylinux_ppc64le', path_str='/opt/python/cp39-cp39'),
PythonConfiguration(version='3.5', identifier='cp35-manylinux_s390x', path_str='/opt/python/cp35-cp35m'),
PythonConfiguration(version='3.6', identifier='cp36-manylinux_s390x', path_str='/opt/python/cp36-cp36m'),
PythonConfiguration(version='3.7', identifier='cp37-manylinux_s390x', path_str='/opt/python/cp37-cp37m'),
PythonConfiguration(version='3.8', identifier='cp38-manylinux_s390x', path_str='/opt/python/cp38-cp38'),
+ PythonConfiguration(version='3.9', identifier='cp39-manylinux_s390x', path_str='/opt/python/cp39-cp39'),
]
# skip builds as required
return [c for c in python_configurations if matches_platform(c.identifier) and build_selector(c.identifier)]
diff --git a/cibuildwheel/macos.py b/cibuildwheel/macos.py
index fe292cba..0d07d32a 100644
--- a/cibuildwheel/macos.py
+++ b/cibuildwheel/macos.py
@@ -38,6 +38,7 @@ def get_python_configurations(build_selector: BuildSelector) -> List[PythonConfi
PythonConfiguration(version='3.6', identifier='cp36-macosx_x86_64', url='https://www.python.org/ftp/python/3.6.8/python-3.6.8-macosx10.9.pkg'),
PythonConfiguration(version='3.7', identifier='cp37-macosx_x86_64', url='https://www.python.org/ftp/python/3.7.8/python-3.7.8-macosx10.9.pkg'),
PythonConfiguration(version='3.8', identifier='cp38-macosx_x86_64', url='https://www.python.org/ftp/python/3.8.4/python-3.8.4-macosx10.9.pkg'),
+ PythonConfiguration(version='3.9', identifier='cp39-macosx_x86_64', url='https://www.python.org/ftp/python/3.9.0/python-3.9.0rc1-macosx10.9.pkg'),
# PyPy
PythonConfiguration(version='2.7', identifier='pp27-macosx_x86_64', url='https://downloads.python.org/pypy/pypy2.7-v7.3.1-osx64.tar.bz2'),
PythonConfiguration(version='3.6', identifier='pp36-macosx_x86_64', url='https://downloads.python.org/pypy/pypy3.6-v7.3.1-osx64.tar.bz2'),
diff --git a/cibuildwheel/resources/pinned_docker_images.cfg b/cibuildwheel/resources/pinned_docker_images.cfg
index 534d350b..1f437520 100644
--- a/cibuildwheel/resources/pinned_docker_images.cfg
+++ b/cibuildwheel/resources/pinned_docker_images.cfg
@@ -1,22 +1,22 @@
[x86_64]
-manylinux1 = quay.io/pypa/manylinux1_x86_64:2020-05-25-b56702d
-manylinux2010 = quay.io/pypa/manylinux2010_x86_64:2020-05-20-c7bbd11
-manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2020-05-17-2f8ac3b
+manylinux1 = quay.io/pypa/manylinux1_x86_64:2020-08-20-a535ba4
+manylinux2010 = quay.io/pypa/manylinux2010_x86_64:2020-08-20-df89e22
+manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2020-08-29-f97fd86
[i686]
-manylinux1 = quay.io/pypa/manylinux1_i686:2020-05-25-b56702d
-manylinux2010 = quay.io/pypa/manylinux2010_i686:2020-05-20-c7bbd11
-manylinux2014 = quay.io/pypa/manylinux2014_i686:2020-05-17-2f8ac3b
+manylinux1 = quay.io/pypa/manylinux1_i686:2020-08-20-a535ba4
+manylinux2010 = quay.io/pypa/manylinux2010_i686:2020-08-20-df89e22
+manylinux2014 = quay.io/pypa/manylinux2014_i686:2020-08-29-f97fd86
[pypy_x86_64]
-manylinux2010 = pypywheels/manylinux2010-pypy_x86_64:2020-04-25-eb2cdff
+manylinux2010 = pypywheels/manylinux2010-pypy_x86_64:2020-07-02-fd8c128
[aarch64]
-manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2020-05-17-2f8ac3b
+manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2020-08-29-f97fd86
[ppc64le]
-manylinux2014 = quay.io/pypa/manylinux2014_ppc64le:2020-05-17-2f8ac3b
+manylinux2014 = quay.io/pypa/manylinux2014_ppc64le:2020-08-03-bb4aa00
[s390x]
-manylinux2014 = quay.io/pypa/manylinux2014_s390x:2020-05-17-2f8ac3b
+manylinux2014 = quay.io/pypa/manylinux2014_s390x:2020-08-29-f97fd86
diff --git a/cibuildwheel/windows.py b/cibuildwheel/windows.py
index bca658c0..9eb8c9e9 100644
--- a/cibuildwheel/windows.py
+++ b/cibuildwheel/windows.py
@@ -58,6 +58,8 @@ def get_python_configurations(build_selector: BuildSelector) -> List[PythonConfi
PythonConfiguration(version='3.7.8', arch='64', identifier='cp37-win_amd64', url=None),
PythonConfiguration(version='3.8.4', arch='32', identifier='cp38-win32', url=None),
PythonConfiguration(version='3.8.4', arch='64', identifier='cp38-win_amd64', url=None),
+ PythonConfiguration(version='3.9.0-rc1', arch='32', identifier='cp39-win32', url=None),
+ PythonConfiguration(version='3.9.0-rc1', arch='64', identifier='cp39-win_amd64', url=None),
# PyPy
PythonConfiguration(version='2.7', arch='32', identifier='pp27-win32', url='https://downloads.python.org/pypy/pypy2.7-v7.3.1-win32.zip'),
PythonConfiguration(version='3.6', arch='32', identifier='pp36-win32', url='https://downloads.python.org/pypy/pypy3.6-v7.3.1-win32.zip'),
diff --git a/test/test_docker_images.py b/test/test_docker_images.py
index f101c4fd..ddc6032b 100644
--- a/test/test_docker_images.py
+++ b/test/test_docker_images.py
@@ -32,10 +32,10 @@ def test(tmp_path):
actual_wheels = utils.cibuildwheel_run(project_dir, add_env={
'CIBW_MANYLINUX_X86_64_IMAGE': 'dockcross/manylinux2010-x64',
'CIBW_MANYLINUX_I686_IMAGE': 'dockcross/manylinux2010-x86',
- 'CIBW_SKIP': 'pp*',
+ 'CIBW_SKIP': 'pp* cp39-*',
})
# also check that we got the right wheels built
expected_wheels = [w for w in utils.expected_wheels('spam', '0.1.0')
- if '-pp' not in w]
+ if '-pp' not in w and '-cp39-' not in w]
assert set(actual_wheels) == set(expected_wheels)
diff --git a/test/utils.py b/test/utils.py
index 217a616f..05f2a796 100644
--- a/test/utils.py
+++ b/test/utils.py
@@ -91,7 +91,7 @@ def expected_wheels(package_name, package_version, manylinux_versions=None,
else:
manylinux_versions = ['manylinux2014']
- python_abi_tags = ['cp35-cp35m', 'cp36-cp36m', 'cp37-cp37m', 'cp38-cp38']
+ python_abi_tags = ['cp35-cp35m', 'cp36-cp36m', 'cp37-cp37m', 'cp38-cp38', 'cp39-cp39']
if pm.machine() in ['x86_64', 'AMD64', 'x86']:
python_abi_tags += ['cp27-cp27m', 'pp27-pypy_73', 'pp36-pypy36_pp73']