We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Call for clarification: acceptable values for build-system.requires in pyproject.toml
**Environment**

* pip version: 19.0.3
* Python version: 3.7
* OS: GNU/Linux

<!-- Feel free to add more information about your environment here -->

**Description**
<!-- A clear and concise description of what the bug is. -->
It's not clear nor is clearly specified by PEP518. But I was having a need to have an in-tree build back-end.
So I've hacked it via installing with a relative path.
*And it works!*
Yet, @pradyunsg has pointed out that the way I used probably doesn't conform to PEP 508.
So I tried some other ways to point to the in-tree distribution. And those didn't work.

**How to Reproduce**
<!-- Describe the steps to reproduce this bug. -->
(this works)
```toml
[build-system]
requires = ["./build-aiohttp", ]
build-backend = "build_aiohttp.api"

# not yet supported, so it doesn't influence anything, it's for forward-compat:
backend-path = "./build-aiohttp"
```

But if instead of `"./build-aiohttp"` in `requires` I try any of `"file://build-aiohttp"`, `"file:///./build-aiohttp"`, `"build_aiohttp @ file://./build-aiohttp"`, `"build_aiohttp @ file:./build-aiohttp"` pip fails to recognize those as installables.

**Expected behavior**
<!-- A clear and concise description of what you expected to happen. -->

I don't know what to expect. The method which works seems to be undefined in PEPs so I probably shouldn't rely on it.

Pip may either decide to improve the filtering of `requires` option or document it being permissive...

P.S. Oh and, by the way, I was able to test my other PEP517 backend outside of the project tree via
```toml
[build-system]
requires = ["../fortunate_pkg"]
```
so this relative path feature proves to be quite useful for development/debugging purposes.

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `src/pip/_internal/pyproject.py`
Content:
```
1 from __future__ import absolute_import
2 
3 import io
4 import os
5 import sys
6 
7 from pip._vendor import pytoml, six
8 
9 from pip._internal.exceptions import InstallationError
10 from pip._internal.utils.typing import MYPY_CHECK_RUNNING
11 
12 if MYPY_CHECK_RUNNING:
13     from typing import Any, Tuple, Optional, List
14 
15 
16 def _is_list_of_str(obj):
17     # type: (Any) -> bool
18     return (
19         isinstance(obj, list) and
20         all(isinstance(item, six.string_types) for item in obj)
21     )
22 
23 
24 def make_pyproject_path(unpacked_source_directory):
25     # type: (str) -> str
26     path = os.path.join(unpacked_source_directory, 'pyproject.toml')
27 
28     # Python2 __file__ should not be unicode
29     if six.PY2 and isinstance(path, six.text_type):
30         path = path.encode(sys.getfilesystemencoding())
31 
32     return path
33 
34 
35 def load_pyproject_toml(
36     use_pep517,  # type: Optional[bool]
37     pyproject_toml,  # type: str
38     setup_py,  # type: str
39     req_name  # type: str
40 ):
41     # type: (...) -> Optional[Tuple[List[str], str, List[str]]]
42     """Load the pyproject.toml file.
43 
44     Parameters:
45         use_pep517 - Has the user requested PEP 517 processing? None
46                      means the user hasn't explicitly specified.
47         pyproject_toml - Location of the project's pyproject.toml file
48         setup_py - Location of the project's setup.py file
49         req_name - The name of the requirement we're processing (for
50                    error reporting)
51 
52     Returns:
53         None if we should use the legacy code path, otherwise a tuple
54         (
55             requirements from pyproject.toml,
56             name of PEP 517 backend,
57             requirements we should check are installed after setting
58                 up the build environment
59         )
60     """
61     has_pyproject = os.path.isfile(pyproject_toml)
62     has_setup = os.path.isfile(setup_py)
63 
64     if has_pyproject:
65         with io.open(pyproject_toml, encoding="utf-8") as f:
66             pp_toml = pytoml.load(f)
67         build_system = pp_toml.get("build-system")
68     else:
69         build_system = None
70 
71     # The following cases must use PEP 517
72     # We check for use_pep517 being non-None and falsey because that means
73     # the user explicitly requested --no-use-pep517.  The value 0 as
74     # opposed to False can occur when the value is provided via an
75     # environment variable or config file option (due to the quirk of
76     # strtobool() returning an integer in pip's configuration code).
77     if has_pyproject and not has_setup:
78         if use_pep517 is not None and not use_pep517:
79             raise InstallationError(
80                 "Disabling PEP 517 processing is invalid: "
81                 "project does not have a setup.py"
82             )
83         use_pep517 = True
84     elif build_system and "build-backend" in build_system:
85         if use_pep517 is not None and not use_pep517:
86             raise InstallationError(
87                 "Disabling PEP 517 processing is invalid: "
88                 "project specifies a build backend of {} "
89                 "in pyproject.toml".format(
90                     build_system["build-backend"]
91                 )
92             )
93         use_pep517 = True
94 
95     # If we haven't worked out whether to use PEP 517 yet,
96     # and the user hasn't explicitly stated a preference,
97     # we do so if the project has a pyproject.toml file.
98     elif use_pep517 is None:
99         use_pep517 = has_pyproject
100 
101     # At this point, we know whether we're going to use PEP 517.
102     assert use_pep517 is not None
103 
104     # If we're using the legacy code path, there is nothing further
105     # for us to do here.
106     if not use_pep517:
107         return None
108 
109     if build_system is None:
110         # Either the user has a pyproject.toml with no build-system
111         # section, or the user has no pyproject.toml, but has opted in
112         # explicitly via --use-pep517.
113         # In the absence of any explicit backend specification, we
114         # assume the setuptools backend that most closely emulates the
115         # traditional direct setup.py execution, and require wheel and
116         # a version of setuptools that supports that backend.
117 
118         build_system = {
119             "requires": ["setuptools>=40.8.0", "wheel"],
120             "build-backend": "setuptools.build_meta:__legacy__",
121         }
122 
123     # If we're using PEP 517, we have build system information (either
124     # from pyproject.toml, or defaulted by the code above).
125     # Note that at this point, we do not know if the user has actually
126     # specified a backend, though.
127     assert build_system is not None
128 
129     # Ensure that the build-system section in pyproject.toml conforms
130     # to PEP 518.
131     error_template = (
132         "{package} has a pyproject.toml file that does not comply "
133         "with PEP 518: {reason}"
134     )
135 
136     # Specifying the build-system table but not the requires key is invalid
137     if "requires" not in build_system:
138         raise InstallationError(
139             error_template.format(package=req_name, reason=(
140                 "it has a 'build-system' table but not "
141                 "'build-system.requires' which is mandatory in the table"
142             ))
143         )
144 
145     # Error out if requires is not a list of strings
146     requires = build_system["requires"]
147     if not _is_list_of_str(requires):
148         raise InstallationError(error_template.format(
149             package=req_name,
150             reason="'build-system.requires' is not a list of strings.",
151         ))
152 
153     backend = build_system.get("build-backend")
154     check = []  # type: List[str]
155     if backend is None:
156         # If the user didn't specify a backend, we assume they want to use
157         # the setuptools backend. But we can't be sure they have included
158         # a version of setuptools which supplies the backend, or wheel
159         # (which is needed by the backend) in their requirements. So we
160         # make a note to check that those requirements are present once
161         # we have set up the environment.
162         # This is quite a lot of work to check for a very specific case. But
163         # the problem is, that case is potentially quite common - projects that
164         # adopted PEP 518 early for the ability to specify requirements to
165         # execute setup.py, but never considered needing to mention the build
166         # tools themselves. The original PEP 518 code had a similar check (but
167         # implemented in a different way).
168         backend = "setuptools.build_meta:__legacy__"
169         check = ["setuptools>=40.8.0", "wheel"]
170 
171     return (requires, backend, check)
172
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/src/pip/_internal/pyproject.py b/src/pip/_internal/pyproject.py
--- a/src/pip/_internal/pyproject.py
+++ b/src/pip/_internal/pyproject.py
@@ -5,6 +5,7 @@
 import sys
 
 from pip._vendor import pytoml, six
+from pip._vendor.packaging.requirements import InvalidRequirement, Requirement
 
 from pip._internal.exceptions import InstallationError
 from pip._internal.utils.typing import MYPY_CHECK_RUNNING
@@ -150,6 +151,21 @@
             reason="'build-system.requires' is not a list of strings.",
         ))
 
+    # Each requirement must be valid as per PEP 508
+    for requirement in requires:
+        try:
+            Requirement(requirement)
+        except InvalidRequirement:
+            raise InstallationError(
+                error_template.format(
+                    package=req_name,
+                    reason=(
+                        "'build-system.requires' contains an invalid "
+                        "requirement: {!r}".format(requirement)
+                    ),
+                )
+            )
+
     backend = build_system.get("build-backend")
     check = []  # type: List[str]
     if backend is None:

{"golden_diff": "diff --git a/src/pip/_internal/pyproject.py b/src/pip/_internal/pyproject.py\n--- a/src/pip/_internal/pyproject.py\n+++ b/src/pip/_internal/pyproject.py\n@@ -5,6 +5,7 @@\n import sys\n \n from pip._vendor import pytoml, six\n+from pip._vendor.packaging.requirements import InvalidRequirement, Requirement\n \n from pip._internal.exceptions import InstallationError\n from pip._internal.utils.typing import MYPY_CHECK_RUNNING\n@@ -150,6 +151,21 @@\n             reason=\"'build-system.requires' is not a list of strings.\",\n         ))\n \n+    # Each requirement must be valid as per PEP 508\n+    for requirement in requires:\n+        try:\n+            Requirement(requirement)\n+        except InvalidRequirement:\n+            raise InstallationError(\n+                error_template.format(\n+                    package=req_name,\n+                    reason=(\n+                        \"'build-system.requires' contains an invalid \"\n+                        \"requirement: {!r}\".format(requirement)\n+                    ),\n+                )\n+            )\n+\n     backend = build_system.get(\"build-backend\")\n     check = []  # type: List[str]\n     if backend is None:\n", "issue": "Call for clarification: acceptable values for build-system.requires in pyproject.toml\n**Environment**\r\n\r\n* pip version: 19.0.3\r\n* Python version: 3.7\r\n* OS: GNU/Linux\r\n\r\n<!-- Feel free to add more information about your environment here -->\r\n\r\n**Description**\r\n<!-- A clear and concise description of what the bug is. -->\r\nIt's not clear nor is clearly specified by PEP518. But I was having a need to have an in-tree build back-end.\r\nSo I've hacked it via installing with a relative path.\r\n*And it works!*\r\nYet, @pradyunsg has pointed out that the way I used probably doesn't conform to PEP 508.\r\nSo I tried some other ways to point to the in-tree distribution. And those didn't work.\r\n\r\n**How to Reproduce**\r\n<!-- Describe the steps to reproduce this bug. -->\r\n(this works)\r\n```toml\r\n[build-system]\r\nrequires = [\"./build-aiohttp\", ]\r\nbuild-backend = \"build_aiohttp.api\"\r\n\r\n# not yet supported, so it doesn't influence anything, it's for forward-compat:\r\nbackend-path = \"./build-aiohttp\"\r\n```\r\n\r\nBut if instead of `\"./build-aiohttp\"` in `requires` I try any of `\"file://build-aiohttp\"`, `\"file:///./build-aiohttp\"`, `\"build_aiohttp @ file://./build-aiohttp\"`, `\"build_aiohttp @ file:./build-aiohttp\"` pip fails to recognize those as installables.\r\n\r\n**Expected behavior**\r\n<!-- A clear and concise description of what you expected to happen. -->\r\n\r\nI don't know what to expect. The method which works seems to be undefined in PEPs so I probably shouldn't rely on it.\r\n\r\nPip may either decide to improve the filtering of `requires` option or document it being permissive...\r\n\r\nP.S. Oh and, by the way, I was able to test my other PEP517 backend outside of the project tree via\r\n```toml\r\n[build-system]\r\nrequires = [\"../fortunate_pkg\"]\r\n```\r\nso this relative path feature proves to be quite useful for development/debugging purposes.\n", "before_files": [{"content": "from __future__ import absolute_import\n\nimport io\nimport os\nimport sys\n\nfrom pip._vendor import pytoml, six\n\nfrom pip._internal.exceptions import InstallationError\nfrom pip._internal.utils.typing import MYPY_CHECK_RUNNING\n\nif MYPY_CHECK_RUNNING:\n    from typing import Any, Tuple, Optional, List\n\n\ndef _is_list_of_str(obj):\n    # type: (Any) -> bool\n    return (\n        isinstance(obj, list) and\n        all(isinstance(item, six.string_types) for item in obj)\n    )\n\n\ndef make_pyproject_path(unpacked_source_directory):\n    # type: (str) -> str\n    path = os.path.join(unpacked_source_directory, 'pyproject.toml')\n\n    # Python2 __file__ should not be unicode\n    if six.PY2 and isinstance(path, six.text_type):\n        path = path.encode(sys.getfilesystemencoding())\n\n    return path\n\n\ndef load_pyproject_toml(\n    use_pep517,  # type: Optional[bool]\n    pyproject_toml,  # type: str\n    setup_py,  # type: str\n    req_name  # type: str\n):\n    # type: (...) -> Optional[Tuple[List[str], str, List[str]]]\n    \"\"\"Load the pyproject.toml file.\n\n    Parameters:\n        use_pep517 - Has the user requested PEP 517 processing? None\n                     means the user hasn't explicitly specified.\n        pyproject_toml - Location of the project's pyproject.toml file\n        setup_py - Location of the project's setup.py file\n        req_name - The name of the requirement we're processing (for\n                   error reporting)\n\n    Returns:\n        None if we should use the legacy code path, otherwise a tuple\n        (\n            requirements from pyproject.toml,\n            name of PEP 517 backend,\n            requirements we should check are installed after setting\n                up the build environment\n        )\n    \"\"\"\n    has_pyproject = os.path.isfile(pyproject_toml)\n    has_setup = os.path.isfile(setup_py)\n\n    if has_pyproject:\n        with io.open(pyproject_toml, encoding=\"utf-8\") as f:\n            pp_toml = pytoml.load(f)\n        build_system = pp_toml.get(\"build-system\")\n    else:\n        build_system = None\n\n    # The following cases must use PEP 517\n    # We check for use_pep517 being non-None and falsey because that means\n    # the user explicitly requested --no-use-pep517.  The value 0 as\n    # opposed to False can occur when the value is provided via an\n    # environment variable or config file option (due to the quirk of\n    # strtobool() returning an integer in pip's configuration code).\n    if has_pyproject and not has_setup:\n        if use_pep517 is not None and not use_pep517:\n            raise InstallationError(\n                \"Disabling PEP 517 processing is invalid: \"\n                \"project does not have a setup.py\"\n            )\n        use_pep517 = True\n    elif build_system and \"build-backend\" in build_system:\n        if use_pep517 is not None and not use_pep517:\n            raise InstallationError(\n                \"Disabling PEP 517 processing is invalid: \"\n                \"project specifies a build backend of {} \"\n                \"in pyproject.toml\".format(\n                    build_system[\"build-backend\"]\n                )\n            )\n        use_pep517 = True\n\n    # If we haven't worked out whether to use PEP 517 yet,\n    # and the user hasn't explicitly stated a preference,\n    # we do so if the project has a pyproject.toml file.\n    elif use_pep517 is None:\n        use_pep517 = has_pyproject\n\n    # At this point, we know whether we're going to use PEP 517.\n    assert use_pep517 is not None\n\n    # If we're using the legacy code path, there is nothing further\n    # for us to do here.\n    if not use_pep517:\n        return None\n\n    if build_system is None:\n        # Either the user has a pyproject.toml with no build-system\n        # section, or the user has no pyproject.toml, but has opted in\n        # explicitly via --use-pep517.\n        # In the absence of any explicit backend specification, we\n        # assume the setuptools backend that most closely emulates the\n        # traditional direct setup.py execution, and require wheel and\n        # a version of setuptools that supports that backend.\n\n        build_system = {\n            \"requires\": [\"setuptools>=40.8.0\", \"wheel\"],\n            \"build-backend\": \"setuptools.build_meta:__legacy__\",\n        }\n\n    # If we're using PEP 517, we have build system information (either\n    # from pyproject.toml, or defaulted by the code above).\n    # Note that at this point, we do not know if the user has actually\n    # specified a backend, though.\n    assert build_system is not None\n\n    # Ensure that the build-system section in pyproject.toml conforms\n    # to PEP 518.\n    error_template = (\n        \"{package} has a pyproject.toml file that does not comply \"\n        \"with PEP 518: {reason}\"\n    )\n\n    # Specifying the build-system table but not the requires key is invalid\n    if \"requires\" not in build_system:\n        raise InstallationError(\n            error_template.format(package=req_name, reason=(\n                \"it has a 'build-system' table but not \"\n                \"'build-system.requires' which is mandatory in the table\"\n            ))\n        )\n\n    # Error out if requires is not a list of strings\n    requires = build_system[\"requires\"]\n    if not _is_list_of_str(requires):\n        raise InstallationError(error_template.format(\n            package=req_name,\n            reason=\"'build-system.requires' is not a list of strings.\",\n        ))\n\n    backend = build_system.get(\"build-backend\")\n    check = []  # type: List[str]\n    if backend is None:\n        # If the user didn't specify a backend, we assume they want to use\n        # the setuptools backend. But we can't be sure they have included\n        # a version of setuptools which supplies the backend, or wheel\n        # (which is needed by the backend) in their requirements. So we\n        # make a note to check that those requirements are present once\n        # we have set up the environment.\n        # This is quite a lot of work to check for a very specific case. But\n        # the problem is, that case is potentially quite common - projects that\n        # adopted PEP 518 early for the ability to specify requirements to\n        # execute setup.py, but never considered needing to mention the build\n        # tools themselves. The original PEP 518 code had a similar check (but\n        # implemented in a different way).\n        backend = \"setuptools.build_meta:__legacy__\"\n        check = [\"setuptools>=40.8.0\", \"wheel\"]\n\n    return (requires, backend, check)\n", "path": "src/pip/_internal/pyproject.py"}], "after_files": [{"content": "from __future__ import absolute_import\n\nimport io\nimport os\nimport sys\n\nfrom pip._vendor import pytoml, six\nfrom pip._vendor.packaging.requirements import InvalidRequirement, Requirement\n\nfrom pip._internal.exceptions import InstallationError\nfrom pip._internal.utils.typing import MYPY_CHECK_RUNNING\n\nif MYPY_CHECK_RUNNING:\n    from typing import Any, Tuple, Optional, List\n\n\ndef _is_list_of_str(obj):\n    # type: (Any) -> bool\n    return (\n        isinstance(obj, list) and\n        all(isinstance(item, six.string_types) for item in obj)\n    )\n\n\ndef make_pyproject_path(unpacked_source_directory):\n    # type: (str) -> str\n    path = os.path.join(unpacked_source_directory, 'pyproject.toml')\n\n    # Python2 __file__ should not be unicode\n    if six.PY2 and isinstance(path, six.text_type):\n        path = path.encode(sys.getfilesystemencoding())\n\n    return path\n\n\ndef load_pyproject_toml(\n    use_pep517,  # type: Optional[bool]\n    pyproject_toml,  # type: str\n    setup_py,  # type: str\n    req_name  # type: str\n):\n    # type: (...) -> Optional[Tuple[List[str], str, List[str]]]\n    \"\"\"Load the pyproject.toml file.\n\n    Parameters:\n        use_pep517 - Has the user requested PEP 517 processing? None\n                     means the user hasn't explicitly specified.\n        pyproject_toml - Location of the project's pyproject.toml file\n        setup_py - Location of the project's setup.py file\n        req_name - The name of the requirement we're processing (for\n                   error reporting)\n\n    Returns:\n        None if we should use the legacy code path, otherwise a tuple\n        (\n            requirements from pyproject.toml,\n            name of PEP 517 backend,\n            requirements we should check are installed after setting\n                up the build environment\n        )\n    \"\"\"\n    has_pyproject = os.path.isfile(pyproject_toml)\n    has_setup = os.path.isfile(setup_py)\n\n    if has_pyproject:\n        with io.open(pyproject_toml, encoding=\"utf-8\") as f:\n            pp_toml = pytoml.load(f)\n        build_system = pp_toml.get(\"build-system\")\n    else:\n        build_system = None\n\n    # The following cases must use PEP 517\n    # We check for use_pep517 being non-None and falsey because that means\n    # the user explicitly requested --no-use-pep517.  The value 0 as\n    # opposed to False can occur when the value is provided via an\n    # environment variable or config file option (due to the quirk of\n    # strtobool() returning an integer in pip's configuration code).\n    if has_pyproject and not has_setup:\n        if use_pep517 is not None and not use_pep517:\n            raise InstallationError(\n                \"Disabling PEP 517 processing is invalid: \"\n                \"project does not have a setup.py\"\n            )\n        use_pep517 = True\n    elif build_system and \"build-backend\" in build_system:\n        if use_pep517 is not None and not use_pep517:\n            raise InstallationError(\n                \"Disabling PEP 517 processing is invalid: \"\n                \"project specifies a build backend of {} \"\n                \"in pyproject.toml\".format(\n                    build_system[\"build-backend\"]\n                )\n            )\n        use_pep517 = True\n\n    # If we haven't worked out whether to use PEP 517 yet,\n    # and the user hasn't explicitly stated a preference,\n    # we do so if the project has a pyproject.toml file.\n    elif use_pep517 is None:\n        use_pep517 = has_pyproject\n\n    # At this point, we know whether we're going to use PEP 517.\n    assert use_pep517 is not None\n\n    # If we're using the legacy code path, there is nothing further\n    # for us to do here.\n    if not use_pep517:\n        return None\n\n    if build_system is None:\n        # Either the user has a pyproject.toml with no build-system\n        # section, or the user has no pyproject.toml, but has opted in\n        # explicitly via --use-pep517.\n        # In the absence of any explicit backend specification, we\n        # assume the setuptools backend that most closely emulates the\n        # traditional direct setup.py execution, and require wheel and\n        # a version of setuptools that supports that backend.\n\n        build_system = {\n            \"requires\": [\"setuptools>=40.8.0\", \"wheel\"],\n            \"build-backend\": \"setuptools.build_meta:__legacy__\",\n        }\n\n    # If we're using PEP 517, we have build system information (either\n    # from pyproject.toml, or defaulted by the code above).\n    # Note that at this point, we do not know if the user has actually\n    # specified a backend, though.\n    assert build_system is not None\n\n    # Ensure that the build-system section in pyproject.toml conforms\n    # to PEP 518.\n    error_template = (\n        \"{package} has a pyproject.toml file that does not comply \"\n        \"with PEP 518: {reason}\"\n    )\n\n    # Specifying the build-system table but not the requires key is invalid\n    if \"requires\" not in build_system:\n        raise InstallationError(\n            error_template.format(package=req_name, reason=(\n                \"it has a 'build-system' table but not \"\n                \"'build-system.requires' which is mandatory in the table\"\n            ))\n        )\n\n    # Error out if requires is not a list of strings\n    requires = build_system[\"requires\"]\n    if not _is_list_of_str(requires):\n        raise InstallationError(error_template.format(\n            package=req_name,\n            reason=\"'build-system.requires' is not a list of strings.\",\n        ))\n\n    # Each requirement must be valid as per PEP 508\n    for requirement in requires:\n        try:\n            Requirement(requirement)\n        except InvalidRequirement:\n            raise InstallationError(\n                error_template.format(\n                    package=req_name,\n                    reason=(\n                        \"'build-system.requires' contains an invalid \"\n                        \"requirement: {!r}\".format(requirement)\n                    ),\n                )\n            )\n\n    backend = build_system.get(\"build-backend\")\n    check = []  # type: List[str]\n    if backend is None:\n        # If the user didn't specify a backend, we assume they want to use\n        # the setuptools backend. But we can't be sure they have included\n        # a version of setuptools which supplies the backend, or wheel\n        # (which is needed by the backend) in their requirements. So we\n        # make a note to check that those requirements are present once\n        # we have set up the environment.\n        # This is quite a lot of work to check for a very specific case. But\n        # the problem is, that case is potentially quite common - projects that\n        # adopted PEP 518 early for the ability to specify requirements to\n        # execute setup.py, but never considered needing to mention the build\n        # tools themselves. The original PEP 518 code had a similar check (but\n        # implemented in a different way).\n        backend = \"setuptools.build_meta:__legacy__\"\n        check = [\"setuptools>=40.8.0\", \"wheel\"]\n\n    return (requires, backend, check)\n", "path": "src/pip/_internal/pyproject.py"}]}