U
    ,dT                     @   s   d Z ddlZddlZddlZddlmZ ddlmZ ejdkrHdZ	dZ
nejdkr\d	Z	d
Z
ndZ	d
Z
dd Zdd ZdddZdd Zdd Zdd ZdddZdS )a2  Cudatoolkit libraries lookup utilities.

Cudatoolkit libraries can be available via either:

- the `cudatoolkit` conda package,
- a user supplied location from CUDA_HOME,
- a system wide location,
- package-specific locations (e.g. the Debian NVIDIA packages),
- or can be discovered by the system loader.
    N)find_lib)get_cuda_pathswin32z%s.dllz%s.libdarwinzlib%s.dylibzlib%s.azlib%s.soc                  C   s   t  } | d j}|S )N	libdevice)r   info)dpaths r
   ;/tmp/pip-unpacked-wheel-eu7e0c37/numba/cuda/cudadrv/libs.pyget_libdevice   s    
r   c               
   C   s,   t t d} |  W  5 Q R  S Q R X d S )Nrb)openr   read)Zbcfiler
   r
   r   open_libdevice$   s    r   Fc                 C   sX   | dkrt  d jptd S t  d j}t| |||d}|r@tnt}|rPt|S ||  S )a  
    Find the path of a CUDA library based on a search of known locations. If
    the search fails, return a generic filename for the library (e.g.
    'libnvvm.so' for 'nvvm') so that we may attempt to load it using the system
    loader's search mechanism.
    nvvmcudalib_dir)platformstatic)r   r   _dllnamepatternr   _staticnamepatternmax)libr   r   Zlibdir
candidatesZnamepatternr
   r
   r   get_cudalib)   s    r   c                 C   s   t | }t|S )N)r   ctypesCDLLr   pathr
   r
   r   open_cudalib:   s    r   c                 C   s*   t | dd}tj|s&t| dd S )NTr   z
 not found)r   osr   isfileFileNotFoundErrorr   r
   r
   r   check_static_lib?   s    r$   c                 C   s8   | dkrt  d jS | dkr(t  d jS t  d jS d S )Nr   r   r   )r   Zby)r   r
   r
   r   _get_source_variableE   s
    r%   Tc                 C   s  d}d  }|D ]}t|| }td|t| |rBtd| ntdtj| | dtj	fkrz tddd	 t
| td
 W q tk
r } ztd||f  d}W 5 d}~X Y qX qd}t|| dd}td|t| |rtd| ntdtj| zt| W n8 tk
rH } ztd||f  d}W 5 d}~X Y nX td}td|  tddd	 t }|rtd
 ntd d}| S )z:Test library lookup.  Path info is printed to stdout.
    Fznvvm cudartzFinding {} from {}z	located atz	named Nz	trying to open libraryz...)endz	okz	ERROR: failed to open %s:
%sTZ	cudadevrtr    z	ERROR: failed to find %s:
%sr   zFinding libdevice from z	ERROR: can't open libdevice)splitr   printformatr%   r!   r   basenamesysr   r   OSErrorr$   r#   r   )	_platformZprint_pathsfailedZlibsr   r   ewherer
   r
   r   testN   sH    

r1   )NF)NT)__doc__r!   r+   r   Znumba.misc.findlibr   Znumba.cuda.cuda_pathsr   r   r   r   r   r   r   r   r$   r%   r1   r
   r
   r
   r   <module>   s(   


	