o
    e6                     @  s   d dl m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 ejrYddlmZ ddlmZ ejeje eje ef ZG dd deZeed< dS )    )annotationsN)Path   )mesonlib)mlog)detect_cpu_family   )DependencyExceptionSystemDependency)packages)Environment)Compilerc                      s8  e Zd Zg dZdL fdd	ZedMddZdNddZdOddZdPddZ	dQddZ
dQdd ZdQd!d"Zed#Zed$Zed%Zed&ZdRd(d)ZdSd+d,ZdTd-d.ZedUd0d1ZdVd2d3ZdWd5d6ZdWd7d8ZejdXd:d;ZejdYd=d;ZdZd[d@d;ZdVdAdBZdVdCdDZd\dEdFZd]d^dJdKZ   Z!S )_CudaDependency)cudacppcenvironment'Environment'kwargsT.Dict[str, T.Any]returnNonec                   s  |j j | } |}| jvrtd| d j dt jd|||d i  _ 	| _
t fdddD s`d	g}|d
drZdg} jj j }| rZ|g d7 }| j
  _
  \ _ _ _ jsod S tj jstd j d jdkst|dkrtj jd _  jd j g7  _ jdkr  }tj j| _t dt! j nd  _ "  _d S )Nz
Language 'z@' is not supported by the CUDA Toolkit. Supported languages are .r   )languagec                 3  s    | ]}| j v V  qd S N)requested_modules).0Zruntimeself A/usr/lib/python3.10/site-packages/mesonbuild/dependencies/cuda.py	<genexpr>0   s    z*CudaDependency.__init__.<locals>.<genexpr>)cudartcudart_staticr"   staticTr#   )rtZpthreadZdlz)CUDA Toolkit path must be absolute, got 'z'.r   includez-IzCUDA library directory is)#coredata	compilersZget_for_machine_from_kwargs_detect_languagesupported_languagesr	   super__init__lib_modulesget_requestedr   anygetenvmachinesfor_machineis_linux_detect_cuda_path_and_version	cuda_pathversionZis_foundospathisabsr   lenjoinincdirZcompile_args_detect_arch_libdirlibdirr   debugbold_find_requested_libraries)r   r   r   r(   r   Zreq_modulesmachineZarch_libdir	__class__r   r    r,   '   s:   


zCudaDependency.__init__r(   T.Dict[str, 'Compiler']strc                 C  s,   | j D ]
}||v r|  S qt| d S )Nr   )r*   listkeys)clsr(   langr   r   r    r)   S   s
   
zCudaDependency._detect_languageTV_ResultTuplec           
        s      _tdt j  j} jdkrK   j	}tdt| |rDt
||\}}}|rDd| d| d} |dS d| g}nd } fd	d
  D }|ra |||S dd
 |D }|rw|d d |d d dfS   r}dnd}	d|	 d} |dS )NzDefault path env var:r   znvcc version:zThe current nvcc version zB does not satisfy the specified CUDA Toolkit version requirements r   NNF=c                   s    g | ]\}}|  ||fqS r   )_cuda_toolkit_version)r   r9   defaultr   r   r    
<listcomp>n        z@CudaDependency._detect_cuda_path_and_version.<locals>.<listcomp>c                 S  s   g | ]\}}}|r||fqS r   r   )r   r9   r7   rP   r   r   r    rQ   r   s    r   r   Tz&set the CUDA_PATH environment variablezQset the CUDA_PATH environment variable/create the '/usr/local/cuda' symbolic linkzaPlease specify the desired CUDA Toolkit version (e.g. dependency('cuda', version : '>=10.1')) or z2 to point to the location of your desired version.)_default_path_env_varenv_varr   r@   rA   version_reqsr   _strip_patch_versionZget_compilerr7   r   version_compare_many_report_dependency_error_cuda_paths_find_matching_toolkit_is_windows)
r   rU   nvcc_version
found_some	not_foundfoundmsgpathsdefaultsZplatform_msgr   r   r    r5   Z   s0   

z,CudaDependency._detect_cuda_path_and_versionra   T.List[TV_ResultTuple]rU   T.List[str]r\   T.Optional[str]c                 C  s   dd }t ||\}}t|}|t|dd dd }td|  |rC|rC| jr1d| j dnd	}d
|tj	
|d d |}	nd }	|D ] \}
}}t ||\}}}|sg|s`|	r`t|	 |
|df  S qG|	rot|	 dS )Nc                 S  s
   | d  S )Nr   r   tr   r   r    <lambda>~   s   
 z7CudaDependency._find_matching_toolkit.<locals>.<lambda>c                 S  s   t | d S )Nr   )r   Versionrf   r   r   r    rh      s    T)keyreversezSearch paths: zthe z environment variablez#the '/usr/local/cuda' symbolic linkzpThe default CUDA Toolkit as designated by {} ({}) doesn't match the current nvcc version {} and will be ignored.r   rM   )r   	partitionrH   sortedr   r@   rT   formatr8   r9   realpathrW   warning)r   ra   rU   r\   Z	part_funcZdefaults_itZrest_itrb   Zdefault_srcZnvcc_warningr9   r7   rP   r]   r^   r_   r   r   r    rZ   {   s&    

z%CudaDependency._find_matching_toolkitc                 C  sl   |   rdgng d}dd |D }dd |D }t|dkr.tdd	|d	| |r4|d
 S d S )N	CUDA_PATH)rq   Z	CUDA_HOMEZ	CUDA_ROOTc                 S  s   g | ]	}|t jv r|qS r   r8   environr   varr   r   r    rQ      s    z8CudaDependency._default_path_env_var.<locals>.<listcomp>c                 S  s   h | ]}t j| qS r   rr   rt   r   r   r    	<setcomp>   s    z7CudaDependency._default_path_env_var.<locals>.<setcomp>r   zyEnvironment variables {} point to conflicting toolkit locations ({}). Toolkit selection might produce unexpected results., r   )r[   r;   r   rp   rn   r<   )r   env_varsZuser_defaultsr   r   r    rS      s   z$CudaDependency._default_path_env_varT.List[T.Tuple[str, bool]]c                 C  s6   | j rtj| j  dfgng |  r|   S |   S )NT)rT   r8   rs   r[   _cuda_paths_win_cuda_paths_nixr   r   r   r    rY      s
   zCudaDependency._cuda_pathsc                 C  s   t j }dd |D S )Nc                 S  s$   g | ]}| d rtj| dfqS )Z
CUDA_PATH_F)
startswithr8   rs   rt   r   r   r    rQ      s   $ z2CudaDependency._cuda_paths_win.<locals>.<listcomp>)r8   rs   rI   )r   rx   r   r   r    rz      s   
zCudaDependency._cuda_paths_winc                 C  s"   | j rdnd}dd t|D S )Nz/usr/local/cuda-*z/usr/local/cuda*c                 S  s    g | ]}|t j|d kfqS )r   )r8   r9   basename)r   r9   r   r   r    rQ      rR   z2CudaDependency._cuda_paths_nix.<locals>.<listcomp>)rT   globiglob)r   patternr   r   r    r{      s   zCudaDependency._cuda_paths_nixz^CUDA Version\s+(.*)$z^v(.*)$z^cuda-(.*)$z##define\s+CUDART_VERSION\s+([0-9]+)r9   c              
   C  s   |  |}|r	|S | |}|r|S td |  r| jn| j}z|tj	
|}|r3|dW S td|  W dS  ty[ } ztd| d| W Y d }~dS d }~ww )Nz,Falling back to extracting version from pathr   z*Could not detect CUDA Toolkit version for : z0.0)_read_toolkit_version_txt_read_cuda_runtime_api_versionr   r@   r[   path_version_win_regexpath_version_nix_regexmatchr8   r9   r}   grouprp   	Exception)r   r9   r7   Zpath_version_regexmer   r   r    rO      s&   


 z$CudaDependency._cuda_toolkit_versionpath_strc           	   	   C  s   t |}|dD ]8}|jdd}| j|}|sq	z	t|d}W n	 ty,   Y q	w |d }||d  d }| d|   S d S )Nzcuda_runtime_api.hutf-8encodingr   i  
   r   )r   rglob	read_textcudart_version_regexsearchintr   
ValueError)	r   r   r9   irawr   Zvers_intmajorminorr   r   r    r      s   z-CudaDependency._read_cuda_runtime_api_versionc              
   C  s   t j|d}z7t|dd&}| }| j|}|r+| |dW  d    W S W d    W d S 1 s7w   Y  W d S  t	y\ } zt
d| d| W Y d }~d S d }~ww )Nzversion.txtr   r   r   z+Could not read CUDA Toolkit's version file r   )r8   r9   r<   openreadlinetoolkit_version_regexr   rV   r   r   r   r@   )r   r9   Zversion_file_pathZversion_fileversion_strr   r   r   r   r    r      s$    z(CudaDependency._read_toolkit_version_txtr7   c                 C  s   d |dd d S )Nr   r   )r<   split)rJ   r7   r   r   r    rV      s   z#CudaDependency._strip_patch_versionc                 C  s   t | jjjj}| jj| j }d}| r/ddd}||vr&t|	|dt
jd|| S | rJddddd}||vrFt|	|d	|| S | rbd
di}||vr^t|	|d|| S td)NzC{} architecture is not supported in {} version of the CUDA Toolkit.ZWin32x64)x86x86_64WindowslibZlib64)r   ppc64aarch64Zloongarch64Linuxr   macOSz#CUDA Toolkit: unsupported platform.)r   r1   r'   r(   hostr2   r3   
is_windowsr	   rn   r8   r9   r<   r4   Z	is_darwin)r   archrC   r`   libdirsr   r   r    r>      s&   
z"CudaDependency._detect_arch_libdirboolc                 C  st   d}| j D ]2}| j|| j| jr| jgng }|d u r'| d| d d}qtd| d|  || j|< q|S )NTz%Couldn't find requested CUDA module ''FzLink args for CUDA module 'z' are )	r   clib_compilerZfind_libraryr1   r?   rX   r   r@   r-   )r   Z	all_foundmoduleargsr   r   r    rB      s   
 z(CudaDependency._find_requested_librariesc                 C  s   | j j| j  S r   )r1   r2   r3   r   r   r   r   r    r[     s   zCudaDependency._is_windowsr`   c                 C     d S r   r   )r   r`   r   r   r    rX        z'CudaDependency._report_dependency_errorret_valc                 C  r   r   r   r   r`   r   r   r   r    rX     r   NT.Optional[TV_ResultTuple]c                 C  s   | j rt|t| |S r   )requiredr	   r   r@   r   r   r   r    rX     s   
c                 C  s   d | j}d| S )Nrw   z	modules: )r<   r   )r   Z
module_strr   r   r    log_details  s   zCudaDependency.log_detailsc                 C  s   | j r| j S dS )N )r6   r   r   r   r    log_info  s   zCudaDependency.log_infoc                 C  s,   t |d}|D ]}t|tstdq|S )Nmodulesz%CUDA module argument is not a string.)r   Zextract_as_list
isinstancerG   r	   )r   r   
candidatesr   r   r   r    r.   "  s   
zCudaDependency.get_requestedFr   r   c                 C  s:   g }| j r|| j| j 7 }| jD ]	}|| j| 7 }q|S r   )r?   r   Zget_linker_search_argsr   r-   )r   r   r   r   r   r   r   r    get_link_args)  s   
zCudaDependency.get_link_args)r   r   r   r   r   r   )r(   rF   r   rG   )r   rL   )ra   rc   rU   rd   r\   re   r   rL   )r   re   )r   ry   )r9   rG   r   rG   )r   rG   r   re   )r9   rG   r   re   )r7   rG   r   rG   )r   rG   )r   r   )r`   rG   r   r   )r`   rG   r   rL   r   rL   r   )r`   rG   r   r   r   r   )r   r   r   rd   )NF)r   re   r   r   r   rd   )"__name__
__module____qualname__r*   r,   classmethodr)   r5   rZ   rS   rY   rz   r{   recompiler   r   r   r   rO   r   r   rV   r>   rB   r[   ToverloadrX   r   r   r.   r   __classcell__r   r   rD   r    r   #   s@    ,

!
















r   r   )
__future__r   r~   r   r8   typingr   pathlibr   r   r   r   r   r   baser	   r
   detectr   TYPE_CHECKINGr   r(   r   TupleOptionalrG   r   rL   r   r   r   r   r    <module>   s&     