
    i6                     j   S r SSKrSSKrSSKrSSKrSSKJr  SSKJ	r	  SSKJ
r  SSKJr  SSKJr  SSKJr  \R$                  " \5      rS	 rS
\4S jr\R.                  " S\R0                  -   S-   \R2                  -   S-   \R0                  -   S-   \R4                  -   S-   5      rS
\4S jrS rSqS rg)z?
Utility functions related to analyzing/bundling dependencies.
    N)CodeType)compat)log)bytecode)include_library)ExecCommandFailedc                 v   [        U 5      n[        U5      n[        U5       Hv  nU(       d  UR                  U5        M  U[        R
                  R                  U5      :w  d  MB   U R                  n[        R                  SX#5        UR                  U5        Mx     [        U5      nU$ ! [         a    Sn NFf = f)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       EC:\des-py\RoboSAPF\venv\Lib\site-packages\PyInstaller\depend\utils.pyscan_code_for_ctypesr      s    9"=H 8}Hx. OOF#rww''//%>> NNbdj OOF#! !$ %X.HO  %$%s   %B))B87B8codec                 4   SSK JnJn  / n1 U" S5      kU" S5      kU" S5      kU" S5      kU" S5      kU" S5      kU" S	5      kU" S
5      kn1 U" S5      kn[        R                  " U 5      R                  5        H  nU H  u  px[        U5      S:X  a  [        US   [        5      (       d  M.  Xt;   a  UR                  " U6   MD  Xu;   d  MK  US   n	U	(       d  MY   [        R                  R                  U	5      n	U	(       d  M  [         R"                  R%                  U	5      n	UR                  U	5        M     M     U" [&        U 5      R                  5        H  n
UR)                  U
5        M     U$ ! [         a    Sn	[        R                  SUS   5         Nf = f)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!LTt9>DGS)A)A'&+ q'7"(++":":7"C w"$''"2"27"; 0/ " B8   =tDKKM N O! - "&[\`ab\cs   E//%FF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              #     #    Sn[         R                  " [        U R                  5       H  nUR	                  5       u  p4[         R
                  " X05      n[         R                  " X@5      nU(       a  US   S:X  a  MS  [        U5      S:X  a  X1;   a
  US   S-   v   [        U5      S:X  d  M  US:X  d  M  US   U;   d  M  US   S-   v   M     g	7f)
zk
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}}T(u+U2Y-/ u:? Ah''u:?xE!H	$9Ah'' Hs   B&C,C4C?Cc                   ^	^
 SSK Jn  SSKJm	  [        R
                  (       a  Sm
O[        R                  (       a  Sm
OSm
U	U
4S jnU
4S jn/ nU" 5       nU  GH  n U" [        R                  R                  U5      S   5      n[        R
                  (       d  [        R                  (       a  Uc  Un[        R                  " T
S
5      R                  [        R                  5       He  n[        R                  R                  [        R                  R!                  X5      5      (       d  MF  [        R                  R!                  X5      n  OO   ["        c
  [%        5         U["        ;   a0  ["        U   n[        R                  R                  U5      (       d   eOS	nUc}  ['        U5      (       d  GM\  [        R(                  (       d<  [        R                  (       d'  UR+                  5       R-                  S5      (       a  GM  [.        R1                  SU5        GM  ['        U5      (       d  GM  UR3                  XgS45        GM     U" U5        U$ ! [         a    S	n GNf = f)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                     > [         R                  R                  TS   5      n [        R                  " T5      nUb   [         R                  R                  X45      n [        R
                  " TU 5        U$ )Npathex)r   pathsepjoinr   getenvsetenv)r   oldrI   envvars     r   	_setPaths(_resolveCtypesImports.<locals>._setPaths   sS    zztH~.mmF#?::??D;/Dfd#
    c                 h   > U c  [         R                  " T5        g [         R                  " TU 5        g )N)r   unsetenvrR   )rS   rT   s    r   _restorePaths,_resolveCtypesImports.<locals>._restorePaths   s"    ;OOF#MM&#&rW   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   rZ   retrS   cbincpathdrI   rT   s            @@r   r   r      s    )'~~"			$' C +C	 !!1!1$!7!:;E >>V-- }]]62.44RZZ@77>>"'',,q"899GGLL2E A
 ")')N**51E77>>%0000 E= #4(( MM&*:*:

@U@UV\@]@]NNEtL"5))JJX./S T #JM ! 	E	s   (II$#I$c                     [         b  g[        R                  (       a  0 q g[        R                  (       a  0 q g[        R
                  " S5      n U c  [        R
                  " SSS9n U c  0 q g[        R                  (       d  [        R                  (       a  SnSn[        R                  " S5      nOSnS	n[        R                  " S
5      n [        R                  " X5      nUR                  5       R                  5       US n0 q U GH$  nUR!                  U5      nUc5  [        R"                  " SU5      (       a  O[        R                  SU5        MM  UR%                  5       S   n[        R                  (       d  [        R                  (       as  [&        R(                  R+                  U5      R-                  SS	5      S   nSUR/                  S	5      -   n	U	R1                  U5      (       d   eUS-   U	[3        U5      S -   n	OUR/                  S	5      n	U	[         ;  d  GM  U[         U	'   GM'     g! [         a    [        R                  S5        0 q  gf = f)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)rf   r   rc   is_muslshutilwhich
is_freebsd
is_openbsdrecompileexec_commandr   r   r   strip
splitlinesrF   searchrB   r   r   r   rd   group
startswithr%   )
rq   ldconfig_argsplitlines_countpatterntextlinemr   bnamer2   s
             r   rg   rg      s    !~~ ||J'H <<
1PQ NF-- **?@ **9:""8: ::<""$%5%67DNMM$ 9yy.5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   H2 2!II) __doc__r^   r)   r   rx   rt   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   rf   rg    rW   r   <module>r      s     	 	    & ' 4 4			8	$85X 5p !//
 001
4 0014 2236 0014 *( (4Wt Z(rW   