B
    b%                 @   s   d Z ddlmZmZ ddlmZmZ ddlmZ dd Z	dd	 Z
d
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )zSCons.Tool.cyglink

Customization of gnulink for Cygwin (http://www.cygwin.com/)

There normally shouldn't be any need to import this module directly.
It will usually be imported through the generic SCons.Tool.Tool()
selection method.

    )StringizeLibSymlinksEmitLibSymlinks)CLVar	is_String   )gnulinkc       
      K   s   d}d|kr|d }nd}| dd}|r@td| d   |s|jd| | |d	}|j|}d
|j_| 	| |rtd| td|   x&| D ]}	t
|	r||	}	d
|	j_qW | |fS )NTvariable_prefixSHLIBno_import_libFz#cyglink_lib_emitter: target[0]={!r}r   z$%s_IMPLIBNAME)targetsourcer   z"cyglink_lib_emitter: import_lib={}zcyglink_lib_emitter: target=%s)getprintformatZget_pathsubstZfsFile
attributesZsharedappendr   )
r   r   envkwverbose
var_prefixr
   Z
import_libZimport_lib_targetZtgt r   1lib/python3.7/site-packages/SCons/Tool/cyglink.pycyglink_lib_emitter   s(    



r   c             K   s   t | ||ddS )NLDMODULE)r   )r   )r   r   r   r   r   r   r   cyglink_ldmodule_emitter1   s    r   c             K   s(  d}d|kr|d }nd}| dd}|dkrF|r>td|  | |fS |d| }|dkrd| |fS |d	| }|r |rtd
||f  | d }	|jd| | d |d}
|rtd|
  td|	  ||
|	fg}|rtdddd t|D  |r t||| d  || d j_	| |fS )z
    On cygwin, we only create a symlink from the non-versioned implib to the versioned implib.
    We don't version the shared library itself.
    :param target:
    :param source:
    :param env:
    :param kw:
    :return:
    Tr   r	   r
   F)1TruetrueTz/cyglink_shlib_symlink_emitter: no_import_lib=%sz$%sNOVERSIONSYMLINKSz
$%sVERSIONz+cyglink_shlib_symlink_emitter: %sVERSION=%sr   z$%s_NOVERSION_SYMLINKr   )r   r   z:cyglink_shlib_symlink_emitter: shlib_noversion_symlink :%sz:cyglink_shlib_symlink_emitter: imp_lib_node            :%sz,cyglink_shlib_symlink_emitter: symlinks={!r}z, c             S   s   g | ]\}}d ||f qS )z%r->%rr   ).0kvr   r   r   
<listcomp>a   s    z1cyglink_shlib_symlink_emitter.<locals>.<listcomp>)
r   r   r   r   r   joinr   r   r   Z
shliblinks)r   r   r   r   r   r   r
   Zno_symlinksZshlibversionZimp_lib_nodeZshlib_noversion_symlinkZsymlinksr   r   r   cyglink_shlib_symlink_emitter5   s:    

r%   c             K   s   t | ||ddS )Nr   )r   )r%   )r   r   r   r   r   r   r   cyglink_ldmod_symlink_emittero   s    r&   c             C   s@   d}d| }||krdS |j d| | |d}|dd}d| S )Nr	   z	%sVERSION z$%s)r   r   .-)r   replace)r   r   r   for_signaturer   varversionr   r   r   cyglink_shlibversions   s    r.   c             C   s@   d}d| }||krdS |j d| | |d}|dd}d| S )Nr   z	%sVERSIONr'   z$%s)r   r   r(   r)   )r   r*   )r   r   r   r+   r   r,   r-   r   r   r   cyglink_ldmodule_version~   s    r/   c             C   s    | dd}|dkrdS dS d S )Nr
   F)r   r   r   Tr'   zd-Wl,--out-implib=${TARGETS[1]} -Wl,--export-all-symbols -Wl,--enable-auto-import -Wl,--whole-archive)r   )r   r   r   r+   r
   r   r   r   _implib_pre_flags   s    r0   c             C   s    | dd}|dkrdS dS d S )Nr
   F)r   r   r   Tr'   z-Wl,--no-whole-archive)r   )r   r   r   r+   r
   r   r   r   _implib_post_flags   s    r1   c             C   s   t |  td| d< d| d< d| d< d| d< d	| d
< d| d< d| d< t| d< t| d< d| d< d| d< ttg| d< ttg| d< d| d< d| d< d| d< d| d< t	| d< d | d!< d"| d#< t
| d$< d%| d&< d'| d(< xd)D ]}|| kr| |= qW d*S )+zFAdd Builders and construction variables for cyglink to an Environment.z-Wl,-no-undefinedZ	LINKFLAGSZcygZSHLIBPREFIXz.dllZSHLIBSUFFIXlibZIMPLIBPREFIXz.dll.aZIMPLIBSUFFIXz$SHLIBVERSIONFLAGSZ_SHLIBVERSIONFLAGSz$LDMODULEVERSIONFLAGSZ_LDMODULEVERSIONFLAGSZ_IMPLIB_PRE_SOURCESZ_IMPLIB_POST_SOURCESz$SHLINK -o $TARGET $SHLINKFLAGS $__SHLIBVERSIONFLAGS $__RPATH $_IMPLIB_PRE_SOURCES $SOURCES  $_IMPLIB_POST_SOURCES $_LIBDIRFLAGS $_LIBFLAGSZ	SHLINKCOMz$LDMODULE -o $TARGET $SHLINKFLAGS $__LDMODULEVERSIONFLAGS $__RPATH $_IMPLIB_PRE_SOURCES $SOURCES $_IMPLIB_POST_SOURCES $_LIBDIRFLAGS  $_LIBFLAGSZLDMODULECOMZSHLIBEMITTERZLDMODULEEMITTERz.${IMPLIBPREFIX}$_get_shlib_stem${IMPLIBSUFFIX}ZSHLIB_NOVERSION_SYMLINKz1${IMPLIBPREFIX}$_get_ldmodule_stem${IMPLIBSUFFIX}ZLDMODULE_NOVERSION_SYMLINKz5${IMPLIBPREFIX}$_get_shlib_stem${_SHLIB_IMPLIBSUFFIX}ZSHLIB_IMPLIBNAMEz;${IMPLIBPREFIX}$_get_ldmodule_stem${_LDMODULE_IMPLIBSUFFIX}ZLDMODULE_IMPLIBNAMEZ_cyglink_shlibversionz'${_cyglink_shlibversion}${IMPLIBSUFFIX}Z_SHLIB_IMPLIBSUFFIXz&${_cyglink_shlibversion}${SHLIBSUFFIX}Z_SHLIBSUFFIXZ_cyglink_ldmodule_versionz-${_cyglink_ldmodule_version}${LDMODULESUFFIX}Z_LDMODULESUFFIXz+${_cyglink_ldmodule_version}${IMPLIBSUFFIX}Z_LDMODULE_IMPLIBSUFFIX)Z_SHLIBSONAMEZ_LDMODULESONAMEN)r   generater   r0   r1   r   r%   r   r&   r.   r/   )r   rvr   r   r   r3      s6    

r3   c             C   s
   t | S )N)r   exists)r   r   r   r   r5      s    r5   N)__doc__ZSCons.Tool.linkCommonr   r   Z
SCons.Utilr   r   r'   r   r   r   r%   r&   r.   r/   r0   r1   r3   r5   r   r   r   r   <module>	   s   !:4