o
    6at%                     @   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   s^   t d ur-ztjt  W n	 ty   Y nw ztt  W n ttfy(   Y nw d a d S d S N)	_module_dirsyspathremove
ValueErrorshutilrmtreeIOErrorOSError r   r   7/usr/lib/python3/dist-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   






rY   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.

    Nr1   )suffixwrH   rI   rJ   rK   )r   openwriterY   )source_coderH   rI   rJ   rZ   rK   r	   fr   r   r   
build_code   s   $ra   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.pyr[   config)r3   r4   rT   s   COMPILERS:(\d+),(\d+),(\d+)r         )_compiler_statustextwrapdedentdictr!   r   r	   r   r   r6   r8   r]   r^   r?   r@   rA   rB   rC   rD   r   r   researchboolintgroup)	rL   tmpdirscriptr`   rU   rV   rW   rX   mr   r   r   _get_compiler_status   s0   

 rr   c                   C   
   t  d S r   rr   r   r   r   r   has_c_compiler      
ru   c                   C   rs   )Nr   rt   r   r   r   r   has_f77_compiler   rv   rw   c                   C   rs   )Nrd   rt   r   r   r   r   has_f90_compiler   rv   rx   c              
   K   s  ddl m} ddlm} 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 suw   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   )Configuration)setupr/   
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_coderb   z.pywbN	build_extz-ir2   z%Running distutils build failed: %s
%sr5   )%numpy.distutils.misc_utilry   numpy.distutils.corerz   r   r6   r	   r7   r   r8   r9   r   r:   r;   rg   rh   replaceri   r!   r   r    r]   r^   r   r=   r>   r?   r@   rA   rB   rC   rD   rE   r   rF   
__import__r   )rG   r|   rK   r%   ry   rz   r   rM   rO   rP   rL   rp   r`   rT   rU   rV   rW   rX   r   r   r   build_module_distutils   sT   






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 )F2PyTestNr1   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 availableFr1   Tr0   z No Fortran 77 compiler availablez No Fortran 90 compiler available)rH   rI   rJ   rZ   rK   r\   )r   platformpytestrI   moduleru   sourcesextendrL   r;   rZ   endswithrw   rx   ra   rH   rJ   rK   rY   )selfcodes	needs_f77	needs_f90rO   r   r   r   rz   @  sF   














zF2PyTest.setup)r-   
__module____qualname__rL   r   rH   rI   rJ   rZ   r   rK   rz   r   r   r   r   r   6  s    r   ) __doc__r6   r   r@   r   r   r   rg   rj   r   numpy.compatr   r   numpy.testingr   	importlibr   r   r   r   r   r    r.   rY   ra   rf   rr   ru   rw   rx   r   r   r   r   r   r   <module>   sB    
87
F