- Add new Python dependency generator (provides only for now) (#1340885)
This commit is contained in:
parent
ae2bf135f8
commit
82f61bba7f
20
rpm-4.13.x-pythondistdeps-Makefile.patch
Normal file
20
rpm-4.13.x-pythondistdeps-Makefile.patch
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
--- rpm-4.13.0-rc1/scripts/Makefile.am.orig 2015-09-01 19:45:43.896822977 +0200
|
||||||
|
+++ rpm-4.13.0-rc1/scripts/Makefile.am 2016-06-13 15:46:34.281390084 +0200
|
||||||
|
@@ -11,7 +11,7 @@
|
||||||
|
check-files check-prereqs \
|
||||||
|
check-buildroot check-rpaths check-rpaths-worker \
|
||||||
|
find-debuginfo.sh find-lang.sh \
|
||||||
|
- perl.prov perl.req pythondeps.sh \
|
||||||
|
+ perl.prov perl.req pythondeps.sh pythondistdeps.py \
|
||||||
|
rpmdb_loadcvt rpm.daily rpm.log rpm.supp rpm2cpio.sh \
|
||||||
|
tgpg vpkg-provides.sh \
|
||||||
|
find-requires find-provides \
|
||||||
|
@@ -30,7 +30,7 @@
|
||||||
|
check-files check-prereqs \
|
||||||
|
check-buildroot check-rpaths check-rpaths-worker \
|
||||||
|
find-lang.sh find-requires find-provides \
|
||||||
|
- perl.prov perl.req pythondeps.sh \
|
||||||
|
+ perl.prov perl.req pythondeps.sh pythondistdeps.py \
|
||||||
|
mono-find-requires mono-find-provides \
|
||||||
|
pkgconfigdeps.sh libtooldeps.sh \
|
||||||
|
ocaml-find-requires.sh ocaml-find-provides.sh \
|
8
rpm-4.13.x-pythondistdeps-fileattr.patch
Normal file
8
rpm-4.13.x-pythondistdeps-fileattr.patch
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
--- rpm-4.13.0-rc1/fileattrs/python.attr.orig 2016-06-13 15:49:10.072832164 +0200
|
||||||
|
+++ rpm-4.13.0-rc1/fileattrs/python.attr 2016-06-13 15:50:46.687106846 +0200
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-%__python_provides %{_rpmconfigdir}/pythondeps.sh --provides
|
||||||
|
+%__python_provides %{_rpmconfigdir}/pythondistdeps.py --provides
|
||||||
|
%__python_requires %{_rpmconfigdir}/pythondeps.sh --requires
|
||||||
|
%__python_path ^((/usr/lib(64)?/python[[:digit:]]\\.[[:digit:]]/.*\\.(py[oc]?|so))|(%{_bindir}/python[[:digit:]]\\.[[:digit:]]))$
|
||||||
|
%__python_magic [Pp]ython.*(executable|byte-compiled)
|
229
rpm-4.13.x-pythondistdeps.patch
Normal file
229
rpm-4.13.x-pythondistdeps.patch
Normal file
@ -0,0 +1,229 @@
|
|||||||
|
diff --git a/scripts/pythondistdeps.py b/scripts/pythondistdeps.py
|
||||||
|
new file mode 100755
|
||||||
|
index 0000000..8a2f43d
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/scripts/pythondistdeps.py
|
||||||
|
@@ -0,0 +1,223 @@
|
||||||
|
+#!/usr/bin/python
|
||||||
|
+# -*- coding: utf-8 -*-
|
||||||
|
+#
|
||||||
|
+# Copyright 2010 Per Øyvind Karlsen <proyvind@moondrake.org>
|
||||||
|
+# Copyright 2015 Neal Gompa <ngompa13@gmail.com>
|
||||||
|
+#
|
||||||
|
+# This program is free software. It may be redistributed and/or modified under
|
||||||
|
+# the terms of the LGPL version 2.1 (or later).
|
||||||
|
+#
|
||||||
|
+# RPM python dependency generator, using .egg-info/.egg-link/.dist-info data
|
||||||
|
+#
|
||||||
|
+
|
||||||
|
+from __future__ import print_function
|
||||||
|
+from getopt import getopt
|
||||||
|
+from os.path import basename, dirname, isdir, sep
|
||||||
|
+from sys import argv, stdin, version
|
||||||
|
+from distutils.sysconfig import get_python_lib
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+opts, args = getopt(
|
||||||
|
+ argv[1:], 'hPRrCEMLl:',
|
||||||
|
+ ['help', 'provides', 'requires', 'recommends', 'conflicts', 'extras', 'majorver-provides', 'legacy-provides' , 'legacy'])
|
||||||
|
+
|
||||||
|
+Provides = False
|
||||||
|
+Requires = False
|
||||||
|
+Recommends = False
|
||||||
|
+Conflicts = False
|
||||||
|
+Extras = False
|
||||||
|
+Provides_PyMajorVer_Variant = False
|
||||||
|
+legacy_Provides = False
|
||||||
|
+legacy = False
|
||||||
|
+
|
||||||
|
+for o, a in opts:
|
||||||
|
+ if o in ('-h', '--help'):
|
||||||
|
+ print('-h, --help\tPrint help')
|
||||||
|
+ print('-P, --provides\tPrint Provides')
|
||||||
|
+ print('-R, --requires\tPrint Requires')
|
||||||
|
+ print('-r, --recommends\tPrint Recommends')
|
||||||
|
+ print('-C, --conflicts\tPrint Conflicts')
|
||||||
|
+ print('-E, --extras\tPrint Extras ')
|
||||||
|
+ print('-M, --majorver-provides\tPrint extra Provides with Python major version only')
|
||||||
|
+ print('-L, --legacy-provides\tPrint extra legacy pythonegg Provides')
|
||||||
|
+ print('-l, --legacy\tPrint legacy pythonegg Provides/Requires instead')
|
||||||
|
+ exit(1)
|
||||||
|
+ elif o in ('-P', '--provides'):
|
||||||
|
+ Provides = True
|
||||||
|
+ elif o in ('-R', '--requires'):
|
||||||
|
+ Requires = True
|
||||||
|
+ elif o in ('-r', '--recommends'):
|
||||||
|
+ Recommends = True
|
||||||
|
+ elif o in ('-C', '--conflicts'):
|
||||||
|
+ Conflicts = True
|
||||||
|
+ elif o in ('-E', '--extras'):
|
||||||
|
+ Extras = True
|
||||||
|
+ elif o in ('-M', '--majorver-provides'):
|
||||||
|
+ Provides_PyMajorVer_Variant = True
|
||||||
|
+ elif o in ('-L', '--legacy-provides'):
|
||||||
|
+ legacy_Provides = True
|
||||||
|
+ elif o in ('-l', '--legacy'):
|
||||||
|
+ legacy = True
|
||||||
|
+
|
||||||
|
+if Requires:
|
||||||
|
+ py_abi = True
|
||||||
|
+else:
|
||||||
|
+ py_abi = False
|
||||||
|
+py_deps = {}
|
||||||
|
+if args:
|
||||||
|
+ files = args
|
||||||
|
+else:
|
||||||
|
+ files = stdin.readlines()
|
||||||
|
+
|
||||||
|
+for f in files:
|
||||||
|
+ f = f.strip()
|
||||||
|
+ lower = f.lower()
|
||||||
|
+ name = 'python(abi)'
|
||||||
|
+ # add dependency based on path, versioned if within versioned python directory
|
||||||
|
+ if py_abi and (lower.endswith('.py') or lower.endswith('.pyc') or lower.endswith('.pyo')):
|
||||||
|
+ if name not in py_deps:
|
||||||
|
+ py_deps[name] = []
|
||||||
|
+ purelib = get_python_lib(standard_lib=1, plat_specific=0).split(version[:3])[0]
|
||||||
|
+ platlib = get_python_lib(standard_lib=1, plat_specific=1).split(version[:3])[0]
|
||||||
|
+ for lib in (purelib, platlib):
|
||||||
|
+ if lib in f:
|
||||||
|
+ spec = ('==', f.split(lib)[1].split(sep)[0])
|
||||||
|
+ if spec not in py_deps[name]:
|
||||||
|
+ py_deps[name].append(spec)
|
||||||
|
+
|
||||||
|
+ # XXX: hack to workaround RPM internal dependency generator not passing directories
|
||||||
|
+ lower_dir = dirname(lower)
|
||||||
|
+ if lower_dir.endswith('.egg') or \
|
||||||
|
+ lower_dir.endswith('.egg-info') or \
|
||||||
|
+ lower_dir.endswith('.egg-link') or \
|
||||||
|
+ lower_dir.endswith('.dist-info'):
|
||||||
|
+ lower = lower_dir
|
||||||
|
+ f = dirname(f)
|
||||||
|
+ # Determine provide, requires, conflicts & recommends based on egg/dist metadata
|
||||||
|
+ if lower.endswith('.egg') or \
|
||||||
|
+ lower.endswith('.egg-info') or \
|
||||||
|
+ lower.endswith('.egg-link') or \
|
||||||
|
+ lower.endswith('.dist-info'):
|
||||||
|
+ # This import is very slow, so only do it if needed
|
||||||
|
+ from pkg_resources import Distribution, FileMetadata, PathMetadata
|
||||||
|
+ dist_name = basename(f)
|
||||||
|
+ if isdir(f):
|
||||||
|
+ path_item = dirname(f)
|
||||||
|
+ metadata = PathMetadata(path_item, f)
|
||||||
|
+ else:
|
||||||
|
+ path_item = f
|
||||||
|
+ metadata = FileMetadata(f)
|
||||||
|
+ dist = Distribution.from_location(path_item, dist_name, metadata)
|
||||||
|
+ if (Provides_PyMajorVer_Variant or legacy_Provides or legacy) and Provides:
|
||||||
|
+ # Get the Python major version
|
||||||
|
+ pyver_major = dist.py_version.split('.')[0]
|
||||||
|
+ if Provides:
|
||||||
|
+ # If egg/dist metadata says package name is python, we provide python(abi)
|
||||||
|
+ if dist.key == 'python':
|
||||||
|
+ name = 'python(abi)'
|
||||||
|
+ if name not in py_deps:
|
||||||
|
+ py_deps[name] = []
|
||||||
|
+ py_deps[name].append(('==', dist.py_version))
|
||||||
|
+ if not legacy:
|
||||||
|
+ name = 'python{}dist({})'.format(dist.py_version, dist.key)
|
||||||
|
+ if name not in py_deps:
|
||||||
|
+ py_deps[name] = []
|
||||||
|
+ if Provides_PyMajorVer_Variant:
|
||||||
|
+ pymajor_name = 'python{}dist({})'.format(pyver_major, dist.key)
|
||||||
|
+ if pymajor_name not in py_deps:
|
||||||
|
+ py_deps[pymajor_name] = []
|
||||||
|
+ if legacy or legacy_Provides:
|
||||||
|
+ legacy_name = 'pythonegg({})({})'.format(pyver_major, dist.key)
|
||||||
|
+ if legacy_name not in py_deps:
|
||||||
|
+ py_deps[legacy_name] = []
|
||||||
|
+ if dist.version:
|
||||||
|
+ spec = ('==', dist.version)
|
||||||
|
+ if spec not in py_deps[name]:
|
||||||
|
+ if not legacy:
|
||||||
|
+ py_deps[name].append(spec)
|
||||||
|
+ if Provides_PyMajorVer_Variant:
|
||||||
|
+ py_deps[pymajor_name].append(spec)
|
||||||
|
+ if legacy or legacy_Provides:
|
||||||
|
+ py_deps[legacy_name].append(spec)
|
||||||
|
+ if Requires or (Recommends and dist.extras):
|
||||||
|
+ name = 'python(abi)'
|
||||||
|
+ # If egg/dist metadata says package name is python, we don't add dependency on python(abi)
|
||||||
|
+ if dist.key == 'python':
|
||||||
|
+ py_abi = False
|
||||||
|
+ if name in py_deps:
|
||||||
|
+ py_deps.pop(name)
|
||||||
|
+ elif py_abi and dist.py_version:
|
||||||
|
+ if name not in py_deps:
|
||||||
|
+ py_deps[name] = []
|
||||||
|
+ spec = ('==', dist.py_version)
|
||||||
|
+ if spec not in py_deps[name]:
|
||||||
|
+ py_deps[name].append(spec)
|
||||||
|
+ deps = dist.requires()
|
||||||
|
+ if Recommends:
|
||||||
|
+ depsextras = dist.requires(extras=dist.extras)
|
||||||
|
+ if not Requires:
|
||||||
|
+ for dep in reversed(depsextras):
|
||||||
|
+ if dep in deps:
|
||||||
|
+ depsextras.remove(dep)
|
||||||
|
+ deps = depsextras
|
||||||
|
+ # add requires/recommends based on egg/dist metadata
|
||||||
|
+ for dep in deps:
|
||||||
|
+ if legacy:
|
||||||
|
+ name = 'pythonegg({})({})'.format(pyver_major, dep.key)
|
||||||
|
+ else:
|
||||||
|
+ name = 'python{}dist({})'.format(dist.py_version, dep.key)
|
||||||
|
+ for spec in dep.specs:
|
||||||
|
+ if spec[0] != '!=':
|
||||||
|
+ if name not in py_deps:
|
||||||
|
+ py_deps[name] = []
|
||||||
|
+ if spec not in py_deps[name]:
|
||||||
|
+ py_deps[name].append(spec)
|
||||||
|
+ if not dep.specs:
|
||||||
|
+ py_deps[name] = []
|
||||||
|
+ # Unused, for automatic sub-package generation based on 'extras' from egg/dist metadata
|
||||||
|
+ # TODO: implement in rpm later, or...?
|
||||||
|
+ if Extras:
|
||||||
|
+ deps = dist.requires()
|
||||||
|
+ extras = dist.extras
|
||||||
|
+ print(extras)
|
||||||
|
+ for extra in extras:
|
||||||
|
+ print('%%package\textras-{}'.format(extra))
|
||||||
|
+ print('Summary:\t{} extra for {} python package'.format(extra, dist.key))
|
||||||
|
+ print('Group:\t\tDevelopment/Python')
|
||||||
|
+ depsextras = dist.requires(extras=[extra])
|
||||||
|
+ for dep in reversed(depsextras):
|
||||||
|
+ if dep in deps:
|
||||||
|
+ depsextras.remove(dep)
|
||||||
|
+ deps = depsextras
|
||||||
|
+ for dep in deps:
|
||||||
|
+ for spec in dep.specs:
|
||||||
|
+ if spec[0] == '!=':
|
||||||
|
+ print('Conflicts:\t{} {} {}'.format(dep.key, '==', spec[1]))
|
||||||
|
+ else:
|
||||||
|
+ print('Requires:\t{} {} {}'.format(dep.key, spec[0], spec[1]))
|
||||||
|
+ print('%%description\t{}'.format(extra))
|
||||||
|
+ print('{} extra for {} python package'.format(extra, dist.key))
|
||||||
|
+ print('%%files\t\textras-{}\n'.format(extra))
|
||||||
|
+ if Conflicts:
|
||||||
|
+ # Should we really add conflicts for extras?
|
||||||
|
+ # Creating a meta package per extra with recommends on, which has
|
||||||
|
+ # the requires/conflicts in stead might be a better solution...
|
||||||
|
+ for dep in dist.requires(extras=dist.extras):
|
||||||
|
+ name = dep.key
|
||||||
|
+ for spec in dep.specs:
|
||||||
|
+ if spec[0] == '!=':
|
||||||
|
+ if name not in py_deps:
|
||||||
|
+ py_deps[name] = []
|
||||||
|
+ spec = ('==', spec[1])
|
||||||
|
+ if spec not in py_deps[name]:
|
||||||
|
+ py_deps[name].append(spec)
|
||||||
|
+names = list(py_deps.keys())
|
||||||
|
+names.sort()
|
||||||
|
+for name in names:
|
||||||
|
+ if py_deps[name]:
|
||||||
|
+ # Print out versioned provides, requires, recommends, conflicts
|
||||||
|
+ for spec in py_deps[name]:
|
||||||
|
+ print('{} {} {}'.format(name, spec[0], spec[1]))
|
||||||
|
+ else:
|
||||||
|
+ # Print out unversioned provides, requires, recommends, conflicts
|
||||||
|
+ print(name)
|
8
rpm.spec
8
rpm.spec
@ -29,7 +29,7 @@
|
|||||||
Summary: The RPM package management system
|
Summary: The RPM package management system
|
||||||
Name: rpm
|
Name: rpm
|
||||||
Version: %{rpmver}
|
Version: %{rpmver}
|
||||||
Release: %{?snapver:0.%{snapver}.}37%{?dist}
|
Release: %{?snapver:0.%{snapver}.}38%{?dist}
|
||||||
Group: System Environment/Base
|
Group: System Environment/Base
|
||||||
Url: http://www.rpm.org/
|
Url: http://www.rpm.org/
|
||||||
Source0: http://rpm.org/releases/rpm-4.12.x/%{name}-%{srcver}.tar.bz2
|
Source0: http://rpm.org/releases/rpm-4.12.x/%{name}-%{srcver}.tar.bz2
|
||||||
@ -85,6 +85,9 @@ Patch129: rpm-4.13.0-filter-unversioned.patch
|
|||||||
Patch130: rpm-4.13.0-armv7hl-isa.patch
|
Patch130: rpm-4.13.0-armv7hl-isa.patch
|
||||||
Patch131: rpm-4.13.0-non-ASCII-keys.patch
|
Patch131: rpm-4.13.0-non-ASCII-keys.patch
|
||||||
Patch132: rpm-4.13.0-_buildhost-macro.diff
|
Patch132: rpm-4.13.0-_buildhost-macro.diff
|
||||||
|
Patch133: rpm-4.13.x-pythondistdeps.patch
|
||||||
|
Patch134: rpm-4.13.x-pythondistdeps-Makefile.patch
|
||||||
|
Patch135: rpm-4.13.x-pythondistdeps-fileattr.patch
|
||||||
|
|
||||||
# These are not yet upstream
|
# These are not yet upstream
|
||||||
Patch302: rpm-4.7.1-geode-i686.patch
|
Patch302: rpm-4.7.1-geode-i686.patch
|
||||||
@ -596,6 +599,9 @@ exit 0
|
|||||||
%doc doc/librpm/html/*
|
%doc doc/librpm/html/*
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Jun 13 2016 Florian Festi <ffesti@rpm.org> - 4.4.13.0-0.rc1.38
|
||||||
|
- Add new Python dependency generator (provides only for now) (#1340885)
|
||||||
|
|
||||||
* Thu Jun 02 2016 Florian Festi <ffesti@rpm.org> - 4.4.13.0-0.rc1.37
|
* Thu Jun 02 2016 Florian Festi <ffesti@rpm.org> - 4.4.13.0-0.rc1.37
|
||||||
- Add support for _buildhost macro (#1309367)
|
- Add support for _buildhost macro (#1309367)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user