B
    XM\3=  ã               @   s  d dl mZmZmZ d dlZd dlZd dlZd dlmZm	Z	m
Z
m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mZmZmZmZ d d	lmZmZ ejd
ksºt ‚dddddddœZ!dd„ Z"dd„ Z#ddd„Z$dd„ Z%dd„ Z&d dd„Z'dS )!é    )Úabsolute_importÚdivisionÚprint_functionN)ÚisdirÚjoinÚdirnameÚisfile)Úfind_vcvarsall)ÚRegÚWINSDK_BASE)Úenviron)Úconda_46)Úcheck_call_envÚroot_script_dirÚpath_prependedÚ	copy_intoÚ
get_logger)Úset_language_env_varsÚget_default_variantZwin32zVisual Studio 8 2005zVisual Studio 9 2008zVisual Studio 10 2010zVisual Studio 11 2012zVisual Studio 12 2013zVisual Studio 14 2015)z8.0z9.0z10.0z11.0z12.0z14.0c             C   sæ   t | ƒsdS xÔt | ¡D ]Æ}tt| |ƒƒrd|kr4qtt| |ƒdƒ„}| ¡ }| d¡rdd| ¡ ksfwt	d| ƒ tt| |d ƒdƒ}| 
| ¡ ¡ W dQ R X ttttƒd	|j ƒt| |d
 ƒƒ W dQ R X t t| |ƒ¡ qW dS )zV
    Fixes scripts which have been installed unix-style to have a .bat
    helper
    NÚ.Úrbs   #!s   pythonz@Adjusting unix-style #! script %s, and adding a .bat file for itz
-script.pyÚwbz
cli-%s.exez.exe)r   ÚosÚlistdirr   r   ÚopenÚreadlineÚ
startswithÚlowerÚprintÚwriteÚreadr   r   Ú__file__Ú	host_archÚremove)Zscripts_dirÚconfigÚfnÚfÚlineÚfo© r)   ú2lib/python3.7/site-packages/conda_build/windows.pyÚfix_staged_scripts"   s     r+   c             C   st   dt jkrt jd }n
t jd }t| ƒ dd¡}d |¡}|t jkrXt j t j| d¡S t j |d | ¡dd	¡S d
S )z¸
    Given the Visual Studio version, returns the default path to the
    Microsoft Visual Studio vcvarsall.bat file.
    Expected versions are of the form {9.0, 10.0, 12.0, 14.0}
    zProgramFiles(x86)ZProgramFilesr   Ú zVS{0}COMNTOOLSz..\..\VC\vcvarsall.batzMicrosoft Visual Studio {}ZVCzvcvarsall.batN)r   r   ÚstrÚreplaceÚformatÚpathr   )ÚversionZPROGRAM_FILES_PATHZflatversionZvstoolsr)   r)   r*   Úbuild_vcvarsall_vs_pathA   s    




r2   c          	   C   s¼  t tƒ}| d¡ |r | d¡ t| ƒ} | dkr4dnd}g }d }|d k	rL|}| d¡ | d¡ |s®|j dt|ƒd ¡}t|d	 ƒd
krªt| 	d¡d ƒdk r¤d}d}nd}t
|ƒdkrÒ| d | dd¡¡¡ t|ƒ}|fdd„}	| d |¡¡ | d | 	d¡d	 ¡¡ | d t| dd … ¡¡ | d t| dddœ|   ¡¡ | d¡ | d¡ |dkryrt tj td¡d ¡}
tj |
d!d"¡}| dkr¢d#nd$}|	||d%}| d&¡ | |¡ | d' |
|	|ƒ¡¡ W n$ tk
r   | |	|ƒ¡ Y nX n¨|dkr y tj tj td(ƒ¡d)d*¡}W n ttfk
rN   d }Y nX d+}| |	|ƒ¡ |dkr†|r†| | |	|ƒ¡¡ | | |	td(ƒƒ¡¡ n| |	|ƒ¡ d, |¡d, S )-NzÜUsing legacy MSVC compiler setup.  This will be removed in conda-build 4.0. If this recipe does not use a compiler, this message is safe to ignore.  Otherwise, use {{compiler('<language>')}} jinja2 in requirements/build.zÀmsvc_compiler key in meta.yaml is deprecated. Use the newvariant-powered compiler configuration instead. Note that msvc_compileris incompatible with the new \{\{compiler('c')\}\} jinja scheme.Ú32Zx86Zamd64zset DISTUTILS_USE_SDK=1zset MSSdk=1Úpythonr   é   r   é   é   z10.0z14.0z9.0g      ,@z6set PY_VCRUNTIME_REDIST=%LIBRARY_BIN%\vcruntime{0}.dllr,   c             S   s   dj | |dS )Nzcall "{cmd}" {arch})ÚcmdÚarch)r/   )r8   r9   r)   r)   r*   Úbuild_vcvarsall_cmd‡   s    z)msvc_env_cmd.<locals>.build_vcvarsall_cmdzset "VS_VERSION={}"zset "VS_MAJOR={}"zset "VS_YEAR={}"éüÿÿÿzset "CMAKE_GENERATOR={}"z Win64)Z64r3   z+set "MSYS2_ARG_CONV_EXCL=/AI;/AL;/OUT;/out"zset "MSYS2_ENV_CONV_EXCL=CL"zv7.1ZinstallationfolderZBinz
SetEnv.cmdz/Release /x86z/Release /x64)r9   zSetlocal EnableDelayedExpansionz'if not "%WindowsSDKDir%" == "{}" ( {} )é	   Úbinzvcvars64.batzIF %ERRORLEVEL% NEQ 0 {}Ú
)r   Ú__name__Úwarnr-   ÚappendÚvariantÚgetr   ÚintÚsplitÚfloatr/   r.   r2   ÚVS_VERSION_STRINGr
   Ú	get_valuer   r0   r   r   ÚKeyErrorr   Údistutils_find_vcvarsallÚ	TypeError)Úbitsr$   ÚoverrideÚlogZarch_selectorZmsvc_env_linesr1   Zpy_verZvcvarsall_vs_pathr:   ZWIN_SDK_71_PATHZWIN_SDK_71_BAT_PATHZwin_sdk_archZwin_sdk_cmdZVCVARS64_VS9_BAT_PATHZerror1r)   r)   r*   Úmsvc_env_cmdY   sv    










rO   c             C   sÊ   |j rt|jjddƒ}t|ƒsFtt|ƒƒs8t t|ƒ¡ t	|dƒ 
¡  trd|  djt|jjd¡ n,|  djt|jjd¡ |  d¡ |  d¡ tr®|  d	jt|jjd¡ n|  djt|jjd¡ d S )
Nz
conda-metaÚhistoryÚaz>call "{conda_root}\..\condabin\conda.bat" activate "{prefix}"
)Z
conda_rootÚprefixz,call "{conda_root}\activate.bat" "{prefix}"
z+set "PATH=%PATH:CONDA_PATH_PLACEHOLDER;=%"
zset CONDA_MAX_SHLVL=2
zFcall "{conda_root}\..\condabin\conda.bat" activate --stack "{prefix}"
)Zis_crossr   r$   Úhost_prefixr   r   r   r   Úmakedirsr   Úcloser   r   r/   r   Úbuild_prefix)Zfile_handleÚmZhistory_filer)   r)   r*   Ú_write_bat_activation_textÒ   s,    

rX   c       
   
   C   s€  t | jjdƒ}| jdkr d|d< t|dƒÂ}| d¡ x8| ¡ D ],\}}|dkr@|d k	r@| dj||d	¡ q@W | js˜| t	| jj
| j|  d
d ¡d¡ | d¡ | d |d ¡¡ | d |d ¡¡ | jjrè|  ¡ dkrèt|| ƒ W d Q R X t | jjdƒ}tj |¡rxt|ƒ}| ¡ }	W d Q R X t|dƒ>}| d¡ | d |¡¡ | d¡ | d¡ | |	¡ W d Q R X ||fS )Nzbuild_env_setup.batr4   TZPYTHONDONTWRITEBYTECODEÚwz	@echo on
r,   zset "{key}={value}"
)ÚkeyÚvaluezbuild/msvc_compiler)rL   r$   rM   zset "INCLUDE={};%INCLUDE%"
ZLIBRARY_INCzset "LIB={};%LIB%"
ZLIBRARY_LIBZcondazconda_build.batzIF "%CONDA_BUILD%" == "" (
z    call {}
z)
z%REM ===== end generated header =====
)r   r$   Úwork_dirZnoarchr   r   Úitemsr/   Z"uses_new_style_compiler_activationrO   r"   rH   ZactivateÚnamerX   r   r0   r   r    )
rW   ÚenvÚbld_batÚ
env_scriptr(   rZ   r[   Úwork_scriptZfiÚdatar)   r)   r*   Úwrite_build_scripts  s6    






rd   Fc       
   
      sF  t | jjƒ* t | jjƒ tj| d‰ W d Q R X W d Q R X dˆ d< dˆ d< dˆ d< dˆ d< | jjˆ d	< dˆ d
< ˆ  t| jj	ƒ¡ x*dD ]"}ˆ d|  }t
|ƒsˆt |¡ qˆW t| ˆ |ƒ\}}|sBtj |¡rBddtj |¡g}| jjròd }	n$‡ fdd„dD ƒ}	tdt |	¡ ƒ t|| jj||	d tt| jjdƒ| jd d S )N)rW   ZBUILDZCONDA_BUILD_STATEÚFalseZPIP_NO_BUILD_ISOLATIONTZPIP_NO_DEPENDENCIESZPIP_IGNORE_INSTALLEDZPIP_CACHE_DIRZPIP_NO_INDEX)ZBINZINCZLIBZLIBRARY_zcmd.exez/cc                s   i | ]}|ˆ krˆ | |“qS r)   r)   )Ú.0Úk)r_   r)   r*   ú
<dictcomp>Q  s   zbuild.<locals>.<dictcomp>)ZPREFIXZBUILD_PREFIXZSRC_DIRzRewriting env in output: %s)ÚcwdÚstatsZrewrite_stdout_envZScripts)r$   )r   r$   rS   rV   r   Zget_dictZpip_cache_dirÚupdater   rB   r   r   rT   rd   r0   r   ÚbasenameÚdebugr   ÚpprintZpformatr   r\   r+   r   )
rW   r`   rj   Zprovision_onlyr^   r0   rb   ra   r8   Zrewrite_envr)   )r_   r*   Úbuild$  s0     

ro   )N)F)(Z
__future__r   r   r   r   rn   ÚsysÚos.pathr   r   r   r   Z
setuptoolsZdistutils.msvc9compilerr	   rJ   r
   r   Zconda_buildr   Zconda_build.conda_interfacer   Zconda_build.utilsr   r   r   r   r   Zconda_build.variantsr   r   ÚplatformÚAssertionErrorrG   r+   r2   rO   rX   rd   ro   r)   r)   r)   r*   Ú<module>   s0   
y1!