
    ȅiN                       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rS SKrS SKJr  S SKJr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*  \"RV                  " 5       (       a  S SK,J-r-J.r.  S SK/J0r0J1r1J2r2J3r3  O(S\S\SS4S jr0S\S\SS4S jr1S\S\SS4S jr2S\44S jr3Sr5\Rl                  Ro                  \85      r9\Rl                  Ru                  \Rl                  Ru                  \95      5      r;\Rl                  Ry                  \;S5      r=\R                  R}                  S5      r?\R                  R}                  S5      r@\R                  S:H  rASrB\A(       a  \R                  " 5       4OSrD\R                  " \F5      rG\R                  " S5      S\IS\I4S j5       rJS\I4S jrK\R                  S \ISS4S! j5       rM " S" S#5      rN\R                  S \ISS4S$ j5       rO\R                  S \IS\I4S% j5       rPS\I4S& jrQS'\4S\R\I\I4   4S( jrSS)\IS*\IS+\IS,\IS\I4
S- jrT\R                  S.\IS\44S/ j5       rU\R                  S.\IS\44S0 j5       rV\R                  S.\IS\44S1 j5       rW\R                  S.\IS\44S2 j5       rX\R                  S.\IS\44S3 j5       rY\R                  S\44S4 j5       rZ\R                  S\44S5 j5       r[\R                  S\44S6 j5       r\\R                  S\44S7 j5       r]\R                  S\44S8 j5       r^\R                  S \IS\I4S9 j5       r_S:\`\I   S;\`\I   SS4S< jraS=\`\I   S\`\I   4S> jrbS?\ISS4S@ jrcS?\ISS4SA jrdSB\ISC\ISS4SD jreSB\ISC\ISS4SE jrfSF\IS\I4SG jrg " SH SI5      rhSSJ\4S\`\I   4SK jjriSSL\IS\`\I   4SM jjrjS.\IS\`\I   4SN jrkS.\IS\`\I   4SO jrlS\`\I   4SP jrmS\R\`\I   \`\I   4   4SQ jrn SS.\ISR\4S\R\`\I   \`\I   4   4SS jjroST\4S\`\I   4SU jrp   SS.\IST\4SJ\4SV\\I   SR\4S\R\`\I   \`\I   \`\I   \`\I   \`\I   \`\I   \`\I   4   4SW jjrq " SX SY\h5      rrS\`\I   4SZ jrsS\`\I   4S[ jrtS\`\I   4S\ jruS.\IS]\4S'\4S\R\`\I   \`\I   \`\I   4   4S^ jrvS_\&S\R\`\I   \`\I   4   4S` jrwSa\4S]\4S\R\`\I   \`\I   \`\I   4   4Sb jrxS\`\I   4Sc jryS\R\`\I   \`\I   4   4Sd jrz\R                  S\44Se j5       r{\R                  S\R\4\I4   4Sf j5       r|\R                  S.\ISg\ISS4Sh j5       r}\R                  S.\ISS4Si j5       r~S.\IS\R\`\I   \`\I   \`\I   \`\I   \`\I   \`\I   4   4Sj jrS\R\`\I   \`\I   4   4Sk jrSl\4Sm\4S\`\I   4Sn jrS\`\I   4So jrS.\IS_\&Sa\4S]\4S'\4Sl\4Sm\4S\R\`\I   \`\I   \`\I   \`\I   \`\I   \`\I   \`\I   4   4Sp jr " Sq Sr\r5      rSSs jr\R                  " St5      Su\IS\\   4Sv j5       rSw\`\I   SS4Sx jr  SSy\IS]\4Sz\4S\R\`\I   \`\I   \`\I   \`\I   \`\I   \`\I   \`\I   4   4S{ jjr " S| S}\5      rS~\IS\R\I\I4   4S jr " S S5      rS\IS\ISC\ISS4S jrg)    N)Sequence)cdllwintypes)find_library)Path)AnyOptionalUnion)dynamo_timed)configexc)invalid_vec_isaVecISA)	cache_dir)TorchVersion)_run_build_commandbuild_paths)log_global_cache_errorslog_global_cache_statslog_global_cache_valsuse_global_cacheargskwargsreturnc                      g N r   r   s     U/home/james-whalen/.local/lib/python3.13/site-packages/torch/_inductor/cpp_builder.pyr   r   /           c                      g r   r   r   s     r   r   r   2   r    r!   c                      g r   r   r   s     r   r   r   5   r    r!   c                      g)NFr   r   r!   r   r   r   8   s    r!   CxxBuildz_inductor/script.ldlinuxdarwinwin32zx86_64-w64-mingw32-g++r      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   O   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:   l   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stderr
Compiler:  is not found.N)r;   r<   STDOUTr>   RuntimeErrorr=   )rX   r   s     r   check_compiler_exist_windowsra      sZ    
7 3J<M<MN KZz@AsJ%% s   %( 
AAAAc                   H    \ rS rSrS\SS4S jrS
S jrS
S jrS\4S jr	S	r
g)WinPeFileVersionInfo   	file_pathr   Nc                     Xl         [        R                  " S5      U l        U R	                  5         U R                  5         g )Nzversion.dll)re   ctypesWinDLLversion_dll_setup_functions_get_version_info)selfre   s     r   __init__WinPeFileVersionInfo.__init__   s0    "!==7 r!   c                    [         R                  [         R                  /U R                  R                  l        [         R                  U R                  R                  l        [         R                  [         R                  [         R                  [         R                  /U R                  R                  l        [         R                  U R                  R                  l        [         R                  [         R                  [        R                  " [        R                  5      [        R                  " [         R                  5      /U R                  R                   l        [         R                  U R                  R                   l        g r   )r   LPCWSTRLPDWORDri   GetFileVersionInfoSizeWargtypesDWORDrestypeLPVOIDGetFileVersionInfoWBOOLLPCVOIDrg   POINTERc_void_pUINTVerQueryValueWrl   s    r   rj   %WinPeFileVersionInfo._setup_functions   s    =
009 <D>>008 NNNNOO	9
,,5 8@}},,4 NN6??+NN8==)	4
''0 3;--''/r!   c                    [         R                  " 5       nU R                  R                  U R                  [
        R                  " U5      5      nUS:X  a  [        SU R                   S35      e[
        R                  " U5      U l	        U R                  R                  U R                  SX R                  5      nU(       d  [        SU R                   S35      eg )Nr   zCan't get version info size of .zCan't get version info of )r   rt   ri   rr   re   rg   byrefr`   create_string_bufferversion_inforw   )rl   dummysizesuccesss       r   rk   &WinPeFileVersionInfo._get_version_info   s     77NNFLL/
 19!@@PPQRSS"77=""66NNAt%6%6
 !;DNN;K1MNN r!   c                 ~   [         R                  " 5       n[        R                  " 5       nU R                  R                  U R                  S[         R                  " U5      [         R                  " U5      5      nU(       a  UR                  S:X  a  g/ nSnUR                  b  [        UR                  S-  5       Hp  nUS-  n[         R                  " UR                  U-   S5      n[        R                  US S S5      n[        R                  USS S5      n	UR                  XY45        Mr     U$ [        S5        U$ )Nz\VarFileInfo\Translationr         littlezBuffer is None)rg   r{   r   r|   ri   r}   r   r   valuerange	string_atint
from_bytesappendprint)
rl   	lp_bufferu_lenr   translationslang_idioffsetdata	code_pages
             r   get_language_id$WinPeFileVersionInfo.get_language_id   s
   OO%	""11'LL#LL	
 %++*??&5;;!+,Q''	&(@!D..bq8<NN4!9h?	##W$89 -  "#r!   )re   ri   r   r   N)__name__
__module____qualname____firstlineno__strrm   rj   rk   r   r   __static_attributes__r   r!   r   rc   rc      s-    !# !$ !@.O" r!   rc   c                    S[         [        [        4   4S jn[        U 5      (       d  g[        R
                  R                  U 5      (       a  U nOU" 5       u  p2USL a  g[        U5      nUR                  5       nUS:w  a  [        S5      eg)z
Torch.compile() is only work on MSVC with English language pack well.
Check MSVC's language pack: https://github.com/pytorch/pytorch/issues/157673#issuecomment-3051682766
r   c            	         [         R                  R                  [         R                  R	                  SS5      SSS5      n [         R                  R                  U 5      (       de  [         R                  R                  [         R                  R	                  SS5      SSS5      n [         R                  R                  U 5      (       d  g U S	S
SSSSSS/	n[        R                  " USSS9R                  5       nU(       d  g[         R                  R                  USSS5      n[         R                  R                  U5      (       d  g[         R                  " U5       Vs/ s HH  n[         R                  R                  [         R                  R                  X45      5      (       d  MF  UPMJ     nnU(       d  g[        USS9S   n[         R                  R                  UUSSSS5      n[         R                  R                  U5      (       a  SU4$ [         R                  R                  UUSSSS5      n[         R                  R                  U5      (       a  SU4$  gs  snf ! [        R                  [        4 a     gf = f)z-
Finds the path to cl.exe using vswhere.exe.
zProgramFiles(x86)zC:\Program Files (x86)zMicrosoft Visual Studio	Installerzvswhere.exeProgramFileszC:\Program FilesF z-latestz-prereleasez	-products*z	-requiresz1Microsoft.VisualStudio.Component.VC.Tools.x86.x64z	-propertyinstallationPathTutf-8)textencodingVCToolsMSVC)reverser   rG   HostX64x64zcl.exeHostX86x86)r5   r8   r9   rP   rQ   rM   r;   r<   striplistdirisdirsortedCalledProcessErrorr>   )vswhere_pathcmdvs_install_pathmsvc_tools_pathdtoolset_versionslatest_toolset_versioncl_paths           r   get_msvc_cl_path3check_msvc_cl_language_id.<locals>.get_msvc_cl_path   s0    ww||JJNN.0IJ%	
 ww~~l++77<<

~/BC)	L 77>>,// <	 C"
C )55$eg  #  !ggll?D'6RO77>>/22 
 O4 4A77==o!AB 4   
 $ %+,<d%KA%N" ggll&G ww~~g&&W}$ '',,#* 77>>'**=( + I B --/@A 		sF   6I& AI& 	I& !AI!*I!0	I& :AI& AI& !I& &JJNFi	  znTorch.compile() is only support MSVC with English language pack,Please reinstall its language pack to English.)
tupleboolr   _is_msvc_clr5   r8   rM   rc   r   r`   )rX   r   cl_exe_pathb_retr   r   s         r   check_msvc_cl_language_idr      s    ReD#I. Rh x  	ww~~h-/E>'4L**,G$=
 	
 r!   c                     [         R                  " U S/[         R                  SS9nSnUR                  5        H<  nS	U;   d  M  UR                  S
S5      S   R                  5       R                  5       nM>     Uc  [	        SU  SU  S35      eUS;  a  [	        SU  SU 35      eU$ ! [         a  n[	        SU  S35      UeSnAf[
         a  n[	        SU  S35      UeSnAff = f)zK
Check if MinGW `compiler` exists and return it's flavor (win32 or posix).
-vT)r\   r   r]   r^   NzFailed to run z -vzThread model:r)   zCannot determine the flavor of z, (win32 or posix). No Thread model found in )r(   posixzOnly win32 and pofix flavor of z is supported. The flavor is )
r;   r<   r_   r>   r`   	Exception
splitlinessplitr   lower)rX   outeflavorlines        r   check_mingw_win32_flavorr   Q  s   
B%%tZ%6%6T
 F T!ZZQ'+11399;F ! ~-hZ7cdlcmmpq
 	
 ''-hZ7TU[T\]
 	
 M)  IZz@AqH B^H:S9:ABs#   &B( (
C$2CC$CC$c                     [         R                  R                  S:X  aF  [        R                  S:w  a2  [
        n [         R                  R                  (       d  [        U 5        U $ [        (       aC  [        R                  R                  SS5      n [        U 5      n [        U 5        [        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windowsr(   CXXcl)r   aot_inductorcross_target_platformr3   r4   	MINGW_GXXpackage_cpp_onlyr   _IS_WINDOWSr5   rP   rQ   normalize_path_separatorra   r   	is_fbcoder   cc
isinstancecpprA   listr   rD   )rX   r*   s     r   get_cpp_compilerr   q  s    11Y>LLG# ""33$X.{::>>%.+H5$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)r   r`   r   r   r   r   objcopy_fallbackr   )r   r   r   s      r   get_ld_and_objcopyr     sg    {:;;B % ,, ((  ; BG;r!   
cubin_filekernel_namer   r   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_outputr   checkzB --rename-section .data=.rodata,alloc,load,readonly,data,contents z[\W]_z --redefine-sym _binary_z	_start=__z_start z--redefine-sym _binary_z_size=__z_size z_end=__z_end )r;   runr   resub)r   r   r   r   obj_filer   	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<   decoder   )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  r   r   r*   r`   r   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   )	r   r;   r<   r_   r   r  SUBPROCESS_DECODE_ARGSr   r>   )r   
output_msgs     r   r   r     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 r   N)r   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   r   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
  r   r   r!   r   is_gccr    s    #%&&r!   c                  (    [        [        5       5      $ r   )r  r   r   r!   r   is_clangr    s    %'((r!   c                  (    [        [        5       5      $ r   )r  r   r   r!   r   r  r    s    .011r!   c                  (    [        [        5       5      $ r   )r  r   r   r!   r   is_apple_clangr"  "  s    +-..r!   c                  (    [        [        5       5      $ r   )r   r   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_ALLr   )r\   envr1   r   r   
)
r5   rP   copyr;   r<   r_   r  r  r   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>C  s     >XTT]]4((X   #%)extend)r.  r/  s     r   _append_listr:  B  s    >X>>r!   	orig_listc                 L    / nU  H  nX!;  d  M
  UR                  U5        M     U$ r   )r   )r;  new_listr5  s      r   _remove_duplication_in_listr>  F  s*    HOOD!  Or!   path_dirc                 
   [         R                  R                  U 5      (       d   [        U 5      R	                  SSS9  g g ! [
         a7  nUR                  [        R                  :w  a  [        SU  35      U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_existrG  N  su    77>>(##	ON   = $  	OyyELL("%9(#DE3N )	O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namere   dir_paths          r   _remove_dirrR  W  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                   ak  nUR                  R                  " [        6 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)rT  r   rL   r\   z'omp.h' file not foundlibompr'   a  

OpenMP support not found. Please try one of the following solutions:
(1) Set the `CXX` environment variable to a compiler other than Apple clang++/g++ that has builtin OpenMP support;
(2) install OpenMP via conda: `conda install llvm-openmp`;
(3) install libomp via brew: `brew install libomp`;
(4) manually setup OpenMP and set the `OMP_PREFIX` environment variable to point to a path with `include/omp.h` under it.)shlexr   r;   r   rU   r_   r   rL   r  r  r3   r4   r   CppCompileError)rS  rT  r   r   outputopenmp_probleminstructions          r   _run_compile_cmdr\  c  s    
++h
C6Z__ZEVEV	
 (( 6"89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\  )rS  rT  s     r   run_compile_cmdr_  z  s    	n	%' 
&	%	%s   !
/	orig_pathc                 \    [         (       a   U R                  [        R                  S5      $ U $ )N/)r   r,  r5   sep)r`  s    r   r   r     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_moder   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)rl   rX   rf  rg  rh  ri  rj  rk  rl  rm  r   rn  ro  rp  s                 r   rm   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}  rw  rx  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>  rs  rt  ru  rv  rw  rx  ry  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   rr  r~   s    r   get_compilerBuildOptionsBase.get_compiler      ~~r!   c                     U R                   $ r   )rs  r~   s    r   get_definitions BuildOptionsBase.get_definitions  s       r!   c                     U R                   $ r   )rt  r~   s    r   get_include_dirs!BuildOptionsBase.get_include_dirs      !!!r!   c                     U R                   $ r   )ru  r~   s    r   
get_cflagsBuildOptionsBase.get_cflags  s    ||r!   c                     U R                   $ r   )rv  r~   s    r   get_ldflagsBuildOptionsBase.get_ldflags  s    }}r!   c                     U R                   $ r   )rw  r~   s    r   get_libraries_dirs#BuildOptionsBase.get_libraries_dirs  s    ###r!   c                     U R                   $ r   )rx  r~   s    r   get_librariesBuildOptionsBase.get_libraries  s    r!   c                     U R                   $ r   )ry  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   rf  rg  rh  ri  rj  rk  rl  rm  r   rn  w)r  r  r  r  r  r  r  r  r  r  r  openjsondump)rl   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{  ru  r}  rr  rs  rt  rv  rx  rw  ry  r~  r  r|  rz  )r   NNNNNNNFFFFFr   )r   r   r   r   __doc__r   r	   r   r   rm   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r!   r   re  re    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!   re  warning_allc                 4    [         (       d  U (       a  S/$ / $ / $ )NWallr   )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  )r  s    r   _get_cpp_std_cflagr    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 5      (       a  UR                  S5        U$ )N)wd4819wd4251wd4244wd4267wd4275wd4018wd4190wd4624wd4067wd4068EHsczZc:__cpluspluszpermissive-zWno-unused-variablezWno-unknown-pragmasz$Werror=ignored-optimization-argumentz!Wno-ignored-optimization-argumentpedantic)r   r  r   r   #raise_error_on_ignored_optimizationr   r
  )r   rh  ignored_optimization_arguments      r   _get_os_related_cpp_cflagsr    sx    {
> M ()>?\"" &&JJ 78 *
 MM78<   MM*%Mr!   c                 B    / n[         (       a  UR                  S5        U$ )NNOMINMAXr   r   )r   os_definitionss     r   _get_os_related_cpp_definitionsr  6  s"     "N{ 	j)r!   c                  F   [         (       a  / n U $ / SQn U R                  S5        [        R                  R                  (       d  U R                  S5        U R                  S[        R                  R
                   35        [        5       (       a  U R                  S5        U $ )N)zfno-trapping-mathzfunsafe-math-optimizationszffinite-math-onlyzfno-signed-zeroszfno-math-errnozfno-finite-math-onlyzfno-unsafe-math-optimizationszffp-contract=zfexcess-precision=fast)r   r   r   r   enable_unsafe_math_opt_flag#enable_floating_point_contract_flagr  )flagss    r   _get_ffast_math_flagsr  ?  sz    {0 L!
 	+,zz55LL89}VZZ%S%S$TUV88LL12Lr!   c                  ^    / n / n[         (       a  SS/n / SQnX4$ U R                  S5        X4$ )z
When we turn on generate debug symbol.
On Windows, it should create a [module_name].pdb file. It helps debug by WinDBG.
On Linux, it should create some debug sections in binary file.
ZI_DEBUG)DEBUGzASSEMBLYDEBUG zOPT:REFzOPT:ICFgr  )rh  ri  s     r   !_get_inductor_debug_symbol_cflagsr  \  sB     FG{!C ? 	c?r!   min_optimizec                 6   / n/ n[         R                  R                  =(       d#    [        R                  R                  SS5      S:H  (       + n[         R                  R                  =(       dn    [         R                  R                  =(       dM    [        R                  R                  SS5      S:H  =(       d#    [        R                  R                  SS5      S:H  nU(       aC  [        (       a  X!(       a  SOS/-  nOBUU(       a  [         R                  R                  OSS/-  nO[        (       a  U/ S	Q-  nOUS
/-  nU(       a  [        5       u  pgX&-  nX7-  nU[        5       -  n[        (       a   X#4$ [        R                  S:w  a  [        U 5      (       a  UR                  S5        [         R                  " 5       (       d  [        R                   " 5       S:X  a  UR                  S5        Og[        R                   " 5       S:X  a  UR                  S5        O<[        R                   " 5       S:X  a  UR                  S5        OUR                  S5        [         R                  R"                  (       a!  [%        U 5      (       a  UR                  S5        X#4$ )NTORCHINDUCTOR_DEBUG_COMPILE01TORCHINDUCTOR_DEBUG_SYMBOLO1O2O3DNDEBUG)OdOb0zOy-O0r'   zfno-tree-loop-vectorizeppc64lezmcpu=nativeriscv64zmarch=rv64gcriscv32zmarch=rv32gczmarch=native	flto=thin)r   r   debug_compiler5   rP   rQ   debug_symbolsr   compile_wrapper_opt_levelr  r  r3   r4   r
  r   r   machine
enable_ltor  )r   r  rh  ri  should_use_optimized_flagsshould_add_debug_symbol_flagsdebug_cflagsdebug_ldflagss           r   _get_optimization_cflagsr  n  s    FG 	)) 	E::>>7=D"
 	)) 	D,,	D::>>7=D	D ::>>6<C	 " ";|t66FAM##==SW F
 ;**FtfF$&G&I# 
#%%F{* ?' <<8#|$$78 ##%%##%2MM-0%%'94MM.1%%'94MM.1MM.1))i.E.EMM+&?r!   do_linkc                     [         (       a   SS/$ [        R                  " 5       S:X  a  S[        5       ;   a  / SQ$ / nU (       a  UR	                  S5        UR	                  S5        U$ )NDLLMDDarwinclang)sharedfPICzundefined dynamic_lookupr	  r
  )r   r4   systemr   r   )r  r  s     r   _get_shared_cflagsr    s]    {	 t}H$4D4F)F==EX	LLLr!   extra_flagsc                 n   / n/ n/ n/ n/ n	/ n
/ n[        X5      u  pU[        U5      -   [        U5      -   [        5       -   [	        U 5      -   nU[        U 5      -  n[        (       dQ  [        R                  R                  (       a2  [        U 5      (       a"  UR                  S5        UR                  S5        UR                  SR                  U5      5        [        R                  R                  S:X  a7  UR                  SS/5        [        [         5      S:X  a  UR                  S5        UUUX-   U	U
U4$ )	Nzfuse-ld=lldr  r   r   z-static-libstdc++z-static-libgccr   z'-Wl,-Bstatic -lwinpthread -Wl,-Bdynamic)r  r  r  r  r  r  r   r   r   r  r  r   r9   r   r9  r   r   )r   r  r  r  r  rf  rg  rh  ri  rj  rk  rl  
opt_cflagsopt_ldflagss                 r   get_cpp_optionsr    s<     K LFG "NI"$6|RJ 	
W
%	&
 
-	. 
	 %\
2		3  2<@@K;6..99i>U>U}%{#CHH[1200I=!46F GH#I.'9##$MN 	 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.
rn  r  r  r   rX   r  ro  rp  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)rn  r   ro  rp  )r   r  r  r  r  )superrm   r   rr  r  r:  rs  rt  ru  rv  rw  rx  ry  r  )rl   rn  r  r  r   rX   r  ro  rp  rf  rg  rh  ri  rj  rk  rl  	__class__s                   r   rm   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)r   r   r   r   r  r   r   r   rm   r   __classcell__r  s   @r   r  r    s     # %'"'""#*!*! *! c]	*!
  *! *! *! *! *! 
*! *!r!   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)r   r   r   )fb_internal_macross    r   _use_fb_internal_macrosr%  /  s0    ;"
 &%I	r!   rm  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)r   r   r   r   r   sleef_includeopenmp_includepython_include
cc_includelibgcc_includelibgcc_arch_includelibgcc_backward_includeglibc_includelinux_kernel_include_LINKER_SCRIPTr5   r8   basenamer  	glibc_lib)r   rm  r   rh  rg  rl  linker_scripts          r   _setup_standard_sys_libsr6  >  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   r2  )r4  xs     r   r6  0_get_build_args_of_chosen_isa.<locals>.<genexpr>m  s     F0E1dmmA&&0Er8  zCPU_CAPABILITY=CPU_CAPABILITY_HAVE__CPU_DEFINITION)r   r9  build_macrobuild_arch_flagsr   r   r   upper)r7  macrosbuild_flagscaps       r   _get_build_args_of_chosen_isarE  h  s    FK/!F0C0C0EFF//12g,$$&C!#'!#'uO,F r!   include_pytorchc                 d   SSK JnJn  / nU" 5       n[        R                  R
                  (       a]  U/n[        R                  S:w  aE  [        R                  " 5       (       d+  UR                  SS/5        U(       d  UR                  S5        O/ n[        R                  R                  S:X  aw  [        R                  R                  nU(       d   S5       e[        U[        5      (       a  UR                  U5        O([        U[        5      (       d   eUR                  U5        [        R                  R                  S:X  aO  [        R                  R                   (       d   S	5       eUR                  [        R                  R                   5        ["        (       a  UR                  S
5        XVU4$ )Nr   )include_pathsTORCH_LIB_PATHr'   torch	torch_cputorch_pythonr   z^'config.aot_inductor.aoti_shim_library' must be set when 'cross_target_platform' is 'windows'.)z]'config.aot_inductor.aoti_shim_library_path' must be set to the path of the AOTI shim libraryz+ when 'cross_target_platform' is 'windows'.sleef)torch.utils.cpp_extensionrH  rI  r   r   link_libtorchr3   r4   r   r9  r   r   aoti_shim_libraryr   r   r   aoti_shim_library_pathr   )rF  rm  rH  rI  rk  rg  rj  rP  s           r   _get_torch_related_argsrR  |  sY    HI ?L((()<<8#F,<,<,>,>g{34  044	A & 3 3 E E$ p$ +S11  !23!"3T::::  !2300I=""99 	
 <
 	
9 	f11HHI{!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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^  rV  rW  r   r   r   r   rX  rY  get_config_varr   r   r   r+  )python_include_dirspython_include_pathpython_lib_paths      r   _get_python_related_argsri    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  lenr  loadsr=   r>   )commandrY  s     r   is_conda_llvm_openmp_installedrn    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brewr   )rp  z--prefixrV  r  )
rR   rS   r;   r<   r  r   r5   r8   rM   r=   )libomp_pathomp_availables     r   homebrew_libomprs    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   rt  rY  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[   rv  rw  TF)r;   r<   r  r  r  rx  r5   r8   ry  rP   r   rz  r=   )r   r~  rY  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)r   r   )r   r  preload_listr~  s       r   perload_icx_libomp_winr    s<    S C D L !&|> !r!   c                 	   / n/ n/ n/ n/ n/ n[         R                  R                  S:X  a  XX4XV4$ [        (       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	                  [.        R0                  5        [.        R2                  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$ )Nr   Xclangfopenmp
OMP_PREFIXr(  zomp.hlibz-environment variable `OMP_PREFIX` is invalid.ompCONDA_PREFIXx86_64zlibiomp5.dylibiomp5openmprV  z
libomp.dllQiopenmp
libiomp5mdzopenmp:experimentalz-Wp,-fopenmp gompfiopenmp)r   r   r   	_IS_MACOSr   r  r5   r6   r8   r9   rM   rZ  r[  rn  unamer  rs  r   r  r|  r  r  r   r   r*  openmp_lib_so)r   rh  ri  include_dir_pathslib_dir_pathsrc  rl  rr  
omp_prefixheader_path	valid_envconda_prefixconda_lib_pathrq  
openmp_libfb_openmp_extra_flagss                   r   _get_openmp_argsr    sC    FG#%!MD"$00I= 1$XX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!   c                      / n / n[         R                  " 5       (       a(  [        R                  " S5      /n UR	                  S5        X4$ )z
For fbcode cpu case, we should link stdc++ instead assuming the binary where dlopen is executed is built with dynamic stdc++.
rd  zstdc++)r   r   rV  re  r   )r  rc  s     r   _get_libstdcxx_argsr    sE      "MD"11(;<Hr!   use_mmap_weightsuse_mmap_weights_externalc                     / nU (       a  U(       a  [        S5      eU (       a  UR                  S5        U$ U(       a  UR                  S5        U$ )NzIOnly one of use_mmap_weights and use_mmap_weights_external should be truez USE_MMAP_SELFz USE_MMAP_EXTERNAL)r`   r   )r  r  rB  s      r   get_mmap_self_macror    sO     F5W
 	
 &' M 
#*+Mr!   c                  n    SSK Jn   / nU R                  R                  (       a  UR	                  S5        U$ )Nr   )r   z# AOT_INDUCTOR_USE_CACHING_ALLOCATOR)torch._inductorr   r   weight_use_caching_allocatorr   )r   rB  s     r   get_caching_allocator_macror    s+    &F77;<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 [        XV5      n![        5       n"U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-   nUUU	U
UUU4$ )a  
This function is used to get the build args of torch related build options.
1. Torch include_directories, libraries, libraries_directories.
2. Python include_directories, libraries, libraries_directories.
3. OpenMP related.
4. Torch MACROs.
5. MISC
6. Return the build args
)rF  rm  )
r  r  r6  rE  rR  ri  r  r%  r  r  )#r   r7  rF  rm  r   r  r  rf  rg  rh  ri  rj  rk  rl  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_librariesrf  python_libraries_dirs
omp_cflagsomp_ldflagsomp_include_dir_pathsomp_lib_dir_pathsomp_libomp_passthrough_argsfb_macro_passthrough_argsmmap_self_macroscaching_allocator_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.. 	& !8 9*+;W:< 	&
1	2
	 $	$ 		
 #	#  	
	
	  	   z)FG*-AADUUN')I!$;;>RR 
 	 r!   c                      ^  \ rS rSrSr\S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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   r7  rF  r  rm  rn  r   r  r  r	  r  rX   r  ro  rp  r   Nc                   > [         TU ]  U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)rn  r  r  r   rX   r  ro  rp  )r   r7  rF  rm  r   r  r  )r  rm   r{  r  rr  r:  rs  rt  ru  rv  rw  rx  ry  r  )rl   r7  rF  r  rm  rn  r   r  r  r	  r  rX   r  ro  rp  torch_definitionsr  torch_cflagstorch_ldflagsr  r  torch_passthrough_argsr  s                         r   rm   CppTorchOptions.__init__  s    " 	%##/%%' 	 		
 " "+/-&?
	
 " 	T&&(9:T'');<T\\<0T]]M2T))+?@T__o6T++-CD r!   r  )r   r   r   r   r  r   r   r   r   r   rm   r   r  r  s   @r   r  r    s    	 * % ""'!&*/%'""#7!7! 7! 	7!
 7! 7!  7! 7! $(7! 7! c]7! 7! 7! 7! 7!  
!7! 7!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   r   rJ  versionhipr5   rP   r   sdk_homer   r!   r   _set_gpu_runtime_envr  M  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 )r   r   rglobresolverX  rN   rO   )r8   lib_dirslog_msgs      r   _find_libcudart_staticr  W  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   
startswithr  r   rM   r   )r  r   r8   lib_dirstub_dirs        r   _transform_cuda_pathsr  a  s|     V$"**$K9P)Q)Q&<T&BGGFI(H  c(m, %r!   device_typern  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 [         R                  R                  SL 5      n[         R                  R                  nU
R                  U U[         R                  R                  S9nU S:X  a  UR                  [        R                   R"                  (       a  SOS	5        [        R                   R"                  b@  [         R                  " 5       (       d  U(       d  US
/-  nOUS/-  nUR                  S5        O^[         R                  " 5       (       d  U(       d  US/-  nOUSS/-  n[         R                  R                  S:X  a  US/-  n[%        U5        U S:X  a  UR                  S5        Sn[&        (       am  [        R(                  " S5      nUc  [+        U5      eU[        R,                  R/                  US5      /-  nU[        R,                  R/                  US5      /-  nO!US/-  n[1        S5      (       d  [+        U5      eUSS/-  nU(       a  US/-  nU S:X  a  UR                  S5        [         R                  " 5       (       al  UR                  [        R2                  5        U(       a+  U S:X  a%  [        R                   R"                  c
  U(       d  S/n	U S:X  a  [5        5       u  nnX~-  nX-  n[         R                  R6                  (       a  U[         R                  R6                  -  nUUUUUUU	4$ )z
This function is used to get the build args of device related build options.
1. Device include_directories, libraries, libraries_directories.
2. Device MACROs.
3. MISC
4. Return the build args
r  r  r   )cpp_extensionN)r  r   cudaz	 USE_ROCMz	 USE_CUDAamdhip64	torch_hipz __HIP_PLATFORM_AMD__
torch_cudar   cudartxpuz USE_XPUzIntel GPU driver is not properly installed, please follow the instruction in https://github.com/pytorch/pytorch?tab=readme-ov-file#intel-gpu-support.LEVEL_ZERO_V1_SDK_PATHr(  r  zWno-comment	ze_loadersycl	torch_xpumpsz USE_MPSz*-Wl,-Bstatic -lcudart_static -Wl,-Bdynamiccpu)r   r   r5   rP   r   r  r  torch.utilsr  rH  r   rO  library_pathsr   r   rJ  r  r  r  r   r6   rD  r8   r9   r   sdk_includer  custom_op_libs)r  rm  rn  rf  rg  rh  ri  rj  rk  rl  r  rO  xpu_error_stringze_rootstdcxx_lib_dir_pathsstdcxx_libss                   r   get_cpp_torch_device_optionsr  p  s$     K LFG "NI"$rzz)rzz)"-"6"6

;) ..V((66$>L ''55M"00($11GG 1 N
 f%--*;*;;M==(!!j\)	k]*	67!!fX%	fl33	""88IEhZ'	!.1e:&Z 	 ;ii 89G.//RWW\\'9=>>Lrww||GU;<<N }o%F,,.//k6**	+&Ie:&K334v-}}  (#(T'U$% $%$2N$I))V((777	 	 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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   r7  rF  r  rm  rn  r   r  r  r	  r  r  ro  rp  r   Nc                   > [         TU ]  UUUUUUUU
UUUS9  / n/ n/ n/ n/ n/ n/ n[        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)r7  rF  rm  rn  r   r  r  r  r  ro  rp  )r  rm  rn  )r  rm   r  r:  rs  rt  ru  rv  rw  rx  ry  r  )rl   r7  rF  r  rm  rn  r   r  r  r	  r  r  ro  rp  device_definitionsdevice_include_dirsdevice_cflagsdevice_ldflagsdevice_libraries_dirsdevice_librariesdevice_passthrough_argsr  s                        r   rm   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   )	r  r  r   r   ri  rk  rw  rK  r   )rl   r   python_lib_dirsr  s      r   r  'CppTorchDeviceOptions._finalize_options#  s    !# ":!;A'1,S0A/AR.SS,q!T%9%99$$++OA,>?$$++OA,>? : r!   r   )r   r   r   r   r  r   r   r   r   r   rm   r  r   r  r  s   @r   r  r    s     * %!""'!&*/%'""#:!:! :! 	:!
 :! :!  :! :! $(:! :! c]:! :! :! :! 
:! :!x	@ 	@r!   r  re   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   r3  splitextdirname)re   name_and_extrP  _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)
CppBuilderiG  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_flagsX  s!    )kFu	 +u&&r!   c                  D    [         (       a  SOSn [         (       a  SOSnX4$ )Nz.objr   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  )r   r  r  s     r   __get_precompiled_header_flags)CppBuilder.__get_precompiled_header_flagsd  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_flagsj  s    	#.;xJ&&r!   rP  sourcesBuildOption
output_dirNc                 l   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        [        R                  R                   =(       d    SU 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R1                  5       U l        UR5                  5       U l        [9        U R.                  U R2                  U R6                  45      S::  d   eU R.                  =(       d    U R2                  =(       d    U R6                  (       + U l        [<        (       a  U R2                  (       a   S5       eU R.                  (       a  U R?                  5       u  pVOZU R2                  (       a  U RA                  5       u  pVO6U R6                  (       a  U RC                  5       u  pVOU RE                  5       u  pV[F        RH                  RK                  U R                  U R                   U 35      U l
        U R                  (       a)  [F        RH                  RM                  U R                  5      OU R                  n[<        (       a$  U R6                  (       a  X`l'        OU U 3U l'        OU SU 3U l'        [Q        U[R        5      (       a  U/n[        RT                  " 5       (       aP  U R                  (       a?  [W        U5      U l        U Vs/ s H"  n[F        RH                  RM                  U5      PM$     nnU R2                  (       a  [Y        U5      S:X  d   eSUS    3U l-        OSRK                  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R_                  5        HB  n
[<        (       a  U =R                  SU
 S3-  sl        M)  U =R                  SU
 S3-  sl        MD     UR`                  =n(       a-  [<        (       a  [b        Re                  SU5        OSU S3U l        URg                  5        HV  n[<        (       a  U =R                  SU S3-  sl        M)  U =R                  S[h        Rj                  " U5       S3-  sl        MX     URm                  5        HB  n[<        (       a  U =R                  S	U S3-  sl        M)  U =R                  S
U S3-  sl        MD     URo                  5        HB  n[<        (       a  U =R
                  SU S3-  sl        M)  U =R
                  SU S3-  sl        MD     URq                  5        HB  n[<        (       a  U =R                  SU S3-  sl        M)  U =R                  SU S3-  sl        MD     URs                  5        H  nU =R                  U S3-  sl        M     g s  snf )Nr   F
aoti_modelr)   z/Cannot currently precompile headers on Windows!r   z-x c++-header r   rb  -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):rr  _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{  _namer   r   model_name_for_generated_files_target_name_build_optionr  r  r  r  r}  r  r~  r  r  sum_do_linkr   _CppBuilder__get_object_flags)_CppBuilder__get_precompiled_header_flags*_CppBuilder__get_preprocessor_output_flags$_CppBuilder__get_python_module_flagsr5   r8   r9   r3  _outputr   r   r   r   rk  _sources_argsr  r  rz  rN   warningr  rW  quoter  r  r  r  )rl   rP  r  r  r  file_extr  relative_target_filer   cflag
definitionrz  inc_dirldflagr  r  passthrough_args                    r   rm   CppBuilder.__init__p  sW    !#"$$&!!,.) #%(-$
>>N, 	
 )$113"-"C"C"E$113%(99;(99;);;=D&&(:(:D<O<OPQUVVVVK$"4"4K8K8K
 ;d&8&8 	
=	
8 %)%<%<%>"Hl%)%H%H%J"Hl  %)%I%I%K"Hl%)%C%C%E"HGGLL)9)9djj\(;TU && GGT../"" 	
 ;""+".0D/EF*^1-A,BCDLgs##iG $"9"9 '+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   8)X1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_argsrl  rY  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
$ )Nr   z /LD /link )r   r3  r   )rX   r  rE  rF  rG  rH  rI  rJ  rl  rY  r   rl   s              r   format_build_command9CppBuilder.get_command_line.<locals>.format_build_command  s     {  j"3!4A6F5GqUViq!1 2!F8=  ==[)<(=Q~>NaP\~^^C.s3 J  j'!,<+=Q{m1()+;*<AfXG  ==Q|nAn-=Q?R>STTCJr!   )
rX   r  rE  rF  rG  rH  rI  rJ  rl  rY  )r   rr  r9  r&  r%  r$  r'  r)  r(  r*  r8  )rl   rL  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                 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.ldr   i  r  i  r   )r   rO  r   r-  r5   r8   r9   _TORCH_PATHtempfileTemporaryDirectoryrR   r+  r2  r+  r3  copytreer   rM   rK  endswithchmodr;   r   rY  r  r   rX  )
rl   rm  output_pathtorch_includes_pathtmp_dirsrcdest_include_pathtmp_output_pathr   rY  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.
r   rT  N)r|  ra  rG  r,  r5   r8   r9   r.  _BUILD_TEMP_DIRrO  r_  rR  )rl   _build_tmp_dir	build_cmds      r   buildCppBuilder.buildQ  s    
 ""'')) !1!12Ao->?
 	!0))+		6N#r!   
cmake_pathr  c                 <   SR                  U R                  R                  5       5      n[        R                  R
                  (       d  SOSn[        R                  " SU R                   SU R                   SU S35      n[        R                  R                  (       d  [        R                  R                  (       ax  U[        R                  " S5      -  nU[        R                  " SU R                   S	U S
U R                   S	U R                   SU R                   S	U R                   S35      -  nO4U[        R                  " SU R                   SU R                   S35      -  nUS:X  au  [        R                  R                   cZ  SSKJn  U" 5       nU[        R                  " SU R                   SU R                   SU R                   SU SU 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.
r   STATICSHAREDzR
            cmake_minimum_required(VERSION 3.27 FATAL_ERROR)
            project(zs LANGUAGES CXX)
            set(CMAKE_CXX_STANDARD 17)

            # Set a library target
            add_library(z)

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

                zT
                # Add macro definitions
                target_compile_definitions(	 PRIVATE zN)

                # Add compile flags
                target_compile_options(zS)

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

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

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

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

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

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

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

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

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

                r  )r9   r1  r  r   r   dynamic_linkagetextwrapdedentr0  rO  test_configsuse_libtorchr$  r*  rJ  r  r  r2   ro  r  write)	rl   rj  r  rf  target_library_typecontentsro  current_archr  s	            r   save_compile_cmd_to_cmake$CppBuilder.save_compile_cmd_to_cmakec  sB    hht11AACD"//??HX 	 ??&&' ( **+1-@,A B

 ,,0C0C0P0P  H ,,0,=,=+>i} U( )-(9(9':)DDUDUCV W( )-(9(9':)DDeDeCf g
 H , -1,=,=+> ?,,0,=,=+> ?	 H & U]]%6%6%>N79L, -1,=,=+> ?,,0,=,=+> ?''+'8'8&9 :7: 8DnNS_R` a77CnIl^ \I<> >H@ *c"aGGH #""s   2H
Hsrc_pathc                     S[        U5      R                  -   n[        US5       nUR                  SU R                   SU S35        S S S 5        g ! , (       d  f       g = f)N${CMAKE_CURRENT_SOURCE_DIR}/aztarget_sources(rn  z)
)r   rP  r  ru  r0  )rl   rj  r{  r  s       r   save_src_to_cmakeCppBuilder.save_src_to_cmake  sP    1DN4G4GG*c"aGGod&7&7%8	(3OP #""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(       a>  UR                  SU R                   S	35        UR                  S
U R                   S35        S S S 5        g ! , (       d  f       g = f)Nr~  r   r   r}  z&
                    embed_gpu_kernel(r   z)
                    zadd_dependencies(z ${KERNEL_TARGETS})
ztarget_link_libraries(z! PRIVATE ${KERNEL_OBJECT_FILES})
)r  r   rP  r   rq  rr  ru  r0  )rl   rj  r  r  asm_filer   rw  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: >
 ! & +D,=,=+>>UVW,T->->,??cd #""s   B<C
C c                    SR                  U R                  R                  5       5      nSR                  U R                  R                  5       5      n[        R
                  " SU R                   SU SU R                   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)	Nr   z@
            # Add linker flags
            target_link_options(rn  zA)

            # Add libraries
            target_link_libraries(z)
         z#save_link_cmd_to_cmakefile expects z to already existr~  )r9   r1  r  r  rq  rr  r0  r5   r8   rM   r  ru  )rl   rj  lflagsrc  rw  r  s         r   save_link_cmd_to_cmake!CppBuilder.save_link_cmd_to_cmake	  s    $,,88:;xx**88:;??!!%!2!2 39VH E# $(#4#4"5Ytf E

 ww~~j)) 	
1*=NO	
) *c"aGGH #""s   C  
C.)r{  r1  r$  r}  rr  r%  r3  r&  r'  r)  r(  r.  r+  r8  r,  r*  r~  r  r9  r-  r0  r|  )r   r   )r   r   r   r   r  staticmethodr   r   r7  r4  r5  r6  r
   r   re  rm   rO  rR  ra  rh  ry  r  r  r  r   r   r!   r   r  r  G  s     'uS#X ' '
 'c3h ' '
 'E#s(O ' '
 'U38_ ' ' LGLG sDI~&LG &	LG
 LG 
LG\,# ,\;c ; B	 BD$$GG G 
	GRQC Q3 Q4 Q3 49 QU $  r!   r  r^  targetc                     S[         4S jnS[         S[         S[         S[         4S jnU" 5       nU" U[        U 5      [        U5      S9n[        U[        U5      S9  g )	Nr   c                  \    [         (       a  Sn U $ [        5       n [        U 5      (       a  Sn U $ )Nml64rF   )r   r   r  )ASM_CCs    r   get_asm_compiler.run_asm_build_object.<locals>.get_asm_compiler	  s2    ;F 	 &'F!&))r!   asm_ccr^  r  c                 H    [         (       a  U  SU SU 3nU$ U  SU SU 3nU$ )Nr   z /c /Fo z -c z -o r  )r  r^  r  r   s       r   rO  .run_asm_build_object.<locals>.get_command_line#	  sC    ; HAcU(6(3C 
 HDT&2C
r!   )r  r^  r  rd  )r   r   r_  )r^  r  rT  r  rO  r  r   s          r   run_asm_build_objectr  	  sh    c  3    F
$S)'/C
 C5c:;r!   )T)zc++17)F)Tr   Fr   )FF)r+  rg   rE  	functoolsr  localeloggingr5   r4   r   rW  rR   r;   r3   rV  rV  rq  rZ  collections.abcr   r   r   ctypes.utilr   pathlibr   typingr   r	   r
   rJ  torch._dynamo.utilsr   r  r   r   torch._inductor.cpu_vec_isar   r   %torch._inductor.runtime.runtime_utilsr   torch.torch_versionr   r   triton.fb.buildr   r   torch._inductor.fb.utilsr   r   r   r   r   re  r8   abspath__file___HEREr  rU  r9   r2  r  	_IS_LINUXr  r   r   getpreferredencodingr  	getLoggerr   rN   	lru_cacher   rD   r:   cachera   rc   r   r   r   r   r   r   r  r  r
  r   r  r  r  r  r"  r$  r-  r   r:  r>  rG  rR  r\  r_  r   re  r  r  r  r  r  r  r  r  r  r  r  r  r%  r6  rE  rR  r^  ri  rn  rs  r|  r  r  r  r  r  r  r  r  r  r  r  r  r	  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%$	=H&5579b ! Q! ! ! !8s 4 
3 
4 
 
J JZ l
 l
 l
 l
^ s s  ># 6$ 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 Os Ot O	# 	$ 	6s 6 6 6.(c ( ( (
  t  t n S	 " "$s) "!S !T#Y !H# $s) tCy :5cDI1E+F & -2;;%);
49d3i ;| c * !#... . #	.
 . 49d3icDItCy$s)TRUYVW.b5!! 5!pE49 E2d3i 2c '2'2'2 '2 49d3ic*+	'2T6 eDItCy<P6Q (&3&3%)&3
49d3ic*+&3R
$s) 
0%S	49(<"= 02    tSy)  ( 
3 
# 
$ 
 
 ? ? ? ?<kUkU
49d3icDItCy$s)KLkU\
U49d3i#78 
7;	#Y T#Y YYY Y 	Y
 Y Y  $Y 49d3icDItCy$s)TRUYVWYxC!j C!L7 Q $  -$s) - -" mmm m 49d3icDItCy$s)TRUYVW	m`L@O L@^
38_0N Nb<c <3 <S <T <r!   