o
    ™ía”5  ã                   @   s  zd dl mZ W n ey   d dlmZ Y nw d dlZd dlZd dlm  mZ	 d dl
Z
d dlZd dlZd dlmZ e d¡Zdd„ ZG dd	„ d	eƒZd
d ej¡dfdd„Zddd„Zdd„ Zdd„ Zdd„ Zdd„ Zed
d ej¡dƒZdd„ Zedkr„eƒ  dS dS )é    )ÚConfigParser)ÚSafeConfigParserN)ÚproductÚpythranc                   C   s   t j t j t¡¡pdd S )NÚ.z/pythran)ÚosÚpathÚdirnameÚ__file__© r   r   ú0/usr/lib/python3/dist-packages/pythran/config.pyÚget_include   s   r   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Úsilentz/
    Silent sys.stderr at the system level
    c                 C   s\   zt  tj ¡ ¡| _t  tj ¡ ¡ W n tjy    d | _Y nw tj| _	t
t jdƒt_d S )NÚr)r   ÚdupÚsysÚstderrÚfilenoÚprevfdÚcloseÚioÚUnsupportedOperationÚ
prevstreamÚopenÚdevnull)Úselfr   r   r   Ú	__enter__   s   
ÿzsilent.__enter__c                 C   s@   t j ¡  | jt _| jrt | jt j ¡ ¡ t | j¡ d S d S ©N)r   r   r   r   r   r   Údup2r   )r   Úexc_typeÚ	exc_valueÚ	tracebackr   r   r   Ú__exit__%   s   
þzsilent.__exit__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r"   r   r   r   r   r      s    
r   úpythran.cfgúpythran-{}.cfgú
.pythranrcc                 C   sž   t j t¡}t j || ¡}t j ||¡}t j |¡s!t j |d¡}t j dd ¡}|sIt j dd ¡}|s:t j dd ¡}|s>d}t j t j ||¡¡}|||dœS )Nzpythran-default.cfgZ	PYTHRANRCZXDG_CONFIG_HOMEÚHOMEú~)r   ÚplatformÚuser)	r   r   r	   r
   ÚjoinÚexistsÚenvironÚgetÚ
expanduser)Úsys_fileÚplatform_fileÚ	user_fileZsys_config_dirÚsys_config_pathÚplatform_config_pathÚuser_config_pathZuser_config_dirr   r   r   Úget_paths_cfg-   s*   ÿÿþr9   c           
      C   sf   t | ||ƒ}|d }|d }|d }tƒ }||fD ]}	| |	g¡ q| |g¡ |d ur1t||ƒ |S )Nr   r,   r-   )r9   r   ÚreadÚ
update_cfg)
r3   r4   r5   Úconfig_argsÚpathsr6   r7   r8   ÚcfgpÚrequiredr   r   r   Úinit_cfgH   s   
r@   c              	   C   sf   |D ].}z#|j ddd\}}|  d¡\}}|  |¡s|  |¡ |  |||¡ W q ty0   Y qw d S )Nú=é   )Úmaxsplitr   )ÚsplitÚhas_sectionZadd_sectionÚsetÚ	Exception)r>   r<   ÚargZlhsZrhsÚsectionÚitemr   r   r   r;   Z   s   

ÿùr;   c           
   	   K   sþ   |st ƒ }tƒ }| |d |d g¡ | ¡ D ](\}}tj |¡}d d |¡ 	d¡|r.dnd|g¡}|r:t
 |¡nt
 |¡ q|  ¡ D ]8}| |¡rtt|  |¡ƒ}t| |¡ƒ}	| |	¡rgt
 d |¡¡ qDt
 d	 || |	¡¡¡ qDt
 d
 |¡¡ qDd S )Nr   r,   ú z{} fileé   zexists:zdoes not exist:z7pythranrc section [{}] is valid and options are correctz=pythranrc section [{}] is valid but options {} are incorrect!z"pythranrc section [{}] is invalid!)r9   r   r:   Úitemsr   r   r/   r.   ÚformatÚrjustÚloggerÚinfoÚwarningZsectionsrE   rF   ÚoptionsÚissubsetÚ
difference)
r>   r=   Zcfgp_refÚlocr   r/   ÚmsgrI   rS   Zoptions_refr   r   r   Úlint_cfgh   s<   
ý€

üüÿèrX   c                    s®  t dd tj¡d| dd ¡ƒ}d|v r| d¡ dd„ ‰ ddd	„ | d
d¡ ¡ D ƒdd	„ | d
d¡ ¡ D ƒdd	„ | d
d¡ ¡ D ƒdd	„ | d
d¡ ¡ D ƒdd	„ | d
d¡ ¡ D ƒdd	„ | d
d¡ ¡ D ƒdd	„ | d
d¡ ¡ D ƒg dœ	}| r~|d  d¡ |d  d tjj	¡¡ t
ƒ }|d  |¡ | dd ¡ | dd ¡}| dd ¡}|d u r­tƒ }|d ur»||d< |p¸||d< tj dd ¡}|d urÏ|d   | ¡ ¡ tj d!d ¡}|d urã|d"  | ¡ ¡ | ¡ D ]\}	}
||	  |
¡ qç| d#d$¡r|d  |d% ¡ | r|d  t 
¡ ¡ d&}| d
d'¡}|d(krQz#d)d l}|d  d*¡ |d  |j¡ |d+  tj |j|j¡¡ W n tyP   t d,¡ d'}Y nw |d-kr]|d  d.¡ ||vrÈtƒ Z t |¡}d/d	„ t|d |d0 ƒD ƒ}td1d2„ |D ƒƒr‹|d  d3¡ n|d  d4 |  ¡ ¡¡ |d0  | d0g ¡¡ |d  | dg ¡¡ |d  | dg ¡¡ W d   ƒ n	1 sÃw   Y  ‡ fd5d	„|d D ƒ|d< |S )6Nr'   r(   r)   Úconfigc                 S   s6   |   d¡}|dk r| d fS | d |… | |d d … fS )NrA   r   rB   )Úfind)ÚdefineÚindexr   r   r   Úparse_define¡   s   
z$make_extension.<locals>.parse_defineúc++c                 S   ó   g | ]}t |ƒ‘qS r   ©Ústr©Ú.0Úxr   r   r   Ú
<listcomp>«   ó    z"make_extension.<locals>.<listcomp>ÚcompilerZdefinesc                 S   r_   r   r`   rb   r   r   r   re   ­   rf   Zundefsc                 S   r_   r   r`   rb   r   r   r   re   ¯   rf   Úinclude_dirsc                 S   r_   r   r`   rb   r   r   r   re   ±   rf   Úlibrary_dirsc                 S   r_   r   r`   rb   r   r   r   re   ³   rf   Úlibsc                 S   r_   r   r`   rb   r   r   r   re   µ   rf   Úcflagsc                 S   r_   r   r`   rb   r   r   r   re   ·   rf   Úldflags)	ÚlanguageÚdefine_macrosZundef_macrosrh   ri   Ú	librariesÚextra_compile_argsÚextra_link_argsÚextra_objectsrn   ZENABLE_PYTHON_MODULEz__PYTHRAN__={}rm   ÚcxxÚccZCXXFLAGSrp   ZLDFLAGSrq   r   Zcomplex_hookz/pythonic/patch)úpythran-openblasÚnoneZblasru   r   ZPYTHRAN_BLAS_OPENBLASrr   zvFailed to find 'pythran-openblas' package. Please install it or change the compiler.blas setting. Defaulting to 'blas'rv   ZPYTHRAN_BLAS_NONEc                 S   s$   g | ]\}}t j |d  |¡¡‘qS )zlib{}.so)r   r   r.   rN   )rc   ÚdirÚlibr   r   r   re   ý   s    ÿro   c                 s   s     | ]}d t j |¡v V  qdS )ZatlasN)r   r   Úrealpath)rc   Úfr   r   r   Ú	<genexpr>  s   € z!make_extension.<locals>.<genexpr>ZPYTHRAN_BLAS_ATLASzPYTHRAN_BLAS_{}c                    s"   g | ]}t |tƒr|nˆ |ƒ‘qS r   )Ú
isinstanceÚtuple)rc   Zdm©r]   r   r   re     s    ÿÿ)!r@   rN   r   r,   r1   ÚpoprD   ÚappendÚversion_infoÚmajorr   rg   r   r0   ÚextendrM   Z
getbooleanÚnumpyZpythran_openblasrh   r   r.   Zlibrary_dirZstatic_libraryÚImportErrorrP   rR   r   Ú	numpy_sysZget_infor   ÚanyÚupper)ÚpythonZextraÚcfgÚ	extensionZpythonic_dirrs   rt   rk   rl   ÚkÚwZreserved_blas_entriesZ	user_blasZopenblasZ
numpy_blasZlibrary_filesr   r~   r   Úmake_extension—   sÈ   

ý
ÿÿÿÿÿÿÿïÿ
ÿ
ü


ÿÿ

ÿ
ÿ
ÿð

þrŽ   c                  C   s*   t t dd¡ƒ} | sd} tj d| ¡pdS )a  Get compiler to use for C++ to binary process. The precedence for
    choosing the compiler is as follows::

      1. `CXX` environment variable
      2. User configuration (~/.pythranrc)

    Returns None if none is set or if it's set to the empty string

    rg   ZCXXN)ra   rŠ   r1   r   r0   )Zcfg_cxxr   r   r   rg     s   
rg   c                     sØ  ddl } ddl}ddl}ddl}ddl}| jdddd}|jddd	d
 |jdddd
 |jdddd
 |jdddd
 |jdddddd | tj	dd… ¡}|j
 |_g }|jj|jd}|jdkrz|jdkrpt tj¡ nt tj¡ ttƒ |js‚|jdkr™tƒ p†d}t d d¡| ¡ |jr™| |¡ |j ¡ ‰ |j ˆ ¡ |js¬|jdkr÷dd„ ‰g }	|	 ‡fdd„|d  D ƒ¡ |	 d!d„ |d" D ƒ¡ |jrâ|	 d#|  ¡  ¡ |	 d#|j !¡  ¡ t d$ d¡d% "|	¡ ¡ |jr÷| |	¡ |j#s|jdkr^g }
|
 ‡ fd&d„|d' D ƒ¡ |
 ‡ fd(d„|d) D ƒ¡ |jrH|
 ˆ  $|j %d*¡¡¡ |
 |j %d+¡ &¡ ¡ |
 ˆ  'd,¡|j %d-¡ ¡ t d. d¡d% "|
¡ ¡ |j#r^| |
¡ |rjt(d% "|¡ƒ dS dS )/zU
    Dump on stdout the config flags required to compile pythran-generated code.
    r   Nzpythran-configz/output build options for pythran-generated codezIt's a megablast!)ÚprogÚdescriptionÚepilogz
--compilerÚ
store_truezprint default compiler)ÚactionÚhelpz--cflagszprint compilation flagsz--libszprint linker flagsz--no-pythonz#do not include Python-related flagsz	--verbosez-vÚcountzlverbose mode: [-v] prints warnings if pythranrc has an invalid configuration; use [-vv] for more information)r“   Údefaultr”   rB   )r‰   é   r^   zCXX = é
   c                 S   s(   | \}}|d u rd| S d| d | S )Nz-DrA   r   )r[   ÚnameÚvaluer   r   r   Ú
fmt_defineh  s   zrun.<locals>.fmt_definec                 3   s    | ]}ˆ |ƒV  qd S r   r   )rc   r[   )r›   r   r   r{   p  ó   € ÿzrun.<locals>.<genexpr>rn   c                 s   s    | ]}d | V  qdS )ú-INr   ©rc   Zincluder   r   r   r{   r  rœ   rh   r   zCXXFLAGS = rK   c                 3   ó    | ]}ˆ   |¡V  qd S r   )Úlibrary_dir_optionrž   ©Úcompiler_objr   r   r{   ~  ó   € ÿri   c                 3   rŸ   r   )Úlibrary_optionrž   r¡   r   r   r{   €  r£   ro   ZLIBPLZLIBSr‰   ZVERSIONz
LDFLAGS = ))ÚargparseZdistutils.ccompilerZdistutils.sysconfigr   r„   ÚArgumentParserÚadd_argumentÚ
parse_argsr   ÚargvZ	no_pythonr‰   rY   rŽ   ÚverboserP   ZsetLevelÚloggingZWARNINGÚINFOrX   rŠ   rg   rQ   rO   r€   Z	ccompilerZnew_compilerZ	sysconfigZcustomize_compilerrk   rƒ   r   Zget_python_incr.   rj   r    Zget_config_varrD   r¤   Úprint)r¥   Ú	distutilsr   r„   ÚparserÚargsÚoutputr‹   rs   rk   rl   r   )r¢   r›   r   Úrun+  s˜   ýÿÿÿÿþ





ÿ
ÿ
ÿÿ
ÿ
ÿr²   Ú__main__r   )Úconfigparserr   r…   r   r   r«   Znumpy.distutils.system_infor®   Zsystem_infor†   r„   r   r   Ú	itertoolsr   Z	getLoggerrP   r   Úobjectr   rN   r,   r9   r@   r;   rX   rŽ   rg   rŠ   r²   r#   r   r   r   r   Ú<module>   s@    ÿ


ý
/~
þf
ÿ