B
    b9                 @   s   d Z ddlmZ ddlmZ ddlmZ dZG dd deZ	G d	d
 d
eZ
dd Zdd Zdd Zdd Zdd Zdd ZdS )zSCons.Tool.applelink

Tool-specific initialization for Apple's gnu-like linker.

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.

    )CLVar)	UserError   )link)i     r   c               @   s   e Zd ZdS )'AppleLinkInvalidCurrentVersionExceptionN)__name__
__module____qualname__ r   r   3lib/python3.7/site-packages/SCons/Tool/applelink.pyr   .   s   r   c               @   s   e Zd ZdS )-AppleLinkInvalidCompatibilityVersionExceptionN)r   r	   r
   r   r   r   r   r   2   s   r   c          	   C   s   |  d}t|dkr"dd|  fS t|dkr:dd|  fS xlt|D ]`\}}yt|}W n  tk
rx   dd|| f fS X |dk s|t| krDdd|| t| f fS qDW d	S )
z
    Check that the version # is valid.
    X[.Y[.Z]]
    where X 0-65535
    where Y either not specified or 0-255
    where Z either not specified or 0-255
    :param version_string:
    :return:
    .   Fz(Version string has too many periods [%s]r   zVersion string unspecified [%s]z.Version component %s (from %s) is not a numberzLVersion component %s (from %s) is not valid value should be between 0 and %d)T )splitlen	enumerateint
ValueError_APPLELIB_MAX_VERSION_VALUES)version_stringpartsipZp_ir   r   r   _applelib_check_valid_version6   s    

r   c             C   sx   | ddrdS | ddr&|d }n| ddr<|d }ndS d|ddd }t|\}}|spt|d	| S )
a  
    A generator function to create the -Wl,-current_version flag if needed.
    If env['APPLELINK_NO_CURRENT_VERSION'] contains a true value no flag will be generated
    Otherwise if APPLELINK_CURRENT_VERSION is not specified, env['SHLIBVERSION']
    will be used.

    :param source:
    :param target:
    :param env:
    :param for_signature:
    :return: A string providing the flag to specify the current_version of the shared library
    ZAPPLELINK_NO_CURRENT_VERSIONFr   ZAPPLELINK_CURRENT_VERSIONSHLIBVERSIONr   Nr   z-Wl,-current_version,%s)getjoinr   r   r   )sourcetargetenvfor_signaturer   validreasonr   r   r   %_applelib_currentVersionFromSoVersionR   s    

r%   c             C   s   | ddrdS | ddr&|d }n4| ddrVd|d ddd d	g }ndS |dkrfdS t|\}}|s~t|d
| S )a  
    A generator function to create the -Wl,-compatibility_version flag if needed.
    If env['APPLELINK_NO_COMPATIBILITY_VERSION'] contains a true value no flag will be generated
    Otherwise if APPLELINK_COMPATIBILITY_VERSION is not specified
    the first two parts of env['SHLIBVERSION'] will be used with a .0 appended.

    :param source:
    :param target:
    :param env:
    :param for_signature:
    :return: A string providing the flag to specify the compatibility_version of the shared library
    Z"APPLELINK_NO_COMPATIBILITY_VERSIONFr   ZAPPLELINK_COMPATIBILITY_VERSIONr   r   N   0z-Wl,-compatibility_version,%s)r   r   r   r   r   )r   r    r!   r"   r   r#   r$   r   r   r   $_applelib_compatVersionFromSoVersionq   s    
$r(   c             C   s4   d|kr,d|kr(t d|d |d f dS dS dS )z
    Override default _soname() function from SCons.Tools.linkCommon.SharedLibrary.
    Apple's file naming for versioned shared libraries puts the version string before
    the shared library suffix (.dylib), instead of after.
    ZSONAMEZ	SOVERSIONzzAmbiguous library .so naming, both SONAME: %s and SOVERSION: %s are defined. Only one can be defined for a target library.z$SONAMEz:$SHLIBPREFIX$_get_shlib_stem$_SHLIBSOVERSION${SHLIBSUFFIX}N)r   )r    r   r!   r"   r   r   r   _applelib_soname   s    r)   c             C   s   t |  d| d< d| d< d| d< | d d | d< td	| d
< | d d | d< t| d< t| d< d| d< d| d< d| d< d| d< td| d< d| d< d| d< d| d< d| d< t| d< dS ) zLAdd Builders and construction variables for applelink to an
    Environment.z-FZFRAMEWORKPATHPREFIXzB${_concat(FRAMEWORKPATHPREFIX, FRAMEWORKPATH, "", __env__, RDirs)}Z_FRAMEWORKPATHz2${_concat("-framework ", FRAMEWORKS, "", __env__)}Z_FRAMEWORKSZLINKCOMz. $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGSz$LINKFLAGS -dynamiclibZSHLINKFLAGSZ	SHLINKCOMZ_APPLELINK_CURRENT_VERSIONZ _APPLELINK_COMPATIBILITY_VERSIONz>$_APPLELINK_CURRENT_VERSION $_APPLELINK_COMPATIBILITY_VERSION Z_SHLIBVERSIONFLAGSZ_LDMODULEVERSIONFLAGSr   ZLDMODULEPREFIXZLDMODULESUFFIXz$LINKFLAGS -bundleZLDMODULEFLAGSzu$LDMODULE -o ${TARGET} $LDMODULEFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGSZLDMODULECOMz${_SHLIBVERSION}${SHLIBSUFFIX}Z_SHLIBSUFFIXzg${__lib_either_version_flag(__env__,"SHLIBVERSION","_APPLELINK_CURRENT_VERSION", "_SHLIBVERSIONFLAGS")}Z__SHLIBVERSIONFLAGSzm${__lib_either_version_flag(__env__,"LDMODULEVERSION","_APPLELINK_CURRENT_VERSION", "_LDMODULEVERSIONFLAGS")}Z__LDMODULEVERSIONFLAGSZ_SHLIBSONAMEN)r   generater   r%   r(   r)   )r!   r   r   r   r*      s&    
r*   c             C   s   | d dkS )NZPLATFORMdarwinr   )r!   r   r   r   exists   s    r,   N)__doc__Z
SCons.Utilr   ZSCons.Errorsr   r   r   r   	Exceptionr   r   r   r%   r(   r)   r*   r,   r   r   r   r   <module>	   s   '