
    7hA                       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+J,r,  S SK-J.r.J/r/J0r0J1r1  O(S\S\SS4S jr.S\S\SS4S jr/S\S\SS4S jr0S\24S jr1Sr3\Rh                  Rk                  \65      r7\Rh                  Rq                  \Rh                  Rq                  \75      5      r9\Rh                  Ru                  \9S5      r;\R                  Ry                  S5      r=\R                  Ry                  S5      r>\R                  S:H  r?\?(       a  SOSr@\R                  " \B5      rC\R                  " S5      S\ES\E4S j5       rFS\E4S jrG\R                  S \ESS4S! j5       rIS\E4S" jrJS#\2S\K\E\E4   4S$ jrLS%\ES&\ES'\ES(\ES\E4
S) jrM\R                  S*\ES\24S+ j5       rN\R                  S*\ES\24S, j5       rO\R                  S*\ES\24S- j5       rP\R                  S*\ES\24S. j5       rQ\R                  S*\ES\24S/ j5       rR\R                  S\24S0 j5       rS\R                  S\24S1 j5       rT\R                  S\24S2 j5       rU\R                  S\24S3 j5       rV\R                  S\24S4 j5       rW\R                  S \ES\E4S5 j5       rXS6\Y\E   S7\Y\E   SS4S8 jrZS9\Y\E   S\Y\E   4S: jr[S;\ESS4S< jr\S;\ESS4S= jr]S>\ES?\ESS4S@ jr^S>\ES?\ESS4SA jr_SB\ES\E4SC jr` " SD SE5      raSzSF\2S\Y\E   4SG jjrbS{SH\ES\Y\E   4SI jjrcS*\ES\Y\E   4SJ jrdS\Y\E   4SK jre S|S*\ESL\2S\Y\E   4SM jjrfSN\2S\Y\E   4SO jrg   S}S*\ESN\2SF\2SP\\E   SL\2S\K\Y\E   \Y\E   \Y\E   \Y\E   \Y\E   \Y\E   \Y\E   4   4SQ jjrh " SR SS\a5      riS\Y\E   4ST jrjS\Y\E   4SU jrkS\Y\E   4SV jrlS\Y\E   4SW jrmS*\ESX\2S#\2S\K\Y\E   \Y\E   \Y\E   4   4SY jrnSZ\$S\K\Y\E   \Y\E   4   4S[ jroS\\2SX\2S\K\Y\E   \Y\E   \Y\E   4   4S] jrpS\Y\E   4S^ jrqS\K\Y\E   \Y\E   4   4S_ jrr\R                  S\24S` j5       rs\R                  S\K\2\E4   4Sa j5       rt\R                  S*\ESb\ESS4Sc j5       ru\R                  S*\ESS4Sd j5       rvS*\ES\K\Y\E   \Y\E   \Y\E   \Y\E   \Y\E   \Y\E   4   4Se jrwSf\2S\Y\E   4Sg jrxS*\ESZ\$S\\2SX\2S#\2Sf\2S\K\Y\E   \Y\E   \Y\E   \Y\E   \Y\E   \Y\E   \Y\E   4   4Sh jry " Si Sj\i5      rzS~Sk jr{\R                  " Sl5      Sm\ES\\   4Sn j5       r|So\Y\E   SS4Sp jr}  SSq\ESX\2Sr\2S\K\Y\E   \Y\E   \Y\E   \Y\E   \Y\E   \Y\E   \Y\E   4   4Ss jjr~ " St Su\z5      rSv\ES\K\E\E4   4Sw jr " Sx Sy5      rg)    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                      g N r   r   s     U/var/www/fran/franai/venv/lib/python3.13/site-packages/torch/_inductor/cpp_builder.pyr   r   -           c                      g r   r   r   s     r   r   r   0   r   r    c                      g r   r   r   s     r   r   r   3   r   r    c                      g)NFr   r   r    r   r   r   6   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   K   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:   h   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    use_relative_pathc                     [         (       a  [        S5      e[        R                  " 5       (       a:  [        R
                  nU (       a  [        R                  O[        R                  nX4$ SnSnX4$ )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      sg    {:;;B % ,, ((  ; BG;r    
cubin_filekernel_namerm   rn   c                    U S-   nU SU SU  3n[         R                  " UR                  5       SSSS9  U SU 3n[         R                  " UR                  5       SSSS9  [        R                  " SSU 5      nUS	U S
U S3-   SU SU S3-   SU SU S3-   U-   n[         R                  " UR                  5       SSSS9  U$ )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                 |    [         R                  " U S/5      R                  S5      nSUR                  5       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                 $   [         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   r   rc   r|   r*   r^   boolr   s    r   	_is_clangr      sq     ||x|,,	99/>>o  BIIm\:;;		.=>>r    c                 d    [        U 5      (       a  g[        [        R                  " SU 5      5      $ )NFz(gcc|g\+\+|gnu-c\+\+))r   r   r|   r*   r   s    r   _is_gccr      s)     		2LABBr    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]   stripr   SUBPROCESS_DECODE_ARGSr   r>   )r   
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   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     $ ##{+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   )r   rj   r   r    r   is_gccr   &  s    #%&&r    c                  (    [        [        5       5      $ r   )r   rj   r   r    r   is_clangr   +  s    %'((r    c                  (    [        [        5       5      $ r   )r   rj   r   r    r   r   r   0  s    .011r    c                  (    [        [        5       5      $ r   )r   rj   r   r    r   is_apple_clangr   5  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    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  	'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>V  s     >XTT]]4((X   #%)extend)r   r   s     r   _append_listr   U  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   Y  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   a  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   l  s    	ww~~h!#5!ADGGLL4			)$  77<<3" 	 "B 	  r    cmd_linecwdc                    [         R                  " U 5      n [        R                  " X!S[        R                  [        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)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Z__ZEVEV	
 (( 6)1V;Qx6?Qcllh62  !F!!#.A56s   3A C	 A$CC	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     s    	n	%' 
&	%	%s   !
/	orig_pathc                 \    [         (       a   U R                  [        R                  S5      $ U $ )N/)rc   r   r5   sep)r   s    r   normalize_path_separatorr     s$    {  --r    c                      \ rS rSrSr             S&S\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\4S! jrS\4S" jrS#\SS4S$ jrS%rg)(BuildOptionsBasei  z
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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        S U l        Xl	        Xl
        Xl        Xl        Xl        g 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__BuildOptionsBase.__init__  s      "'2'8b(4(:"(,B#*=b*8*>B%._",<,B 26'(9#/#/$1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    c                     U R                   $ r   )r  r  s    r   get_precompiling!BuildOptionsBase.get_precompiling  r(  r    c                     U R                   $ r   )r  r  s    r   get_preprocessing"BuildOptionsBase.get_preprocessing  s    """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   rk   r   w)r  r#  r&  r*  r-  r0  r3  r6  r:  r=  r@  openjsondump)r  rH  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  r  r
  )r   NNNNNNNFFFFFr   N)__name__
__module____qualname____firstlineno____doc__strr   rh   r   r  r  r  r  r  r#  r&  r*  r-  r0  r3  r6  r:  r=  r@  rC  rF  rP  __static_attributes__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                 4    [         (       d  U (       a  S/$ / $ / $ )NWallrc   )rZ  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]  )r_  s    r   _get_cpp_std_cflagra    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   r   r   aot_inductor#raise_error_on_ignored_optimizationr   )r   r   ignored_optimization_arguments      r   _get_os_related_cpp_cflagsrq  '  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_flagsrt  B  s$    E xx-.Lr    min_optimizec                    [         (       a  U(       a  S/$ S/$ [        R                  R                  n[        R                  R                  (       a  SS/OU(       a  U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   rn  compile_wrapper_opt_leveldebug_compilert  r   rg   enable_unsafe_math_opt_flag#enable_floating_point_contract_flagr3   r4   r   rd   machine)r   ru  wrapper_opt_levelr   s       r   _get_optimization_cflagsr  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                     [         (       a   SS/$ U (       d  S/$ [        R                  " 5       S:X  a  S[        5       ;   a  / SQ$ SS/$ )NDLLMDfPICDarwinclang)sharedr  zundefined dynamic_lookupr  )rc   r4   systemrj   )r  s    r   _get_shared_cflagr  x  sM    {	 t}xH$4D4F)F==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$ )Nru   )r  r  r^  ra  rq  r   r9   )r   r  rZ  r  ru  r   r   r   r   r   r   r   s               r   get_cpp_optionsr    s      K LFG "NI"$ 	'"
"<
>	?
 
-	. 
	 %\
2		3  CHH[12 	 r    c                   n   ^  \ rS rSrSr        SS\S\S\\   S\S\S\S	\S
\SS4U 4S jjjrSr	U =r
$ )
CppOptionsi  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   rZ  r  rk   rX   ru  r   r   r   Nc	                   > [         TU ]  UUUUS9  U(       a  UO	[        5       U l        [	        U R                  U=(       d    U=(       d    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   rk   r   r   )r   r  r  rZ  ru  )superr  rj   r  r  r   r  r  r  r  r  r  r	  r  )r  r   rZ  r  rk   rX   ru  r   r   r   r   r   r   r   r   r   	__class__s                   r   r  CppOptions.__init__  s     	%/%'	 	 	
 &.3C3E %FFG##%
	
 	T&&4T''6T\\6*T]]G,T))>:T__i0T++-=> r    r  )FTr   Fr   FFF)rS  rT  rU  rV  rW  r   r   rX  r  rY  __classcell__r  s   @r   r  r    s     # %'"'""#*!*! *! c]	*!
  *! *! *! *! *! 
*! *!r    r  c                  |    [         (       d0  S[        [        [        R                  R
                  5      5      -   /$ / $ )Nz-D_GLIBCXX_USE_CXX11_ABI=)rc   rX  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   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   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                    / 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>0  s     F0E1dmmA&&0Er   zCPU_CAPABILITY=CPU_CAPABILITY_HAVE__CPU_DEFINITION)r   r   build_macrobuild_arch_flagsr   rd   rX  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  r  stdlibHeaderszPython.hzCan't find Python.h in )r   	sysconfigget_pathrM   r4   r  parentabsolutewarningswarnrX  )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            	         [        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   rX  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 --jsonr   r   F)	r;   r<   r{   r   lenrL  loadsr=   r>   )commandr   s     r   is_conda_llvm_openmp_installedr  x  sd    1((9@@H4::f%&**&&(9: s   AA A65A6c                      [         R                  " S5      c  g[        R                  " / SQ5      R	                  S5      R                  5       n [        R                  R                  U 5      nX4$ ! [        R                   a     gf = f)Nbrew)Fr   )r  z--prefixr   r   )
rR   rS   r;   r<   r   r   r5   r8   rM   r=   )libomp_pathomp_availables     r   homebrew_libompr    st    <<'
 ##$BCVF^UW 	 {3))%% s   A1 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=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& &B=<B=c                 ^    S[         S[         S[        4S jn / SQnU H  nU" X5        M     g )Nr   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   r   r   r  r5   r8   r  rP   r   r  r=   )r   r   r   r  s       r   _load_icx_built_in_lib_by_name>perload_icx_libomp_win.<locals>._load_icx_built_in_lib_by_name  s    	,,!28*=>!)) f -.F }}Hww~~h''5;

12  * (  )) 		s   BB B21B2)zlibiomp5md.dllzsvml_dispmd.dllz
libmmd.dll)rX  r   )r   r  preload_listr   s       r   perload_icx_libomp_winr    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   r   r5   r6   r8   r9   rM   r  r  r  unamer  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"$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#  )"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_optionsr9  6  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SS4S\S\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$ )CppTorchOptionsi  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  rZ  r   r   rk   r!  r  r  rX   ru  r   r   r   Nc                   > [         TU ]  UUU	UU
UUUS9  X@l        [        U R                  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   rZ  r  rk   rX   ru  r   r   )r   r  r  r   rk   r!  )r  r  r  r9  r  r   r  r  r  r  r  r  r	  r  )r  r  r  rZ  r   r   rk   r!  r  r  rX   ru  r   r   torch_definitionsr,  torch_cflagstorch_ldflagsr-  r.  torch_passthrough_argsr  s                        r   r  CppTorchOptions.__init__  s      	%##/%%' 	 		
 " "+/-
	
 " 	T&&(9:T'');<T\\<0T]]M2T))+?@T__o6T++-CD r    r9  )rS  rT  rU  rV  rW  r   r   r   r   rX  r  rY  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                     [         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_envrH    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_staticrO    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 )NrC  stubs)	enumerater5   rP   
startswithrO  rX  rM   r   )rP  ir8   lib_dirstub_dirs        r   _transform_cuda_pathsrX    s|     V$"**$K9P)Q)Q&<T&BGGFI(H  c(m, %r    device_typer   c                    / 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 S:X  a  UR                  S5        [         R                  " 5       (       aQ  UR                  [        R$                  5        U(       a+  U S:X  a%  [        R                  R                  c
  U(       d  S/n	[         R&                  R(                  (       a  U[         R&                  R(                  -  nUUUUUUU	4$ )NrC  rD  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_xpure  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   rG  rH  torch.utilsr[  r  library_pathsr   r  rE  rF  rX  r   r   sdk_includern  custom_op_libs)rY  r   r   r   r   r   r   r   r   r   r[  s              r   get_cpp_torch_device_optionsrl    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                      ^  \ rS rSrSr\SSSSSSSSSSS4S\S\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  rY  r   r   rk   r!  r  r  ru  r   r   r   Nc                   > [         TU ]  U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   rk   r!  r  ru  r   r   )rY  r   r   )r  r  rl  r   r  r  r  r  r  r  r	  r  )r  r  r  rY  r   r   rk   r!  r  r  ru  r   r   device_definitionsdevice_include_dirsdevice_cflagsdevice_ldflagsdevice_libraries_dirsdevice_librariesdevice_passthrough_argsr  s                       r   r  CppTorchDeviceOptions.__init__E  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   )	r  r  r   rd   r  r  r  r   r   )r  ry   python_lib_dirsr  s      r   r  'CppTorchDeviceOptions._finalize_options}  s    !# ":!;A'1,S0A/AR.SS,q!T%9%99$$++OA,>?$$++OA,>? : r    rR  )rS  rT  rU  rV  rW  r   r   r   rX  r   r  r  rY  r  r  s   @r   rn  rn  >  s     * %!""'!&%'""#6!6! 6! 	6!
 6! 6!  6! 6! 6! c]6! 6! 6! 6! 
6! 6!p	@ 	@r    rn  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 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_pathr    sH    " 77##I.L!!,/JD
''//)
$C9r    c                   b   \ rS rSrSr\S\\\4   4S j5       r\S\\\4   4S j5       r	\S\\\4   4S j5       r
\S\\\4   4S j5       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S4S jrS\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  ag  
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                  D    [         (       a  SOSn [         (       a  SOSnX4$ )Nz.pyd.soz/Fe-or]  	extensionoutput_flagss     r   __get_python_module_flags$CppBuilder.__get_python_module_flags  s!    )kFu	 +u&&r    c                  D    [         (       a  SOSn [         (       a  SOSnX4$ )Nz.objrt   z/c /Foz-c -or]  r  s     r   __get_object_flagsCppBuilder.__get_object_flags  s!    )kFt	#.;xG&&r    c                  b    [         (       d  [        5       (       d  SOSn [         (       a  SOSnX4$ )Nz.pchz.gchz/Fpr  )rc   r   r  s     r   __get_precompiled_header_flags)CppBuilder.__get_precompiled_header_flags  s'    )kFv	 +u&&r    c                  *    Sn [         (       a  SOSnX4$ )Nz.iz/EP /Pz-E -P -or]  r  s     r   __get_preprocessor_output_flags*CppBuilder.__get_preprocessor_output_flags  s    	#.;xJ&&r    r   sourcesBuildOption
output_dirNc                 >   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)                  5       U l        UR-                  5       U l        [1        U R&                  U R*                  U R.                  45      S::  d   eU R&                  =(       d    U R*                  =(       d    U R.                  (       + U l        [4        (       a  U R*                  (       a   S5       eU R&                  (       a  U R7                  5       u  pVOZU R*                  (       a  U R9                  5       u  pVO6U R.                  (       a  U R;                  5       u  pVOU R=                  5       u  pV[>        R@                  RC                  U R                  U R                   U 35      U l
        U R                  (       a)  [>        R@                  RE                  U R                  5      OU R                  n[4        (       a$  U R.                  (       a  X`l#        OU U 3U l#        OU SU 3U l#        [I        U[J        5      (       a  U/n[L        RN                  " 5       (       aa  U R                  (       a  U R                  (       a?  [Q        U5      U l        U Vs/ s H"  n[>        R@                  RE                  U5      PM$     nnU R*                  (       a  [S        U5      S:X  d   eSUS    3U l*        OSRC                  U5      U l*        URW                  5        HB  n	[4        (       a  U =R                  SU	 S3-  sl        M)  U =R                  S	U	 S3-  sl        MD     URY                  5        HB  n
[4        (       a  U =R                  S
U
 S3-  sl        M)  U =R                  SU
 S3-  sl        MD     URZ                  =n(       a-  [4        (       a  [\        R_                  SU5        OSU S3U l        URa                  5        HV  n[4        (       a  U =R                  SU S3-  sl        M)  U =R                  S[b        Rd                  " U5       S3-  sl        MX     URg                  5        HB  n[4        (       a  U =R                  SU S3-  sl        M)  U =R                  S	U S3-  sl        MD     URi                  5        HB  n[4        (       a  U =R
                  SU S3-  sl        M)  U =R
                  SU S3-  sl        MD     URk                  5        HB  n[4        (       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   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  rC  r  rF  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   rX  r   rd   rh   r  _sources_argsr*  r#  r
  rN   warningr&  r   quoter-  r0  r3  r6  )r  r   r  r  r  file_extr  relative_target_filerU  cflag
definitionr
  inc_dirldflagrV  r
  passthrough_args                    r   r  CppBuilder.__init__  s?    !#"$$&!!,.) #%(-$
 )$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"HGGLL)9)9djj\(;TU && GGT../"" 	
 ;""+".0D/EF*^1-A,BCDLgs##iGt~~9P9P '+7mD#4;<Gqrww''*GG<w<1$$$#1'!*!>D!$'!2D ++-E{!!qq\1!!!qq\1!	 . &557J{&&C
|1*==&&&C
|1*==&	 8 "-!?!???{_&
 -66H5I*K'"335G{''T'"+=='''RG0D/EQ+GG'	 6 "--/F{""&m3"""&m3"	 0 #557G{))z'"-EE)))r'!_<)	 8 ,,.C{$$!C57$$$"SE3$	 /  +??AO--O3DA1FF-  Bm =s   !)X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                  S9
nU$ )NrX   r  include_dirs_argsdefinitions_argscflags_argsldflags_argslibraries_argslibraries_dirs_argsr   r   r   c
                   > [         (       aB  U  SU SU SU SU SU SU	 3n
TR                  (       a  U
SU SU SU 3-  n
[        U
5      n
U
$ U  SU SU SU SU SU SU	 3n
TR                  (       a  U
SU SU SU 3-  n
U
$ )Nru   z /LD /link )rc   r  r   )rX   r  r  r  r  r  r  r  r   r   r   r  s              r   format_build_command9CppBuilder.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   r  r  r  r  r  r  r  r   r   )rX  r  r  r  r  r  r  r  r  r  r  )r  r  command_lines   `  r   get_command_lineCppBuilder.get_command_lineT  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                 6   [        S5         U R                  5       R                  5       n U R                  n[        R
                  R                  [        S5      n[        R                  " 5        n[        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                  " X65        [!        X[        R
                  R                  U5      5      n[        R
                  R#                  U5      (       a  [        R$                  " U5        [        R                  " Xr5        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! [*        R,                   a7  nUR.                  R1                  S5      n	[2        R4                  " X5      UeS nAff = f! , (       d  f       g = f)	Nr   r  z	script.ldrt   i  r  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_reCppBuilder.build_fbcode_re  s    .)++-335GB"// ')ggll;	&J#002g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7 *)sN   J
AH<1F)H+H<+
H9	5H<8J
9H<<J2JJJ


J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 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   buildCppBuilder.build  s    
 ""'')) !1!12Ao->?
 	!0))+		6N#r    
cmake_pathrY  c           	         SR                  U R                  R                  5       5      n[        R                  " SU SU R
                   SU R                   S35      nUS:X  aH  [        R                  R                  c-  SS	K
Jn  U" 5       nU[        R                  " S
U SU S35      -  n[        US5       nUR                  U5        SSS5        g! , (       d  f       g= f)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()

                rJ  )r9   r  r#  textwrapdedentr  r  r  rE  rF  r2   r  rK  write)r  r  rY  r   contentsr  current_archrO  s           r   save_compile_cmd_to_cmake$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   8C
C!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)N${CMAKE_CURRENT_SOURCE_DIR}/az"target_sources(aoti_model PRIVATE z)
)r   r   rK  r  )r  r  r  rO  s       r   save_src_to_cmakeCppBuilder.save_src_to_cmake  sD    1DN4G4GG*c"aGG8
#FG #""s   A
A	asm_filesc           	         [        US5       nU Hp  n[        U5      R                  R                  S5      S   nS[        U5      R                   3n[        R
                  " SU SU S35      nUR                  U5        Mr     UR                  S5        UR                  S	5        S S S 5        g ! , (       d  f       g = f)
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})
)rK  r   r   r{   r  r  r  )r  r  r  rO  asm_filerr   r  s          r   save_kernel_asm_to_cmake#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//
B=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)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-  r3  r  r  r5   r8   rM   rK  r  )r  r  lflagsr  r  rO  s         r   save_link_cmd_to_cmake!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  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  )r   rR  )rS  rT  rU  rV  rW  staticmethodri   rX  r  r  r  r  r	   rh   r   r  r  r  r  r  r  r  r  r  rY  r   r    r   r  r    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    r  )T)zc++17)F)Tr   FrR  )FF)r   r   	functoolsrL  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  rT  	_IS_LINUXr  rc   r   	getLoggerrS  rN   	lru_cacherX  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   r^  ra  rq  rt  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r#  r9  r;  rH  rO  rX  rl  rn  r  r  r   r    r   <module>r     s	        	  	    
     $  $  ' '  , ' ? ; , 
? 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 
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    