o
    5/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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 ee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   sd   t j| }|r0z
dd l}||W S  ty/ } ztd| | | W  Y d }~S d }~ww g S )Nr   z@Could not parse %s with shlex: %s. Falling back to simple split.)osenvirongetshlexsplit
ValueErrorloggerwarning)env_var_name	env_flagsr   e r   c/lsinfo/ai/hellotax_ai/llm_service/venv_vllm/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   
	
r1   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.)r1   r   r(   joinr%   check_outputrefindallr.   r   FileNotFoundErrorCalledProcessErrorr   versioncuda)r/   r#   txtmatchesr   r   r   r   get_cuda_versionC   s(   r=   version_strc                 C   s   t  t| kS N)r=   r   )r>   r   r   r   is_cuda_version_at_leastZ   s   r@   vsc                 C   s
   d | S )Nz $
    )r3   )rA   r   r   r   join_multiline^   s   
rB   r/   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>m   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_DIRrD   FLASHINFER_CSRC_DIRCUTLASS_INCLUDE_DIRSappendSPDLOG_INCLUDE_DIRremove)r/   system_includesr   r   r   get_system_includesb   s   	
rV   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 )rV   rH   get_config_varrR   r   rD   )r/   rW   rU   common_cflags	extra_dirsys_dirr   r   r   build_common_cflagsw   s   


r]   rZ   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   )rZ   r^   cflagsenv_extra_cflagsr   r   r   build_cflags   s   rc   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)r_   z--compiler-options=-fPICz--expt-relaxed-constexprz12.8z"-static-global-template-stub=falsec                 s   s    | ]}| d V  qdS )	-gencode=N
startswithrE   flagr   r   r   	<genexpr>   s    

z$build_cuda_cflags.<locals>.<genexpr>c                 S   s   g | ]	}| d s|qS )rf   rg   ri   r   r   r   rG      s
    
z%build_cuda_cflags.<locals>.<listcomp>FLASHINFER_EXTRA_CUDAFLAGS)	r   r   r   r=   r   r	   get_nvcc_flags_listanyr   )
rZ   rd   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   rw   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 
)r1   r]   rc   rw   r   r   r   r   rB   extendrN   FLASHINFER_JIT_DIRsuffixwith_suffixrx   r   rD   rR   r3   )rx   ry   r^   rd   rz   rW   r{   r/   rZ   ra   ro   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_workers4  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*   stderrcwdcheckr2   zNinja build failed.z Ninja output:
)mkdirr   rD   r   sysr*   flushr   r%   r&   PIPESTDOUTr8   outputr.   )r   r   r   commandnum_workersr   msgr   r   r   	run_ninja;  s:   





r   r?   )F))	functoolsloggingr   r5   r%   r   rH   packaging.versionr   pathlibr   typingr   r   rJ   r   r   r   rN   compilation_contextr	   	getLogger__name__r   r   r   r   cacher1   r=   boolr@   rB   rV   r]   rc   rw   r   r   r   r   r   r   r   r   <module>   s   






8




e