mirror of
https://abf.rosa.ru/djam/python38.git
synced 2025-02-23 15:22:50 +00:00
235 lines
9.5 KiB
Python
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 ()
|
|
|
|
|