| |
| from numpy.testing import IS_WASM |
| import textwrap |
| import shutil |
| import tempfile |
| import os |
| import re |
| import subprocess |
| import sys |
|
|
| |
| |
| |
|
|
| _compiler_status = None |
|
|
|
|
| def _get_compiler_status(): |
| global _compiler_status |
| if _compiler_status is not None: |
| return _compiler_status |
|
|
| _compiler_status = (False, False, False) |
| if IS_WASM: |
| |
| return _compiler_status |
|
|
| |
| |
| code = textwrap.dedent( |
| f"""\ |
| import os |
| import sys |
| sys.path = {repr(sys.path)} |
| |
| def configuration(parent_name='',top_path=None): |
| global config |
| from numpy.distutils.misc_util import Configuration |
| config = Configuration('', parent_name, top_path) |
| return config |
| |
| from numpy.distutils.core import setup |
| setup(configuration=configuration) |
| |
| config_cmd = config.get_config_cmd() |
| have_c = config_cmd.try_compile('void foo() {{}}') |
| print('COMPILERS:%%d,%%d,%%d' %% (have_c, |
| config.have_f77c(), |
| config.have_f90c())) |
| sys.exit(99) |
| """ |
| ) |
| code = code % dict(syspath=repr(sys.path)) |
|
|
| tmpdir = tempfile.mkdtemp() |
| try: |
| script = os.path.join(tmpdir, "setup.py") |
|
|
| with open(script, "w") as f: |
| f.write(code) |
|
|
| cmd = [sys.executable, "setup.py", "config"] |
| p = subprocess.Popen( |
| cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=tmpdir |
| ) |
| out, err = p.communicate() |
| finally: |
| shutil.rmtree(tmpdir) |
|
|
| m = re.search(rb"COMPILERS:(\d+),(\d+),(\d+)", out) |
| if m: |
| _compiler_status = ( |
| bool(int(m.group(1))), |
| bool(int(m.group(2))), |
| bool(int(m.group(3))), |
| ) |
| |
| return _compiler_status |
|
|
|
|
| def has_c_compiler(): |
| return _get_compiler_status()[0] |
|
|
|
|
| def has_f77_compiler(): |
| return _get_compiler_status()[1] |
|
|
|
|
| def has_f90_compiler(): |
| return _get_compiler_status()[2] |
|
|