91 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# Kanged out of numpy.f2py.tests.util for test_build_ext
 | 
						|
from numpy.testing import IS_WASM
 | 
						|
import textwrap
 | 
						|
import shutil
 | 
						|
import tempfile
 | 
						|
import os
 | 
						|
import re
 | 
						|
import subprocess
 | 
						|
import sys
 | 
						|
 | 
						|
#
 | 
						|
# Check if compilers are available at all...
 | 
						|
#
 | 
						|
 | 
						|
_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:
 | 
						|
        # Can't run compiler from inside WASM.
 | 
						|
        return _compiler_status
 | 
						|
 | 
						|
    # XXX: this is really ugly. But I don't know how to invoke Distutils
 | 
						|
    #      in a safer way...
 | 
						|
    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))),
 | 
						|
        )
 | 
						|
    # Finished
 | 
						|
    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]
 |