o
    پi*                     @   s  d dl Z d dl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mZ d dlZd dlZddlmZ ddlmZ d	ee fd
dZd	ee fddZe jd	efddZe jd	efddZded	efddZdee d	efddZded	efddZ	d3dedeee	  d	ee fddZ	d3dee deee  d	ee fd d!Z	d3dee d"eee  d	ee fd#d$Z 	%d4d&ed'ee	 deee  d"eee  d(eee  deee	  d)ed	efd*d+Z!d	ee" fd,d-Z#d.e	d/e	d0ed	dfd1d2Z$dS )5    N)Version)Path)ListOptional   )env   )CompilationContextreturnc              
   C   sr   t j| }|r7z
dd l}||W S  ty6 } ztd|  d| dtjd | W  Y d }~S d }~ww g S )Nr   zWarning: Could not parse z with shlex: z. Falling back to simple split.)file)	osenvirongetshlexsplit
ValueErrorprintsysstderr)env_var_name	env_flagsr   e r   J/home/ubuntu/.local/lib/python3.10/site-packages/flashinfer/jit/cpp_ext.pyparse_env_flags   s   r   c                  C   s   dt ttjj g} | S )Nz-D_GLIBCXX_USE_CXX11_ABI=)strinttorch_C_GLIBCXX_USE_CXX11_ABI)glibcxx_abi_cflagsr   r   r   _get_glibcxx_abi_build_flags$   s   r!   c                  C   s   t jdpt jd} | d ur| S tjddgdd}|jdkr2t jt j|j	d
 } | S d	} t j| sBtd
| d| S )N	CUDA_HOME	CUDA_PATHwhichnvccT)capture_outputr   zutf-8z/usr/local/cudaz*Could not find nvcc and default cuda_home=z doesn't exist)r   r   r   
subprocessrun
returncodepathdirnamestdoutdecodestripexistsRuntimeError)	cuda_home	nvcc_pathr   r   r   get_cuda_path+   s   
	
r3   c               
   C   s   z)t  } tj| d}tj|dgdd}td|}|s#td| t	|d W S  tt
tjfyP } ztjjd u r@td|t	tjjW  Y d }~S d }~ww )	Nzbin/nvccz	--versionT)textzrelease (\d+\.\d+),z9Could not parse CUDA version from nvcc --version output: r   z\nvcc not found and PyTorch is not built with CUDA support. Could not determine CUDA version.)r3   r   r*   joinr'   check_outputrefindallr0   r   FileNotFoundErrorCalledProcessErrorr   versioncuda)r1   r%   txtmatchesr   r   r   r   get_cuda_version?   s(   r?   version_strc                 C   s   t  t| kS N)r?   r   )r@   r   r   r   is_cuda_version_at_leastV   s   rB   vsc                 C   s
   d | S )Nz $
    )r5   )rC   r   r   r   join_multilineZ   s   
rD   r1   c                 C   sj   t dddtj tj tj tj	 g}|dd tj
D 7 }|tj  | dkr3|d |S )z'Get list of system include directories.includez$cuda_home/includez$cuda_home/include/ccclc                 S   s   g | ]}|  qS r   )resolve).0pr   r   r   
<listcomp>i   s    z'get_system_includes.<locals>.<listcomp>z/usr)	sysconfigget_pathtvm_ffilibinfofind_include_pathfind_dlpack_include_pathjit_envFLASHINFER_INCLUDE_DIRrF   FLASHINFER_CSRC_DIRCUTLASS_INCLUDE_DIRSappendSPDLOG_INCLUDE_DIRremove)r1   system_includesr   r   r   get_system_includes^   s   	
rX   extra_include_dirsc                 C   sn   t | }g }tds|d |t 7 }|dur(|D ]}|d|   q|D ]
}|d|  q*|S )zBuild common compilation flags.Py_GIL_DISABLEDz-DPy_LIMITED_API=0x03090000Nz-Iz	-isystem )rX   rJ   get_config_varrT   r!   rF   )r1   rY   rW   common_cflags	extra_dirsys_dirr   r   r   build_common_cflagss   s   


r_   r\   extra_cflagsc                 C   s4   ddg}|dur||7 }t d}|dur||7 }|S )zBuild C++ compilation flags.$common_cflagsz-fPICNFLASHINFER_EXTRA_CFLAGS)r   )r\   r`   cflagsenv_extra_cflagsr   r   r   build_cflags   s   re   extra_cuda_cflagsc           
      C   s   g }t jd}|dur|d|g7 }|g d7 }t }|tdkr&|dg7 }t }| }|durQtdd |D }|rJd	d
 |D }||| 7 }n||| 7 }n||7 }td}	|	dura||	7 }|S )zBuild CUDA compilation flags.CCNz-ccbin)ra   z--compiler-options=-fPICz--expt-relaxed-constexprz12.8z"-static-global-template-stub=falsec                 s   s    | ]}| d V  qdS )	-gencode=N
startswithrG   flagr   r   r   	<genexpr>   s    

z$build_cuda_cflags.<locals>.<genexpr>c                 S   s   g | ]	}| d s|qS )rh   ri   rk   r   r   r   rI      s
    
z%build_cuda_cflags.<locals>.<listcomp>FLASHINFER_EXTRA_CUDAFLAGS)	r   r   r   r?   r   r	   get_nvcc_flags_listanyr   )
r\   rf   cuda_cflagscc_envcuda_version#cpp_ext_initial_compilation_contextglobal_flagsmodule_has_gencodeglobal_non_arch_flagsenv_extra_cuda_cflagsr   r   r   build_cuda_cflags   s6   ry   Fnamesourcesextra_ldflagsneeds_device_linkingc                 C   s  t  }t||}t||}	t||}
g d}td}|d ur"||7 }|d ur*||7 }tjdd}tjdd}dd|  d	| d
| d| ddt| dt|	 ddt|
 ddt| dddddddddddg}|rw|	g d n|	g d t
j|  }g }|D ]6}|jdk}|rdnd}|rdnd}||j}t||  }|| |d | d!| d"|   q|d |rd#nd$}t||  d%  }|d | d!| d"d"|  |d&|  |d d'|S )(N)z-sharedz-L$cuda_home/lib64z-L$cuda_home/lib64/stubsz-lcudartz-lcudaFLASHINFER_EXTRA_LDFLAGSCXXzc++FLASHINFER_NVCCz$cuda_home/bin/nvcczninja_required_version = 1.3zname = zcuda_home = zcxx = znvcc =  zcommon_cflags = z	cflags = zpost_cflags =zcuda_cflags = zcuda_post_cflags =z
ldflags = zrule compilezD  command = $cxx -MMD -MF $out.d $cflags -c $in -o $out $post_cflagsz  depfile = $out.dz  deps = gcczrule cuda_compilez  command = $nvcc --generate-dependencies-with-compile --dependency-output $out.d $cuda_cflags -c $in -o $out $cuda_post_cflags)zrule nvcc_linkz.  command = $nvcc -shared $in $ldflags -o $outr   )z	rule linkz%  command = $cxx $in $ldflags -o $outr   z.cuz.cuda.oz.ocuda_compilecompilezbuild z:  	nvcc_linklinkz.sozdefault 
)r3   r_   re   ry   r   r   r   r   rD   extendrP   FLASHINFER_JIT_DIRsuffixwith_suffixrz   r   rF   rT   r5   )rz   r{   r`   rf   r|   rY   r}   r1   r\   rc   rq   ldflagsenv_extra_ldflagscxxr%   lines
output_dirobjectssourceis_cudaobject_suffixcmdobj_nameobj	link_rule	output_sor   r   r   generate_ninja_build_for_op   sx   	









"
"

r   c                  C   s(   t jd} | d ur|  rt| S d S )NMAX_JOBS)r   r   r   isdigitr   )max_jobsr   r   r   _get_num_workers0  s   r   workdir
ninja_fileverbosec              
   C   s   | j ddd dddt|  dt| g}t }|d ur&|dt|g7 }tj  tj  ztj	||r8d ntj
tjt|  ddd W d S  tjyf } zd	}|jr]|d
|j 7 }t||d }~ww )NT)parentsexist_okninjaz-vz-Cz-fz-j)r,   r   cwdcheckr4   zNinja build failed.z Ninja output:
)mkdirr   rF   r   r   r,   flushr   r'   r(   PIPESTDOUTr:   outputr0   )r   r   r   commandnum_workersr   msgr   r   r   	run_ninja7  s:   





r   rA   )F)%	functoolsr   r7   r'   r   rJ   packaging.versionr   pathlibr   typingr   r   rL   r   r   r   rP   compilation_contextr	   r   r   r!   cacher3   r?   boolrB   rD   rX   r_   re   ry   r   r   r   r   r   r   r   r   <module>   s   





8




e