
    3j                    x   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  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?Sr@\?(       a  \R                  " 5       4OSrB\R                  " \D5      rE\R                  " S5      S\GS\G4S j5       rHS\G4S jrI\R                  S \GSS4S! j5       rK " S" S#5      rL\R                  S \GSS4S$ j5       rM\R                  S \GS\G4S% j5       rNS\G4S& jrOS'\2S\P\G\G4   4S( jrQS)\GS*\GS+\GS,\GS\G4
S- jrR SS.\S\P\G\G4      S/\GS0\GS\G4S1 jjrT\R                  S0\GS\24S2 j5       rU\R                  S0\GS\24S3 j5       rV\R                  S0\GS\24S4 j5       rW\R                  S0\GS\24S5 j5       rX\R                  S0\GS\24S6 j5       rY\R                  S\24S7 j5       rZ\R                  S\24S8 j5       r[\R                  S\24S9 j5       r\\R                  S\24S: j5       r]\R                  S\24S; j5       r^\R                  S \GS\G4S< j5       r_S=\S\G   S>\S\G   SS4S? jr`S@\S\G   S\S\G   4SA jraSB\GSS4SC jrbSB\GSS4SD jrcSE\GSF\GSS4SG jrdSE\GSF\GSS4SH jreSI\GS\G4SJ jrf " SK SL5      rgSSM\2S\S\G   4SN jjrhSSO\GS\S\G   4SP jjriS0\GS\S\G   4SQ jrjS0\GS\S\G   4SR jrkS\S\G   4SS jrlS\P\S\G   \S\G   4   4ST jrm SS0\GSU\2S\P\S\G   \S\G   4   4SV jjrnSW\2S\S\G   4SX jro   SS0\GSW\2SM\2SY\\G   SU\2S\P\S\G   \S\G   \S\G   \S\G   \S\G   \S\G   \S\G   4   4SZ jjrp " S[ S\\g5      rqS\S\G   4S] jrrS\S\G   4S^ jrsS\S\G   4S_ jrtS0\GS`\2S'\2S\P\S\G   \S\G   \S\G   \S\G   4   4Sa jruSb\$S\P\S\G   \S\G   4   4Sc jrvSd\2S`\2S\P\S\G   \S\G   \S\G   4   4Se jrwS\S\G   4Sf jrxS\P\S\G   \S\G   4   4Sg jry\R                  S\24Sh j5       rz\R                  S\P\2\G4   4Si j5       r{\R                  S0\GSj\GSS4Sk j5       r|\R                  S0\GSS4Sl j5       r}S0\GS\P\S\G   \S\G   \S\G   \S\G   \S\G   \S\G   4   4Sm jr~S\P\S\G   \S\G   4   4Sn jrSo\2Sp\2S\S\G   4Sq jrS\S\G   4Sr jrS0\GSb\$Sd\2S`\2S'\2So\2Sp\2S\P\S\G   \S\G   \S\G   \S\G   \S\G   \S\G   \S\G   4   4Ss jr " St Su\q5      rSSv jr\R                  " Sw5      Sx\GS\S-  4Sy j5       rSz\GS{\GS|\GSS4S} jrS~rS/\GS\GS-  4S jrS\S\G   S\S\G   4S jrS\S\G   SS4S jr  SS\GS`\2S\2S\P\S\G   \S\G   \S\G   \S\G   \S\G   \S\G   \S\G   4   4S jjr " S S\5      rS\GS\P\G\G4   4S jr " S S5      rS\GS\GSF\GSS4S jrg)    N)Sequence)cdllwintypes)find_library)Path)Any)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/wildlama/miniconda3/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_searchrB   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bing++zDownloading GCC via conda	CONDA_EXEcondacreatez	--prefix=z--channel=conda-forgez--quietz-yz
python=3.8gxx)stdout)r3   r6   r7   r   existsloginfoenvirongetshutilwhichr9   
check_callPIPE)prefixcxx_pathrH   s      r   r8   r8   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)r9   r:   STDOUTr<   RuntimeErrorr;   )rW   r   s     r   check_compiler_exist_windowsr`      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)rd   ctypesWinDLLversion_dll_setup_functions_get_version_info)selfrd   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LPDWORDrh   GetFileVersionInfoSizeWargtypesDWORDrestypeLPVOIDGetFileVersionInfoWBOOLLPCVOIDrf   POINTERc_void_pUINTVerQueryValueWrk   s    r   ri   %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   rs   rh   rq   rd   rf   byrefr_   create_string_bufferversion_inforv   )rk   dummysizesuccesss       r   rj   &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)rf   rz   r   r{   rh   r|   r   r   valuerange	string_atint
from_bytesappendprint)
rk   	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   )rd   rh   r   r   N)__name__
__module____qualname____firstlineno__strrl   ri   rj   r   r   __static_attributes__r   r   r   rb   rb      s-    !# !$ !@.O" r   rb   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   rE   HostX64x64zcl.exeHostX86x86)r3   r6   r7   rO   rP   rL   r9   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_clr3   r6   rL   rb   r   r_   )rW   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 )
r9   r:   r^   r<   r_   	Exception
splitlinessplitr   lower)rW   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_platformr1   r2   	MINGW_GXXpackage_cpp_onlyr   _IS_WINDOWSr3   rO   rP   normalize_path_separatorr`   r   	is_fbcoder   cc
isinstancecppr?   listr   rB   )rW   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 )r9   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   cubins
output_dircpp_compilerc                    [         R                  R                  US5      n[         R                  R                  US5      n[        US5       nUR	                  S5        U  Hs  u  pg[         R                  R                  U5      nUR                  SS5      R                  SS5      n	UR	                  S	U S
U SU SU	 SU SU SU SU SU S35        Mu     SSS5        [        R                  " USUSU/SSSS9  U$ ! , (       d  f       N,= f)aE  Convert multiple cubin files to a single .o using batched .incbin assembly.

Instead of spawning 3 subprocesses per cubin (ld + 2x objcopy), generates
a single .S file with .incbin directives for all cubins and compiles it
with one compiler invocation. Produces bit-identical rodata and symbols
as the per-cubin convert_cubin_to_obj approach.

Args:
    cubins: list of (cubin_file_path, kernel_name) tuples.
    output_dir: directory for the generated .S and .o files.
    cpp_compiler: C compiler to use for assembling (default: gcc).

Returns:
    Path to the combined .o file.
zcubins_combined.Szcubins_combined.owz.section .rodata
\z\\"z\"z.balign 16
.global __z_start
.global __z_end
__z_start:
.incbin "z"
__z_end:
.global __z_size
.set __z	_size, __z	_end - __z_start
N-c-oTr   )	r3   r6   r7   openwriteabspathreplacer9   r   )
r   r   r  asm_pathobj_pathfr   r   	abs_cubinescaped_paths
             r   batch_convert_cubins_to_objr    s)   ( ww||J(;<Hww||J(;<H	h		$%'-#J
3I$,,T6:BB3NLGG(M *(M * M "(> * M "(M *% ' M;-xA
	 (. 
$ NN	tXtX6	 O1 
	s   BC>>
Dc                 |    [         R                  " U S/5      R                  S5      nSUR                  5       S   ;   $ )Nr/   utf8Appler   )r9   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\+\+))r1   r2   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)NFrY   rZ   	Microsoftr   )	r   r9   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   r/   rZ   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   r9   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/  G  s    #%&&r   c                  (    [        [        5       5      $ r   )r  r   r   r   r   is_clangr1  L  s    %'((r   c                  (    [        [        5       5      $ r   )r-  r   r   r   r   r*  r*  Q  s    .011r   c                  (    [        [        5       5      $ r   )r  r   r   r   r   is_apple_clangr4  V  s    +-..r   c                  (    [        [        5       5      $ r   )r   r   r   r   r   
is_msvc_clr6  [  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[   envr/   r   r   
)
r3   rO   copyr9   r:   r^   r  r  r   r  )rW   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>w  s     >XTT]]4((X   #%)extend)r?  r@  s     r   _append_listrK  v  s    >X>>r   	orig_listc                 L    / nU  H  nX!;  d  M
  UR                  U5        M     U$ r   )r   )rL  new_listrF  s      r   _remove_duplication_in_listrO  z  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 )	r3   r6   rL   r   mkdirOSErrorerrnoEEXISTr_   )rP  r   s     r   _create_if_dir_not_existrX    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)r3   r6   rL   walkr7   removermdir)rP  rootdirsfilesnamerd   dir_paths          r   _remove_dirrc    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)re  r   rK   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   r9   r   rT   r^   r   rK   r  r  r1   r2   r   CppCompileError)rd  re  r   r   outputopenmp_probleminstructions          r   _run_compile_cmdrm    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	   rm  )rd  re  s     r   run_compile_cmdrp    s    	n	%' 
&	%	%s   !
/	orig_pathc                 \    [         (       a   U R                  [        R                  S5      $ U $ )N/)r   r  r3   sep)rq  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-  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.
NrW   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)rk   rW   rw  rx  ry  rz  r{  r|  r}  r~  r   r  r  r  s                 r   rl   BuildOptionsBase.__init__  s      "'2'8b(4(:"(,B#*=b*8*>B%._",<,B /3'(9#/#/$1r   c                     U R                   (       d"  U R                  (       d  U R                  (       a  / U l        / U l        / U l        g g r   )r  r  r  r  r  r  r}   s    r   _process_compile_only_options.BuildOptionsBase._process_compile_only_options  s7    !3!3t7J7J#%D  DODM 8K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   )rO  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)rW   rw  rx  ry  rz  r{  r|  r}  r~  r   r  r  )r  r  r  r  r  r  r  r  r  r  r  r  jsondump)rk   r  attrsr  s       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   NNNNNNNFFFFFr   )r   r   r   r   __doc__r   r   r   rl   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   rv  rv    s    (,)-#'$(+/&*-1"'""#"2"2 #Y%"2 3i$&	"2
 S	D "2 cT!"2 S	D("2 9t#"2 s)d*"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   rv  warning_allc                 4    [         (       d  U (       a  S/$ / $ / $ )NWallr   )r  s    r   _get_warning_all_cflagr  1  s    ;&x.B.	r   std_numc                 6    [         (       a	   Sn SU  3/$ SU  3/$ )Nc++20zstd:zstd=r  )r  s    r   _get_cpp_std_cflagr  8  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  ry  ignored_optimization_arguments      r   _get_os_related_cpp_cflagsr  G  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  k  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  t  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  )ry  rz  s     r   !_get_inductor_debug_symbol_cflagsr    sB     FG{!C ? 	c?r   min_optimizec                    / 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[         R                  R                  (       a.  [        (       a  UR                  S5        OUR                  S5        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Ob0Oy-O0r  zfno-omit-frame-pointerr%   zfno-tree-loop-vectorizeppc64lezmcpu=nativeriscv64zmarch=rv64gcriscv32zmarch=rv32gczmarch=native	flto=thin)r
   r   debug_compiler3   rO   rP   debug_symbolsr   compile_wrapper_opt_levelr  enable_frame_pointerr   r  r1   r2   r  r   machine
enable_ltor  )r  r  ry  rz  should_use_optimized_flagsshould_add_debug_symbol_flagsdebug_cflagsdebug_ldflagss           r   _get_optimization_cflagsr    s?    FG 	)) 	E::>>7=D"
 	)) 	D,,	D::>>7=D	D ::>>6<C	 " ";|t66FAM##==SW F
 ;**FtfF$&G&I# //;MM% MM23
#%%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   r2   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$ )	N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   r7   r   rJ  r   r   )r  r  r  r  r  rw  rx  ry  rz  r{  r|  r}  
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.
r  r  r  r   rW   r  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  r   r  r  )r  r  r  r  r  )superrl   r   r  r#  rK  r  r  r  r  r  r  r  r  )rk   r  r  r  r   rW   r  r  r  rw  rx  ry  rz  r{  r|  r}  	__class__s                   r   rl   CppOptions.__init__5  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   rl   r   __classcell__r(  s   @r   r%  r%  *  s     # %'"'""#*!*! *! c]	*!
  *! *! *! *! *! 
*! *!r   r%  c                  Z    SS/n [         R                  (       a  U R                  S5        U $ )NTORCH_INDUCTOR_CPP_WRAPPERSTANDALONE_TORCH_HEADER!TORCH_INDUCTOR_PRECOMPILE_HEADERS)r
   cpp_cache_precompile_headersr   )defss    r   !_get_torch_cpp_wrapper_definitionr2  b  s(    (*CDD**78Kr   c                      S/$ )Nz" C10_USING_CUSTOM_GENERATED_MACROSr   r   r   r   _use_custom_generated_macrosr4  i  s    011r   c                      [         (       dB  [        R                  " 5       (       a&  / SQn [        R                  " 5       S:X  a  U SS/-  n U $ / $ / $ )N)C10_USE_GLOGC10_USE_MINIMAL_GLOG$C10_DISABLE_TENSORIMPL_EXTENSIBILITYx86_64zATEN_MKL_ENABLED_FBCODE=1zATEN_MKLDNN_ENABLED_FBCODE=1)r   r
   r   r2   r  )fb_internal_macross    r   _use_fb_internal_macrosr;  m  sY    ;"
 !X-"/2' " &%I	r   r~  c                 d   / n/ n/ n/ n[         (       a  X4XV4$ [        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[        R&                  -   5        UR                  S5        UR                  SU 35        UR                  S[        R&                  -   5        X4XV4$ )Nnostdincincludez --rtlib=compiler-rtz -Br   zWl,--script=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_SCRIPTr3   r6   basenamer  	glibc_lib)r  r~  r   ry  rx  r}  rz  linker_scripts           r   _setup_standard_sys_libsrM    s   
 F L"$G{%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\""##$:;##EK,A,A$ABNN=)NN\-9:NN3!6!667!1::r   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   rC  )rE  xs     r   rG  0_get_build_args_of_chosen_isa.<locals>.<genexpr>  s     F0E1dmmA&&0ErI  zCPU_CAPABILITY=CPU_CAPABILITY_HAVE__CPU_DEFINITION)r   rJ  build_macrobuild_arch_flagsr
   r   r   upper)rN  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  / nU" 5       n[        R                  R
                  (       ay  U/n[        R                  S:w  aa  [        R                  " 5       (       dG  UR                  SS/5        [        (       a  UR                  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c10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_extensionr_  r`  r
   r   link_libtorchr1   r2   r   rJ  r   r   r   aoti_shim_libraryr   r   r   aoti_shim_library_path)r]  r~  r_  r`  r|  rx  r{  rh  s           r   _get_torch_related_argsrj    sl    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_pathrL   r2   r  parentabsolutewarningswarnr   )include_dirstd_libs     r   _get_python_include_dirsrv    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)rv  rn  ro  r   r   r   r   rp  rq  get_config_varr
   r   r   rB  )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)	r9   r:   r   r  lenr  loadsr;   r<   )commandrj  s     r   is_conda_llvm_openmp_installedr    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   )r  z--prefixrg  r  )
rQ   rR   r9   r:   r  r   r3   r6   rL   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)r9   r:   r  r3   r6   r7   rstripisfilerO   r   LoadLibraryr;   )r  r  rj  omp_paths       r   perload_clang_libomp_winr  0  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=rZ   r  r  TF)r9   r:   r(  r  r  r  r3   r6   r  rO   r   r  r;   )r  r  rj  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                 T	   / 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Or[)        U 5      (       a/  UR	                  S5        UR	                  S5        [+        U 5        GO3UR	                  S5        UR	                  S5        GO[         R,                  " 5       (       a~  UR	                  [.        R0                  5        UR	                  S5        UR	                  [        R                  R3                  [.        R4                  5      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_PREFIXr9  zlibiomp5.dylibiomp5openmprg  z
libomp.dllQiopenmp
libiomp5mdzopenmp:experimentalz-Wp,-fopenmpgompfiopenmp)r
   r   r   	_IS_MACOSr   r  r3   r4   r6   r7   rL   rr  rs  r  unamer  r  r   r  r  r-  r  r   r   rA  dirnameopenmp_lib_so)r  ry  rz  include_dir_pathslib_dir_pathsr{  r}  r  
omp_prefixheader_path	valid_envconda_prefixconda_lib_pathr  s                 r   _get_openmp_argsr  ]  sK    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$$[%?%?@##N3  1J1J!KL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++.
r|  zstdc++)r
   r   rn  r}  r   )r  r{  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  rY  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
   rY  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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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
)r]  r~  )
r2  r4  rM  r\  rj  r  r  r;  r  r  )$r  rN  r]  r~  r   r  r  rw  rx  ry  rz  r{  r|  r}  torch_cpp_wrapper_definitions'use_custom_generated_macros_definitionssys_libs_cflagssys_libs_include_dirssys_libs_passthrough_argssys_libs_ldflags
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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$ )CppTorchOptionsiM  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   rN  r]  r  r~  r  r   r  r  r  r  rW   r  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US9u  nnnnnnn[        U R                  U5        [        U R                  U5        [        U R                  U5        [        U R                  U5        [        U R                  U5        [        U R                  U5        [        U R                  U5        U R                  5         g )N)r  r  r  r   rW   r  r  r  )r  rN  r]  r~  r   r  r  )r'  rl   r  r  r  rK  r  r  r  r  r  r  r  r  )rk   rN  r]  r  r~  r  r   r  r  r  r  rW   r  r  r  torch_definitionsr  torch_cflagstorch_ldflagsr  r  torch_passthrough_argsr(  s                         r   rl   CppTorchOptions.__init__Y  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   rl   r   r*  r+  s   @r   r  r  M  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   ra  versionhipr3   rO   r   sdk_homer   r   r   _set_gpu_runtime_envr    sa    MM%rzz)rzz)"-"6"6

; * * & 	r      r6   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resolverp  rM   rN   )r6   lib_dirslog_msgs      r   _find_libcudart_staticr    sS    DJ$$%9:;H{""$+++5dV<GHHWr   dll_pathdef_pathimport_lib_pathc           	      `   [         R                  R                  U 5      n[        US5       n[        R
                  " SSU /U[        R                  SS9  SSS5        [        R
                  " SSUS	US
U/[        R                  SS9  [        R                  SX#5        g! , (       d  f       NP= f)zIGenerate a MinGW import library (.a) from a DLL using gendef and dlltool.r  gendef-T)rK   r[   r   Nzx86_64-w64-mingw32-dlltoolz-d-lz-Dr[   r   z)Generated MinGW import library %s from %s)	r3   r6   rJ  r  r9   r   rT   rM   rN   )r  r  r  dll_namedef_files        r   _gen_mingw_import_libr    s    ww)H	h	sH%??		
 
 NN(	
  HH8/T+ 
	s   )B
B-z#include <stdint.h>
uint64_t __security_cookie = 0x00002B992DDFA232ULL;
void __security_check_cookie(uint64_t cookie) { (void)cookie; }
void __GSHandlerCheck(void) {}
c                 t   [         R                  R                  U S5      n[         R                  R                  U5      (       a  gSnSn [         R                  R                  U S5      n[         R                  R                  U S5      n[	        US5       nUR                  [        5        SSS5        [        R                  SS	5      n[        R                  " US
USU/[        R                  SS9  [        R                  SS5      n[        R                  " USX/[        R                  SS9  [        R                  SU5         X#4 HH  nU(       d  M  [         R                  R                  U5      (       d  M2  [         R                  " U5        MJ     g! , (       d  f       N= f! [        [        R                   4 a    [        R#                  SSS9  [         R                  R                  U5      (       a  [         R                  " U5         X#4 HH  nU(       d  M  [         R                  R                  U5      (       d  M2  [         R                  " U5        MJ     gf = f! X#4 HH  nU(       d  M  [         R                  R                  U5      (       d  M2  [         R                  " U5        MJ     f = f)z
Create a static library with MSVC GS security symbol stubs for MinGW.

Returns the library name (without lib prefix / .a suffix) if successful,
or None on failure.
zlibmsvc_gs_stubs.amsvc_gs_stubsr   z_msvc_gs_stubs.cz_msvc_gs_stubs.or  NrF   rD   r  r  Tr  arrcsz!Created MSVC GS stubs library: %sz'Failed to create MSVC GS stubs library.exc_info)r3   r6   r7   rL   r  r	  _MSVC_GS_STUBS_SOURCEr   r  r9   r   rT   rM   rN   r\  r<   r   warning)r   	stubs_libsrc_pathr  r  	mingw_gccmingw_ars          r   _create_msvc_gs_stubs_libr    s    Z)=>I	ww~~i  HH77<<
,>?77<<
,>?(C AGG)* ! %%eU3	hh7??	

 $$UD1ui2??	

 	4i@ %AqRWW^^A&&		! &5 ! " z<<= 5 	 	
 77>>)$$IIi %AqRWW^^A&&		! & %AqRWW^^A&&		! &sK   AF) F-BF) 
F&"F) )A(I#I& "I##I& &J76"J7J7r{  c                    SSK n[        R                  R                  S5      nU(       d  [        R                  S5        / $ U  H_  n[        R                  R                  [        R                  R                  US5      5      (       d  MG  [        R                  SU5        / s  $    [        R                  R                  USS5      n[        R                  R                  U5      (       d   [        R                  R                  US5      nUR                  [        R                  R                  US	5      5      nSnU  H  n[        R                  R                  U5      (       d  M)  [        R                  " U[        R                  5      (       d  MU  [        R                  R                  [        R                  R                  US
5      5      (       d  M  Un  O   U(       d0  [        R                  SU5        Ub  [        U5      nU(       a  U/$ / $ Uc  [        R                  SU 5        / $ US   n[        R                  R                  U5      n	[        R                  R                  XiR                  SS5      5      n
[        R                  R                  US5      n [!        XU5        / $ ! ["        [$        R&                  4 av    [        R                  SSS9  X4 H?  n[        R                  R                  U5      (       d  M)  [        R(                  " U5        MA     [        U5      nU(       a  U/s $ / s $ f = f)a  
Auto-generate a MinGW-compatible import library (libcudart.a)
from the CUDA runtime DLL. This avoids linking against the hybrid cudart.lib
which contains MSVC-compiled static objects with /GS security symbols that
MinGW cannot resolve.

Falls back to creating MSVC GS security stubs if the DLL is unavailable,
and falls back gracefully to the original cudart.lib if that also fails.

Returns a list of extra library names to link (e.g. ["msvc_gs_stubs"]).
r   NWINDOWS_CUDA_HOMEzFWINDOWS_CUDA_HOME not set, skipping MinGW cudart import lib generationzlibcudart.az5libcudart.a already exists in %s, skipping generationrE   r   zcudart64_*.dllz
cudart.libztNo cudart64_*.dll found in %s. Cannot generate MinGW import library. Will create MSVC GS security stubs as fallback.zNo writable directory containing cudart.lib found. Cannot generate MinGW import library. If linking fails with undefined references to __security_cookie, ensure cudart.lib is present in one of: %sz.dllz.defzNFailed to generate MinGW cudart import library. Falling back to MSVC GS stubs.Tr  )globr3   rO   rP   rM   debugr6   rL   r7   r   accessW_OKr  r  rJ  r  r  r<   r9   r   r\  )r{  r  windows_cuda_homelib_dirbin_dirdll_candidatesr   stub_libr  r  r  r  r  s                r   _ensure_mingw_cudart_import_libr     st    

':;		T	
 	!77>>"'',,w>??IIMwWI " ggll,eU;G77==!!'',,0%8YYrww||G5EFGN J!77==!!bii&A&Aww~~bggll7LABB$
	 " >	
 !0<H z!	9 	
 	a Hww)Hww||J(8(8(HIHggll:}=Oh/B	z<<= - 	 	

 ,Aww~~a  		! - -Z8:	s   $J2 2AM/M=MM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)	enumerater3   rO   
startswithr  r   rL   r   )r  r   r6   r  stub_dirs        r   _transform_cuda_pathsr  X  s|     V$"**$K9P)Q)Q#9$#?GGFI(H  c(m, %r   device_typer  c                 2   / 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        Ol[         R                  " 5       (       d  U(       d  US/-  nOUSS/-  n[         R                  R                  S:X  a  [%        U5      nUS/U-   -  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.                  R1                  US5      /-  nU[        R.                  R1                  US5      /-  nO!US/-  n[3        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       (       am  UR                  [        R4                  5        U(       a+  U S:X  a%  [        R                   R"                  c
  U(       d  S/n	U S:X  a  [7        5       u  nnX-  nUU-  n[         R                  R8                  (       a  U[         R                  R8                  -  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   r3   rO   r   r  r  torch.utilsr  r_  r   rg  library_pathsr   r   ra  r  r  r  r  r   r4   rU  r6   r7   r   sdk_includer  custom_op_libs)r  r~  r  rw  rx  ry  rz  r{  r|  r}  r  rg  
extra_libsxpu_error_stringze_rootstdcxx_lib_dir_pathsstdcxx_libss                    r   get_cpp_torch_device_optionsr/  g  s5     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<^L
hZ*44	!.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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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   rN  r]  r  r~  r  r   r  r  r  r  r  r  r  rW   r   Nc                   > [         TU ]  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)rN  r]  r~  r  r   r  r  r  r  r  r  rW   )r  r~  r  )r'  rl   r/  rK  r  r  r  r  r  r  r  r  )rk   rN  r]  r  r~  r  r   r  r  r  r  r  r  r  rW   device_definitionsdevice_include_dirsdevice_cflagsdevice_ldflagsdevice_libraries_dirsdevice_librariesdevice_passthrough_argsr(  s                         r   rl   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   r  r  r  r\  r   )rk   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   rl   r  r   r*  r+  s   @r   r1  r1    s     * %!""'!&*/%'""#<!<! <! 	<!
 <! <!  <! <! $(<! <! c]<! <! <! <! <!  
!<! <!|	@ 	@r   r1  rd   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
)r3   r6   rJ  splitextr  )rd   name_and_extra  _extdirs        r   &get_name_and_dir_from_output_file_pathrC  )  sH    " 77##I.L!!,/JD
''//)
$C9r   c                   ^   \ 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	\\\   -  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)
CppBuilderiA  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/Fer  r  	extensionoutput_flagss     r   __get_python_module_flags$CppBuilder.__get_python_module_flagsR  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  rH  s     r   __get_object_flagsCppBuilder.__get_object_flagsX  s!    )kFt	#.;xG&&r   c                  b    [         (       d  [        5       (       d  SOSn [         (       a  SOSnX4$ )N.pch.gchz/Fpr  )r   r/  rH  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  rH  s     r   __get_preprocessor_output_flags*CppBuilder.__get_preprocessor_output_flagsd  s    	#.;xJ&&r   ra  sourcesBuildOptionr   Nc                 |   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                  (       ac  [Y        U5      S:X  d   eSUS    3U l-        U R                  (       a3  []        UR'                  5       5      (       a  U =R                  S	-  s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Ra                  5        HB  n
[<        (       a  U =R                  SU
 S3-  sl        M)  U =R                  SU
 S3-  sl        MD     URb                  =n(       aq  [<        (       a  [d        Rg                  SU5        OOSU S3U l        U R                  (       a3  []        UR'                  5       5      (       a  U =R                  S-  sl        URi                  5        HV  n[<        (       a  U =R                  SU S3-  sl        M)  U =R                  S[j        Rl                  " U5       S3-  sl        MX     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        HB  n[<        (       a  U =R                  SU S3-  sl        M)  U =R                  SU S3-  sl        MD     URu                  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   z- -relocatable-pch -Xclang -fno-pch-timestamp rs  r  z/D z-D zIPrecompiled header support for MSVC is currently unavailable; ignoring %sz	-include z -Xclang -fno-validate-pch z/I "z" z-Iz
/LIBPATH:"z-Lr  z.lib" r  );r  _cflags_args_definitions_args_include_dirs_args_ldflags_args_libraries_dirs_args_libraries_args_passthrough_parameters_args_orig_source_paths_output_dir_target_filer  r  _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_flagsr3   r6   r7   rJ  _outputr   r   r   r   r  _sources_argsr  r  r  r  rM   r  r  rh  quoter  r  r  r  )rk   ra  rX  rY  r   file_extrJ  relative_target_filer   cflag
definitionr  inc_dirldflagr  r  passthrough_args                    r   rl   CppBuilder.__init__j  s    !#"$$&!!,.) #%(-$
>>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&&9[5M5M5O+P+P !!%TT!!$'!2D ++-E{!!qq\1!!!qq\1!	 . &557J{&&C
|1*==&&&C
|1*==&	 8 "-!?!???{_&
 -66H5I*K'**y9Q9Q9S/T/T %%)FF%"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E =s   8)Z9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$ )NrW   rX  include_dirs_argsdefinitions_argscflags_argsldflags_argslibraries_argslibraries_dirs_argsr}  rj  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   rk  r   )rW   rX  r|  r}  r~  r  r  r  r}  rj  r   rk   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   )
rW   rX  r|  r}  r~  r  r  r  r}  rj  )r   r  rq  r^  r]  r\  r_  ra  r`  rb  rp  )rk   r  command_lines   `  r   get_command_lineCppBuilder.get_command_line	  s    			  #	 "		
 	 	  	 "%	 "	 	 	> ,^^&&"55!33))++// $ 9 9!>><<
 r   c                 ,    [        U R                  5      $ r   )r   re  r}   s    r   get_target_file_pathCppBuilder.get_target_file_path2	  s    '(9(9::r   c                 ,   [        S5         [        R                  " U R                  5       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        U R"                  R$                  nU(       Ga  [
        R                  R'                  U5      (       a  [(        (       d  [+        5       (       d  SOSnXx-   n	[
        R                  R                  U5      n
[        R                  " U[
        R                  R                  XJ5      5        [
        R                  R'                  U	5      (       a7  [        R                  " U	[
        R                  R                  XJU-   5      5        U Vs/ s H  nX:X  a  U
OUPM     nnU R,                  (       d+  U(       a+  [
        R                  R'                  U5      (       a  SS/USS& [/        UU[
        R                  R                  U5      [0        S	9n[
        R                  R3                  U5      (       a  [
        R4                  " U5        [        R                  " X5        UR7                  S
5      (       a  [
        R8                  " US5        O-UR7                  S5      (       a  [
        R8                  " US5        S S S 5        S S S 5        g s  snf ! , (       d  f       N= f! [:        R<                   a5  n[>        R@                  " XRB                  RE                  S5      5      UeS nAff = f! , (       d  f       g = f)Nro  r>  z	script.ldrQ  rR  z	-isysrootr   r'   )exception_classr   i  rG  i  r   )#r	   rh  r   r  re  r3   r6   r7   _TORCH_PATHtempfileTemporaryDirectoryrQ   r=  rI  rc  rJ  copytreeri  r  r  r   r/  r  r   r_   rL   r\  endswithchmodr9   r   r   ri  rj  r  )rk   r  output_pathtorch_includes_pathtmp_dirsrcdest_include_path
pch_headerpch_extpch_compiledpch_basenameargtmp_output_pathr   s                 r   build_fbcode_reCppBuilder.build_fbcode_re5	  s    .)kk$"7"7"9:G<T"// ')ggll;	&J#002gKKWk0RS#66Cgrww?O?OPS?T)UV  7(*Wi(H%OO$7K
 "&!3!3!F!FJ!bggnnZ&@&@,7Kvxx&V'1';')ww'7'7
'CJW0ST77>>,77"KK , "WW6L M (/#'. -0,=L3F'.   # ))"rww~~j'A'A(3S'9!
 '9((5(4	'O ww~~k22		+.KK="++D11e4$--e44e4i 3 *)<#- 32j 00 T))'88??73KLRSST{ *)sa   %PAN97G+N("N#5DN(N9#N((
N6	2N95P6N99P0O==PP
P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   re  N)r  r  rX  rd  r3   r6   r7   rf  _BUILD_TEMP_DIRr  rp  rc  )rk   _build_tmp_dir	build_cmds      r   buildCppBuilder.buildx	  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  av  [        R                  R                   c[  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OUS:X  a  U[        R                  " S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 20)

            # 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  a=	  
                find_program(OBJCOPY_EXECUTABLE objcopy)
                if(NOT OBJCOPY_EXECUTABLE)
                    message(FATAL_ERROR "objcopy not found. Cannot embed spv as object file")
                endif()

                set(KERNEL_TARGETS "")
                set(KERNEL_OBJECT_FILES "")
                # Function to embed a single kernel
                function(embed_gpu_kernel KERNEL_NAME SPV_FILE)
                    set(OBJECT_BASENAME ${KERNEL_NAME}.spv.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 ${SPV_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)

                    # --- SPV_FILE to Object File (.o) Command ---
                    add_custom_command(
                        OUTPUT ${OBJECT_FILE}
                        COMMAND ${CMAKE_LINKER} -r -b binary -z noexecstack -o ${OBJECT_FILE} ${SPV_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 ${SPV_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  )r7   ri  r  r
   r   dynamic_linkagetextwrapdedentrh  rg  test_configsuse_libtorchr\  rb  ra  r  r  *torch._inductor.codegen.cuda.compile_utilsr  r  r	  )	rk   r  r  rw  target_library_typecontentsr  current_archr  s	            r   save_compile_cmd_to_cmake$CppBuilder.save_compile_cmd_to_cmake	  sk    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%> 89L, -1,=,=+> ?,,0,=,=+> ?''+'8'8&9 :7: 8DnNS_R` a77CnIl^ \I<> >H~ E!*, ,H\ *c"aGGH #""s   H--
H;r   c                     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(r  z)
)r   ra  r  r	  rh  )rk   r  r   r  s       r   save_src_to_cmakeCppBuilder.save_src_to_cmakeC
  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   ra  r   r  r  r	  rh  )rk   r  r  r  asm_filer   r  s          r   save_kernel_asm_to_cmake#CppBuilder.save_kernel_asm_to_cmakeI
  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(r  zA)

            # Add libraries
            target_link_libraries(z)
         z#save_link_cmd_to_cmakefile expects z to already existr  )r7   ri  r  r  r  r  rh  r3   r6   rL   r  r	  )rk   r  lflagsr{  r  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  ri  r\  r  r  r]  rk  r^  r_  ra  r`  rf  rc  rp  rd  rb  r  r  rq  re  rh  r  )r   r   )r   r   r   r   r  staticmethodr   r   ro  rl  rm  rn  r   rv  rl   r  r  r  r  r  r  r  r  r   r   r   r   rE  rE  A  s     'uS#X ' '
 'c3h ' '
 'E#s(O ' '
 'U38_ ' ' XGXG tCyXG &	XG
 XG 
XGt,# ,\;c ;AT	ATF$$ww w 
	wrQC Q3 Q4 Q3 49 QU $  r   rE  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ml64rD   )r   r   r-  )ASM_CCs    r   get_asm_compiler.run_asm_build_object.<locals>.get_asm_compilerp
  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   r  .run_asm_build_object.<locals>.get_command_linez
  sC    ; HAcU(6(3C 
 HDT&2C
r   )r  r  r  r  )r   r   rp  )r  r  re  r  r  r  r   s          r   run_asm_build_objectr  o
  sh    c  3    F
$S)'/C
 C5c:;r   )rD   )T)r  )F)Tr   Fr   )FF)r=  rf   rV  	functoolsr  localeloggingr3   r2   r   rh  rQ   r9   r1   rn  r  r  rr  collections.abcr   r   r   ctypes.utilr   pathlibr   typingr   ra  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   r  r6   r
  __file___HEREr  r  r7   rI  r  	_IS_LINUXr  r   r   getpreferredencodingr  	getLoggerr   rM   	lru_cacher   rB   r8   cacher`   rb   r   r   r   r   r   r   r   r  r  r  r  r   r-  r/  r1  r*  r4  r6  r>  rK  rO  rX  rc  rm  rp  r   rv  r  r  r  r  r  r  r  r  r#  r%  r2  r4  r;  rM  r\  rj  rv  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r/  r1  rC  rE  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? " 	 	
 	< /sCx!// / 		/d 5# 5$ 5 5
 ?C ?D ? ? C# C$ C C c d  $ )S )T ) )X ' ' ' )$ ) ) 24 2 2 / / / +D + +    *?DI ?c ?t ?49 c Os Ot O	# 	$ 	6s 6 6 6.(c ( ( (
  u  u p S	 " "$s) "!S !T#Y !H# $s) tCy :5cDI1E+F & -2AA%)A
49d3i AH c * !#... . #	.
 . 49d3icDItCy$s)TRUYVW.b5!! 5!p49 2d3i 2c ((;(;(; (; 49d3icDI56	(;V6 eDItCy<P6Q ((3(3%)(3
49d3ic*+(3V
$s) 
0%S	49(<"= 02    tSy)  ( 
3 
# 
$ 
 
 ? ? ? ?<jUjU
49d3icDItCy$s)KLjUZ
U49d3i#78 
7;	#Y T#Y ZZZ Z 	Z
 Z Z  $Z 49d3icDItCy$s)TRUYVWZzC!j C!L7 Q   UC U3 U UQU UD ,# ,#* ,^UDI U$s) Up-$s) - -" nnn n 49d3icDItCy$s)TRUYVW	nbN@O N@b
38_0k k\<c <3 <S <T <r   