Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 51b40b8

Browse files
authored
Merge pull request #24353 from charris/update-numpy-testing-extbuild
MAINT: Update ``extbuild.py`` from main.
2 parents 19dea2e + 10177a7 commit 51b40b8

File tree

1 file changed

+39
-42
lines changed

1 file changed

+39
-42
lines changed

numpy/testing/_private/extbuild.py

Lines changed: 39 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66

77
import os
88
import pathlib
9+
import subprocess
910
import sys
1011
import sysconfig
12+
import textwrap
1113

1214
__all__ = ['build_and_import_extension', 'compile_extension_module']
1315

@@ -51,8 +53,6 @@ def build_and_import_extension(
5153
>>> assert not mod.test_bytes(u'abc')
5254
>>> assert mod.test_bytes(b'abc')
5355
"""
54-
from distutils.errors import CompileError
55-
5656
body = prologue + _make_methods(functions, modname)
5757
init = """PyObject *mod = PyModule_Create(&moduledef);
5858
"""
@@ -67,7 +67,7 @@ def build_and_import_extension(
6767
try:
6868
mod_so = compile_extension_module(
6969
modname, build_dir, include_dirs, source_string)
70-
except CompileError as e:
70+
except Exception as e:
7171
# shorten the exception chain
7272
raise RuntimeError(f"could not compile in {build_dir}:") from e
7373
import importlib.util
@@ -186,9 +186,9 @@ def _c_compile(cfile, outputfilename, include_dirs=[], libraries=[],
186186
elif sys.platform.startswith('linux'):
187187
compile_extra = [
188188
"-O0", "-g", "-Werror=implicit-function-declaration", "-fPIC"]
189-
link_extra = None
189+
link_extra = []
190190
else:
191-
compile_extra = link_extra = None
191+
compile_extra = link_extra = []
192192
pass
193193
if sys.platform == 'win32':
194194
link_extra = link_extra + ['/DEBUG'] # generate .pdb file
@@ -202,49 +202,46 @@ def _c_compile(cfile, outputfilename, include_dirs=[], libraries=[],
202202
library_dirs.append(s + 'lib')
203203

204204
outputfilename = outputfilename.with_suffix(get_so_suffix())
205-
saved_environ = os.environ.copy()
206-
try:
207-
build(
208-
cfile, outputfilename,
209-
compile_extra, link_extra,
210-
include_dirs, libraries, library_dirs)
211-
finally:
212-
# workaround for a distutils bugs where some env vars can
213-
# become longer and longer every time it is used
214-
for key, value in saved_environ.items():
215-
if os.environ.get(key) != value:
216-
os.environ[key] = value
205+
build(
206+
cfile, outputfilename,
207+
compile_extra, link_extra,
208+
include_dirs, libraries, library_dirs)
217209
return outputfilename
218210

219211

220212
def build(cfile, outputfilename, compile_extra, link_extra,
221213
include_dirs, libraries, library_dirs):
222-
"cd into the directory where the cfile is, use distutils to build"
223-
from numpy.distutils.ccompiler import new_compiler
224-
225-
compiler = new_compiler(force=1, verbose=2)
226-
compiler.customize('')
227-
objects = []
228-
229-
old = os.getcwd()
230-
os.chdir(cfile.parent)
231-
try:
232-
res = compiler.compile(
233-
[str(cfile.name)],
234-
include_dirs=include_dirs,
235-
extra_preargs=compile_extra
214+
"use meson to build"
215+
216+
build_dir = cfile.parent / "build"
217+
os.makedirs(build_dir, exist_ok=True)
218+
so_name = outputfilename.parts[-1]
219+
with open(cfile.parent / "meson.build", "wt") as fid:
220+
includes = ['-I' + d for d in include_dirs]
221+
link_dirs = ['-L' + d for d in library_dirs]
222+
fid.write(textwrap.dedent(f"""\
223+
project('foo', 'c')
224+
shared_module('{so_name}', '{cfile.parts[-1]}',
225+
c_args: {includes} + {compile_extra},
226+
link_args: {link_dirs} + {link_extra},
227+
link_with: {libraries},
228+
name_prefix: '',
229+
name_suffix: 'dummy',
236230
)
237-
objects += [str(cfile.parent / r) for r in res]
238-
finally:
239-
os.chdir(old)
240-
241-
compiler.link_shared_object(
242-
objects, str(outputfilename),
243-
libraries=libraries,
244-
extra_preargs=link_extra,
245-
library_dirs=library_dirs)
246-
247-
231+
"""))
232+
if sys.platform == "win32":
233+
subprocess.check_call(["meson", "setup",
234+
"--buildtype=release",
235+
"--vsenv", ".."],
236+
cwd=build_dir,
237+
)
238+
else:
239+
subprocess.check_call(["meson", "setup", "--vsenv", ".."],
240+
cwd=build_dir
241+
)
242+
subprocess.check_call(["meson", "compile"], cwd=build_dir)
243+
os.rename(str(build_dir / so_name) + ".dummy", cfile.parent / so_name)
244+
248245
def get_so_suffix():
249246
ret = sysconfig.get_config_var('EXT_SUFFIX')
250247
assert ret

0 commit comments

Comments
 (0)