B
    ›³ëbg8  ã               @   sP  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ejjZG dd„ dejjƒZG dd„ deƒZG dd„ deƒZej e¡ d	d
ddgZej d	d¡rÀe d¡ ejZdd„ Zeƒ Zdd„ Zdd„ ZG dd„ dƒZ e dƒZ!e dƒZ"dd„ Z#dd„ Z$dd„ Z%ej&j'e%dej(j)j*ej(j)j*ddZ+d d!„ Z,d"d#„ Z-dS )$z¿Tool-specific initialization for Qt.

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.
é    Nc               @   s   e Zd ZdS )ÚToolQtWarningN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú,lib/python3.7/site-packages/SCons/Tool/qt.pyr   ,   s   r   c               @   s   e Zd ZdS )ÚGeneratedMocFileNotIncludedN)r   r   r   r   r   r   r   r   /   s   r   c               @   s   e Zd ZdS )ÚQtdirNotFoundN)r   r   r   r   r   r   r   r	   2   s   r	   z.hz.hxxz.hppz.hhz.Hc           	   C   sN   d} t j d¡rJtddƒ}| ¡ }|d  ¡ d }W dQ R X |dkrJd} | S )aŒ  
    find non-standard QT paths

    If the platform does not put QT tools in standard search paths,
    the path is expected to be set using QTDIR. SCons violates
    the normal rule of not pulling from the user's environment
    in this case.  However, some test cases try to validate what
    happens when QTDIR is unset, so we need to try to make a guess.

    :return: a guess at a path
    Nz/etc/redhat-releaseÚrr   ZCentOSz/usr/lib64/qt-3.3/bin)ÚosÚpathÚisfileÚopenÚ	readlinesÚsplit)Z
qt_bin_dirZrrÚlinesZdistror   r   r   Úfind_platform_specific_qt_paths>   s    r   c             C   s\   | d }|d }t jj ||j¡}t j |||¡}||krXt j tdt|ƒt|ƒf ¡ d S )Nr   z/Generated moc file '%s' is not included by '%s')	ÚSConsZDefaultsZCScanr   ÚcwdÚWarningsÚwarnr   Ústr)ÚtargetÚsourceÚenvÚmocÚcppr   Úincludesr   r   r   ÚcheckMocIncluded]   s    r   c             C   s(   x"|D ]}|| |ƒ}|  ¡ r|S qW d S )N)Zrexists)ÚfilenameÚpathsÚnode_factoryÚdirÚnoder   r   r   Ú	find_filej   s
    

r$   c               @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú_Automoczj
    Callable class, which works as an emitter for Programs, SharedLibraries and
    StaticLibraries.
    c             C   s
   || _ d S )N)ÚobjBuilderName)Úselfr&   r   r   r   Ú__init__w   s    z_Automoc.__init__c             C   sL  yt | d¡ƒdkr||fS W n tk
r2   Y nX yt | d¡ƒ}W n tk
r^   d}Y nX tjj}t|| jƒ}t 	d¡}|j
}||_
|jj
}	||j_
|dd… }
xŒ|D ]‚}| ¡ sÒ|r®tdt|ƒ ƒ q®|jd }|t|ƒƒd tkr|r®tdt|ƒ ƒ q®|rtd	| ƒ | ¡ }d}xbtD ]Z}||jƒd | }t|| ¡ f|jƒ}|r,|rztd
t|ƒt|ƒf ƒ | ¡ }P q,W |s¦|r¦tdt|ƒ ƒ |rò| |¡rò| |¡}||ƒ}|
 |¡ |ròtdt|ƒt|ƒf ƒ |r®| |¡r®| |¡}| ||¡ |r®tdt|ƒt|ƒf ƒ q®W ||_
|	|j_
||
fS )z—
        Smart autoscan function. Gets the list of objects for the Program
        or Lib. Adds objects and builders for the special qt files.
        z$QT_AUTOSCANr   z	$QT_DEBUGz [^A-Za-z0-9]Q_OBJECT[^A-Za-z0-9]Nz0scons: qt: '%s' seems to be a binary. Discarded.é   z*scons: qt: '%s' is no cxx file. Discarded.z!scons: qt: Getting contents of %sz)scons: qt: Scanning '%s' (header of '%s')zscons: qt: no header for '%s'.z8scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s')ÚintÚsubstÚ
ValueErrorr   ÚUtilÚsplitextÚgetattrr&   ÚreÚcompiler   ÚMocZhas_builderÚprintr   ZsourcesÚcxx_suffixesÚget_text_contentsÚheader_extensionsÚnamer$   Úget_dirÚFileÚsearchÚappendÚIgnore)r'   r   r   r   Údebugr.   Z
objBuilderZq_object_searchZobjBuilderEnvZmocBuilderEnvZout_sourcesÚobjr   Zcpp_contentsÚhZh_extZhnameZ
h_contentsZmoc_cppZmoc_or   r   r   r   Ú__call__z   sn    






z_Automoc.__call__N)r   r   r   Ú__doc__r(   r@   r   r   r   r   r%   q   s   r%   ZSharedObjectZStaticObjectc             C   sz   |   dd¡}|stj  dd¡}|sv|  d¡p6|  dt¡}|rdtj tj |¡¡}tj 	t
d| ¡ nd}tj 	t
d¡ |S )z9Not really safe, but fast method to detect the QT libraryÚQTDIRNr   z>Could not detect qt, using moc executable as a hint (QTDIR=%s)z&Could not detect qt, using empty QTDIR)Úgetr   ÚenvironZWhereIsÚ
QT_BIN_DIRr   Údirnamer   r   r   r	   )r   rB   r   r   r   r   Ú_detectÕ   s    rG   c             C   s˜   t jj}t j t|d jƒ¡d }tj t| d  	¡ ƒ|¡}t
| ƒdk rf|  ||| d¡| d¡ƒ¡ t
| ƒdk r|  ||| d¡| d¡ƒ¡ | |fS )Nr   é   z$QT_UICIMPLPREFIXz$QT_UICIMPLSUFFIXé   z$QT_MOCHPREFIXz$QT_MOCHSUFFIX)r   r-   Ú
adjustixesr.   r   r7   r   r   Újoinr8   Úlenr;   r+   )r   r   r   rJ   Zbsr   r   r   Ú
uicEmitteré   s    rM   c             C   sf   g }|  |d ¡ | t|  ¡ jƒ¡ t d|  ¡ ¡}g }x&|D ]}| ||¡}|r@| |¡ q@W |S )NÚCPPPATHz<include.*?>(.*?)</include>)	Úextendr;   r   Zrfiler"   r0   Úfindallr5   ZFindFile)r#   r   r   Zlookoutr   ÚresultZincFileZdepr   r   r   ÚuicScannerFuncú   s    
rR   Z
UicScanner)r7   Z
node_classr!   Ú	recursivec             C   sÖ  t jj}t jj}t jj}t j t jjd¡ | jt	| ƒt
j dd¡t
j dd¡t
j dd¡t
j dd¡t
j dd¡d	d
|dƒ|dƒ|dƒ|dƒddddddddd|dƒ|dƒ|dƒgd|dƒ|tdƒgd |t j dd¡tdddtd}|i i i d }x:tD ]2}t j d!d"¡}| ||¡ d#|j|< d$|j|< qüW x<tD ]4}t j d%d&¡}| ||¡ d'|j|< d(|j|< q8W || d) d*< || d) d+< t j | ¡\}	}
|	 d*¡ |
 d*¡ | jtgtgtgtgd,gd-gd.gd/ dS )0zAAdd Builders and construction variables for qt to an Environment.z*Tool module for Qt version 3 is deprecatedz$QTDIRÚbinZincludeÚlibz$QT_BINPATHr   ZuicZqtr)   Ú z-iz.hZuic_z$CXXFILESUFFIXZmoc_z.mocz.uiz1$QT_UIC $QT_UICDECLFLAGS -o ${TARGETS[0]} $SOURCEzJ$QT_UIC $QT_UICIMPLFLAGS -impl ${TARGETS[0].file} -o ${TARGETS[1]} $SOURCEz8$QT_MOC $QT_MOCFROMHFLAGS -o ${TARGETS[2]} ${TARGETS[0]}z2$QT_MOC $QT_MOCFROMHFLAGS -o ${TARGETS[0]} $SOURCEz4$QT_MOC $QT_MOCFROMCXXFLAGS -o ${TARGETS[0]} $SOURCEN)rB   Z
QT_BINPATHZ
QT_CPPPATHZ
QT_LIBPATHZQT_MOCZQT_UICZQT_LIBZQT_AUTOSCANZQT_UICIMPLFLAGSZQT_UICDECLFLAGSZQT_MOCFROMHFLAGSZQT_MOCFROMCXXFLAGSZQT_UICDECLPREFIXZQT_UICDECLSUFFIXZQT_UICIMPLPREFIXZQT_UICIMPLSUFFIXZQT_MOCHPREFIXZQT_MOCHSUFFIXZQT_MOCCXXPREFIXZQT_MOCCXXSUFFIXZQT_UISUFFIXZ	QT_UICCOMZQT_MOCFROMHCOMZQT_MOCFROMCXXCOMz
$QT_UICCOMz$QT_UICCOMSTRz$QT_UISUFFIXz$QT_UICDECLSUFFIXz$QT_UICDECLPREFIX)ÚactionZemitterZ
src_suffixÚsuffixÚprefixZsource_scanner)rW   rY   rX   z$QT_MOCFROMHCOMz$QT_MOCFROMHCOMSTRz$QT_MOCHPREFIXz$QT_MOCHSUFFIXz$QT_MOCFROMCXXCOMz$QT_MOCFROMCXXCOMSTRz$QT_MOCCXXPREFIXz$QT_MOCCXXSUFFIXZBUILDERSZUicr2   z$QT_CPPPATHz$QT_LIBPATHz$QT_LIB)ZPROGEMITTERZSHLIBEMITTERZLDMODULEEMITTERZ
LIBEMITTERrN   ZLIBPATHZLIBS)r   r-   ÚCLVarÚActionÚBuilderr   r   ZToolQtDeprecatedWarningZ
SetDefaultrG   r   r   rK   r   rM   Ú
uicScannerr6   Z
add_actionrY   rX   r4   ÚToolZcreateObjBuildersZadd_src_builderZAppendUniqueÚAutomocStaticÚAutomocShared)r   rZ   r[   r\   ZuicBldZmocBldr?   ZactÚcxxZ
static_objZ
shared_objr   r   r   Úgenerate  sz    






rb   c             C   s   t | ƒS )N)rG   )r   r   r   r   Úexistsl  s    rc   ).rA   Úos.pathr   r0   ZSCons.Actionr   ZSCons.BuilderZSCons.DefaultsZSCons.ScannerZ
SCons.ToolZ
SCons.UtilZSCons.Tool.cxxZSCons.Warningsr^   ra   Z	cplusplusr   ZSConsWarningr   r   r	   ZenableWarningClassr6   r-   Zcase_sensitive_suffixesr;   ZCXXSuffixesr4   r   rE   r   r$   r%   r`   r_   rG   rM   rR   ÚScannerZScannerBaseZNodeZFSr9   r]   rb   rc   r   r   r   r   Ú<module>   sH   
a`