
    `i*                        d Z ddlmZ ddlZddlmZ ddlZddlZddl	m
Z
 ddlmZmZ erddlm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/dZd0dZd1d"Zd2d#Zd2d$Zd3d*ZdS )4zUtilities to locate tvm_ffi libraries, headers, and helper include paths.

This module also provides helpers to locate and load platform-specific shared
libraries by a target_name (e.g., ``tvm_ffi`` -> ``libtvm_ffi.so`` on Linux).
    )annotationsNPath)TYPE_CHECKINGCallable   )Modulereturnstrc                 n    t          dd          } t          | gd           x}r|S t          d          )zfFind libtvm_ffi.

    Returns
    -------
    path
        The full path to the located library.

    apache-tvm-ffitvm_ffic                    dS NT _s    c/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/tvm_ffi/libinfo.py<lambda>z!find_libtvm_ffi.<locals>.<lambda>.            condzCannot find libtvm_ffi)_find_library_by_basename_resolve_and_validateRuntimeError	candidaterets     r   find_libtvm_ffir    $   sF     **:IFFI#YKnnEEEEs 

/
0
00r   c                 ~    t          dd          j        dz  } t          | gd           x}r|S t          d          )z@Find and return the Windows import library path for tvm_ffi.lib.r   r   ztvm_ffi.libc                    dS r   r   r   s    r   r   z%find_windows_implib.<locals>.<lambda>8   r   r   r   zCannot find implib tvm_ffi.lib)r   parentr   r   r   s     r   find_windows_implibr$   3   sO     **:IFFMP]]I#YKnnEEEEs 

7
8
88r   c                     t          t                      t                      gd           x} r| S t          d          )zFind packaged source home path.c                0    | dz                                   S )Nsrcis_dirps    r   r   z"find_source_path.<locals>.<lambda>D   s    E	))++ r   pathsr   zCannot find home path.r   _rel_top_directory_dev_top_directoryr   r   s    r   find_source_pathr2   =   sU    #    
 ,+   s  

/
0
00r   c                     t          t                      dz  dz  dz  t                      dz  gd           x} r| S t          d          )zFind the preferred cmake path.sharecmaker   c                *    |                                  S Nr(   r*   s    r   r   z!find_cmake_path.<locals>.<lambda>Q       qxxzz r   r,   zCannot find cmake path.r.   r1   s    r   find_cmake_pathr9   J   si    #  7*W4y@  7*
 "!   s  

0
1
11r   c                     t          t                      dz  t                      dz  gd           x} r| S t          d          )$Find header files for C compilation.includec                *    |                                  S r7   r(   r*   s    r   r   z#find_include_path.<locals>.<lambda>^   r8   r   r,   zCannot find include path.r.   r1   s    r   find_include_pathr>   W   s_    #  9,  9,
 "!   s  

2
3
33r   c                     t          t                      dz  t                      dz  dz  dz  gd           x} r| S t          d          )z+Find dlpack header files for C compilation.r<   3rdpartydlpackc                0    | dz                                   S )NrA   r(   r*   s    r   r   z*find_dlpack_include_path.<locals>.<lambda>k   s    H,,.. r   r,   z Cannot find dlpack include path.r.   r1   s    r   find_dlpack_include_pathrC   d   si    #  9,  :-89D
 /.   s  

9
:
::r   c                     ddl m}  	 t          t          | j                                                            S # t          $ r Y nw xY wt          d          )zFind the path to tvm cython.r   corezCannot find tvm cython path.)r   rF   r   r   __file__resolveOSErrorr   rE   s    r   find_cython_librJ   q   sl    4&&..00111   
5
6
66s   2; 
AAc                     t          t                      dz  t                      dz  dz  dz  gd           x} r| S t          d          )r;   r<   pythonr   cythonc                0    | dz                                   S )Nztvm_ffi_python_helpers.h)is_filer*   s    r   r   z1find_python_helper_include_path.<locals>.<lambda>   s    66??AA r   r,   z'Cannot find python helper include path.r.   r1   s    r   find_python_helper_include_pathrP   |   sj    #  9,  8+i7(B
 BA   s  

@
A
AAr   	list[str]c                 n    t          t                      t                      t                      h          S )z:Find all include paths needed for FFI related compilation.)sortedr>   rC   rP   r   r   r   include_pathsrT      s4    $&&+--	
  r   packagetarget_namemodectypes.CDLLc                   t          | |          }t          j                            d          r&t	          j        t          |j                             t          j	        t          |          t          t          |                    S )a  Load the tvm_ffi shared library by searching likely paths.

    Parameters
    ----------
    package
        The package name where the library is expected to be found. For example,
        ``"apache-tvm-ffi"`` is the package name of `tvm-ffi`.
    target_name
        Name of the CMake target, e.g., ``"tvm_ffi"``. It is used to derive the platform-specific
        shared library name, e.g., ``"libtvm_ffi.so"`` on Linux, ``"tvm_ffi.dll"`` on Windows.
    mode
        The mode to load the shared library. See `ctypes.${MODE}` for details.
        Usually it is either ``"RTLD_LOCAL"`` or ``"RTLD_GLOBAL"``.

    Returns
    -------
    The loaded shared library.

    win32)r   sysplatform
startswithosadd_dll_directoryr   r#   ctypesCDLLgetattr)rU   rV   rW   lib_paths       r   load_lib_ctypesrd      sh    ( /wDDH
|w'' 3
S11222;s8}}gfd&;&;<<<r   Tkeep_module_aliveboolr	   c                    ddl m} t          | |          }t          j                            d          r&t          j        t          |j	                              |||          S )ao  Load the tvm_ffi shared library by searching likely paths.

    Parameters
    ----------
    package
        The package name where the library is expected to be found. For example,
        ``"apache-tvm-ffi"`` is the package name of `tvm-ffi`.

    target_name
        Name of the CMake target, e.g., ``"tvm_ffi"``. It is used to derive the platform-specific
        shared library name, e.g., ``"libtvm_ffi.so"`` on Linux, ``"tvm_ffi.dll"`` on Windows.

    keep_module_alive
        Whether to keep the loaded module alive to prevent it from being unloaded.

    Returns
    -------
    The loaded shared library.

    r   )load_modulerZ   )re   )
modulerh   r   r[   r\   r]   r^   r_   r   r#   )rU   rV   re   rh   rc   s        r   load_lib_modulerj      sn    * $#####.wDDH
|w'' 3
S11222;x3DEEEEr   r   c                d   t           j                            d          r| df}n3t           j                            d          rd| dd| df}nd| df}t          j        |           }|                    d          pd}|                                D ]n}|                    d	          ^}}|                    |          r@	 |j	        j
        |z                                  }n# t          $ r Y ]w xY w|j        |v r|c S og }	|	                    t                      d
z  dz             |	                    t                      dz             |	                    t!                      d
z  dz             |	                    t!                      dz             t           j                            d          r.|	                    d t%          dd          D                        nt           j                            d          r[|	                    d t%          dd          D                        |	                    d t%          dd          D                        nZ|	                    d t%          dd          D                        |	                    d t%          dd          D                        |	D ]I}
|D ]D}	 |
|z                                  }|                                r|c c S 5# t          $ r Y Aw xY wJt)          dd                    |                     )a  Find a shared library by target_name name across known directories.

    Parameters
    ----------
    package
        The package name where the library is expected to be found.
    target_name
        Base name (e.g., ``"tvm_ffi"`` or ``"tvm_ffi_testing"``).

    Returns
    -------
    path
        The full path to the located library.

    Raises
    ------
    RuntimeError
        If the library cannot be found in any of the candidate directories.

    rZ   z.dlldarwinlibz.dylibz.soRECORD ,buildc              3  4   K   | ]}t          |          V  d S r7   r   .0r+   s     r   	<genexpr>z,_find_library_by_basename.<locals>.<genexpr>  (      FFQaFFFFFFr   PATH;c              3  4   K   | ]}t          |          V  d S r7   r   rs   s     r   ru   z,_find_library_by_basename.<locals>.<genexpr>  s(      SSQaSSSSSSr   DYLD_LIBRARY_PATH:c              3  4   K   | ]}t          |          V  d S r7   r   rs   s     r   ru   z,_find_library_by_basename.<locals>.<genexpr>  rv   r   c              3  4   K   | ]}t          |          V  d S r7   r   rs   s     r   ru   z,_find_library_by_basename.<locals>.<genexpr>  s(      QQQaQQQQQQr   LD_LIBRARY_PATHc              3  4   K   | ]}t          |          V  d S r7   r   rs   s     r   ru   z,_find_library_by_basename.<locals>.<genexpr>	  rv   r   zCannot find library: z, )r[   r\   r]   imdistribution	read_text
splitlinessplitendswith_pathr#   rH   rI   nameappendr/   r0   extend_split_env_varrO   r   join)rU   rV   lib_dll_namesdistrecordlinepartial_pathr   path	dll_pathsdll_dirlib_dll_names               r   r   r      s   * |w'' 2'---/		 	 	*	* 22{2224J+4J4J4JK/{///1 !# 8 8D^^H%%+F!!##  ::c??q  // 	
)L8AACC   yM)) I '))G3e;<<<'))E1222'))G3e;<<<'))E1222 |w'' GFF.*E*EFFFFFFF		 	 	*	* GSS.9Lc*R*RSSSSSSFF.*E*EFFFFFFFQQ.9JC*P*PQQQQQQFF.*E*EFFFFFF   ) 	 	L,.7799<<>>  KKKKK    	 Ityy/G/GII
J
JJs$   !C**
C76C7
,K<<
L	L	env_varr   c                    t           j                            | d          r/d t           j        |                              |          D             S g S )a  Split an environment variable string.

    Parameters
    ----------
    env_var
        Name of environment variable.

    split
        String to split env_var on.

    Returns
    -------
    splits
        If env_var exists, split env_var. Otherwise, empty list.

    Nc                6    g | ]}|                                 S r   )striprs   s     r   
<listcomp>z"_split_env_var.<locals>.<listcomp>)  s     DDDa		DDDr   )r^   environgetr   )r   r   s     r   r   r     sK    " 
z~~gt$$ EDD2:g#6#<#<U#C#CDDDDIr   c                 4    t          t                    j        S )z'Get the current directory of this file.)r   rG   r#   r   r   r   r/   r/   -  s    >>  r   c                 *    t                      dz  dz  S )z(Get the top-level development directory.z..)r/   r   r   r   r0   r0   2  s    $&--r   r-   
list[Path]r   Callable[[Path], bool | Path]
str | Nonec                    | D ]u}	 |                                 } ||          }n# t          t          f$ r Y 6w xY wt          |t                    rt          |          c S |du rt          |          c S vdS )a  For all paths that resolve properly, find the 1st one that meets the specified condition.

    M. B. This code path gracefully handles broken paths, symlinks, or permission issues,
    and is required for robust library discovery in all public APIs in this file.
    TN)rH   rI   AssertionError
isinstancer   r   )r-   r   r   resolvedr   s        r   r   r   7  s      	! 	!	||~~H$x..CC( 	 	 	H	c4   	!s88OOOD[[x==    4s   &::)r
   r   )r
   rQ   )rU   r   rV   r   rW   r   r
   rX   )T)rU   r   rV   r   re   rf   r
   r	   )rU   r   rV   r   r
   r   )r   r   r   r   r
   rQ   )r
   r   )r-   r   r   r   r
   r   ) __doc__
__future__r   r`   importlib.metadatametadatar   r^   r[   pathlibr   typingr   r   ri   r	   r    r$   r2   r9   r>   rC   rJ   rP   rT   rd   rj   r   r   r/   r0   r   r   r   r   <module>r      s  "  # " " " " "        				 



       * * * * * * * * 1 1 1 19 9 9 9
1 
1 
1 
1
2 
2 
2 
2
4 
4 
4 
4
; 
; 
; 
;7 7 7 7
B 
B 
B 
B   = = = =6F F F F F<GK GK GK GKT   ,! ! ! !
. . . .
     r   