python38/bdist_rpm5.py
2014-01-16 06:40:02 -05:00

235 lines
9.5 KiB
Python

from distutils.command.bdist_rpm import bdist_rpm
import distutils.command.sdist
from distutils.sysconfig import get_config_var
from distutils.filelist import FileList
import string, os, sys
from types import *
from glob import glob
# import rpm
class bdist_rpm5(bdist_rpm):
def _make_spec_file(self):
"""Generate the text of an RPM spec file and return it as a
list of strings (one per line).
"""
sdist = self.reinitialize_command('sdist')
sdist.finalize_options()
sdist.filelist = FileList()
sdist.get_file_list()
manifest = sdist.filelist.files
# definitions and headers
name = self.distribution.get_name()
version = self.distribution.get_version().replace('-','_')
release = self.release.replace('-','_')
summary = self.distribution.get_description().strip().strip('.')
spec_file = [
'%define\toname\t'+name,
]
if name[:2] == "py":
spec_file.append('%define\tmodule\t' + name[2:])
module = '%{module}'
else:
module = '%{oname}'
spec_file.extend([
'',
'Name:\t\tpython3-' + module,
'Version:\t' + version,
'Release:\t' + release,
'Summary:\t' + summary,
'Source0:\thttp://pypi.python.org/packages/source/%c/%%{oname}/%%{oname}-%%{version}.tar' % name[0],
])
# XXX yuck! this filename is available from the "sdist" command,
# but only after it has run: and we create the spec file before
# running "sdist", in case of --spec-only.
if sdist.formats and 'xztar' in sdist.formats:
spec_file[-1] += '.xz'
elif sdist.formats and 'bztar' in sdist.formats:
spec_file[-1] += '.bz2'
else:
spec_file[-1] += '.gz'
license = self.distribution.get_license()
if license == "UNKNOWN":
classifiers = self.distribution.get_classifiers()
for classifier in classifiers:
values = classifier.split(" :: ")
if values[0] == "License":
license = values[-1]
license.replace("GPL ", "GPLv").strip()
# Hardcoded value from bdist_rpm not suitable for ROSA
if self.group == "Development/Libraries":
self.group == "Development/Python"
spec_file.extend([
'License:\t' + license,
'Group:\t\t' + self.group,])
if self.distribution.get_url() != 'UNKNOWN':
spec_file.append('Url:\t\t' + self.distribution.get_url())
doc_names = ['README', 'CHANGES','ChangeLog', 'NEWS', 'THANKS',
'HISTORY', 'AUTHORS', 'BUGS', 'ReleaseNotes', 'DISCLAIMER',
'TODO', 'TROUBLESHOOTING', 'IDEAS', 'HACKING', 'WISHLIST',
'CREDITS', 'PROJECTS', 'LEGAL', 'KNOWN_BUGS',
'MISSING_FEATURES', 'FAQ', 'ANNOUNCE', 'FEATURES', 'WHATSNEW']
license_names = ['LICENSE', 'COPYRIGHT', 'COPYING']
common_licenses = glob('/usr/share/common-licenses/*')
for i in range(len(common_licenses)):
common_licenses[i] = os.path.basename(common_licenses[i])
doc_names.extend(license_names)
doc_suffixes = ('.doc', '.htm', '.txt', '.pdf', '.odt')
self.doc_files = []
all_files = []
if self.distribution.data_files:
all_files.extend(self.distribution.data_files)
if manifest:
all_files.extend(manifest)
if all_files:
for data_file in all_files:
done = False
for doc_name in doc_names:
if doc_name.lower() in data_file[1][0].lower():
if doc_name in license_names and license in common_licenses:
done = True
break
self.doc_files.append(data_file)
done = True
break
if done:
continue
for doc_suffix in doc_suffixes:
ext = os.path.splitext(data_file.lower())[1]
if ext.lower().startswith(doc_suffix.lower()):
self.doc_files.append(data_file)
break
if not self.force_arch:
# noarch if no extension modules
if not self.distribution.has_ext_modules():
spec_file.append('BuildArch:\tnoarch')
else:
spec_file.append( 'BuildArch:\t%s' % self.force_arch )
for field in ('Provides',
'Requires',
'Conflicts',
'Obsoletes',
):
val = getattr(self, field.lower())
if type(val) == list:
spec_file.append('%s: %s' % (field, string.join(val)))
elif val is not None:
spec_file.append('%s: %s' % (field, val))
build_requires = []
if self.distribution.has_ext_modules():
build_requires.append('python3-devel')
# Ugly, but should mostly work... :p
if 'setuptools' in str(self.distribution.__dict__) or 'setuptools' in str(sdist.__dict__):
build_requires.append('python3egg(distribute)')
if build_requires:
spec_file.append('BuildRequires:\t' +
" ".join(build_requires))
if self.build_requires:
spec_file.append('BuildRequires:\t' +
" ".join(self.build_requires))
spec_file.extend([
'',
'%description',
self.distribution.get_long_description().strip()
])
# insert contents of files
# XXX this is kind of misleading: user-supplied options are files
# that we open and interpolate into the spec file, but the defaults
# are just text that we drop in as-is. Hmmm.
if 'test_suite' in self.distribution.__dict__ and self.distribution.test_suite:
verify_script = "python3 setup.py test"
else:
verify_script = None
script_options = [
('prep', 'prep_script', "%setup -qn %{oname}-%{version}"),
('build', 'build_script', "python3 setup.py build"),
('install', 'install_script',
("python3 setup.py install "
"--root=%{buildroot}")),
('check', 'verify_script', verify_script),
('pre', 'pre_install', None),
('post', 'post_install', None),
('preun', 'pre_uninstall', None),
('postun', 'post_uninstall', None),
]
for (rpm_opt, attr, default) in script_options:
# Insert contents of file referred to, if no file is referred to
# use 'default' as contents of script
val = getattr(self, attr)
if val or default:
spec_file.extend([
'',
'%' + rpm_opt,])
if val:
spec_file.extend(string.split(open(val, 'r').read(), '\n'))
else:
spec_file.append(default)
# files section
spec_file.extend([
'',
'%files',
])
for doc_file in self.doc_files:
spec_file.append('%doc ' + doc_file)
if self.distribution.has_ext_modules():
site_pkgs = '%{py3_platsitedir}'
else:
site_pkgs = '%{py3_puresitedir}'
if self.distribution.has_scripts():
for script in self.distribution.scripts:
if type(script) == StringType:
spec_file.append(os.path.join('%{_bindir}', os.path.basename(script)))
site_pkgs_files = []
if self.distribution.data_files:
for data_file in self.distribution.data_files:
site_pkgs_files.append(os.path.join(site_pkgs, data_file))
if 'entry_points' in self.distribution.__dict__ and self.distribution.entry_points:
if type(self.distribution.entry_points) is DictType:
for entry_points in self.distribution.entry_points:
for entry_point in self.distribution.entry_points[entry_points]:
site_pkgs_files.append(os.path.join('%{_bindir}', os.path.basename(entry_point.split('=')[0])))
if 'py_modules' in self.distribution.__dict__ and self.distribution.py_modules:
for py_module in self.distribution.py_modules:
py_module = py_module.replace('.', os.path.sep)
site_pkgs_files.append(os.path.join(site_pkgs, py_module + '.py*'))
if 'packages' in self.distribution.__dict__ and self.distribution.packages:
for package in self.distribution.packages:
package = package.replace('.', os.path.sep)
#spec_file.append('%dir ' + os.path.join(site_pkgs, package))
site_pkgs_files.append(os.path.join(site_pkgs, package, '*.py*'))
if self.distribution.has_ext_modules():
for ext_module in self.distribution.ext_modules:
ext_module = ext_module.name.replace('.', os.path.sep)
site_pkgs_files.append(os.path.join(site_pkgs, ext_module + ".so"))
site_pkgs_files.sort()
for f in site_pkgs_files:
spec_file.append(f)
spec_file.append(os.path.join(site_pkgs, name.replace('-', '_') + '*.egg-info'))
return spec_file
# _make_spec_file ()