We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
build_meta breaks some setup.py scripts (e.g. numpy and pygame)
Setup:
* Setuptools 40.6.2
* Python 3.7.2

Some build scripts use `sys.argv[0]` to change the working directory to the parent directory of setup.py. For example, the setup.py script of numpy-1.15.4 contains the following code: 

```
src_path = os.path.dirname(os.path.abspath(sys.argv[0]))
old_path = os.getcwd()
os.chdir(src_path)
```

However,`sys.argv[0]` is an empty string, setup.py is called from setuptools.build_meta. Then `os.path.abspath()`, is the working directory and `os.path.dirname()`  its parent directory. This changes the current directory to the parent directory of the current path and breaks relative paths in the setup.py script.

While manually running `python3 setup.py bdist_wheel` succedes, calling `setuptools.build_meta.build_wheel()` in the Python REPL then gives the following error:
```
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.7/site-packages/setuptools/build_meta.py", line 158, in build_wheel
    _run_setup()
  File "/usr/local/lib/python3.7/site-packages/setuptools/build_meta.py", line 85, in _run_setup
    exec(compile(code, __file__, 'exec'), locals())
  File "setup.py", line 403, in <module>
  File "setup.py", line 349, in setup_package
  File "setup.py", line 147, in write_version_py
FileNotFoundError: [Errno 2] No such file or directory: 'numpy/version.py'
``` 

A similar error occurs for pygame-1.9.4. Maybe I overlooked something, but it seems that the problem originates from the way setuptools.build_meta calls setup.py. 
build_meta breaks some setup.py scripts (e.g. numpy and pygame)
Setup:
* Setuptools 40.6.2
* Python 3.7.2

Some build scripts use `sys.argv[0]` to change the working directory to the parent directory of setup.py. For example, the setup.py script of numpy-1.15.4 contains the following code: 

```
src_path = os.path.dirname(os.path.abspath(sys.argv[0]))
old_path = os.getcwd()
os.chdir(src_path)
```

However,`sys.argv[0]` is an empty string, setup.py is called from setuptools.build_meta. Then `os.path.abspath()`, is the working directory and `os.path.dirname()`  its parent directory. This changes the current directory to the parent directory of the current path and breaks relative paths in the setup.py script.

While manually running `python3 setup.py bdist_wheel` succedes, calling `setuptools.build_meta.build_wheel()` in the Python REPL then gives the following error:
```
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.7/site-packages/setuptools/build_meta.py", line 158, in build_wheel
    _run_setup()
  File "/usr/local/lib/python3.7/site-packages/setuptools/build_meta.py", line 85, in _run_setup
    exec(compile(code, __file__, 'exec'), locals())
  File "setup.py", line 403, in <module>
  File "setup.py", line 349, in setup_package
  File "setup.py", line 147, in write_version_py
FileNotFoundError: [Errno 2] No such file or directory: 'numpy/version.py'
``` 

A similar error occurs for pygame-1.9.4. Maybe I overlooked something, but it seems that the problem originates from the way setuptools.build_meta calls setup.py. 

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `setuptools/build_meta.py`
Content:
```
1 """A PEP 517 interface to setuptools
2 
3 Previously, when a user or a command line tool (let's call it a "frontend")
4 needed to make a request of setuptools to take a certain action, for
5 example, generating a list of installation requirements, the frontend would
6 would call "setup.py egg_info" or "setup.py bdist_wheel" on the command line.
7 
8 PEP 517 defines a different method of interfacing with setuptools. Rather
9 than calling "setup.py" directly, the frontend should:
10 
11   1. Set the current directory to the directory with a setup.py file
12   2. Import this module into a safe python interpreter (one in which
13      setuptools can potentially set global variables or crash hard).
14   3. Call one of the functions defined in PEP 517.
15 
16 What each function does is defined in PEP 517. However, here is a "casual"
17 definition of the functions (this definition should not be relied on for
18 bug reports or API stability):
19 
20   - `build_wheel`: build a wheel in the folder and return the basename
21   - `get_requires_for_build_wheel`: get the `setup_requires` to build
22   - `prepare_metadata_for_build_wheel`: get the `install_requires`
23   - `build_sdist`: build an sdist in the folder and return the basename
24   - `get_requires_for_build_sdist`: get the `setup_requires` to build
25 
26 Again, this is not a formal definition! Just a "taste" of the module.
27 """
28 
29 import io
30 import os
31 import sys
32 import tokenize
33 import shutil
34 import contextlib
35 
36 import setuptools
37 import distutils
38 from setuptools.py31compat import TemporaryDirectory
39 
40 from pkg_resources import parse_requirements
41 from pkg_resources.py31compat import makedirs
42 
43 __all__ = ['get_requires_for_build_sdist',
44            'get_requires_for_build_wheel',
45            'prepare_metadata_for_build_wheel',
46            'build_wheel',
47            'build_sdist',
48            '__legacy__',
49            'SetupRequirementsError']
50 
51 class SetupRequirementsError(BaseException):
52     def __init__(self, specifiers):
53         self.specifiers = specifiers
54 
55 
56 class Distribution(setuptools.dist.Distribution):
57     def fetch_build_eggs(self, specifiers):
58         specifier_list = list(map(str, parse_requirements(specifiers)))
59 
60         raise SetupRequirementsError(specifier_list)
61 
62     @classmethod
63     @contextlib.contextmanager
64     def patch(cls):
65         """
66         Replace
67         distutils.dist.Distribution with this class
68         for the duration of this context.
69         """
70         orig = distutils.core.Distribution
71         distutils.core.Distribution = cls
72         try:
73             yield
74         finally:
75             distutils.core.Distribution = orig
76 
77 
78 def _to_str(s):
79     """
80     Convert a filename to a string (on Python 2, explicitly
81     a byte string, not Unicode) as distutils checks for the
82     exact type str.
83     """
84     if sys.version_info[0] == 2 and not isinstance(s, str):
85         # Assume it's Unicode, as that's what the PEP says
86         # should be provided.
87         return s.encode(sys.getfilesystemencoding())
88     return s
89 
90 
91 def _get_immediate_subdirectories(a_dir):
92     return [name for name in os.listdir(a_dir)
93             if os.path.isdir(os.path.join(a_dir, name))]
94 
95 
96 def _file_with_extension(directory, extension):
97     matching = (
98         f for f in os.listdir(directory)
99         if f.endswith(extension)
100     )
101     file, = matching
102     return file
103 
104 
105 def _open_setup_script(setup_script):
106     if not os.path.exists(setup_script):
107         # Supply a default setup.py
108         return io.StringIO(u"from setuptools import setup; setup()")
109 
110     return getattr(tokenize, 'open', open)(setup_script)
111 
112 
113 class _BuildMetaBackend(object):
114 
115     def _fix_config(self, config_settings):
116         config_settings = config_settings or {}
117         config_settings.setdefault('--global-option', [])
118         return config_settings
119 
120     def _get_build_requires(self, config_settings, requirements):
121         config_settings = self._fix_config(config_settings)
122 
123         sys.argv = sys.argv[:1] + ['egg_info'] + \
124             config_settings["--global-option"]
125         try:
126             with Distribution.patch():
127                 self.run_setup()
128         except SetupRequirementsError as e:
129             requirements += e.specifiers
130 
131         return requirements
132 
133     def run_setup(self, setup_script='setup.py'):
134         # Note that we can reuse our build directory between calls
135         # Correctness comes first, then optimization later
136         __file__ = setup_script
137         __name__ = '__main__'
138 
139         with _open_setup_script(__file__) as f:
140             code = f.read().replace(r'\r\n', r'\n')
141 
142         exec(compile(code, __file__, 'exec'), locals())
143 
144     def get_requires_for_build_wheel(self, config_settings=None):
145         config_settings = self._fix_config(config_settings)
146         return self._get_build_requires(config_settings, requirements=['wheel'])
147 
148     def get_requires_for_build_sdist(self, config_settings=None):
149         config_settings = self._fix_config(config_settings)
150         return self._get_build_requires(config_settings, requirements=[])
151 
152     def prepare_metadata_for_build_wheel(self, metadata_directory,
153                                          config_settings=None):
154         sys.argv = sys.argv[:1] + ['dist_info', '--egg-base',
155                                    _to_str(metadata_directory)]
156         self.run_setup()
157 
158         dist_info_directory = metadata_directory
159         while True:
160             dist_infos = [f for f in os.listdir(dist_info_directory)
161                           if f.endswith('.dist-info')]
162 
163             if (len(dist_infos) == 0 and
164                 len(_get_immediate_subdirectories(dist_info_directory)) == 1):
165 
166                 dist_info_directory = os.path.join(
167                     dist_info_directory, os.listdir(dist_info_directory)[0])
168                 continue
169 
170             assert len(dist_infos) == 1
171             break
172 
173         # PEP 517 requires that the .dist-info directory be placed in the
174         # metadata_directory. To comply, we MUST copy the directory to the root
175         if dist_info_directory != metadata_directory:
176             shutil.move(
177                 os.path.join(dist_info_directory, dist_infos[0]),
178                 metadata_directory)
179             shutil.rmtree(dist_info_directory, ignore_errors=True)
180 
181         return dist_infos[0]
182 
183     def _build_with_temp_dir(self, setup_command, result_extension,
184                              result_directory, config_settings):
185         config_settings = self._fix_config(config_settings)
186         result_directory = os.path.abspath(result_directory)
187 
188         # Build in a temporary directory, then copy to the target.
189         makedirs(result_directory, exist_ok=True)
190         with TemporaryDirectory(dir=result_directory) as tmp_dist_dir:
191             sys.argv = (sys.argv[:1] + setup_command +
192                         ['--dist-dir', tmp_dist_dir] +
193                         config_settings["--global-option"])
194             self.run_setup()
195 
196             result_basename = _file_with_extension(tmp_dist_dir, result_extension)
197             result_path = os.path.join(result_directory, result_basename)
198             if os.path.exists(result_path):
199                 # os.rename will fail overwriting on non-Unix.
200                 os.remove(result_path)
201             os.rename(os.path.join(tmp_dist_dir, result_basename), result_path)
202 
203         return result_basename
204 
205 
206     def build_wheel(self, wheel_directory, config_settings=None,
207                     metadata_directory=None):
208         return self._build_with_temp_dir(['bdist_wheel'], '.whl',
209                                          wheel_directory, config_settings)
210 
211     def build_sdist(self, sdist_directory, config_settings=None):
212         return self._build_with_temp_dir(['sdist', '--formats', 'gztar'],
213                                          '.tar.gz', sdist_directory,
214                                          config_settings)
215 
216 
217 class _BuildMetaLegacyBackend(_BuildMetaBackend):
218     """Compatibility backend for setuptools
219 
220     This is a version of setuptools.build_meta that endeavors to maintain backwards
221     compatibility with pre-PEP 517 modes of invocation. It exists as a temporary
222     bridge between the old packaging mechanism and the new packaging mechanism,
223     and will eventually be removed.
224     """
225     def run_setup(self, setup_script='setup.py'):
226         # In order to maintain compatibility with scripts assuming that
227         # the setup.py script is in a directory on the PYTHONPATH, inject
228         # '' into sys.path. (pypa/setuptools#1642)
229         sys_path = list(sys.path)           # Save the original path
230 
231         script_dir = os.path.dirname(os.path.abspath(setup_script))
232         if script_dir not in sys.path:
233             sys.path.insert(0, script_dir)
234 
235         try:
236             super(_BuildMetaLegacyBackend,
237                   self).run_setup(setup_script=setup_script)
238         finally:
239             # While PEP 517 frontends should be calling each hook in a fresh
240             # subprocess according to the standard (and thus it should not be
241             # strictly necessary to restore the old sys.path), we'll restore
242             # the original path so that the path manipulation does not persist
243             # within the hook after run_setup is called.
244             sys.path[:] = sys_path
245 
246 # The primary backend
247 _BACKEND = _BuildMetaBackend()
248 
249 get_requires_for_build_wheel = _BACKEND.get_requires_for_build_wheel
250 get_requires_for_build_sdist = _BACKEND.get_requires_for_build_sdist
251 prepare_metadata_for_build_wheel = _BACKEND.prepare_metadata_for_build_wheel
252 build_wheel = _BACKEND.build_wheel
253 build_sdist = _BACKEND.build_sdist
254 
255 
256 # The legacy backend
257 __legacy__ = _BuildMetaLegacyBackend()
258
```
--- 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/setuptools/build_meta.py b/setuptools/build_meta.py
--- a/setuptools/build_meta.py
+++ b/setuptools/build_meta.py
@@ -232,6 +232,12 @@
         if script_dir not in sys.path:
             sys.path.insert(0, script_dir)
 
+        # Some setup.py scripts (e.g. in pygame and numpy) use sys.argv[0] to
+        # get the directory of the source code. They expect it to refer to the
+        # setup.py script.
+        sys_argv_0 = sys.argv[0]
+        sys.argv[0] = setup_script
+
         try:
             super(_BuildMetaLegacyBackend,
                   self).run_setup(setup_script=setup_script)
@@ -242,6 +248,7 @@
             # the original path so that the path manipulation does not persist
             # within the hook after run_setup is called.
             sys.path[:] = sys_path
+            sys.argv[0] = sys_argv_0
 
 # The primary backend
 _BACKEND = _BuildMetaBackend()

{"golden_diff": "diff --git a/setuptools/build_meta.py b/setuptools/build_meta.py\n--- a/setuptools/build_meta.py\n+++ b/setuptools/build_meta.py\n@@ -232,6 +232,12 @@\n         if script_dir not in sys.path:\n             sys.path.insert(0, script_dir)\n \n+        # Some setup.py scripts (e.g. in pygame and numpy) use sys.argv[0] to\n+        # get the directory of the source code. They expect it to refer to the\n+        # setup.py script.\n+        sys_argv_0 = sys.argv[0]\n+        sys.argv[0] = setup_script\n+\n         try:\n             super(_BuildMetaLegacyBackend,\n                   self).run_setup(setup_script=setup_script)\n@@ -242,6 +248,7 @@\n             # the original path so that the path manipulation does not persist\n             # within the hook after run_setup is called.\n             sys.path[:] = sys_path\n+            sys.argv[0] = sys_argv_0\n \n # The primary backend\n _BACKEND = _BuildMetaBackend()\n", "issue": "build_meta breaks some setup.py scripts (e.g. numpy and pygame)\nSetup:\r\n* Setuptools 40.6.2\r\n* Python 3.7.2\r\n\r\nSome build scripts use `sys.argv[0]` to change the working directory to the parent directory of setup.py. For example, the setup.py script of numpy-1.15.4 contains the following code: \r\n\r\n```\r\nsrc_path = os.path.dirname(os.path.abspath(sys.argv[0]))\r\nold_path = os.getcwd()\r\nos.chdir(src_path)\r\n```\r\n\r\nHowever,`sys.argv[0]` is an empty string, setup.py is called from setuptools.build_meta. Then `os.path.abspath()`, is the working directory and `os.path.dirname()`  its parent directory. This changes the current directory to the parent directory of the current path and breaks relative paths in the setup.py script.\r\n\r\nWhile manually running `python3 setup.py bdist_wheel` succedes, calling `setuptools.build_meta.build_wheel()` in the Python REPL then gives the following error:\r\n```\r\n  File \"<stdin>\", line 1, in <module>\r\n  File \"/usr/local/lib/python3.7/site-packages/setuptools/build_meta.py\", line 158, in build_wheel\r\n    _run_setup()\r\n  File \"/usr/local/lib/python3.7/site-packages/setuptools/build_meta.py\", line 85, in _run_setup\r\n    exec(compile(code, __file__, 'exec'), locals())\r\n  File \"setup.py\", line 403, in <module>\r\n  File \"setup.py\", line 349, in setup_package\r\n  File \"setup.py\", line 147, in write_version_py\r\nFileNotFoundError: [Errno 2] No such file or directory: 'numpy/version.py'\r\n``` \r\n\r\nA similar error occurs for pygame-1.9.4. Maybe I overlooked something, but it seems that the problem originates from the way setuptools.build_meta calls setup.py. \nbuild_meta breaks some setup.py scripts (e.g. numpy and pygame)\nSetup:\r\n* Setuptools 40.6.2\r\n* Python 3.7.2\r\n\r\nSome build scripts use `sys.argv[0]` to change the working directory to the parent directory of setup.py. For example, the setup.py script of numpy-1.15.4 contains the following code: \r\n\r\n```\r\nsrc_path = os.path.dirname(os.path.abspath(sys.argv[0]))\r\nold_path = os.getcwd()\r\nos.chdir(src_path)\r\n```\r\n\r\nHowever,`sys.argv[0]` is an empty string, setup.py is called from setuptools.build_meta. Then `os.path.abspath()`, is the working directory and `os.path.dirname()`  its parent directory. This changes the current directory to the parent directory of the current path and breaks relative paths in the setup.py script.\r\n\r\nWhile manually running `python3 setup.py bdist_wheel` succedes, calling `setuptools.build_meta.build_wheel()` in the Python REPL then gives the following error:\r\n```\r\n  File \"<stdin>\", line 1, in <module>\r\n  File \"/usr/local/lib/python3.7/site-packages/setuptools/build_meta.py\", line 158, in build_wheel\r\n    _run_setup()\r\n  File \"/usr/local/lib/python3.7/site-packages/setuptools/build_meta.py\", line 85, in _run_setup\r\n    exec(compile(code, __file__, 'exec'), locals())\r\n  File \"setup.py\", line 403, in <module>\r\n  File \"setup.py\", line 349, in setup_package\r\n  File \"setup.py\", line 147, in write_version_py\r\nFileNotFoundError: [Errno 2] No such file or directory: 'numpy/version.py'\r\n``` \r\n\r\nA similar error occurs for pygame-1.9.4. Maybe I overlooked something, but it seems that the problem originates from the way setuptools.build_meta calls setup.py. \n", "before_files": [{"content": "\"\"\"A PEP 517 interface to setuptools\n\nPreviously, when a user or a command line tool (let's call it a \"frontend\")\nneeded to make a request of setuptools to take a certain action, for\nexample, generating a list of installation requirements, the frontend would\nwould call \"setup.py egg_info\" or \"setup.py bdist_wheel\" on the command line.\n\nPEP 517 defines a different method of interfacing with setuptools. Rather\nthan calling \"setup.py\" directly, the frontend should:\n\n  1. Set the current directory to the directory with a setup.py file\n  2. Import this module into a safe python interpreter (one in which\n     setuptools can potentially set global variables or crash hard).\n  3. Call one of the functions defined in PEP 517.\n\nWhat each function does is defined in PEP 517. However, here is a \"casual\"\ndefinition of the functions (this definition should not be relied on for\nbug reports or API stability):\n\n  - `build_wheel`: build a wheel in the folder and return the basename\n  - `get_requires_for_build_wheel`: get the `setup_requires` to build\n  - `prepare_metadata_for_build_wheel`: get the `install_requires`\n  - `build_sdist`: build an sdist in the folder and return the basename\n  - `get_requires_for_build_sdist`: get the `setup_requires` to build\n\nAgain, this is not a formal definition! Just a \"taste\" of the module.\n\"\"\"\n\nimport io\nimport os\nimport sys\nimport tokenize\nimport shutil\nimport contextlib\n\nimport setuptools\nimport distutils\nfrom setuptools.py31compat import TemporaryDirectory\n\nfrom pkg_resources import parse_requirements\nfrom pkg_resources.py31compat import makedirs\n\n__all__ = ['get_requires_for_build_sdist',\n           'get_requires_for_build_wheel',\n           'prepare_metadata_for_build_wheel',\n           'build_wheel',\n           'build_sdist',\n           '__legacy__',\n           'SetupRequirementsError']\n\nclass SetupRequirementsError(BaseException):\n    def __init__(self, specifiers):\n        self.specifiers = specifiers\n\n\nclass Distribution(setuptools.dist.Distribution):\n    def fetch_build_eggs(self, specifiers):\n        specifier_list = list(map(str, parse_requirements(specifiers)))\n\n        raise SetupRequirementsError(specifier_list)\n\n    @classmethod\n    @contextlib.contextmanager\n    def patch(cls):\n        \"\"\"\n        Replace\n        distutils.dist.Distribution with this class\n        for the duration of this context.\n        \"\"\"\n        orig = distutils.core.Distribution\n        distutils.core.Distribution = cls\n        try:\n            yield\n        finally:\n            distutils.core.Distribution = orig\n\n\ndef _to_str(s):\n    \"\"\"\n    Convert a filename to a string (on Python 2, explicitly\n    a byte string, not Unicode) as distutils checks for the\n    exact type str.\n    \"\"\"\n    if sys.version_info[0] == 2 and not isinstance(s, str):\n        # Assume it's Unicode, as that's what the PEP says\n        # should be provided.\n        return s.encode(sys.getfilesystemencoding())\n    return s\n\n\ndef _get_immediate_subdirectories(a_dir):\n    return [name for name in os.listdir(a_dir)\n            if os.path.isdir(os.path.join(a_dir, name))]\n\n\ndef _file_with_extension(directory, extension):\n    matching = (\n        f for f in os.listdir(directory)\n        if f.endswith(extension)\n    )\n    file, = matching\n    return file\n\n\ndef _open_setup_script(setup_script):\n    if not os.path.exists(setup_script):\n        # Supply a default setup.py\n        return io.StringIO(u\"from setuptools import setup; setup()\")\n\n    return getattr(tokenize, 'open', open)(setup_script)\n\n\nclass _BuildMetaBackend(object):\n\n    def _fix_config(self, config_settings):\n        config_settings = config_settings or {}\n        config_settings.setdefault('--global-option', [])\n        return config_settings\n\n    def _get_build_requires(self, config_settings, requirements):\n        config_settings = self._fix_config(config_settings)\n\n        sys.argv = sys.argv[:1] + ['egg_info'] + \\\n            config_settings[\"--global-option\"]\n        try:\n            with Distribution.patch():\n                self.run_setup()\n        except SetupRequirementsError as e:\n            requirements += e.specifiers\n\n        return requirements\n\n    def run_setup(self, setup_script='setup.py'):\n        # Note that we can reuse our build directory between calls\n        # Correctness comes first, then optimization later\n        __file__ = setup_script\n        __name__ = '__main__'\n\n        with _open_setup_script(__file__) as f:\n            code = f.read().replace(r'\\r\\n', r'\\n')\n\n        exec(compile(code, __file__, 'exec'), locals())\n\n    def get_requires_for_build_wheel(self, config_settings=None):\n        config_settings = self._fix_config(config_settings)\n        return self._get_build_requires(config_settings, requirements=['wheel'])\n\n    def get_requires_for_build_sdist(self, config_settings=None):\n        config_settings = self._fix_config(config_settings)\n        return self._get_build_requires(config_settings, requirements=[])\n\n    def prepare_metadata_for_build_wheel(self, metadata_directory,\n                                         config_settings=None):\n        sys.argv = sys.argv[:1] + ['dist_info', '--egg-base',\n                                   _to_str(metadata_directory)]\n        self.run_setup()\n\n        dist_info_directory = metadata_directory\n        while True:\n            dist_infos = [f for f in os.listdir(dist_info_directory)\n                          if f.endswith('.dist-info')]\n\n            if (len(dist_infos) == 0 and\n                len(_get_immediate_subdirectories(dist_info_directory)) == 1):\n\n                dist_info_directory = os.path.join(\n                    dist_info_directory, os.listdir(dist_info_directory)[0])\n                continue\n\n            assert len(dist_infos) == 1\n            break\n\n        # PEP 517 requires that the .dist-info directory be placed in the\n        # metadata_directory. To comply, we MUST copy the directory to the root\n        if dist_info_directory != metadata_directory:\n            shutil.move(\n                os.path.join(dist_info_directory, dist_infos[0]),\n                metadata_directory)\n            shutil.rmtree(dist_info_directory, ignore_errors=True)\n\n        return dist_infos[0]\n\n    def _build_with_temp_dir(self, setup_command, result_extension,\n                             result_directory, config_settings):\n        config_settings = self._fix_config(config_settings)\n        result_directory = os.path.abspath(result_directory)\n\n        # Build in a temporary directory, then copy to the target.\n        makedirs(result_directory, exist_ok=True)\n        with TemporaryDirectory(dir=result_directory) as tmp_dist_dir:\n            sys.argv = (sys.argv[:1] + setup_command +\n                        ['--dist-dir', tmp_dist_dir] +\n                        config_settings[\"--global-option\"])\n            self.run_setup()\n\n            result_basename = _file_with_extension(tmp_dist_dir, result_extension)\n            result_path = os.path.join(result_directory, result_basename)\n            if os.path.exists(result_path):\n                # os.rename will fail overwriting on non-Unix.\n                os.remove(result_path)\n            os.rename(os.path.join(tmp_dist_dir, result_basename), result_path)\n\n        return result_basename\n\n\n    def build_wheel(self, wheel_directory, config_settings=None,\n                    metadata_directory=None):\n        return self._build_with_temp_dir(['bdist_wheel'], '.whl',\n                                         wheel_directory, config_settings)\n\n    def build_sdist(self, sdist_directory, config_settings=None):\n        return self._build_with_temp_dir(['sdist', '--formats', 'gztar'],\n                                         '.tar.gz', sdist_directory,\n                                         config_settings)\n\n\nclass _BuildMetaLegacyBackend(_BuildMetaBackend):\n    \"\"\"Compatibility backend for setuptools\n\n    This is a version of setuptools.build_meta that endeavors to maintain backwards\n    compatibility with pre-PEP 517 modes of invocation. It exists as a temporary\n    bridge between the old packaging mechanism and the new packaging mechanism,\n    and will eventually be removed.\n    \"\"\"\n    def run_setup(self, setup_script='setup.py'):\n        # In order to maintain compatibility with scripts assuming that\n        # the setup.py script is in a directory on the PYTHONPATH, inject\n        # '' into sys.path. (pypa/setuptools#1642)\n        sys_path = list(sys.path)           # Save the original path\n\n        script_dir = os.path.dirname(os.path.abspath(setup_script))\n        if script_dir not in sys.path:\n            sys.path.insert(0, script_dir)\n\n        try:\n            super(_BuildMetaLegacyBackend,\n                  self).run_setup(setup_script=setup_script)\n        finally:\n            # While PEP 517 frontends should be calling each hook in a fresh\n            # subprocess according to the standard (and thus it should not be\n            # strictly necessary to restore the old sys.path), we'll restore\n            # the original path so that the path manipulation does not persist\n            # within the hook after run_setup is called.\n            sys.path[:] = sys_path\n\n# The primary backend\n_BACKEND = _BuildMetaBackend()\n\nget_requires_for_build_wheel = _BACKEND.get_requires_for_build_wheel\nget_requires_for_build_sdist = _BACKEND.get_requires_for_build_sdist\nprepare_metadata_for_build_wheel = _BACKEND.prepare_metadata_for_build_wheel\nbuild_wheel = _BACKEND.build_wheel\nbuild_sdist = _BACKEND.build_sdist\n\n\n# The legacy backend\n__legacy__ = _BuildMetaLegacyBackend()\n", "path": "setuptools/build_meta.py"}], "after_files": [{"content": "\"\"\"A PEP 517 interface to setuptools\n\nPreviously, when a user or a command line tool (let's call it a \"frontend\")\nneeded to make a request of setuptools to take a certain action, for\nexample, generating a list of installation requirements, the frontend would\nwould call \"setup.py egg_info\" or \"setup.py bdist_wheel\" on the command line.\n\nPEP 517 defines a different method of interfacing with setuptools. Rather\nthan calling \"setup.py\" directly, the frontend should:\n\n  1. Set the current directory to the directory with a setup.py file\n  2. Import this module into a safe python interpreter (one in which\n     setuptools can potentially set global variables or crash hard).\n  3. Call one of the functions defined in PEP 517.\n\nWhat each function does is defined in PEP 517. However, here is a \"casual\"\ndefinition of the functions (this definition should not be relied on for\nbug reports or API stability):\n\n  - `build_wheel`: build a wheel in the folder and return the basename\n  - `get_requires_for_build_wheel`: get the `setup_requires` to build\n  - `prepare_metadata_for_build_wheel`: get the `install_requires`\n  - `build_sdist`: build an sdist in the folder and return the basename\n  - `get_requires_for_build_sdist`: get the `setup_requires` to build\n\nAgain, this is not a formal definition! Just a \"taste\" of the module.\n\"\"\"\n\nimport io\nimport os\nimport sys\nimport tokenize\nimport shutil\nimport contextlib\n\nimport setuptools\nimport distutils\nfrom setuptools.py31compat import TemporaryDirectory\n\nfrom pkg_resources import parse_requirements\nfrom pkg_resources.py31compat import makedirs\n\n__all__ = ['get_requires_for_build_sdist',\n           'get_requires_for_build_wheel',\n           'prepare_metadata_for_build_wheel',\n           'build_wheel',\n           'build_sdist',\n           '__legacy__',\n           'SetupRequirementsError']\n\nclass SetupRequirementsError(BaseException):\n    def __init__(self, specifiers):\n        self.specifiers = specifiers\n\n\nclass Distribution(setuptools.dist.Distribution):\n    def fetch_build_eggs(self, specifiers):\n        specifier_list = list(map(str, parse_requirements(specifiers)))\n\n        raise SetupRequirementsError(specifier_list)\n\n    @classmethod\n    @contextlib.contextmanager\n    def patch(cls):\n        \"\"\"\n        Replace\n        distutils.dist.Distribution with this class\n        for the duration of this context.\n        \"\"\"\n        orig = distutils.core.Distribution\n        distutils.core.Distribution = cls\n        try:\n            yield\n        finally:\n            distutils.core.Distribution = orig\n\n\ndef _to_str(s):\n    \"\"\"\n    Convert a filename to a string (on Python 2, explicitly\n    a byte string, not Unicode) as distutils checks for the\n    exact type str.\n    \"\"\"\n    if sys.version_info[0] == 2 and not isinstance(s, str):\n        # Assume it's Unicode, as that's what the PEP says\n        # should be provided.\n        return s.encode(sys.getfilesystemencoding())\n    return s\n\n\ndef _get_immediate_subdirectories(a_dir):\n    return [name for name in os.listdir(a_dir)\n            if os.path.isdir(os.path.join(a_dir, name))]\n\n\ndef _file_with_extension(directory, extension):\n    matching = (\n        f for f in os.listdir(directory)\n        if f.endswith(extension)\n    )\n    file, = matching\n    return file\n\n\ndef _open_setup_script(setup_script):\n    if not os.path.exists(setup_script):\n        # Supply a default setup.py\n        return io.StringIO(u\"from setuptools import setup; setup()\")\n\n    return getattr(tokenize, 'open', open)(setup_script)\n\n\nclass _BuildMetaBackend(object):\n\n    def _fix_config(self, config_settings):\n        config_settings = config_settings or {}\n        config_settings.setdefault('--global-option', [])\n        return config_settings\n\n    def _get_build_requires(self, config_settings, requirements):\n        config_settings = self._fix_config(config_settings)\n\n        sys.argv = sys.argv[:1] + ['egg_info'] + \\\n            config_settings[\"--global-option\"]\n        try:\n            with Distribution.patch():\n                self.run_setup()\n        except SetupRequirementsError as e:\n            requirements += e.specifiers\n\n        return requirements\n\n    def run_setup(self, setup_script='setup.py'):\n        # Note that we can reuse our build directory between calls\n        # Correctness comes first, then optimization later\n        __file__ = setup_script\n        __name__ = '__main__'\n\n        with _open_setup_script(__file__) as f:\n            code = f.read().replace(r'\\r\\n', r'\\n')\n\n        exec(compile(code, __file__, 'exec'), locals())\n\n    def get_requires_for_build_wheel(self, config_settings=None):\n        config_settings = self._fix_config(config_settings)\n        return self._get_build_requires(config_settings, requirements=['wheel'])\n\n    def get_requires_for_build_sdist(self, config_settings=None):\n        config_settings = self._fix_config(config_settings)\n        return self._get_build_requires(config_settings, requirements=[])\n\n    def prepare_metadata_for_build_wheel(self, metadata_directory,\n                                         config_settings=None):\n        sys.argv = sys.argv[:1] + ['dist_info', '--egg-base',\n                                   _to_str(metadata_directory)]\n        self.run_setup()\n\n        dist_info_directory = metadata_directory\n        while True:\n            dist_infos = [f for f in os.listdir(dist_info_directory)\n                          if f.endswith('.dist-info')]\n\n            if (len(dist_infos) == 0 and\n                len(_get_immediate_subdirectories(dist_info_directory)) == 1):\n\n                dist_info_directory = os.path.join(\n                    dist_info_directory, os.listdir(dist_info_directory)[0])\n                continue\n\n            assert len(dist_infos) == 1\n            break\n\n        # PEP 517 requires that the .dist-info directory be placed in the\n        # metadata_directory. To comply, we MUST copy the directory to the root\n        if dist_info_directory != metadata_directory:\n            shutil.move(\n                os.path.join(dist_info_directory, dist_infos[0]),\n                metadata_directory)\n            shutil.rmtree(dist_info_directory, ignore_errors=True)\n\n        return dist_infos[0]\n\n    def _build_with_temp_dir(self, setup_command, result_extension,\n                             result_directory, config_settings):\n        config_settings = self._fix_config(config_settings)\n        result_directory = os.path.abspath(result_directory)\n\n        # Build in a temporary directory, then copy to the target.\n        makedirs(result_directory, exist_ok=True)\n        with TemporaryDirectory(dir=result_directory) as tmp_dist_dir:\n            sys.argv = (sys.argv[:1] + setup_command +\n                        ['--dist-dir', tmp_dist_dir] +\n                        config_settings[\"--global-option\"])\n            self.run_setup()\n\n            result_basename = _file_with_extension(tmp_dist_dir, result_extension)\n            result_path = os.path.join(result_directory, result_basename)\n            if os.path.exists(result_path):\n                # os.rename will fail overwriting on non-Unix.\n                os.remove(result_path)\n            os.rename(os.path.join(tmp_dist_dir, result_basename), result_path)\n\n        return result_basename\n\n\n    def build_wheel(self, wheel_directory, config_settings=None,\n                    metadata_directory=None):\n        return self._build_with_temp_dir(['bdist_wheel'], '.whl',\n                                         wheel_directory, config_settings)\n\n    def build_sdist(self, sdist_directory, config_settings=None):\n        return self._build_with_temp_dir(['sdist', '--formats', 'gztar'],\n                                         '.tar.gz', sdist_directory,\n                                         config_settings)\n\n\nclass _BuildMetaLegacyBackend(_BuildMetaBackend):\n    \"\"\"Compatibility backend for setuptools\n\n    This is a version of setuptools.build_meta that endeavors to maintain backwards\n    compatibility with pre-PEP 517 modes of invocation. It exists as a temporary\n    bridge between the old packaging mechanism and the new packaging mechanism,\n    and will eventually be removed.\n    \"\"\"\n    def run_setup(self, setup_script='setup.py'):\n        # In order to maintain compatibility with scripts assuming that\n        # the setup.py script is in a directory on the PYTHONPATH, inject\n        # '' into sys.path. (pypa/setuptools#1642)\n        sys_path = list(sys.path)           # Save the original path\n\n        script_dir = os.path.dirname(os.path.abspath(setup_script))\n        if script_dir not in sys.path:\n            sys.path.insert(0, script_dir)\n\n        # Some setup.py scripts (e.g. in pygame and numpy) use sys.argv[0] to\n        # get the directory of the source code. They expect it to refer to the\n        # setup.py script.\n        sys_argv_0 = sys.argv[0]\n        sys.argv[0] = setup_script\n\n        try:\n            super(_BuildMetaLegacyBackend,\n                  self).run_setup(setup_script=setup_script)\n        finally:\n            # While PEP 517 frontends should be calling each hook in a fresh\n            # subprocess according to the standard (and thus it should not be\n            # strictly necessary to restore the old sys.path), we'll restore\n            # the original path so that the path manipulation does not persist\n            # within the hook after run_setup is called.\n            sys.path[:] = sys_path\n            sys.argv[0] = sys_argv_0\n\n# The primary backend\n_BACKEND = _BuildMetaBackend()\n\nget_requires_for_build_wheel = _BACKEND.get_requires_for_build_wheel\nget_requires_for_build_sdist = _BACKEND.get_requires_for_build_sdist\nprepare_metadata_for_build_wheel = _BACKEND.prepare_metadata_for_build_wheel\nbuild_wheel = _BACKEND.build_wheel\nbuild_sdist = _BACKEND.build_sdist\n\n\n# The legacy backend\n__legacy__ = _BuildMetaLegacyBackend()\n", "path": "setuptools/build_meta.py"}]}