summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--meta/classes/package.bbclass82
1 files changed, 77 insertions, 5 deletions
diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass
index 0b5ff1d0d..77c2a0196 100644
--- a/meta/classes/package.bbclass
+++ b/meta/classes/package.bbclass
@@ -14,17 +14,21 @@
# c) populate_packages - Split the files in PKGD into separate packages in PKGDEST/<pkgname>
# Also triggers the binary stripping code to put files in -dbg packages.
#
-# d) package_do_shlibs - Look at the shared libraries generated and autotmatically add any
+# d) package_do_filedeps - Collect perfile run-time dependency metadata
+# The data is stores in FILER{PROVIDES,DEPENDS}_file_pkg variables with
+# a list of affected files in FILER{PROVIDES,DEPENDS}FLIST_pkg
+#
+# e) package_do_shlibs - Look at the shared libraries generated and autotmatically add any
# depenedencies found. Also stores the package name so anyone else using this library
# knows which package to depend on.
#
-# e) package_do_pkgconfig - Keep track of which packages need and provide which .pc files
+# f) package_do_pkgconfig - Keep track of which packages need and provide which .pc files
#
-# f) read_shlibdeps - Reads the stored shlibs information into the metadata
+# g) read_shlibdeps - Reads the stored shlibs information into the metadata
#
-# g) package_depchains - Adds automatic dependencies to -dbg and -dev packages
+# h) package_depchains - Adds automatic dependencies to -dbg and -dev packages
#
-# h) emit_pkgdata - saves the packaging data into PKGDATA_DIR for use in later
+# i) emit_pkgdata - saves the packaging data into PKGDATA_DIR for use in later
# packaging steps
inherit packagedata
@@ -32,6 +36,9 @@ inherit packagedata
PKGD = "${WORKDIR}/package"
PKGDEST = "${WORKDIR}/packages-split"
+# rpm is used for the per-file dependency identification
+PACKAGE_DEPENDS += "rpm-native"
+
def legitimize_package_name(s):
"""
Make sure package names are legitimate strings
@@ -519,6 +526,14 @@ python emit_pkgdata() {
write_if_exists(sf, pkg, 'pkg_postrm')
write_if_exists(sf, pkg, 'pkg_preinst')
write_if_exists(sf, pkg, 'pkg_prerm')
+ write_if_exists(sf, pkg, 'FILERPROVIDESFLIST')
+ for dfile in (bb.data.getVar('FILERPROVIDESFLIST_' + pkg, d, True) or "").split():
+ write_if_exists(sf, pkg, 'FILERPROVIDES_' + dfile)
+
+ write_if_exists(sf, pkg, 'FILERDEPENDSFLIST')
+ for dfile in (bb.data.getVar('FILERDEPENDSFLIST_' + pkg, d, True) or "").split():
+ write_if_exists(sf, pkg, 'FILERDEPENDS_' + dfile)
+
sf.close()
@@ -545,6 +560,62 @@ fi
SHLIBSDIR = "${STAGING_DIR_HOST}/shlibs"
SHLIBSWORKDIR = "${WORKDIR}/shlibs"
+RPMDEPS = "${STAGING_LIBDIR_NATIVE}/rpm/${BUILD_ARCH}-${BUILD_OS}-rpmdeps"
+
+# Collect perfile run-time dependency metadata
+# Output:
+# FILERPROVIDESFLIST_pkg - list of all files w/ deps
+# FILERPROVIDES_filepath_pkg - per file dep
+#
+# FILERDEPENDSFLIST_pkg - list of all files w/ deps
+# FILERDEPENDS_filepath_pkg - per file dep
+
+python package_do_filedeps() {
+ import os
+
+ pkgdest = bb.data.getVar('PKGDEST', d, True)
+ packages = bb.data.getVar('PACKAGES', d, True)
+
+ cmd = bb.data.expand("${STAGING_LIBDIR_NATIVE}/rpm/perfile_rpmdeps.sh", d)
+ rpmdeps = bb.data.expand("${RPMDEPS}", d)
+
+ # Quick routine to process the results of the rpmdeps call...
+ def process_deps(pipe, pkg, varname):
+ dep_files = ""
+ for line in pipe:
+ key = "";
+ value = "";
+ # We expect two items on each line
+ # 1 - filepath
+ # 2 - dep list
+ line_list = line.split(None,1);
+ if len(line_list) <= 0 or len(line_list) > 2:
+ bb.error("deps list length error! " + len(line_list));
+ if len(line_list) == 2:
+ file = line_list[0];
+ value = line_list[1]
+ file = file.replace(pkgdest + "/" + pkg, "")
+ dep_files = dep_files + " " + file
+ key = "FILE" + varname + "_" + file + "_" + pkg
+ bb.data.setVar(key, value, d)
+ bb.data.setVar("FILE" + varname + "_" + pkg, dep_files, d)
+
+ # Determine dependencies
+ for pkg in packages.split():
+ if pkg.endswith('-dbg'):
+ continue
+
+ # Process provides
+ dep_pipe = os.popen(cmd + " --rpmdeps " + rpmdeps + " --provides " + pkgdest + "/" + pkg)
+
+ process_deps(dep_pipe, pkg, 'RPROVIDES')
+
+ # Process requirements
+ dep_pipe = os.popen(cmd + " --rpmdeps " + rpmdeps + " --requires " + pkgdest + "/" + pkg)
+
+ process_deps(dep_pipe, pkg, 'RDEPENDS')
+}
+
python package_do_shlibs() {
import re
@@ -976,6 +1047,7 @@ PACKAGEFUNCS ?= "perform_packagecopy \
${PACKAGE_PREPROCESS_FUNCS} \
package_do_split_locales \
populate_packages \
+ package_do_filedeps \
package_do_shlibs \
package_do_pkgconfig \
read_shlibdeps \