|
|
|
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] |
|
|