� i f C�@s�dZddlZddlZddlZddlmZddlmZddlTddl m Z m Z ddl m Z Gdd �d e�ZGd d �d ee �ZdS) zHdistutils.command.build_py Implements the Distutils 'build_py' command.�N)�glob)�Command)�*)� convert_path� Mixin2to3)�logc@s+eZdZdZd8d9d:d;d<gZddgZidd6Zdd�Zdd�Zdd�Z dd�Z dd�Z dd�Z dd�Z dd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.d/�Zd0d1�Zd2d3�Zd4d5�Zd6d7�Zd S)=�build_pyz5"build" pure Python modules (copy to build directory)� build-lib=�d�directory to "build" (copy) to�compile�c�compile .py to .pyc� no-compileN�!don't compile .py files [default]� optimize=�O�lalso compile with optimization: -O1 for "python -O", -O2 for "python -OO", and -O0 to disable [default: -O0]�force�f�2forcibly build everything (ignore file timestamps)cCsLd|_d|_d|_d|_d|_d|_d|_d|_dS)Nr)� build_lib� py_modules�package� package_data� package_dirr �optimizer)�self�r�?/opt/alt/python34/lib64/python3.4/distutils/command/build_py.py�initialize_options s       zbuild_py.initialize_optionsc Cs|jddd�|jj|_|jj|_|jj|_i|_|jjr�x6|jjj�D]\}}t|�|j|<qhWn|j�|_ t |j t �sy;t |j �|_ d|j ko�dkns�t �Wqtt fk rtd��YqXndS) NZbuildrrr�zoptimize must be 0, 1, or 2)� build_libr")�forcer#)Zset_undefined_options� distribution�packagesrrr�itemsr�get_data_files� data_files� isinstancer�int�AssertionError� ValueErrorZDistutilsOptionError)r�name�pathrrr�finalize_options*s"   )zbuild_py.finalize_optionscCsS|jr|j�n|jr6|j�|j�n|j|jdd��dS)N�include_bytecoder)r� build_modulesr%�build_packages�build_package_data� byte_compile� get_outputs)rrrr�runCs      z build_py.runcs�g}|js|Sx�|jD]�}|j|�}tjj|jg|jd��}d�|rvt|�d�n�fdd�|j||�D�}|j ||||f�qW|S)z?Generate list of '(package,src_dir,build_dir,filenames)' tuples�.r�cs g|]}|�d��qS)Nr)�.0�file)�plenrr� <listcomp>ts 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)r;rr'as %%zbuild_py.get_data_filescs�|jjdg�|jj|g�}g�xO|D]G}ttjj|t|���}�j�fdd�|D��q5W�S)z6Return filenames for package's data files in 'src_dir'�cs4g|]*}|�krtjj|�r|�qSr)r>r.�isfile)r9�fn)�filesrrr<�s z,build_py.find_data_files.<locals>.<listcomp>)r�getrr>r.r?r�extend)rrrEZglobs�patternZfilelistr)rKrrBys !$zbuild_py.find_data_filescCs�d}x�|jD]v\}}}}xa|D]Y}tjj||�}|jtjj|��|jtjj||�|dd�q)WqWdS)z$Copy data files into build directoryN� preserve_modeF)r(r>r.r?�mkpath�dirname� copy_file)rZlastdirrrErFrG�filename�targetrrrr3�s zbuild_py.build_package_datac Cs|jd�}|js5|r.tjj|�SdSn�g}x�|r�y|jdj|�}Wn-tk r�|jd|d�|d=Yq>X|jd|�tjj|�Sq>W|jjd�}|dk r�|jd|�n|r�tjj|�SdSdS)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).r7rHrr8N���rU)r@rr>r.r?�KeyError�insertrL)rrr.�tailZpdirrrrr=�s(      zbuild_py.get_package_dircCs�|dkrYtjj|�s1td|��ntjj|�sYtd|��qYn|r�tjj|d�}tjj|�r�|Stjdd|�ndS)NrHz%package directory '%s' does not existz>supposed package directory '%s' exists, but is not a directoryz __init__.pyz!package init file '%s' not found z(or not a regular file)) r>r.�existsZDistutilsFileError�isdirr?rIr�warn)rrr�init_pyrrr� check_package�s  zbuild_py.check_packagecCs1tjj|�s)tjd||�dSdSdS)Nz!file %s (for module %s) not foundFT)r>r.rIrr[)r�module� module_filerrr� check_module�szbuild_py.check_modulec Cs�|j||�ttjj|d��}g}tjj|jj�}xx|D]p}tjj|�}||kr�tjjtjj |��d}|j |||f�qP|j d|�qPW|S)Nz*.pyrz excluding %s) r]rr>r.r?�abspathr$Z script_name�splitext�basenamerCZ debug_print) rrrZ module_files�modulesZ setup_scriptrZabs_fr^rrr�find_package_modules�s  "zbuild_py.find_package_modulesc Cs%i}g}x|jD]}|jd�}dj|dd��}|d}y||\}}Wn'tk r�|j|�}d}YnX|s�|j||�} |df||<| r�|j|d| f�q�ntjj||d�} |j || �sqn|j||| f�qW|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. r7rr8�__init__z.pyrUrU) rr@r?rVr=r]rCr>r.r`) rr%rdr^r.rZ module_baserZcheckedr\r_rrr� find_modules�s*   zbuild_py.find_modulescCswg}|jr%|j|j��n|jrsxB|jD]4}|j|�}|j||�}|j|�q8Wn|S)a4Compute 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.)rrMrgr%r=re)rrdrr�mrrr�find_all_moduless  zbuild_py.find_all_modulescCsdd�|j�D�S)NcSsg|]}|d�qS)r8rUr)r9r^rrrr<-s z-build_py.get_source_files.<locals>.<listcomp>)ri)rrrr�get_source_files,szbuild_py.get_source_filescCs.|gt|�|dg}tjj|�S)Nz.py)�listr>r.r?)rrFrr^Z outfile_pathrrr�get_module_outfile/szbuild_py.get_module_outfiler8cCs�|j�}g}x�|D]�\}}}|jd�}|j|j||�}|j|�|r|jr�|jtjj|dd��n|j dkr�|jtjj|dd��q�qqW|dd�|j D�7}|S)Nr7�debug_overrideTrFcSs>g|]4\}}}}|D]}tjj||��qqSr)r>r.r?)r9rrErFrGrSrrrr<Cs z(build_py.get_outputs.<locals>.<listcomp>) rir@rlrrCr � importlib�util�cache_from_sourcerr()rr0rdZoutputsrr^r_rSrrrr53s"    zbuild_py.get_outputscCs�t|t�r!|jd�}n$t|ttf�sEtd��n|j|j||�}tj j |�}|j |�|j ||dd�S)Nr7z:'package' must be a string (dot-separated), list, or tuplerOr) r)�strr@rk�tuple� TypeErrorrlrr>r.rQrPrR)rr^r_rZoutfile�dirrrr� build_moduleJs  zbuild_py.build_modulecCs=|j�}x*|D]"\}}}|j|||�qWdS)N)rgru)rrdrr^r_rrrr1Ys zbuild_py.build_modulescCsxxq|jD]f}|j|�}|j||�}x<|D]4\}}}||ksYt�|j|||�q8Wq WdS)N)r%r=rer+ru)rrrrdZpackage_r^r_rrrr2bs  zbuild_py.build_packagesc Cs�tjr|jd�dSddlm}|j}|d tjkrV|tj}n|jr�||ddd|j d|d|j �n|j dkr�||d|j d|j d|d|j �ndS) Nz%byte-compiling is disabled, skipping.r)r4r8rr�prefix�dry_runrU) �sys�dont_write_bytecoder[�distutils.utilr4rr>�sepr rrwr)rrKr4rvrrrr4vs    zbuild_py.byte_compile)r r r )zcompiler r)rNr)rrr)zforcerr)�__name__� __module__� __qualname__Z descriptionZ user_optionsZboolean_optionsZ negative_optr r/r6r'rBr3r=r]r`rergrirjrlr5rur1r2r4rrrrrs8        '    4     rc@s(eZdZdd�Zdd�ZdS)� build_py_2to3cCslg|_|jr|j�n|jr?|j�|j�n|j|j�|j|jdd��dS)Nr0r) � updated_filesrr1r%r2r3Zrun_2to3r4r5)rrrrr6�s      zbuild_py_2to3.runcCs=tj||||�}|dr9|jj|d�n|S)Nr8r)rrur�rC)rr^r_r�resrrrru�s zbuild_py_2to3.build_moduleN)r|r}r~r6rurrrrr�s  r)�__doc__r>�importlib.utilrnrxrZdistutils.corerZdistutils.errorsrzrrZ distutilsrrrrrrr�<module>s    �|