
    pi=                       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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 d dlmZ d dlmZ d dlmZmZmZ d dlZd dlmZ d dl m!Z!m"Z" d d	l#m$Z$m%Z% d d
l&m'Z' d dl(m)Z)  e!jT                         rd dl+m,Z,m-Z- d dl.m/Z/m0Z0m1Z1m2Z2 n$dededdfdZ/dededdfdZ0dededdfdZ1de3fdZ2dZ4ejj                  jm                  e7      Z8ejj                  js                  ejj                  js                  e8            Z:ejj                  jw                  e:d      Z<ej                  j{                  d      Z>ej                  j{                  d      Z?ej                  dk(  Z@e@rdndZA ej                  eC      ZD ej                  d      deFdeFfd       ZGdeFfdZHej                  d eFddfd!       ZJ G d" d#      ZKej                  d eFddfd$       ZLdeFfd%ZMd&e3deNeFeFf   fd'ZOd(eFd)eFd*eFd+eFdeFf
d,ZPej                  d-eFde3fd.       ZQej                  d-eFde3fd/       ZRej                  d-eFde3fd0       ZSej                  d-eFde3fd1       ZTej                  d-eFde3fd2       ZUej                  de3fd3       ZVej                  de3fd4       ZWej                  de3fd5       ZXej                  de3fd6       ZYej                  de3fd7       ZZej                  d eFdeFfd8       Z[d9e\eF   d:e\eF   ddfd;Z]d<e\eF   de\eF   fd=Z^d>eFddfd?Z_d>eFddfd@Z`dAeFdBeFddfdCZadAeFdBeFddfdDZbdEeFdeFfdFZc G dG dH      ZdddIe3de\eF   fdJZeddKeFde\eF   fdLZfd-eFde\eF   fdMZgd-eFde\eF   fdNZhde\eF   fdOZideNe\eF   e\eF   f   fdPZj	 dd-eFdQe3deNe\eF   e\eF   f   fdRZkdSe3de\eF   fdTZl	 	 	 dd-eFdSe3dIe3dUeeF   dQe3deNe\eF   e\eF   e\eF   e\eF   e\eF   e\eF   e\eF   f   fdVZm G dW dXed      Znde\eF   fdYZode\eF   fdZZpde\eF   fd[Zqd-eFd\e3d&e3deNe\eF   e\eF   e\eF   f   fd]Zrd^e%deNe\eF   e\eF   f   fd_Zsd`e3d\e3deNe\eF   e\eF   e\eF   f   fdaZtde\eF   fdbZudeNe\eF   e\eF   f   fdcZvej                  de3fdd       Zwej                  deNe3eFf   fde       Zxej                  d-eFdfeFddfdg       Zyej                  d-eFddfdh       Zzd-eFdeNe\eF   e\eF   e\eF   e\eF   e\eF   e\eF   f   fdiZ{deNe\eF   e\eF   f   fdjZ|dke3de\eF   fdlZ}d-eFd^e%d`e3d\e3d&e3dke3deNe\eF   e\eF   e\eF   e\eF   e\eF   e\eF   e\eF   f   fdmZ~ G dn doen      ZddpZ ej                  dq      dreFdee   fds       Zdte\eF   ddfduZ	 	 ddveFd\e3dwe3deNe\eF   e\eF   e\eF   e\eF   e\eF   e\eF   e\eF   f   fdxZ G dy dze      Zd{eFdeNeFeFf   fd|Z G d} d~      ZdeFdeFdBeFddfdZy)    N)Sequence)cdllwintypes)find_library)Path)AnyOptionalUnion)dynamo_timed)configexc)invalid_vec_isaVecISA)	cache_dir)TorchVersion)_run_build_commandbuild_paths)log_global_cache_errorslog_global_cache_statslog_global_cache_valsuse_global_cacheargskwargsreturnc                       y N r   r   s     ]/opt/services/ai/voice_agent/venv/lib/python3.12/site-packages/torch/_inductor/cpp_builder.pyr   r   .           c                       y r   r   r   s     r   r   r   1   r    r!   c                       y r   r   r   s     r   r   r   4   r    r!   c                       y)NFr   r   r!   r   r   r   7   s    r!   CxxBuildz_inductor/script.ldlinuxdarwinwin32)utf-8r      searchc                    ddl m}m} | D ]  }	 |tt        j                  dk7  rt        j                  d      s0ddlm}  |       } |t
        j                  j                  |d      |      }|5  t               }d d d        t        j                  |dg       |c S  t"        j$                  # 1 sw Y   5xY w# t        j                  t        t         f$ r Y w xY w)	Nr   )get_lock_dirLOCK_TIMEOUTr&   TORCH_INDUCTOR_INSTALL_GXX)FileLockzg++.lock)timeout	--version)torch._inductor.codecacher-   r.   sysplatformosgetenvtorch.utils._filelockr0   pathjoininstall_gcc_via_conda
subprocesscheck_outputSubprocessErrorFileNotFoundErrorImportErrorr   InvalidCxxCompiler)r+   r-   r.   cxxr0   lock_dirlocks          r   cpp_compiler_searchrE   L   s    D 	{ <<7*yy!=>:'>GGLL:6  2/1C2##S+$67J', 
 
  2 2 **,={K 		s3   B=B=7B=2B1= B=1B:	6B==CCc            
         t         j                  j                  t               d      } t         j                  j                  | dd      }t         j                  j	                  |      s~t
        j                  d       t         j                  j                  dd      }|t        j                  d      }|0t        j                  |dd|  d	d
dddgt        j                         |S )z>On older systems, this is a quick way to get a modern compilergccbinzg++zDownloading GCC via conda	CONDA_EXEcondacreatez	--prefix=z--channel=conda-forgez--quietz-yz
python=3.8gxx)stdout)r6   r9   r:   r   existsloginfoenvirongetshutilwhichr<   
check_callPIPE)prefixcxx_pathrJ   s      r   r;   r;   i   s    WW\\)+u-Fww||FE51H77>>(#,-

{G4=LL)E!!x(+ 	 " Or!   compilerc                     	 t        j                  | dgt         j                         y# t        $ r}t	        d|  d      |d}~wt         j
                  $ r Y yw xY w)zU
    Check if compiler is ready, in case end user not activate MSVC environment.
    /helpstderrz
Compiler: z is not found.N)r<   r=   STDOUTr?   RuntimeErrorr>   )rY   r   s     r   check_compiler_exist_windowsr`      sZ    
7 3J<M<MN KZz@AsJ%% s   '* 	AAAAc                   8    e Zd ZdeddfdZddZddZdefdZy)	WinPeFileVersionInfo	file_pathr   Nc                     || _         t        j                  d      | _        | j	                          | j                          y )Nzversion.dll)rc   ctypesWinDLLversion_dll_setup_functions_get_version_info)selfrc   s     r   __init__zWinPeFileVersionInfo.__init__   s2    "!==7 r!   c                    t         j                  t         j                  g| j                  j                  _        t         j                  | j                  j                  _        t         j                  t         j                  t         j                  t         j                  g| j                  j                  _        t         j                  | j                  j                  _        t         j                  t         j                  t        j                  t        j                        t        j                  t         j                        g| j                  j                   _        t         j                  | j                  j                   _        y r   )r   LPCWSTRLPDWORDrg   GetFileVersionInfoSizeWargtypesDWORDrestypeLPVOIDGetFileVersionInfoWBOOLLPCVOIDre   POINTERc_void_pUINTVerQueryValueWrj   s    r   rh   z%WinPeFileVersionInfo._setup_functions   s    =
009 <D>>008 NNNNOO	9
,,5 8@}},,4 NN6??+NN8==)	4
''0 3;--''/r!   c                    t        j                         }| j                  j                  | j                  t        j                  |            }|dk(  rt        d| j                   d      t        j                  |      | _	        | j                  j                  | j                  d|| j                        }|st        d| j                   d      y )Nr   zCan't get version info size of .zCan't get version info of )r   rq   rg   ro   rc   re   byrefr_   create_string_bufferversion_infort   )rj   dummysizesuccesss       r   ri   z&WinPeFileVersionInfo._get_version_info   s     77NNFLL/
 19!@@PPQRSS"77=""66NNAtT%6%6
 !;DNN;K1MNN r!   c                 d   t        j                         }t        j                         }| j                  j                  | j                  dt        j                  |      t        j                  |            }|r|j                  dk(  ryg }d}|j                  t        |j                  dz        D ]o  }|dz  }t        j                  |j                  |z   d      }t        j                  |d d d      }t        j                  |dd d      }	|j                  ||	f       q |S t        d       |S )Nz\VarFileInfo\Translationr         littlezBuffer is None)re   rx   r   ry   rg   rz   r   r~   valuerange	string_atint
from_bytesappendprint)
rj   	lp_bufferu_lenr   translationslang_idioffsetdata	code_pages
             r   get_language_idz$WinPeFileVersionInfo.get_language_id   s   OO%	""11'LL#LL	
 %++*??&5;;!+, :Q''	&(@!D..bq8<NN4!9h?	##Wi$89:  "#r!   r   N)	__name__
__module____qualname__strrk   rh   ri   r   r   r   r!   r   rb   rb      s-    !# !$ !@.O" r!   rb   c                    dt         t        t        f   fd}t        |       syt        j
                  j                  |       r| }n |       \  }}|du ryt        |      }|j                         }|dk7  rt        d      y)z
    Torch.compile() is only work on MSVC with English language pack well.
    Check MSVC's language pack: https://github.com/pytorch/pytorch/issues/157673#issuecomment-3051682766
    r   c            	         t         j                  j                  t         j                  j	                  dd      ddd      } t         j                  j                  |       s`t         j                  j                  t         j                  j	                  dd      ddd      } t         j                  j                  |       sy	 | d	d
ddddddg	}t        j                  |dd      j                         }|syt         j                  j                  |ddd      }t         j                  j                  |      syt        j                  |      D cg c]A  }t         j                  j                  t         j                  j                  ||            r|C }}|syt        |d      d   }t         j                  j                  ||dddd      }t         j                  j                  |      rd|fS t         j                  j                  ||dddd      }t         j                  j                  |      rd|fS 	 yc c}w # t        j                  t        f$ r Y yw xY w)z=
        Finds the path to cl.exe using vswhere.exe.
        zProgramFiles(x86)zC:\Program Files (x86)zMicrosoft Visual Studio	Installerzvswhere.exeProgramFileszC:\Program FilesF z-latestz-prereleasez	-products*z	-requiresz1Microsoft.VisualStudio.Component.VC.Tools.x86.x64z	-propertyinstallationPathTr)   )textencodingVCToolsMSVC)reverser   rH   HostX64x64zcl.exeHostX86x86)r6   r9   r:   rQ   rR   rN   r<   r=   striplistdirisdirsortedCalledProcessErrorr?   )vswhere_pathcmdvs_install_pathmsvc_tools_pathdtoolset_versionslatest_toolset_versioncl_paths           r   get_msvc_cl_pathz3check_msvc_cl_language_id.<locals>.get_msvc_cl_path   s!    ww||JJNN.0IJ%	
 ww~~l+77<<

~/BC)	L 77>>,/ <	 C"
C )55$eg  #  !ggll?D'6RO77>>/2 
 O4 77==oq!AB    
 $ %+,<d%KA%N" ggll&G ww~~g&W}$ '',,#* 77>>'*=( + I B --/@A 		s@   3H> 5AH> 7H> AH9H> AH> 0AH> 9H> >IINFi	  znTorch.compile() is only support MSVC with English language pack,Please reinstall its language pack to English.)
tupleboolr   _is_msvc_clr6   r9   rN   rb   r   r_   )rY   r   cl_exe_pathb_retr   r   s         r   check_msvc_cl_language_idr      s    ReD#I. Rh x 	ww~~h-/{E>'4L**,G$=
 	
 r!   c                     t         rCt        j                  j                  dd      } t	        |       } t        |        t        |        | S t        j                         rt        j                  S t        t        j                  j                  t        t        f      r$t        t        j                  j                        }nt        j                  j                  f}t!        |      } | S )NCXXcl)_IS_WINDOWSr6   rQ   rR   normalize_path_separatorr`   r   r   	is_fbcoder   cc
isinstancecpprB   listr   rE   )rY   r+   s     r   get_cpp_compilerr   N  s    ::>>%.+H5$X.!(+ O >>!fjjnntUm46::>>*Fjjnn&F&v.Or!   use_relative_pathc                     t         rt        d      t        j                         r6t        j
                  }| rt        j                  nt        j                  }||fS d}d}||fS )NzWindows is not supported yet.ldobjcopy)r   r_   r   r   r   r   objcopy_fallbackr   )r   r   r   s      r   get_ld_and_objcopyr   _  sf    :;;B % ,, ((  w; BGw;r!   
cubin_filekernel_namer   r   c                    | dz   }| d| d|  }t        j                  |j                         ddd       | d| }t        j                  |j                         ddd       t        j                  dd|       }|d	| d
| dz   d| d| dz   d| d| dz   |z   }t        j                  |j                         ddd       |S )N.oz  -r -b binary -z noexecstack -o  T)capture_outputr   checkzB --rename-section .data=.rodata,alloc,load,readonly,data,contents z[\W]_z --redefine-sym _binary_z	_start=__z_start z--redefine-sym _binary_z_size=__z_size z_end=__z_end )r<   runsplitresub)r   r   r   r   obj_filer   	file_names          r   convert_cubin_to_objr   p  s     D HD0
!J<
HCNN399;t$dKIWX`Wa
bCNN399;t$dK wZ0I$YKyW
M	N#I;h{m6
J	K $I;gk]%
H	I 		  NN399;t$dKOr!   cpp_compilerc                 x    t        j                  | dg      j                  d      }d|j                         d   v S )Nr2   utf8Appler   )r<   r=   decode
splitlines)r   version_strings     r   _is_apple_clangr     s<    ,,lK-HIPPQWXNn//1!444r!   c                    t         j                  dk(  rt        |       S t        r@t	        j
                  d|       rt        d      t        t	        j
                  d|             S t        t	        j
                  d|             S )Nr'   z((clang$)|(clang\+\+$))z]Please use clang-cl, due to torch.compile only support MSVC-like CLI (compiler flags syntax).z
(clang-cl)z(clang|clang\+\+))r4   r5   r   r   r   r+   r_   r   r   s    r   	_is_clangr     sl     ||x|,,	99/>o  BIIm\:;;		.=>>r!   c                 X    t        |       ryt        t        j                  d|             S )NFz(gcc|g\+\+|gnu-c\+\+))r   r   r   r+   r   s    r   _is_gccr     s&     		2LABBr!   c                     t         sy	  t        j                  | dgt        j                        j	                         j
                  t         }d|j                         d   v S # t        $ r Y yw xY w)NFr[   r\   	Microsoftr   )	r   r<   r=   r^   r   r   SUBPROCESS_DECODE_ARGSr   r?   )r   
output_msgs     r   r   r     sr    J##\7$;JDUDUVUWV+- 	
 j335a888 s   AA$ $	A0/A0c                    dt         dd fd}	  t        j                  | dgt        j                        j	                         j
                  t         }d|j                         d   v }|rat        r!t        j                  d|       rt        d	      t        j                  d
|      }|"|j                  d      } |t        |             |S # t        $ r Y yt        j                  $ r Y yw xY w)Ncompiler_versionr   c                 R    t         rdnd}| t        |      k  rt        d| d      y)zw
        On Windows: early version icx has `-print-file-name` issue, and can't preload correctly for inductor.
        z2024.2.1z0.0.0z0Intel Compiler error: less than minimal version r}   N)r   r   r_   )r   min_versions     r   _check_minimal_versionz2_is_intel_compiler.<locals>._check_minimal_version  s8     %0jWl;77B;-qQ  8r!   r2   r\   Intelr   z((icx$)|(icx-cc$))z[Please use icx-cl, due to torch.compile only support MSVC-like CLI (compiler flags syntax).z(\d+[.]\d+[.]\d+[.]\d+)r*   F)r   r<   r=   DEVNULLr   r   r   r   r   r   r+   r_   groupr?   r>   )r   r   r   is_intel_compilericx_ver_searchicx_vers         r   _is_intel_compilerr     s     $ J##{+J4F4F UWV+	- 	 $z'<'<'>q'AA992LA&u 
  YY'A:NN)(..q1&|G'<=   %% s   B?C 	C.C.-C.c                  (    t        t                     S r   )r   r   r   r!   r   is_gccr    s    #%&&r!   c                  (    t        t                     S r   )r   r   r   r!   r   is_clangr    s    %'((r!   c                  (    t        t                     S r   )r   r   r   r!   r   r   r     s    .011r!   c                  (    t        t                     S r   )r   r   r   r!   r   is_apple_clangr    s    +-..r!   c                  (    t        t                     S r   )r   r   r   r!   r   
is_msvc_clr    s    ')**r!   c                    t         j                  j                         }d|d<   	  t        j                  | dgt        j
                  |      j                  t         }|j                  dd      }|j                  d	d      }|S # t        $ rN 	  t        j                  | dgt        j
                  |      j                  t         }n# t        $ r Y Y yw xY wY |w xY w)
NCLC_ALLz-v)r]   envr2   r   r   
)
r6   rQ   copyr<   r=   r^   r   r   	Exceptionreplace)rY   r  r   s      r   get_compiler_version_infor    s    
**//
CCM
00tZ%6%6C

&(* $++D#6N#++D#6N  	Z44;'
0A0Asf,.N  		 s5   9B 	C9CC	CCCCC	dest_listsrc_listc                 4    | j                  d |D               y )Nc              3   F   K   | ]  }t        j                  |        y wr   r  deepcopy).0items     r   	<genexpr>z_append_list.<locals>.<genexpr>  s     >TT]]4(>   !)extend)r  r  s     r   _append_listr    s    >X>>r!   	orig_listc                 D    g }| D ]  }||vs|j                  |        |S r   r   )r  new_listr  s      r   _remove_duplication_in_listr#    s1    H "xOOD!" Or!   path_dirc                     t         j                  j                  |       s	 t        |       j	                  dd       y y # t
        $ r5}|j                  t        j                  k7  rt        d|        Y d }~y d }~ww xY w)NT)parentsexist_okzFail to create path )	r6   r9   rN   r   mkdirOSErrorerrnoEEXISTr_   )r$  r   s     r   _create_if_dir_not_existr,  !  sq    77>>(#	N   = $  	yyELL("*8*5  )	s   ? 	A=+A88A=c                    t         j                  j                  |       rt        j                  | d      D ]~  \  }}}|D ]7  }t         j                  j	                  ||      }t        j
                  |       9 |D ]7  }t         j                  j	                  ||      }t        j                  |       9  t        j                  |        y y )NF)topdown)r6   r9   rN   walkr:   removermdir)r$  rootdirsfilesnamerc   dir_paths          r   _remove_dirr7  ,  s    	ww~~h!#5!A 	#D$ %GGLLt4			)$%  #77<<d3"#		# 	  r!   cmd_linecwdc                    t        j                  |       }	 t        j                  ||dt        j                  t        j
                         y # t        j                  $ r]}|j                  j                  d      }d|v xs d|v }|rt        j                  dk(  rd}||z  }t        j                  ||      |d }~ww xY w)NT)r9  r   rM   r]   r)   z'omp.h' file not found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.)shlexr   r<   r   rV   r^   r   rM   r   r4   r5   r   CppCompileError)r8  r9  r   eoutputopenmp_probleminstructions          r   _run_compile_cmdrB  8  s    
++h
C6SZ__ZEVEV	
 (( 6)1V;Qx6?Qcllh62  k!F!!#v.A56s   6A B>!AB99B>c                 \    t        d      5  t        | |       d d d        y # 1 sw Y   y xY w)Ncompile_file)r   rB  )r8  r9  s     r   run_compile_cmdrE  O  s)    	n	% (3'( ( (s   "+	orig_pathc                 R    t         r | j                  t        j                  d      S | S )N/)r   r  r6   sep)rF  s    r   r   r   T  s"      --r!   c                      e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 d$dedeee      deee      deee      deee      deee      d	eee      d
eee      dedededededdfdZd%dZ	d%dZ
d%dZdefdZdee   fdZdee   fdZdee   fdZdee   fdZdee   fdZdee   fdZdee   fdZdefdZdefdZdefdZdefd Zdefd!Zd"eddfd#Zy)&BuildOptionsBasez
    This is the Base class for store cxx build options, as a template.
    Actually, to build a cxx shared library. We just need to select a compiler
    and maintains the suitable args.
    NrY   definitionsinclude_dirscflagsldflagslibraries_dirs	librariespassthrough_argsaot_moder   compile_onlyprecompilingpreprocessingr   c                     || _         |xs g | _        |xs g | _        |xs g | _        |xs g | _        |xs g | _        |xs g | _        |xs g | _        d | _        |	| _	        |
| _
        || _        || _        || _        y r   )	_compiler_definitions_include_dirs_cflags_ldflags_libraries_dirs
_libraries_passthrough_argsprecompiled_header	_aot_mode_use_relative_path_compile_only_precompiling_preprocessing)rj   rY   rL  rM  rN  rO  rP  rQ  rR  rS  r   rT  rU  rV  s                 r   rk   zBuildOptionsBase.__init__a  s      "'2'8b(4(:"(,B#*=b*8*>B%._",<,B 26'(9#/#/$1r!   c                 :    | j                   rg | _        g | _        y y r   )rc  r]  r^  r{   s    r   _process_compile_only_optionsz.BuildOptionsBase._process_compile_only_options  s    #%D  DO r!   c                 p   t        | j                        | _        t        | j                        | _        t        | j                        | _        t        | j                        | _        t        | j
                        | _        t        | j                        | _        t        | j                        | _        y r   )r#  rY  rZ  r[  r\  r]  r^  r_  r{   s    r   _remove_duplicate_optionsz*BuildOptionsBase._remove_duplicate_options  s~    78I8IJ89K9KL24<<@3DMMB:4;O;OP5dooF!<T=S=S!Tr!   c                 D    | j                          | j                          y r   )rg  ri  r{   s    r   _finalize_optionsz"BuildOptionsBase._finalize_options  s    **,&&(r!   c                     | j                   S r   )rX  r{   s    r   get_compilerzBuildOptionsBase.get_compiler      ~~r!   c                     | j                   S r   )rY  r{   s    r   get_definitionsz BuildOptionsBase.get_definitions  s       r!   c                     | j                   S r   )rZ  r{   s    r   get_include_dirsz!BuildOptionsBase.get_include_dirs      !!!r!   c                     | j                   S r   )r[  r{   s    r   
get_cflagszBuildOptionsBase.get_cflags  s    ||r!   c                     | j                   S r   )r\  r{   s    r   get_ldflagszBuildOptionsBase.get_ldflags  s    }}r!   c                     | j                   S r   )r]  r{   s    r   get_libraries_dirsz#BuildOptionsBase.get_libraries_dirs  s    ###r!   c                     | j                   S r   )r^  r{   s    r   get_librarieszBuildOptionsBase.get_libraries  s    r!   c                     | j                   S r   )r_  r{   s    r   get_passthrough_argsz%BuildOptionsBase.get_passthrough_args  s    %%%r!   c                     | j                   S r   )ra  r{   s    r   get_aot_modezBuildOptionsBase.get_aot_mode  rn  r!   c                     | j                   S r   )rb  r{   s    r   get_use_relative_pathz&BuildOptionsBase.get_use_relative_path  s    &&&r!   c                     | j                   S r   )rc  r{   s    r   get_compile_onlyz!BuildOptionsBase.get_compile_only  rs  r!   c                     | j                   S r   )rd  r{   s    r   get_precompilingz!BuildOptionsBase.get_precompiling  rs  r!   c                     | j                   S r   )re  r{   s    r   get_preprocessingz"BuildOptionsBase.get_preprocessing  s    """r!   filec                    | j                         | j                         | j                         | j                         | j	                         | j                         | j                         | j                         | j                         | j                         | j                         d}t        |d      5 }t        j                  ||       d d d        y # 1 sw Y   y xY w)N)rY   rL  rM  rN  rO  rP  rQ  rR  rS  r   rT  w)rm  rp  rr  ru  rw  ry  r{  r}  r  r  r  openjsondump)rj   r  attrsfs       r   save_flags_to_jsonz#BuildOptionsBase.save_flags_to_json  s    ))+//1 113oo''')"557++- $ 9 9 ;))+!%!;!;!= 113
 $_ 	 IIeQ	  	  	 s   5CC)r   NNNNNNNFFFFFr   )r   r   r   __doc__r   r	   r   r   rk   rg  ri  rk  rm  rp  rr  ru  rw  ry  r{  r}  r  r  r  r  r  r  r   r!   r   rK  rK  Z  s    +/,0&*'+.2)-04"'""#"2"2 d3i("2 tCy)	"2
 c#"2 $s)$"2 !c+"2 DI&"2 #49-"2 "2  "2 "2 "2 "2 
"2H!
U)c !c !"$s) "DI T#Y $DI $tCy &d3i &d 't '"$ ""$ "#4 # s  t  r!   rK  warning_allc                      t         s| rdgS g S g S )NWallr   )r  s    r   _get_warning_all_cflagr    s    &x.B.	r!   std_numc                 ,    t         r		 d} d|  gS d|  gS )Nzc++20zstd:zstd=r  )r  s    r   _get_cpp_std_cflagr    s1    	 wi !!wi !!r!   c                     t         rg d}|S ddg}t        |       r/t        j                  j                  rdnd}|j                  |       t        |       r|j                  d       |S )N)wd4819wd4251wd4244wd4267wd4275wd4018wd4190wd4624wd4067wd4068EHsczZc:__cpluspluszpermissive-zWno-unused-variablezWno-unknown-pragmasz$Werror=ignored-optimization-argumentz!Wno-ignored-optimization-argumentpedantic)r   r   r   aot_inductor#raise_error_on_ignored_optimizationr   r   )r   rN  ignored_optimization_arguments      r   _get_os_related_cpp_cflagsr    sp    
> M ()>?\" &&JJ 78 *
 MM78<  MM*%Mr!   c                 >    g }t         r|j                  d       |S 	 |S )NNOMINMAXr   r   )r   os_definitionss     r   _get_os_related_cpp_definitionsr    s-     "N 	j)  	r!   c                  (   t         rg } | S g d} | j                  d       t        j                  j                  s| j                  d       | j                  dt        j                  j
                          t               r| j                  d       | S )N)zfno-trapping-mathzfunsafe-math-optimizationszffinite-math-onlyzfno-signed-zeroszfno-math-errnozfno-finite-math-onlyzfno-unsafe-math-optimizationszffp-contract=zfexcess-precision=fast)r   r   r   r   enable_unsafe_math_opt_flag#enable_floating_point_contract_flagr  )flagss    r   _get_ffast_math_flagsr    sv    0 L!
 	+,zz55LL89}VZZ%S%S$TUV8LL12Lr!   c                  X    g } g }t         rddg} g d}| |fS | j                  d       | |fS )z
    When we turn on generate debug symbol.
    On Windows, it should create a [module_name].pdb file. It helps debug by WinDBG.
    On Linux, it should create some debug sections in binary file.
    ZI_DEBUG)DEBUGzASSEMBLYDEBUG zOPT:REFzOPT:ICFgr  )rN  rO  s     r   !_get_inductor_debug_symbol_cflagsr  3  sD     FG!C 7? 	c7?r!   min_optimizec                    g }g }t         j                  j                  xs# t        j                  j                  dd      dk(  }t         j                  j                  }|r-t               \  }}t        r|g dz  }n(|j                  d       nt        r|rdndg}n|r|ndd	g}|t               z  }t        r	 ||fS t        j                  d
k7  rjt        |       r|j                  d       t        j                         s:t        j                         dk(  r|j                  d       n|j                  d       t         j                  j                   rt#        |       r|j                  d       ||fS )NTORCHINDUCTOR_DEBUG_SYMBOL01)OdOb0zOy-O0O1O2O3DNDEBUGr'   zfno-tree-loop-vectorizeppc64lezmcpu=nativezmarch=native	flto=thin)r   r  debug_compiler6   rQ   rR   compile_wrapper_opt_levelr  r   r   r  r4   r5   r   r   machine
enable_ltor   )r   r  rN  rO  b_debug_buildwrapper_opt_levels         r   _get_optimization_cflagsr  E  sC    FG 	)) 	D::>>6<C  ++EE;=**FMM$*d5F+7'T9MF
#%%F" 7? <<8#|$78 ##%##%2MM-0MM.1))i.EMM+&7?r!   do_linkc                 x    t         r	 ddgS | sdgS t        j                         dk(  rdt               v rg dS ddgS )NDLLMDfPICDarwinclang)sharedr  zundefined dynamic_lookupr  )r   r5   systemr   )r  s    r   _get_shared_cflagsr  t  sK    	 t}xH$4D4F)F==fr!   extra_flagsc                    g }g }g }g }g }	g }
g }t        | |      \  }}|t        |      z   t        |      z   t               z   t	        |       z   }|t        |       z  }t        sGt        j                  j                  r-t        |       r"|j                  d       |j                  d       |j                  dj                  |             |||||z   |	|
|fS )Nzfuse-ld=lldr  r   )r  r  r  r  r  r  r   r   r  r  r   r   r:   )r   r  r  r  r  rL  rM  rN  rO  rP  rQ  rR  
opt_cflagsopt_ldflagss                 r   get_cpp_optionsr    s      K LFG "NI"$6|\RJ 	
W
%	&
 
-	. 
	 %\
2		3  2<@@K6..99i>U}%{#CHH[12 	+ r!   c                   `     e Zd ZdZ	 	 	 	 	 	 	 	 ddededee   dedededed	ed
df fdZ x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.
    rT  r  r  r   rY   r  rU  rV  r   Nc	                    t         |   ||||       |r|n	t               | _        t	        | j                  |xs |xs | |||      \  }	}
}}}}}t        | j                  |	       t        | j                  |
       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       | j                          y )N)rT  r   rU  rV  )r   r  r  r  r  )superrk   r   rX  r  r  rY  rZ  r[  r\  r]  r^  r_  rk  )rj   rT  r  r  r   rY   r  rU  rV  rL  rM  rN  rO  rP  rQ  rR  	__class__s                   r   rk   zCppOptions.__init__  s     	%/%'	 	 	
 &.3C3E %FFG##%
	
 	T&&4T''6T\\6*T]]G,T))>:T__i0T++-=> r!   )FTr   Fr   FFF)	r   r   r   r  r   r   r   rk   __classcell__r  s   @r   r  r    s     # %'"'""#*!*! *! c]	*!
  *! *! *! *! *! 
*! *!r!   r  c                  
    ddgS )NTORCH_INDUCTOR_CPP_WRAPPERSTANDALONE_TORCH_HEADERr   r   r!   r   !_get_torch_cpp_wrapper_definitionr    s    (*CDDr!   c                      dgS )Nz" C10_USING_CUSTOM_GENERATED_MACROSr   r   r!   r   _use_custom_generated_macrosr    s    011r!   c                  J    t         st        j                         rg d} | S g S g S )N)C10_USE_GLOGC10_USE_MINIMAL_GLOG$C10_DISABLE_TENSORIMPL_EXTENSIBILITY)r   r   r   )fb_internal_macross    r   _use_fb_internal_macrosr    s+    "
 &%I	r!   rS  c                 0   g }g }g }t         r|||fS t        j                         r|j                  d       |j                  t        j
                         |j                  t        j                         |j                  t        j                         |j                  t        j                         |j                  t        j                         |j                  t        j                         |j                  t        j                         |j                  t        j                         |j                  t        j                         |j                  d       |r	|st        }n#t        j                   j#                  t              }t%        |       rz|j                  d       |j                  d       |j                  d|        |j                  dt        j&                  z          |j                  dt        j&                  z          |||fS )Nnostdincincludez --rtlib=compiler-rtz -fuse-ld=lldz -Wl,--script=z -Bz -L)r   r   r   r   r   sleef_includeopenmp_includepython_include
cc_includelibgcc_includelibgcc_arch_includelibgcc_backward_includeglibc_includelinux_kernel_include_LINKER_SCRIPTr6   r9   basenamer   	glibc_lib)r   rS  r   rN  rM  rR  linker_scripts          r   _setup_standard_sys_libsr    s   
 F L"$|%555j! 	K556K667K667K223K667K;;<K??@K556K<<=I&-*MGG,,^<M\"##$:;##O4##n]O$DE##EK,A,A$AB##EK,A,A$AB<!111r!   vec_isac                 
   g }g }| t         k7  rs|j                  d | j                         D               | j                         g}t	        j
                         r(t        |       j                         }d| d| d| dg}||fS )Nc              3   F   K   | ]  }t        j                  |        y wr   r  )r  xs     r   r  z0_get_build_args_of_chosen_isa.<locals>.<genexpr>-  s     F1dmmA&Fr  zCPU_CAPABILITY=CPU_CAPABILITY_HAVE__CPU_DEFINITION)r   r  build_macrobuild_arch_flagsr   r   r   upper)r  macrosbuild_flagscaps       r   _get_build_args_of_chosen_isar  (  s    FK/!F0C0C0EFF//12g,$$&C!#'!#'uO,F ;r!   include_pytorchc                     ddl m}m}  |       }|g}g }t        j                  dk7  r+t        j                         sddg}|s|j                  d       t        r|j                  d       |||fS )Nr   )include_pathsTORCH_LIB_PATHr'   torch	torch_cputorch_pythonsleef)	torch.utils.cpp_extensionr  r  r4   r5   r   r   r   r   )r  rS  r  r  rM  rP  rQ  s          r   _get_torch_related_argsr  <  sl     H ?L$%NI
||x(8(8(:k*	^,!22r!   c                     t        t        j                  d            } | j                         s\t	        j
                         dk(  rEt        t        j                  d            }|j                  j                  dz  j                         } | dz  j                         s!t        j                  dt        |               t        |       gS )Nr  r  stdlibHeaderszPython.hzCan't find Python.h in )r   	sysconfigget_pathrN   r5   r  parentabsolutewarningswarnr   )include_dirstd_libs     r   _get_python_include_dirsr&  O  s    y)))45K HOO$5$Ay))(34~~,,y8BBD*$,,./K0@/ABCr!   c                     t               } t        j                  dt        rdnd      }|| j	                  |       t        rFt        t        t        j                  dd            j                  dz  j                               g}nt        j                  d      g}t        j                         r| j	                  t        j                         | |fS )Nr  ntposix_prefix)schemelibsLIBDIR)r&  r  r  r   r   r   r   r   r!  get_config_varr   r   r   r  )python_include_dirspython_include_pathpython_lib_paths      r   _get_python_related_argsr1  \  s    24#,,+$> &""#67++IdCDKKfT(*
 %33H=>"";#=#=>//r!   c                      	 d} t        j                  | j                               j                  d      }t	        t        j                  |            dkD  S # t         j                  t        f$ r Y yw xY w)Nzconda list llvm-openmp --jsonr   r   F)	r<   r=   r   r   lenr  loadsr>   r?   )commandr?  s     r   is_conda_llvm_openmp_installedr6  u  sd    1((9@@H4::f%&**&&(9: s   AA A32A3c                     	 t        j                  d      yt        j                  g d      j	                  d      j                         } t        j                  j                  |       }|| fS # t        j                  $ r Y yw xY w)Nbrewr   )r8  z--prefixr;  r   )
rS   rT   r<   r=   r   r   r6   r9   rN   r>   )libomp_pathomp_availables     r   homebrew_libompr;    sv    <<'
 ##$BCVF^UW 	 {3k))%% s   A/ AA/ /BBomp_namec                 p   	 t        j                  | dg      j                  d      }t        j                  j                  |j                         |      }t        j                  j                  |      r)dt        j                  d<   t        j                  |       y y # t         j                  $ r Y y w xY w)Nz-print-file-name=binr   TRUEKMP_DUPLICATE_LIB_OK)r<   r=   r   r6   r9   r:   rstripisfilerQ   r   LoadLibraryr>   )r   r<  r?  omp_paths       r   perload_clang_libomp_winrD    s    	((,8N)OPWW
 77<<:77>>(#17BJJ-.X& $ %% s   BB B54B5c                 Z    dt         dt         dt        fd}	 g d}|D ]  } || |        y )Nr   lib_namer   c                 `   	  t        j                  | d| gt         j                        j                  t         }|j                         }t        j                  j                  |      r)dt        j                  d<   t        j                  |       y	 y# t         j                  $ r Y yw xY w)Nz-print-file-name=r\   r>  r?  TF)r<   r=   r   r   r   r@  r6   r9   rA  rQ   r   rB  r>   )r   rF  r?  rC  s       r   _load_icx_built_in_lib_by_namez>perload_icx_libomp_win.<locals>._load_icx_built_in_lib_by_name  s    	Z,,!28*=>!)) f,.F }}Hww~~h'5;

12  * (  )) 		s   BB B-,B-)zlibiomp5md.dllzsvml_dispmd.dllz
libmmd.dll)r   r   )r   rH  preload_listrF  s       r   perload_icx_libomp_winrJ    sC    S C D L ! ?&|X>?r!   c                    g }g }g }g }g }g }t         r{|j                  d       |j                  d       t        |        }t        j                  d      }|t        j
                  j                  |dd      }	t        j
                  j                  |	      }
|
r_|j                  t        j
                  j                  |d             |j                  t        j
                  j                  |d             nt        j                  d       |xs |
}|s|j                  d       t        j                  d	      }|s|t               }|rt        j
                  j                  |d      }|j                  t        j
                  j                  |d             |j                  |       t        j                         j                  d
k(  rNt        j
                  j                  t        j
                  j                  |d            r|j                  d       |st               \  }}|r|j                  t        j
                  j                  |d             |j                  t        j
                  j                  |d             nvt        r	 t        |       r0|j                  d       |j                  d       t!        | d       n4t#        |       r.|j                  d       |j                  d       t%        |        n|j                  d       |j                  d       nt'        j(                         rW|j                  t*        j,                         t*        j.                  }d| }|j                  |       |j                  d       nmt        |       r#|j                  d       |j                  d       n?t#        |       r|j                  d       n"|j                  d       |j                  d       ||||||fS )NXclangfopenmp
OMP_PREFIXr  zomp.hlibz-environment variable `OMP_PREFIX` is invalid.ompCONDA_PREFIXx86_64zlibiomp5.dylibiomp5openmpr;  z
libomp.dllQiopenmp
libiomp5mdzopenmp:experimentalz-Wp,-fopenmp gompfiopenmp)	_IS_MACOSr   r   r6   r7   r9   r:   rN   r"  r#  r6  unamer  r;  r   r   rD  r   rJ  r   r   r   r  openmp_lib_so)r   rN  rO  include_dir_pathslib_dir_pathsr+  rR  r:  
omp_prefixheader_path	valid_envconda_prefixconda_lib_pathr9  
openmp_libfb_openmp_extra_flagss                   r   _get_openmp_argsre    s    FG#%!MD"$hi  ,L99 YY|,
!'',,z9gFK{3I!((j))LM$$RWW\\*e%DEMN)6YMKK yy0!9:<M!#lE!B!((lI)NO$$^488:%%1bggnnGGLL1AB7 KK( )8):&M;!((k9)MN$$RWW\\+u%EF 
	 \"MM(#KK!$\<@-MM*%KK%"<0
 MM(#MM/0$$[%?%?@$22J&3J<$@!##$9:KK&i(F##L1j)i(F#7-}dDTTTr!   c                      g } g }t        j                         r't        j                  d      g} |j	                  d       | |fS )z
    For fbcode cpu case, we should link stdc++ instead assuming the binary where dlopen is executed is built with dynamic stdc++.
    r,  zstdc++)r   r   r  r-  r   )r]  r+  s     r   _get_libstdcxx_argsrg  ,  sD      "MD"11(;<H$r!   use_mmap_weightsc                 0    g }| r|j                  d       |S )Nz USE_MMAP_SELFr!  )rh  r  s     r   get_mmap_self_macrorj  9  s    F&'Mr!   c                    g }g }g }g }	g }
g }g }t               }t               }t        | ||      \  }}}t        |      \  }}t	        ||      \  }}}t               \  }}t        |       \  }}}}}}t               }t        |      } ||z   |z   |z   | z   }||z   |z   |z   }||z   }|}	||z   |z   }
||z   }||z   |z   }||||	|
||fS )a3  
    This function is used to get the build args of torch related build options.
    1. Torch include_directories, libraries, libraries_directories.
    2. Python include_directories, libraries, libraries_directories.
    3. OpenMP related.
    4. Torch MACROs.
    5. MISC
    6. Return the build args
    )r  rS  )	r  r  r  r  r  r1  re  r  rj  )!r   r  r  rS  r   rh  rL  rM  rN  rO  rP  rQ  rR  torch_cpp_wrapper_definitions'use_custom_generated_macros_definitionssys_libs_cflagssys_libs_include_dirssys_libs_passthrough_args
isa_macrosisa_ps_args_build_flagstorch_include_dirstorch_libraries_dirstorch_librariesr.  python_libraries_dirs
omp_cflagsomp_ldflagsomp_include_dir_pathsomp_lib_dir_pathsomp_libomp_passthrough_argsfb_macro_passthrough_argsmmap_self_macross!                                    r   get_cpp_torch_optionsr  @  s   "  K LFG "NI"$$E$G!.J.L+ 	!x9JK	! +H*P'J' 	 (S	 2J1K.. 	& !8 9*+;< 	&
1	2
	 $	$ 		  	
	
	  	   z)FG*-AADUUN')I!$;;>RR 
 	 r!   c                   ~     e Zd ZdZeddddddddddddfdededed	ed
ededededee   dededededdf fdZ	 x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   r   r  r  r  rS  rT  r   rh  r  r  rY   r  rU  rV  r   Nc           
         t         |   |||	||
|||       || _        t        | j                  |||||      \  }}}}}}}t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       | j                          y )N)rT  r  r  r   rY   r  rU  rV  )r   r  r  rS  r   rh  )r  rk   ra  r  rX  r  rY  rZ  r[  r\  r]  r^  r_  rk  )rj   r  r  r  rS  rT  r   rh  r  r  rY   r  rU  rV  torch_definitionsrs  torch_cflagstorch_ldflagsrt  ru  torch_passthrough_argsr  s                        r   rk   zCppTorchOptions.__init__  s      	%##/%%' 	 		
 " "+/-
	
 " 	T&&(9:T'');<T\\<0T]]M2T))+?@T__o6T++-CD r!   )r   r   r   r  r   r   r   r   r   rk   r  r  s   @r   r  r    s    	 * % ""'!&%'""#5!5! 5! 	5!
 5! 5!  5! 5! 5! c]5! 5! 5! 5! 5! 
5! 5!r!   r  c                      t        j                         rct        j                  j                  Hdt
        j                  vr5dt
        j                  vr"t        j                  t
        j                  d<   y y y y y )N	CUDA_HOME	CUDA_PATH)	r   r   r  versionhipr6   rQ   r   sdk_homer   r!   r   _set_gpu_runtime_envr    s^    MM%rzz)rzz)"-"6"6

; * * & 	r!      r9   c                     t        t        |       j                  d            }|r|d   j                         j                  S d|  }t
        j                  |       y )Nzlibcudart_static.ar   z%"libcudart_static.a" not found under )r   r   rglobresolver   rO   rP   )r9   lib_dirslog_msgs      r   _find_libcudart_staticr    sS    DJ$$%9:;H{""$+++5dV<GHHWr!   lpathsc                 .   t        |       D ]  \  }}dt        j                  v s|j                  t        j                  d         s<t	        |      }|Jt        |      | |<   |dz  }|j                         sn| j                  t        |              y )Nr  stubs)	enumerater6   rQ   
startswithr  r   rN   r   )r  r   r9   lib_dirstub_dirs        r   _transform_cuda_pathsr    s     V$ -4"**$K9P)Q&<T&BGGF1I(H c(m,-r!   device_typerT  c                    g }g }g }g }g }g }g }	t        j                         rEdt        j                  vr3dt        j                  vr!t        j
                  t        j                  d<   t                ddlm}
 |
j                  |       }|
j                  |       }t        j                         s|dgz  }| dk(  r|j                  t        j                  j                  rdnd       t        j                  j                  4t        j                         r|d	gz  }n|d
dgz  }|j                  d       n-t        j                         r|dgz  }n|g dz  }t        |       | dk(  r|j                  d       d}t         rrt        j"                  d      }|t%        |      |t        j&                  j)                  |d      gz  }|t        j&                  j)                  |d      gz  }|g dz  }n#|dgz  }|g dz  }t+        d      st%        |      | dk(  r|j                  d       t        j                         ra|j                  t        j,                         |r$| dk(  rt        j                  j                  |sdg}	| dk(  rt/               \  }}||z  }||z  }t         j0                  j2                  r|t         j0                  j2                  z  }|||||||	fS )z
    This function is used to get the build args of device related build options.
    1. Device include_directories, libraries, libraries_directories.
    2. Device MACROs.
    3. MISC
    4. Return the build args
    r  r  r   )cpp_extensionc10cudaz	 USE_ROCMz	 USE_CUDAamdhip64c10_hip	torch_hipz __HIP_PLATFORM_AMD__)c10_cudar  
torch_cudaxpuz USE_XPUzIntel GPU driver is not properly installed, please follow the instruction in https://github.com/pytorch/pytorch?tab=readme-ov-file#intel-gpu-support.LEVEL_ZERO_V1_SDK_PATHr  rO  )c10_xpusycl	ze_loader	torch_xpuzWno-commentr  mpsz USE_MPSz*-Wl,-Bstatic -lcudart_static -Wl,-Bdynamiccpu)r   r   r6   rQ   r   r  r  torch.utilsr  r  library_pathsr   r  r  r  r  r   r7   r)  r9   r:   r   sdk_includerg  r  custom_op_libs)r  rS  rT  rL  rM  rN  rO  rP  rQ  rR  r  xpu_error_stringze_rootstdcxx_lib_dir_pathsstdcxx_libss                  r   get_cpp_torch_device_optionsr     s     K LFG "NI"$rzz)rzz)"-"6"6

;) ..{;L"00=NeW	f%--*;*;;M==(!j\)	i55	67!fX%	??	!.1e:&Z 	 ii 89G.//RWW\\'9=>>Lrww||GU;<<NFFI }o%FFFI,.//e:&K334v-}}  (#(T'U$% $%$22N$I))V((777	 	 r!   c                        e Zd ZdZedddddddddddfdededed	ed
ededededee   dedededdf fdZ	d fdZ
 xZS )CppTorchDeviceOptionsz
    This class is inherited from CppTorchOptions, which automatic contains
    base cxx build options and torch common build options. And then it will
    maintains cuda/xpu device related build args.
    Fr  Tr   r  r  r  rS  rT  r   rh  r  r  r  rU  rV  r   Nc                    t         |   |||||||	|
||
       g }g }g }g }g }g }g }t        |||      \  }}}}}}}t        | j                  |       t        | j
                  |       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       | j                          y )N)
r  r  rS  rT  r   rh  r  r  rU  rV  )r  rS  rT  )r  rk   r  r  rY  rZ  r[  r\  r]  r^  r_  rk  )rj   r  r  r  rS  rT  r   rh  r  r  r  rU  rV  device_definitionsdevice_include_dirsdevice_cflagsdevice_ldflagsdevice_libraries_dirsdevice_librariesdevice_passthrough_argsr  s                       r   rk   zCppTorchDeviceOptions.__init__o  s    	+%/-#%%' 	 	
 )+)+#%$&+-&(-/ )#h\
	
!# 	T&&(:;T'')<=T\\=1T]]N3T))+@AT__&67T++-DE r!   c                 2   t         |           t        j                         rtt	               \  }}t        |      dk(  s
J d|        |d   | j                  v r=| j                  j                  |d          | j                  j                  |d          y y y )Nr*   zPython lib dirs: r   )	r  rk  r   r   r1  r3  r]  r0  r   )rj   r   python_lib_dirsr  s      r   rk  z'CppTorchDeviceOptions._finalize_options  s    !# ":!;A'1,S0A/AR.SS,q!T%9%99$$++OA,>?$$++OA,>? : r!   r   )r   r   r   r  r   r   r   r   r   rk   rk  r  r  s   @r   r  r  h  s     * %!""'!&%'""#6!6! 6! 	6!
 6! 6!  6! 6! 6! c]6! 6! 6! 6! 
6!p	@ 	@r!   r  rc   c                     t         j                  j                  |       }t         j                  j                  |      \  }}t         j                  j	                  |       }||fS )a  
    This function help prepare parameters to new cpp_builder.
    Example:
        input_code: /tmp/tmpof1n5g7t/5c/c5crkkcdvhdxpktrmjxbqkqyq5hmxpqsfza4pxcf3mwk42lphygc.cpp
        name, dir = get_name_and_dir_from_output_file_path(input_code)
    Run result:
        name = c5crkkcdvhdxpktrmjxbqkqyq5hmxpqsfza4pxcf3mwk42lphygc
        dir = /tmp/tmpof1n5g7t/5c/

    put 'name' and 'dir' to CppBuilder's 'name' and 'output_dir'.
    CppBuilder --> get_target_file_path will format output path according OS:
    Linux: /tmp/tmppu87g3mm/zh/czhwiz4z7ca7ep3qkxenxerfjxy42kehw6h5cjk6ven4qu4hql4i.so
    Windows: [Windows temp path]/tmppu87g3mm/zh/czhwiz4z7ca7ep3qkxenxerfjxy42kehw6h5cjk6ven4qu4hql4i.dll
    )r6   r9   r  splitextdirname)rc   name_and_extr5  _extdirs        r   &get_name_and_dir_from_output_file_pathr    sL    " 77##I.L!!,/JD$
''//)
$C9r!   c                   >   e Zd ZdZedeeef   fd       Zedeeef   fd       Zedeeef   fd       Z	edeeef   fd       Z
	 ddedeeee   f   d	ed
eddf
dZdefdZdefdZ	 	 ddZddZdededdfdZdededdfdZdedee   ddfdZdeddfdZy)
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 multiple 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 target 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                  2    t         rdnd} t         rdnd}| |fS )Nz.pyd.soz/Fe-or  	extensionoutput_flagss     r   __get_python_module_flagsz$CppBuilder.__get_python_module_flags  s    )Fu	 +u,&&r!   c                  2    t         rdnd} t         rdnd}| |fS )Nz.objr   z/c /Foz-c -or  r  s     r   __get_object_flagszCppBuilder.__get_object_flags  s    )Ft	#.xG,&&r!   c                  F    t         s
t               sdnd} t         rdnd}| |fS )Nz.pchz.gchz/Fpr  )r   r  r  s     r   __get_precompiled_header_flagsz)CppBuilder.__get_precompiled_header_flags  s#    )Fv	 +u,&&r!   c                  "    d} t         rdnd}| |fS )Nz.iz/EP /Pz-E -P -or  r  s     r   __get_preprocessor_output_flagsz*CppBuilder.__get_preprocessor_output_flags  s    	#.xJ,&&r!   r5  sourcesBuildOption
output_dirNc                 X   d| _         d| _        d| _        d| _        d| _        d| _        d| _        d| _        g | _        d| _	        d| _
        d| _        d| _        || _        t        j                  j                   xs d| _        || _        |j'                         | _         |j)                         | _        |j+                         | _        || _	        |j-                         | _        |j1                         | _        |j5                         | _        t9        | j.                  | j2                  | j6                  f      dk  sJ | j.                  xs | j2                  xs | j6                   | _        t<        r| j2                  rJ d       | j.                  r| j?                         \  }}nS| j2                  r| jA                         \  }}n3| j6                  r| jC                         \  }}n| jE                         \  }}tF        jH                  jK                  | j                  | j                   |       | _
        | j                  r)tF        jH                  jM                  | j                        n| j                  }t<        r | j6                  r|| _'        n| | | _'        n| d| | _'        tQ        |tR              r|g}t        jT                         rH| j                  r<tW        |      | _        |D cg c]!  }tF        jH                  jM                  |      # }}| j2                  rtY        |      dk(  sJ d|d    | _-        ndjK                  |      | _-        |j]                         D ];  }	t<        r| xj                  d	|	 dz  c_        #| xj                  d
|	 dz  c_        = |j_                         D ];  }
t<        r| xj                  d|
 dz  c_        #| xj                  d|
 dz  c_        = |j`                  x}r(t<        rtb        je                  d|       nd| d| _        |jg                         D ]N  }t<        r| xj                  d| dz  c_        #| xj                  dti        jj                  |       dz  c_        P |jm                         D ];  }t<        r| xj                  d	| dz  c_        #| xj                  d
| dz  c_        = |jo                         D ];  }t<        r| xj
                  d| dz  c_        #| xj
                  d| dz  c_        = |jq                         D ];  }t<        r| xj                  d| dz  c_        #| xj                  d| dz  c_        = |js                         D ]  }| xj                  | dz  c_         y c c}w )Nr   F
aoti_modelr*   z/Cannot currently precompile headers on Windows!r   z-x c++-header r   rH  -z/D z-D zIPrecompiled header support for MSVC is currently unavailable; ignoring %sz	-include z/I "z" z-Iz
/LIBPATH:"z-L"z.lib" z-l):rX  _cflags_args_definitions_args_include_dirs_args_ldflags_args_libraries_dirs_args_libraries_args_passthrough_parameters_args_orig_source_paths_output_dir_target_filerb  ra  _namer   r  model_name_for_generated_files_target_name_build_optionrm  r  r  r  rc  r  rd  r  re  sum_do_linkr   _CppBuilder__get_object_flags)_CppBuilder__get_precompiled_header_flags*_CppBuilder__get_preprocessor_output_flags$_CppBuilder__get_python_module_flagsr6   r9   r:   r  _outputr   r   r   r   r3  _sources_argsru  rp  r`  rO   warningrr  r<  quoterw  ry  r{  r}  )rj   r5  r  r  r  file_extr  relative_target_filer   cflag
definitionr`  inc_dirldflagr  rO  passthrough_args                    r   rk   zCppBuilder.__init__  sn    !#"$$&!!,.) #%(-$
>>N, 	
 )$113"-"C"C"E$113%(99;(99;);;=D&&(:(:D<O<OPQUVVVVK$"4"4K8K8K
 d&8&8 	
=	
8 %)%<%<%>"Hl%)%H%H%J"Hl  %)%I%I%K"Hl%)%C%C%E"HlGGLL)9)9djj\(;TU && GGT../"" 	
 ""+".0D/EF*^1-A,BCDLgs#iG $"9"9 '+7mD#4;<qrww''*<G<w<1$$$#1'!*!>D!$'!2D ++- 	2E!!qq\1!!!qq\1!		2 &557 	>J&&C
|1*==&&&C
|1*==&		> "-!?!???_&
 -66H5I*K'"335 	HG''T'"+=='''RG0D/EQ+GG'		H "--/ 	4F""&m3"""&m3"		4 #557 	=G))z'"-EE)))r'!_<)		= ,,. 	4C$$!C57$$$"SE3$		4  +??A 	GO--O3DA1FF-	Gm =s   4&V'c                     dt         dt         dt         dt         dt         dt         dt         dt         d	t         d
t         dt         f fd} | j                   j                   j                   j                   j
                   j                   j                   j                   j                   j                  
      }|S )NrY   r  include_dirs_argsdefinitions_argscflags_argsldflags_argslibraries_argslibraries_dirs_argsrR  r?  r   c
                     t         r=|  d| d| d| d| d| d|	 }
j                  r|
d| d| d| z  }
t        |
      }
|
S |  d| d| d| d| d| d|	 }
j                  r|
d| d| d| z  }
|
S )Nr   z /LD /link )r   r  r   )rY   r  r  r  r  r  r  r  rR  r?  r   rj   s              r   format_build_commandz9CppBuilder.get_command_line.<locals>.format_build_command  s       j"3!4A6F5GqUViq!1 2!F8=  ==[)<(=Q~>NaP\~^^C.s3 J  j'!,<+=Q{m1()+;*<AfXG  ==Q|nAn-=Q?R>STTCJr!   )
rY   r  r  r  r  r  r  r  rR  r?  )r   rX  r  r  r  r  r  r  r  r  r  )rj   r  command_lines   `  r   get_command_linezCppBuilder.get_command_line  s    			  #	 "		
 	 	  	 "%	 "	 	 	> ,^^&&"55!33))++// $ 9 9!>><<
 r!   c                 ,    t        | j                        S r   )r   r  r{   s    r   get_target_file_pathzCppBuilder.get_target_file_path  s    '(9(9::r!   c                    t        d      5  | j                         j                         }	 | j                  }t        j
                  j                  t        d      }t        j                         5 }t        j                  t        t        j
                  j                  |d             | j                  D ]S  }t        j                  |t        j
                  j                  |t        j
                  j                  |                   U t        j
                  j                  |d      }t        j                  ||       t!        ||t        j
                  j                  |            }t        j
                  j#                  |      rt	        j$                  |       t        j                  ||       |j'                  d      rt	        j(                  |d       n'|j'                  d      rt	        j(                  |d       d d d        d d d        y # 1 sw Y   xY w# t*        j,                  $ r7}|j.                  j1                  d      }	t3        j4                  ||	      |d }~ww xY w# 1 sw Y   y xY w)	NrD  r  z	script.ldr   i  r  i  r)   )r   r
  r   r  r6   r9   r:   _TORCH_PATHtempfileTemporaryDirectoryrS   r  r  r  r  copytreer   rN   r0  endswithchmodr<   r   r?  r   r   r=  )
rj   r5  output_pathtorch_includes_pathtmp_dirsrcdest_include_pathtmp_output_pathr>  r?  s
             r   build_fbcode_rezCppBuilder.build_fbcode_re  s    .) 	B++-335GB"// ')ggll;	&J#002 5gKKWk0RS#66 WCgrww?O?OPS?T)UVW(*Wi(H%OO$79JK&8"''*:*:;*G'O ww~~k2		+.KK="++D1e4$--e4e4%5	B 	B5 5& 00 B1))'6:AB7	B 	BsB   I.AH!0FHH!H	H!!I+42I&&I++I..I7c                 F   | j                   r| j                         S t        | j                         t        j
                  j                  | j                  | j                   dt               }t        |       | j                         }t        ||       t        |       y)z
        It is must need a temporary directory to store object files in Windows.
        After build completed, delete the temporary directory to save disk space.
        r   r9  N)rb  r  r,  r  r6   r9   r:   r  _BUILD_TEMP_DIRr
  rE  r7  )rj   _build_tmp_dir	build_cmds      r   buildzCppBuilder.build  s    
 ""'')) !1!12Ao->?
 	!0))+		~6N#r!   
cmake_pathr  c                    dj                  | j                  j                               }t        j                  j
                  rdnd}t        j                  d| j                   d| j                   d| d      }t        j                  j
                  rt        j                  j                  rv|t        j                  d      z  }|t        j                  d| j                   d	| d
| j                   d	| j                   d| j                   d	| j                   d      z  }n3|t        j                  d| j                   d| j                   d      z  }|dk(  rst        j                  j                  Yddlm}  |       }|t        j                  d| j                   d| j                   d| j                   d| d| d| d| d      z  }t%        |d      5 }|j'                  |       ddd       y# 1 sw Y   yxY w)z
        Save global cmake settings here, e.g. compiler options.
        If targeting CUDA, also emit a custom function to embed CUDA kernels.
        r   STATICSHAREDzR
            cmake_minimum_required(VERSION 3.27 FATAL_ERROR)
            project(zs LANGUAGES CXX)
            set(CMAKE_CXX_STANDARD 17)

            # Set a library target
            add_library(z)

            z
                # May need to point CMAKE_PREFIX_PATH to the right torch location
                find_package(Torch REQUIRED)

                zT
                # Add macro definitions
                target_compile_definitions(	 PRIVATE zN)

                # Add compile flags
                target_compile_options(zS)

                # Backend-specific flags
                target_compile_options(z -c)

                z
                find_package(TorchStandalone REQUIRED)
                # Set up include directories to find headers at the correct paths
                target_include_directories(zU PRIVATE ${TorchStandalone_INCLUDE_DIRS})
                target_include_directories(zF PRIVATE ${TorchStandalone_INCLUDE_DIRS}/standalone)

                r  Nr   )_nvcc_arch_as_compile_optionz
                enable_language(CUDA)
                set(CMAKE_CUDA_STANDARD 17)
                find_package(CUDAToolkit REQUIRED)
                target_include_directories(zQ PRIVATE ${CUDAToolkit_INCLUDE_DIRS})
                target_compile_definitions(z9 PRIVATE USE_CUDA)
                target_link_libraries(ab   PRIVATE cuda CUDA::cudart_static)

                find_program(OBJCOPY_EXECUTABLE objcopy)
                if(NOT OBJCOPY_EXECUTABLE)
                    message(FATAL_ERROR "objcopy not found. Cannot embed fatbin as object file")
                endif()

                set(KERNEL_TARGETS "")
                set(KERNEL_OBJECT_FILES "")
                # Function to embed a single kernel
                function(embed_gpu_kernel KERNEL_NAME PTX_FILE)
                    set(FATBIN_BASENAME ${KERNEL_NAME}.fatbin)
                    set(FATBIN_FILE ${CMAKE_CURRENT_BINARY_DIR}/${FATBIN_BASENAME})
                    set(OBJECT_BASENAME ${KERNEL_NAME}.fatbin.o)
                    set(OBJECT_FILE ${CMAKE_CURRENT_BINARY_DIR}/${OBJECT_BASENAME})

                    # --- Define UNIQUE C symbol names ---
                    set(SYMBOL_START __${KERNEL_NAME}_start)
                    set(SYMBOL_END __${KERNEL_NAME}_end)
                    set(SYMBOL_SIZE __${KERNEL_NAME}_size)
                    string(REGEX REPLACE "[^a-zA-Z0-9]" "_" MANGLED_BASENAME ${FATBIN_FILE})
                    set(OBJCOPY_START_SYM _binary_${MANGLED_BASENAME}_start)
                    set(OBJCOPY_END_SYM _binary_${MANGLED_BASENAME}_end)
                    set(OBJCOPY_SIZE_SYM _binary_${MANGLED_BASENAME}_size)

                    # --- PTX to FATBIN Command & Target ---
                    add_custom_command(
                        OUTPUT ${FATBIN_FILE}
                        COMMAND ${CUDAToolkit_NVCC_EXECUTABLE} --fatbin ${PTX_FILE} -o ${FATBIN_FILE} ${NVCC_GENCODE_FLAGS}
                                -gencode arch=compute_z,code=compute_z7
                                -gencode arch=compute_z	,code=sm_a'  
                        DEPENDS ${PTX_FILE}
                    )

                    # --- FATBIN to Object File (.o) Command ---
                    add_custom_command(
                        OUTPUT ${OBJECT_FILE}
                        COMMAND ${CMAKE_LINKER} -r -b binary -z noexecstack -o ${OBJECT_FILE} ${FATBIN_FILE}
                        COMMAND ${OBJCOPY_EXECUTABLE} --rename-section .data=.rodata,alloc,load,readonly,data,contents
                                ${OBJECT_FILE}
                        COMMAND ${OBJCOPY_EXECUTABLE}
                                --redefine-sym ${OBJCOPY_START_SYM}=${SYMBOL_START}
                                --redefine-sym ${OBJCOPY_END_SYM}=${SYMBOL_END}
                                --redefine-sym ${OBJCOPY_SIZE_SYM}=${SYMBOL_SIZE}
                                ${OBJECT_FILE}
                        DEPENDS ${FATBIN_FILE}
                    )
                    add_custom_target(build_kernel_object_${KERNEL_NAME} DEPENDS ${OBJECT_FILE})

                    # --- Add to a list for linking later ---
                    set(KERNEL_TARGETS ${KERNEL_TARGETS} build_kernel_object_${KERNEL_NAME} PARENT_SCOPE)
                    set(KERNEL_OBJECT_FILES ${KERNEL_OBJECT_FILES} ${OBJECT_FILE} PARENT_SCOPE)
                endfunction()

                r  )r:   r  rp  r   r  compile_standalonetextwrapdedentr  test_configsuse_libtorchr  r  r  r  r  r3   r&  r  write)	rj   r!  r  rL  target_library_typecontentsr&  current_archr  s	            r   save_compile_cmd_to_cmakez$CppBuilder.save_compile_cmd_to_cmake  sL    hht11AACD++>>HH 	 ??&&' ( **+1-@,A B

 ##66""//  H ,,0,=,=+>i} U( )-(9(9':)DDUDUCV W( )-(9(9':)DDeDeCf g
 H , -1,=,=+> ?,,0,=,=+> ?	 H & U]]%6%6%>N79L, -1,=,=+> ?,,0,=,=+> ?''+'8'8&9 :7: 8DnNS_R` a77CnIl^ \I<> >H@ *c" 	aGGH	 	 	s   G77H src_pathc                     dt        |      j                  z   }t        |d      5 }|j                  d| j                   d| d       d d d        y # 1 sw Y   y xY w)N${CMAKE_CURRENT_SOURCE_DIR}/aztarget_sources(r%  z)
)r   r5  r  r,  r  )rj   r!  r1  r  s       r   save_src_to_cmakezCppBuilder.save_src_to_cmakes  s]    1DN4G4GG*c" 	QaGGod&7&7%8	(3OP	Q 	Q 	Qs   #AA	asm_filesc           	         t        |d      5 }|D ]n  }t        |      j                  j                  d      d   }dt        |      j                   }t	        j
                  d| d| d      }|j                  |       p |r>|j                  d| j                   d	       |j                  d
| j                   d       d d d        y # 1 sw Y   y xY w)Nr4  r}   r   r3  z&
                    embed_gpu_kernel(r   z)
                    zadd_dependencies(z ${KERNEL_TARGETS})
ztarget_link_libraries(z! PRIVATE ${KERNEL_OBJECT_FILES})
)r  r   r5  r   r(  r)  r,  r  )rj   r!  r6  r  asm_filer   r.  s          r   save_kernel_asm_to_cmakez#CppBuilder.save_kernel_asm_to_cmakey  s    *c" 	a% ""8n1177<Q?;DN<O<O;PQ#??&&1]!H: >
 !" +D,=,=+>>UVW,T->->,??cd	 	 	s   B4C

Cc                 6   t         j                  j                  rt         j                  j                  sy dj                  | j                  j                               }dj                  | j                  j                               }t        j                  d| j                   d| d| j                   d| d	      }t        j                  j                  |      sJ d| d       t        |d      5 }|j!                  |       d d d        y # 1 sw Y   y xY w)	Nr   z@
            # Add linker flags
            target_link_options(r%  zA)

            # Add libraries
            target_link_libraries(z)
         z#save_link_cmd_to_cmakefile expects z to already existr4  )r   r  r'  r*  r+  r:   r  rw  r{  r(  r)  r  r6   r9   rN   r  r,  )rj   r!  lflagsr+  r.  r  s         r   save_link_cmd_to_cmakez!CppBuilder.save_link_cmd_to_cmake  s   22''44 $,,88:;xx**88:;??!!%!2!2 39VH E# $(#4#4"5Ytf E

 ww~~j) 	
1*=NO	
) *c" 	aGGH	 	 	s   4DD)r   r   )r   r   r   r  staticmethodr   r   r  r  r  r  r
   r   rK  rk   r
  r  r  r   r0  r5  r9  r<  r   r!   r   r  r    s     'uS#X ' '
 'c3h ' '
 'E#s(O ' '
 'U38_ ' ' LGLG sDI~&LG &	LG
 LG 
LG\,# ,\;c ; B	 BD$$JJ J 
	JXQC Q3 Q4 Q3 49 QU $  r!   r  r  targetc                     dt         fd}dt         dt         dt         dt         fd} |       } ||t        |       t        |            }t        |t        |             y )	Nr   c                  H    t         rd} | S t               } t        |       rd} | S )Nml64rG   )r   r   r   )ASM_CCs    r   get_asm_compilerz.run_asm_build_object.<locals>.get_asm_compiler  s-    F 	 &'F!&)r!   asm_ccr  r>  c                 >    t         r|  d| d| }|S |  d| d| }|S )Nr   z /c /Fo z -c z -o r  )rD  r  r>  r   s       r   r
  z.run_asm_build_object.<locals>.get_command_line  sA     HAcU(6(3C 
 HDT&2C
r!   )rD  r  r>  r  )r   r   rE  )r  r>  r9  rC  r
  rD  r   s          r   run_asm_build_objectrF    sh    c  3    F
$S)'/C
 C5c:;r!   )T)zc++17)F)Tr   Fr   )FF)r  re   r*  	functoolsr  loggingr6   r5   r   r<  rS   r<   r4   r  r  r(  r"  collections.abcr   r   r   ctypes.utilr   pathlibr   typingr   r	   r
   r  torch._dynamo.utilsr   torch._inductorr   r   torch._inductor.cpu_vec_isar   r   %torch._inductor.runtime.runtime_utilsr   torch.torch_versionr   r   triton.fb.buildr   r   torch._inductor.fb.utilsr   r   r   r   r   r  r9   abspath__file___HEREr  r  r:   r  r  	_IS_LINUXrY  r   r   	getLoggerr   rO   	lru_cacher   rE   r;   cacher`   rb   r   r   r   r   r   r   r   r   r   r   r  r  r   r  r  r  r   r  r#  r,  r7  rB  rE  r   rK  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r&  r1  r6  r;  rD  rJ  re  rg  rj  r  r  r  r  r  r  r  r  r  rF  r   r!   r   <module>r[     s	         	  	    
     $ ! $  ' '  , ' ? ; , 6? s c d c S T S C D d 
 
!ggoobggooe45k+@A LL##G,	LL##H-	llg%'2 g! Q! ! ! !8s 4 
3 
4 
 
J JZ l
 l
 l
 l
^# "$ 5c? " 	 	
 	6 5# 5$ 5 5
 ?C ?D ? ? C# C$ C C c d  " (S (T ( (V ' ' ' )$ ) ) 24 2 2 / / / +D + +    *?DI ?c ?t ?49 c s t 	# 	$ 	6s 6 6 6.(c ( ( (
  t  t n S	 " "$s) "!S !T#Y !H# $s) tCy :5cDI1E+F & -2,,%),
49d3i ,^ c $ !#))) ) #	)
 ) 49d3icDItCy$s)TRUYVW)X5!! 5!pE49 E2d3i 2c '2'2'2 '2 49d3ic*+	'2T6 eDItCy<P6Q (33%)3
49d3ic*+3&
$s) 
0%S	49(<"= 02    tSy)  ( 
3 
# 
$ 
 
 ? ? ? ?<hUhU
49d3icDItCy$s)KLhUV
U49d3i#78 
$ 49 VVV V 	V
 V V 49d3icDItCy$s)TRUYVWVrA!j A!H7 Q $  -$s) - -" eee e 49d3icDItCy$s)TRUYVW	ePH@O H@V
38_0X Xv<c <3 <S <T <r!   