B
    XM\Iv                 @   s.  d Z ddlmZmZmZ ddlZddlm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Zddl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 ddlmZmZmZmZ ej dkZ!dZ"dd Z#dZ$ddddddddZ%eddZ&dd Z'dd Z(G dd de)Z*d!dd Z+e* j,Z,dS )"z'
Module to store conda build settings.
    )absolute_importdivisionprint_functionN)
namedtuple)abspath
expanduserjoin
expandvars   )root_dirroot_writable)binstar_upload)get_default_variant)cc_platformcc_conda_buildsubdir)get_build_foldersrm_rf
get_loggerget_conda_operation_lockswin32zconda-buildc             C   s4   t j| s0yt |  W n tk
r.   Y nX d S )N)ospathisdirmakedirsOSError)r    r   1lib/python3.7/site-packages/conda_build/config.py_ensure_dir   s
    r      zlinux-64zlinux-32zosx-64zwin-64zwin-32)zlinux-cos5-x86_64zlinux-cos6-x86_64zlinux-cos5-x86zlinux-cos6-x86zosx-109-x86_64z
win-x86_64zwin-x86ZConfigSettingzname, defaultc            ?   C   s^  t ddt dtt ddt dg t ddt ddt d	dt d
dt ddt dd t dd t dg t ddt ddt ddt ddt ddt dd t ddt dtt ddt ddt ddt ddt dd t dd t dtdd  d kt d!dt d"td#rttttd#nd t d$dt d%dt d&td&d' d kt d(td(d' d kt d)td)d' d kt d*d t d+dt d,d t d-d t d.d t d/g t d0g t d1dt d2d3t d4d t d5d t d6d t d7d8t d9d t d:dt d;d<t d=d t d>d t d?d@t dAdt dBtdBg t dCtdCdt dDdt dEdt dFd t dGg t dHd g=S )INZactivateTZanaconda_uploadZforce_uploadZchannel_urlsdirtyFZinclude_recipeZno_download_sourceZoverride_channelsZskip_existingtokenuserlabelsverbosedebugZtimeouti  set_build_idZdisable_pip_output_folderZprefix_length_fallback_prefix_lengthlong_test_prefixlockingZmax_env_retry   Zremove_work_dir_host_platform
_host_archZfilename_hashingtruekeep_old_work_src_cache_root	cache_dirZcopy_test_source_filesZ	trim_skipZerror_overlinkingZfalseZerror_overdependingZno_rewrite_stdout_envindexZbuild_is_host	_platform_arch_target_subdirZvariant_config_filesexclusive_config_filesZignore_system_variantsZhash_length   Zappend_sections_fileZclobber_sections_fileZ	bootstrapZgit_commits_since_tagr   ZpasswordZsignZ	sign_withZgpgZidentityZconfig_fileZ
repositoryZpypitestZverifyZignore_verify_codesZexit_on_verify_errorZmerge_build_host_merge_build_hostZ
stats_fileZ
extra_deps_pip_cache_dir)	Settingr   DEFAULT_PREFIX_LENGTHr   getlowerr   r   r	   r   r   r   r   _get_default_settings;   s    
&


r>   c                s    fdd}|S )Nc                 s$   t t}|d j  | |S )NzWARNING: attribute {} is deprecated and will be removed in conda-build 4.0.  Please update your code - file issues on the conda-build issue tracker if you need help.)r   __name__warnformat)argskwlog)funcr   r   func_wrapper   s    
z8print_function_deprecation_warning.<locals>.func_wrapperr   )rE   rF   r   )rE   r   "print_function_deprecation_warning   s    rG   c                   s  e Zd Ze ZZeZeZd fdd	Zdd Zdd Z	e
dd	 Zejd
d	 Ze
dd Zejdd Ze
dd Ze
dd Zejdd Ze
dd Zdd Ze
dd Ze
dd Zejdd Ze
dd Zejdd Ze
dd  Zejd!d  Ze
d"d# Zejd$d# Ze
d%d& Zejd'd& Ze
d(d) Zejd*d) Ze
d+d, Zejd-d, Ze
d.d/ Ze
ed0d1 Zejed2d1 Ze
ed3d4 Zejed5d4 Ze
ed6d7 Zejed8d7 Ze
ed9d: Zejed;d: Ze
ed<d= Z e jed>d= Z d?d@ Z!dAdB Z"dCdD Z#dEdF Z$dGdH Z%ddJdKZ&e
dLdM Z'e'jdNdM Z'e
dOdP Z(e(jdQdP Z(e
dRdS Z)e
dTdU Z*e
dVdW Z+e
dXdY Z,e
dZd[ Z-d\d] Z.e
d^d_ Z/e
d`da Z0e
dbdc Z1e
ddde Z2dfdg Z3dhdi Z4djdk Z5dldm Z6dndo Z7e
dpdq Z8e
drds Z9e
dtdu Z:e
dvdw Z;e
dxdy Z<e
dzd{ Z=e
d|d} Z>e
d~d Z?e
dd Z@e
dd ZAe
dd ZBeBjdd ZBe
dd ZCe
dd ZDdddZEdd ZFdd ZGdd ZHdd ZI  ZJS )ConfigNc                s>   t t|   |pi | _| jf | | jr:tj| j| _d S )N)	superrH   __init__variantset_keysr0   r   r   r   )selfrK   kwargs)	__class__r   r   rJ      s
    
zConfig.__init__c             C   s>   | |t| |rt| |n|}t| || ||kr:||= d S )N)r<   hasattrgetattrsetattr)rM   rN   attrdefaultvaluer   r   r   _set_attribute_from_kwargs   s     z!Config._set_attribute_from_kwargsc                s   fdd  fdd}xdD ]}|j | q W dtdd_d	d }d
d }|rtjtjtj|_	|rtjtj|_
ntdd _
x t D ]}|j|j qW x  D ]\}}t|| qW d S )Nc                s     | d }|s^| dkrd} n| dkr,d} n| dkr8d} d|   }t|rXt|n|}nt|tr|t|dkr||d	 }|S )
NpythonpynumpyZnpyr_baserZCONDA_r
   r   )popupperr   getenv
isinstancelistlen)langrT   versionvar)rN   r   r   env   s    zConfig.set_keys.<locals>.envc                sH    |j |}|rDdt|kr<d|d |dd  f}|| |< d S )N.r   r
   )rK   r<   strr   )rK   rb   rU   )re   rM   r   r   set_lang   s
    z!Config.set_keys.<locals>.set_lang)perlluarW   rY   rZ   build_id	_build_id r1   croot_croot)rK   r\   rQ   rl   r   r   r   normpathr   r0   ro   r>   rV   namerT   itemsrR   )rM   rN   rh   rb   Zsource_cachern   rU   rq   r   )re   rN   rM   r   rL      s"    	
zConfig.set_keysc             C   s   | j ptddd S )z_Always the native (build system) arch, except when pretending to be some
        other platform-r
   )r4   r   rsplit)rM   r   r   r   arch  s    zConfig.archc             C   s    t t}|d t|| _d S )NzSetting build arch. This is only useful when pretending to be on another arch, such as for rendering necessary dependencies on a non-native arch. I trust that you know what you're doing.)r   r?   r@   rg   r4   )rM   rU   rD   r   r   r   ru   
  s    
c             C   s   | j ptddd S )z]Always the native (build system) OS, except when pretending to be some
        other platformrs   r
   r   )r3   r   rt   )rM   r   r   r   platform  s    zConfig.platformc             C   s,   t t}|d |dkr"td|| _d S )NzSetting build platform. This is only useful when pretending to be on another platform, such as for rendering necessary dependencies on a non-native platform. I trust that you know what you're doing.noarchzCconfig platform should never be noarch.  Set host_platform instead.)r   r?   r@   
ValueErrorr3   )rM   rU   rD   r   r   r   rv     s
    
c             C   s   d | j| jfS )zDetermines channel to download build env packages from.
        Should generally be the native platform.  Does not preclude packages from noarch.rs   )r   rv   ru   )rM   r   r   r   build_subdir#  s    zConfig.build_subdirc             C   sD   y | j d| jddd }W n tk
r8   d}Y nX | jpB|S )Ntarget_platformrs   r
   @   )rK   r<   ry   split
IndexErrorr-   )rM   Zvariant_archr   r   r   	host_arch)  s
     
zConfig.host_archc             C   s
   || _ d S )N)r-   )rM   rU   r   r   r   r~   1  s    c             C   s
   | j dkS )Nrw   )host_platform)rM   r   r   r   rw   5  s    zConfig.noarchc             C   s   | j tkst| _ d S )N)rv   r   )rM   r   r   r   reset_platform9  s    
zConfig.reset_platformc             C   s   d | jt| jgS )Nrs   )r   rv   rg   ru   )rM   r   r   r   r   =  s    zConfig.subdirc             C   s"   | j p | jd| jddd S )Nrz   rs   r
   r   )r,   rK   r<   ry   r|   )rM   r   r   r   r   A  s    zConfig.host_platformc             C   s
   || _ d S )N)r,   )rM   rU   r   r   r   r   F  s    c             C   s^   | j d| j}| jdkr"| j}n0|d| jt| jgkrRd| jt| jg}t||S )Nrz   rw   rs   )rK   r<   ry   r   r   rg   r~   SUBDIR_ALIASES)rM   r   r   r   r   host_subdirJ  s    
zConfig.host_subdirc             C   s<   t ||}|dd}|d | _t|dkr8|d | _d S )Nrs   r
   r   )r   r<   rt   r   ra   r~   )rM   rU   valuesr   r   r   r   S  s
    
c             C   s   | j p
| jS )N)r5   r   )rM   r   r   r   target_subdir[  s    zConfig.target_subdirc             C   s
   || _ d S )N)r5   )rM   rU   r   r   r   r   _  s    c             C   s   | j r| j d S d S )Nr   )r6   )rM   r   r   r   exclusive_config_filec  s    
zConfig.exclusive_config_filec             C   s2   t | jdkrtd|d kr&g | _n|g| _d S )Nr
   zYCannot set singular exclusive_config_file if multiple exclusive_config_files are present.)ra   r6   rx   )rM   rU   r   r   r   r   i  s    c             C   s   | j r| j S | jS )N)r0   rn   )rM   r   r   r   src_cache_roott  s    zConfig.src_cache_rootc             C   s
   || _ d S )N)r0   )rM   rU   r   r   r   r   x  s    c             C   sl   | j sftd}td}|r.tt|| _ n8|rFttt|| _ n trXt	t
d| _ nttd| _ | j S )z1This is where source caches and work folders liveZCONDA_BLD_PATHzroot-dirz	conda-bldz~/conda-bld)ro   r   r^   r   r<   r   r   r	   r   r   r   )rM   Z_bld_root_envZ_bld_root_rcr   r   r   rn   |  s    

zConfig.crootc             C   s
   || _ dS )zBSet croot - if None is passed, then the default value will be usedN)ro   )rM   rn   r   r   r   rn     s    c             C   s   | j p
| jS )N)r'   rn   )rM   r   r   r   output_folder  s    zConfig.output_folderc             C   s
   || _ d S )N)r'   )rM   rU   r   r   r   r     s    c             C   s   t j| j| jS )z`This is the core folder for a given build.
        It has the environments and work directories.)r   r   r   rn   rk   )rM   r   r   r   build_folder  s    zConfig.build_folderc             C   s   | j dt| d S )Nrj   )rK   r<   r   )rM   r   r   r   	CONDA_LUA  s    zConfig.CONDA_LUAc             C   s   || j d< d S )Nrj   )rK   )rM   rU   r   r   r   r     s    c             C   s*   | j dt| d }td|dS )NrW   rm   rf   )rK   r<   r   intr   r|   )rM   rU   r   r   r   CONDA_PY  s    zConfig.CONDA_PYc             C   s,   t |}d|d |dd  f| jd< d S )Nrf   r   r
   rW   )rg   r   rK   )rM   rU   r   r   r   r     s    c             C   s*   | j dt| d }td|dS )NrY   rm   rf   )rK   r<   r   r   r   r|   )rM   rU   r   r   r   	CONDA_NPY  s    zConfig.CONDA_NPYc             C   s,   t |}d|d |dd  f| jd< d S )Nrf   r   r
   rY   )rg   r   rK   )rM   rU   r   r   r   r     s    c             C   s   | j dt| d S )Nri   )rK   r<   r   )rM   r   r   r   
CONDA_PERL  s    zConfig.CONDA_PERLc             C   s   || j d< d S )Nri   )rK   )rM   rU   r   r   r   r     s    c             C   s   | j dt| d S )NrZ   )rK   r<   r   )rM   r   r   r   CONDA_R  s    zConfig.CONDA_Rc             C   s   || j d< d S )NrZ   )rK   )rM   rU   r   r   r   r     s    c             C   sX   | ds|dkrJtjdkrJtjtj|dr>t|d}qTt|d}n
t|d}|S )Nwinrw   r   zpython_d.exez
python.exez
bin/python)
startswithsysrv   r   r   isfiler   )rM   prefixrv   resr   r   r   _get_python  s    
zConfig._get_pythonc             C   s(   | drt|ddd}n
t|d}|S )Nr   Librarybinzperl.exezbin/perl)r   r   )rM   r   rv   r   r   r   r   	_get_perl  s    

zConfig._get_perlc             C   sb   | j dt| d }|r*|d dkr*dnd}|drNt|ddd|}nt|d	|}|S )
Nrj   r   2Zluajitr   r   r   z{}.exezbin/{})rK   r<   r   r   r   rA   )rM   r   rv   Zlua_verZbinary_namer   r   r   r   _get_lua  s    
zConfig._get_luac             C   s@   | dr0t|dd}tj|s<t|dd}nt|dd}|S )Nr   ScriptszR.exer   R)r   r   r   r   exists)rM   r   rv   r   r   r   r   _get_r  s    
zConfig._get_rc             C   s@   | dr0t|dd}tj|s<t|dd}nt|dd}|S )Nr   r   zRscript.exer   ZRscript)r   r   r   r   r   )rM   r   rv   r   r   r   r   _get_rscript  s    
zConfig._get_rscriptFc                s   | j r| jr|rtj r$tddd t| jD }t fdd|D }| j	rd|rd|d | _nRt
t| jdkr~| jnd} d ttt d	  }|| _|rt|| j d S )
NzOpackage name should not be a absolute path, to preserve croot during path joinsc             S   s   g | ]}t j|qS r   )r   r   basename).0Zfldrr   r   r   
<listcomp>
  s    z+Config.compute_build_id.<locals>.<listcomp>c                s&   g | ]}|d | d  kr|qS )N_)rfind)r   r   )package_namer   r   r     s    r   rm   r   i  )r&   rl   r   r   isabsAssertionErrorr   rn   sortedr    ra   listdirwork_dirrg   r   timeshutilZmove)rM   r   resetZfolder_basenamesZbuild_foldersZold_dirrk   r   )r   r   compute_build_id  s    
zConfig.compute_build_idc             C   s   | j S )zThis is a per-build (almost) unique id, consisting of the package being built, and the
        time since the epoch, in ms.  It is appended to build and test prefixes, and used to create
        unique work folders for build and test.)rl   )rM   r   r   r   rk     s    zConfig.build_idc             C   s.   | d d}tj|r$td|| _d S )N/\zLbuild_id should not be an absolute path, to preserve croot during path joins)rstripr   r   r   r   rl   )rM   rl   r   r   r   rk   !  s    c             C   s   | j S )N)r(   )rM   r   r   r   prefix_length(  s    zConfig.prefix_lengthc             C   s
   || _ d S )N)r(   )rM   lengthr   r   r   r   ,  s    c             C   s   t | jdS )NZ_h_env)r   r   )rM   r   r   r   _short_host_prefix0  s    zConfig._short_host_prefixc             C   sR   | j t| j }d}tt|t| d }| j||  d | j  }t| j|S )N
_placeholdr
   )r   ra   r   r   mathceilmax)rM   placeholder_lengthplaceholderrepeatsr   r   r   _long_host_prefix4  s
    zConfig._long_host_prefixc             C   s   | j r| j}nt| jd}|S )zThe temporary folder where the build environment is created.  The build env contains
        libraries that may be linked, but only if the host env is not specified.  It is placed on
        PATH.Z
_build_env)r8   host_prefixr   r   )rM   r   r   r   r   build_prefix<  s    zConfig.build_prefixc             C   s   t r
| jS | jS )zThe temporary folder where the host environment is created.  The host env contains
        libraries that may be linked.  It is not placed on PATH.)on_winr   r   )rM   r   r   r   r   G  s    zConfig.host_prefixc             C   s   t | jdS )NZ	_test_env)r   r   )rM   r   r   r   _short_test_prefixO  s    zConfig._short_test_prefixc             C   sL   | j t| }d}tt|t| d }|||  d | j  }t||S )Nr   r
   )r   ra   r   r   r   r   )rM   base_prefixr   r   r   r   r   r   _long_prefixS  s
    zConfig._long_prefixc             C   s   t s
| js| jS | | jS )z:The temporary folder where the test environment is created)r   r)   r   r   )rM   r   r   r   test_prefixZ  s    
zConfig.test_prefixc             C   s   |  | j| jS )N)
python_binr   rv   )rM   r   r   r   build_pythona  s    zConfig.build_pythonc             C   s   |  | j| jS )N)r   r   r   )rM   r   r   r   host_pythone  s    zConfig.host_pythonc             C   s   |  | j| jS )N)r   r   r   )rM   r   r   r   test_pythoni  s    zConfig.test_pythonc             C   s   |  ||S )N)r   )rM   r   rv   r   r   r   r   m  s    zConfig.python_binc             C   s   |  ||S )N)r   )rM   r   rv   r   r   r   perl_binp  s    zConfig.perl_binc             C   s   |  ||S )N)r   )rM   r   rv   r   r   r   lua_bins  s    zConfig.lua_binc             C   s   |  ||S )N)r   )rM   r   rv   r   r   r   r_binv  s    zConfig.r_binc             C   s   |  ||S )N)r   )rM   r   rv   r   r   r   rscript_biny  s    zConfig.rscript_binc             C   s   t | jd}t| |S )zIPath to the info dir in the build prefix, where recipe metadata is storedinfo)r   r   r   )rM   r   r   r   r   info_dir|  s    zConfig.info_dirc             C   s   t | jd}t| |S )zaPath to the conda-meta dir in the build prefix, where package index json files are
        storedz
conda-meta)r   r   r   )rM   r   r   r   r   meta_dir  s    zConfig.meta_dirc             C   s   t | jd}t| |S )z2Where packages that fail the test phase are placedZbroken)r   rn   r   )rM   r   r   r   r   
broken_dir  s    zConfig.broken_dirc             C   s   t | j| j}t| |S )z! Dir where the package is saved. )r   rn   r   r   )rM   r   r   r   r   bldpkgs_dir  s    zConfig.bldpkgs_dirc             C   s$   t | j| jt | jtt | jdhS )z. Dirs where previous build packages might be. rw   )r   rn   r   r   )rM   r   r   r   bldpkgs_dirs  s    zConfig.bldpkgs_dirsc             C   s   t | jd}t| |S )z6Where tarballs and zip files are downloaded and stored	src_cache)r   r   r   )rM   r   r   r   r   r     s    zConfig.src_cachec             C   s   t | jd}t| |S )z,Where local clones of git sources are stored	git_cache)r   r   r   )rM   r   r   r   r   r     s    zConfig.git_cachec             C   s   t | jd}t| |S )z+Where local clones of hg sources are storedhg_cache)r   r   r   )rM   r   r   r   r   r     s    zConfig.hg_cachec             C   s   t | jd}t| |S )z/Where local checkouts of svn sources are stored	svn_cache)r   r   r   )rM   r   r   r   r   r     s    zConfig.svn_cachec             C   s   t | jd}t| |S )z6Where the source for the build is extracted/copied to.Zwork)r   r   r   )rM   r   r   r   r   r     s    zConfig.work_dirc             C   s   | j pt| jd}t| |S )NZ	pip_cache)r9   r   r   r   )rM   r   r   r   r   pip_cache_dir  s    zConfig.pip_cache_dirc             C   s
   || _ d S )N)r9   )rM   r   r   r   r   r     s    c             C   s   t | jd}t| |S )zTThe temporary folder where test files are copied to, and where tests start executionZtest_tmp)r   r   r   )rM   r   r   r   r   test_dir  s    zConfig.test_dirc             C   s   | j | jkS )N)r   ry   )rM   r   r   r   subdirs_same  s    zConfig.subdirs_sameTc          
   C   s   |rt | ds| jr.tj| jr`t| j n2x0| j| j| j	| j
gD ]}tj|rDt| qDW tjtj| jdrttj| jd n td| jd| jd| j
d| j	d	 x.t| j| jD ]}tj|jrt|j qW d S )Nr    Zprefix_filesz)
Leaving build/test directories:
  Work:
z	
  Test:
z:
Leaving build/test environments:
  Test:
source activate z
  Build:
source activate z

)rQ   rk   r   r   r   r   r   r   r   r   r   r   r   printr   r*   r   Z	lock_file)rM   remove_foldersr   lockr   r   r   clean  s&    zConfig.cleanc             C   s   x| j D ]}t| qW d S )N)r   r   )rM   Zfolderr   r   r   
clean_pkgs  s    zConfig.clean_pkgsc             C   s4   t  | }t | j|_t| dr0t | j|_|S )Nvariants)copydeepcopyrK   rP   r   )rM   newr   r   r   r     s
    

zConfig.copyc             C   s   d S )Nr   )rM   r   r   r   	__enter__  s    zConfig.__enter__c             C   sD   t | ds4|d kr4t | ds4ttd |   n| jdd d S )Nr    r/   zh--dirty flag and --keep-old-work not specified. Removing build/test folder after successful build/test.
F)r   )rQ   r   r?   r   r   )rM   Ze_typeZe_value	tracebackr   r   r   __exit__  s    
zConfig.__exit__)N)F)T)Kr?   
__module____qualname____file____path____package____doc__rJ   rV   rL   propertyru   setterrv   ry   r~   rw   r   r   r   r   r   r   r   rn   r   r   rG   r   r   r   r   r   r   r   r   r   r   r   rk   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   r   )rO   r   rH      s   2	
	



rH   c             K   s<   | st |d} n|  } |r(| jf | |r8| j| | S )zOAlways returns a new object - never changes the config that might be passed in.)rK   )rH   r   rL   rK   update)ZconfigrK   rN   r   r   r   get_or_merge_config  s    r   )N)-r   Z
__future__r   r   r   r   collectionsr   r   r   os.pathr   r   r   r	   r   r   r   Zconda_interfacer   r   r   r   r   r   r   r   Zutilsr   r   r   r   rv   r   Zconda_buildr   r;   r   r:   r>   rG   objectrH   r   rn   r   r   r   r   <module>   sF   

z
    V
