B
    È S]J<  ã               @   sp   d Z ddlZddlZddlmZ ddlmZ ddlmZm	Z	 ddl
T ddlmZ ddlmZ G d	d
„ d
eƒZdS )zzdistutils.command.bdist_wininst

Implements the Distutils 'bdist_wininst' command: create a windows installer
exe-program.é    N)ÚCommand)Úget_platform)Úcreate_treeÚremove_tree)Ú*)Úget_python_version)Úlogc               @   s€   e Zd ZdZddddeƒ  fdddd	d
ddddddgZddddgZdd„ Zdd„ Zdd„ Z	dd„ Z
d$dd„Zd d!„ Zd"d#„ ZdS )%Úbdist_wininstz-create an executable installer for MS Windows)z
bdist-dir=Nz1temporary directory for creating the distributionz
plat-name=Úpz;platform name to embed in generated filenames (default: %s))z	keep-tempÚkzPkeep the pseudo-installation tree around after creating the distribution archive)ztarget-version=Nz6require a specific python version on the target system)zno-target-compileÚcz/do not compile .py to .pyc on the target system)zno-target-optimizeÚoz;do not compile .py to .pyo (optimized) on the target system)z	dist-dir=Údz-directory to put final built distributions in)zbitmap=Úbz>bitmap to use for the installer instead of python-powered logo)ztitle=Útz?title to display on the installer background instead of default)z
skip-buildNz2skip rebuilding everything (for testing/debugging))zinstall-script=NzUbasename of installation script to be run after installation or before deinstallation)zpre-install-script=Nz{Fully qualified filename of a script to be run before any files are installed.  This script need not be in the distribution)zuser-access-control=NzŠspecify Vista's UAC handling - 'none'/default=no handling, 'auto'=use UAC if target Python installed for all users, 'force'=always use UACz	keep-tempzno-target-compilezno-target-optimizez
skip-buildc             C   sR   d | _ d | _d| _d| _d| _d | _d | _d | _d | _d | _	d | _
d | _d | _d S )Nr   )Ú	bdist_dirÚ	plat_nameÚ	keep_tempÚno_target_compileÚno_target_optimizeÚtarget_versionÚdist_dirÚbitmapÚtitleÚ
skip_buildÚinstall_scriptÚpre_install_scriptÚuser_access_control)Úself© r   ú0lib/python3.7/distutils/command/bdist_wininst.pyÚinitialize_options:   s    z bdist_wininst.initialize_optionsc             C   sä   |   dd¡ | jd krR| jr6| jr6| j d¡}| j|_|  d¡j}tj	 
|d¡| _| js^d| _| js˜| j ¡ r˜tƒ }| jr’| j|kr’td|f ƒ‚|| _|   ddd¡ | jràx2| jjD ]}| jtj	 |¡kr¶P q¶W td| j ƒ‚d S )	NÚbdist)r   r   ZwininstÚ zMtarget version can only be %s, or the '--skip-build' option must be specified)r   r   )r   r   z(install_script '%s' not found in scripts)Zset_undefined_optionsr   r   r   ÚdistributionZget_command_objÚget_finalized_commandÚ
bdist_baseÚosÚpathÚjoinr   Úhas_ext_modulesr   ZDistutilsOptionErrorr   ÚscriptsÚbasename)r   r"   r&   Zshort_versionÚscriptr   r   r    Úfinalize_optionsJ   s4    

zbdist_wininst.finalize_optionsc             C   sò  t jdkr&| j ¡ s| j ¡ r&tdƒ‚| js6|  d¡ | jddd}| j	|_
| j|_d|_| j|_|  d¡}d|_d|_| j ¡ rÚ| j}|s¬| jsštd	ƒ‚d
t jd d…  }d| j|f }|  d¡}tj |jd| ¡|_x4dD ],}| ¡ }|dkrü|d }t|d| |ƒ qàW t d| j	¡ | ¡  t j dtj | j	d¡¡ | ¡  t jd= ddlm } |ƒ }	| j !¡ }
| j"|	d| j	d}|  #||
| j$¡ | j ¡ r¢t%ƒ }nd}| jj& 'd||  (|
¡f¡ t )d|¡ t *|¡ | j+sît,| j	| j-d d S )NÚwin32z^distribution contains extensions and/or C libraries; must be compiled on a Windows 32 platformÚbuildÚinstallé   )Zreinit_subcommandsr   Úinstall_libz Should have already checked thisz%d.%dé   z.%s-%sÚlib)ZpurelibZplatlibÚheadersr+   Údatar6   z/Include/$dist_nameZinstall_zinstalling to %sZPURELIB)ÚmktempÚzip)Zroot_dirÚanyr	   zremoving temporary file '%s')Údry_run).ÚsysÚplatformr$   r*   Zhas_c_librariesZDistutilsPlatformErrorr   Zrun_commandZreinitialize_commandr   ÚrootZwarn_dirr   ÚcompileÚoptimizer   ÚAssertionErrorÚversion_infor%   r'   r(   r)   Z
build_baseZ	build_libÚupperÚsetattrr   ÚinfoZensure_finalizedÚinsertÚrunZtempfiler8   Úget_fullnameZmake_archiveÚ
create_exer   r   Z
dist_filesÚappendÚget_installer_filenameÚdebugÚremover   r   r;   )r   r1   r3   r   Zplat_specifierr0   ÚkeyÚvaluer8   Zarchive_basenameÚfullnameÚarcnameZ	pyversionr   r   r    rG   p   sf    












zbdist_wininst.runc             C   s^  g }| j j}| d¡ |jpdd }dd„ }xJdD ]B}t||dƒ}|r2|d| ¡ ||ƒf  }| d|||ƒf ¡ q2W | d	¡ | jr˜| d
| j ¡ | d||ƒ ¡ | d| j  ¡ | d| j  ¡ | j	rä| d| j	 ¡ | j
rú| d| j
 ¡ | jp
| j  ¡ }| d||ƒ ¡ dd l}dd l}	d| | ¡ ¡|	jf }
| d|
 ¡ d |¡S )Nz
[metadata]r#   Ú
c             S   s   |   dd¡S )NrR   z\n)Úreplace)Úsr   r   r    ÚescapeÎ   s    z)bdist_wininst.get_inidata.<locals>.escape)ZauthorZauthor_emailÚdescriptionZ
maintainerZmaintainer_emailÚnameZurlÚversionz
    %s: %sz%s=%sz
[Setup]zinstall_script=%szinfo=%sztarget_compile=%dztarget_optimize=%dztarget_version=%szuser_access_control=%sztitle=%sr   zBuilt %s with distutils-%szbuild_info=%s)r$   ÚmetadatarJ   Zlong_descriptionÚgetattrÚ
capitalizer   r   r   r   r   r   rH   ÚtimeÚ	distutilsZctimeÚ__version__r)   )r   ÚlinesrY   rE   rU   rW   r7   r   r\   r]   Z
build_infor   r   r    Úget_inidataÁ   s:    


zbdist_wininst.get_inidataNc          	   C   s  dd l }|  | j¡ |  ¡ }|  |¡}|  d| ¡ |rPt|dƒ ¡ }t|ƒ}nd}t|dƒ}	|	 	|  
¡ ¡ |rz|	 	|¡ t|tƒrŽ| d¡}|d }| jrÔt| jddd	}
|
 ¡  d¡}W d Q R X || d
 }n|d }|	 	|¡ | ddt|ƒ|¡}|	 	|¡ |	 	t|dƒ ¡ ¡ d S )Nr   zcreating %sÚrbÚwbÚmbcsó    Úrzlatin-1)Úencodings   
 z<iiii{V4)ÚstructZmkpathr   r`   rK   ZannounceÚopenÚreadÚlenÚwriteÚget_exe_bytesÚ
isinstanceÚstrÚencoder   Zpack)r   rQ   rP   r   rg   ZcfgdataÚinstaller_nameZ
bitmapdataZ	bitmaplenÚfiler-   Zscript_dataÚheaderr   r   r    rI   ï   s:    








zbdist_wininst.create_exec             C   sD   | j r&tj | jd|| j| j f ¡}ntj | jd|| jf ¡}|S )Nz%s.%s-py%s.exez	%s.%s.exe)r   r'   r(   r)   r   r   )r   rP   rp   r   r   r    rK   $  s    

z$bdist_wininst.get_installer_filenamec       	      C   s   t ƒ }| jrl| j|k rl| jdk r&d}q¬| jdkr6d}q¬| jdkrFd}q¬| jdkrVd}q¬| jdkrfd	}q¬d
}n@yddlm} W n tk
r”   d
}Y nX | d¡d }|d }tj t	¡}| j
dkrä| j
d d… dkrä| j
dd … }nd}tj |d||f ¡}t|dƒ}z| ¡ S | ¡  X d S )Nz2.4z6.0z7.1z2.5z8.0z3.2z9.0z3.4z10.0z14.0r   )ÚCRT_ASSEMBLY_VERSIONÚ.z.0r/   é   Úwinr#   zwininst-%s%s.exera   )r   r   Zmsvcrtrs   ÚImportErrorÚ	partitionr'   r(   ÚdirnameÚ__file__r   r)   rh   ri   Úclose)	r   Zcur_versionZbvrs   ÚmajorZ	directoryZsfixÚfilenameÚfr   r   r    rl   1  s8    	






zbdist_wininst.get_exe_bytes)N)Ú__name__Ú
__module__Ú__qualname__rV   r   Zuser_optionsZboolean_optionsr!   r.   rG   r`   rI   rK   rl   r   r   r   r    r	      s2   &Q.
5r	   )Ú__doc__r<   r'   Zdistutils.corer   Zdistutils.utilr   Zdistutils.dir_utilr   r   Zdistutils.errorsZdistutils.sysconfigr   r]   r   r	   r   r   r   r    Ú<module>   s   