diff options
| -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 @@ | |||
| 14 | # c) populate_packages - Split the files in PKGD into separate packages in PKGDEST/<pkgname> | 14 | # c) populate_packages - Split the files in PKGD into separate packages in PKGDEST/<pkgname> |
| 15 | # Also triggers the binary stripping code to put files in -dbg packages. | 15 | # Also triggers the binary stripping code to put files in -dbg packages. |
| 16 | # | 16 | # |
| 17 | # d) package_do_shlibs - Look at the shared libraries generated and autotmatically add any | 17 | # d) package_do_filedeps - Collect perfile run-time dependency metadata |
| 18 | # The data is stores in FILER{PROVIDES,DEPENDS}_file_pkg variables with | ||
| 19 | # a list of affected files in FILER{PROVIDES,DEPENDS}FLIST_pkg | ||
| 20 | # | ||
| 21 | # e) package_do_shlibs - Look at the shared libraries generated and autotmatically add any | ||
| 18 | # depenedencies found. Also stores the package name so anyone else using this library | 22 | # depenedencies found. Also stores the package name so anyone else using this library |
| 19 | # knows which package to depend on. | 23 | # knows which package to depend on. |
| 20 | # | 24 | # |
| 21 | # e) package_do_pkgconfig - Keep track of which packages need and provide which .pc files | 25 | # f) package_do_pkgconfig - Keep track of which packages need and provide which .pc files |
| 22 | # | 26 | # |
| 23 | # f) read_shlibdeps - Reads the stored shlibs information into the metadata | 27 | # g) read_shlibdeps - Reads the stored shlibs information into the metadata |
| 24 | # | 28 | # |
| 25 | # g) package_depchains - Adds automatic dependencies to -dbg and -dev packages | 29 | # h) package_depchains - Adds automatic dependencies to -dbg and -dev packages |
| 26 | # | 30 | # |
| 27 | # h) emit_pkgdata - saves the packaging data into PKGDATA_DIR for use in later | 31 | # i) emit_pkgdata - saves the packaging data into PKGDATA_DIR for use in later |
| 28 | # packaging steps | 32 | # packaging steps |
| 29 | 33 | ||
| 30 | inherit packagedata | 34 | inherit packagedata |
| @@ -32,6 +36,9 @@ inherit packagedata | |||
| 32 | PKGD = "${WORKDIR}/package" | 36 | PKGD = "${WORKDIR}/package" |
| 33 | PKGDEST = "${WORKDIR}/packages-split" | 37 | PKGDEST = "${WORKDIR}/packages-split" |
| 34 | 38 | ||
| 39 | # rpm is used for the per-file dependency identification | ||
| 40 | PACKAGE_DEPENDS += "rpm-native" | ||
| 41 | |||
| 35 | def legitimize_package_name(s): | 42 | def legitimize_package_name(s): |
| 36 | """ | 43 | """ |
| 37 | Make sure package names are legitimate strings | 44 | Make sure package names are legitimate strings |
| @@ -519,6 +526,14 @@ python emit_pkgdata() { | |||
| 519 | write_if_exists(sf, pkg, 'pkg_postrm') | 526 | write_if_exists(sf, pkg, 'pkg_postrm') |
| 520 | write_if_exists(sf, pkg, 'pkg_preinst') | 527 | write_if_exists(sf, pkg, 'pkg_preinst') |
| 521 | write_if_exists(sf, pkg, 'pkg_prerm') | 528 | write_if_exists(sf, pkg, 'pkg_prerm') |
| 529 | write_if_exists(sf, pkg, 'FILERPROVIDESFLIST') | ||
| 530 | for dfile in (bb.data.getVar('FILERPROVIDESFLIST_' + pkg, d, True) or "").split(): | ||
| 531 | write_if_exists(sf, pkg, 'FILERPROVIDES_' + dfile) | ||
| 532 | |||
| 533 | write_if_exists(sf, pkg, 'FILERDEPENDSFLIST') | ||
| 534 | for dfile in (bb.data.getVar('FILERDEPENDSFLIST_' + pkg, d, True) or "").split(): | ||
| 535 | write_if_exists(sf, pkg, 'FILERDEPENDS_' + dfile) | ||
| 536 | |||
| 522 | sf.close() | 537 | sf.close() |
| 523 | 538 | ||
| 524 | 539 | ||
| @@ -545,6 +560,62 @@ fi | |||
| 545 | SHLIBSDIR = "${STAGING_DIR_HOST}/shlibs" | 560 | SHLIBSDIR = "${STAGING_DIR_HOST}/shlibs" |
| 546 | SHLIBSWORKDIR = "${WORKDIR}/shlibs" | 561 | SHLIBSWORKDIR = "${WORKDIR}/shlibs" |
| 547 | 562 | ||
| 563 | RPMDEPS = "${STAGING_LIBDIR_NATIVE}/rpm/${BUILD_ARCH}-${BUILD_OS}-rpmdeps" | ||
| 564 | |||
| 565 | # Collect perfile run-time dependency metadata | ||
| 566 | # Output: | ||
| 567 | # FILERPROVIDESFLIST_pkg - list of all files w/ deps | ||
| 568 | # FILERPROVIDES_filepath_pkg - per file dep | ||
| 569 | # | ||
| 570 | # FILERDEPENDSFLIST_pkg - list of all files w/ deps | ||
| 571 | # FILERDEPENDS_filepath_pkg - per file dep | ||
| 572 | |||
| 573 | python package_do_filedeps() { | ||
| 574 | import os | ||
| 575 | |||
| 576 | pkgdest = bb.data.getVar('PKGDEST', d, True) | ||
| 577 | packages = bb.data.getVar('PACKAGES', d, True) | ||
| 578 | |||
| 579 | cmd = bb.data.expand("${STAGING_LIBDIR_NATIVE}/rpm/perfile_rpmdeps.sh", d) | ||
| 580 | rpmdeps = bb.data.expand("${RPMDEPS}", d) | ||
| 581 | |||
| 582 | # Quick routine to process the results of the rpmdeps call... | ||
| 583 | def process_deps(pipe, pkg, varname): | ||
| 584 | dep_files = "" | ||
| 585 | for line in pipe: | ||
| 586 | key = ""; | ||
| 587 | value = ""; | ||
| 588 | # We expect two items on each line | ||
| 589 | # 1 - filepath | ||
| 590 | # 2 - dep list | ||
| 591 | line_list = line.split(None,1); | ||
| 592 | if len(line_list) <= 0 or len(line_list) > 2: | ||
| 593 | bb.error("deps list length error! " + len(line_list)); | ||
| 594 | if len(line_list) == 2: | ||
| 595 | file = line_list[0]; | ||
| 596 | value = line_list[1] | ||
| 597 | file = file.replace(pkgdest + "/" + pkg, "") | ||
| 598 | dep_files = dep_files + " " + file | ||
| 599 | key = "FILE" + varname + "_" + file + "_" + pkg | ||
| 600 | bb.data.setVar(key, value, d) | ||
| 601 | bb.data.setVar("FILE" + varname + "_" + pkg, dep_files, d) | ||
| 602 | |||
| 603 | # Determine dependencies | ||
| 604 | for pkg in packages.split(): | ||
| 605 | if pkg.endswith('-dbg'): | ||
| 606 | continue | ||
| 607 | |||
| 608 | # Process provides | ||
| 609 | dep_pipe = os.popen(cmd + " --rpmdeps " + rpmdeps + " --provides " + pkgdest + "/" + pkg) | ||
| 610 | |||
| 611 | process_deps(dep_pipe, pkg, 'RPROVIDES') | ||
| 612 | |||
| 613 | # Process requirements | ||
| 614 | dep_pipe = os.popen(cmd + " --rpmdeps " + rpmdeps + " --requires " + pkgdest + "/" + pkg) | ||
| 615 | |||
| 616 | process_deps(dep_pipe, pkg, 'RDEPENDS') | ||
| 617 | } | ||
| 618 | |||
| 548 | python package_do_shlibs() { | 619 | python package_do_shlibs() { |
| 549 | import re | 620 | import re |
| 550 | 621 | ||
| @@ -976,6 +1047,7 @@ PACKAGEFUNCS ?= "perform_packagecopy \ | |||
| 976 | ${PACKAGE_PREPROCESS_FUNCS} \ | 1047 | ${PACKAGE_PREPROCESS_FUNCS} \ |
| 977 | package_do_split_locales \ | 1048 | package_do_split_locales \ |
| 978 | populate_packages \ | 1049 | populate_packages \ |
| 1050 | package_do_filedeps \ | ||
| 979 | package_do_shlibs \ | 1051 | package_do_shlibs \ |
| 980 | package_do_pkgconfig \ | 1052 | package_do_pkgconfig \ |
| 981 | read_shlibdeps \ | 1053 | read_shlibdeps \ |
