
    e6                    $   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&                  r8ddlmZ ddlmZ ej.                  ej0                  e   ej0                  e   ef   Z G d de      Zeed<   y)    )annotationsN)Path   )mesonlib)mlog)detect_cpu_family   )DependencyExceptionSystemDependency)packages)Environment)Compilerc                      e Zd Zg dZd fdZedd       ZddZddZd dZ	d!dZ
d!dZd!d	Z ej                  d
      Z ej                  d      Z ej                  d      Z ej                  d      Zd"dZd#dZd$dZed%d       Zd&dZd'dZd'dZej6                  d(d       Zej6                  d)d       Zd*d+dZd&dZd&dZd,dZd-d.dZ  xZ!S )/CudaDependency)cudacppcc                     |j                   j                   j                  |         } j                  |      }| j                  vrt        d| d j                   d      t           d|||       i  _         j                  |       _
        t         fddD              sfdg}|j                  d	d
      r=dg} j                  j                   j                     }|j!                         r|g dz  }| j                  z    _
         j#                         \   _         _         _         j(                  sy t*        j,                  j/                   j$                        st        d j$                   d       j0                  dk7  st3        |      dkD  rRt*        j,                  j5                   j$                  d       _         xj8                  d j6                   gz  c_         j0                  dk7  rs j;                         }t*        j,                  j5                   j$                  |       _        t?        j@                  dt?        jB                   j<                               nd  _         jE                          _        y )Nz
Language 'z@' is not supported by the CUDA Toolkit. Supported languages are .r   )languagec              3  :   K   | ]  }|j                   v   y wN)requested_modules).0runtimeselfs     >/usr/lib/python3/dist-packages/mesonbuild/dependencies/cuda.py	<genexpr>z*CudaDependency.__init__.<locals>.<genexpr>0   s     `7d444`s   )cudartcudart_staticr   staticTr    )rtpthreaddlz)CUDA Toolkit path must be absolute, got 'z'.r	   includez-IzCUDA library directory is)#coredata	compilers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versionis_foundospathisabsr   lenjoinincdircompile_args_detect_arch_libdirlibdirr   debugbold_find_requested_libraries)	r   environmentkwargsr'   r   req_modulesmachinearch_libdir	__class__s	   `       r   r,   zCudaDependency.__init__'   s9   ((2243S3STZ3[\	((34333%H:=~  @D  @X  @X  Y  YZ  '[  \  \fxH57!%!3!3F!;`D_`` $*Kzz(D)./((++D,<,<=##%  #::K%043I3I%ID"8<8Z8Z8\5t}}}ww}}T^^,%(RSWSaSaRbbe&fgg ==F"c)nq&8'',,t~~yADKBt{{m"4!55==F"224K'',,t~~{CDKJJ2DIIdkk4JKDK668    c                l    | j                   D ]
  }||v s|c S  t        |j                               d   S )Nr   )r*   listkeys)clsr'   langs      r   r)   zCudaDependency._detect_languageS   s=    ++ 	Dy 	 INN$%a((rK   c                R   | j                         | _        t        j                  dt        j                  | j                               | j
                  }| j                  dk(  r| j                  | j                         j                        }t        j                  dt        j                  |             |r7t        j                  ||      \  }}}|rd| d| d}| j                  |d      S d| g}nd }| j                         D cg c]  \  }}|| j                  |      |f }	}}|r| j                  |	||      S |	D 
cg c]  \  }}
}|s
||
f }}
}}|r|d	   d	   |d	   d
   dfS | j!                         rdnd}d| d}| j                  |d      S c c}}w c c}}
}w )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=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   rB   rC   version_reqsr   _strip_patch_versionget_compilerr7   r   version_compare_many_report_dependency_error_cuda_paths_cuda_toolkit_version_find_matching_toolkit_is_windows)r   rV   nvcc_version
found_some	not_foundfoundmsgr:   defaultpathsr7   defaultsplatform_msgs                r   r5   z,CudaDependency._detect_cuda_path_and_versionZ   s   113

*DIIdll,CD((==F"44T5F5F5H5P5PQLJJ		,(?@191N1N|]i1j.Y5l^  DF  GS  FT  TU  VC88>QRR  ~./LLZ^ZjZjZlmg$2248'Bmm..ulLQQDIUU(@wWT7OUUQKNHQKND99CGCSCSCU?f 	u  wC  vD  Dv  w,,S2EFF n Vs   FF"F"c                   d }t        j                  ||      \  }}t        |      }|t        |d d      z   }t	        j
                  d|        |rW|rU| j                  rd| j                   dnd}d	j                  |t        j                  j                  |d
   d
         |      }	nd }	|D ]B  \  }
}}t        j                  ||      \  }}}|r$|s|	rt	        j                  |	       |
|dfc S  |	rt	        j                  |	       y)Nc                    | d    S )Nr    ts    r   <lambda>z7CudaDependency._find_matching_toolkit.<locals>.<lambda>~   s    ad( rK   c                2    t        j                  | d         S )Nr	   )r   Versionrk   s    r   rm   z7CudaDependency._find_matching_toolkit.<locals>.<lambda>   s    9I9I!A$9O rK   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   rR   )r   	partitionrM   sortedr   rB   rU   formatr9   r:   realpathrY   warning)r   re   rV   r_   	part_funcdefaults_itrest_itrf   default_srcnvcc_warningr:   r7   rd   r`   ra   rb   s                   r   r]   z%CudaDependency._find_matching_toolkit{   sW    9K	'11)UCW$6'/OY]^^

^E7+,HHLD.CD  [BK O  V  V  Wb  df  dk  dk  dt  dt  u}  ~  u@  AB  uC  dD  FR  SLL(- 	-$T7G-5-J-J7T`-a*ZE<LL.gt,,	- LL&"rK   c                |   | j                         rdgng d}|D cg c]  }|t        j                  v s| }}|D ch c]  }t        j                  |    }}t        |      dkD  rCt	        j
                  dj                  dj                  |      dj                  |                   |r|d   S d S c c}w c c}w )N	CUDA_PATH)r}   	CUDA_HOME	CUDA_ROOTr	   zyEnvironment variables {} point to conflicting toolkit locations ({}). Toolkit selection might produce unexpected results., r   )r^   r9   environr<   r   rv   rt   r=   )r   env_varsvaruser_defaultss       r   rT   z$CudaDependency._default_path_env_var   s    $($4$4$6K=<c#+ACsbjj/@CAA4<=SC==}!LL  U  \  \  ]a  ]f  ]f  go  ]p  rv  r{  r{  |I  rJ  K  L&x{0D0	 B=s   B4B4B9c                    | j                   r t        j                  | j                      dfgng | j                         r| j	                         z   S | j                         z   S )NT)rU   r9   r   r^   _cuda_paths_win_cuda_paths_nixr   s    r   r[   zCudaDependency._cuda_paths   s]    6:ll"**T\\*D12)-)9)9);t##%Y 	YAEAUAUAWY 	YrK   c                    t         j                  j                         }|D cg c])  }|j                  d      st         j                  |   df+ c}S c c}w )N
CUDA_PATH_F)r9   r   rN   
startswith)r   r   r   s      r   r   zCudaDependency._cuda_paths_win   s>    ::??$4<]S|@\C%(]]]s
   AAc                    | j                   rdnd}t        j                  |      D cg c]&  }|t        j                  j                  |      dk(  f( c}S c c}w )Nz/usr/local/cuda-*z/usr/local/cuda*r   )rU   globiglobr9   r:   basename)r   patternr:   s      r   r   zCudaDependency._cuda_paths_nix   sH    )-%;MEIZZPWEXYTrww''-78YYYs   +Az^CUDA Version\s+(.*)$z^v(.*)$z^cuda-(.*)$z##define\s+CUDART_VERSION\s+([0-9]+)c                   | j                  |      }|r|S | j                  |      }|r|S t        j                  d       | j	                         r| j
                  n| j                  }	 |j                  t        j                  j                  |            }|r|j                  d      S t        j                  d|        	 y# t        $ r%}t        j                  d| d|       Y d }~yd }~ww xY 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   rB   r^   path_version_win_regexpath_version_nix_regexmatchr9   r:   r   grouprv   	Exception)r   r:   r7   path_version_regexmes         r   r\   z$CudaDependency._cuda_toolkit_version   s    006N55d;N

AB<@<L<L<NT88TXToTo	U"(()9)9$)?@Awwqz!I$PQ   	ULLEdV2aUSTT	Us   )A C *C 	C2C--C2c                *   t        |      }|j                  d      D ]e  }|j                  d      }| j                  j	                  |      }|s3	 t        |j                  d            }|dz  }||dz  z
  dz  }| d| c S  y # t        $ r Y tw xY w)Nzcuda_runtime_api.hutf-8encodingr	   i  
   r   )r   rglob	read_textcudart_version_regexsearchintr   
ValueError)	r   path_strr:   irawr   vers_intmajorminors	            r   r   z-CudaDependency._read_cuda_runtime_api_version   s    H~01 	&A++w+/C))005Aqwwqz? $E,3EWAeW%%	&   s   B	BBc                   t         j                  j                  |d      }	 t        |d      5 }|j	                         }| j
                  j                  |      }|r)| j                  |j                  d            cd d d        S 	 d d d        y # 1 sw Y   y xY w# t        $ r%}t        j                  d| d|       Y d }~y d }~ww xY w)Nzversion.txtr   r   r	   z+Could not read CUDA Toolkit's version file r   )r9   r:   r=   openreadlinetoolkit_version_regexr   rW   r   r   r   rB   )r   r:   version_file_pathversion_fileversion_strr   r   s          r   r   z(CudaDependency._read_toolkit_version_txt   s    GGLL}=	b'': Al*335..44[A44QWWQZ@	A A A A   	bJJEFWEXXZ[\Z_`aa	bs;   B AB<	B B BB B 	C
%CC
c                H    dj                  |j                  d      d d       S )Nr   r   )r=   split)rO   r7   s     r   rW   z#CudaDependency._strip_patch_version   s!    xxc*2A.//rK   c                \   t        | j                  j                  j                  j                        }| j                  j
                  | j                     }d}|j                         rGddd}||vrt        |j                  |d            t        j                  j                  d||         S |j                         r+ddddd}||vrt        |j                  |d	            ||   S |j                         r(d
di}||vrt        |j                  |d            ||   S t        d      )NzC{} architecture is not supported in {} version of the CUDA Toolkit.Win32x64)x86x86_64Windowsliblib64)r   ppc64aarch64loongarch64Linuxr   macOSz#CUDA Toolkit: unsupported platform.)r   r1   r&   r'   hostr2   r3   
is_windowsr
   rt   r9   r:   r=   r4   	is_darwin)r   archrH   rc   libdirss        r   r@   z"CudaDependency._detect_arch_libdir   s    !2!2!<!<!A!AB((##D$4$45S%7G7")#**T9*EFF77<<wt}55!(5W]deG7")#**T7*CDD4=  )G7")#**T7*CDD4= %&KLLrK   c                4   d}| j                   D ]  }| j                  j                  || j                  | j                  r| j                  gng       }|| j                  d| d       d}]t        j                  d| d|        || j                  |<    |S )NTz%Couldn't find requested CUDA module ''FzLink args for CUDA module 'z' are )	r   clib_compilerfind_libraryr1   rA   rZ   r   rB   r-   )r   	all_foundmoduleargss       r   rD   z(CudaDependency._find_requested_libraries   s    	,, 	0F%%226488VZVaVadkk]gijD|--0WX^W__a.bc!	

9&OP+/  (	0 rK   c                d    | j                   j                  | j                     j                         S r   )r1   r2   r3   r   r   s    r   r^   zCudaDependency._is_windows  s&    xx  !1!12==??rK   c                     y r   rj   )r   rc   s     r   rZ   z'CudaDependency._report_dependency_error  s    :=rK   c                     y r   rj   r   rc   ret_vals      r   rZ   z'CudaDependency._report_dependency_error  s    ]`rK   c                ^    | j                   rt        |      t        j                  |       |S r   )requiredr
   r   rB   r   s      r   rZ   z'CudaDependency._report_dependency_error  s$    ==%c**

3rK   c                B    dj                  | j                        }d|z   S )Nr   z	modules: )r=   r   )r   
module_strs     r   log_detailszCudaDependency.log_details  s!    YYt556
Z''rK   c                6    | j                   r| j                   S dS )N )r6   r   s    r   log_infozCudaDependency.log_info  s    !%t~~7R7rK   c                v    t        j                  |d      }|D ]  }t        |t              rt	        d       |S )Nmodulesz%CUDA module argument is not a string.)r   extract_as_list
isinstancestrr
   )r   rF   
candidatesr   s       r   r.   zCudaDependency.get_requested"  sC    --fi@
 	SAa%)*QRR	S rK   c                    g }| j                   r(|| j                  j                  | j                         z  }| j                  D ]  }|| j                  |   z  } |S r   )rA   r   get_linker_search_argsr   r-   )r   r   r   r   r   s        r   get_link_argszCudaDependency.get_link_args)  s\    ;;D&&==dkkJJD)) 	*CD$$S))D	*rK   )rE   z'Environment'rF   T.Dict[str, T.Any]returnNone)r'   zT.Dict[str, 'Compiler']r   r   )r   TV_ResultTuple)re   zT.List[TV_ResultTuple]rV   T.List[str]r_   T.Optional[str]r   r   )r   r   )r   zT.List[T.Tuple[str, bool]])r:   r   r   r   )r   r   r   r   )r:   r   r   r   )r7   r   r   r   )r   r   )r   bool)rc   r   r   r   )rc   r   r   r   r   r   r   )rc   r   r   T.Optional[TV_ResultTuple]r   r   )rF   r   r   r   )NF)r   r   r   r   r   r   )"__name__
__module____qualname__r*   r,   classmethodr)   r5   r]   rT   r[   r   r   recompiler   r   r   r   r\   r   r   rW   r@   rD   r^   ToverloadrZ   r   r   r.   r   __classcell__)rJ   s   @r   r   r   #   s   .*9X ) )GB#41Y^Z
 'BJJ'?@'RZZ
3'RZZ7%2::&LM*" 0 0M,@ ZZ= =ZZ` `(8 rK   r   r   )
__future__r   r   r   r9   typingr   pathlibr   r   r   r   rE   r   baser
   r   detectr   TYPE_CHECKINGr   r'   r   TupleOptionalr   r   r   r   rj   rK   r   <module>r      sx    #  	 	     + 7  ??)$WWQZZ_ajjotCDNL% L\ " rK   