
     hi6                     f   d 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 ddlmZ  ej$                  e      Zd	 Zd
efdZ ej.                  dej0                  z   dz   ej2                  z   dz   ej0                  z   dz   ej4                  z   dz         Zd
efdZd Zdad Zy)z?
Utility functions related to analyzing/bundling dependencies.
    N)CodeType)compat)log)bytecode)include_library)ExecCommandFailedc                 b   t        |       }t        |      }t        |      D ]n  }|s|j                  |       |t        j
                  j                  |      k7  s:	 | j                  }t        j                  d||       |j                  |       p t        |      }|S # t        $ r d}Y Dw xY w)NUNKNOWNzPIgnoring %s imported from %s - only basenames are supported with ctypes imports!)*__recursively_scan_code_objects_for_ctypessetlistremoveospathbasenameco_filename	Exceptionloggerwarning_resolveCtypesImports)cobinariesbinaryfilenames       DC:\des-py\Monitor\venv\Lib\site-packages\PyInstaller/depend/utils.pyscan_code_for_ctypesr      s    9"=H 8}Hx. $ OOF#rww''//%>> NNbdjlt OOF#!$$ %X.HO  %$%s   B  B.-B.codec                    ddl m}m} g }h  |d       |d       |d       |d       |d       |d       |d	       |d
      }h  |d      }t        j                  |       j                         D ]  }|D ]  \  }}t        |      dk(  rt        |d   t              s(||v r |j                  |  <||v sA|d   }	|	sI	 t        j                  j                  |	      }	|	slt         j"                  j%                  |	      }	|j                  |	          |t&        |       j                         D ]  }
|j)                  |
        |S # t        $ r d}	t        j                  d|d          Y w xY w)z
    Detects ctypes dependencies, using reasonable heuristics that should cover most common ctypes usages; returns a
    list containing names of binaries detected as dependencies.
    r   )	any_aliassearch_recursivelyzctypes.CDLLzctypes.cdll.LoadLibraryzctypes.WinDLLzctypes.windll.LoadLibraryzctypes.OleDLLzctypes.oledll.LoadLibraryzctypes.PyDLLzctypes.pydll.LoadLibraryzctypes.util.find_library   Nzqctypes.util.find_library raised a FileNotFoundError. Supressing and assuming no lib with the name "%s" was found.)PyInstaller.depend.bytecoder   r    r   recursive_function_callsvalueslen
isinstancestrappendctypesutilfind_libraryFileNotFoundErrorr   r   r   r   r   _scan_code_for_ctypes_getattrextend)r   r   r    r   ctypes_dll_namesfind_library_namescallsnameargslibnameis              r   r   r   :   s   
 JH		=	!		,	-	 
?	#	 
.	/		
 
?	#	 
.	/	 
>	"	 
-	.		-	. 2248??A 1! 	1LT4t9>DGS)A''&++ q'"(++":":7"C "$''"2"27"; 0/	118   =tDKKM  O! - "&[\`ab\cs   	E$E98E9sV   
    # Matches 'foo.bar' or 'foo.bar.whizz'.

    # Load the 'foo'.
    (
      (?:(?:s   ).)*
      (?:s   ).
    )

    # Load the 'bar.whizz' (one opcode per name component, each possibly preceded by name reference extension).
    (
      (?:
        (?:(?:s   ).)*
        (?:s   ).
      )+
    )
c              #   |  K   d}t        j                  t        | j                        D ]  }|j	                         \  }}t        j
                  ||       }t        j                  ||       }|r	|d   dk(  rMt        |      dk(  r||v r
|d   dz    t        |      dk(  sx|dk(  s~|d   |v s|d   dz     y	w)
zs
    Detect uses of ``ctypes.cdll.library_name``, which implies that ``library_name.dll`` should be collected.
    )cdlloledllpydllwindllLoadLibraryr!   r   .dll   r)   N)r   finditer_ctypes_getattr_regexco_codegroupsloadloadsr%   )r   	key_namesmatchr2   attrss        r   r-   r-      s     
 6I""#8$,,G (llne}}T4(ud+U2Y-/ u:?y Ah''u:?xE!H	$9Ah''(s   BB<!B<'B</B<c                 B  	
 ddl m} ddlm	 t        j
                  rd
nt        j                  rd
nd
	
fd}
fd}g } |       }| D ]  }	  |t        j                  j                  |      d         }t        j
                  st        j                  r||}t	        j                  
d
      j                  t        j                        D ]a  }t        j                  j                  t        j                  j!                  ||            sAt        j                  j!                  ||      } nE t"        
t%                |t"        v r*t"        |   }t        j                  j                  |      sJ d	}|ft'        |      s;t        j(                  s1t        j                  s!|j+                         j-                  d      r|t.        j1                  d|       t'        |      s|j3                  ||df         ||       |S # t        $ r d	}Y w xY w)a  
    Completes ctypes BINARY entries for modules with their full path.

    Input is a list of c-binary-names (as found by `scan_code_instruction_for_ctypes`). Output is a list of tuples
    ready to be appended to the ``binaries`` of a modules.

    This function temporarily extents PATH, LD_LIBRARY_PATH or DYLD_LIBRARY_PATH (depending on the platform) by
    CONF['pathex'] so shared libs will be search there, too.

    Example:
    >>> _resolveCtypesImports(['libgs.so'])
    [(libgs.so', ''/usr/lib/libgs.so', 'BINARY')]
    r   )r+   )CONFLD_LIBRARY_PATHDYLD_LIBRARY_PATHPATHc                      t         j                  j                  d         } t        j                        }|!t         j                  j                  | |f      } t        j
                  |        |S )Npathex)r   pathsepjoinr   getenvsetenv)r   oldrI   envvars     r   	_setPathsz(_resolveCtypesImports.<locals>._setPaths   sU    zztH~.mmF#?::??D#;/Dfd#
    c                 b    | t        j                         y t        j                  |        y )N)r   unsetenvrR   )rS   rT   s    r   _restorePathsz,_resolveCtypesImports.<locals>._restorePaths   s"    ;OOF#MM&#&rV   N r=   z(Library %s required via ctypes not foundBINARY)ctypes.utilr+   PyInstaller.configrI   r   is_unix	is_darwinr   r   splitextr,   	is_cygwinrQ   splitrO   isfilerP   LDCONFIG_CACHEload_ldconfig_cacher   is_winlowerendswithr   r   r(   )	cbinariesr+   rU   rY   retrS   cbincpathdrI   rT   s            @@r   r   r      s    )'~~"			$' C +C )0	 !!1!1$!7!:;E >>V-- }]]62.44RZZ@ !77>>"'',,q%"89GGLLE2E!
 ")')N**51E77>>%000 E= #4( MM&*:*:

@U@UV\@]NNEtL"5)JJeX./S)0T #JM ! 	E	s   (HHHc                  H   t         yt        j                  ri a yt        j                  ri a yt	        j
                  d      } | t	        j
                  dd      } | i a yt        j                  st        j                  rd}d}t        j                  d      }nd}d	}t        j                  d
      }	 t        j                  | |      }|j                         j                         |d }i a |D ]	  }|j!                  |      }|.t        j"                  d|      rnt        j                  d|       E|j%                         d   }t        j                  st        j                  rnt&        j(                  j+                  |      j-                  dd	      d   }d|j/                  d	      z   }	|	j1                  |      sJ |dz   |	t3        |      d z   }	n|j/                  d	      }	|	t         vs|t         |	<    y# t        $ r t        j                  d       i a Y yw xY w)z
    Create a cache of the `ldconfig`-output to call it only once.
    It contains thousands of libraries and running it on every dylib is expensive.
    Nldconfigz/usr/sbin:/sbin:/usr/bin:/bin)r   z-rr>   z^\s+\d+:-l(\S+)(\s.*)? => (\S+)z-pr!   z^\s+(\S+)(\s.*)? => (\S+)z/Failed to execute ldconfig. Disabling LD cache.zCache generated by:z,Unrecognised line of output %r from ldconfigr;   z.sor   lib)rd   r   ra   is_muslshutilwhich
is_freebsd
is_openbsdrecompileexec_commandr   r   r   strip
splitlinesrF   searchrB   r   r   r   rb   group
startswithr%   )
ro   ldconfig_argsplitlines_countpatterntextlinemr   bnamer2   s
             r   re   re      s    !~~ ||J'H <<
1PQ NF-- **?@ **9:""8\: ::<""$%5%67DN (MM$ 9yy.5MtTxxz"~ 1 1 GG$$T*00:1=E1771:%D??5)))5=4E
#44D771:D ~%#'N4 7(  HIs   5G> > H! H!) __doc__r\   r)   r   rv   rr   typesr   PyInstallerr   r   loggingPyInstaller.dependr   PyInstaller.depend.dylibr   PyInstaller.exceptionsr   	getLogger__name__r   r   r   bytecode_regex_OPCODES_EXTENDED_ARG_OPCODES_FUNCTION_GLOBAL_OPCODES_FUNCTION_LOADr@   r-   r   rd   re    rV   r   <module>r      s     	 	    & ' 4 4			8	$85X 5p 0//
 001
4 0014 2236 0014 *( (4Wt Z(rV   