
    sh                        S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
r
S SKrS SKrS SKrS SKrS SKrS SKJr  S SKJr  S SKJr  S SKJr  S SKJrJrJr  S SKrS SKJr  S SKJ r J!r!  S S	K"J#r#J$r$  S S
K%J&r&  S SK'J(r(  \ RR                  " 5       (       a  S SK*J+r+  S SK,J-r-  S SK.J/r/J0r0J1r1J2r2  O(S\S\SS4S jr/S\S\SS4S jr0S\S\SS4S jr1S\34S jr2Sr4\Rj                  Rm                  \75      r8\Rj                  Rs                  \Rj                  Rs                  \85      5      r:\Rj                  Rw                  \:S5      r<\R                  R{                  S5      r>\R                  R{                  S5      r?\R                  S:H  r@\@(       a  SOSrA\R                  " \C5      rD\R                  " S5      S\FS\F4S j5       rGS\F4S  jrH\R                  " S5      S!\FSS4S" j5       rIS\F4S# jrJ\R                  " S5      S$\FS\34S% j5       rK\R                  " S5      S$\FS\34S& j5       rL\R                  " S5      S$\FS\34S' j5       rM\R                  " S5      S$\FS\34S( j5       rN\R                  " S5      S$\FS\34S) j5       rO\R                  " S5      S\34S* j5       rP\R                  " S5      S\34S+ j5       rQ\R                  " S5      S\34S, j5       rR\R                  " S5      S\34S- j5       rS\R                  " S5      S\34S. j5       rTS!\FS\F4S/ jrUS0\V\F   S1\V\F   SS4S2 jrWS3\V\F   S\V\F   4S4 jrXS5\FSS4S6 jrYS5\FSS4S7 jrZS8\FS9\FSS4S: jr[S8\FS9\FSS4S; jr\S<\FS\F4S= jr] " S> S?5      r^StS@\3S\V\F   4SA jjr_SuSB\FS\V\F   4SC jjr`S$\FS\V\F   4SD jraS\V\F   4SE jrb SvS$\FSF\3S\V\F   4SG jjrcSH\3S\V\F   4SI jrd   SwS$\FSH\3S@\3SJ\\F   SF\3S\e\V\F   \V\F   \V\F   \V\F   \V\F   \V\F   \V\F   4   4SK jjrf " SL SM\^5      rgS\V\F   4SN jrhS\V\F   4SO jriS\V\F   4SP jrjS\V\F   4SQ jrkS$\FSR\3SS\3S\e\V\F   \V\F   \V\F   4   4ST jrlSU\$S\e\V\F   \V\F   4   4SV jrmSW\3SR\3S\e\V\F   \V\F   \V\F   4   4SX jrnS\V\F   4SY jroS\e\V\F   \V\F   4   4SZ jrp\R                  " S5      S\34S[ j5       rq\R                  " S5      S\e\3\F4   4S\ j5       rr\R                  " S5      S$\FS]\FSS4S^ j5       rs\R                  " S5      S$\FSS4S_ j5       rtS$\FS\e\V\F   \V\F   \V\F   \V\F   \V\F   \V\F   4   4S` jruSa\3S\V\F   4Sb jrvS$\FSU\$SW\3SR\3SH\3SS\3Sa\3S\e\V\F   \V\F   \V\F   \V\F   \V\F   \V\F   \V\F   4   4Sc jrw " Sd Se\g5      rxSxSf jry\R                  " Sg5      Sh\FS\\   4Si j5       rzSj\V\F   SS4Sk jr{  SySl\FSR\3SH\3S\e\V\F   \V\F   \V\F   \V\F   \V\F   \V\F   \V\F   4   4Sm jjr| " Sn So\x5      r}Sp\FS\e\F\F4   4Sq jr~ " Sr Ss5      rg)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                      g N r   r   s     o/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/torch/_inductor/cpp_builder.pyr   r   .           c                      g r   r   r   s     r   r   r   1   r   r    c                      g r   r   r   s     r   r   r   4   r   r    c                      g)NFr   r   r    r   r   r   7   s    r    CxxBuildz_inductor/script.ldlinuxdarwinwin32)utf-8r      searchc                    SSK JnJn  U  H  n Ucz  [        R                  S:w  a  M  [
        R                  " S5      (       d  M:  SSKJn  U" 5       nU" [
        R                  R                  US5      US9nU   [        5       nS S S 5        [        R                  " US/5        Us  $    ["        R$                  e! , (       d  f       N<= f! [        R                  [        [         4 a     M  f = f)	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 /1C ##S+$67J' , 
 
   T **,={K 		s4   CC4C9B:!C:
C	CC.-C.c            
         [         R                  R                  [        5       S5      n [         R                  R                  U SS5      n[         R                  R	                  U5      (       d  [
        R                  S5        [         R                  R                  SS5      nUc  [        R                  " S5      nUb.  [        R                  " USSU  3S	S
SSS/[        R                  S9  U$ )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                      [         R                  " U S/[         R                  S9  g! [         a  n[	        SU  S35      UeSnAf[         R
                   a     gf = f)zM
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                     [         (       a-  [        R                  R                  SS5      n [	        U 5        U $ [
        R                  " 5       (       a  [        R                  $ [        [
        R                  R                  [        [        45      (       a$  [        [
        R                  R                  5      nO[
        R                  R                  4n[        U5      n U $ )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46::>>*Fjjnn&F&v.Or    cpp_compilerc                 |    [         R                  " U S/5      R                  S5      nSUR                  5       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                 $   [         R                  S:X  a  [        U 5      $ [        (       aG  [        R
                  " SU 5      (       a  [        S5      e[        [        R
                  " SU 5      5      $ [        [        R
                  " SU 5      5      $ )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      sq     ||x|,,	99/>>o  BIIm\:;;		.=>>r    c                 d    [        U 5      (       a  g[        [        R                  " SU 5      5      $ )NFz(gcc|g\+\+))rw   ru   rt   r*   rv   s    r   _is_gccry      s(     		.,788r    c                     [         (       d  g [        R                  " U S/[        R                  S9R	                  5       R
                  " [        6 nSUR                  5       S   ;   $ ! [         a     gf = f)NFrZ   r[   	Microsoftr   )	rc   r;   r<   r]   stripro   SUBPROCESS_DECODE_ARGSrp   r>   )rk   
output_msgs     r   _is_msvc_clr      su    ;##\7$;JDUDUVUWV+- 	
 j335a888 s   AA( (
A54A5c                 
   S[         SS 4S jn [        R                  " U S/[        R                  S9R	                  5       R
                  " [        6 nSUR                  5       S   ;   nU(       an  [        (       a'  [        R                  " SU 5      (       a  [        S	5      e[        R                  " S
U5      nUb"  UR                  S5      nU" [        U5      5        U$ ! [         a     g[        R                   a     gf = f)Ncompiler_versionr   c                 ^    [         (       a  SOSnU [        U5      :  a  [        SU S35      eg)zg
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_version2_is_intel_compiler.<locals>._check_minimal_version   s:     %0KjW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     $ ##{+J4F4F UWV	 ,	- 	 $z'<'<'>q'AA{992LAA&u 
  YY'A:NN)(..q1&|G'<=   %% s   CC   
D,DDc                  (    [        [        5       5      $ r   )ry   rj   r   r    r   is_gccr      s    #%&&r    c                  (    [        [        5       5      $ r   )rw   rj   r   r    r   is_clangr      s    %'((r    c                  (    [        [        5       5      $ r   )r   rj   r   r    r   r   r     s    .011r    c                  (    [        [        5       5      $ r   )rr   rj   r   r    r   is_apple_clangr   
  s    +-..r    c                  (    [        [        5       5      $ r   )r   rj   r   r    r   
is_msvc_clr     s    ')**r    c                    [         R                  R                  5       nSUS'    [        R                  " U S/[        R
                  US9R                  " [        6 nUR                  SS5      nUR                  S	S5      nU$ ! [         aL     [        R                  " U S/[        R
                  US9R                  " [        6 n Nj! [         a      gf = ff = f)
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  	'44;'
0A0Asf,.N  		s)   7B 
C7C
CCCC	dest_listsrc_listc                 4    U R                  S U 5       5        g )Nc              3   N   #    U  H  n[         R                  " U5      v   M     g 7fr   r   deepcopy).0items     r   	<genexpr>_append_list.<locals>.<genexpr>*  s     >XTT]]4((X   #%)extend)r   r   s     r   _append_listr   )  s    >X>>r    	orig_listc                 L    / nU  H  nX!;  d  M
  UR                  U5        M     U$ r   append)r   new_listr   s      r   _remove_duplication_in_listr   -  s*    HOOD!  Or    path_dirc                    [         R                  R                  U 5      (       d   [        U 5      R	                  SSS9  g g ! [
         a6  nUR                  [        R                  :w  a  [        SU  35      e S nAg S nAff = f)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  st    77>>(##	N   = $  	yyELL("*8*5  )	s   A 
B,A<<Bc                    [         R                  R                  U 5      (       a  [         R                  " U SS9 H  u  pnU H8  n[         R                  R	                  X5      n[         R
                  " U5        M:     U H8  n[         R                  R	                  X5      n[         R                  " U5        M:     M     [         R                  " U 5        g g )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4			)$  77<<3" 	 "B 	  r    cmd_linecwdc                 x   [         R                  " U 5      n [        R                  " X![        R                  S9  g ! [        R
                   ai  nUR                  R                  S5      nSU;   =(       d    SU;   nU(       a  [        R                  S:X  a  SnXF-  n[        R                  " X$5      UeS nAff = f)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S*:K:KL(( 6)1V;Qx6?Qcllh62  !F!!#.A56s   #< B9A$B44B9c                 d    [        S5         [        X5        S S S 5        g ! , (       d  f       g = f)Ncompile_file)r
   r   )r   r   s     r   run_compile_cmdr   a  s    	n	%' 
&	%	%s   !
/	orig_pathc                 \    [         (       a   U R                  [        R                  S5      $ U $ )N/)rc   r   r5   sep)r   s    r   normalize_path_separatorr   f  s$    {  --r    c                      \ rS rSrSr           S"S\S\\\      S\\\      S\\\      S\\\      S	\\\      S
\\\      S\\\      S\S\S\SS4S jjr	S#S jr
S#S jrS#S jrS\4S jrS\\   4S jrS\\   4S jrS\\   4S jrS\\   4S jrS\\   4S jrS\\   4S jrS\\   4S jrS\4S jrS\4S jrS\4S jrS\SS4S  jrS!rg)$BuildOptionsBaseil  z
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l         U=(       d    / U l        U=(       d    / U l        U=(       d    / U l        U=(       d    / U l        U=(       d    / U l        U=(       d    / U l        U=(       d    / U l        Xl        Xl	        Xl
        g 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__BuildOptionsBase.__init__s  so     "'2'8b(4(:"(,B#*=b*8*>B%._",<,B'(9#/r    c                 D    U R                   (       a  / U l        / U l        g g r   )r   r   r   r   s    r   _process_compile_only_options.BuildOptionsBase._process_compile_only_options  s    #%D  DO r    c                 p   [        U R                  5      U l        [        U R                  5      U l        [        U R                  5      U l        [        U R                  5      U l        [        U R
                  5      U l        [        U R                  5      U l        [        U R                  5      U l        g r   )r   r   r   r   r   r   r   r   r   s    r   _remove_duplicate_options*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    U R                  5         U R                  5         g r   )r   r  r   s    r   _finalize_options"BuildOptionsBase._finalize_options  s    **,&&(r    c                     U R                   $ r   )r   r   s    r   get_compilerBuildOptionsBase.get_compiler      ~~r    c                     U R                   $ r   )r   r   s    r   get_definitions BuildOptionsBase.get_definitions  s       r    c                     U R                   $ r   )r   r   s    r   get_include_dirs!BuildOptionsBase.get_include_dirs      !!!r    c                     U R                   $ r   )r   r   s    r   
get_cflagsBuildOptionsBase.get_cflags  s    ||r    c                     U R                   $ r   )r   r   s    r   get_ldflagsBuildOptionsBase.get_ldflags  s    }}r    c                     U R                   $ r   )r   r   s    r   get_libraries_dirs#BuildOptionsBase.get_libraries_dirs  s    ###r    c                     U R                   $ r   )r   r   s    r   get_librariesBuildOptionsBase.get_libraries  s    r    c                     U R                   $ r   )r   r   s    r   get_passthrough_args%BuildOptionsBase.get_passthrough_args  s    %%%r    c                     U R                   $ r   r   r   s    r   get_aot_modeBuildOptionsBase.get_aot_mode  r	  r    c                     U R                   $ r   )r   r   s    r   get_use_relative_path&BuildOptionsBase.get_use_relative_path  s    &&&r    c                     U R                   $ r   )r   r   s    r   get_compile_only!BuildOptionsBase.get_compile_only  r  r    filec                    U R                  5       U R                  5       U R                  5       U R                  5       U R	                  5       U R                  5       U R                  5       U R                  5       U R                  5       U R                  5       U R                  5       S.n[        US5       n[        R                  " X#5        S S S 5        g ! , (       d  f       g = f)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_json#BuildOptionsBase.save_flags_to_json  s    ))+//1 113oo''')"557++- $ 9 9 ;))+!%!;!;!= 113
 $_IIe __s   5C
C#)r   r   r   r   r   r   r   r   r   r   r   )r   NNNNNNNFFFr   N)__name__
__module____qualname____firstlineno____doc__strr   rh   ru   r   r   r  r  r  r  r  r  r  r  r  r  r"  r%  r(  r2  __static_attributes__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                 4    [         (       d  U (       a  S/$ / $ / $ )NWallrc   )r<  s    r   _get_warning_all_cflagr@    s    ;&x.B.	r    std_numc                 6    [         (       a	   Sn SU  3/$ SU  3/$ )Nzc++20zstd:zstd=r?  )rA  s    r   _get_cpp_std_cflagrC    s3    {	 wi !!wi !!r    c                     [         (       a  / SQnU$ SS/n[        U 5      (       a4  [        R                  R                  (       a  SOSnUR                  U5        U$ )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_cflagsrS    s_    {
, M ()>?\"" &&JJ 78 *
 MM78Mr    c                  N    / SQn [        5       (       a  U R                  S5        U $ )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_flagsrV    s$    E xx-.Lr    min_optimizec                    [         (       a  U(       a  S/$ S/$ [        R                  R                  (       a  SS/OU(       a  SOSS/nU[	        5       -  nUR                  S5        [        R                  R                  (       d  UR                  S5        UR                  S	[        R                  R                   35        [        R                  S
:w  ax  [        U 5      (       a  UR                  S5        [        R                  " 5       (       d=  [        R                  " 5       S:X  a  UR                  S5        U$ UR                  S5        U$ )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   rP  debug_compilerV  r   rg   enable_unsafe_math_opt_flag#enable_floating_point_contract_flagr3   r4   ry   rd   machine)rk   rW  r   s      r   _get_optimization_cflagsrd    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                     [         (       a   SS/nU$ U (       a  S/$ [        R                  " 5       S:X  a  S[        5       ;   a  / SQ$ SS/$ )NDLLMDfPICDarwinclang)sharedrh  zundefined dynamic_lookuprk  )rc   r4   systemrj   )r   SHARED_FLAGs     r   _get_shared_cflagrn  ;  sV    {	 dm  8O??(W8H8J-JAAf%%r    extra_flagsc                     / n/ n/ n/ n/ n	/ n
/ n[        U5      [        X5      -   [        U5      -   [        5       -   [	        U 5      -   nUR                  SR                  U5      5        UUUUU	U
U4$ )N )rn  rd  r@  rC  rS  r   r9   )rk   r   r<  ro  rW  r   r   r   r   r   r   r   s               r   get_cpp_optionsrr  N  s      K LFG "NI"$ 	,'
"<
>	?
 
-	. 
	 %\
2		3  CHH[12 	 r    c                   b   ^  \ rS rSrSr      SS\S\S\\   S\S\S\S	S
4U 4S jjjrSr	U =r
$ )
CppOptionsir  a(  
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<  ro  r   rX   rW  r   Nc                   > [         TU ]  5         U(       a  UO	[        5       U l        X@l        Xl        [        U R                  UUUUS9u  nnn	n
nnn[        U R                  U5        [        U R                  U5        [        U R                  U	5        [        U R                  U
5        [        U R                  U5        [        U R                  U5        [        U R                  U5        U R                  5         g )N)rk   r   ro  r<  rW  )superr   rj   r   r   r   rr  r   r   r   r   r   r   r   r   r  )r   r   r<  ro  r   rX   rW  r   r   r   r   r   r   r   	__class__s                 r   r   CppOptions.__init__}  s     	%-3C3E"3) %##%
	
 	T&&4T''6T\\6*T]]G,T))>:T__i0T++-=> r    )r   r   r   )FTr   Fr   F)r5  r6  r7  r8  r9  ru   r   r:  r   r;  __classcell__rw  s   @r   rt  rt  r  sn     # %'"'"%!%! %! c]	%!
  %! %! %! 
%! %!r    rt  c                  |    [         (       d0  S[        [        [        R                  R
                  5      5      -   /$ / $ )Nz-D_GLIBCXX_USE_CXX11_ABI=)rc   r:  inttorch_C_GLIBCXX_USE_CXX11_ABIr   r    r   _get_glibcxx_abi_build_flagsr    s.    ;+c#ehh6U6U2V.WWXX	r    c                  
    SS/$ )NTORCH_INDUCTOR_CPP_WRAPPERSTANDALONE_TORCH_HEADERr   r   r    r   !_get_torch_cpp_wrapper_definitionr    s    (*CDDr    c                      S/$ )Nz" C10_USING_CUSTOM_GENERATED_MACROSr   r   r    r   _use_custom_generated_macrosr    s    011r    c                  `    [         (       d"  [        R                  " 5       (       a  / SQn U $ / $ / $ )N)C10_USE_GLOGC10_USE_MINIMAL_GLOG$C10_DISABLE_TENSORIMPL_EXTENSIBILITY)rc   r   rd   )fb_internal_macross    r   _use_fb_internal_macrosr    s0    ;"
 &%I	r    r   r   c                 `   / n/ n/ n[         (       a  X4U4$ [        R                  " 5       (       Ga  UR                  S5        UR                  [        R
                  5        UR                  [        R                  5        UR                  [        R                  5        UR                  [        R                  5        UR                  [        R                  5        UR                  [        R                  5        UR                  [        R                  5        UR                  [        R                  5        UR                  [        R                  5        UR                  S5        U(       a  U(       d  [        nO#[        R                   R#                  [        5      n[%        U 5      (       az  UR                  S5        UR                  S5        UR                  SU 35        UR                  S[        R&                  -   5        UR                  S[        R&                  -   5        X4U4$ )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                    / n/ nU [         :w  ay  UR                  S U R                  5        5       5        U R                  5       /n[        R
                  " 5       (       a(  [        U 5      R                  5       nSU 3SU 3SU S3/nX4$ )Nc              3   N   #    U  H  n[         R                  " U5      v   M     g 7fr   r   )r   xs     r   r   0_get_build_args_of_chosen_isa.<locals>.<genexpr>  s     F0E1dmmA&&0Er   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                     SSK JnJn  U" 5       nU/n/ n[        R                  S:w  a6  [
        R                  " 5       (       d  SS/nU(       d  UR                  S5        [        (       a  UR                  S5        XEU4$ )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    so     H ?L$%NI
||x(8(8(:(:k*	^,{!22r    c                     [        [        R                  " S5      5      n U R                  5       (       d_  [        R
                  " 5       S:X  aF  [        [        R                  " S5      5      nUR                  R                  S-  R                  5       n U S-  R                  5       (       d"  [        R                  " S[        U 5       35        [        U 5      /$ )Nr  ri  stdlibHeaderszPython.hzCan't find Python.h in )r   	sysconfigget_pathrM   r4   rl  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            	         [        5       n [        R                  " S[        (       a  SOSS9nUb  U R	                  U5        [        (       aD  [        [        [        R                  " SSS95      R                  S-  R                  5       5      /nO[        R                  " S5      /n[        R                  " 5       (       a  U R	                  [        R                  5        X4$ )Nr  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                       Sn [         R                  " U R                  5       5      R                  S5      n[	        [
        R                  " U5      5      S:  $ ! [         R                  [        4 a     gf = f)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 A65A6c                      [         R                  " SS/5        [         R                  " / SQ5      R                  S5      R                  5       n [        R
                  R                  U 5      nX4$ ! [         R                   a     gf = f)NrS   brew)r  z--prefixr   rm   )Fr   )r;   r<   ro   r|   r5   r8   rM   r=   )libomp_pathomp_availables     r   homebrew_libompr  D  su    & 12
 ##$BCVF^UW 	 {3))%% s   A.A1 1BBomp_namec                     [         R                  " U S/5      R                  S5      n[        R                  R                  UR                  5       U5      n[        R                  R                  U5      (       a*  S[        R                  S'   [        R                  " U5        g g ! [         R                   a     g f = f)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& &B=<B=c                 ^    S[         S[         S[        4S jn / SQnU H  nU" X5        M     g )Nrk   lib_namer   c                 j    [         R                  " U SU 3/[         R                  S9R                  " [        6 nUR                  5       n[        R                  R                  U5      (       a*  S[        R                  S'   [        R                  " U5        g g! [         R                   a     gf = f)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_name>perload_icx_libomp_win.<locals>._load_icx_built_in_lib_by_nameh  s    	,,!28*=>!)) f -.F }}Hww~~h''5;

12  * (  )) 		s   BB B21B2)zlibiomp5md.dllzsvml_dispmd.dllz
libmmd.dll)r:  ru   )rk   r  preload_listr  s       r   perload_icx_libomp_winr  f  s<    S C D L !&|> !r    c                    / n/ n/ n/ n/ n/ n[         (       Ga  UR                  S5        UR                  S5        [        U 5      (       + n[        R                  " S5      nUb  [        R
                  R                  USS5      n	[        R
                  R                  U	5      n
U
(       a_  UR                  [        R
                  R                  US5      5        UR                  [        R
                  R                  US5      5        O[        R                  " S5        U=(       d    U
nU(       d  UR                  S5        [        R                  " S	5      nU(       d  Ub  [        5       nU(       a  [        R
                  R                  US5      nUR                  [        R
                  R                  US5      5        UR                  U5        [        R                  " 5       R                  S
:X  aS  [        R
                  R                  [        R
                  R                  US5      5      (       a  UR                  S5        U(       dq  [        5       u  p}U(       a^  UR                  [        R
                  R                  US5      5        UR                  [        R
                  R                  US5      5        GO[        (       a   [        U 5      (       a0  UR                  S5        UR                  S5        [!        U S5        GOJ[#        U 5      (       a/  UR                  S5        UR                  S5        [%        U 5        GOUR                  S5        UR                  S5        O[&        R(                  " 5       (       aW  UR                  [*        R,                  5        [*        R.                  nSU 3nUR                  U5        UR                  S5        Ow[        U 5      (       a#  UR                  S5        UR                  S5        OD[#        U 5      (       a  UR                  S5        O"UR                  S5        UR                  S5        XX4XV4$ )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   rr   r5   r6   r8   r9   rM   r  r  r  unamerc  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"$y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 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1j)i(F#-dTTr    use_mmap_weightsc                 :    / nU (       a  UR                  S5        U$ )Nz USE_MMAP_SELFr   )r  r  s     r   get_mmap_self_macror    s    F&'Mr    c                    / n/ n/ n	/ n
/ n/ n/ n[        5       n[        5       n[        XU5      u  nnn[        U5      u  nn[	        X#S9u  nnn[        5       u  nn[        U 5      u  nnnnnn[        5       n [        5       n![        U5      n"UU-   U-   U!-   U"-   nUU-   U-   U-   nUU-   n	Un
UU-   U-   nUU-   nUU-   U -   U-   nUUU	U
UUU4$ )N)r  r   )
r  r  r  r  r  r  r  r  r  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+ 	!9JK	! +H*P'J' 	 S	 2J1K.. 	&  <= 7 9*+;< 	&
1	2
	 $	$ 		  	
	
	  	   z)FG*-AADUUN')I!
!	"
"	# 	  	 r    c                      ^  \ rS rSrSr\SSSSSSSSSS4S\S\S	\S
\S\S\S\S\S\\	   S\	S\SS4U 4S jjjr
SrU =r$ )CppTorchOptionsiL  aB  
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  rk  ro  rX   rW  r   Nc           
        > [         TU ]  UUU	UU
US9  X@l        [        U R                  UUUUUUS9u  nnnnnnn[        U R                  U5        [        U R                  U5        [        U R                  U5        [        U R                  U5        [        U R                  U5        [        U R                  U5        [        U R                  U5        U R                  5         g )N)r   r<  ro  r   rX   rW  )rk   r  r  r   r   r   r  )rv  r   r   r  r   r   r   r   r   r   r   r   r   r  )r   r  r  r<  r   r   r   r  rk  ro  rX   rW  torch_definitionsr  torch_cflagstorch_ldflagsr  r  torch_passthrough_argsrw  s                      r   r   CppTorchOptions.__init__X  s     	%##/% 	 	
 " "+%/-
	
 " 	T&&(9:T'');<T\\<0T]]M2T))+?@T__o6T++-CD r    r!  )r5  r6  r7  r8  r9  r   r   ru   r   r:  r   r;  ry  rz  s   @r   r  r  L  s    	 * % ""'!&%'"2!2! 2! 	2!
 2! 2!  2! 2! 2! c]2! 2! 2! 
2! 2!r    r  c                     [         R                  " 5       (       ah  [        R                  R                  cL  S[
        R                  ;  a7  S[
        R                  ;  a"  [        R                  [
        R                  S'   g g g g g )N	CUDA_HOME	CUDA_PATH)	r   rd   r}  versionhipr5   rP   r   sdk_homer   r    r   _set_gpu_runtime_envr)    sa    MM%rzz)rzz)"-"6"6

; * * & 	r       r8   c                     [        [        U 5      R                  S5      5      nU(       a  US   R                  5       R                  $ SU  3n[
        R                  U5        g )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_staticr0    sS    DJ$$%9:;H{""$+++5dV<GHHWr    lpathsc                 P   [        U 5       H  u  pS[        R                  ;   d  M  UR                  [        R                  S   5      (       d  MD  [	        U5      nUc  MT  [        U5      X'   US-  nUR                  5       (       d  M}  U R                  [        U5      5        M     g )Nr$  stubs)	enumerater5   rP   
startswithr0  r:  rM   r   )r1  ir8   lib_dirstub_dirs        r   _transform_cuda_pathsr9    s|     V$"**$K9P)Q)Q&<T&BGGFI(H  c(m, %r    device_typec                    / n/ n/ n/ n/ n/ n/ n	[         R                  " 5       (       aI  S[        R                  ;  a5  S[        R                  ;  a!  [        R
                  [        R                  S'   [        5         SSKJn
  U
R                  U 5      nU
R                  U 5      nU S:X  a  UR                  [        R                  R                  (       a  SOS5        [        R                  R                  b:  [         R                  " 5       (       a  US/-  nOUS	S
/-  nUR                  S5        O3[         R                  " 5       (       a  US/-  nOU/ SQ-  n[        U5        U S:X  a9  UR                  S5        US/-  nU/ SQ-  n[!        S5      (       d  [#        S5      eU(       aJ  [         R                  " 5       (       a0  SSKJn  [        R(                  R+                  U" 5       5       /nXL-  n[         R                  " 5       (       aQ  UR                  [        R,                  5        U(       a+  U S:X  a%  [        R                  R                  c
  U(       d  S/n	UUUUUUU	4$ )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_xpurF  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   r}  r&  r'  r9  r   r   r2   rI  r8   dirnamesdk_include)r:  r   r   r   r   r   r   r   r   r   r<  rI  cpp_prefix_include_dirs                r   get_cpp_torch_device_optionsrO    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"2LK334v-}}  (#(T'U$ 	 r    c                      ^  \ rS rSrSr\SSSSSSSSS4
S\S\S	\S
\S\S\S\S\S\	\   S\SS4U 4S jjjr
SU 4S jjrSrU =r$ )CppTorchDeviceOptionsi  z
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  rk  ro  rW  r   Nc                   > [         TU ]  UUUUUUU	U
S9  / n/ n/ n/ n/ n/ n/ n[        X4US9u  nnnnnnn[        U R                  U5        [        U R
                  U5        [        U R                  U5        [        U R                  U5        [        U R                  U5        [        U R                  U5        [        U R                  U5        U R                  5         g )N)r  r  r   r   r   r  ro  rW  )r:  r   r   )rv  r   rO  r   r   r   r   r   r   r   r   r  )r   r  r  r:  r   r   r   r  rk  ro  rW  device_definitionsdevice_include_dirsdevice_cflagsdevice_ldflagsdevice_libraries_dirsdevice_librariesdevice_passthrough_argsrw  s                     r   r   CppTorchDeviceOptions.__init__  s     	+%/-#% 	 		
 )+)+#%$&+-&(-/ )#\
	
!# 	T&&(:;T'')<=T\\=1T]]N3T))+@AT__&67T++-DE r    c                 B  > [         TU ]  5         [        R                  " 5       (       av  [	        5       u  p[        U5      S:X  d
   SU 35       eUS   U R                  ;   a=  U R                  R                  US   5        U R                  R                  US   5        g g g )Nr)   zPython lib dirs: r   )	rv  r  r   rd   r  r  r   r   r   )r   r   python_lib_dirsrw  s      r   r  'CppTorchDeviceOptions._finalize_options9  s    !# ":!;A'1,S0A/AR.SS,q!T%9%99$$++OA,>?$$++OA,>? : r    r4  )r5  r6  r7  r8  r9  r   r   ru   r:  r   r   r  r;  ry  rz  s   @r   rQ  rQ    s     * %!""'!&%'"2!2! 2! 	2!
 2! 2!  2! 2! 2! c]2! 2! 
2! 2!h	@ 	@r    rQ  r   c                     [         R                  R                  U 5      n[         R                  R                  U5      u  p#[         R                  R	                  U 5      nX$4$ )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  splitextrL  )r   name_and_extr   _extdirs        r   &get_name_and_dir_from_output_file_pathrc  E  sH    " 77##I.L!!,/JD
''//)
$C9r    c                       \ rS rSrSrS\4S jrS\4S jr SS\S\\\	\   4   S\
S	\SS
4
S jjrS\4S jrS\4S jr  SS jrSS jrS\SS
4S jrS\S\SS
4S jrS\SS
4S jrSrg
)
CppBuilderi]  af  
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                 (    [         (       a  SnU$ SnU$ )Nz.pyd.sor?  )r   SHARED_LIB_EXTs     r   __get_python_module_ext"CppBuilder.__get_python_module_extn  s    #.; 5:r    c                 (    [         (       a  SnU$ SnU$ )Nz.obj.or?  )r   EXTs     r   __get_object_extCppBuilder.__get_object_extr  s    #f
 *.
r    r   sourcesBuildOption
output_dirNc                 D   SU l         SU l        SU l        SU l        SU l        SU l        SU l        SU l        / U l        SU l	        SU l
        SU l        SU l        Xl        X0l        UR                  5       U l         UR!                  5       U l        UR#                  5       U l        X@l	        UR%                  5       U l        U R&                  (       a  U R)                  5       OU R+                  5       n[,        R.                  R1                  U R                  U R                   U 35      U l
        [3        U[4        5      (       a  U/n[6        R8                  " 5       (       aq  U R                  (       a  U R                  (       d  UnO5U Vs/ s H"  n[,        R.                  R;                  U5      PM$     nnX l        SR1                  U5      U l        OSR1                  U5      U l        UR?                  5        HB  n[@        (       a  U =R                  SU S3-  sl        M)  U =R                  SU S3-  sl        MD     URC                  5        HB  n	[@        (       a  U =R                  SU	 S3-  sl        M)  U =R                  SU	 S3-  sl        MD     URE                  5        HB  n
[@        (       a  U =R                  SU
 S	3-  sl        M)  U =R                  S
U
 S3-  sl        MD     URG                  5        HB  n[@        (       a  U =R                  SU S3-  sl        M)  U =R                  SU S3-  sl        MD     URI                  5        HB  n[@        (       a  U =R
                  SU S	3-  sl        M)  U =R
                  SU S3-  sl        MD     URK                  5        HB  n[@        (       a  U =R                  SU S3-  sl        M)  U =R                  SU S3-  sl        MD     URM                  5        H  nU =R                  U S3-  sl        M     g s  snf )Nr   Frq  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   rp  rq  rr  file_extinp_namer6  cflag
definitioninc_dirldflagr7  r  passthrough_args                  r   r   CppBuilder.__init__v  s    !#"$$&!!,.) #%(-$
 )$113"-"C"C"E$113%(99; !! !!#--/ 	
 GGLL)9)9djj\(;TUgs##iG~~d&=&=" :AAABGG,,Q/A*1'!$(!3D!$'!2D ++-E{!!qq\1!!!qq\1!	 . &557J{&&C
|1*==&&&C
|1*==&	 8 #335G{''T'"+=='''Ry?:'	 6 "--/F{""&m3"""&m3"	 0 #557G{))z'"-EE)))r'!_<)	 8 ,,.C{$$!C57$$$"SE3$	 /  +??AO--O3DA1FF-  BU Bs   )Pc                   ^  S[         S[         S[         S[         S[         S[         S[         S[         S	[         S
[         S[         4U 4S jjnU" T R                  T R                  T R                  T R                  T R
                  T R                  T R                  T R                  T R                  T R                  (       a)  [        R                  R                  T R                  5      OT R                  S9
nU$ )NrX   rp  include_dirs_argsdefinitions_argscflags_argsldflags_argslibraries_argslibraries_dirs_argsr   target_filer   c
                 2  > [         (       a-  U  SU SU SU SU SU SU	 SU SU SU S3n
[        U
5      n
U
$ TR                  (       a  SOSn[        R                  " SSSU  SU SU SU SU SU SU SU SU SU SU	 S35      R                  5       n
U
$ )	Nrq  z /LD /Fez /link z-cr   z[ \n]+z
                    z -o )rc   r   r   rt   subr|   )rX   rp  r  r  r  r  r  r  r   r  r   compile_only_argr   s               r   format_build_command9CppBuilder.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   rp  r  r  r  r  r  r  r   r  )r:  r   r  rx  rw  rv  ry  r{  rz  r|  r   r5   r8   r  r  )r   r  command_lines   `  r   get_command_lineCppBuilder.get_command_line  s   			  #	 "		
 	 	  	 "%	 "	 	 	@ ,^^&&"55!33))++// $ 9 9!>>&& (():):;""
 r    c                 ,    [        U R                  5      $ r   )r   r  r   s    r   get_target_file_pathCppBuilder.get_target_file_path  s    '(9(9::r    c                    SSK Jn  [        S5         U R                  5       R	                  5       n U" 5       n[
        R                  R                  U5      nU R                  n[
        R                  R                  [        S5      n[        R                  " 5        n[        R                  " U[
        R                  R                  Xt5      5        [        R                  " [        [
        R                  R                  US5      5        U R                    HU  n[        R                  " U[
        R                  R                  U[
        R                  R                  U5      5      5        MW     [
        R                  R                  US5      n	[        R"                  " Xi5        [%        X'[
        R                  R                  U5      5      n
[
        R                  R'                  U5      (       a  [
        R(                  " U5        [        R                  " X5        UR+                  S5      (       a  [
        R,                  " US5        O-UR+                  S5      (       a  [
        R,                  " US	5        S S S 5        S S S 5        g ! , (       d  f       N= f! [.        R0                   a7  nUR2                  R5                  S
5      n[6        R8                  " X,5      UeS nAff = f! , (       d  f       g = f)Nr   rH  r   r  z	script.ldrl  i  rg  i  r(   )r2   rI  r
   r  r   r5   r8   r  r  r9   _TORCH_PATHtempfileTemporaryDirectoryrR   r   r  r}  copytreer   rM   r   endswithchmodr;   r   r   ro   r   r   )r   rI  r  r  header_nameoutput_pathtorch_includes_pathtmp_dirsrcdest_include_pathtmp_output_pathr   r   s                r   build_fbcode_reCppBuilder.build_fbcode_re
  s    	>.)++-335GB-/ gg..{;"// ')ggll;	&J#002gKKRWW\\'-OPKKWk0RS#66Cgrww?O?OPS?T)UV  7(*Wi(H%OO$7K&8"''*:*:;*G'O ww~~k22		+.KK="++D11e4$--e44e4' 3 *) 32( 00 B1))':AB? *)sN   K*A+JGJ:J
J	JK*JK'02K""K''K**
K8c                 H   U R                   (       a  U R                  5       $ [        U R                  5        [        R
                  R                  U R                  U R                   S[         35      n[        U5        U R                  5       n[        X!S9  [        U5        g)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   r~  r5   r8   r9   r  _BUILD_TEMP_DIRr  r   r   )r   _build_tmp_dir	build_cmds      r   buildCppBuilder.build2  s    
 ""'')) !1!12Ao->?
 	!0))+		6N#r    
cmake_pathc           	      ,   SR                  U R                  R                  5       5      n[        R                  " SU SU R
                   SU R                   S35      n[        US5       nUR                  U5        S S S 5        g ! , (       d  f       g = f)Nrq  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   r  r  textwrapdedentrv  r|  r-  write)r   r  r   contentsr1  s        r   save_compile_cmd_to_cmake$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                     S[        U5      R                  -   n[        US5       nUR                  SU S35        S S S 5        g ! , (       d  f       g = f)Nz${CMAKE_CURRENT_SOURCE_DIR}/az"target_sources(aoti_model PRIVATE z)
)r   r   r-  r  )r   r  r  r1  s       r   save_src_to_cmakeCppBuilder.save_src_to_cmakeb  sD    1DN4G4GG*c"aGG8
#FG #""s   A
Ac                    SR                  U R                  R                  5       5      nSR                  U R                  R                  5       5      n[        R
                  " SU SU S35      n[        R                  R                  U5      (       d   SU S35       e[        US5       nUR                  U5        S S S 5        g ! , (       d  f       g = f)Nrq  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   r-  r  )r   r  lflagsr  r  r1  s         r   save_link_cmd_to_cmake!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  rv  r   r   rw  rx  ry  r{  rz  r  r}  r~  r|  r  r  r   )r   r4  )r5  r6  r7  r8  r9  r:  r  r  r	   rh   r   r   r  r  r  r  r  r  r  r;  r   r    r   re  re  ]  s      #  ^G^G sDI~&^G &	^G
 ^G 
^G@/# /b;c ;&B	&BP$$ 
<HC H3 H4 H  r    re  )T)zc++17)F)Tr   Fr4  )FF)r   r   	functoolsr.  loggingr5   r4   rt   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.fbr   triton.fb.buildr   torch._inductor.fb.utilsr   r   r   r   ru   r  r8   abspath__file___HERErL  r  r9   r  r5  	_IS_LINUXr  rc   r}   	getLoggerr5  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@  rC  rS  rV  rd  rn  ri   rr  rt  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r)  r0  r9  rO  rQ  rc  re  r   r    r   <module>r     s	        	  	    
     $  $  ' '  , ' ? ; , 
%2 s c d c S T S C D d 
 
!ggoobggooe45k+@A LL##G,	LL##H-	llg%'2 ! 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    