
    Vh                        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 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 jR                         rd dl*m+Z+ d dl,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 ZH ej                  d      d!eFddfd"       ZIdeFfd#ZJ ej                  d      d$eFde3fd%       ZK ej                  d      d$eFde3fd&       ZL ej                  d      d$eFde3fd'       ZM ej                  d      d$eFde3fd(       ZN ej                  d      d$eFde3fd)       ZO ej                  d      de3fd*       ZP ej                  d      de3fd+       ZQ ej                  d      de3fd,       ZR ej                  d      de3fd-       ZS ej                  d      de3fd.       ZTd!eFdeFfd/ZUd0eVeF   d1eVeF   ddfd2ZWd3eVeF   deVeF   fd4ZXd5eFddfd6ZYd5eFddfd7ZZd8eFd9eFddfd:Z[d8eFd9eFddfd;Z\d<eFdeFfd=Z] G d> d?      Z^dtd@e3deVeF   fdAZ_dudBeFdeVeF   fdCZ`d$eFdeVeF   fdDZadeVeF   fdEZb	 dvd$eFdFe3deVeF   fdGZcdHe3deVeF   fdIZd	 	 	 dwd$eFdHe3d@e3dJeeF   dFe3deeeVeF   eVeF   eVeF   eVeF   eVeF   eVeF   eVeF   f   fdKZf G dL dMe^      ZgdeVeF   fdNZhdeVeF   fdOZideVeF   fdPZjdeVeF   fdQZkd$eFdRe3dSe3deeeVeF   eVeF   eVeF   f   fdTZldUe$deeeVeF   eVeF   f   fdVZmdWe3dRe3deeeVeF   eVeF   eVeF   f   fdXZndeVeF   fdYZodeeeVeF   eVeF   f   fdZZp ej                  d      de3fd[       Zq ej                  d      deee3eFf   fd\       Zr ej                  d      d$eFd]eFddfd^       Zs ej                  d      d$eFddfd_       Ztd$eFdeeeVeF   eVeF   eVeF   eVeF   eVeF   eVeF   f   fd`Zudae3deVeF   fdbZvd$eFdUe$dWe3dRe3dHe3dSe3dae3deeeVeF   eVeF   eVeF   eVeF   eVeF   eVeF   eVeF   f   fdcZw G dd deeg      ZxdxdfZy ej                  dg      dheFdee   fdi       ZzdjeVeF   ddfdkZ{	 	 dydleFdRe3dHe3deeeVeF   eVeF   eVeF   eVeF   eVeF   eVeF   eVeF   f   fdmZ| G dn doex      Z}dpeFdeeeFeFf   fdqZ~ G dr ds      Zy)z    N)Sequence)cdll)find_library)Path)AnyOptionalUnion)dynamo_timed)configexc)invalid_vec_isaVecISA)	cache_dir)TorchVersion)build_paths)_run_build_command)log_global_cache_errorslog_global_cache_statslog_global_cache_valsuse_global_cacheargskwargsreturnc                       y N r   r   s     K/home/dcms/DCMS/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._filelockr/   pathjoininstall_gcc_via_conda
subprocesscheck_outputSubprocessErrorFileNotFoundErrorImportErrorr   InvalidCxxCompiler)r*   r,   r-   cxxr/   lock_dirlocks          r   cpp_compiler_searchrD   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)r5   r8   r9   r   existsloginfoenvirongetshutilwhichr;   
check_callPIPE)prefixcxx_pathrI   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=   )rX   r   s     r   check_compiler_exist_windowsr_      sZ    
7 3J<M<MN KZz@AsJ%% s   '* 	AAAAc                     t         r-t        j                  j                  dd      } 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_WINDOWSr5   rP   rQ   r_   r   	is_fbcoder   cc
isinstancecpprA   listtuplerD   )rX   r*   s     r   get_cpp_compilerrj      s    ::>>%.$X. O >>!fjjnntUm46::>>*Fjjnn&F&v.Or    cpp_compilerc                 x    t        j                  | dg      j                  d      }d|j                         d   v S )Nr1   utf8Appler   )r;   r<   decode
splitlines)rk   version_strings     r   _is_apple_clangrr      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\+\+))r3   r4   rr   rc   rer*   r^   boolrk   s    r   	_is_clangrw      sl     ||x|,,	99/>o  BIIm\:;;		.=>>r    c                 X    t        |       ryt        t        j                  d|             S )NFz(gcc|g\+\+))rw   ru   rt   r*   rv   s    r   _is_gccry      s%     		.,788r    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)NFrZ   r[   	Microsoftr   )	rc   r;   r<   r]   stripro   SUBPROCESS_DECODE_ARGSrp   r>   )rk   
output_msgs     r   _is_msvc_clr      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 .N)rc   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    r1   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|   ro   r}   rp   rc   rt   r*   r^   groupr>   r=   )rk   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   )ry   rj   r   r    r   is_gccr      s    #%&&r    c                  (    t        t                     S r   )rw   rj   r   r    r   is_clangr      s    %'((r    c                  (    t        t                     S r   )r   rj   r   r    r   r   r     s    .011r    c                  (    t        t                     S r   )rr   rj   r   r    r   is_apple_clangr   
  s    +-..r    c                  (    t        t                     S r   )r   rj   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\   envr1    _
)
r5   rP   copyr;   r<   r]   ro   r}   	Exceptionreplace)rX   r   rq   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   append)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 )	r5   r8   rM   r   mkdirOSErrorerrnoEEXISTr^   )r   r   s     r   _create_if_dir_not_existr   5  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)r5   r8   rM   walkr9   removermdir)r   rootdirsfilesname	file_pathdir_paths          r   _remove_dirr   @  s    	ww~~h!#5!A 	#D$ %GGLLt4			)$%  #77<<d3"#		# 	  r    cmd_linecwdc                 b   t        j                  |       }	 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)N)r   r   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.)shlexsplitr;   r<   r]   CalledProcessErroroutputro   r3   r4   r   CppCompileError)r   r   cmder   openmp_probleminstructions          r   _run_compile_cmdr   L  s    
++h
C6Sc*:K:KL(( 6)1V;Qx6?Qcllh62  k!F!!#v.A56s   &> B.AB))B.c                 \    t        d      5  t        | |       d d d        y # 1 sw Y   y xY w)Ncompile_file)r
   r   )r   r   s     r   run_compile_cmdr   a  s)    	n	% (3'( ( (s   "+	orig_pathc                 R    t         r | j                  t        j                  d      S | S )N/)rc   r   r5   sep)r   s    r   normalize_path_separatorr   f  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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ddfdZy)"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.
    NrX   definitionsinclude_dirscflagsldflagslibraries_dirs	librariespassthrough_argsaot_modeuse_relative_pathcompile_onlyr   c                     || _         |xs g | _        |xs g | _        |xs g | _        |xs g | _        |xs g | _        |xs g | _        |xs g | _        |	| _        |
| _	        || _
        y r   )	_compiler_definitions_include_dirs_cflags_ldflags_libraries_dirs
_libraries_passthrough_args	_aot_mode_use_relative_path_compile_only)selfrX   r   r   r   r   r   r   r   r   r   r   s               r   __init__zBuildOptionsBase.__init__s  sw     "'2'8b(4(:"(,B#*=b*8*>B%._",<,B'(9#/r    c                 :    | j                   rg | _        g | _        y y r   )r   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   r   r   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   )r   r   r   s    r   _finalize_optionsz"BuildOptionsBase._finalize_options  s    **,&&(r    c                     | j                   S r   )r   r   s    r   get_compilerzBuildOptionsBase.get_compiler      ~~r    c                     | j                   S r   )r   r   s    r   get_definitionsz BuildOptionsBase.get_definitions  s       r    c                     | j                   S r   )r   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   )r   r   s    r   get_aot_modezBuildOptionsBase.get_aot_mode  r  r    c                     | j                   S r   )r   r   s    r   get_use_relative_pathz&BuildOptionsBase.get_use_relative_path  s    &&&r    c                     | j                   S r   )r   r   s    r   get_compile_onlyz!BuildOptionsBase.get_compile_only  r  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)rX   r   r   r   r   r   r   r   r   r   r   w)r  r  r  r	  r  r  r  r  r  r  r  openjsondump)r   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   NNNNNNNFFFr   N)__name__
__module____qualname____doc__strr   rh   ru   r   r   r   r   r  r  r  r	  r  r  r  r  r  r  r  r   r   r    r   r   r   l  s    +/,0&*'+.2)-04"'"00 d3i(0 tCy)	0
 c#0 $s)$0 !c+0 DI&0 #49-0 0  0 0 
08!
U)c !c !"$s) "DI T#Y $DI $tCy &d3i &d 't '"$ " s  t  r    r   warning_allc                      t         s| rdgS g S g S )NWallrc   )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                  |       |S )N)wd4819wd4251wd4244wd4267wd4275wd4018wd4190wd4624wd4067wd4068EHsczWno-unused-variablezWno-unknown-pragmasz$Werror=ignored-optimization-argumentz!Wno-ignored-optimization-argument)rc   rw   r   aot_inductor#raise_error_on_ignored_optimizationr   )rk   r   ignored_optimization_arguments      r   _get_os_related_cpp_cflagsr>    sZ    
, M ()>?\" &&JJ 78 *
 MM78Mr    c                  D    g d} t               r| j                  d       | S )N)zfno-trapping-mathzfunsafe-math-optimizationszffinite-math-onlyzfno-signed-zeroszfno-math-errnozfexcess-precision=fast)r   r   )flagss    r   _get_ffast_math_flagsrA    s"    E x-.Lr    min_optimizec                 T   t         r|rdgS dgS t        j                  j                  rddgn|rdnddg}|t	               z  }|j                  d       t        j                  j                  s|j                  d       |j                  d	t        j                  j                          t        j                  d
k7  rkt        |       r|j                  d       t        j                         s;t        j                         dk(  r|j                  d       |S |j                  d       |S )NO1O2O0gO3DNDEBUGzfno-finite-math-onlyzfno-unsafe-math-optimizationszffp-contract=r&   zfno-tree-loop-vectorizeppc64lezmcpu=nativezmarch=native)rc   r   r;  debug_compilerA  r   rg   enable_unsafe_math_opt_flag#enable_floating_point_contract_flagr3   r4   ry   rd   machine)rk   rB  r   s      r   _get_optimization_cflagsrO    s     $//$// ""00 3K&$D)< 	
 	')),-zz55MM9:fjj&T&T%UVW<<8#|$78 ##%##%2MM-0  MM.1r    r   c                 |    t         r	 ddg}|S | r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)sharedrS  zundefined dynamic_lookuprV  )rc   r4   systemrj   )r   SHARED_FLAGs     r   _get_shared_cflagrY  ;  sT    	 dm  8O??(W8H8J-JAAf%%r    extra_flagsc                     g }g }g }g }g }	g }
g }t        |      t        | |      z   t        |      z   t               z   t	        |       z   }|j                  dj                  |             |||||	|
|fS )N )rY  rO  r+  r.  r>  r   r9   )rk   r   r'  rZ  rB  r   r   r   r   r   r   r   s               r   get_cpp_optionsr]  N  s      K LFG "NI"$ 	,'
"<
>	?
 
-	. 
	 %\
2		3  CHH[12 	 r    c                   T     e Zd ZdZ	 	 	 	 	 	 ddedede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.
    r   r'  rZ  r   rX   rB  r   Nc                    t         |           |r|n	t               | _        || _        || _        t        | j                  ||||      \  }}}	}
}}}t        | j                  |       t        | j                  |       t        | j                  |	       t        | j                  |
       t        | j                  |       t        | j                  |       t        | j                  |       | j                          y )N)rk   r   rZ  r'  rB  )superr   rj   r   r   r   r]  r   r   r   r   r   r   r   r   r   )r   r   r'  rZ  r   rX   rB  r   r   r   r   r   r   r   	__class__s                 r   r   zCppOptions.__init__}  s     	%-3C3E"3) %##%
	
 	T&&4T''6T\\6*T]]G,T))>:T__i0T++-=> r    )FTr   Fr   F)	r"  r#  r$  r%  ru   r   r&  r   __classcell__rb  s   @r   r_  r_  r  sn     # %'"'"%!%! %! c]	%!
  %! %! %! 
%! %!r    r_  c                  r    t         s0dt        t        t        j                  j
                              z   gS g S )Nz-D_GLIBCXX_USE_CXX11_ABI=)rc   r&  inttorch_C_GLIBCXX_USE_CXX11_ABIr   r    r   _get_glibcxx_abi_build_flagsrj    s,    +c#ehh6U6U2V.WWXX	r    c                  
    ddgS )NTORCH_INDUCTOR_CPP_WRAPPERSTANDALONE_TORCH_HEADERr   r   r    r   !_get_torch_cpp_wrapper_definitionrn    s    (*CDDr    c                      dgS )Nz" C10_USING_CUSTOM_GENERATED_MACROSr   r   r    r   _use_custom_generated_macrosrp    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)rc   r   rd   )fb_internal_macross    r   _use_fb_internal_macrosrv    s+    "
 &%I	r    r   r   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)rc   r   rd   r   r   sleef_includeopenmp_includepython_include
cc_includelibgcc_includelibgcc_arch_includelibgcc_backward_includeglibc_includelinux_kernel_include_LINKER_SCRIPTr5   r8   basenamerw   	glibc_lib)rk   r   r   r   r   r   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   rd   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&   rg  	torch_cputorch_pythonsleef)	torch.utils.cpp_extensionr  r  r3   r4   r   rd   r   rc   )r  r   r  r  r   r   r   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 )Nry  rT  stdlibHeaderszPython.hzCan't find Python.h in )r   	sysconfigget_pathrM   r4   rW  parentabsolutewarningswarnr&  )include_dirstd_libs     r   _get_python_include_dirsr    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 )Nry  ntposix_prefix)schemelibsLIBDIR)r  r  r  rc   r   r&  r   r  r  get_config_varr   rd   r   r|  )python_include_dirspython_include_pathpython_lib_paths      r   _get_python_related_argsr  !  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 --jsonrm   r   F)	r;   r<   r   ro   lenr  loadsr=   r>   )commandr   s     r   is_conda_llvm_openmp_installedr  :  sd    1((9@@H4::f%&**&&(9: s   AA A32A3c                     	 t        j                  ddg       t        j                  g d      j                  d      j                         } t        j
                  j                  |       }|| fS # t         j                  $ r Y yw xY w)NrS   brew)r  z--prefixr   rm   )Fr   )r;   r<   ro   r|   r5   r8   rM   r=   )libomp_pathomp_availables     r   homebrew_libompr  D  sw    & 12
 ##$BCVF^UW 	 {3k))%% s   A-A0 0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=binrm   TRUEKMP_DUPLICATE_LIB_OK)r;   r<   ro   r5   r8   r9   rstripisfilerP   r   LoadLibraryr=   )rk   r  r   omp_paths       r   perload_clang_libomp_winr  X  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 )Nrk   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   ro   r}   r  r5   r8   r  rP   r   r  r=   )rk   r  r   r  s       r   _load_icx_built_in_lib_by_namez>perload_icx_libomp_win.<locals>._load_icx_built_in_lib_by_nameh  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&  ru   )rk   r  preload_listr  s       r   perload_icx_libomp_winr  f  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_PREFIXry  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   rr   r5   r6   r8   r9   rM   r  r  r  unamerN  r  rc   rw   r  r   r  r   rd   r   r{  openmp_lib_so)rk   r   r   include_dir_pathslib_dir_pathsr  r   r  
omp_prefixheader_path	valid_envconda_prefixconda_lib_pathr  
openmp_libfb_openmp_extra_flagss                   r   _get_openmp_argsr    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    use_mmap_weightsc                 0    g }| r|j                  d       |S )Nz USE_MMAP_SELFr   )r  r  s     r   get_mmap_self_macror    s    F&'Mr    c                    g }g }g }	g }
g }g }g }t               }t               }t        | ||      \  }}}t        |      \  }}t	        ||      \  }}}t               \  }}t        |       \  }}}}}}t               } t               }!t        |      }"||z   |z   |!z   |"z   }||z   |z   |z   }||z   }	|}
||z   |z   }||z   }||z   | z   |z   }|||	|
|||fS )N)r  r   )
rn  rp  r  r  r  r  r  rj  rv  r  )#rk   r  r  r   r   r   r  r   r   r   r   r   r   r   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cxx_abi_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.. 	&  <= 7 9*+;< 	&
1	2
	 $	$ 		  	
	
	  	   z)FG*-AADUUN')I!
!	"
"	# 	  	 r    c                   r     e Zd ZdZe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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'  r   r   r   r  rV  rZ  rX   rB  r   Nc           	         t         |   |||	||
|       || _        t        | j                  ||||||      \  }}}}}}}t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       | j                          y )N)r   r'  rZ  r   rX   rB  )rk   r  r  r   r   r   r  )ra  r   r   r  r   r   r   r   r   r   r   r   r   r   )r   r  r  r'  r   r   r   r  rV  rZ  rX   rB  torch_definitionsr  torch_cflagstorch_ldflagsr  r  torch_passthrough_argsrb  s                      r   r   zCppTorchOptions.__init__X  s     	%##/% 	 	
 " "+%/-
	
 " 	T&&(9:T'');<T\\<0T]]M2T))+?@T__o6T++-CD r    )r"  r#  r$  r%  r   r   ru   r   r&  r   rc  rd  s   @r   r  r  L  s    	 * % ""'!&%'"2!2! 2! 	2!
 2! 2!  2! 2! 2! c]2! 2! 2! 
2! 2!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   rd   rg  versionhipr5   rP   r   sdk_homer   r    r   _set_gpu_runtime_envr    s^    MM%rzz)rzz)"-"6"6

; * * & 	r       r8   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 )rh   r   rglobresolver  rN   rO   )r8   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)	enumerater5   rP   
startswithr  r&  rM   r   )r  ir8   lib_dirstub_dirs        r   _transform_cuda_pathsr     s     V$ -4"**$K9P)Q&<T&BGGF1I(H c(m,-r    device_typec                 R   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                  |       }| 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(  r4|j                  d       |dgz  }|g dz  }t!        d      st#        d      |rEt        j                         r1ddlm} t        j(                  j+                   |              g}||z  }t        j                         rE|j                  t        j,                         |r$| dk(  rt        j                  j                  |sdg}	|||||||	fS )Nr  r  r   )cpp_extensioncudaz	 USE_ROCMz	 USE_CUDAamdhip64c10_hip	torch_hipz __HIP_PLATFORM_AMD__)c10_cudar$  
torch_cudaxpuz USE_XPUzWno-comment)c10_xpusycl	ze_loader	torch_xpur-  zIntel GPU driver is not properly installed, please follow the instruction in https://github.com/pytorch/pytorch?tab=readme-ov-file#intel-gpu-support.cpp_prefix_pathz*-Wl,-Bstatic -lcudart_static -Wl,-Bdynamic)r   rd   r5   rP   r   r  r  torch.utilsr#  r  library_pathsr   rg  r  r  r   r   r   r2   r0  r8   dirnamesdk_include)r!  r   r   r   r   r   r   r   r   r   r#  r0  cpp_prefix_include_dirs                r   get_cpp_torch_device_optionsr6    s   
  K LFG "NI"$rzz)rzz)"-"6"6

;) ..{;L"00=Nf%--*;*;;M==(!j\)	i55	67!fX%	??	!.1e:&=/!BB	K(^ 
 A)+9J)K(L%N"22LK334v-}}  (#(T'U$ 	 r    c                   x     e Zd ZdZe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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!  r   r   r   r  rV  rZ  rB  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  r   r   r   r  rZ  rB  )r!  r   r   )ra  r   r6  r   r   r   r   r   r   r   r   r   )r   r  r  r!  r   r   r   r  rV  rZ  rB  device_definitionsdevice_include_dirsdevice_cflagsdevice_ldflagsdevice_libraries_dirsdevice_librariesdevice_passthrough_argsrb  s                     r   r   zCppTorchDeviceOptions.__init__  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   )	ra  r   r   rd   r  r  r   r   r   )r   r   python_lib_dirsrb  s      r   r   z'CppTorchDeviceOptions._finalize_options9  s    !# ":!;A'1,S0A/AR.SS,q!T%9%99$$++OA,>?$$++OA,>? : r    r!  )r"  r#  r$  r%  r   r   ru   r&  r   r   r   rc  rd  s   @r   r8  r8    s     * %!""'!&%'"2!2! 2! 	2!
 2! 2!  2! 2! 2! c]2! 2! 
2!h	@ 	@r    r8  r   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 accoding OS:
    Linux: /tmp/tmppu87g3mm/zh/czhwiz4z7ca7ep3qkxenxerfjxy42kehw6h5cjk6ven4qu4hql4i.so
    Windows: [Windows temp path]/tmppu87g3mm/zh/czhwiz4z7ca7ep3qkxenxerfjxy42kehw6h5cjk6ven4qu4hql4i.dll
    )r5   r8   r  splitextr3  )r   name_and_extr   _extdirs        r   &get_name_and_dir_from_output_file_pathrH  E  sL    " 77##I.L!!,/JD$
''//)
$C9r    c                       e Zd ZdZdefdZde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d	fdZded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 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                     t         rd}|S d}|S )Nz.pyd.sor*  )r   SHARED_LIB_EXTs     r   __get_python_module_extz"CppBuilder.__get_python_module_extn  s    #. 5:r    c                     t         rd}|S d}|S )Nz.obj.or*  )r   EXTs     r   __get_object_extzCppBuilder.__get_object_extr  s    #f
 *.
r    r   sourcesBuildOption
output_dirNc                    d| _         d| _        d| _        d| _        d| _        d| _        d| _        d| _        g | _        d| _	        d| _
        d| _        d| _        || _        || _        |j                         | _         |j!                         | _        |j#                         | _        || _	        |j%                         | _        | j&                  r| j)                         n| j+                         }t,        j.                  j1                  | j                  | j                   |       | _
        t3        |t4              r|g}t7        j8                         re| j                  r| j                  s|}n3|D cg c]!  }t,        j.                  j;                  |      # }}|| _        dj1                  |      | _        ndj1                  |      | _        |j?                         D ];  }t@        r| xj                  d| dz  c_        #| xj                  d| dz  c_        = |jC                         D ];  }	t@        r| xj                  d|	 dz  c_        #| xj                  d|	 dz  c_        = |jE                         D ];  }
t@        r| xj                  d|
 d	z  c_        #| xj                  d
|
 dz  c_        = |jG                         D ];  }t@        r| xj                  d| dz  c_        #| xj                  d| dz  c_        = |jI                         D ];  }t@        r| xj
                  d| d	z  c_        #| xj
                  d| dz  c_        = |jK                         D ];  }t@        r| xj                  d| dz  c_        #| xj                  d| dz  c_        = |jM                         D ]  }| xj                  | dz  c_         y c c}w )Nr   Fr\  r   -z/D z-D z/I "z" z-Iz
/LIBPATH:"z-L"z.lib" z-l)'r   _cflags_args_definitions_args_include_dirs_args_ldflags_args_libraries_dirs_args_libraries_args_passthrough_parameters_args_orig_source_paths_output_dir_target_filer   r   _name_build_optionr  r  r  r  r   _CppBuilder__get_object_ext"_CppBuilder__get_python_module_extr5   r8   r9   rf   r&  r   rd   r  _sources_argsr	  rc   r  r  r  r  r  r  )r   r   rS  rT  rU  file_extinp_namer  cflag
definitioninc_dirldflagr  r  passthrough_args                  r   r   zCppBuilder.__init__v  s    !#"$$&!!,.) #%(-$
 )$113"-"C"C"E$113%(99; !! !!#--/ 	
 GGLL)9)9djj\(;TUgs#iG~~d&=&=" :AAABGG,,Q/AA*1'!$(!3D!$'!2D ++- 	2E!!qq\1!!!qq\1!		2 &557 	>J&&C
|1*==&&&C
|1*==&		> #335 	;G''T'"+=='''Ry?:'		; "--/ 	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U Bs   4&O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                  r)t        j                  j                   j                        n j                  
      }|S )NrX   rS  include_dirs_argsdefinitions_argscflags_argsldflags_argslibraries_argslibraries_dirs_argsr   target_filer   c
                    t         r-|  d| d| d| d| d| d|	 d| d| d| d}
t        |
      }
|
S j                  rdnd}t        j                  ddd|  d| d| d| d| d| d| d| d| d| d|	 d      j                         }
|
S )	Nr\  z /LD /Fez /link z-cr   z[ \n]+z
                    z -o )rc   r   r   rt   subr|   )rX   rS  rp  rq  rr  rs  rt  ru  r   rv  r   compile_only_argr   s               r   format_build_commandz9CppBuilder.get_command_line.<locals>.format_build_command  s      j"3!4A6F5GqUVW^V__`'(WEXDYYZ[iZjjklxkyyz|  /s3 J ,0+=+=42 ffJay*:);1[MK\J] ^%&a~Q~6FaH[G\\]^n]oost  tA A %'  Jr    )
rX   rS  rp  rq  rr  rs  rt  ru  r   rv  )r&  r   rg  r[  rZ  rY  r\  r^  r]  r_  r   r5   r8   r  rb  )r   rz  command_lines   `  r   get_command_linezCppBuilder.get_command_line  s   			  #	 "		
 	 	  	 "%	 "	 	 	@ ,^^&&"55!33))++// $ 9 9!>>&& (():):;""
 r    c                 ,    t        | j                        S r   )r   rb  r   s    r   get_target_file_pathzCppBuilder.get_target_file_path  s    '(9(9::r    c                    ddl m} t        d      5  | j                         j	                         }	  |       }t
        j                  j                  |      }| j                  }t
        j                  j                  t        d      }t        j                         5 }t        j                  |t
        j                  j                  ||             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.        j0                  $ r7}|j2                  j5                  d
      }t7        j8                  ||      |d }~ww xY w# 1 sw Y   y xY w)Nr   r/  r   ry  z	script.ldrP  i  rL  i  r(   )r2   r0  r
   r|  r   r5   r8   r  rb  r9   _TORCH_PATHtempfileTemporaryDirectoryrR   r   r  r`  copytreer   rM   r   endswithchmodr;   r   r   ro   r   r   )r   r0  r  r  header_name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-/ gg..{;"// ')ggll;	&J#002 5gKKRWW\\';-OP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?!	B !	BsB   KA*JGI5$J5I>	:JK2KKKK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 temperary directory to store object files in Windows.
        After build completed, delete the temperary directory to save disk space.
        r   )r   N)r   r  r   ra  r5   r8   r9   rc  _BUILD_TEMP_DIRr|  r   r   )r   _build_tmp_dir	build_cmds      r   buildzCppBuilder.build2  s    
 ""'')) !1!12Ao->?
 	!0))+		~6N#r    
cmake_pathc           	          dj                  | j                  j                               }t        j                  d| d| j
                   d| j                   d      }t        |d      5 }|j                  |       d d d        y # 1 sw Y   y xY w)Nr\  a  
            cmake_minimum_required(VERSION 3.18 FATAL_ERROR)
            project(aoti_model LANGUAGES CXX)
            set(CMAKE_CXX_STANDARD 17)

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

            # Set a shared library target
            add_library(aoti_model SHARED)

            # Add macro definitions
            target_compile_definitions(aoti_model PRIVATE zY)

            # Add compile flags
            target_compile_options(aoti_model PRIVATE z])
            # Backend specific flags
            target_compile_options(aoti_model PRIVATE z -c)

            r  )	r9   rd  r  textwrapdedentrY  r_  r  write)r   r  r   contentsr  s        r   save_compile_cmd_to_cmakez$CppBuilder.save_compile_cmd_to_cmakeD  s     hht11AACD??; <G- H7 8<7H7H6I J77;7X7X6Y Z#
, *c" 	aGGH	 	 	s   )BBsrc_pathc                     dt        |      j                  z   }t        |d      5 }|j                  d| d       d d d        y # 1 sw Y   y xY w)Nz${CMAKE_CURRENT_SOURCE_DIR}/az"target_sources(aoti_model PRIVATE z)
)r   r   r  r  )r   r  r  r  s       r   save_src_to_cmakezCppBuilder.save_src_to_cmakeb  sQ    1DN4G4GG*c" 	HaGG8
#FG	H 	H 	Hs   AAc                    dj                  | j                  j                               }dj                  | j                  j                               }t	        j
                  d| 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\  zS
            # Add linker flags
            target_link_options(aoti_model PRIVATE zT)

            # Add libraries
            target_link_libraries(aoti_model PRIVATE z)
         z#save_link_cmd_to_cmakefile expects z to already existr  )r9   rd  r  r  r  r  r5   r8   rM   r  r  )r   r  lflagsr  r  r  s         r   save_link_cmd_to_cmakez!CppBuilder.save_link_cmd_to_cmakeh  s    $,,88:;xx**88:;??44:8 <6 7;V <

 ww~~j) 	
1*=NO	
) *c" 	aGGH	 	 	s   %C  C	)r   r!  )r"  r#  r$  r%  r&  rf  re  r	   rh   r   r   r|  r~  r  r  r  r  r  r   r    r   rJ  rJ  ]  s      #  ^G^G sDI~&^G &	^G
 ^G 
^G@/# /b;c ;&B	&BP$$ 
<HC H3 H4 H  r    rJ  )T)zc++17)F)Tr   Fr!  )FF)r   r   	functoolsr  loggingr5   r4   rt   r   rR   r;   r3   r  r  r  r  collections.abcr   ctypesr   ctypes.utilr   pathlibr   typingr   r   r	   rg  torch._dynamo.utilsr
   torch._inductorr   r   torch._inductor.cpu_vec_isar   r   %torch._inductor.runtime.runtime_utilsr   torch.torch_versionr   rd   	triton.fbr   triton.fb.buildr   torch._inductor.fb.utilsr   r   r   r   ru   r  r8   abspath__file___HEREr3  r  r9   r  r  	_IS_LINUXr  rc   r}   	getLoggerr"  rN   	lru_cacher&  rD   r:   r_   rj   rr   rw   ry   r   r   r   r   r   r   r   r   rh   r   r   r   r   r   r   r   r   r+  r.  r>  rA  rO  rY  ri   r]  r_  rj  rn  rp  rv  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r6  r8  rH  rJ  r   r    r   <module>r     s:	        	  	    
     $  $  ' '  , ' ? ; , 6%2 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 T
3 
4 
 
#  T5# 5$ 5 5
 T?C ?D ? ? T9# 9$ 9 9 Tc d  " T(S (T ( (V T' ' ' T)$ ) ) T24 2 2 T/ / / T+D + +  *?DI ?c ?t ?49 c s t 	# 	$ 	6s 6 6 6*(c ( ( (
  f  f R S	 " "$s) "S T#Y 6tCy , -2%)	#Y@D T#Y , !#!!! ! #	!
 ! 49d3icDItCy$s)TRUYVW!H0!! 0!fd3i 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 T   TtSy)  & T
3 
# 
$ 
 
 T? ? ? ?<hUhU
49d3icDItCy$s)KLhUV$ 49 RRR R 	R
 R R R 49d3icDItCy$s)TRUYVWRj>!j >!B7 Q $  -$s) - -" KKK K 49d3icDItCy$s)TRUYVW	K\D@O D@N
38_0\ \r    