summaryrefslogtreecommitdiffstats
path: root/meta/lib/oe
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2017-09-18 17:51:58 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2018-03-01 22:13:55 +0000
commit6a07697a6dcb5e77aed4b01df4b30024c4b3d0fe (patch)
tree793e5f235a573e7eb881ca82abb3e0def3d816a6 /meta/lib/oe
parent1b7a9d4f63d07d61d53daac12da275e8ef2feb24 (diff)
downloadpoky-6a07697a6dcb5e77aed4b01df4b30024c4b3d0fe.tar.gz
package_manager: Filter to only rpms we depend upon
Currently do_rootfs gets to see all rpms in the deploy directory. This filters that view to only rpms which the image recipe has actual depends upon which potentially removes some sources of confusion in the image construction. This makes builds more reproducibile and also fixes contamination issues where dnf picks up packages it shouldn't be able to 'see'. [YOCTO #12039] (From OE-Core rev: 85e72e129362db896b0d368077033e4a2e373cf9) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/lib/oe')
-rw-r--r--meta/lib/oe/package_manager.py114
1 files changed, 111 insertions, 3 deletions
diff --git a/meta/lib/oe/package_manager.py b/meta/lib/oe/package_manager.py
index f7e013437c..f59eaf7b85 100644
--- a/meta/lib/oe/package_manager.py
+++ b/meta/lib/oe/package_manager.py
@@ -454,6 +454,114 @@ class PackageManager(object, metaclass=ABCMeta):
454 return res 454 return res
455 return _append(uris, base_paths) 455 return _append(uris, base_paths)
456 456
457def create_packages_dir(d, rpm_repo_dir, deploydir, taskname, filterbydependencies):
458 """
459 Go through our do_package_write_X dependencies and hardlink the packages we depend
460 upon into the repo directory. This prevents us seeing other packages that may
461 have been built that we don't depend upon and also packages for architectures we don't
462 support.
463 """
464 import errno
465
466 taskdepdata = d.getVar("BB_TASKDEPDATA", False)
467 mytaskname = d.getVar("BB_RUNTASK")
468 pn = d.getVar("PN")
469 seendirs = set()
470 multilibs = {}
471
472 rpm_subrepo_dir = oe.path.join(rpm_repo_dir, "rpm")
473
474 bb.utils.remove(rpm_subrepo_dir, recurse=True)
475 bb.utils.mkdirhier(rpm_subrepo_dir)
476
477 # Detect bitbake -b usage
478 nodeps = d.getVar("BB_LIMITEDDEPS") or False
479 if nodeps or not filterbydependencies:
480 oe.path.symlink(deploydir, rpm_subrepo_dir, True)
481 return
482
483 start = None
484 for dep in taskdepdata:
485 data = taskdepdata[dep]
486 if data[1] == mytaskname and data[0] == pn:
487 start = dep
488 break
489 if start is None:
490 bb.fatal("Couldn't find ourself in BB_TASKDEPDATA?")
491 rpmdeps = set()
492 start = [start]
493 seen = set(start)
494 # Support direct dependencies (do_rootfs -> rpms)
495 # or indirect dependencies within PN (do_populate_sdk_ext -> do_rootfs -> rpms)
496 while start:
497 next = []
498 for dep2 in start:
499 for dep in taskdepdata[dep2][3]:
500 if taskdepdata[dep][0] != pn:
501 if "do_" + taskname in dep:
502 rpmdeps.add(dep)
503 elif dep not in seen:
504 next.append(dep)
505 seen.add(dep)
506 start = next
507
508 for dep in rpmdeps:
509 c = taskdepdata[dep][0]
510
511 d2 = d
512 variant = ''
513 if taskdepdata[dep][2].startswith("virtual:multilib"):
514 variant = taskdepdata[dep][2].split(":")[2]
515 if variant not in multilibs:
516 multilibs[variant] = oe.utils.get_multilib_datastore(variant, d)
517 d2 = multilibs[variant]
518
519 if c.endswith("-native"):
520 pkgarchs = ["${BUILD_ARCH}"]
521 elif c.startswith("nativesdk-"):
522 pkgarchs = ["${SDK_ARCH}_${SDK_OS}", "allarch"]
523 elif "-cross-canadian" in c:
524 pkgarchs = ["${SDK_ARCH}_${SDK_ARCH}-${SDKPKGSUFFIX}"]
525 elif "-cross-" in c:
526 pkgarchs = ["${BUILD_ARCH}_${TARGET_ARCH}"]
527 elif "-crosssdk" in c:
528 pkgarchs = ["${BUILD_ARCH}_${SDK_ARCH}_${SDK_OS}"]
529 else:
530 pkgarchs = ['${MACHINE_ARCH}']
531 pkgarchs = pkgarchs + list(reversed(d2.getVar("PACKAGE_EXTRA_ARCHS").split()))
532 pkgarchs.append('allarch')
533 pkgarchs.append('${SDK_ARCH}_${SDK_ARCH}-${SDKPKGSUFFIX}')
534
535 for pkgarch in pkgarchs:
536 manifest = d2.expand("${SSTATE_MANIFESTS}/manifest-%s-%s.%s" % (pkgarch, c, taskname))
537 if os.path.exists(manifest):
538 break
539 if not os.path.exists(manifest):
540 bb.warn("Manifest %s not found in %s (variant '%s')?" % (manifest, d2.expand(" ".join(pkgarchs)), variant))
541 continue
542 with open(manifest, "r") as f:
543 for l in f:
544 l = l.strip()
545 dest = l.replace(deploydir, "")
546 dest = rpm_subrepo_dir + dest
547 if l.endswith("/"):
548 if dest not in seendirs:
549 bb.utils.mkdirhier(dest)
550 seendirs.add(dest)
551 continue
552 # Try to hardlink the file, copy if that fails
553 destdir = os.path.dirname(dest)
554 if destdir not in seendirs:
555 bb.utils.mkdirhier(destdir)
556 seendirs.add(destdir)
557 try:
558 os.link(l, dest)
559 except OSError as err:
560 if err.errno == errno.EXDEV:
561 bb.utils.copyfile(l, dest)
562 else:
563 raise
564
457class RpmPM(PackageManager): 565class RpmPM(PackageManager):
458 def __init__(self, 566 def __init__(self,
459 d, 567 d,
@@ -462,7 +570,8 @@ class RpmPM(PackageManager):
462 task_name='target', 570 task_name='target',
463 arch_var=None, 571 arch_var=None,
464 os_var=None, 572 os_var=None,
465 rpm_repo_workdir="oe-rootfs-repo"): 573 rpm_repo_workdir="oe-rootfs-repo",
574 filterbydependencies=True):
466 super(RpmPM, self).__init__(d) 575 super(RpmPM, self).__init__(d)
467 self.target_rootfs = target_rootfs 576 self.target_rootfs = target_rootfs
468 self.target_vendor = target_vendor 577 self.target_vendor = target_vendor
@@ -477,8 +586,7 @@ class RpmPM(PackageManager):
477 self.primary_arch = self.d.getVar('MACHINE_ARCH') 586 self.primary_arch = self.d.getVar('MACHINE_ARCH')
478 587
479 self.rpm_repo_dir = oe.path.join(self.d.getVar('WORKDIR'), rpm_repo_workdir) 588 self.rpm_repo_dir = oe.path.join(self.d.getVar('WORKDIR'), rpm_repo_workdir)
480 bb.utils.mkdirhier(self.rpm_repo_dir) 589 create_packages_dir(self.d, self.rpm_repo_dir, d.getVar("DEPLOY_DIR_RPM"), "package_write_rpm", filterbydependencies)
481 oe.path.symlink(self.d.getVar('DEPLOY_DIR_RPM'), oe.path.join(self.rpm_repo_dir, "rpm"), True)
482 590
483 self.saved_packaging_data = self.d.expand('${T}/saved_packaging_data/%s' % self.task_name) 591 self.saved_packaging_data = self.d.expand('${T}/saved_packaging_data/%s' % self.task_name)
484 if not os.path.exists(self.d.expand('${T}/saved_packaging_data')): 592 if not os.path.exists(self.d.expand('${T}/saved_packaging_data')):