
    9j                       d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d dlZd dlmZ d dlm Z m!Z! d d	l"m#Z#m$Z$ d d
l%m&Z& d dl'm(Z(  e jR                         rd dl*m+Z+m,Z, d dl-m.Z.m/Z/m0Z0m1Z1 n$dededdfdZ.dededdfdZ/dededdfdZ0de2fdZ1dZ3ejh                  jk                  e6      Z7ejh                  jq                  ejh                  jq                  e7            Z9ejh                  ju                  e9d      Z;ej                  jy                  d      Z=ej                  jy                  d      Z>ej                  dk(  Z?dZ@e?r ej                         fndZB ej                  eD      ZE ej                  d      deGdeGfd       ZHdeGfdZIej                  d eGddfd!       ZK G d" d#      ZLej                  d eGddfd$       ZMej                  d eGdeGfd%       ZNdeGfd&ZOd'e2dePeGeGf   fd(ZQd)eGd*eGd+eGd,eGdeGf
d-ZR	 dd.eSePeGeGf      d/eGd0eGdeGfd1ZTej                  d0eGde2fd2       ZUej                  d0eGde2fd3       ZVej                  d0eGde2fd4       ZWej                  d0eGde2fd5       ZXej                  d0eGde2fd6       ZYej                  de2fd7       ZZej                  de2fd8       Z[ej                  de2fd9       Z\ej                  de2fd:       Z]ej                  de2fd;       Z^ej                  d eGdeGfd<       Z_d=eSeG   d>eSeG   ddfd?Z`d@eSeG   deSeG   fdAZadBeGddfdCZbdBeGddfdDZcdEeGdFeGddfdGZddEeGdFeGddfdHZedIeGdeGfdJZf G dK dL      ZgddMe2deSeG   fdNZhddOeGdeSeG   fdPZid0eGdeSeG   fdQZjd0eGdeSeG   fdRZkdeSeG   fdSZldePeSeG   eSeG   f   fdTZm	 dd0eGdUe2dePeSeG   eSeG   f   fdVZndWe2deSeG   fdXZo	 	 	 dd0eGdWe2dMe2dYeeG   dUe2dePeSeG   eSeG   eSeG   eSeG   eSeG   eSeG   eSeG   f   fdZZp G d[ d\eg      ZqdeSeG   fd]ZrdeSeG   fd^ZsdeSeG   fd_Ztd0eGd`e2d'e2dePeSeG   eSeG   eSeG   eSeG   f   fdaZudbe$dePeSeG   eSeG   f   fdcZvdde2d`e2dePeSeG   eSeG   eSeG   f   fdeZwdeSeG   fdfZxdePeSeG   eSeG   f   fdgZyej                  de2fdh       Zzej                  dePe2eGf   fdi       Z{ej                  d0eGdjeGddfdk       Z|ej                  d0eGddfdl       Z}d0eGdePeSeG   eSeG   eSeG   eSeG   eSeG   eSeG   f   fdmZ~dePeSeG   eSeG   f   fdnZdoe2dpe2deSeG   fdqZdeSeG   fdrZd0eGdbe$dde2d`e2d'e2doe2dpe2dePeSeG   eSeG   eSeG   eSeG   eSeG   eSeG   eSeG   f   fdsZ G dt dueq      ZddvZ ej                  dw      dxeGdedz  fdy       ZdzeGd{eGd|eGddfd}Zd~Zd/eGdeGdz  fdZdeSeG   deSeG   fdZdeSeG   ddfdZ	 	 ddeGd`e2de2dePeSeG   eSeG   eSeG   eSeG   eSeG   eSeG   eSeG   f   fdZ G d de      ZdeGdePeGeGf   fdZ G d d      ZdeGdeGdFeGddfdZy)    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                       y N r   r   s     [/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/_inductor/cpp_builder.pyr   r   /           c                       y r   r   r   s     r   r   r   2   r   r   c                       y r   r   r   s     r   r   r   5   r   r   c                       y)NFr   r   r   r   r   r   8   s    r   CxxBuildz_inductor/script.ldlinuxdarwinwin32zx86_64-w64-mingw32-g++r      searchc                    ddl m}m} | D ]  }	 |tt        j                  dk7  rt        j                  d      s0ddlm}  |       } |t
        j                  j                  |d      |      }|5  t               }d d d        t        j                  |dg       |c S  t"        j$                  # 1 sw Y   5xY w# t        j                  t        t         f$ r Y w xY w)	Nr   )get_lock_dirLOCK_TIMEOUTr$   TORCH_INDUCTOR_INSTALL_GXX)FileLockzg++.lock)timeout	--version)torch._inductor.codecacher*   r+   sysplatformosgetenvtorch.utils._filelockr-   pathjoininstall_gcc_via_conda
subprocesscheck_outputSubprocessErrorFileNotFoundErrorImportErrorr   InvalidCxxCompiler)r(   r*   r+   cxxr-   lock_dirlocks          r   cpp_compiler_searchrB   O   s    D 	{ <<7*yy!=>:'>GGLL:6  2/1C2##S+$67J', 
 
  2 2 **,={K 		s3   B=B=7B=2B1= B=1B:	6B==CCc            
         t         j                  j                  t               d      } t         j                  j                  | dd      }t         j                  j	                  |      s~t
        j                  d       t         j                  j                  dd      }|t        j                  d      }|0t        j                  |dd|  d	d
dddgt        j                         |S )z>On older systems, this is a quick way to get a modern compilergcc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                     	 t        j                  | dgt         j                         y# t        $ r}t	        d|  d      |d}~wt         j
                  $ r Y yw xY w)zU
    Check if compiler is ready, in case end user not activate MSVC environment.
    /help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                   8    e Zd ZdeddfdZddZddZdefdZy)	WinPeFileVersionInfo	file_pathr   Nc                     || _         t        j                  d      | _        | j	                          | j                          y )Nzversion.dll)rc   ctypesWinDLLversion_dll_setup_functions_get_version_info)selfrc   s     r   __init__zWinPeFileVersionInfo.__init__   s2    "!==7 r   c                    t         j                  t         j                  g| j                  j                  _        t         j                  | j                  j                  _        t         j                  t         j                  t         j                  t         j                  g| j                  j                  _        t         j                  | j                  j                  _        t         j                  t         j                  t        j                  t        j                        t        j                  t         j                        g| j                  j                   _        t         j                  | j                  j                   _        y r   )r   LPCWSTRLPDWORDrg   GetFileVersionInfoSizeWargtypesDWORDrestypeLPVOIDGetFileVersionInfoWBOOLLPCVOIDre   POINTERc_void_pUINTVerQueryValueWrj   s    r   rh   z%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                    t        j                         }| j                  j                  | j                  t        j                  |            }|dk(  rt        d| j                   d      t        j                  |      | _	        | j                  j                  | j                  d|| j                        }|st        d| j                   d      y )Nr   zCan't get version info size of .zCan't get version info of )r   rq   rg   ro   rc   re   byrefr_   create_string_bufferversion_infort   )rj   dummysizesuccesss       r   ri   z&WinPeFileVersionInfo._get_version_info   s     77NNFLL/
 19!@@PPQRSS"77=""66NNAtT%6%6
 !;DNN;K1MNN r   c                 d   t        j                         }t        j                         }| j                  j                  | j                  dt        j                  |      t        j                  |            }|r|j                  dk(  ryg }d}|j                  t        |j                  dz        D ]o  }|dz  }t        j                  |j                  |z   d      }t        j                  |d d d      }t        j                  |dd d      }	|j                  ||	f       q |S t        d       |S )Nz\VarFileInfo\Translationr         littlezBuffer is None)re   rx   r   ry   rg   rz   r   r~   valuerange	string_atint
from_bytesappendprint)
rj   	lp_bufferu_lenr   translationslang_idioffsetdata	code_pages
             r   get_language_idz$WinPeFileVersionInfo.get_language_id   s   OO%	""11'LL#LL	
 %++*??&5;;!+, :Q''	&(@!D..bq8<NN4!9h?	##Wi$89:  "#r   r   N)	__name__
__module____qualname__strrk   rh   ri   r   r   r   r   r   rb   rb      s-    !# !$ !@.O" r   rb   c                    dt         t        t        f   fd}t        |       syt        j
                  j                  |       r| }n |       \  }}|du ryt        |      }|j                         }|dk7  rt        d      y)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            	         t         j                  j                  t         j                  j	                  dd      ddd      } t         j                  j                  |       s`t         j                  j                  t         j                  j	                  dd      ddd      } t         j                  j                  |       sy	 | d	d
ddddddg	}t        j                  |dd      j                         }|syt         j                  j                  |ddd      }t         j                  j                  |      syt        j                  |      D cg c]A  }t         j                  j                  t         j                  j                  ||            r|C }}|syt        |d      d   }t         j                  j                  ||dddd      }t         j                  j                  |      rd|fS t         j                  j                  ||dddd      }t         j                  j                  |      rd|fS 	 yc c}w # t        j                  t        f$ r Y yw xY w)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_pathz3check_msvc_cl_language_id.<locals>.get_msvc_cl_path   s!    ww||JJNN.0IJ%	
 ww~~l+77<<

~/BC)	L 77>>,/ <	 C"
C )55$eg  #  !ggll?D'6RO77>>/2 
 O4 77==oq!AB    
 $ %+,<d%KA%N" ggll&G ww~~g&W}$ '',,#* 77>>'*=( + I B --/@A 		s@   3H> 5AH> 7H> AH9H> AH> 0AH> 9H> >II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                    	 t        j                  | dgt         j                  d      }d}|j                         D ]8  }d	|v s|j                  d
d      d   j                         j                         }: |t	        d|  d|  d      |dvrt	        d|  d|       |S # t        $ r}t	        d|  d      |d}~wt
        $ r}t	        d|  d      |d}~ww xY w)zS
    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+B;;CCCc                     t         j                  j                  dk(  r@t        j                  dk7  r-t
        } t         j                  j                  st        |        | S t        rCt        j                  j                  dd      } t        |       } t        |        t        |        | S t        j                         rt         j"                  S t%        t         j&                  j(                  t*        t,        f      r$t-        t         j&                  j(                        }nt         j&                  j(                  f}t/        |      } | S )N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6::>>*Fjjnn&F&v.Or   use_relative_pathc                     t         rt        d      t        j                         r6t        j
                  }| rt        j                  nt        j                  }||fS d}d}||fS )NzWindows is not supported yet.ldobjcopy)r   r_   r
   r   r   r   objcopy_fallbackr   )r   r   r   s      r   get_ld_and_objcopyr     sf    :;;B % ,, ((  w; BGw;r   
cubin_filekernel_namer   r   c                    | dz   }| d| d|  }t        j                  |j                         ddd       | d| }t        j                  |j                         ddd       t        j                  dd|       }|d	| d
| dz   d| d| dz   d| d| dz   |z   }t        j                  |j                         ddd       |S )N.oz  -r -b binary -z noexecstack -o  Tcapture_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                    t         j                  j                  |d      }t         j                  j                  |d      }t        |d      5 }|j	                  d       | D ]s  \  }}t         j                  j                  |      }|j                  dd      j                  dd      }	|j	                  d	| d
| d| d|	 d| d| d| d| d| d       u 	 ddd       t        j                  |d|d|gddd       |S # 1 sw Y   )xY w)aq  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	    s7   ( 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
D  D	c                 x    t        j                  | dg      j                  d      }d|j                         d   v 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                    t         j                  dk(  rt        |       S t        r@t	        j
                  d|       rt        d      t        t	        j
                  d|             S t        t	        j
                  d|             S )Nr%   z((clang$)|(clang\+\+$))z]Please use clang-cl, due to torch.compile only support MSVC-like CLI (compiler flags syntax).z
(clang-cl)z(clang|clang\+\+))r1   r2   r  r   r   r(   r_   r   r   s    r   	_is_clangr    sl     ||x|,,	99/>o  BIIm\:;;		.=>>r   c                 X    t        |       ryt        t        j                  d|             S )NFz(gcc|g\+\+|gnu-c\+\+))r  r   r   r(   r  s    r   _is_gccr    s&     		2LABBr   c                     t         sy	  t        j                  | dgt        j                        j	                         j
                  t         }d|j                         d   v S # t        $ r Y yw xY w)NFrY   rZ   	Microsoftr   )	r   r9   r:   r^   r   r  SUBPROCESS_DECODE_ARGSr   r<   )r   
output_msgs     r   r   r     sr    J##\7$;JDUDUVUWV+- 	
 j335a888 s   AA$ $	A0/A0c                    dt         dd fd}	  t        j                  | dgt        j                        j	                         j
                  t         }d|j                         d   v }|rat        r!t        j                  d|       rt        d	      t        j                  d
|      }|"|j                  d      } |t        |             |S # t        $ r Y yt        j                  $ r Y yw xY w)Ncompiler_versionr   c                 R    t         rdnd}| t        |      k  rt        d| d      y)zw
        On Windows: early version icx has `-print-file-name` issue, and can't preload correctly for inductor.
        z2024.2.1z0.0.0z0Intel Compiler error: less than minimal version r}   N)r   r   r_   )r  min_versions     r   _check_minimal_versionz2_is_intel_compiler.<locals>._check_minimal_version  s8     %0jWl;77B;-qQ  8r   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     $ J##{+J4F4F UWV+	- 	 $z'<'<'>q'AA992LA&u 
  YY'A:NN)(..q1&|G'<=   %% s   B?C 	C.C.-C.c                  (    t        t                     S r   )r  r   r   r   r   is_gccr&  G  s    #%&&r   c                  (    t        t                     S r   )r  r   r   r   r   is_clangr(  L  s    %'((r   c                  (    t        t                     S r   )r$  r   r   r   r   r!  r!  Q  s    .011r   c                  (    t        t                     S r   )r  r   r   r   r   is_apple_clangr+  V  s    +-..r   c                  (    t        t                     S r   )r   r   r   r   r   
is_msvc_clr-  [  s    ')**r   c                    t         j                  j                         }d|d<   	  t        j                  | dgt        j
                  |      j                  t         }|j                  dd      }|j                  d	d      }|S # t        $ rN 	  t        j                  | dgt        j
                  |      j                  t         }n# t        $ r Y Y yw xY wY |w xY w)
NCLC_ALLr   )r[   envr/   r   r   
)
r3   rO   copyr9   r:   r^   r  r  r   r  )rW   r1  r  s      r   get_compiler_version_infor5  `  s    
**//
CCM
00tZ%6%6C

&(* $++D#6N#++D#6N  	Z44;'
0A0Asf,.N  		 s5   9B 	C9CC	CCCCC	dest_listsrc_listc                 4    | j                  d |D               y )Nc              3   F   K   | ]  }t        j                  |        y wr   r4  deepcopy).0items     r   	<genexpr>z_append_list.<locals>.<genexpr>w  s     >TT]]4(>   !)extend)r6  r7  s     r   _append_listrA  v  s    >X>>r   	orig_listc                 D    g }| D ]  }||vs|j                  |        |S r   )r   )rB  new_listr=  s      r   _remove_duplication_in_listrE  z  s1    H "xOOD!" Or   path_dirc                    t         j                  j                  |       s	 t        |       j	                  dd       y y # t
        $ r6}|j                  t        j                  k7  rt        d|        |Y d }~y d }~ww xY w)NT)parentsexist_okzFail to create path )	r3   r6   rL   r   mkdirOSErrorerrnoEEXISTr_   )rF  r   s     r   _create_if_dir_not_existrN    sr    77>>(#	ON   = $  	OyyELL("%9(#DE3N )	Os   ? 	A>,A99A>c                    t         j                  j                  |       rt        j                  | d      D ]~  \  }}}|D ]7  }t         j                  j	                  ||      }t        j
                  |       9 |D ]7  }t         j                  j	                  ||      }t        j                  |       9  t        j                  |        y y )NF)topdown)r3   r6   rL   walkr7   removermdir)rF  rootdirsfilesnamerc   dir_paths          r   _remove_dirrY    s    	ww~~h!#5!A 	#D$ %GGLLt4			)$%  #77<<d3"#		# 	  r   cmd_linecwdc                    t        j                  |       }	 t        j                  ||dt        j                  t        j
                         y # t        j                  $ r_} |j                  j                  t         }d|v xs d|v }|rt        j                  dk(  rd}||z  }t        j                  ||      |d }~ww xY w)NT)r[  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)rZ  r[  r   r   outputopenmp_probleminstructions          r   _run_compile_cmdrc    s    
++h
C6SZ__ZEVEV	
 (( 6 "891V;Qx6?Qcllh62  k!F!!#v.A56s   6A C !AB;;C c                 \    t        d      5  t        | |       d d d        y # 1 sw Y   y xY w)Ncompile_file)r	   rc  )rZ  r[  s     r   run_compile_cmdrf    s)    	n	% (3'( ( (s   "+	orig_pathc                 R    t         r | j                  t        j                  d      S | S )N/)r   r  r3   sep)rg  s    r   r   r     s"      --r   c                      e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 d$dedee   dz  dee   dz  dee   dz  dee   dz  dee   dz  d	ee   dz  d
ee   dz  dedededededdfdZd%dZd%dZ	d%dZ
defdZdee   fdZdee   fdZdee   fdZdee   fdZdee   fdZdee   fdZdee   fdZdefdZdefdZdefdZdefd Zdefd!Zd"eddfd#Zy)&BuildOptionsBasez
    This is the Base class for store cxx build options, as a template.
    Actually, to build a cxx shared library. We just need to select a compiler
    and maintains the suitable args.
    NrW   definitionsinclude_dirscflagsldflagslibraries_dirs	librariespassthrough_argsaot_moder   compile_onlyprecompilingpreprocessingr   c                     || _         |xs g | _        |xs g | _        |xs g | _        |xs g | _        |xs g | _        |xs g | _        |xs g | _        d | _        |	| _	        |
| _
        || _        || _        || _        y r   )	_compiler_definitions_include_dirs_cflags_ldflags_libraries_dirs
_libraries_passthrough_argsprecompiled_header	_aot_mode_use_relative_path_compile_only_precompiling_preprocessing)rj   rW   rm  rn  ro  rp  rq  rr  rs  rt  r   ru  rv  rw  s                 r   rk   zBuildOptionsBase.__init__  s      "'2'8b(4(:"(,B#*=b*8*>B%._",<,B /3'(9#/#/$1r   c                 x    | j                   s| j                  s| j                  rg | _        g | _        g | _        y y r   )r  r  r  r~  r  r}  r{   s    r   _process_compile_only_optionsz.BuildOptionsBase._process_compile_only_options  s7    !3!3t7J7J#%D  DODM 8Kr   c                 p   t        | j                        | _        t        | j                        | _        t        | j                        | _        t        | j                        | _        t        | j
                        | _        t        | j                        | _        t        | j                        | _        y r   )rE  rz  r{  r|  r}  r~  r  r  r{   s    r   _remove_duplicate_optionsz*BuildOptionsBase._remove_duplicate_options  s~    78I8IJ89K9KL24<<@3DMMB:4;O;OP5dooF!<T=S=S!Tr   c                 D    | j                          | j                          y r   )r  r  r{   s    r   _finalize_optionsz"BuildOptionsBase._finalize_options  s    **,&&(r   c                     | j                   S r   )ry  r{   s    r   get_compilerzBuildOptionsBase.get_compiler      ~~r   c                     | j                   S r   )rz  r{   s    r   get_definitionsz BuildOptionsBase.get_definitions  s       r   c                     | j                   S r   )r{  r{   s    r   get_include_dirsz!BuildOptionsBase.get_include_dirs      !!!r   c                     | j                   S r   )r|  r{   s    r   
get_cflagszBuildOptionsBase.get_cflags   s    ||r   c                     | j                   S r   )r}  r{   s    r   get_ldflagszBuildOptionsBase.get_ldflags  s    }}r   c                     | j                   S r   )r~  r{   s    r   get_libraries_dirsz#BuildOptionsBase.get_libraries_dirs  s    ###r   c                     | j                   S r   )r  r{   s    r   get_librarieszBuildOptionsBase.get_libraries	  s    r   c                     | j                   S r   )r  r{   s    r   get_passthrough_argsz%BuildOptionsBase.get_passthrough_args  s    %%%r   c                     | j                   S r   )r  r{   s    r   get_aot_modezBuildOptionsBase.get_aot_mode  r  r   c                     | j                   S r   )r  r{   s    r   get_use_relative_pathz&BuildOptionsBase.get_use_relative_path  s    &&&r   c                     | j                   S r   )r  r{   s    r   get_compile_onlyz!BuildOptionsBase.get_compile_only  r  r   c                     | j                   S r   )r  r{   s    r   get_precompilingz!BuildOptionsBase.get_precompiling  r  r   c                     | j                   S r   )r  r{   s    r   get_preprocessingz"BuildOptionsBase.get_preprocessing  s    """r   filec                    | j                         | j                         | j                         | j                         | j	                         | j                         | j                         | j                         | j                         | j                         | j                         d}t        |d      5 }t        j                  ||       d d d        y # 1 sw Y   y xY w)N)rW   rm  rn  ro  rp  rq  rr  rs  rt  r   ru  r   )r  r  r  r  r  r  r  r  r  r  r  r   jsondump)rj   r  attrsr  s       r   save_flags_to_jsonz#BuildOptionsBase.save_flags_to_json  s    ))+//1 113oo''')"557++- $ 9 9 ;))+!%!;!;!= 113
 $_ 	 IIeQ	  	  	 s   5CC)r   NNNNNNNFFFFFr   )r   r   r   __doc__r   r   r   rk   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   rl  rl    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   rl  warning_allc                      t         s| rdgS g S g S )NWallr   )r  s    r   _get_warning_all_cflagr  1  s    &x.B.	r   std_numc                 ,    t         r		 d} d|  gS d|  gS )Nc++20zstd:zstd=r  )r  s    r   _get_cpp_std_cflagr  8  s1    	 wi !!wi !!r   c                     t         rg d}|S ddg}t        |       r/t        j                  j                  rdnd}|j                  |       t        |       r|j                  d       |S )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   ro  ignored_optimization_arguments      r   _get_os_related_cpp_cflagsr  G  sp    
> M ()>?\" &&JJ 78 *
 MM78<  MM*%Mr   c                 8    g }t         r|j                  d       |S )NNOMINMAXr   r   )r   os_definitionss     r   _get_os_related_cpp_definitionsr  k  s      "N 	j)r   c                  (   t         rg } | S g d} | j                  d       t        j                  j                  s| j                  d       | j                  dt        j                  j
                          t               r| j                  d       | S )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  sv    0 L!
 	+,zz55LL89}VZZ%S%S$TUV8LL12Lr   c                  X    g } g }t         rddg} g d}| |fS | j                  d       | |fS )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  )ro  rp  s     r   !_get_inductor_debug_symbol_cflagsr    sD     FG!C 7? 	c7?r   min_optimizec                    g }g }t         j                  j                  xs# t        j                  j                  dd      dk(   }t         j                  j                  xsd t         j                  j                  xsH t        j                  j                  dd      dk(  xs# t        j                  j                  dd      dk(  }|r5t        r||rdndgz  }n8||rt         j                  j                  nddgz  }nt        r|g d	z  }n|d
gz  }|rt               \  }}||z  }||z  }t         j                  j                  r)t        r|j                  d       n|j                  d       |t               z  }t        r	 ||fS t        j                  dk7  rt        |       r|j                  d       t        j                          st        j"                         dk(  r|j                  d       nct        j"                         dk(  r|j                  d       n:t        j"                         dk(  r|j                  d       n|j                  d       t         j                  j$                  rt'        |       r|j                  d       ||fS )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  ro  rp  should_use_optimized_flagsshould_add_debug_symbol_flagsdebug_cflagsdebug_ldflagss           r   _get_optimization_cflagsr    s8    FG 	)) 	E::>>7=D"
 	)) 	D,,	D::>>7=D	D ::>>6<C	 " "|t66FAM##==SW F
 **FtfF$&G&I#m,= //MM% MM23
#%%F* 7?' <<8#|$78 ##%##%2MM-0%%'94MM.1%%'94MM.1MM.1))i.EMM+&7?r   do_linkc                     t         r	 ddgS t        j                         dk(  rdt               v rg dS g }| r|j	                  d       |j	                  d       |S )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                 R   g }g }g }g }g }	g }
g }t        | |      \  }}|t        |      z   t        |      z   t               z   t	        |       z   }|t        |       z  }t        sGt        j                  j                  r-t        |       r"|j                  d       |j                  d       |j                  dj                  |             t        j                  j                  dk(  r6|j                  ddg       t        t               dk(  r|j                  d       |||||z   |	|
|fS )	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   r@  r   r   )r   r  r  r   r  rm  rn  ro  rp  rq  rr  rs  
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}%{#CHH[1200I=!46F GH#I.'9##$MN 	+ r   c                   `     e Zd ZdZ	 	 	 	 	 	 	 	 ddededee   dedededed	ed
df fdZ xZS )
CppOptionsaH  
    This class is inherited from BuildOptionsBase, and as cxx build options.
    This option need contains basic cxx build option, which contains:
    1. OS related args.
    2. Toolchains related args.
    3. Cxx standard related args.
    Note:
    1. This Options is good for assist modules build, such as x86_isa_help.
    ru  r  r   r   rW   r  rv  rw  r   Nc	                    t         |   ||||       |r|n	t               | _        t	        | j                  |xs |xs | |||      \  }	}
}}}}}t        | j                  |	       t        | j                  |
       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       | j                          y )N)ru  r   rv  rw  )r   r  r   r  r  )superrk   r   ry  r  rA  rz  r{  r|  r}  r~  r  r  r  )rj   ru  r  r   r   rW   r  rv  rw  rm  rn  ro  rp  rq  rr  rs  	__class__s                   r   rk   zCppOptions.__init__5  s     	%/%'	 	 	
 &.3C3E %FFG##%
	
 	T&&4T''6T\\6*T]]G,T))>:T__i0T++-=> r   )FTr   Fr   FFF)	r   r   r   r  r   r   r   rk   __classcell__r
  s   @r   r  r  *  s     # %'"'""#*!*! *! c]	*!
  *! *! *! *! *! 
*! *!r   r  c                  P    ddg} t         j                  r| j                  d       | S )NTORCH_INDUCTOR_CPP_WRAPPERSTANDALONE_TORCH_HEADER!TORCH_INDUCTOR_PRECOMPILE_HEADERS)r
   cpp_cache_precompile_headersr   )defss    r   !_get_torch_cpp_wrapper_definitionr  b  s(    (*CDD**78Kr   c                      dgS )Nz" C10_USING_CUSTOM_GENERATED_MACROSr   r   r   r   _use_custom_generated_macrosr  i  s    011r   c                      t         s:t        j                         r$g d} t        j                         dk(  r| ddgz  } | S g S g S )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  sT    "
 !X-"/2' " &%I	r   rt  c                 8   g }g }g }g }t         r||||fS t        j                         r|j                  d       |j                  t        j
                         |j                  t        j                         |j                  t        j                         |j                  t        j                         |j                  t        j                         |j                  t        j                         |j                  t        j                         |j                  t        j                         |j                  t        j                         |j                  d       |r	|st        }n#t        j                   j#                  t              }t%        |       rz|j                  d       |j                  dt        j&                  z          |j                  d       |j                  d|        |j                  dt        j&                  z          ||||fS )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   rt  r   ro  rn  rs  rp  linker_scripts           r   _setup_standard_sys_libsr.    s   
 F L"$G|%5w>>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<!17::r   vec_isac                 
   g }g }| t         k7  rs|j                  d | j                         D               | j                         g}t	        j
                         r(t        |       j                         }d| d| d| dg}||fS )Nc              3   F   K   | ]  }t        j                  |        y wr   r:  )r<  xs     r   r>  z0_get_build_args_of_chosen_isa.<locals>.<genexpr>  s     F1dmmA&Fr?  zCPU_CAPABILITY=CPU_CAPABILITY_HAVE__CPU_DEFINITION)r   r@  build_macrobuild_arch_flagsr
   r   r   upper)r/  macrosbuild_flagscaps       r   _get_build_args_of_chosen_isar<    s    FK/!F0C0C0EFF//12g,$$&C!#'!#'uO,F ;r   include_pytorchc                 <   ddl m}m} g } |       }t        j                  j
                  rh|g}t        j                  dk7  rt        j                         s|j                  ddg       t        r|j                  d       |s|j                  d       ng }t        j                  j                  dk(  rht        j                  j                  }|sJ d	       t        |t              r|j                  |       n#t        |t               sJ |j                  |       t        j                  j                  dk(  rJt        j                  j"                  sJ d
       |j                  t        j                  j"                         t        r|j                  d       |||fS )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   r@  r   r   r   aoti_shim_libraryr   r   r   aoti_shim_library_path)r=  rt  r?  r@  rr  rn  rq  rH  s           r   _get_torch_related_argsrJ    s`    HI ?L((()<<8#F,<,<,>g{34  '  044	A & 3 3 E E$ p$ +S1  !23!"3T:::  !2300I=""99 	
 <
 	
9 	f11HHI!22r   c                     t        t        j                  d            } | j                         s\t	        j
                         dk(  rEt        t        j                  d            }|j                  j                  dz  j                         } | dz  j                         s!t        j                  dt        |               t        |       gS )Nr  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                     t               } t        j                  dt        rdnd      }|| j	                  |       t        rFt        t        t        j                  dd            j                  dz  j                               g}nt        j                  d      g}t        j                         r| j	                  t        j                         | |fS )Nr  ntposix_prefix)schemelibsLIBDIR)rV  rN  rO  r   r   r   r   rP  rQ  get_config_varr
   r   r   r#  )python_include_dirspython_include_pathpython_lib_paths      r   _get_python_related_argsra    s    24#,,+$> &""#67++IdCDKKfT(*
 %33H=>"";#=#=>//r   c                      	 d} t        j                  | j                               j                  d      }t	        t        j                  |            dkD  S # t         j                  t        f$ r Y yw xY w)Nzconda list llvm-openmp --jsonr  r   F)	r9   r:   r   r  lenr  loadsr;   r<   )commandr`  s     r   is_conda_llvm_openmp_installedrf    sd    1((9@@H4::f%&**&&(9: s   AA A32A3c                     	 t        j                  d      yt        j                  g d      j	                  d      j                         } t        j                  j                  |       }|| fS # t        j                  $ r Y yw xY w)Nbrewr   )rh  z--prefixr]  r  )
rQ   rR   r9   r:   r  r   r3   r6   rL   r;   )libomp_pathomp_availables     r   homebrew_libomprk    sv    <<'
 ##$BCVF^UW 	 {3k))%% s   A/ AA/ /BBomp_namec                 p   	 t        j                  | dg      j                  d      }t        j                  j                  |j                         |      }t        j                  j                  |      r)dt        j                  d<   t        j                  |       y y # t         j                  $ r Y y w xY w)Nz-print-file-name=binr  TRUEKMP_DUPLICATE_LIB_OK)r9   r:   r  r3   r6   r7   rstripisfilerO   r   LoadLibraryr;   )r   rl  r`  omp_paths       r   perload_clang_libomp_winrt  0  s    	((,8N)OPWW
 77<<:77>>(#17BJJ-.X& $ %% s   BB B54B5c                 Z    dt         dt         dt        fd}	 g d}|D ]  } || |        y )Nr   lib_namer   c                 `   	  t        j                  | d| gt         j                        j                  t         }|j                         }t        j                  j                  |      r)dt        j                  d<   t        j                  |       y	 y# t         j                  $ r Y yw xY w)Nz-print-file-name=rZ   rn  ro  TF)r9   r:   r  r  r  rp  r3   r6   rq  rO   r   rr  r;   )r   rv  r`  rs  s       r   _load_icx_built_in_lib_by_namez>perload_icx_libomp_win.<locals>._load_icx_built_in_lib_by_name@  s    	Z,,!28*=>!)) f,.F }}Hww~~h'5;

12  * (  )) 		s   BB B-,B-)zlibiomp5md.dllzsvml_dispmd.dllz
libmmd.dll)r   r   )r   rx  preload_listrv  s       r   perload_icx_libomp_winrz  >  sC    S C D L ! ?&|X>?r   c                    g }g }g }g }g }g }t         j                  j                  dk(  r||||||fS t        r{|j	                  d       |j	                  d       t        |        }t        j                  d      }|t        j                  j                  |dd      }	t        j                  j                  |	      }
|
r_|j	                  t        j                  j                  |d             |j	                  t        j                  j                  |d             nt        j                  d       |xs |
}|s|j	                  d	       t        j                  d
      }|s|t               }|rt        j                  j                  |d      }|j	                  t        j                  j                  |d             |j	                  |       t        j                         j                  dk(  rNt        j                  j                  t        j                  j                  |d            r|j	                  d       |st!               \  }}|r|j	                  t        j                  j                  |d             |j	                  t        j                  j                  |d             nt"        r	 t%        |       r0|j	                  d       |j	                  d       t'        | d       n\t)        |       r/|j	                  d       |j	                  d       t+        |        n"|j	                  d       |j	                  d       nt        j,                         r~|j	                  t.        j0                         |j	                  d       |j	                  t        j                  j3                  t.        j4                               |j	                  d	       nmt%        |       r#|j	                  d       |j	                  d       n?t)        |       r|j	                  d       n"|j	                  d       |j	                  d       ||||||fS )Nr   Xclangfopenmp
OMP_PREFIXr  zomp.hlibz-environment variable `OMP_PREFIX` is invalid.ompCONDA_PREFIXr  zlibiomp5.dylibiomp5openmpr]  z
libomp.dllQiopenmp
libiomp5mdzopenmp:experimentalz-Wp,-fopenmpgompfiopenmp)r
   r   r   	_IS_MACOSr   r  r3   r4   r6   r7   rL   rR  rS  rf  unamer  rk  r   r  rt  r$  rz  r   r   r"  dirnameopenmp_lib_so)r   ro  rp  include_dir_pathslib_dir_pathsr[  rs  rj  
omp_prefixheader_path	valid_envconda_prefixconda_lib_pathri  s                 r   _get_openmp_argsr  ]  sB    FG#%!MD"$00I=w 1=$HXXXhi  ,L99 YY|,
!'',,z9gFK{3I!((j))LM$$RWW\\*e%DEMN)6YMKK yy0!9:<M!#lE!B!((lI)NO$$^488:%%1bggnnGGLL1AB7 KK( )8):&M;!((k9)MN$$RWW\\+u%EF 
	 \"MM(#KK!$\<@-MM*%KK%"<0
 MM(#MM/0$$[%?%?@##N3  1J1J!KLKK&i(F##L1j)i(F#7-}dDTTTr   c                      g } g }t        j                         r't        j                  d      g} |j	                  d       | |fS )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    sD      "MD"11(;<H$r   use_mmap_weightsuse_mmap_weights_externalc                 x    g }| r|rt        d      | r|j                  d       |S |r|j                  d       |S )NzIOnly one of use_mmap_weights and use_mmap_weights_external should be truez USE_MMAP_SELFz USE_MMAP_EXTERNAL)r_   r   )r  r  r9  s      r   get_mmap_self_macror    sO     F5W
 	
 &' M 
#*+Mr   c                  d    ddl m}  g }| j                  j                  r|j	                  d       |S )Nr   )r
   z# AOT_INDUCTOR_USE_CACHING_ALLOCATOR)torch._inductorr
   r   weight_use_caching_allocatorr   )r
   r9  s     r   get_caching_allocator_macror    s+    &F77;<Mr   c                    g }g }g }	g }
g }g }g }t               }t               }t        | ||      \  }}}}t        |      \  }}t	        ||      \  }}}t               \  }}t        |       \  }}}}}} t               }!t        ||      }"t               }#||z   |z   |!z   |"z   |#z   }||z   |z   |z   }||z   }	||z   }
||z   |z   }||z   }||z   | z   }|||	|
|||fS )a3  
    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=  rt  )
r  r  r.  r<  rJ  ra  r  r  r  r  )$r   r/  r=  rt  r   r  r  rm  rn  ro  rp  rq  rr  rs  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+ 	!x9JK! +H*P'J' 	 (S	 2J1K.. 	& !8 9*+;=VW:< 	&
1	2
	 $	$ 		
 #	#  	
	
	  	   z)F,G*-AADUUN')I!$;;>RR 
 	 r   c                        e Zd ZdZedddddddddddddfdededed	ed
edededededee   dededededdf fdZ	 xZ
S )CppTorchOptionsaf  
    This class is inherited from CppTorchOptions, which automatic contains
    base cxx build options. And then it will maintains torch related build
    args.
    1. Torch include_directories, libraries, libraries_directories.
    2. Python include_directories, libraries, libraries_directories.
    3. OpenMP related.
    4. Torch MACROs.
    5. MISC
    FTr   r   r/  r=  r  rt  ru  r   r  r  r  r   rW   r  rv  rw  r   Nc           
         t         |   |||
|||||       || _        t        | j                  ||||||      \  }}}}}}}t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       | j                          y )N)ru  r  r   r   rW   r  rv  rw  )r   r/  r=  rt  r   r  r  )r	  rk   r  r  ry  rA  rz  r{  r|  r}  r~  r  r  r  )rj   r/  r=  r  rt  ru  r   r  r  r  r   rW   r  rv  rw  torch_definitionsr  torch_cflagstorch_ldflagsr  r  torch_passthrough_argsr
  s                         r   rk   z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   rk   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                      t        j                         rct        j                  j                  Hdt
        j                  vr5dt
        j                  vr"t        j                  t
        j                  d<   y y y y y )N	CUDA_HOME	CUDA_PATH)	r
   r   rA  versionhipr3   rO   r   sdk_homer   r   r   _set_gpu_runtime_envr    s^    MM%rzz)rzz)"-"6"6

; * * & 	r      r6   c                     t        t        |       j                  d            }|r|d   j                         j                  S d|  }t
        j                  |       y )Nzlibcudart_static.ar   z%"libcudart_static.a" not found under )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           	      `   t         j                  j                  |       }t        |d      5 }t	        j
                  dd| g|t        j                  d       ddd       t	        j
                  dd|d	|d
|gt        j                  d       t        j                  d||       y# 1 sw Y   NxY w)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   r+  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/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         j                  j                  | d      }t         j                  j                  |      ryd}d}	 t         j                  j                  | d      }t         j                  j                  | d      }t	        |d      5 }|j                  t               ddd       t        j                  dd	      }t        j                  |d
|d|gt        j                  d       t        j                  dd      }t        j                  |d||gt        j                  d       t        j                  d|       	 ||fD ]:  }|st         j                  j                  |      s&t        j                  |       < y# 1 sw Y   xY w# t        t        j                   f$ r t        j#                  dd       t         j                  j                  |      rt        j                  |       Y ||fD ]:  }|st         j                  j                  |      s&t        j                  |       < yw xY w# ||fD ]:  }|st         j                  j                  |      s&t        j                  |       < w xY w)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   rR  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@ H% 	ARWW^^A&		!	5	+ 	+" z<<= 5 	 	
 77>>)$IIi H% 	ARWW^^A&		!	 H% 	ARWW^^A&		!	sK   AF F
(BF 
FF A$H>:I =H>>I 
JJ,Jrq  c                    ddl }t        j                  j                  d      }|st        j                  d       g S | D ]Y  }t        j                  j                  t        j                  j                  |d            sAt        j                  d|       g c S  t        j                  j                  |dd      }t        j                  j                  |      s t        j                  j                  |d      }|j                  t        j                  j                  |d	            }d}| D ]  }t        j                  j                  |      s#t        j                  |t        j                        sHt        j                  j                  t        j                  j                  |d
            s|} n |s*t        j                  d|       |t        |      }|r|gS g S |t        j                  d|        g S |d   }t        j                  j                  |      }	t        j                  j                  ||	j                  dd            }
t        j                  j                  |d      }	 t!        ||
|       g S # t"        t$        j&                  f$ rl t        j                  dd       |
|fD ]7  }t        j                  j                  |      s#t        j(                  |       9 t        |      }|r|gcY S g cY S w xY w)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  r+  r  r  r<   r9   r   rR  )rq  r  windows_cuda_homelib_dirbin_dirdll_candidatesr   stub_libr  r  r  r  r  s                r   _ensure_mingw_cudart_import_libr     sw    

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

 O, 	Aww~~a 		!	 -Z8:	s   4J AL'LLLlpathsc                 .   t        |       D ]  \  }}dt        j                  v s|j                  t        j                  d         s<t	        |      }|Jt        |      | |<   |dz  }|j                         sn| j                  t        |              y )Nr  stubs)	enumerater3   rO   
startswithr  r   rL   r   )r  r   r6   r  stub_dirs        r   _transform_cuda_pathsr  X  s     V$ -4"**$K9P)Q#9$#?GGF1I(H c(m,-r   device_typeru  c                    g }g }g }g }g }g }g }	t        j                         rEdt        j                  vr3dt        j                  vr!t        j
                  t        j                  d<   t                ddlm}
 |
j                  | t         j                  j                  du       }t         j                  j                  }|
j                  | |t         j                  j                        }| dk(  r|j                  t        j                   j"                  rdnd	       t        j                   j"                  5t        j                         s|s|d
gz  }n|dgz  }|j                  d       n`t        j                         s|s|dgz  }n|ddgz  }t         j                  j                  dk(  rt%        |      }|dg|z   z  }t'        |       | dk(  r|j                  d       d}t(        rkt        j*                  d      }|t-        |      |t        j.                  j1                  |d      gz  }|t        j.                  j1                  |d      gz  }n|dgz  }t3        d      st-        |      |ddgz  }|r|dgz  }| dk(  r|j                  d       t        j                         ra|j                  t        j4                         |r$| dk(  rt        j                   j"                  |sdg}	| dk(  rt7               \  }}||z  }||z  }t         j                  j8                  r|t         j                  j8                  z  }|||||||	fS )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   rK  r6   r7   r   sdk_includer  custom_op_libs)r  rt  ru  rm  rn  ro  rp  rq  rr  rs  r  rG  
extra_libsxpu_error_stringze_rootstdcxx_lib_dir_pathsstdcxx_libss                    r   get_cpp_torch_device_optionsr  g  s'     K LFG "NI"$rzz)rzz)"-"6"6

;) ..V((66$>L ''55M"00($11GG 1 N
 f%--*;*;;M==(!j\)	k]*	67!fX%	fl33	""88IE<^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$% $%$22N$I))V((777	 	 r   c                        e Zd ZdZedddddddddddddfdeded	ed
ededededededee   dededededdf fdZ	d fdZ
 xZS )CppTorchDeviceOptionsz
    This class is inherited from CppTorchOptions, which automatic contains
    base cxx build options and torch common build options. And then it will
    maintains cuda/xpu device related build args.
    Fr  Tr   r   r/  r=  r  rt  ru  r   r  r  r  r   r  rv  rw  rW   r   Nc                    t         |   ||||||||
||||       g }g }g }g }g }g }g }t        |||      \  }}}}}}}t        | j                  |       t        | j
                  |       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       | j                          y )N)r/  r=  rt  ru  r   r  r  r   r  rv  rw  rW   )r  rt  ru  )r	  rk   r  rA  rz  r{  r|  r}  r~  r  r  r  )rj   r/  r=  r  rt  ru  r   r  r  r  r   r  rv  rw  rW   device_definitionsdevice_include_dirsdevice_cflagsdevice_ldflagsdevice_libraries_dirsdevice_librariesdevice_passthrough_argsr
  s                         r   rk   zCppTorchDeviceOptions.__init__  s   " 	+%/-&?#%%' 	 	
 )+)+#%$&+-&(-/ )#%
	
!# 	T&&(:;T'')<=T\\=1T]]N3T))+@AT__&67T++-DE r   c                 2   t         |           t        j                         rtt	               \  }}t        |      dk(  s
J d|        |d   | j                  v r=| j                  j                  |d          | j                  j                  |d          y y y )Nr'   zPython lib dirs: r   )	r	  r  r
   r   ra  rc  r~  rR  r   )rj   r   python_lib_dirsr
  s      r   r  z'CppTorchDeviceOptions._finalize_options  s    !# ":!;A'1,S0A/AR.SS,q!T%9%99$$++OA,>?$$++OA,>? : r   r   )r   r   r   r  r   r   r   r   r   rk   r  r  r  s   @r   r  r    s     * %!""'!&*/%'""#<!<! <! 	<!
 <! <!  <! <! $(<! <! c]<! <! <! <! <!  
!<!|	@ 	@r   r  rc   c                     t         j                  j                  |       }t         j                  j                  |      \  }}t         j                  j	                  |       }||fS )a  
    This function help prepare parameters to new cpp_builder.
    Example:
        input_code: /tmp/tmpof1n5g7t/5c/c5crkkcdvhdxpktrmjxbqkqyq5hmxpqsfza4pxcf3mwk42lphygc.cpp
        name, dir = get_name_and_dir_from_output_file_path(input_code)
    Run result:
        name = c5crkkcdvhdxpktrmjxbqkqyq5hmxpqsfza4pxcf3mwk42lphygc
        dir = /tmp/tmpof1n5g7t/5c/

    put 'name' and 'dir' to CppBuilder's 'name' and 'output_dir'.
    CppBuilder --> get_target_file_path will format output path according OS:
    Linux: /tmp/tmppu87g3mm/zh/czhwiz4z7ca7ep3qkxenxerfjxy42kehw6h5cjk6ven4qu4hql4i.so
    Windows: [Windows temp path]/tmppu87g3mm/zh/czhwiz4z7ca7ep3qkxenxerfjxy42kehw6h5cjk6ven4qu4hql4i.dll
    )r3   r6   r+  splitextr  )rc   name_and_extrW  _extdirs        r   &get_name_and_dir_from_output_file_pathr  )  sL    " 77##I.L!!,/JD$
''//)
$C9r   c                   :   e Zd ZdZedeeef   fd       Zedeeef   fd       Zedeeef   fd       Z	edeeef   fd       Z
	 ddedeee   z  d	ed
eddf
dZdefdZdefdZ	 	 ddZddZdededdfdZdededdfdZdedee   ddfdZdeddfdZy)
CppBuildera  
    CppBuilder is a cpp jit builder, and it supports both Windows, Linux and MacOS.
    Args:
        name:
            1. Build target name, the final target file will append extension type automatically.
            2. Due to the CppBuilder is supports multiple OS, it will maintains ext for OS difference.
        sources:
            Source code file list to be built.
        BuildOption:
            Build options to the builder.
        output_dir:
            1. The output_dir the target file will output to.
            2. The default value is empty string, and then the use current dir as output dir.
            3. Final target file: output_dir/name.ext
    r   c                  2    t         rdnd} t         rdnd}| |fS )Nz.pyd.soz/Fer   r  	extensionoutput_flagss     r   __get_python_module_flagsz$CppBuilder.__get_python_module_flagsR  s    )Fu	 +u,&&r   c                  2    t         rdnd} t         rdnd}| |fS )Nz.objr   z/c /Foz-c -or  r$  s     r   __get_object_flagszCppBuilder.__get_object_flagsX  s    )Ft	#.xG,&&r   c                  F    t         s
t               sdnd} t         rdnd}| |fS )N.pch.gchz/Fpr   )r   r&  r$  s     r   __get_precompiled_header_flagsz)CppBuilder.__get_precompiled_header_flags^  s#    )Fv	 +u,&&r   c                  "    d} t         rdnd}| |fS )Nz.iz/EP /Pz-E -P -or  r$  s     r   __get_preprocessor_output_flagsz*CppBuilder.__get_preprocessor_output_flagsd  s    	#.xJ,&&r   rW  sourcesBuildOptionr   Nc                 @   d| _         d| _        d| _        d| _        d| _        d| _        d| _        d| _        g | _        d| _	        d| _
        d| _        d| _        || _        t        j                  j                   xs d| _        || _        |j'                         | _         |j)                         | _        |j+                         | _        || _	        |j-                         | _        |j1                         | _        |j5                         | _        t9        | j.                  | j2                  | j6                  f      dk  sJ | j.                  xs | j2                  xs | j6                   | _        t<        r| j2                  rJ d       | j.                  r| j?                         \  }}nS| j2                  r| jA                         \  }}n3| j6                  r| jC                         \  }}n| jE                         \  }}tF        jH                  jK                  | j                  | j                   |       | _
        | j                  r)tF        jH                  jM                  | j                        n| j                  }t<        r | j6                  r|| _'        n| | | _'        n| d| | _'        tQ        |tR              r|g}t        jT                         rH| j                  r<tW        |      | _        |D cg c]!  }tF        jH                  jM                  |      # }}| j2                  rXtY        |      dk(  sJ d|d    | _-        | j                  rEt]        |j'                               r,| xj                  d	z  c_        ndjK                  |      | _-        |j_                         D ];  }	t<        r| xj                  d
|	 dz  c_        #| xj                  d|	 dz  c_        = |ja                         D ];  }
t<        r| xj                  d|
 dz  c_        #| xj                  d|
 dz  c_        = |jb                  x}rbt<        rtd        jg                  d|       nEd| d| _        | j                  r.t]        |j'                               r| xj                  dz  c_        |ji                         D ]N  }t<        r| xj                  d| dz  c_        #| xj                  dtk        jl                  |       dz  c_        P |jo                         D ];  }t<        r| xj                  d
| dz  c_        #| xj                  d| dz  c_        = |jq                         D ];  }t<        r| xj
                  d| dz  c_        #| xj
                  d| dz  c_        = |js                         D ];  }t<        r| xj                  d| dz  c_        #| xj                  d| dz  c_        = |ju                         D ]  }| xj                  | dz  c_         y c c}w )Nr   F
aoti_modelr'   z/Cannot currently precompile headers on Windows!r   z-x c++-header r   z- -relocatable-pch -Xclang -fno-pch-timestamp ri  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  );ry  _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   r+  _outputr   r   r   r   rc  _sources_argsr  r  r  r  rM   r  r  r^  quoter  r  r  r  )rj   rW  r0  r1  r   file_extr&  relative_target_filer   cflag
definitionr  inc_dirldflagr  r  passthrough_args                    r   rk   z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"HlGGLL)9)9djj\(;TU && GGT../"" 	
 ""+".0D/EF*^1-A,BCDLgs#iG $"9"9 '+7mD#4;<qrww''*<G<w<1$$$#1'!*!>D&&9[5M5M5O+P !!%TT!!$'!2D ++- 	2E!!qq\1!!!qq\1!		2 &557 	>J&&C
|1*==&&&C
|1*==&		> "-!?!???_&
 -66H5I*K'**y9Q9Q9S/T %%)FF%"335 	HG''T'"+=='''RG0D/EQ+GG'		H "--/ 	4F""&m3"""&m3"		4 #557 	=G))z'"-EE)))r'!_<)		= ,,. 	4C$$!C57$$$"SE3$		4  +??A 	GO--O3DA1FF-	GE =s   4&Xc                     dt         dt         dt         dt         dt         dt         dt         dt         d	t         d
t         dt         f fd} | j                   j                   j                   j                   j
                   j                   j                   j                   j                   j                  
      }|S )NrW   r0  include_dirs_argsdefinitions_argscflags_argsldflags_argslibraries_argslibraries_dirs_argsrs  r`  r   c
                     t         r=|  d| d| d| d| d| d|	 }
j                  r|
d| d| d| z  }
t        |
      }
|
S |  d| d| d| d| d| d|	 }
j                  r|
d| d| d| z  }
|
S )Nr   z /LD /link )r   rC  r   )rW   r0  rS  rT  rU  rV  rW  rX  rs  r`  r   rj   s              r   format_build_commandz9CppBuilder.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   r0  rS  rT  rU  rV  rW  rX  rs  r`  )r   ry  rI  r6  r5  r4  r7  r9  r8  r:  rH  )rj   rZ  command_lines   `  r   get_command_linezCppBuilder.get_command_line	  s    			  #	 "		
 	 	  	 "%	 "	 	 	> ,^^&&"55!33))++// $ 9 9!>><<
 r   c                 ,    t        | j                        S r   )r   r=  r{   s    r   get_target_file_pathzCppBuilder.get_target_file_path2	  s    '(9(9::r   c                    t        d      5  t        j                  | j                               }	 | j                  }t
        j                  j                  t        d      }t        j                         5 }t        j                  t        t
        j                  j                  |d             | j                  D ]S  }t        j                  |t
        j                  j                  |t
        j                  j                  |                   U t
        j                  j                  |d      }t        j                   ||       | j"                  j$                  }|rt
        j                  j'                  |      rt(        s
t+               sdnd}||z   }	t
        j                  j                  |      }
t        j                  |t
        j                  j                  ||
             t
        j                  j'                  |	      r7t        j                  |	t
        j                  j                  ||
|z                |D cg c]  }||k(  r|
n| }}| j,                  s!|r&t
        j                  j'                  |      rddg|dd t/        ||t
        j                  j                  |      t0        	      }t
        j                  j3                  |      rt        j4                  |       t        j                  ||       |j7                  d
      rt        j8                  |d       n'|j7                  d      rt        j8                  |d       d d d        d d d        y c c}w # 1 sw Y   xY w# t:        j<                  $ r5}t?        j@                  ||jB                  jE                  d            |d }~ww xY w# 1 sw Y   y xY w)Nre  r  z	script.ldr+  r,  z	-isysrootr}   r'   )exception_classr   i  r#  i  r   )#r	   r^  r   r\  r=  r3   r6   r7   _TORCH_PATHtempfileTemporaryDirectoryrQ   r4  r*  r;  r+  copytreerA  r  rq  r   r&  r  r   r_   rL   rR  endswithchmodr9   r   r   r_  r`  r  )rj   re  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_rezCppBuilder.build_fbcode_re5	  s    .) >	Tkk$"7"7"9:G<T"// ')ggll;	&J#002 45gKKWk0RS#66 WCgrww?O?OPS?T)UVW(*Wi(H%OO$79JK
 "&!3!3!F!FJ!bggnnZ&@,7vx&V'1G';')ww'7'7
'CJWl0ST77>>,7"KK , "WlW6L M (/# # -0:,=L3F# # ))"rww~~j'A(3S'9!
 '9((5(4	'O ww~~k2		+.KK="++D1e4$--e4e4i45>	T >	T<#-45 45j 00 T))'188??73KLRSST{>	T >	TsU   $N?AM45GM(M#C?M(M4#M((M1	-M44N<0N77N<<N??Oc                 F   | j                   r| j                         S t        | j                         t        j
                  j                  | j                  | j                   dt               }t        |       | j                         }t        ||       t        |       y)z
        It is must need a temporary directory to store object files in Windows.
        After build completed, delete the temporary directory to save disk space.
        r   r[  N)r  rr  rN  r<  r3   r6   r7   r>  _BUILD_TEMP_DIRr\  rf  rY  )rj   _build_tmp_dir	build_cmds      r   buildzCppBuilder.buildx	  s    
 ""'')) !1!12Ao->?
 	!0))+		~6N#r   
cmake_pathr  c                 B   dj                  | j                  j                               }t        j                  j
                  sdnd}t        j                  d| j                   d| j                   d| d      }t        j                  j                  st        j                  j                  rv|t        j                  d      z  }|t        j                  d| j                   d	| d
| j                   d	| j                   d| j                   d	| j                   d      z  }n3|t        j                  d| j                   d| j                   d      z  }|dk(  rtt        j                  j                   Zddlm}  |       }|t        j                  d| j                   d| j                   d| j                   d| d| d| d| d      z  }n|dk(  r|t        j                  d      z  }t'        |d      5 }|j)                  |       ddd       y# 1 sw Y   yxY w)z
        Save global cmake settings here, e.g. compiler options.
        If targeting CUDA, also emit a custom function to embed CUDA kernels.
        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   rA  r  r
   r   dynamic_linkagetextwrapdedentr@  rG  test_configsuse_libtorchr4  r:  rA  r  r  *torch._inductor.codegen.cuda.compile_utilsr~  r   r  )	rj   ry  r  rm  target_library_typecontentsr~  current_archr  s	            r   save_compile_cmd_to_cmakez$CppBuilder.save_compile_cmd_to_cmake	  st    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                     dt        |      j                  z   }t        |d      5 }|j                  d| j                   d| d       d d d        y # 1 sw Y   y xY w)N${CMAKE_CURRENT_SOURCE_DIR}/aztarget_sources(r}  z)
)r   rW  r   r  r@  )rj   ry  r  r  s       r   save_src_to_cmakezCppBuilder.save_src_to_cmakeC
  s]    1DN4G4GG*c" 	QaGGod&7&7%8	(3OP	Q 	Q 	Qs   #AA	asm_filesc           	         t        |d      5 }|D ]n  }t        |      j                  j                  d      d   }dt        |      j                   }t	        j
                  d| d| d      }|j                  |       p |r>|j                  d| j                   d	       |j                  d
| j                   d       d d d        y # 1 sw Y   y xY w)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   rW  r   r  r  r  r@  )rj   ry  r  r  asm_filer   r  s          r   save_kernel_asm_to_cmakez#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   B4C

Cc                    dj                  | j                  j                               }dj                  | j                  j                               }t	        j
                  d| j                   d| d| j                   d| d	      }t        j                  j                  |      sJ d| d       t        |d      5 }|j                  |       d d d        y # 1 sw Y   y xY w)	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   rA  r  r  r  r  r@  r3   r6   rL   r   r  )rj   ry  lflagsr[  r  r  s         r   save_link_cmd_to_cmakez!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   r   )r   r   r   r  staticmethodr   r   rG  rD  rE  rF  r   rl  rk   r\  r^  rr  rx  r  r  r  r  r   r   r   r!  r!  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   r!  rj  targetc                     dt         fd}dt         dt         dt         dt         fd} |       } ||t        |       t        |            }t        |t        |             y )	Nr   c                  H    t         rd} | S t               } t        |       rd} | S )Nml64rD   )r   r   r$  )ASM_CCs    r   get_asm_compilerz.run_asm_build_object.<locals>.get_asm_compilerp
  s-    F 	 &'F!&)r   asm_ccrj  r  c                 >    t         r|  d| d| }|S |  d| d| }|S )Nr   z /c /Fo z -c z -o r  )r  rj  r  r   s       r   r\  z.run_asm_build_object.<locals>.get_command_linez
  sA     HAcU(6(3C 
 HDT&2C
r   )r  rj  r  rt  )r   r   rf  )rj  r  r[  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)r4  re   rL  	functoolsr  localeloggingr3   r2   r   r^  rQ   r9   r1   rN  rb  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   ru  r6   r  __file___HEREr  ra  r7   r*  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&  r(  r!  r+  r-  r5  rA  rE  rN  rY  rc  rf  r   rl  r  r  r  r  r  r  r  r  r  r  r  r  r  r.  r<  rJ  rV  ra  rf  rk  rt  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r  r   r   r   <module>r     s
          	  	    
     $ ! $    , ' ? ; , 6? s c d c S T S C D d 
 
!ggoobggooe45k+@A LL##G,	LL##H-	llg%$	=H5&5579b g! 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   