
Yc                 @   s>  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 m Z d d l m	 Z	 d d l	 m
 Z
 d d l m Z d d l m Z m Z d d	 l m Z m Z m Z m Z Gd
 d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z d S)    N   )mlog)mesonlib)
Popen_safe)detect_cpu_family   )DependencyExceptionDependencyMethods)ExternalDependencyExternalProgramExtraFrameworkDependencyPkgConfigDependencyc                   s   e  Z d  Z i d d 6Z   f 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 d   Z d d   Z d d   Z d d   Z   S)BoostDependencyZunit_test_frameworktestc                sg  t    j d | d |  d  |  _ y8 t j d |  _ t j j |  j  sY t d   n  Wn t	 k
 rw d  |  _ Yn X|  j d  k r;|  j
 r d t j k r t j d |  _ q t d   n  t j   r |  j   |  _ |  j |  _ qVd t j k rt j d |  _ n	 d |  _ d t j k rVt j d |  _ qVn t j j |  j d	  |  _ t j j |  j d  |  _ t j d
 |  j  i  |  _ i  |  _ i  |  _ |  j   |  j |  |  _ d j |  j  } |  j rF|  j   |  j   |  j   |  j d  k	 r|  j d |  j } n	 |  j } t j d | t j d  |  n t j d | t j  d   d  S)NboostcppZ
BOOST_ROOTz$BOOST_ROOT must be an absolute path.ZBOOST_INCLUDEDIRz>BOOST_ROOT or BOOST_INCLUDEDIR is needed while cross-compilingz/usr/includeZBOOST_LIBRARYDIRincludezBoost library root dir isz, zDependency Boost (%s) found:YESNO)!super__init__libdirosenviron
boost_rootpathisabsr   KeyError
want_crossincdirr   
is_windowsdetect_win_rootjoinboost_inc_subdirr   debugsrc_moduleslib_moduleslib_modules_mtdetect_versionget_requestedrequested_modulesis_founddetect_src_modulesdetect_lib_modulesvalidate_requestedversionloggreenred)selfenvironmentkwargsZ
module_strinfo)	__class__ X/mnt/raid6/a/bak/reczko/tools/protein/utils/meson-0.42.1/mesonbuild/dependencies/misc.pyr   (   sN    						
	


	#zBoostDependency.__init__c             C   s3   d } t  j  |  } t |  d k r/ | d Sd S)Nzc:\local\boost_*r   zC:\)globlen)r3   Zglobtextfilesr8   r8   r9   r!   X   s
    zBoostDependency.detect_win_rootc             C   s   g  } |  j  d  k	 rH t j   r- |  j  } qQ t j j |  j  d  } n	 |  j } | j d  s | j d j |  j	 j
 | d    n  | S)Nr   /usr/include/usr/local/include T)r=   r>   )r   r   r    r   r   r"   r   endswithappendcompilerget_include_args)r3   argsZinclude_dirr8   r8   r9   get_compile_args_   s    	(z BoostDependency.get_compile_argsc             C   s`   | j  d g   } t | t  s- | g } n  x, | D]$ } t | t  s4 t d   q4 q4 W| S)Nmodulesz&Boost module argument is not a string.)get
isinstanceliststrr   )r3   r5   Z
candidatescr8   r8   r9   r)      s    zBoostDependency.get_requestedc             C   sg   x` |  j  D]U } | |  j k r
 | |  j k r
 | d |  j k r
 d } t | j |    q
 q
 Wd  S)Nz-mtz%Requested Boost module {!r} not found)r*   r%   r&   r'   r   format)r3   mmsgr8   r8   r9   r.      s    1z"BoostDependency.validate_requestedc             C   s   y" t  t j j |  j d   } Wn t k
 r: d  SYn X| s xk | D]c } | j d  rI d | k rI | j   d } | d d	  } | j d d  |  _	 d |  _
 d  SqI WWd  QXd  S)
Nzversion.hppz#defineZBOOST_LIB_VERSIONr   _.TrQ   )openr   r   r"   r#   FileNotFoundError
startswithsplitreplacer/   r+   )r3   Zifilelineverr8   r8   r9   r(      s    "		zBoostDependency.detect_versionc             C   st   xm t  j |  j  D]Y } t  j j |  j |  } t j t  j |  j  r d |  j t  j j	 |  d <q q Wd  S)NTr   rQ   )
r   listdirr#   r   r"   statS_ISDIRst_moder%   rU   )r3   entryr8   r8   r9   r,      s    z"BoostDependency.detect_src_modulesc             C   s    t  j   r |  j   S|  j   S)N)r   r    detect_lib_modules_windetect_lib_modules_nix)r3   r8   r8   r9   r-      s    
z"BoostDependency.detect_lib_modulesc       
      C   s1  t  |  j j j  } | d k r* d } n | d k r? d } n d  } | ro t j t j j |  j |   } n g  } | s d  S| d } |  j	 r | |  _	 n  |  j
 r d n d } xw t j t j j | |   D]W } t j j |  \ } } | j d d	  d	 } | j d
 d	  d }	 | |  j |	 <q Wd  S)Nx86zlib32*x86_64zlib64*r   zlibboost_*-gd-*.libzboost_*-gd-*.librO   r   -)r   envcoredata	compilersr:   r   r   r"   r   r   staticrU   r'   )
r3   archglr   globberr]   rO   fnamebasemodnamer8   r8   r9   r^      s(    		$
	%z&BoostDependency.detect_lib_modules_winc             C   s?  |  j  r d } n% t j   r1 |  j r1 d } n d } d j |  } |  j r^ |  j g } n9 |  j d  k r| t j   } n t j	 j
 |  j d  g } x | D] } x t j t j	 j
 | |   D]p } t j	 j |  } | j d  d j d d	  d } | j d
 j |   r&d |  j | <q d |  j | <q Wq Wd  S)Nadylibsozlibboost_*.{}librP   r   rO   r   z-mt.{}TrQ   )rf   r   is_osxr   rL   r   r   get_library_dirsr   r   r"   r:   basenamerU   r@   r'   r&   )r3   Z	libsuffixri   Zlibdirsr   r]   rp   namer8   r8   r9   r_      s$    				%#z&BoostDependency.detect_lib_modules_nixc             C   sy   g  } |  j  r& | j d |  j  n  xL |  j D]A } t j j | |  } | |  j k r0 | j |  j |  q0 q0 W| S)Nz-L)r   rA   r   r*   r   name2librG   r'   )r3   rD   moduler8   r8   r9   get_win_link_args   s    	z!BoostDependency.get_win_link_argsc             C   s  t  j   r |  j   Sg  } |  j rK | j d t j j |  j d   n  |  j rk | j d |  j  n  xE|  j	 D]:} t
 j j | |  } d | } |  j j | |  j g   } | d  k	 r| d k r |  j j d  } n d  } | | 7} | d  k	 r| | 7} qqu | |  j k s,| |  j k rbd | } | j |  | d k r| j d  qqu | d |  j k ru d	 | d } | j |  | d k r| j d
  qqu qu W| S)Nz-Lrp   Zboost_Zunit_testing_frameworkZboost_test_exec_monitorz-lz-lboost_test_exec_monitorz-mtz-lboost_z-lboost_test_exec_monitor-mt)r   r    rw   r   rA   r   r   r"   r   r*   r   ru   rG   rB   find_libraryrc   r&   r'   )r3   rD   rv   libnameZdefault_detectZ	emon_argsZlinkcmdr8   r8   r9   get_link_args   s:    
	&	


zBoostDependency.get_link_argsc             C   s   g  S)Nr8   )r3   r8   r8   r9   get_sources  s    zBoostDependency.get_sourcesc             C   s   d |  j  k S)Nthread)r*   )r3   r8   r8   r9   need_threads  s    zBoostDependency.need_threads)__name__
__module____qualname__ru   r   r!   rE   r)   r.   r(   r,   r-   r^   r_   rw   rz   r{   r}   r8   r8   )r7   r9   r   "   s   0'	%r   c                   s^   e  Z d  Z   f d d   Z d d   Z d d   Z d d   Z d	 d
   Z d d   Z   S)MPIDependencyc                s  | j  d d  } t   j d | | |  | j d d  } d | d <d | d <d |  _ | d k r d g } d	 g } d
 g } n{ | d k r d g } d g } d d d g } nK | d k r d d d g } d g } d d d g } n t d j |    x | D]w } y\ t | | |  }	 |	 j   rg|	 j	   |  _
 |	 j   |  _ |	 j   |  _ d |  _ Pn  Wqt k
 r|YqXqW|  j sx7 | D]) }
 |
 t j k rt j |
 g } PqqW| } x | D] } |  j |  } | d  k	 r2d |  _ | d |  _ |  j | d  |  _
 |  j | d  |  _ Pn  |  j |  } | d  k	 rd |  _ | d |  _ |  j | d  |  _
 |  j | d  |  _ PqqWn  |  j rt j   r|  j   } | d  k	 rd |  _ | \ |  _ |  _
 |  _ qn  |  j r5t j d t j |  j  d |  j d t j d   |  j  nU t j d t j |  j  d |  j d t j d!   | rt d" j |  j    n  d  S)#NlanguagerK   mpirequiredTFsilentZMPICCzompi-cZmpiccr   ZMPICXXzompi-cxxzmpic++ZmpicxxZmpiCCfortranZMPIFCZMPIF90ZMPIF77z	ompi-fortZmpifortZmpif90Zmpif77z&Language {} is not supported with MPI.r   r   r   
Dependencyforzfound:r   r   zMPI dependency {!r} not found) rG   r   r   popr+   r   rL   r   foundrE   compile_argsrz   	link_argsget_versionr/   	Exceptionr   r   _try_openmpi_wrapper_filter_compile_args_filter_link_args_try_other_wrapperr   r    
_try_msmpir   r0   boldrt   r   r1   r2   )r3   r4   r5   r   r   Zenv_varsZpkgconfig_filesZdefault_wrapperspkgpkgdepvarZwrappersprogresult)r7   r8   r9   r     sz    

													=4zMPIDependency.__init__c             C   s   g  } d } |  j  d k rA |  j j j d } | | j   7} n  d } x | D] } | j d |  s | d k s | j d  r | d k r | j d	  r | j |  | | k r d
 } q qN | rN d } | j |  qN qN W| S)zr
        MPI wrappers return a bunch of garbage args.
        Drop -O2 and everything that is not needed.
        -Ir   F-D-fz-pthreadz-Wz-Wallz-WerrorT)r   )r   r   )r   rc   rd   re   get_module_incdir_argsrT   rA   )r3   rD   r   Z
multi_argsZfcinclude_nextfr8   r8   r9   r   h  s     +z"MPIDependency._filter_compile_argsc             C   s   g  } d } x | D] } | j  d
  s_ | d k s_ | j  d  r | d k r | j  d  r | j |  | d k r d	 } q q | r d } | j |  q q W| S)zr
        MPI wrappers return a bunch of garbage args.
        Drop -O2 and everything that is not needed.
        F-L-l-Xlinkerz-pthreadz-Wz-Wallz-WerrorT)r   r   r   )r   r   )rT   rA   )r3   rD   r   r   r   r8   r8   r9   r     s    +zMPIDependency._filter_link_argsc       	      C   s?  t  | d d } | j   r;| j   d g } t j |  \ } } } | j   | j d k r t j d t j	 |  d  t j t j	 d  |  t j t j	 d  |  d  St
 j |  } | j   d	 g } t j |  \ } } } | j   | j d k rYt j d t j	 |  d  t j t j	 d  |  t j t j	 d  |  d  St
 j |  } | j   d
 g } t j |  \ } } } | j   | j d k rt j d t j	 |  d  t j t j	 d  |  t j t j	 d  |  d  St j d |  } | r(| j d  } n d } | | | f Sd  S)Nr   Tz--showme:compiler   Commandzfailed to run:zStandard output
zStandard error
z--showme:linkz--showme:versionz\d+.\d+.\d+none)r   r   get_commandr   r   wait
returncoder   r$   r   shlexrU   researchgroup)	r3   r   cmdpoecargslibsr/   r8   r8   r9   r     sB    


z"MPIDependency._try_openmpi_wrapperc             C   s   t  | d d } | j   r | j   d g } t j |  \ } } } | j   | j d k r t j d t j	 |  d  t j t j	 d  |  t j t j	 d  |  d  St
 j |  } d	 } | | | f Sd  S)
Nr   Tz-showr   r   zfailed to run:zStandard output
zStandard error
r   )r   r   r   r   r   r   r   r   r$   r   r   rU   )r3   r   r   r   r   r   rD   r/   r8   r8   r9   r     s    
z MPIDependency._try_other_wrapperc             C   sS  |  j  d k r d  Sd t j k r& d  St j d } t |  j j j  } | d k r} d t j k rg d  St j d } d } n9 | d k r d t j k r d  St j d } d } n d  S|  j  d k rd	 d
 | d
 t j j | |  g t j j | d  t j j | d  g f Sd	 d
 | d
 t j j | |  g t j j | d  g f Sd  S)Nr   Z	MSMPI_INCr`   ZMSMPI_LIB32ra   ZMSMPI_LIB64x64r   r   z-Iz	msmpi.libzmsmpifec.lib)	r   r   r   r   rc   rd   re   r   r"   )r3   r   rg   r   postr8   r8   r9   r     s0    		 + zMPIDependency._try_msmpi)	r~   r   r   r   r   r   r   r   r   r8   r8   )r7   r9   r     s   K'r   c                   s:   e  Z d  Z   f d d   Z d d   Z d d   Z   S)ThreadDependencyc                sZ   t    j d | d  i   d |  _ d |  _ t j d t j |  j  d t j d   d  S)NthreadsTr   zfound:r   )r   r   rt   r+   r   r0   r   r1   )r3   r4   r5   )r7   r8   r9   r     s    		zThreadDependency.__init__c             C   s   d S)NTr8   )r3   r8   r8   r9   r}     s    zThreadDependency.need_threadsc             C   s   d S)Nunknownr8   )r3   r8   r8   r9   r     s    zThreadDependency.get_version)r~   r   r   r   r}   r   r8   r8   )r7   r9   r     s   r   c                   s:   e  Z d  Z   f d d   Z d d   Z d d   Z   S)Python3Dependencyc                s  t    j d | d  |  d |  _ d |  _ t j |  j k r y\ t d | |  } | j   r | j	   |  _
 | j   |  _ | j   |  _ d |  _ d  SWq t k
 r Yq Xn  |  j sct j   r t j |  j k r |  j |  qct j   rct j |  j k rct d d d  |  j |  j |  } | j   r`| j	   |  _
 | j   |  _ d |  _ q`qcn  |  j rt j d t j |  j  d t j d   n+ t j d t j |  j  d t j d	   d  S)
Npython33TpythonFr   zfound:r   r   )r   r   rt   r/   r	   	PKGCONFIGmethodsr   r   rE   r   rz   r   r   r+   r   r   r    	SYSCONFIG_find_libpy3_windowsrq   EXTRAFRAMEWORKr   rc   r   r   r0   r   r1   r2   )r3   r4   r5   r   Zfw)r7   r8   r9   r     s6    					.zPython3Dependency.__init__c             C   s  t  j   } t | j j  } | d k r3 d } nG | d k rH d } n2 t j d j |  t j |  j	   d |  _
 d S| | d d  k r t j d	 t j |  j	  d
 j | | d d    d |  _
 d St  j d  } t  j d  } d | g |  _ | | k r#|  j j d |  n  t  j d  } t  j d  } d j |  d j |  g |  _ t  j d  |  _ d |  _
 d S)z{
        Find python3 libraries on Windows and also verify that the arch matches
        what we are building for.
        r`   Z32ra   Z64zUnknown architecture {!r} forFNr   ZNeedzfor {}-bit, but found {}-bitr   platincludez-Irk   py_version_nodotz	-L{}/libsz
-lpython{}py_version_shortTr   )	sysconfigget_platformr   rd   re   r   r0   rL   r   rt   r+   get_pathr   rA   get_config_varr   r/   )r3   rc   Zpyarchrg   ZincZplatincZbasedirZvernumr8   r8   r9   r     s4    				z&Python3Dependency._find_libpy3_windowsc             C   sF   t  j   r t j t j g St  j   r8 t j t j g St j g Sd  S)N)r   r    r	   r   r   rq   r   )r3   r8   r8   r9   get_methods<  s
    zPython3Dependency.get_methods)r~   r   r   r   r   r   r8   r8   )r7   r9   r     s   !$r   c                   s.   e  Z d  Z   f d d   Z d d   Z   S)PcapDependencyc                s^  t    j d | d  |  t j |  j k r yo d | d <t d | |  } | j   r d |  _ d |  _ | j	   |  _
 | j   |  _ | j   |  _ d  SWq t k
 r } z t j d t |   WYd  d  } ~ Xq Xn  t j |  j k rt j d  } | rt d d g  d	 } | j   j   |  _
 t d d
 g  d	 } | j   j   |  _ d |  _ d |  _ t j d t j d  d t j d  d |  d  St j d  n  t j |  j k rZt j   r/t d d d  |  j  |  j! |  } | j   r/d |  _ | j	   |  _
 | j   |  _ d |  _ d  Sn  t j d t j d  d t j" d   n  d  S)NpcapFr   	pkgconfigTz5Pcap not found via pkgconfig. Trying next, error was:zpcap-configz--cflagsr   z--libs0r   zfound:r   z(%s)z/Could not find pcap-config binary, trying next.2r   )#r   r   r	   r   r   r   r   	type_namer+   rE   r   rz   r   r   r/   r   r   r$   rJ   
PCAPCONFIGshutilwhichr   striprU   r0   r   r1   r   r   rq   r   rc   r   r2   )r3   r4   r5   Zpcdepr   Zpcapconfstdofwdep)r7   r8   r9   r   E  sL    
		,				zPcapDependency.__init__c             C   s6   t  j   r" t j t j t j g St j t j g Sd  S)N)r   rq   r	   r   r   r   )r3   r8   r8   r9   r   m  s    zPcapDependency.get_methods)r~   r   r   r   r   r8   r8   )r7   r9   r   D  s   (r   )r:   r   r   r   rZ   r   r   r?   r   r   r   r4   r   rk   r   r	   r
   r   r   r   r   r   r   r   r   r8   r8   r8   r9   <module>   s"   "N