§
    ËãßcÍ(  ã                   ón  — 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
Z
ddlZddlmZ ddlmZmZ ddlmZmZ ddlmZ dadad„ Zd	„ Zd
„ Zd„ Zeg g g dfd„¦   «         Zeg g g ddfd„¦   «         Zdad„ Zd„ Z d„ Z!d„ Z"ed„ ¦   «         Z# G d„ d¦  «        Z$d„ Z%e
j&        d„ ¦   «         Z'dS )z¥
Utility functions for

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

é    N)ÚPath)ÚasbytesÚasstr)ÚtemppathÚIS_WASM)Úimport_modulei  c                  óÞ   — t           �e	 t          j                             t           ¦  «         n# t          $ r Y nw xY w	 t          j        t           ¦  «         n# t          $ r Y nw xY wd a d S d S ©N)Ú_module_dirÚsysÚpathÚremoveÚ
ValueErrorÚshutilÚrmtreeÚOSError© ó    ú7/usr/lib/python3/dist-packages/numpy/f2py/tests/util.pyÚ_cleanupr   "   s�   € åÐð	ÝŒH�OŠO�KÑ(Ô(Ð(Ð(øÝð 	ð 	ð 	ØˆDð	øøøð	ÝŒM�+Ñ&Ô&Ð&Ð&øÝð 	ð 	ð 	ØˆDð	øøøàˆˆˆð Ðs   ‰$. ®
;º;¿A Á
A&Á%A&c                  óæ   — t           €dt          j        ¦   «         a t          j        t
          ¦  «         t           t          j        vr%t          j                             dt           ¦  «         t           S ©Nr   )	r   ÚtempfileÚmkdtempÚatexitÚregisterr   r   r   Úinsertr   r   r   Úget_module_dirr   0   sO   € åÐÝÔ&Ñ(Ô(ˆÝŒ�Ñ!Ô!Ð!Ý�cœhÐ&Ð&ÝŒH�OŠO˜A�{Ñ+Ô+Ð+ÝÐr   c                  ó„   — t          ¦   «          dt          z  } t          dz  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)Únames    r   Úget_temp_module_namer%   :   sE   € õ ÑÔÐØ ¥;Ñ.€DÝ�1Ñ€KØ�sŒ{ÐÐåÐBÑCÔCÐCØ€Kr   c                 ó2   ‡ ‡— i Šˆ ˆfd„}‰ j         |_         |S )Nc                  óº   •— t          | |f¦  «        }|‰vr%	  ‰| i |¤Ž‰|<   n# t          $ r}|‰|<   ‚ d }~ww xY w‰|         }t          |t          ¦  «        r|‚|S r
   )ÚreprÚ	ExceptionÚ
isinstance)ÚaÚkwÚkeyÚeÚretÚfuncÚmemos        €€r   Úwrapperz_memoize.<locals>.wrapperI   s‰   ø€ Ý�A�r�7‰mŒmˆØ�dˆ?ˆ?ðØ ˜D !˜N r˜N˜N��S‘	�	øÝð ð ð Ø��S‘	Øøøøøðøøøð �3ŒiˆÝ�c�9Ñ%Ô%ð 	ØˆIØˆ
s   ˜$ ¤
9®4´9)Ú__name__)r0   r2   r1   s   ` @r   Ú_memoizer4   F   s8   øø€ Ø€Dðð ð ð ð ð ð ”}€GÔØ€Nr   c                 ó¢  — dt           j        ›d�}t          ¦   «         }g }g }| D ]Õ}	t          j                             |	¦  «        st          d|	z  ¦  «        ‚t          j                             |t          j                             |	¦  «        ¦  «        }
t          j	        |	|
¦  «         | 
                    |
¦  «         t          j                             |
¦  «        \  }}|dv r| 
                    |
¦  «         ŒÖ|sJ ‚|€t          ¦   «         }dd|g|z   |z   }|r	|dg|z   z  }|r	|d	g|z   z  }t          j        ¦   «         }	 t          j        |¦  «         t           j        d|g|z   }t!          j        |t           j        t           j        ¬
¦  «        }|                     ¦   «         \  }}|j        dk    r*t          d|dd…         ›dt-          |¦  «        ›�¦  «        ‚	 t          j        |¦  «         |D ]}	t          j        |	¦  «         Œn2# t          j        |¦  «         |D ]}	t          j        |	¦  «         Œw xY wt1          |¦  «        S )zH
    Compile and import a f2py module, built from the given files.

    zimport sys; sys.path = z&; import numpy.f2py; numpy.f2py.main()ú%s is not a file)ú.f90ú.fz.cú.pyfNz-cz-mzskip:zonly:©ÚstdoutÚstderrr   zRunning f2py failed: é   ú
)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ÚcodeÚdÚdst_sourcesÚf2py_sourcesÚfnÚdstÚbaseÚextÚ	f2py_optsÚcwdÚcmdÚpÚoutÚerrs                      r   Úbuild_modulerc   _   s|  € ð X¥S¤XÐWÐWÐW€DåÑÔ€Að €KØ€LØð 	%ð 	%ˆÝŒw�~Š~˜bÑ!Ô!ð 	8ÝÐ1°BÑ6Ñ7Ô7Ð7ÝŒg�lŠl˜1�bœg×.Ò.¨rÑ2Ô2Ñ3Ô3ˆÝŒ˜˜CÑ Ô Ð Ø×Ò˜3ÑÔÐå”G×$Ò$ SÑ)Ô)‰	ˆˆcØÐ.Ð.Ð.Ø×Ò Ñ$Ô$Ð$øàÐÐÐð ÐÝ*Ñ,Ô,ˆØ�t˜[Ð)¨GÑ3°lÑB€IØð &Ø�g�Y Ñ%Ñ%ˆ	Øð &Ø�g�Y Ñ%Ñ%ˆ	õ Œ)‰+Œ+€CðÝ
Œ�‰ŒˆÝŒ~˜t TÐ*¨YÑ6ˆÝÔ˜SÝ$.¤OÝ$.Ô$5ð7ñ 7ô 7ˆð —=’=‘?”?‰ˆˆSØŒ<˜1ÒÐÝ�,Ø # A B B¤  ­¨s©¬¨ð 5ñ 6ô 6ð 6ð õ 	Œ�‰Œˆð ð 	ð 	ˆBÝŒI�b‰MŒMˆMˆMð	øõ 	Œ�‰Œˆð ð 	ð 	ˆBÝŒI�b‰MŒMˆMˆMð	øøøõ ˜Ñ%Ô%Ð%s   ÅBH È/H?c                 ó  — |€d}t          |¬¦  «        5 }t          |d¦  «        5 }|                     | ¦  «         ddd¦  «         n# 1 swxY w Y   t          |g||||¬¦  «        cddd¦  «         S # 1 swxY w Y   dS )z6
    Compile and import Fortran code using f2py.

    Nr8   )ÚsuffixÚw©rQ   rR   rS   rT   )r   ÚopenÚwriterc   )Úsource_coderQ   rR   rS   re   rT   r   Úfs           r   Ú
build_coderl   š   s  € ð €~ØˆÝ	˜Ð	 Ñ	 Ô	 ð 5 DÝ�$˜‰_Œ_ð 	! Ø�GŠG�KÑ Ô Ð ð	!ð 	!ð 	!ñ 	!ô 	!ð 	!ð 	!ð 	!ð 	!ð 	!ð 	!øøøð 	!ð 	!ð 	!ð 	!å˜T˜FØ$+Ø!%Ø!%Ø(3ð	5ñ 5ô 5ð5ð 5ð 5ð 5ñ 5ô 5ð 5ð 5ð 5ð 5ð 5ð 5øøøð 5ð 5ð 5ð 5ð 5ð 5s3   •A4¦A¼A4ÁA	ÁA4ÁA	ÁA4Á4A8Á;A8c            	      ó&  — t           �t           S da t          rt           S t          j        dt	          t
          j        ¦  «        › d�¦  «        } | t          t	          t
          j        ¦  «        ¬¦  «        z  } t          j	        ¦   «         }	 t          j                             |d¦  «        }t          |d¦  «        5 }|                     | ¦  «         d d d ¦  «         n# 1 swxY w Y   t
          j        ddg}t          j        |t          j        t          j        |¬¦  «        }|                     ¦   «         \  }}t)          j        |¦  «         n# t)          j        |¦  «         w xY wt-          j        d	|¦  «        }|rŒt1          t3          |                     d
¦  «        ¦  «        ¦  «        t1          t3          |                     d¦  «        ¦  «        ¦  «        t1          t3          |                     d¦  «        ¦  «        ¦  «        fa t           S )N)FFFz8        import os
        import sys
        sys.path = a{  

        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.pyrf   Úconfig)r;   r<   r^   s   COMPILERS:(\d+),(\d+),(\d+)r    é   é   )Ú_compiler_statusr   ÚtextwrapÚdedentr(   r   r   Údictr   r   r?   rA   rh   ri   rH   rI   rJ   rK   rL   rM   r   r   ÚreÚsearchÚboolÚintÚgroup)	rU   ÚtmpdirÚscriptrk   r_   r`   ra   rb   Úms	            r   Ú_get_compiler_statusr~   ¸   sü  € åÐ#ÝÐà,ÐÝð  åÐõ Œ?ð õ �œ‘N”Nðð ð ñ ô €Dð* •$�t¥C¤H™~œ~Ð.Ñ.Ô.Ñ.€DåÔÑÔ€FðÝ”—’˜f jÑ1Ô1ˆå�&˜#ÑÔð 	 !Ø�GŠG�D‰MŒMˆMð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	õ Œ~˜z¨8Ð4ˆÝÔ˜SÝ$.¤OÝ$.Ô$5Ø!'ð)ñ )ô )ˆð —=’=‘?”?‰ˆˆSåŒ�fÑÔÐÐø�Œ�fÑÔÐÐøøøå
Œ	Ð1°3Ñ7Ô7€AØð 
å•�Q—W’W˜Q‘Z”Z‘”Ñ!Ô!Ý•�Q—W’W˜Q‘Z”Z‘”Ñ!Ô!Ý•�Q—W’W˜Q‘Z”Z‘”Ñ!Ô!ð
Ðõ Ðs1   Â0E Â<CÃE ÃC"Ã"E Ã%C"Ã&AE ÅE&c                  ó*   — t          ¦   «         d         S r   ©r~   r   r   r   Úhas_c_compilerr�   ö   ó   € ÝÑ!Ô! !Ô$Ð$r   c                  ó*   — t          ¦   «         d         S )Nr    r€   r   r   r   Úhas_f77_compilerr„   ú   r‚   r   c                  ó*   — t          ¦   «         d         S )Nrp   r€   r   r   r   Úhas_f90_compilerr†   þ   r‚   r   c                 ój  — t          ¦   «         }g }| D ]š}t          j                             |¦  «        st	          d|z  ¦  «        ‚t          j                             |t          j                             |¦  «        ¦  «        }t          j        ||¦  «         | 	                    |¦  «         Œ›t          j        |¦  «                             dd¦  «        }dt          t          j        ¦  «        › d|› d�}t          j                             |t          ¦   «         dz   ¦  «        }	| 	                    |	¦  «         t!          |	d¦  «        5 }
|
                     t%          |¦  «        ¦  «         d	d	d	¦  «         n# 1 swxY w Y   t          j        ¦   «         }	 t          j        |¦  «         t          j        |	d
dg}t-          j        |t,          j        t,          j        ¬¦  «        }|                     ¦   «         \  }}|j        dk    r*t	          d|dd	…         ›dt9          |¦  «        ›�¦  «        ‚	 t          j        |¦  «         |D ]}t          j        |¦  «         Œn2# t          j        |¦  «         |D ]}t          j        |¦  «         Œw xY wt=          |¦  «         t          j        |         S )z6
    Build a module via distutils and import it.

    r6   r>   z
    z!
import os
import sys
sys.path = z¥

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

if __name__ == "__main__":
    from numpy.distutils.core import setup
    setup(configuration=configuration)
    z.pyÚwbNÚ	build_extz-ir:   r   z Running distutils build failed: r=   ) r   r?   r   r@   r#   rA   rB   r   rC   rD   rs   rt   Úreplacer(   r   r%   rh   ri   r   rF   rG   rH   rI   rJ   rK   rL   rM   rN   r   rO   Ú
__import__r"   )rP   Úconfig_coderT   r,   rV   rW   rY   rZ   rU   r|   rk   r^   r_   r`   ra   rb   s                   r   Úbuild_module_distutilsr�     sÔ  € õ 	ÑÔ€Að €KØð  ð  ˆÝŒw�~Š~˜bÑ!Ô!ð 	8ÝÐ1°BÑ6Ñ7Ô7Ð7ÝŒg�lŠl˜1�bœg×.Ò.¨rÑ2Ô2Ñ3Ô3ˆÝŒ˜˜CÑ Ô Ð Ø×Ò˜3ÑÔÐÐõ ”/ +Ñ.Ô.×6Ò6°t¸XÑFÔF€Kðõ •”‰NŒNðð ð ðð ð €Dõ ŒW�\Š\˜!Õ1Ñ3Ô3°eÑ;Ñ<Ô<€FØ×Ò�vÑÔÐÝ	ˆf�dÑ	Ô	ð ˜qØ	�Š•˜‘”ÑÔÐðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð õ Œ)‰+Œ+€CðÝ
Œ�‰ŒˆÝŒ~˜v {°DÐ9ˆÝÔ˜SÝ$.¤OÝ$.Ô$5ð7ñ 7ô 7ˆð —=’=‘?”?‰ˆˆSØŒ<˜1ÒÐÝ�,Ø # A B B¤  ­¨s©¬¨ð 5ñ 6ô 6ð 6ð õ 	Œ�‰Œˆð ð 	ð 	ˆBÝŒI�b‰MŒMˆMˆMð	øõ 	Œ�‰Œˆð ð 	ð 	ˆBÝŒI�b‰MŒMˆMˆMð	øøøõ ˆ{ÑÔÐÝŒ;�{Ô#Ð#s   Å
#E9Å9E=Æ E=ÆBI" É"/Jc                   óF   — e Zd ZdZdZg Zg Zg ZdZdZ	e
d„ ¦   «         Zd„ ZdS )ÚF2PyTestNr8   c                 óz   — t          | ¦  «        }d|j                             dd¦  «        d         › d|j        › d�S )NÚ_ú.r    éÿÿÿÿÚ_ext_module)ÚtypeÚ
__module__Úrsplitr3   )ÚselfÚclss     r   rT   zF2PyTest.module_nameU  s?   € å�4‰jŒjˆØO�3”>×(Ò(¨¨QÑ/Ô/°Ô3ÐOÐO°c´lÐOÐOÐOÐOr   c                 ó  — t           j        dk    rt          j        d¦  «         | j        �d S t          ¦   «         st          j        d¦  «         g }| j        r|                     | j        ¦  «         | j        �| 	                    | j
        ¦  «         d}d}d}|D ]p}t          |¦  «                             d¦  «        rd}Œ't          |¦  «                             d¦  «        rd}ŒLt          |¦  «                             d¦  «        rd}Œq|r"t          ¦   «         st          j        d	¦  «         |r"t          ¦   «         st          j        d
¦  «         |r0t          ¦   «         s"t          ¦   «         st          j        d¦  «         | j        �8t          | j        | j        | j        | j        | j
        | j        ¬¦  «        | _        | j        �4t'          | j        | j        | j        | j        | j        ¬¦  «        | _        d S d S )NÚwin32z)Fails with MinGW64 Gfortran (Issue #9673)zNo C compiler availableFr8   Tr7   r9   z No Fortran 77 compiler availablez No Fortran 90 compiler availablezNo Fortran compiler available)rQ   rR   rS   re   rT   rg   )r   ÚplatformÚpytestrR   Úmoduler�   ÚsourcesÚextendrU   rD   re   ÚstrÚendswithr„   r†   rl   rQ   rS   rT   rc   )r˜   ÚcodesÚ	needs_f77Ú	needs_f90Ú	needs_pyfrY   s         r   Úsetup_methodzF2PyTest.setup_methodZ  s  € ÝŒ<˜7Ò"Ð"ÝŒKÐCÑDÔDÐDàŒ;Ð"ØˆFõ ÑÔð 	3ÝŒKÐ1Ñ2Ô2Ð2àˆØŒ<ð 	'Ø�LŠL˜œÑ&Ô&Ð&ØŒ9Ð Ø�LŠL˜œÑ%Ô%Ð%àˆ	Øˆ	Øˆ	Øð 	!ð 	!ˆBÝ�2‰wŒw×Ò Ñ%Ô%ð !Ø �	�	Ý�R‘”×!Ò! &Ñ)Ô)ð !Ø �	�	Ý�R‘”×!Ò! &Ñ)Ô)ð !Ø �	øØð 	<Õ-Ñ/Ô/ð 	<ÝŒKÐ:Ñ;Ô;Ð;Øð 	<Õ-Ñ/Ô/ð 	<ÝŒKÐ:Ñ;Ô;Ð;Øð 	9Õ.Ñ0Ô0ð 	9Õ4DÑ4FÔ4Fð 	9ÝŒKÐ7Ñ8Ô8Ð8ð Œ9Ð Ý$Ø”	ØœØ”YØ”YØ”{Ø Ô,ðñ ô ˆDŒKð Œ<Ð#Ý&Ø”ØœØ”YØ”YØ Ô,ðñ ô ˆDŒKˆKˆKð $Ð#r   )r3   r–   Ú__qualname__rU   rŸ   rQ   rR   rS   re   rž   ÚpropertyrT   r§   r   r   r   r�   r�   L  sb   € € € € € Ø€DØ€GØ€GØ€DØ€DØ€FØ€FàðPð Pñ „XðPð4ð 4ð 4ð 4ð 4r   r�   c                  ó€   — t          t          j        j        ¦  «        j                             ¦   «         } |j        | Ž S r
   )r   ÚnumpyÚf2pyÚ__file__ÚparentÚresolveÚjoinpath)r+   rV   s     r   Úgetpathr±   –  s1   € å�UŒZÔ Ñ!Ô!Ô(×0Ò0Ñ2Ô2€AØˆ1Œ:�qˆ>Ðr   c              #   ó¼   K  — t          j        ¦   «         }t          j        | ¦  «         	 d V — t          j        |¦  «         d S # t          j        |¦  «         w xY wr
   )r   r^   r?   rG   )r   Úcurpaths     r   Ú	switchdirr´   œ  sX   è è € åŒh‰jŒj€GÝ„HˆT�N„N€NðØˆˆˆå
Œ�ÑÔÐÐÐø�Œ�ÑÔÐÐøøøs   «A ÁA)(Ú__doc__r?   r   rI   r   r   r   rs   rv   r�   Ú
contextlibr«   Úpathlibr   Únumpy.compatr   r   Únumpy.testingr   r   Ú	importlibr   r   r!   r   r   r%   r4   rc   rl   rr   r~   r�   r„   r†   r�   r�   r±   Úcontextmanagerr´   r   r   r   ú<module>r¼      s9  ððð ð 
€	€	€	Ø 
€
€
€
Ø Ð Ð Ð Ø €€€Ø €€€Ø €€€Ø €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø €€€à Ð Ð Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ø #Ð #Ð #Ð #Ð #Ð #ð €Ø€ðð ð ðð ð ð	ð 	ð 	ðð ð ð2 
Ø')°¸Èð 7&ð 7&ð 7&ñ 
„ð7&ðt 
àØØØØð5ð 5ð 5ñ 
„ð5ð4 Ð ð;ð ;ð ;ð|%ð %ð %ð%ð %ð %ð%ð %ð %ð 
ð<$ð <$ñ 
„ð<$ðHBð Bð Bð Bð Bñ Bô Bð BðTð ð ð Ôðð ñ Ôðð ð r   