U
    HaV                     @   sT   d Z ddlZddlmZ ddlT ddlmZ ddlmZ dd Z	G d	d
 d
eZ
dS )zdistutils.command.build_clib

Implements the Distutils 'build_clib' command, to build a C/C++ library
that is included in the module distribution and needed by an extension
module.    N)Command)*)customize_compiler)logc                  C   s   ddl m}  |   d S )Nr   show_compilers)distutils.ccompilerr   r    r	   L/tmp/pip-unpacked-wheel-i11yjail/setuptools/_distutils/command/build_clib.pyr      s    r   c                   @   sl   e Zd ZdZdddddgZddgZd	d
defgZdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zd
S )
build_clibz/build C/C++ libraries used by Python extensions)zbuild-clib=bz%directory to build C/C++ libraries to)zbuild-temp=tz,directory to put temporary build by-products)debuggz"compile with debugging information)forcefz2forcibly build everything (ignore file timestamps))z	compiler=czspecify the compiler typer   r   zhelp-compilerNzlist available compilersc                 C   s:   d | _ d | _d | _d | _d | _d | _d | _d| _d | _d S )Nr   )	r   
build_temp	librariesinclude_dirsdefineundefr   r   compilerselfr	   r	   r
   initialize_options4   s    zbuild_clib.initialize_optionsc                 C   sh   |  dddddd | jj| _| jr0| | j | jd krH| jjpDg | _t| jtrd| jtj	| _d S )Nbuild)r   r   )r   r   )r   r   )r   r   )r   r   )
set_undefined_optionsdistributionr   check_library_listr   
isinstancestrsplitospathsepr   r	   r	   r
   finalize_optionsD   s    

zbuild_clib.finalize_optionsc                 C   s   | j s
d S ddlm} || j| j| jd| _t| j | jd k	rN| j| j | j	d k	rv| j	D ]\}}| j
|| q^| jd k	r| jD ]}| j| q| | j  d S )Nr   )new_compiler)r   dry_runr   )r   r   r&   r   r'   r   r   r   Zset_include_dirsr   Zdefine_macror   Zundefine_macrobuild_libraries)r   r&   namevaluemacror	   r	   r
   run^   s"    




zbuild_clib.runc                 C   s   t |tstd|D ]z}t |ts8t|dkr8td|\}}t |tsRtdd|ksntjdkr~tj|kr~td|d  t |tstdqd	S )
a`  Ensure that the list of libraries is valid.

        `library` is presumably provided as a command option 'libraries'.
        This method checks that it is a list of 2-tuples, where the tuples
        are (library_name, build_info_dict).

        Raise DistutilsSetupError if the structure is invalid anywhere;
        just returns otherwise.
        z+'libraries' option must be a list of tuples   z*each element of 'libraries' must a 2-tuplezNfirst element of each tuple in 'libraries' must be a string (the library name)/z;bad library name '%s': may not contain directory separatorsr   zMsecond element of each tuple in 'libraries' must be a dictionary (build info)N)	r    listDistutilsSetupErrortuplelenr!   r#   sepdict)r   r   libr)   
build_infor	   r	   r
   r   v   s,    



zbuild_clib.check_library_listc                 C   s,   | j s
d S g }| j D ]\}}|| q|S )N)r   append)r   Z	lib_nameslib_namer6   r	   r	   r
   get_library_names   s    zbuild_clib.get_library_namesc                 C   sZ   |  | j g }| jD ]>\}}|d}|d ks>t|ttfsJtd| || q|S )Nsourcesfin 'libraries' option (library '%s'), 'sources' must be present and must be a list of source filenames)r   r   getr    r/   r1   r0   extend)r   	filenamesr8   r6   r:   r	   r	   r
   get_source_files   s    
zbuild_clib.get_source_filesc                 C   s   |D ]\}}| d}|d ks,t|ttfs8td| t|}td| | d}| d}| jj|| j	||| j
d}| jj||| j| j
d qd S )Nr:   r;   zbuilding '%s' librarymacrosr   )
output_dirr@   r   r   )rA   r   )r<   r    r/   r1   r0   r   infor   compiler   r   Zcreate_static_libr   )r   r   r8   r6   r:   r@   r   Zobjectsr	   r	   r
   r(      s,    


	
zbuild_clib.build_libraries)__name__
__module____qualname__descriptionuser_optionsboolean_optionsr   help_optionsr   r%   r,   r   r9   r?   r(   r	   r	   r	   r
   r      s(    $r   )__doc__r#   distutils.corer   distutils.errorsdistutils.sysconfigr   	distutilsr   r   r   r	   r	   r	   r
   <module>   s   