U
    zhږ                     @   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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mZmZmZ d dlZd dlmZmZ d dlmZmZmZmZmZmZmZ d dl m!Z! e" rd dl#m$Z$ d dl%m&Z&m'Z'm(Z(m)Z) n&d	d
 Z&dd Z'dd Z(e*dddZ)dZ+e
j,dZ-e
j,dZ.e
jdkZ/e0e1Z2e3de4e4dddZ5e4dddZ6e4dddZ7e*dddZ8e*dd d!Z9e*dd"d#Z:e*dd$d%Z;e3de*dd&d'Z<ee4 ee4 d(d)d*Z=ee4 ee4 d+d,d-Z>d.d/ Z?d0d1 Z@dud2d3ZAG d4d5 d5ZBdve*ee4 d7d8d9ZCdwe4ee4 d;d<d=ZDee4 dd>d?ZEee4 dd@dAZFe*ee4 dBdCdDZGdxe*e*ee4 dFdGdHZHG dIdJ dJeBZIee4 ddKdLZJee4 ddMdNZKee4 ddOdPZLee4 ddQdRZMe*e*dSdTdUZNej3e4ddVdWZOedXdYdZZPe*e*d[d\d]ZQd^d_ ZRd`da ZSe*ee4 dbdcddZTee*e*e*e*e*dedfdgZUG dhdi dieIZVdye*e*dkdldmZWG dndo doeVZXe*e*e4dpdqdrZYG dsdt dtZZdS )z    N)Path)ListSequenceTupleUnion)configexc)_get_python_include_dirs_LINKER_SCRIPT_transform_cuda_pathsget_lock_dirinvalid_vec_isaLOCK_TIMEOUTVecISA)	cache_dir)build_paths)log_global_cache_errorslog_global_cache_statslog_global_cache_valsuse_global_cachec                  O   s   d S N argskwargsr   r   M/var/www/html/venv/lib/python3.8/site-packages/torch/_inductor/cpp_builder.pyr   ,   s    r   c                  O   s   d S r   r   r   r   r   r   r   /   s    r   c                  O   s   d S r   r   r   r   r   r   r   2   s    r   returnc                   C   s   dS )NFr   r   r   r   r   r   5   s    r   ZCxxBuildlinuxdarwinwin32   )searchr   c                 C   s   | D ]}zz|d krlt jdkr W qtds.W qddlm} t }|tj|dt	d}| t
 }W 5 Q R X t|dg |W   S  tjttfk
r   Y qY qX qt d S )Nr   ZTORCH_INDUCTOR_INSTALL_GXXr   )FileLockzg++.lock)timeout	--version)sysplatformosgetenvfilelockr#   r   pathjoinr   install_gcc_via_conda
subprocesscheck_outputSubprocessErrorFileNotFoundErrorImportErrorr   ZInvalidCxxCompiler)r"   cxxr#   Zlock_dirlockr   r   r   cpp_compiler_searchE   s(    

 
r5   c               	   C   s   t jt d} t j| dd}t j|std t jdd}|dkrVt	
d}|dk	rtj|dd	|  d
ddddgtjd |S )z>On older systems, this is a quick way to get a modern compilerZgccbinzg++zDownloading GCC via condaZ	CONDA_EXEcondaNcreatez	--prefix=z--channel=conda-forgez--quietz-yz
python=3.8Zgxx)stdout)r(   r+   r,   r   existsloginfoenvirongetshutilwhichr.   
check_callPIPE)prefixZcxx_pathr7   r   r   r   r-   `   s*    


r-   c                  C   sZ   t rtjdd} nBt r$t S ttj	j
ttfrDttj	j
}n
tj	j
f}t|} | S )NCXXcl)_IS_WINDOWSr(   r=   r>   r   	is_fbcoder   cc
isinstancecppr3   listtupler5   )compilerr"   r   r   r   _get_cpp_compilerz   s    
rN   c                 C   s   t td| S )Nz(gcc|g\+\+))boolrer"   cpp_compilerr   r   r   _is_gcc   s    rS   c                   C   s
   t t S r   )rS   rN   r   r   r   r   is_gcc   s    rT   c                 C   s"   t jdkrt| S ttd| S )Nr   z(clang|clang\+\+))r&   r'   is_apple_clangrO   rP   r"   rQ   r   r   r   	_is_clang   s    
rV   c                  C   s   t  } t| S r   )rN   rV   )rM   r   r   r   is_clang   s    rW   c                 C   s$   t | dgd}d| d kS )Nr%   utf8ZAppler   )r.   r/   decode
splitlines)rR   version_stringr   r   r   rU      s    rU   )	dest_listsrc_listc                 C   s   |D ]}|  t| qd S r   )appendcopydeepcopy)r\   r]   itemr   r   r   _append_list   s    rb   )	orig_listr   c                 C   s$   g }| D ]}||kr| | q|S r   r^   )rc   Znew_listra   r   r   r   _remove_duplication_in_list   s
    re   c              
   C   sd   t j| s`zt| jddd W n< tk
r^ } z|jtjkrNtd|  W 5 d }~X Y nX d S )NT)parentsexist_okzFail to create path )	r(   r+   r:   r   mkdirOSErrorerrnoEEXISTRuntimeError)path_dirr   r   r   r   _create_if_dir_not_exist   s    rn   c                 C   sx   t j| rtt j| ddD ]N\}}}|D ]}t j||}t | q(|D ]}t j||}t | qJqt |  d S )NF)topdown)r(   r+   r:   walkr,   removermdir)rm   rootdirsfilesname	file_pathZdir_pathr   r   r   _remove_dir   s    rx   c              
   C   s   t | }ztj||tjd}W nh tjk
r } zH|jd}d|kpNd|k}|rjtj	dkrjd}||7 }t
|||W 5 d }~X Y nX |S )N)r   cwdstderrzutf-8z'omp.h' file not foundZlibompr   a  

OpenMP support not found. Please try one of the following solutions:
(1) Set the `CXX` environment variable to a compiler other than Apple clang++/g++ that has builtin OpenMP support;
(2) install OpenMP via conda: `conda install llvm-openmp`;
(3) install libomp via brew: `brew install libomp`;
(4) manually setup OpenMP and set the `OMP_PREFIX` environment variable to point to a path with `include/omp.h` under it.)shlexsplitr.   r/   STDOUTCalledProcessErroroutputrY   r&   r'   r   ZCppCompileError)Zcmd_linery   cmdstatuser   Zopenmp_problemZinstructionr   r   r   run_command_line   s    
	 r   c                   @   s   e Zd ZdZddddZdd Zeddd	Zee dd
dZ	ee dddZ
ee dddZee dddZee dddZee dddZee dddZedddZedddZedddZdS )BuildOptionsBasez
    This is the Base class for store cxx build options, as a template.
    Acturally, to build a cxx shared library. We just need to select a compiler
    and maintains the suitable args.
    Nr   c                 C   sF   d| _ g | _g | _g | _g | _g | _g | _g | _d| _d| _	d| _
d S )N F)	_compiler_definations_include_dirs_cflags_ldflags_libraries_dirs
_libraries_passthough_args	_aot_mode_use_absolute_path_compile_onlyselfr   r   r   __init__   s    zBuildOptionsBase.__init__c                 C   sX   t | j| _t | j| _t | j| _t | j| _t | j| _t | j| _t | j| _d S r   )re   r   r   r   r   r   r   r   r   r   r   r   _remove_duplicate_options   s    z*BuildOptionsBase._remove_duplicate_optionsc                 C   s   | j S r   )r   r   r   r   r   get_compiler   s    zBuildOptionsBase.get_compilerc                 C   s   | j S r   )r   r   r   r   r   get_definations   s    z BuildOptionsBase.get_definationsc                 C   s   | j S r   )r   r   r   r   r   get_include_dirs  s    z!BuildOptionsBase.get_include_dirsc                 C   s   | j S r   )r   r   r   r   r   
get_cflags  s    zBuildOptionsBase.get_cflagsc                 C   s   | j S r   )r   r   r   r   r   get_ldflags  s    zBuildOptionsBase.get_ldflagsc                 C   s   | j S r   )r   r   r   r   r   get_libraries_dirs
  s    z#BuildOptionsBase.get_libraries_dirsc                 C   s   | j S r   )r   r   r   r   r   get_libraries  s    zBuildOptionsBase.get_librariesc                 C   s   | j S r   )r   r   r   r   r   get_passthough_args  s    z$BuildOptionsBase.get_passthough_argsc                 C   s   | j S r   )r   r   r   r   r   get_aot_mode  s    zBuildOptionsBase.get_aot_modec                 C   s   | j S r   )r   r   r   r   r   get_use_absolute_path  s    z&BuildOptionsBase.get_use_absolute_pathc                 C   s   | j S r   )r   r   r   r   r   get_compile_only  s    z!BuildOptionsBase.get_compile_only)__name__
__module____qualname____doc__r   r   strr   r   r   r   r   r   r   r   r   rO   r   r   r   r   r   r   r   r      s   	r   T)warning_allr   c                 C   s   t s| rdgS g S g S d S )NZWallrF   )r   r   r   r   _get_warning_all_cflag  s    r   c++17)std_numr   c                 C   s    t rd|  gS d|  gS d S )Nzstd:zstd=r   )r   r   r   r   _get_cpp_std_cflag$  s    r   c                 C   s*   t s"ddg}t| r|d |S g S d S )NzWno-unused-variablezWno-unknown-pragmasz$Werror=ignored-optimization-argument)rF   rV   r^   )rR   cflagsr   r   r   _get_linux_cpp_cflags+  s    
r   c                  C   s   t r
dgS tjjrddgnddg} | d | d tjjsH| d tjjsZ| d	 t rf| S t	j
d
kr|| d n"t
 dkr| d n
| d t s| d | S d S )NZO2ZO0gZO3ZDNDEBUGz
ffast-mathzfno-finite-math-onlyzfno-unsafe-math-optimizationszffp-contract=offr   ZXclangppc64lezmcpu=nativezmarch=nativefopenmp)rF   r   Zaot_inductorZdebug_compiler^   rJ   Zenable_unsafe_math_opt_flagZ#enable_floating_point_contract_flagrG   r&   r'   machine)r   r   r   r   _get_optimization_cflags5  s&    






r   )compile_onlyr   c                 C   sB   t rdg}n2| rdgS t dkr6dt kr6dddgS ddgS |S )NZDLLZfPICDarwinZclangsharedzundefined dynamic_lookup)rF   r'   systemrN   )r   ZSHARED_FLAGr   r   r   _get_shared_cflagY  s    
r   r   )r   r   extra_flagsc                 C   sb   g }g }g }g }g }g }	g }
t |t  t| t  t|  }|
d| ||||||	|
fS )N )r   r   r   r   r   r^   r,   )rR   r   r   r   definationsinclude_dirsr   ldflagslibraries_dirs	librariespassthough_argsr   r   r   get_cpp_optionsh  s4    r   c                       s4   e Zd ZdZd	eeee edd fddZ  ZS )

CppOptionsaH  
    This class is inherited from BuildOptionsBase, and as cxx build options.
    This option need contains basic cxx build option, which contains:
    1. OS related args.
    2. Toolchains related args.
    3. Cxx standard related args.
    Note:
    1. This Options is good for assist modules build, such as x86_isa_help.
    Tr   FN)r   r   r   use_absolute_pathr   c                    s   t    t | _|| _|| _t| j|||d\}}}}}	}
}t| j| t| j	| t| j
| t| j| t| j|	 t| j|
 t| j| |   d S )N)rR   r   r   r   )superr   rN   r   r   r   r   rb   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   	__class__r   r   r     s4    

zCppOptions.__init__)Tr   F)	r   r   r   r   rO   r   r   r   __classcell__r   r   r   r   r     s      r   c                   C   s"   t sdtttjj gS g S d S )Nz-D_GLIBCXX_USE_CXX11_ABI=)rF   r   inttorchZ_CZ_GLIBCXX_USE_CXX11_ABIr   r   r   r   _get_glibcxx_abi_build_flags  s    r   c                   C   s   dgS )NZTORCH_INDUCTOR_CPP_WRAPPERr   r   r   r   r   !_get_torch_cpp_wrapper_defination  s    r   c                   C   s   dgS )Nz" C10_USING_CUSTOM_GENERATED_MACROSr   r   r   r   r   _use_custom_generated_macros  s    r   c                  C   s6   t s.t r(dddg} d}| | | S g S ng S d S )NZC10_USE_GLOGZC10_USE_MINIMAL_GLOGZ$C10_DISABLE_TENSORIMPL_EXTENSIBILITYZ#AOTI_USE_CREATE_TENSOR_FROM_BLOB_V1)rF   r   rG   r^   )Zfb_internal_macrosZcreate_tensor_from_blob_v1r   r   r   _use_fb_internal_macros  s    
r   )aot_moder   c                 C   s  g }g }g }t r|||fS t r|d |t  |t  |t  |t  |t	  |t
  |t  |d |r|st}ntjt}t| r|d |d |d|  |dt   |dt   |||fS )NZnostdincincludez --rtlib=compiler-rtz -fuse-ld=lldz -Wl,--script=z -Bz -L)rF   r   rG   r^   r   sleefZ
cc_includeZlibgccZlibgcc_archZlibgcc_backwardglibcZlinux_kernelr
   r(   r+   basenamerV   Z	glibc_lib)rR   r   r   r   r   r   Zlinker_scriptr   r   r   _setup_standard_sys_libs  s2    






r   c               	   C   sN   ddl m}  tttjjd }| }| }| |d\}}W 5 Q R X |S )Nr   )writezcodegen/cpp_prefix.hh)torch._inductor.codecacher   r   __file__parentopenread)r   r+   fcontent_filenamer   r   r   _cpp_prefix_path	  s    
r   )vec_isac                 C   sz   g }g }| t kr8|  D ]}|t| q|  g}t rr| t krrt| 	 }d| d| d| dg}||fS )NzCPU_CAPABILITY=ZCPU_CAPABILITY_ZHAVE_Z_CPU_DEFINITION)
r   Zbuild_macror^   r_   r`   Zbuild_arch_flagsr   rG   r   upper)r   macrosbuild_flagsxcapr   r   r   _get_build_args_of_chosen_isa  s    

r   include_pytorchr   c              	   C   s   ddl m}m} tj|dtj|dddddtj|ddtj|ddg}|g}g }tjd	krt	 sdd
g}|s|
d tr|
d tjs|
d |
| |||fS )Nr   )_TORCH_PATHTORCH_LIB_PATHr   r   ZcsrcapiZTHZTHCr   Z	torch_cpuZtorch_pythonr   Zc10)Ztorch.utils.cpp_extensionr   r   r(   r+   r,   r&   r'   r   rG   r^   rF   Zabi_compatible)r   r   r   r   r   r   r   r   r   r   _get_torch_related_args,  s$    



r   c                  C   s|   t  } tjdtrdndd}|d k	r.| | trRtjtj	}tj
|dg}ntdg}t rt| t  | |fS )Nr   ntposix_prefix)schemelibsLIBDIR)r	   	sysconfigget_pathrF   r^   r(   r+   dirnamer&   
executabler,   get_config_varr   rG   r   python)python_include_dirsZpython_include_pathZpython_pathZpython_lib_pathr   r   r   _get_python_related_argsI  s     

r   c                 C   s  g }g }g }g }g }g }t rxddlm}m} t|  }	td}
|
d k	rtj|
dd}tj	|}|r|
tj|
d |
tj|
d n
td |	p|}	|	s|
d td	}|	s8|d k	r8| }	|	r8tj|d}|
tj|d |
| t jd
kr8tj	tj|dr8|
d |	s| \}	}|	r|
tj|d |
tj|d ntr|
d g }ntt r|
t  t }d| }|
| |
d n4t| r|
d |
d n|
d |
d ||||||fS )Nr   )homebrew_libompis_conda_llvm_openmp_installedZ
OMP_PREFIXr   zomp.hlibz-environment variable `OMP_PREFIX` is invalid.ZompZCONDA_PREFIXx86_64zlibiomp5.dylibZiomp5openmpz-Wp,-fopenmp r   Zgomp)	_IS_MACOSr   r   r   rU   r(   r)   r+   r,   r:   r^   warningswarnunamer   rF   r   rG   r   r   
openmp_librV   )rR   r   r   Zinclude_dir_pathsZlib_dir_pathsr   r   r   r   Zomp_availableZ
omp_prefixZheader_pathZ	valid_envZconda_prefixZconda_lib_pathZlibomp_pathr  Zfb_openmp_extra_flagsr   r   r   _get_openmp_args]  sf    















r  )use_mmap_weightsr   c                 C   s   g }| r| d |S )Nz USE_MMAP_SELFrd   )r  r   r   r   r   get_mmap_self_macro  s    
r  )r   r   r   r   r   r  c           #      C   s   g }g }g }	g }
g }g }g }t  }t }t| ||\}}}t|\}}t||d\}}}t \}}t| \}}}}}}t } t }!t	|}"|| | |! |" }|| | | }|| }	|}
|| | }|| }|| |  | }|||	|
|||fS )Nr   )
r   r   r   r   r   r   r  r   r   r  )#rR   r   r   r   r   r   r  r   r   r   r   r   r   r   Ztorch_cpp_wrapper_definationsZ'use_custom_generated_macros_definationsZsys_libs_cflagsZsys_libs_include_dirsZsys_libs_passthough_argsZ
isa_macrosZisa_ps_args_build_flagstorch_include_dirstorch_libraries_dirstorch_librariesr   Zpython_libraries_dirsZ
omp_cflagsZomp_ldflagsZomp_include_dir_pathsZomp_lib_dir_pathsZomp_libZomp_passthough_argsZcxx_abi_passthough_argsZfb_macro_passthough_argsZmmap_self_macrosr   r   r   get_cpp_torch_options  s    	


	r  c                       s>   e Zd ZdZd	eeeeeeeeee dd
 fddZ  Z	S )
CppTorchOptionsaf  
    This class is inherited from CppTorchOptions, which automatic contains
    base cxx build options. And then it will maintains torch related build
    args.
    1. Torch include_directories, libraries, libraries_directories.
    2. Python include_directories, libraries, libraries_directories.
    3. OpenMP related.
    4. Torch MACROs.
    5. MISC
    FTr   N)
r   r   r   r   r   r   r  r   r   r   c
              	      s   t  j|||	|d || _t| j||||||d\}
}}}}}}|rLg }g }t| j|
 t| j| t| j| t| j	| t| j
| t| j| t| j| |   d S )N)r   r   r   r   )rR   r   r   r   r   r   r  )r   r   r   r  r   rb   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r  r   r   Ztorch_definationsr  Ztorch_cflagsZtorch_ldflagsr  r  Ztorch_passthough_argsr   r   r   r     sF    
zCppTorchOptions.__init__)FTFFFFTr   
r   r   r   r   r   rO   r   r   r   r   r   r   r   r   r	    s*           r	  Fcudar   c                 C   s  g }g }g }g }g }g }g }t  rFdtjkrFdtjkrFt tjd< ddlm}	 |	| }|		| }| r|
tjjrzdnd tjjd k	rt  r|dg7 }q|dd	g7 }|
d
 n6t  r|dg7 }n"t  r|dg7 }n|dddg7 }|r*tjt  g}
||
7 }| r*tjjd kr*t| t  rttjjd k	r\|
tjt d n|
tjt d |r| rt  rtjjd krdg}|||||||fS )NZ	CUDA_HOMEZ	CUDA_PATHr   )cpp_extensionz	 USE_ROCMz	 USE_CUDAZamdhip64Zc10_hipZ	torch_hipz __HIP_PLATFORM_AMD__r  Zc10_cudaZ
torch_cudar   z*-Wl,-Bstatic -lcudart_static -Wl,-Bdynamic)r   rG   r(   r=   r   r  Ztorch.utilsr  Zinclude_pathsZlibrary_pathsr^   r   versionZhipr+   r   r   r   r,   Zrocm)r  r   r   r   r   r   r   r   r   r  Zcpp_prefix_include_dirr   r   r   get_cpp_torch_cuda_optionsL  sb    


r  c                       s>   e Zd ZdZd	eeeeeeeeee dd
 fddZ  Z	S )
CppTorchCudaOptionsz
    This class is inherited from CppTorchOptions, which automatic contains
    base cxx build options and torch common build options. And then it will
    maintains cuda device related build args.
    FTr   N)
r   r   r  r   r   r   r  r   r   r   c
              	      s   t  j|||||||	d g }
g }g }g }g }g }g }t||d\}
}}}}}}|r\g }g }t| j|
 t| j| t| j| t| j| t| j| t| j	| t| j
| |   d S )N)r   r   r   r   r   r  r   r  )r   r   r  rb   r   r   r   r   r   r   r   r   )r   r   r   r  r   r   r   r  r   r   Zcuda_definationsZcuda_include_dirsZcuda_cflagsZcuda_ldflagsZcuda_libraries_dirsZcuda_librariesZcuda_passthough_argsr   r   r   r     sH    


zCppTorchCudaOptions.__init__)FTFFFFTr   r
  r   r   r   r   r    s*   	        r  )r   r   rw   c                 C   sD   t j|}t j|\}}t j|}t r<| r8|r<d}||fS )N.)r(   r+   r   splitextr   r   rG   )r   r   rw   Zname_and_extrv   extdirr   r   r   &get_name_and_dir_from_output_file_path  s    r  c                   @   s   e Zd ZdZedddZedddZdeeeee f e	edd	d
dZ
edddZdd Zdd Zeeef dddZdS )
CppBuildera  
    CppBuilder is a cpp jit builder, and it supports both Windows, Linux and MacOS.
    Args:
        name:
            1. Build target name, the final target file will append extension type automatically.
            2. Due to the CppBuilder is supports mutliple OS, it will maintains ext for OS difference.
        sources:
            Source code file list to be built.
        BuildOption:
            Build options to the builder.
        output_dir:
            1. The output_dir the taget file will output to.
            2. The default value is empty string, and then the use current dir as output dir.
            3. Final target file: output_dir/name.ext
    r   c                 C   s   t rdnd}|S )Nz.dllz.sor   )r   ZSHARED_LIB_EXTr   r   r   get_shared_lib_ext  s    zCppBuilder.get_shared_lib_extc                 C   s   t rdnd}|S )Nz.objz.or   )r   ZEXTr   r   r   get_object_ext  s    zCppBuilder.get_object_extr   N)rv   sourcesBuildOption
output_dirr   c                 C   s  d| _ d| _d| _d| _d| _d| _d| _d| _d| _d| _	d| _
|| _| | _ | | _
t|dkrtjtjt| _n|| _| | _| jr|  n|  }tj| j| j | | _	t|tr|g}t r| r| j
s|}ndd |D }tj| j	| _	d|| _nd|| _|  D ]:}t!rR|  jd| d7  _n|  jd| d7  _q0|" D ]:}t!r|  jd	| d7  _n|  jd
| d7  _qt|# D ]:}	t!r|  jd|	 d7  _n|  jd|	 d7  _q|$ D ]:}
t!r|  jd|
 d7  _n|  jd|
 d7  _q|% D ]:}t!rb|  jd| d7  _n|  jd| d7  _q@|& D ]:}t!r|  jd| d7  _n|  jd| d7  _q|' D ]}|  j| d7  _qd S )Nr   Fr   c                 S   s   g | ]}t j|qS r   )r(   r+   r   ).0ir   r   r   
<listcomp>"  s     z'CppBuilder.__init__.<locals>.<listcomp>r   /-z/D z-D z/I z-Iz
/LIBPATH:"z" z-L"z.lib" z-l)(r   _cflags_args_definations_args_include_dirs_args_ldflags_args_libraries_dirs_args_libraries_args_passthough_parameters_args_output_dir_target_filer   _namer   r   lenr(   r+   r   abspathr   r   r   r  r  r,   rI   r   r   rG   r   r   _sources_argsr   rF   r   r   r   r   r   r   )r   rv   r  r  r  Zfile_extZinp_nameZcflagZ
definationinc_dirZldflaglib_dirr   Zpassthough_argr   r   r   r     sp    




zCppBuilder.__init__c                    s@    fdd}| j  j j j j j j j j j	d
}|S )Nc
                    s   t rR|  d| d| d| d| d| d|	 d| d| d| d}
|
dd}
nd jr\dnd}tddd	|  d| d| d| d| d	| d| d| d| d| d
|	 d	 }
|
S )Nr   z /LD /Fez /link \r  z-cr   z[ \n]+z
                    z -o )rF   replacer   rP   substrip)rM   r  include_dirs_argsdefinations_argscflags_argsldflags_argslibraries_argslibraries_dirs_argspassthougn_argstarget_filer   Zcompile_only_argr   r   r   format_build_commandQ  sB    >z9CppBuilder.get_command_line.<locals>.format_build_command)
rM   r  r5  r6  r7  r8  r9  r:  r;  r<  )
r   r.  r$  r#  r"  r%  r'  r&  r(  r*  )r   r=  Zcommand_liner   r   r   get_command_lineP  s     zCppBuilder.get_command_linec                 C   s   | j S r   )r*  r   r   r   r   get_target_file_path  s    zCppBuilder.get_target_file_pathc                 C   s4   | j }| j| j | j }| j| j | j }|||fS r   )r$  r"  r#  r(  r%  r'  r&  )r   r   r   r   r   r   r   convert_to_cpp_extension_args  s    z(CppBuilder.convert_to_cpp_extension_argsc                 C   sT   t | j tj| j| j dt }t | |  }t||d}t	| || j
fS )z
        It is must need a temperary directory to store object files in Windows.
        After build completed, delete the temperary directory to save disk space.
        r   )ry   )rn   r)  r(   r+   r,   r+  _BUILD_TEMP_DIRr>  r   rx   r*  )r   Z_build_tmp_dirZ	build_cmdr   r   r   r   build  s    
 zCppBuilder.build)r   )r   r   r   r   r   r  r  r   r   r   r   r>  r?  r@  r   r   rB  r   r   r   r   r    s   	 ]/r  )N)T)r   )Tr   )F)[r_   rj   	functoolsloggingr(   r'   rP   r{   r?   r.   r&   r   r   pathlibr   typingr   r   r   r   r   Ztorch._inductorr   r   r   r	   r
   r   r   r   r   r   Z%torch._inductor.runtime.runtime_utilsr   rG   Z	triton.fbr   Ztorch._inductor.fb.utilsr   r   r   r   rO   rA  
startswithZ	_IS_LINUXr   rF   	getLoggerr   r;   	lru_cacher   r5   r-   rN   rS   rT   rV   rW   rU   rb   re   rn   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r	  r  r  r  r  r   r   r   r   <module>   s   $	



A
$  #0%R	UAD>  