diff options
Diffstat (limited to 'meta')
| -rw-r--r-- | meta/classes/package.bbclass | 82 | 
1 files changed, 77 insertions, 5 deletions
| diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass index 0b5ff1d0d7..77c2a01967 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 \ | 
