summaryrefslogtreecommitdiffstats
path: root/meta
diff options
context:
space:
mode:
Diffstat (limited to 'meta')
-rw-r--r--meta/classes/package.bbclass11
-rw-r--r--meta/lib/oe/package.py60
2 files changed, 50 insertions, 21 deletions
diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass
index cc466bd1b2..a03c05b9f7 100644
--- a/meta/classes/package.bbclass
+++ b/meta/classes/package.bbclass
@@ -1434,7 +1434,13 @@ if [ x"$D" = "x" ]; then
1434fi 1434fi
1435} 1435}
1436 1436
1437RPMDEPS = "${STAGING_LIBDIR_NATIVE}/rpm/rpmdeps --rcfile ${STAGING_LIBDIR_NATIVE}/rpm/rpmrc --macros ${STAGING_LIBDIR_NATIVE}/rpm/macros --define '_rpmconfigdir ${STAGING_LIBDIR_NATIVE}/rpm/'" 1437# In Morty and earlier releases, and on master (Rocko), the RPM file
1438# dependencies are always enabled. However, since they were broken with the
1439# release of Pyro and enabling them may cause build problems for some packages,
1440# they are not enabled by default in Pyro. Setting ENABLE_RPM_FILEDEPS_FOR_PYRO
1441# to "1" will enable them again.
1442ENABLE_RPM_FILEDEPS_FOR_PYRO ??= "0"
1443RPMDEPS = "${STAGING_LIBDIR_NATIVE}/rpm/rpmdeps${@' --alldeps' if d.getVar('ENABLE_RPM_FILEDEPS_FOR_PYRO') == '1' else ''}"
1438 1444
1439# Collect perfile run-time dependency metadata 1445# Collect perfile run-time dependency metadata
1440# Output: 1446# Output:
@@ -1451,7 +1457,6 @@ python package_do_filedeps() {
1451 pkgdest = d.getVar('PKGDEST') 1457 pkgdest = d.getVar('PKGDEST')
1452 packages = d.getVar('PACKAGES') 1458 packages = d.getVar('PACKAGES')
1453 rpmdeps = d.getVar('RPMDEPS') 1459 rpmdeps = d.getVar('RPMDEPS')
1454 magic = d.expand("${STAGING_DIR_NATIVE}${datadir_native}/misc/magic.mgc")
1455 1460
1456 def chunks(files, n): 1461 def chunks(files, n):
1457 return [files[i:i+n] for i in range(0, len(files), n)] 1462 return [files[i:i+n] for i in range(0, len(files), n)]
@@ -1463,7 +1468,7 @@ python package_do_filedeps() {
1463 if pkg.endswith('-dbg') or pkg.endswith('-doc') or pkg.find('-locale-') != -1 or pkg.find('-localedata-') != -1 or pkg.find('-gconv-') != -1 or pkg.find('-charmap-') != -1 or pkg.startswith('kernel-module-'): 1468 if pkg.endswith('-dbg') or pkg.endswith('-doc') or pkg.find('-locale-') != -1 or pkg.find('-localedata-') != -1 or pkg.find('-gconv-') != -1 or pkg.find('-charmap-') != -1 or pkg.startswith('kernel-module-'):
1464 continue 1469 continue
1465 for files in chunks(pkgfiles[pkg], 100): 1470 for files in chunks(pkgfiles[pkg], 100):
1466 pkglist.append((pkg, files, rpmdeps, pkgdest, magic)) 1471 pkglist.append((pkg, files, rpmdeps, pkgdest))
1467 1472
1468 processed = oe.utils.multiprocess_exec( pkglist, oe.package.filedeprunner) 1473 processed = oe.utils.multiprocess_exec( pkglist, oe.package.filedeprunner)
1469 1474
diff --git a/meta/lib/oe/package.py b/meta/lib/oe/package.py
index 52c5f16cf8..4797e7d65a 100644
--- a/meta/lib/oe/package.py
+++ b/meta/lib/oe/package.py
@@ -57,44 +57,68 @@ def file_translate(file):
57def filedeprunner(arg): 57def filedeprunner(arg):
58 import re, subprocess, shlex 58 import re, subprocess, shlex
59 59
60 (pkg, pkgfiles, rpmdeps, pkgdest, magic) = arg 60 (pkg, pkgfiles, rpmdeps, pkgdest) = arg
61 provides = {} 61 provides = {}
62 requires = {} 62 requires = {}
63 63
64 r = re.compile(r'[<>=]+ +[^ ]*') 64 file_re = re.compile(r'\s+\d+\s(.*)')
65 dep_re = re.compile(r'\s+(\S)\s+(.*)')
66 r = re.compile(r'[<>=]+\s+\S*')
65 67
66 def process_deps(pipe, pkg, pkgdest, provides, requires): 68 def process_deps(pipe, pkg, pkgdest, provides, requires):
69 file = None
67 for line in pipe: 70 for line in pipe:
68 f = line.decode("utf-8").split(" ", 1)[0].strip() 71 line = line.decode("utf-8")
69 line = line.decode("utf-8").split(" ", 1)[1].strip()
70 72
71 if line.startswith("Requires:"): 73 m = file_re.match(line)
74 if m:
75 file = m.group(1)
76 file = file.replace(pkgdest + "/" + pkg, "")
77 file = file_translate(file)
78 continue
79
80 m = dep_re.match(line)
81 if not m or not file:
82 continue
83
84 type, dep = m.groups()
85
86 if type == 'R':
72 i = requires 87 i = requires
73 elif line.startswith("Provides:"): 88 elif type == 'P':
74 i = provides 89 i = provides
75 else: 90 else:
76 continue 91 continue
77 92
78 file = f.replace(pkgdest + "/" + pkg, "") 93 if dep.startswith("python("):
79 file = file_translate(file) 94 continue
80 value = line.split(":", 1)[1].strip()
81 value = r.sub(r'(\g<0>)', value)
82 95
83 if value.startswith("rpmlib("): 96 # Ignore all perl(VMS::...) and perl(Mac::...) dependencies. These
97 # are typically used conditionally from the Perl code, but are
98 # generated as unconditional dependencies.
99 if dep.startswith('perl(VMS::') or dep.startswith('perl(Mac::'):
84 continue 100 continue
85 if value == "python": 101
102 # Ignore perl dependencies on .pl files.
103 if dep.startswith('perl(') and dep.endswith('.pl)'):
86 continue 104 continue
105
106 # Remove perl versions and perl module versions since they typically
107 # do not make sense when used as package versions.
108 if dep.startswith('perl') and r.search(dep):
109 dep = dep.split()[0]
110
111 # Put parentheses around any version specifications.
112 dep = r.sub(r'(\g<0>)',dep)
113
87 if file not in i: 114 if file not in i:
88 i[file] = [] 115 i[file] = []
89 i[file].append(value) 116 i[file].append(dep)
90 117
91 return provides, requires 118 return provides, requires
92 119
93 env = os.environ.copy()
94 env["MAGIC"] = magic
95
96 try: 120 try:
97 dep_popen = subprocess.Popen(shlex.split(rpmdeps) + pkgfiles, stdout=subprocess.PIPE, env=env) 121 dep_popen = subprocess.Popen(shlex.split(rpmdeps) + pkgfiles, stdout=subprocess.PIPE)
98 provides, requires = process_deps(dep_popen.stdout, pkg, pkgdest, provides, requires) 122 provides, requires = process_deps(dep_popen.stdout, pkg, pkgdest, provides, requires)
99 except OSError as e: 123 except OSError as e:
100 bb.error("rpmdeps: '%s' command failed, '%s'" % (shlex.split(rpmdeps) + pkgfiles, e)) 124 bb.error("rpmdeps: '%s' command failed, '%s'" % (shlex.split(rpmdeps) + pkgfiles, e))