o
    ;i@                     @  s   d Z ddlm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 ddlmZmZmZ ddlmZmZ dd	lmZ dd
lmZmZ ddlmZmZmZmZmZ dddZed oeedduZdej v rtej d ! dkZG dd dZ"dS )zManages CMake.    )annotationsN)LooseVersion)Path)CalledProcessError
check_callcheck_output)Anycast   )which)
CMakeValue#get_cmake_cache_variables_from_file)	BUILD_DIRcheck_negative_env_flagIS_64BIT	IS_DARWIN
IS_WINDOWSdstrreturnNonec              
   C  sN   z
t j| dd W d S  ty& } ztdt j|  d|j |d }~ww )NT)exist_okzFailed to create folder z: )osmakedirsOSErrorRuntimeErrorpathabspathstrerror)r   e r    6/home/app/PyTorch/pytorch/tools/setup_helpers/cmake.py_mkdir_p   s   r"   	USE_NINJAZninjaCMAKE_GENERATORc                   @  s~   e Zd ZdZefd*ddZed+dd	Zed+d
dZ	ed,ddZ
d-ddZed.ddZd/ddZd0d%d&Zd1d'd(Zd)S )2CMakezManages cmake.	build_dirr   r   r   c                 C  s   t  | _|| _d S N)r%   _get_cmake_command_cmake_commandr&   )selfr&   r    r    r!   __init__(   s   

zCMake.__init__c                 C  s   t j| jdS )zlReturns the path to CMakeCache.txt.

        Returns:
          string: The path to CMakeCache.txt.
        zCMakeCache.txt)r   r   joinr&   )r*   r    r    r!   _cmake_cache_file,   s   zCMake._cmake_cache_filec                    s   d} t r| S ttd}ttd}td t fdd||fD r/tdt||g |du r7d} | S |du r?d} | S ||krGd} | S d} | S )zReturns cmake command.cmakeZcmake3z3.27.0c                 3  s     | ]}|d u p| k V  qd S r'   r    ).0verZ_cmake_min_versionr    r!   	<genexpr>@   s
    
z+CMake._get_cmake_command.<locals>.<genexpr>z0no cmake or cmake3 with version >= 3.27.0 found:N)r   r%   _get_versionr   r   allr   r   )Zcmake_commandZcmake3_versionZcmake_versionr    r1   r!   r(   5   s2   
zCMake._get_cmake_commandcmd
str | Noner   c                 C  sT   | du rdS t | dgddD ]}d|v r%t| dd   S qtd)	zReturns cmake version.Nz	--versionutf-8
version    zno version found)r   decodesplitr   stripr   )r5   liner    r    r!   r3   T   s   zCMake._get_versionargs	list[str]envdict[str, str]c              	   C  sT   | j g| }td| zt|| j|d W dS  ttfy)   td Y dS w )z1Executes cmake with arguments and an environment.r:   )cwdrB   r
   N)	r)   printr,   r   r&   r   KeyboardInterruptsysexit)r*   r@   rB   commandr    r    r!   run_   s   z	CMake.runkwargsr   c                 K  s8   t | D ]\}}|dur| d| d|  qdS )z*Adds definitions to a cmake argument list.Nz-D=)sorteditemsappend)r@   rK   keyvaluer    r    r!   definesl   s
   zCMake.definesdict[str, CMakeValue]c                 C  s6   t | j}t|W  d   S 1 sw   Y  dS )zGets values in CMakeCache.txt into a dictionary.
        Returns:
          dict: A ``dict`` containing the value of cached CMake variables.
        N)openr-   r   )r*   fr    r    r!   get_cmake_cache_variabless   s   $zCMake.get_cmake_cache_variablesr9   cmake_python_librarybuild_pythonbool
build_testmy_envrerunc           !      C  s8  |rt j| jrt | j t j| jd}t j| jr(tr&t j|r(dS g }tr7dt j	d< |
d nztrt dd}	ddg}
|	|
vr]td|	  td	 td
|
 td |
d|	  i }t d}|dur||d< t d}|du rtd td trt dkr|
d n	|
d d|d< |rddd | D }|
d|  ttt jd }t j|d}t| t| j i }ddd}|dd  d!D  d"d#d#d$d$d%}| D ]4\}}||}|dur|||< n|d&s|d'r|||< ||v r|| }||vr|||< qtd(}|d)d}|r8|d* t t| |d)< n||d)< |||t!d+ d, |d- }t j|rW||d.< d/|i}t"|#|}t$|d0krwtd1|d2  td || t%j&|ftj'|d3| d4}t(rt j|rd5|vrd6t j	vrt%j&|| d7d8 d9|vrd:t j	vrt%j&|| d;d< |D ]L}|d=rzt|| )d>||< W q t*y } z'd?d@dA || D } tdB| dC|  tj+dD t|tj+dD W Y d}~qd}~ww q|
| | j,||dE dS )Fz*Runs cmake to generate native build files.zbuild.ninjaNZNinjar$   z-GNinjazVisual Studio 16 2019zVisual Studio 17 2022zUnsupported `CMAKE_GENERATOR`: z.Please set it to one of the following values: r8   r
   z-GZCMAKE_GENERATOR_TOOLSET_VERSIONr9   ZVCToolsVersionzWhen you specify `CMAKE_GENERATOR_TOOLSET_VERSION`, you must also activate the vs environment of this version. Please read the notes in the build steps carefully.ARM64z-A ARM64z-Ax64x64host,c                 S  s   g | ]\}}| d | qS )rL   r    )r/   kvr    r    r!   
<listcomp>   s    z"CMake.generate.<locals>.<listcomp>z-Tr;   torchCUDNN_LIBRARYZCAFFE2_STATIC_LINK_CUDA)ZCUDNN_LIB_DIRZUSE_CUDA_STATIC_LINKc                 S  s   i | ]}||qS r    r    )r/   varr    r    r!   
<dictcomp>   s    z"CMake.generate.<locals>.<dictcomp>)ZUBSAN_FLAGSZBLASZ	WITH_BLASCUDA_HOST_COMPILERCUDA_NVCC_EXECUTABLEZCUDA_SEPARABLE_COMPILATIONre   CUDNN_INCLUDE_DIRZ
CUDNN_ROOTZEXPERIMENTAL_SINGLE_THREAD_POOLZINSTALL_TESTZ	JAVA_HOMEZINTEL_MKL_DIRZINTEL_OMP_DIRZMKL_THREADINGZMKLDNN_CPU_RUNTIMEZMSVC_Z7_OVERRIDEZCAFFE2_USE_MSVC_STATIC_RUNTIMEZNuma_INCLUDE_DIRZNuma_LIBRARIESZONNX_MLZONNX_NAMESPACEZATEN_THREADINGZWERRORZOPENSSL_ROOT_DIRSTATIC_DISPATCH_BACKENDZSELECTED_OP_LISTZTORCH_CUDA_ARCH_LISTZTORCH_XPU_ARCH_LISTZTRACING_BASEDZPYTHON_LIB_REL_PATHCMAKE_CUDA_HOST_COMPILERrh   ri   )rh   ZCUDAHOSTCXXrl   ZCMAKE_CUDA_COMPILERZCUDACXX)ZBUILD_ZUSE_ZCMAKE_)ZEXITCODEZEXITCODE__TRYRUN_OUTPUTpurelibZCMAKE_PREFIX_PATH;	USE_NUMPY)ZBUILD_PYTHON
BUILD_TESTro   z/nvidia/nvshmemZNVSHMEM_HOMEZCMAKE_INSTALL_PREFIXr   z, zd should not be specified in the environment variable. They are directly set by PyTorch build script.)ZPython_EXECUTABLEZTORCH_BUILD_VERSIONz/usr/local/opt/ccache/libexecCMAKE_C_COMPILERCCz/gcc)rq   CMAKE_CXX_COMPILERCXXz/g++)rs   Zghr7   :c                 s  s    | ]	}t |d V  qdS )Z02xN)ord)r/   cr    r    r!   r2   Q  s    z!CMake.generate.<locals>.<genexpr>zInvalid ENV[z] = )file)rB   )-r   r   isfiler-   remover,   r&   existsr#   environrO   r   getenvrE   rG   rH   r   platformmachinerN   r   r   __file__absoluteparentsr"   updateget
startswithendswith	sysconfigget_pathr	   r   setintersectionlenr%   rR   
executabler   encodeUnicodeDecodeErrorstderrrJ   )!r*   r9   rW   rX   rZ   r[   r\   Zninja_build_filer@   	generatorZ	supportedZtoolset_dictZtoolset_versionZcurr_toolsetZtoolset_exprbase_dirZinstall_dirZbuild_optionsZadditional_optionsZlow_priority_aliasesrf   valZtrue_varrP   Zpy_lib_pathZcmake_prefix_pathZnvshmem_homeZcmake__optionsZspecified_cmake__optionsZexpected_wrapperZenv_var_namer   Zshexr    r    r!   generate{   s   







,







zCMake.generatec                 C  s`   ddl m} ddddd|jg}td}|d	usts(|p!tt }|d
|g7 }| 	|| d	S )zRuns cmake to build binaries.r
   )
build_typez--build.z--targetinstallz--configZMAX_JOBSNz-j)
rB   r   Zbuild_type_stringr   r}   r#   r   multiprocessing	cpu_countrJ   )r*   r[   r   Z
build_argsZmax_jobsr    r    r!   build`  s   

zCMake.buildN)r&   r   r   r   )r   r   )r5   r6   r   r   )r@   rA   rB   rC   r   r   )r@   rA   rK   r   r   r   )r   rS   )r9   r6   rW   r6   rX   rY   rZ   rY   r[   rC   r\   rY   r   r   )r[   rC   r   r   )__name__
__module____qualname____doc__r   r+   propertyr-   staticmethodr(   r3   rJ   rR   rV   r   r   r    r    r    r!   r%   %   s     



 fr%   )r   r   r   r   )#r   
__future__r   r   r   r~   rG   r   Zdistutils.versionr   pathlibr   
subprocessr   r   r   typingr   r	    r   Zcmake_utilsr   r   rB   r   r   r   r   r   r"   r#   r|   lowerr%   r    r    r    r!   <module>   s&    

