B
    È S]§T  ã               @   s€   d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlT ddlmZ dd	lmZ G d
d„ deƒZdS )zwdistutils.command.bdist_rpm

Implements the Distutils 'bdist_rpm' command (create RPM source and binary
distributions).é    N)ÚCommand)ÚDEBUG)Úget_platform)Ú
write_file)Ú*)Úget_python_version)Úlogc            )   @   s¸   e Zd ZdZdddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*g)Zd+d,d-d.d/gZd+d,d-d0œZd1d2„ Zd3d4„ Zd5d6„ Z	d7d8„ Z
d9d:„ Zd;d<„ Zd=d>„ Zd?S )@Ú	bdist_rpmzcreate an RPM distribution)zbdist-base=Nz/base directory for creating built distributions)z	rpm-base=Nzdbase directory for creating RPMs (defaults to "rpm" under --bdist-base; must be specified for RPM 2))z	dist-dir=ÚdzDdirectory to put final RPM files in (and .spec files if --spec-only))zpython=NzMpath to Python interpreter to hard-code in the .spec file (default: "python"))z
fix-pythonNzLhard-code the exact path to the current Python interpreter in the .spec file)z	spec-onlyNzonly regenerate spec file)zsource-onlyNzonly generate source RPM)zbinary-onlyNzonly generate binary RPM)z	use-bzip2Nz7use bzip2 instead of gzip to create source distribution)zdistribution-name=Nzgname of the (Linux) distribution to which this RPM applies (*not* the name of the module distribution!))zgroup=Nz9package classification [default: "Development/Libraries"])zrelease=NzRPM release number)zserial=NzRPM serial number)zvendor=NzaRPM "vendor" (eg. "Joe Blow <joe@example.com>") [default: maintainer or author from setup script])z	packager=NzBRPM packager (eg. "Jane Doe <jane@example.net>") [default: vendor])z
doc-files=Nz6list of documentation files (space or comma-separated))z
changelog=NzRPM changelog)zicon=Nzname of icon file)z	provides=Nz%capabilities provided by this package)z	requires=Nz%capabilities required by this package)z
conflicts=Nz-capabilities which conflict with this package)zbuild-requires=Nz+capabilities required to build this package)z
obsoletes=Nz*capabilities made obsolete by this package)z
no-autoreqNz+do not automatically calculate dependencies)z	keep-tempÚkz"don't clean up RPM build directory)zno-keep-tempNz&clean up RPM build directory [default])zuse-rpm-opt-flagsNz8compile with RPM_OPT_FLAGS when building from source RPM)zno-rpm-opt-flagsNz&do not pass any RPM CFLAGS to compiler)z	rpm3-modeNz"RPM 3 compatibility mode (default))z	rpm2-modeNzRPM 2 compatibility mode)zprep-script=Nz3Specify a script for the PREP phase of RPM building)zbuild-script=Nz4Specify a script for the BUILD phase of RPM building)zpre-install=Nz:Specify a script for the pre-INSTALL phase of RPM building)zinstall-script=Nz6Specify a script for the INSTALL phase of RPM building)zpost-install=Nz;Specify a script for the post-INSTALL phase of RPM building)zpre-uninstall=Nz<Specify a script for the pre-UNINSTALL phase of RPM building)zpost-uninstall=Nz=Specify a script for the post-UNINSTALL phase of RPM building)zclean-script=Nz4Specify a script for the CLEAN phase of RPM building)zverify-script=Nz6Specify a script for the VERIFY phase of the RPM build)zforce-arch=Nz0Force an architecture onto the RPM build process)ÚquietÚqz3Run the INSTALL phase of RPM building in quiet modez	keep-tempzuse-rpm-opt-flagsz	rpm3-modez
no-autoreqr   )zno-keep-tempzno-rpm-opt-flagsz	rpm2-modec             C   sî   d | _ d | _d | _d | _d | _d | _d | _d | _d | _d | _	d | _
d | _d | _d | _d | _d | _d | _d | _d | _d | _d | _d | _d | _d | _d | _d | _d | _d | _d | _d | _d | _d | _d | _ d| _!d| _"d| _#d| _$d | _%d| _&d S )Nr   é   )'Ú
bdist_baseÚrpm_baseÚdist_dirÚpythonÚ
fix_pythonÚ	spec_onlyÚbinary_onlyÚsource_onlyÚ	use_bzip2Údistribution_nameÚgroupÚreleaseÚserialÚvendorÚpackagerÚ	doc_filesÚ	changelogÚiconÚprep_scriptÚbuild_scriptÚinstall_scriptÚclean_scriptÚverify_scriptÚpre_installÚpost_installÚpre_uninstallÚpost_uninstallÚprepÚprovidesÚrequiresÚ	conflictsÚbuild_requiresÚ	obsoletesÚ	keep_tempÚuse_rpm_opt_flagsÚ	rpm3_modeÚ
no_autoreqÚ
force_archr   )Úself© r6   ú,lib/python3.7/distutils/command/bdist_rpm.pyÚinitialize_optionsˆ   sN    zbdist_rpm.initialize_optionsc             C   sº   |   dd¡ | jd kr6| js$tdƒ‚tj | jd¡| _| jd krX| j	rPt
j| _qfd| _n| j	rftdƒ‚tjdkr~tdtj ƒ‚| jr’| jr’td	ƒ‚| j ¡ s¢d
| _|   dd¡ |  ¡  d S )NZbdist)r   r   z)you must specify --rpm-base in RPM 2 modeÚrpmZpython3z8--python and --fix-python are mutually exclusive optionsÚposixz9don't know how to create RPM distributions on platform %sz6cannot supply both '--source-only' and '--binary-only'r   )r   r   )Zset_undefined_optionsr   r2   ZDistutilsOptionErrorÚosÚpathÚjoinr   r   r   ÚsysÚ
executableÚnameZDistutilsPlatformErrorr   r   ÚdistributionÚhas_ext_modulesr1   Úfinalize_package_data)r5   r6   r6   r7   Úfinalize_optionsµ   s.    





zbdist_rpm.finalize_optionsc             C   sX  |   dd¡ |   dd| j ¡ | j ¡ f ¡ |   d¡ |  d¡ t| jtƒr|x.dD ]&}tj	 
|¡rR|| jkrR| j |¡ qRW |   dd	¡ |   d
¡ |   d¡ |   d¡ |  | j¡| _|  d¡ |  d¡ |  d¡ |  d¡ |  d¡ |  d¡ |  d¡ |  d¡ |  d¡ |  d¡ |  d¡ |  d¡ |  d¡ |  d¡ |  d¡ |   d¡ d S )Nr   zDevelopment/Librariesr   z%s <%s>r   r   )ZREADMEz
README.txtr   Ú1r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r+   r,   r-   r.   r/   r4   )Zensure_stringrA   Zget_contactZget_contact_emailZensure_string_listÚ
isinstancer   Úlistr;   r<   ÚexistsÚappendÚ_format_changelogr   Zensure_filename)r5   Zreadmer6   r6   r7   rC   Ô   s>    





















zbdist_rpm.finalize_package_datac             C   sê  t r<tdƒ td| jƒ td| jƒ td| jƒ td| jƒ | jrT| j}|  |¡ n<i }x.dD ]&}t	j
 | j|¡||< |  || ¡ q^W |d }t	j
 |d| j ¡  ¡}|  t||  ¡ fd	| ¡ | jrÌd S | jjd d … }|  d
¡}| jrödg|_ndg|_|  d
¡ || j_| ¡ d }|d }|  ||¡ | jrft	j
 | j¡rX|  | j|¡ ntd| j ƒ‚t d¡ dg}	t	j
 d¡s’t	j
 d¡r˜dg}	| jr¬|	 d¡ n| j rÀ|	 d¡ n
|	 d¡ |	 !dd| j" g¡ | j#r|	 !ddt	j
 $| j¡ g¡ | j%s|	 d¡ | j&r&|	 d¡ |	 |¡ d}
|
d }d|
 d  }d!|||f }t	 '|¡}z€g }d }xT| (¡ }|s|P | )¡  *¡ }t+|ƒd"ksšt,‚| |d# ¡ |d krl|d }qlW | -¡ }|rÞt.d$t/|ƒ ƒ‚W d | -¡  X |  0|	¡ | j1sæ| j 2¡ rt3ƒ }nd%}| j stt	j
 |d& |¡}t	j
 |¡sBt,‚|  4|| j¡ t	j
 | j|¡}| jj d'||f¡ | jsæxh|D ]`}t	j
 |d( |¡}t	j
 |¡r‚|  4|| j¡ t	j
 | jt	j
 5|¡¡}| jj d'||f¡ q‚W d S ))Nzbefore _get_package_data():zvendor =z
packager =zdoc_files =zchangelog =)ÚSOURCESÚSPECSZBUILDÚRPMSÚSRPMSrL   z%s.speczwriting '%s'ÚsdistZbztarZgztarr   rK   zicon file '%s' does not existzbuilding RPMsr9   z/usr/bin/rpmbuildz/bin/rpmbuildZrpmbuildz-bsz-bbz-baz--definez__python %sz
_topdir %sz--cleanz--quietz%{name}-%{version}-%{release}z.src.rpmz%{arch}/z.%{arch}.rpmz%rpm -q --qf '%s %s\n' --specfile '%s'é   r   zFailed to execute: %sÚanyrN   r	   rM   )6r   Úprintr   r   r   r   r   r   Zmkpathr;   r<   r=   r   rA   Úget_nameZexecuter   Ú_make_spec_fileZ
dist_filesZreinitialize_commandr   ZformatsZrun_commandZget_archive_filesZ	copy_filer    rH   ZDistutilsFileErrorr   Úinfor   rI   r   Úextendr   r2   Úabspathr0   r   ÚpopenÚreadlineÚstripÚsplitÚlenÚAssertionErrorÚcloseZDistutilsExecErrorÚreprZspawnZdry_runrB   r   Z	move_fileÚbasename)r5   Zspec_dirZrpm_dirr
   Z	spec_pathZsaved_dist_filesrO   ÚsourceZ
source_dirZrpm_cmdZ
nvr_stringZsrc_rpmZnon_src_rpmZq_cmdÚoutZbinary_rpmsZ
source_rpmÚlineÚlZstatusZ	pyversionZsrpmÚfilenamer9   r6   r6   r7   Úrun  sÆ    















zbdist_rpm.runc             C   s   t j | jt j |¡¡S )N)r;   r<   r=   r   r`   )r5   r<   r6   r6   r7   Ú
_dist_pathˆ  s    zbdist_rpm._dist_pathc          	   C   sD  d| j  ¡  d| j  ¡  dd¡ d| j  ¡  d| j dd¡ dd| j  ¡  g}t d	¡}d
 dd„ | 	¡ D ƒ¡}d}d}| ||¡}||kr¨| 
d¡ | 
d| d
 ¡ | dddg¡ | jrÊ| 
d¡ n
| 
d¡ | d| j  ¡  d| j ddg¡ | js| j  ¡ s&| 
d¡ n| 
d| j ¡ x^dD ]V}t| | ¡ ƒ}t|tƒrd| 
d|d |¡f ¡ n|dk	r,| 
d||f ¡ q,W | j  ¡ d krª| 
d!| j  ¡  ¡ | jrÂ| 
d"| j ¡ | jrà| 
d#d | j¡ ¡ | jr | 
d$tj | j¡ ¡ | jr| 
d%¡ | dd&| j  ¡ g¡ d'| jtj tj d( ¡f }d)| }	| j!r\d*|	 }	d+| }
d,d-d.|	fd/d0|
fd1d2d3d4d5d6g	}xh|D ]`\}}}t| |ƒ}|s¬|rŒ| dd7| g¡ |rà| t"|d8ƒ #¡  $d
¡¡ n
| 
|¡ qŒW | dd9d:g¡ | j%r| 
d;d | j%¡ ¡ | j&r@| dd<g¡ | | j&¡ |S )=ziGenerate the text of an RPM spec file and return it as a
        list of strings (one per line).
        z%define name z%define version ú-Ú_z%define unmangled_version z%define release Ú z	Summary: zrpm --eval %{__os_install_post}Ú
c             S   s   g | ]}d |  ¡  ‘qS )z  %s \)rZ   )Ú.0rc   r6   r6   r7   ú
<listcomp>Ÿ  s   z-bdist_rpm._make_spec_file.<locals>.<listcomp>zbrp-python-bytecompile \
z%brp-python-bytecompile %{__python} \
z2# Workaround for http://bugs.python.org/issue14443z%define __os_install_post zName: %{name}zVersion: %{version}zRelease: %{release}z-Source0: %{name}-%{unmangled_version}.tar.bz2z,Source0: %{name}-%{unmangled_version}.tar.gzz	License: zGroup: z>BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildrootzPrefix: %{_prefix}zBuildArch: noarchzBuildArch: %s)ZVendorZPackagerZProvidesZRequiresZ	ConflictsZ	Obsoletesz%s: %sú NZUNKNOWNzUrl: zDistribution: zBuildRequires: zIcon: z
AutoReq: 0z%descriptionz%s %sr   z%s buildzenv CFLAGS="$RPM_OPT_FLAGS" z>%s install -O1 --root=$RPM_BUILD_ROOT --record=INSTALLED_FILES)r*   r!   z&%setup -n %{name}-%{unmangled_version}Zbuildr"   Zinstallr#   )Zcleanr$   zrm -rf $RPM_BUILD_ROOT)Zverifyscriptr%   N)Zprer&   N)Zpostr'   N)Zpreunr(   N)Zpostunr)   Nú%Úrz%files -f INSTALLED_FILESz%defattr(-,root,root)z%doc z
%changelog)'rA   rS   Zget_versionÚreplacer   Zget_descriptionÚ
subprocessZ	getoutputr=   Ú
splitlinesrI   rV   r   Zget_licenser   r4   rB   ÚgetattrÚlowerrF   rG   Zget_urlr   r.   r    r;   r<   r`   r3   Zget_long_descriptionr   r>   Úargvr1   ÚopenÚreadr[   r   r   )r5   Z	spec_fileZvendor_hookZproblemZfixedZ
fixed_hookZfieldÚvalZdef_setup_callZ	def_buildZinstall_cmdZscript_optionsZrpm_optÚattrÚdefaultr6   r6   r7   rT   ‹  s°    


	




zbdist_rpm._make_spec_filec             C   s€   |s|S g }x`|  ¡  d¡D ]N}|  ¡ }|d dkrD| d|g¡ q|d dkr\| |¡ q| d| ¡ qW |d s||d= |S )zKFormat the changelog correctly and convert it to a list of strings
        rk   r   r   rj   rh   z  )rZ   r[   rV   rI   )r5   r   Znew_changelogrc   r6   r6   r7   rJ   3  s    zbdist_rpm._format_changelogN)Ú__name__Ú
__module__Ú__qualname__ZdescriptionZuser_optionsZboolean_optionsZnegative_optr8   rD   rC   rf   rg   rT   rJ   r6   r6   r6   r7   r	      sp   --  )r	   )Ú__doc__rr   r>   r;   Zdistutils.corer   Zdistutils.debugr   Zdistutils.utilr   Zdistutils.file_utilr   Zdistutils.errorsZdistutils.sysconfigr   Z	distutilsr   r	   r6   r6   r6   r7   Ú<module>   s   