o
    g%                     @   s  d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZmZ ddlmZ ddlmZ dadadd Zd	d
 Zdd Zdd Zeg g g dfddZeg g g ddfddZdadd Zdd Zdd Zdd Zedd ZG dd dZdS )z
Utility functions for

- building and importing modules on test time, using a temporary location
- detecting if compilers are present

    N)asbytesasstr)temppath)import_modulei  c                   C   sZ   t d ur+ztjt  W n	 ty   Y nw ztt  W n	 ty&   Y nw d a d S d S N)_module_dirsyspathremove
ValueErrorshutilrmtreeOSError r   r   S/home/ubuntu/cloudmapper/venv/lib/python3.10/site-packages/numpy/f2py/tests/util.py_cleanup   s   r   c                   C   s6   t d u rt a tt t tjvrtjdt  t S Nr   )	r   tempfilemkdtempatexitregisterr   r   r	   insertr   r   r   r   get_module_dir,   s   

r   c                  C   s,   t  } dt }td7 a|tjv rtd|S )Nz_test_ext_module_%d   z%Temporary module name already in use.)r   _module_numr   modulesRuntimeError)dnamer   r   r   get_temp_module_name6   s   
r   c                    s   i  fdd} j |_ |S )Nc               
      sh   t | |f}|vr'z | i ||< W n ty& } z||<  d }~ww | }t|tr2||S r   )repr	Exception
isinstance)akwkeyeretfuncmemor   r   wrapperE   s   
z_memoize.<locals>.wrapper)__name__)r)   r+   r   r(   r   _memoizeB   s   r-   c              
   C   s  dt tj }t }g }g }| D ]5}	tj|	std|	 tj|tj|	}
t	
|	|
 ||
 tj|
\}}|dv rE||
 q|du rMt }dd|g| | }|r_|dg| 7 }|rh|dg| 7 }t }zDt| tjd|g| }tj|tjtjd	}| \}}|jd
krtd|dd t|f W t| |D ]}	t|	 qt|S t| |D ]}	t|	 qw )zH
    Compile and import a f2py module, built from the given files.

    zEimport sys; sys.path = %s; import numpy.f2py as f2py2e; f2py2e.main()%s is not a file).f90.fz.cz.pyfNz-cz-mzskip:zonly:stdoutstderrr   zRunning f2py failed: %s
%s   )r    r   r	   r   osisfiler   joinbasenamer   copyfileappendsplitextr   getcwdchdir
executable
subprocessPopenPIPESTDOUTcommunicate
returncoder   unlinkr   )source_filesoptionsskiponlymodule_namecoder   dst_sourcesf2py_sourcesfndstbaseext	f2py_optscwdcmdpouterrr   r   r   build_moduleY   sX   






rX   c              	   C   s   |du rd}t |d,}t|d}||  W d   n1 s!w   Y  t|g||||dW  d   S 1 s:w   Y  dS )z6
    Compile and import Fortran code using f2py.

    Nr0   )suffixwrG   rH   rI   rJ   )r   openwriterX   )source_coderG   rH   rI   rY   rJ   r	   fr   r   r   
build_code   s   $r`   c            	   	   C   s
  t d urt S da td} | tttjd } t }z?t	j
|d}t|d}||  W d    n1 s8w   Y  tjddg}tj|tjtj|d}| \}}W t| nt| w td|}|rtt|d	tt|d
tt|dfa t S )N)FFFa          import os
        import sys
        sys.path = %(syspath)s

        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)
        )syspathzsetup.pyrZ   config)r2   r3   rS   s   COMPILERS:(\d+),(\d+),(\d+)r         )_compiler_statustextwrapdedentdictr    r   r	   r   r   r5   r7   r\   r]   r>   r?   r@   rA   rB   rC   r   r   researchboolintgroup)	rK   tmpdirscriptr_   rT   rU   rV   rW   mr   r   r   _get_compiler_status   s0   

 rq   c                   C   
   t  d S r   rq   r   r   r   r   has_c_compiler      
rt   c                   C   rr   )Nr   rs   r   r   r   r   has_f77_compiler   ru   rv   c                   C   rr   )Nrc   rs   r   r   r   r   has_f90_compiler   ru   rw   c              
   K   s  t  }g }| D ]$}tj|std| tj|tj|}t|| |	| qt
|dd}t
dt|ttjd }tj|t d }	|	|	 t|	d}
|
t| W d   n1 siw   Y  t }z@t| tj|	d	d
g}tj|tjtjd}| \}}|jdkrtd|dd t|f W t| |D ]}t| qnt| |D ]}t| qw t| tj | S )z6
    Build a module via distutils and import it.

    r.   
z
    a          import os
        import sys
        sys.path = %(syspath)s

        def configuration(parent_name='',top_path=None):
            from numpy.distutils.misc_util import Configuration
            config = Configuration('', parent_name, top_path)
            %(config_code)s
            return config

        if __name__ == "__main__":
            from numpy.distutils.core import setup
            setup(configuration=configuration)
        )config_codera   z.pywbN	build_extz-ir1   r   z%Running distutils build failed: %s
%sr4   )!r   r5   r	   r6   r   r7   r8   r   r9   r:   rf   rg   replacerh   r    r   r   r\   r]   r   r<   r=   r>   r?   r@   rA   rB   rC   rD   r   rE   
__import__r   )rF   ry   rJ   r$   r   rL   rN   rO   rK   ro   r_   rS   rT   rU   rV   rW   r   r   r   build_module_distutils   sP   






r~   c                   @   s4   e Zd ZdZdZg Zg Zg ZdZdZ	dZ
dd ZdS )F2PyTestNr0   c                 C   s  t jdkr
td | jd urd S t std g }| jr$|| j | jd ur/|	| j
 d}d}|D ]}|dr?d}q5|drFd}q5|rQt sQtd |r[t s[td	 | jd urqt| j| j| j| j| j
| jd
| _| jd urt| j| j| j| j| jd| _d S d S )Nwin32z)Fails with MinGW64 Gfortran (Issue #9673)zNo C compiler availableFr0   Tr/   z No Fortran 77 compiler availablez No Fortran 90 compiler available)rG   rH   rI   rY   rJ   r[   )r   platformpytestrH   modulert   sourcesextendrK   r:   rY   endswithrv   rw   r`   rG   rI   rJ   rX   )selfcodes	needs_f77	needs_f90rN   r   r   r   setup=  sF   














zF2PyTest.setup)r,   
__module____qualname__rK   r   rG   rH   rI   rY   r   rJ   r   r   r   r   r   r   3  s    r   ) __doc__r5   r   r?   r   r   r   rf   ri   r   numpy.compatr   r   numpy.testingr   	importlibr   r   r   r   r   r   r-   rX   r`   re   rq   rt   rv   rw   r~   r   r   r   r   r   <module>   sB    
87
C