
    rhA                    (   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+m,Z, d dl-m.Z.m/Z/m0Z0m1Z1 n$dededdfdZ.dededdfdZ/dededdfdZ0de2fdZ1dZ3ejh                  jk                  e6      Z7ejh                  jq                  ejh                  jq                  e7            Z9ejh                  ju                  e9d      Z;ej                  jy                  d      Z=ej                  jy                  d      Z>ej                  dk(  Z?e?rdndZ@ ej                  eB      ZC ej                  d      deEdeEfd       ZFdeEfdZGej                  d eEddfd!       ZIdeEfd"ZJd#e2deKeEeEf   fd$ZLd%eEd&eEd'eEd(eEdeEf
d)ZMej                  d*eEde2fd+       ZNej                  d*eEde2fd,       ZOej                  d*eEde2fd-       ZPej                  d*eEde2fd.       ZQej                  d*eEde2fd/       ZRej                  de2fd0       ZSej                  de2fd1       ZTej                  de2fd2       ZUej                  de2fd3       ZVej                  de2fd4       ZWej                  d eEdeEfd5       ZXd6eYeE   d7eYeE   ddfd8ZZd9eYeE   deYeE   fd:Z[d;eEddfd<Z\d;eEddfd=Z]d>eEd?eEddfd@Z^d>eEd?eEddfdAZ_dBeEdeEfdCZ` G dD dE      ZadzdFe2deYeE   fdGZbd{dHeEdeYeE   fdIZcd*eEdeYeE   fdJZddeYeE   fdKZe	 d|d*eEdLe2deYeE   fdMZfdNe2deYeE   fdOZg	 	 	 d}d*eEdNe2dFe2dPeeE   dLe2deKeYeE   eYeE   eYeE   eYeE   eYeE   eYeE   eYeE   f   fdQZh G dR dSea      ZideYeE   fdTZjdeYeE   fdUZkdeYeE   fdVZldeYeE   fdWZmd*eEdXe2d#e2deKeYeE   eYeE   eYeE   f   fdYZndZe$deKeYeE   eYeE   f   fd[Zod\e2dXe2deKeYeE   eYeE   eYeE   f   fd]ZpdeYeE   fd^ZqdeKeYeE   eYeE   f   fd_Zrej                  de2fd`       Zsej                  deKe2eEf   fda       Ztej                  d*eEdbeEddfdc       Zuej                  d*eEddfdd       Zvd*eEdeKeYeE   eYeE   eYeE   eYeE   eYeE   eYeE   f   fdeZwdfe2deYeE   fdgZxd*eEdZe$d\e2dXe2d#e2dfe2deKeYeE   eYeE   eYeE   eYeE   eYeE   eYeE   eYeE   f   fdhZy G di djei      Zzd~dkZ{ ej                  dl      dmeEdee   fdn       Z|doeYeE   ddfdpZ}	 	 ddqeEdXe2dre2deKeYeE   eYeE   eYeE   eYeE   eYeE   eYeE   eYeE   f   fdsZ~ G dt duez      ZdveEdeKeEeEf   fdwZ G dx dy      Zy)    N)Sequence)cdll)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     n/var/www/html/ai-insurance-compliance-backend/venv/lib/python3.12/site-packages/torch/_inductor/cpp_builder.pyr   r   -           c                       y r   r   r   s     r   r   r   0   r   r    c                       y r   r   r   s     r   r   r   3   r   r    c                       y)NFr   r   r    r   r   r   6   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   K   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:   h   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    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)rc   r^   r   rd   r   rm   objcopy_fallbackrn   )rk   rm   rn   s      r   get_ld_and_objcopyrp      sf    :;;B % ,, ((  w; BGw;r    
cubin_filekernel_namerm   rn   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_outputtext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)rq   rr   rm   rn   obj_filecmd	file_names          r   convert_cubin_to_objr      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 )Nr1   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\+\+))r3   r4   r   rc   r|   r*   r^   bool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)NFrZ   r[   	Microsoftr   )	rc   r;   r<   r]   stripr   SUBPROCESS_DECODE_ARGSr   r>   )r   
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   r   r   r   rc   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   rj   r   r    r   is_gccr   &  s    #%&&r    c                  (    t        t                     S r   )r   rj   r   r    r   is_clangr   +  s    %'((r    c                  (    t        t                     S r   )r   rj   r   r    r   r   r   0  s    .011r    c                  (    t        t                     S r   )r   rj   r   r    r   is_apple_clangr   5  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    ry   
)
r5   rP   copyr;   r<   r]   r   r   	Exceptionreplace)rX   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>V  s     >TT]]4(>   !)extend)r   r   s     r   _append_listr   U  s    >X>>r    	orig_listc                 D    g }| D ]  }||vs|j                  |        |S r   append)r   new_listr   s      r   _remove_duplication_in_listr   Y  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   a  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   l  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)r   rx   rL   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;   rz   rU   r]   CalledProcessErrorrL   r   r3   r4   r   CppCompileError)r   r   r   eoutputopenmp_probleminstructions          r   _run_compile_cmdr   x  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
   r   )r   r   s     r   run_compile_cmdr     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     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.
    NrX   definitionsinclude_dirscflagsldflagslibraries_dirs	librariespassthrough_argsaot_moderk   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)selfrX   r   r   r   r   r   r   r   r   rk   r   r   r   s                 r   __init__zBuildOptionsBase.__init__  s      "'2'8b(4(:"(,B#*=b*8*>B%._",<,B 26'(9#/#/$1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    c                     | j                   S r   )r  r  s    r   get_precompilingz!BuildOptionsBase.get_precompiling  r  r    c                     | j                   S r   )r  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)rX   r   r   r   r   r   r   r   r   rk   r   w)r  r  r  r   r"  r$  r&  r(  r*  r,  r.  openjsondump)r  r3  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   NNNNNNNFFFFFr   N)__name__
__module____qualname____doc__strr   rh   r   r  r  r  r  r  r  r  r   r"  r$  r&  r(  r*  r,  r.  r0  r2  r;  r   r    r   r   r     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    r   warning_allc                      t         s| rdgS g S g S )NWallrc   )rB  s    r   _get_warning_all_cflagrF    s    &x.B.	r    std_numc                 ,    t         r		 d} d|  gS d|  gS )Nzc++20zstd:zstd=rE  )rG  s    r   _get_cpp_std_cflagrI    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   r   r   aot_inductor#raise_error_on_ignored_optimizationr   )r   r   ignored_optimization_arguments      r   _get_os_related_cpp_cflagsrY  '  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_flagsr\  B  s"    E x-.Lr    min_optimizec                    t         r|rdgS dgS t        j                  j                  }t        j                  j                  rddgn|r|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   rV  compile_wrapper_opt_leveldebug_compiler\  r   rg   enable_unsafe_math_opt_flag#enable_floating_point_contract_flagr3   r4   r   rd   machine)r   r]  wrapper_opt_levelr   s       r   _get_optimization_cflagsrl  W  s    $//$//"//II ""00 3K'3#yI 	
 	')),-zz55MM9:fjj&T&T%UVW<<8#|$78 ##%##%2MM-0  MM.1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)sharedrq  zundefined dynamic_lookuprt  )rc   r4   systemrj   )rm  s    r   _get_shared_cflagrv  x  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   }|j                  dj                  |             |||||	|
|fS )Nru   )rv  rl  rF  rI  rY  r   r9   )r   rm  rB  rw  r]  r   r   r   r   r   r   r   s               r   get_cpp_optionsry    s      K LFG "NI"$ 	'"
"<
>	?
 
-	. 
	 %\
2		3  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.
    r   rB  rw  rk   rX   r]  r   r   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)r   rk   r   r   )r   rm  rw  rB  r]  )superr  rj   r   ry  r   r  r  r  r  r  r  r  r  )r  r   rB  rw  rk   rX   r]  r   r   r   r   r   r   r   r   r   	__class__s                   r   r  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   rA  r  __classcell__r~  s   @r   r{  r{    s     # %'"'""#*!*! *! c]	*!
  *! *! *! *! *! 
*! *!r    r{  c                  r    t         s0dt        t        t        j                  j
                              z   gS g S )Nz-D_GLIBCXX_USE_CXX11_ABI=)rc   rA  inttorch_C_GLIBCXX_USE_CXX11_ABIr   r    r   _get_glibcxx_abi_build_flagsr    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_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)rc   r   rd   )fb_internal_macross    r   _use_fb_internal_macrosr    s+    "
 &%I	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   basenamer   	glibc_lib)r   r   rk   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>0  s     F1dmmA&Fr   zCPU_CAPABILITY=CPU_CAPABILITY_HAVE__CPU_DEFINITION)r   r   build_macrobuild_arch_flagsr   rd   rA  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&   r  	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 )Nr  rr  stdlibHeaderszPython.hzCan't find Python.h in )r   	sysconfigget_pathrM   r4   ru  parentabsolutewarningswarnrA  )include_dirstd_libs     r   _get_python_include_dirsr  R  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  rc   r   rA  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 --jsonr   r   F)	r;   r<   r{   r   lenr7  loadsr=   r>   )commandr   s     r   is_conda_llvm_openmp_installedr  x  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brew)Fr   )r  z--prefixr   r   )
rR   rS   r;   r<   r   r   r5   r8   rM   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   r5   r8   r9   rstripisfilerP   r   LoadLibraryr=   )r   r  r   omp_paths       r   perload_clang_libomp_winr    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  r5   r8   r  rP   r   r  r=   )r   r  r   r  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)rA  r   )r   r  preload_listr  s       r   perload_icx_libomp_winr    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   r5   r6   r8   r9   rM   r  r  r  unamerj  r  rc   r   r  r   r  r   rd   r   r  openmp_lib_so)r   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   )
r  r  r  r  r  r  r  r  r  r  )"r   r  r  r   rk   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  6  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                   ~     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  rB  r   r   rk   r  rt  rw  rX   r]  r   r   r   Nc           
         t         |   |||	||
|||       || _        t        | j                  |||||      \  }}}}}}}t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       | j                          y )N)r   rB  rw  rk   rX   r]  r   r   )r   r  r  r   rk   r  )r}  r  r	  r  r   r   r  r  r  r  r  r  r  r  )r  r  r  rB  r   r   rk   r  rt  rw  rX   r]  r   r   torch_definitionsr  torch_cflagstorch_ldflagsr  r  torch_passthrough_argsr~  s                        r   r  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   rA  r  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   rd   r  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_staticr3    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   
startswithr3  rA  rM   r   )r4  ir8   lib_dirstub_dirs        r   _transform_cuda_pathsr<    s     V$ -4"**$K9P)Q&<T&BGGF1I(H c(m,-r    device_typer   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                  |       }| 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      | dk(  r|j                  d       t        j                         rE|j                  t        j$                         |r$| dk(  rt        j                  j                  |sdg}	t         j&                  j(                  r|t         j&                  j(                  z  }|||||||	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_xpurI  zIntel GPU driver is not properly installed, please follow the instruction in https://github.com/pytorch/pytorch?tab=readme-ov-file#intel-gpu-support.mpsz USE_MPSz*-Wl,-Bstatic -lcudart_static -Wl,-Bdynamic)r   rd   r5   rP   r   r+  r,  torch.utilsr?  r  library_pathsr   r  r)  r*  r<  r   r   sdk_includerV  custom_op_libs)r=  r   r   r   r   r   r   r   r   r   r?  s              r   get_cpp_torch_device_optionsrP    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(^ 
 e:&K334v-}}  (#(T'U$))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=  r   r   rk   r  rt  rw  r]  r   r   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   rk   r  rw  r]  r   r   )r=  r   r   )r}  r  rP  r   r  r  r  r  r  r  r  r  )r  r  r  r=  r   r   rk   r  rt  rw  r]  r   r   device_definitionsdevice_include_dirsdevice_cflagsdevice_ldflagsdevice_libraries_dirsdevice_librariesdevice_passthrough_argsr~  s                       r   r  zCppTorchDeviceOptions.__init__E  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}  r  r   rd   r  r  r  r   r   )r  ry   python_lib_dirsr~  s      r   r  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   rA  r   r  r  r  r  s   @r   rR  rR  >  s     * %!""'!&%'""#6!6! 6! 	6!
 6! 6!  6! 6! 6! c]6! 6! 6! 6! 
6!p	@ 	@r    rR  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 according OS:
    Linux: /tmp/tmppu87g3mm/zh/czhwiz4z7ca7ep3qkxenxerfjxy42kehw6h5cjk6ven4qu4hql4i.so
    Windows: [Windows temp path]/tmppu87g3mm/zh/czhwiz4z7ca7ep3qkxenxerfjxy42kehw6h5cjk6ven4qu4hql4i.dll
    )r5   r8   r  splitextdirname)r   name_and_extr   _extdirs        r   &get_name_and_dir_from_output_file_pathrc    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-orE  	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.objrt   z/c /Foz-c -orE  ri  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/Fprh  )rc   r   ri  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 -orE  ri  s     r   __get_preprocessor_output_flagsz*CppBuilder.__get_preprocessor_output_flags  s    	#.xJ,&&r    r   sourcesBuildOption
output_dirNc                 *   d| _         d| _        d| _        d| _        d| _        d| _        d| _        d| _        g | _        d| _	        d| _
        d| _        d| _        || _        || _        |j                         | _         |j!                         | _        |j#                         | _        || _	        |j%                         | _        |j)                         | _        |j-                         | _        t1        | j&                  | j*                  | j.                  f      dk  sJ | j&                  xs | j*                  xs | j.                   | _        t4        r| j*                  rJ d       | j&                  r| j7                         \  }}nS| j*                  r| j9                         \  }}n3| j.                  r| j;                         \  }}n| j=                         \  }}t>        j@                  jC                  | j                  | j                   |       | _
        | j                  r)t>        j@                  jE                  | j                        n| j                  }t4        r | j.                  r|| _#        n| | | _#        n| d| | _#        tI        |tJ              r|g}tM        jN                         rT| j                  r| j                  r<tQ        |      | _        |D cg c]!  }t>        j@                  jE                  |      # }}| j*                  rtS        |      dk(  sJ d|d    | _*        ndjC                  |      | _*        |jW                         D ];  }	t4        r| xj                  d|	 dz  c_        #| xj                  d	|	 dz  c_        = |jY                         D ];  }
t4        r| xj                  d
|
 dz  c_        #| xj                  d|
 dz  c_        = |jZ                  x}r(t4        rt\        j_                  d|       nd| d| _        |ja                         D ]N  }t4        r| xj                  d| dz  c_        #| xj                  dtc        jd                  |       dz  c_        P |jg                         D ];  }t4        r| xj                  d| dz  c_        #| xj                  d	| dz  c_        = |ji                         D ];  }t4        r| xj
                  d| dz  c_        #| xj
                  d| dz  c_        = |jk                         D ];  }t4        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)   z/Cannot currently precompile headers on Windows!ru   z-x c++-header r   r   -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)7r   _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  r0  r  r2  r  sum_do_linkrc   _CppBuilder__get_object_flags)_CppBuilder__get_precompiled_header_flags*_CppBuilder__get_preprocessor_output_flags$_CppBuilder__get_python_module_flagsr5   r8   r9   r  _outputrf   rA  r   rd   rh   r  _sources_argsr   r  r  rN   warningr  r   quoter"  r$  r&  r(  )r  r   rs  rt  ru  file_extrk  relative_target_filer9  cflag
definitionr  inc_dirldflagr:  r  passthrough_args                    r   r  zCppBuilder.__init__  sV    !#"$$&!!,.) #%(-$
 )$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t~~9P9P '+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   &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 )NrX   rs  include_dirs_argsdefinitions_argscflags_argsldflags_argslibraries_argslibraries_dirs_argsr   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 )Nru   z /LD /link )rc   r  r   )rX   rs  r  r  r  r  r  r  r   r   r   r  s              r   format_build_commandz9CppBuilder.get_command_line.<locals>.format_build_commandU  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    )
rX   rs  r  r  r  r  r  r  r   r   )rA  r   r  r{  rz  ry  r|  r~  r}  r  r  )r  r  command_lines   `  r   get_command_linezCppBuilder.get_command_lineT  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)	Nr   r  z	script.ldrt   i  rg  i  r(   )r
   r  r{   r  r5   r8   r9   _TORCH_PATHtempfileTemporaryDirectoryrR   r   r  r  r  copytreer   rM   r   endswithchmodr;   r   r   r   r   r   )
r  r  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.
        ry   )r   N)r
  r  r   r  r5   r8   r9   r  _BUILD_TEMP_DIRr  r   r   )r  _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                  d| d| j
                   d| j                   d      }|dk(  rFt        j                  j                  ,dd	l
m}  |       }|t        j                  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.
        ru   a  
            cmake_minimum_required(VERSION 3.27 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@  Nr   )_nvcc_arch_as_compile_optiona  
                enable_language(CUDA)
                find_package(CUDAToolkit REQUIRED)

                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_80,code=compute_80
                                -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()

                r5  )r9   r  r  textwrapdedentry  r  r  r)  r*  r2   r  r6  write)r  r  r=  r   contentsr  current_archr:  s           r   save_compile_cmd_to_cmakez$CppBuilder.save_compile_cmd_to_cmake  s     hht11AACD??; <G- H7 8<7H7H6I J77;7X7X6Y Z#
, & U]]%6%6%>N79L 7@ 8DnIl^ \A8: :Hx *c" 	aGGH	 	 	s   4CCsrc_pathc                     dt        |      j                  z   }t        |d      5 }|j                  d| d       d d d        y # 1 sw Y   y xY w)N${CMAKE_CURRENT_SOURCE_DIR}/az"target_sources(aoti_model PRIVATE z)
)r   r   r6  r  )r  r  r  r:  s       r   save_src_to_cmakezCppBuilder.save_src_to_cmake  sQ    1DN4G4GG*c" 	HaGG8
#FG	H 	H 	Hs   AA	asm_filesc           	      p   t        |d      5 }|D ]n  }t        |      j                  j                  d      d   }dt        |      j                   }t	        j
                  d| d| d      }|j                  |       p |j                  d       |j                  d	       d d d        y # 1 sw Y   y xY w)
Nr  r   r   r  z&
                    embed_gpu_kernel(ru   z)
                    z/add_dependencies(aoti_model ${KERNEL_TARGETS})
zAtarget_link_libraries(aoti_model PRIVATE ${KERNEL_OBJECT_FILES})
)r6  r   r   r{   r  r  r  )r  r  r  r:  asm_filerr   r  s          r   save_kernel_asm_to_cmakez#CppBuilder.save_kernel_asm_to_cmake#  s    *c" 	a% ""8n1177<Q?;DN<O<O;PQ#??&&1]!H: >
 !" GGFGGGT	 	 	s   BB,,B5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)Nru   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   r  r"  r&  r  r  r5   r8   rM   r6  r  )r  r  lflagsr  r  r:  s         r   save_link_cmd_to_cmakez!CppBuilder.save_link_cmd_to_cmake4  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@  staticmethodri   rA  r  r  r  r  r	   rh   r   r  r  r  r  r  r  r  r  r  r   r    r   re  re    s     'uS#X ' '
 'c3h ' '
 'E#s(O ' '
 'U38_ ' ' HGHG sDI~&HG &	HG
 HG 
HGT,# ,\;c ; B	 BD$$bb b 
	bHHC H3 H4 H3 49 QU "  r    re  )T)zc++17)F)Tr   Fr<  )FF)r   r   	functoolsr7  loggingr5   r4   r|   r   rR   r;   r3   r  r  r  r  collections.abcr   ctypesr   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   rd   triton.fb.buildr   r   torch._inductor.fb.utilsr   r   r   r   r   r  r8   abspath__file___HEREr_  r  r9   r  r8  	_IS_LINUXr  rc   r   	getLoggerr=  rN   	lru_cacherA  rD   r:   cacher_   rj   ri   rp   r   r   r   r   r   r   r   r   r   r   r   r   rh   r   r   r   r   r   r   r   r   rF  rI  rY  r\  rl  rv  ry  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r,  r3  r<  rP  rR  rc  re  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 
 
# $ 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 6tCy , -2%)	#YBt S	 $ !#!!! ! #	!
 ! 49d3icDItCy$s)TRUYVW!H5!! 5!p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    tSy)  ( 
3 
# 
$ 
 
 ? ? ? ?<hUhU
49d3icDItCy$s)KLhUV$ 49 QQQ Q 	Q
 Q Q 49d3icDItCy$s)TRUYVWQhA!j A!H7 Q $  -$s) - -" JJJ J 49d3icDItCy$s)TRUYVW	JZH@O H@V
38_0d dr    