diff --git a/doc/api/next_api_changes/development/26849-KS.rst b/doc/api/next_api_changes/development/26849-KS.rst
new file mode 100644
index 000000000000..1a1deda40fca
--- /dev/null
+++ b/doc/api/next_api_changes/development/26849-KS.rst
@@ -0,0 +1,5 @@
+Minimum version of setuptools bumped to 64
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To comply with requirements of ``setuptools_scm``, the minimum version of ``setuptools``
+has been increased from 42 to 64.
diff --git a/doc/devel/dependencies.rst b/doc/devel/dependencies.rst
index a865b80cab84..400bc63d42ac 100644
--- a/doc/devel/dependencies.rst
+++ b/doc/devel/dependencies.rst
@@ -228,7 +228,7 @@ Setup dependencies
runtime dependency.
- `PyBind11 `_ (>= 2.6). Used to connect C/C++ code
with Python.
-- `setuptools `_ (>= 42).
+- `setuptools `_ (>= 64).
- `setuptools_scm `_ (>= 7). Used to
update the reported ``mpl.__version__`` based on the current git commit.
Also a runtime dependency for editable installs.
diff --git a/pyproject.toml b/pyproject.toml
index d2e2f769b7ef..67f1805cda08 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,10 +4,17 @@ requires = [
"certifi>=2020.06.20",
"numpy>=1.25",
"pybind11>=2.6",
- "setuptools>=42",
+ "setuptools>=64",
"setuptools_scm>=7",
]
+[tool.setuptools_scm]
+version_scheme = "release-branch-semver"
+local_scheme = "node-and-date"
+write_to = "lib/matplotlib/_version.py"
+parentdir_prefix_version = "matplotlib-"
+fallback_version = "0.0+UNKNOWN"
+
[tool.isort]
known_pydata = "numpy, matplotlib.pyplot"
known_firstparty = "matplotlib,mpl_toolkits"
diff --git a/requirements/testing/mypy.txt b/requirements/testing/mypy.txt
index f697772da5ea..a5ca15cfbdad 100644
--- a/requirements/testing/mypy.txt
+++ b/requirements/testing/mypy.txt
@@ -24,5 +24,6 @@ pillow>=8
pyparsing>=2.3.1
python-dateutil>=2.7
setuptools_scm>=7
+setuptools>=64
importlib-resources>=3.2.0 ; python_version < "3.10"
diff --git a/setup.py b/setup.py
index 9c37c2108286..6f277d4e4d7d 100644
--- a/setup.py
+++ b/setup.py
@@ -340,7 +340,10 @@ def make_release_tree(self, base_dir, files):
"python-dateutil>=2.7",
] + (
# Installing from a git checkout that is not producing a wheel.
- ["setuptools_scm>=7"] if (
+ # setuptools_scm warns with older setuptools, which turns into errors for our
+ # test suite. However setuptools_scm does not themselves pin the version of
+ # setuptools.
+ ["setuptools_scm>=7", "setuptools>=64"] if (
Path(__file__).with_name(".git").exists() and
os.environ.get("CIBUILDWHEEL", "0") != "1"
) else []