a
    åze&C  ã                   @   sz   d 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T ddl	m
Z
mZ ddlmZ G dd„ deƒZG d	d
„ d
eeƒZdS )zHdistutils.command.build_py

Implements the Distutils 'build_py' command.é    N)ÚCommand)Ú*)Úconvert_pathÚ	Mixin2to3)Úlogc                   @   sÂ   e Zd ZdZg d¢ZddgZddiZdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd.d#d$„Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-S )/Úbuild_pyz5"build" pure Python modules (copy to build directory)))z
build-lib=Údzdirectory to "build" (copy) to)ÚcompileÚczcompile .py to .pyc)ú
no-compileNz!don't compile .py files [default])z	optimize=ÚOzlalso compile with optimization: -O1 for "python -O", -O2 for "python -OO", and -O0 to disable [default: -O0])ÚforceÚfz2forcibly build everything (ignore file timestamps)r	   r   r   c                 C   s4   d | _ d | _d | _d | _d | _d| _d| _d | _d S )Nr   )Ú	build_libÚ
py_modulesÚpackageÚpackage_dataÚpackage_dirr	   Úoptimizer   ©Úself© r   ú0/usr/lib/python3.9/distutils/command/build_py.pyÚinitialize_options    s    zbuild_py.initialize_optionsc              	   C   s¨   |   ddd¡ | jj| _| jj| _| jj| _i | _| jjr^| jj ¡ D ]\}}t|ƒ| j|< qF|  ¡ | _	t
| jtƒs¤zt| jƒ| _W n ttfy¢   tdƒ‚Y n0 d S )NZbuild)r   r   )r   r   zoptimize must be 0, 1, or 2)Zset_undefined_optionsÚdistributionÚpackagesr   r   r   Úitemsr   Úget_data_filesÚ
data_filesÚ
isinstancer   ÚintÚ
ValueErrorÚAssertionErrorZDistutilsOptionError)r   ÚnameÚpathr   r   r   Úfinalize_options*   s$    þ



zbuild_py.finalize_optionsc                 C   s:   | j r|  ¡  | jr$|  ¡  |  ¡  |  | jdd¡ d S ©Nr   )Úinclude_bytecode)r   Úbuild_modulesr   Úbuild_packagesÚbuild_package_dataÚbyte_compileÚget_outputsr   r   r   r   ÚrunC   s    zbuild_py.runc                    s‚   g }| j s|S | j D ]h}|  |¡}tjj| jg| d¡ Ž }d‰ |rPt|ƒd ‰ ‡ fdd„|  ||¡D ƒ}| 	||||f¡ q|S )z?Generate list of '(package,src_dir,build_dir,filenames)' tuplesÚ.r   é   c                    s   g | ]}|ˆ d … ‘qS ©Nr   )Ú.0Úfile©Zplenr   r   Ú
<listcomp>s   s   z+build_py.get_data_files.<locals>.<listcomp>)
r   Úget_package_dirÚosr$   Újoinr   ÚsplitÚlenÚfind_data_filesÚappend)r   Údatar   Úsrc_dirÚ	build_dirÚ	filenamesr   r3   r   r   a   s    



ÿzbuild_py.get_data_filesc                    sd   | j  dg ¡| j  |g ¡ }g ‰ |D ]:}t tj t |¡t|ƒ¡¡}ˆ  ‡ fdd„|D ƒ¡ q$ˆ S )z6Return filenames for package's data files in 'src_dir'Ú c                    s$   g | ]}|ˆ vrt j |¡r|‘qS r   )r6   r$   Úisfile)r1   Úfn©Úfilesr   r   r4   ‚   s   ÿz,build_py.find_data_files.<locals>.<listcomp>)	r   ÚgetÚglobr6   r$   r7   Úescaper   Úextend)r   r   r=   ZglobsÚpatternZfilelistr   rC   r   r:   y   s    ÿzbuild_py.find_data_filesc                 C   s`   d}| j D ]P\}}}}|D ]>}tj ||¡}|  tj |¡¡ | jtj ||¡|dd qq
dS )z$Copy data files into build directoryNF©Zpreserve_mode)r   r6   r$   r7   ÚmkpathÚdirnameÚ	copy_file)r   Zlastdirr   r=   r>   r?   ÚfilenameÚtargetr   r   r   r*   †   s    ÿzbuild_py.build_package_datac                 C   s¾   |  d¡}| js&|r tjj|Ž S dS n”g }|r†z| jd |¡ }W n( tyj   | d|d ¡ |d= Y q*0 | d|¡ tjj|Ž S q*| j d¡}|dur¦| d|¡ |r¶tjj|Ž S dS dS )z½Return the directory, relative to the top of the source
           distribution, where package 'package' should be found
           (at least according to the 'package_dir' option, if any).r.   r@   r   éÿÿÿÿN)r8   r   r6   r$   r7   ÚKeyErrorÚinsertrE   )r   r   r$   ÚtailZpdirr   r   r   r5      s(    
	zbuild_py.get_package_dirc                 C   sj   |dkr8t j |¡s td| ƒ‚t j |¡s8td| ƒ‚|rft j |d¡}t j |¡rZ|S t d|¡ d S )Nr@   z%package directory '%s' does not existz>supposed package directory '%s' exists, but is not a directoryz__init__.pyz8package init file '%s' not found (or not a regular file))	r6   r$   ÚexistsZDistutilsFileErrorÚisdirr7   rA   r   Úwarn)r   r   r   Úinit_pyr   r   r   Úcheck_package·   s&    ÿÿÿÿzbuild_py.check_packagec                 C   s&   t j |¡st d||¡ dS dS d S )Nz!file %s (for module %s) not foundFT)r6   r$   rA   r   rV   )r   ÚmoduleÚmodule_filer   r   r   Úcheck_moduleÒ   s    zbuild_py.check_modulec           	      C   s”   |   ||¡ t tj t |¡d¡¡}g }tj | jj¡}|D ]P}tj |¡}||kr€tj 	tj 
|¡¡d }| |||f¡ q>|  d| ¡ q>|S )Nz*.pyr   zexcluding %s)rX   rF   r6   r$   r7   rG   Úabspathr   Zscript_nameÚsplitextÚbasenamer;   Zdebug_print)	r   r   r   Zmodule_filesÚmodulesZsetup_scriptr   Zabs_frY   r   r   r   Úfind_package_modulesÙ   s    zbuild_py.find_package_modulesc              	   C   sÎ   i }g }| j D ]º}| d¡}d |dd… ¡}|d }z|| \}}W n  tyf   |  |¡}d}Y n0 |s˜|  ||¡}	|df||< |	r˜| |d|	f¡ tj ||d ¡}
|  	||
¡s¸q| |||
f¡ q|S )aÈ  Finds individually-specified Python modules, ie. those listed by
        module name in 'self.py_modules'.  Returns a list of tuples (package,
        module_base, filename): 'package' is a tuple of the path through
        package-space to the module; 'module_base' is the bare (no
        packages, no dots) module name, and 'filename' is the path to the
        ".py" file (relative to the distribution root) that implements the
        module.
        r.   r   rP   r/   Ú__init__ú.py)
r   r8   r7   rQ   r5   rX   r;   r6   r$   r[   )r   r   r_   rY   r$   r   Zmodule_baser   ÚcheckedrW   rZ   r   r   r   Úfind_modulesè   s*    



zbuild_py.find_modulesc                 C   sN   g }| j r| |  ¡ ¡ | jrJ| jD ]$}|  |¡}|  ||¡}| |¡ q$|S )a4  Compute the list of all modules that will be built, whether
        they are specified one-module-at-a-time ('self.py_modules') or
        by whole packages ('self.packages').  Return a list of tuples
        (package, module, module_file), just like 'find_modules()' and
        'find_package_modules()' do.)r   rH   rd   r   r5   r`   )r   r_   r   r   Úmr   r   r   Úfind_all_modules  s    

zbuild_py.find_all_modulesc                 C   s   dd„ |   ¡ D ƒS )Nc                 S   s   g | ]}|d  ‘qS )rP   r   )r1   rY   r   r   r   r4   -  ó    z-build_py.get_source_files.<locals>.<listcomp>)rf   r   r   r   r   Úget_source_files,  s    zbuild_py.get_source_filesc                 C   s$   |gt |ƒ |d g }tjj|Ž S )Nrb   )Úlistr6   r$   r7   )r   r>   r   rY   Zoutfile_pathr   r   r   Úget_module_outfile/  s    zbuild_py.get_module_outfiler/   c                 C   sš   |   ¡ }g }|D ]p\}}}| d¡}|  | j||¡}| |¡ |r| jr^| tjj|dd¡ | j	dkr| tjj|| j	d¡ q|dd„ | j
D ƒ7 }|S )Nr.   r@   )Úoptimizationr   c                 S   s,   g | ]$\}}}}|D ]}t j ||¡‘qqS r   )r6   r$   r7   )r1   r   r=   r>   r?   rN   r   r   r   r4   B  s   
þz(build_py.get_outputs.<locals>.<listcomp>)rf   r8   rj   r   r;   r	   Ú	importlibÚutilÚcache_from_sourcer   r   )r   r'   r_   Zoutputsr   rY   rZ   rN   r   r   r   r,   3  s&    


ÿ

ÿ
þzbuild_py.get_outputsc                 C   sb   t |tƒr| d¡}nt |ttfƒs,tdƒ‚|  | j||¡}tj	 
|¡}|  |¡ | j||ddS )Nr.   z:'package' must be a string (dot-separated), list, or tupler   rJ   )r   Ústrr8   ri   ÚtupleÚ	TypeErrorrj   r   r6   r$   rL   rK   rM   )r   rY   rZ   r   ZoutfileÚdirr   r   r   Úbuild_moduleJ  s    
ÿ
zbuild_py.build_modulec                 C   s*   |   ¡ }|D ]\}}}|  |||¡ qd S r0   )rd   rs   )r   r_   r   rY   rZ   r   r   r   r(   Y  s    zbuild_py.build_modulesc                 C   sD   | j D ]8}|  |¡}|  ||¡}|D ]\}}}|  |||¡ q$qd S r0   )r   r5   r`   rs   )r   r   r   r_   Zpackage_rY   rZ   r   r   r   r)   b  s
    


zbuild_py.build_packagesc                 C   s€   t jr|  d¡ d S ddlm} | j}|d tjkr>|tj }| jrZ||d| j	|| j
d | jdkr|||| j| j	|| j
d d S )Nz%byte-compiling is disabled, skipping.r   )r+   rP   )r   r   ÚprefixÚdry_run)ÚsysÚdont_write_bytecoderV   Údistutils.utilr+   r   r6   Úsepr	   r   ru   r   )r   rD   r+   rt   r   r   r   r+   v  s    


ÿ

ÿzbuild_py.byte_compileN)r/   )Ú__name__Ú
__module__Ú__qualname__ÚdescriptionZuser_optionsZboolean_optionsZnegative_optr   r%   r-   r   r:   r*   r5   rX   r[   r`   rd   rf   rh   rj   r,   rs   r(   r)   r+   r   r   r   r   r      s.   


'4
	r   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Úbuild_py_2to3c                 C   sL   g | _ | jr|  ¡  | jr*|  ¡  |  ¡  |  | j ¡ |  | jdd¡ d S r&   )	Úupdated_filesr   r(   r   r)   r*   Zrun_2to3r+   r,   r   r   r   r   r-   ‹  s    zbuild_py_2to3.runc                 C   s,   t  | |||¡}|d r(| j |d ¡ |S )Nr/   r   )r   rs   r   r;   )r   rY   rZ   r   Úresr   r   r   rs   ›  s    zbuild_py_2to3.build_moduleN)rz   r{   r|   r-   rs   r   r   r   r   r~   Š  s   r~   )Ú__doc__r6   Úimportlib.utilrl   rv   rF   Zdistutils.corer   Zdistutils.errorsrx   r   r   Z	distutilsr   r   r~   r   r   r   r   Ú<module>   s     }