U
    +|jü?  ã                   @   sâ   d Z ddlZddlZddlZddlmZmZmZ ddlZddl	m
Z
 ddlmZ ddlmZmZmZmZ ddlmZ ddlmZ d	d
„ ZG dd„ de
ƒZG dd„ deƒZdZdZdZdd„ Ze d¡Zdd„ Zdd„ Z dd„ Z!dS )a  distutils.cygwinccompiler

Provides the CygwinCCompiler class, a subclass of UnixCCompiler that
handles the Cygwin port of the GNU C compiler to Windows.  It also contains
the Mingw32CCompiler class which handles the mingw32 port of GCC (same as
cygwin in no-cygwin mode).
é    N)ÚPopenÚPIPEÚcheck_output)ÚUnixCCompiler)Ú
write_file)ÚDistutilsExecErrorÚCCompilerErrorÚCompileErrorÚUnknownFileError)ÚLooseVersion)Úfind_executablec                  C   s€   t j d¡} | dkr|t j| d | d … }|dkr8dgS |dkrFdgS |d	krTd
gS |dkrbdgS |dkrpdgS td| ƒ‚dS )zaInclude the appropriate MSVC runtime library if Python was built
    with MSVC 7.0 or later.
    zMSC v.éÿÿÿÿé   é
   Z1300Zmsvcr70Z1310Zmsvcr71Z1400Zmsvcr80Z1500Zmsvcr90Z1600Zmsvcr100zUnknown MS Compiler version %s N)ÚsysÚversionÚfindÚ
ValueError)Zmsc_posZmsc_ver© r   úmC:\Users\snmko\Desktop\web_content\django_cbt\venv\Lib\site-packages\setuptools/_distutils/cygwinccompiler.pyÚ	get_msvcr=   s    r   c                
   @   sR   e Zd ZdZdZdZdZdZdZdZ	dZ
dd
d„Zdd„ Zddd„Zddd„ZdS )ÚCygwinCCompilerz? Handles the Cygwin port of the GNU C compiler to Windows.
    Úcygwinz.oú.az.dllzlib%s%sz%s%sz.exer   c                 C   sè   t  | |||¡ tƒ \}}|  d||f ¡ |tk	rB|  d| ¡ tƒ \| _| _| _	|  | j
d| j| j| j	f  ¡ | jdkr†d| _nd| _| jdkrœd}nd	}| jd
dddd| j|f d� | jdkrÜdg| _|  d¡ ntƒ | _d S )Nz%Python's GCC status: %s (details: %s)zƒPython's pyconfig.h doesn't seem to support your compiler. Reason: %s. Compiling may fail because of undefined preprocessor macros.z: gcc %s, ld %s, dllwrap %s
z2.10.90ÚgccÚdllwrapú2.13ú-sharedú-mdll -staticzgcc -mcygwin -O -Wallzgcc -mcygwin -mdll -O -Wallzg++ -mcygwin -O -Wallzgcc -mcygwinz%s -mcygwin %s©ÚcompilerÚcompiler_soÚcompiler_cxxÚ
linker_exeÚ	linker_soú2.91.57Úmsvcrtz,Consider upgrading to a newer version of gcc)r   Ú__init__Úcheck_config_hÚdebug_printÚCONFIG_H_OKÚwarnÚget_versionsÚgcc_versionÚ
ld_versionZdllwrap_versionÚcompiler_typeÚ
linker_dllÚset_executablesÚdll_librariesr   )ÚselfÚverboseÚdry_runÚforceÚstatusÚdetailsÚshared_optionr   r   r   r'   b   sN    
ÿýÿÿ
þÿ


ÿü
ÿzCygwinCCompiler.__init__c              
   C   s¨   |dks|dkrVz|   dd|d|g¡ W q¤ tk
rR } zt|ƒ‚W 5 d}~X Y q¤X nNz"|   | j| |d|g | ¡ W n* tk
r¢ } zt|ƒ‚W 5 d}~X Y nX dS )z:Compiles the source by spawning GCC and windres if needed.ú.rcú.resZwindresz-iz-oN)Úspawnr   r	   r!   )r3   ÚobjÚsrcÚextZcc_argsÚextra_postargsZpp_optsÚmsgr   r   r   Ú_compile�   s    ÿ
zCygwinCCompiler._compileNc                 C   sP  t   |
p
g ¡}
t   |pg ¡}t   |p&g ¡}| | j¡ |dk	�r|| jksV| jdk�rtj |d ¡}tj tj 	|¡¡\}}tj 
||d ¡}tj 
|d| d ¡}dtj 	|¡ dg}|D ]}| |¡ q¾|  t||fd	| ¡ | jd
k�r|
 d|g¡ |
 d|g¡ n
| |¡ |	�s(|
 d¡ t | |||||||d|	|
|||¡ dS )zLink the objects.Nr   r   z.defÚlibr   z
LIBRARY %sZEXPORTSz
writing %sr   z--output-libz--defz-s)ÚcopyÚextendr2   Z
EXECUTABLEr0   ÚosÚpathÚdirnameÚsplitextÚbasenameÚjoinÚappendÚexecuter   r   Úlink)r3   Ztarget_descZobjectsZoutput_filenameÚ
output_dirÚ	librariesÚlibrary_dirsÚruntime_library_dirsÚexport_symbolsÚdebugZextra_preargsr@   Ú
build_tempZtarget_langÚtemp_dirZdll_nameZdll_extensionZdef_fileZlib_fileÚcontentsÚsymr   r   r   rN   ¬   sR    
ÿÿ

ÿþÿ

     ûzCygwinCCompiler.linkÚ c                 C   sª   |dkrd}g }|D ]�}t j t j |¡¡\}}|| jddg krRtd||f ƒ‚|rbt j |¡}|dkrŠ| t j ||| | j	 ¡¡ q| t j ||| j	 ¡¡ q|S )z#Adds supports for rc and res files.NrY   r:   r;   z"unknown file type '%s' (from '%s'))r;   r:   )
rF   rG   rI   ÚnormcaseZsrc_extensionsr
   rJ   rL   rK   Úobj_extension)r3   Zsource_filenamesZ	strip_dirrO   Z	obj_namesÚsrc_nameÚbaser?   r   r   r   Úobject_filenamesú   s&    ÿÿÿz CygwinCCompiler.object_filenames)r   r   r   )
NNNNNr   NNNN)r   rY   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r/   r[   Zstatic_lib_extensionÚshared_lib_extensionZstatic_lib_formatZshared_lib_formatZexe_extensionr'   rB   rN   r^   r   r   r   r   r   W   s,   
;                ý
Nr   c                   @   s   e Zd ZdZdZddd„ZdS )ÚMingw32CCompilerz@ Handles the Mingw32 port of the GNU C compiler to Windows.
    Zmingw32r   c              	   C   sx   t  | |||¡ | jdkr d}nd}| jdkr4d}nd}tƒ rFtdƒ‚| jdd	d
dd| j||f d� g | _t	ƒ | _d S )Nr   r   r   r%   z--entry _DllMain@12rY   z1Cygwin gcc cannot be used with --compiler=mingw32zgcc -O -Wallzgcc -mdll -O -Wallzg++ -O -Wallr   z%s %s %sr   )
r   r'   r.   r-   Úis_cygwingccr   r1   r0   r2   r   )r3   r4   r5   r6   r9   Úentry_pointr   r   r   r'     s.    

ÿÿÿüzMingw32CCompiler.__init__N)r   r   r   )r_   r`   ra   rb   r/   r'   r   r   r   r   rd     s   rd   Úokznot okZ	uncertainc               
   C   s°   ddl m}  dtjkrtdfS |  ¡ }zLt|ƒ}z4d| ¡ krPtd| fW ¢W S t	d| fW ¢W S W 5 | ¡  X W n8 t
k
rª } ztd||jf f W Y ¢S d	}~X Y nX d	S )
aw  Check if the current Python installation appears amenable to building
    extensions with GCC.

    Returns a tuple (status, details), where 'status' is one of the following
    constants:

    - CONFIG_H_OK: all is well, go ahead and compile
    - CONFIG_H_NOTOK: doesn't look good
    - CONFIG_H_UNCERTAIN: not sure -- unable to read pyconfig.h

    'details' is a human-readable string explaining the situation.

    Note there are two ways to conclude "OK": either 'sys.version' contains
    the string "GCC" (implying that this Python was built with GCC), or the
    installed "pyconfig.h" contains the string "__GNUC__".
    r   )Ú	sysconfigZGCCzsys.version mentions 'GCC'Z__GNUC__z'%s' mentions '__GNUC__'z '%s' does not mention '__GNUC__'zcouldn't read '%s': %sN)Ú	distutilsrh   r   r   r*   Úget_config_h_filenameÚopenÚcloseÚreadÚCONFIG_H_NOTOKÚOSErrorÚCONFIG_H_UNCERTAINÚstrerror)rh   ÚfnÚconfig_hÚexcr   r   r   r(   F  s    
ÿr(   s   (\d+\.\d+(\.\d+)*)c                 C   sl   |   ¡ d }t|ƒdkrdS t| dtd�j}z| ¡ }W 5 | ¡  X t |¡}|dkrZdS t	| 
d¡ ¡ ƒS )z¤Find the version of an executable by running `cmd` in the shell.

    If the command is not found, or the output does not match
    `RE_VERSION`, returns None.
    r   NT)ÚshellÚstdouté   )Úsplitr   r   r   rv   rl   rm   Ú
RE_VERSIONÚsearchr   ÚgroupÚdecode)ÚcmdÚ
executableÚoutÚ
out_stringÚresultr   r   r   Ú_find_exe_versions  s    

r‚   c                  C   s   dddg} t dd„ | D ƒƒS )zg Try to find out the versions of gcc, ld and dllwrap.

    If not possible it returns None for it.
    zgcc -dumpversionzld -vzdllwrap --versionc                 S   s   g | ]}t |ƒ‘qS r   )r‚   )Ú.0r}   r   r   r   Ú
<listcomp>Ž  s     z get_versions.<locals>.<listcomp>)Útuple)Úcommandsr   r   r   r,   ˆ  s    
r,   c                  C   s   t ddgƒ} |  ¡  d¡S )z>Try to determine if the gcc that would be used is from cygwin.r   z-dumpmachines   cygwin)r   ÚstripÚendswith)r€   r   r   r   re   �  s    re   )"rb   rF   r   rD   Ú
subprocessr   r   r   ÚreZdistutils.unixccompilerr   Údistutils.file_utilr   Údistutils.errorsr   r   r	   r
   Zdistutils.versionr   Údistutils.spawnr   r   r   rd   r*   rn   rp   r(   Úcompilery   r‚   r,   re   r   r   r   r   Ú<module>   s,   / ;1+
