diff options
Diffstat (limited to 'meta/lib/oe/package_manager')
-rw-r--r-- | meta/lib/oe/package_manager/__init__.py | 35 | ||||
-rw-r--r-- | meta/lib/oe/package_manager/deb/__init__.py | 37 | ||||
-rw-r--r-- | meta/lib/oe/package_manager/deb/manifest.py | 2 | ||||
-rw-r--r-- | meta/lib/oe/package_manager/deb/rootfs.py | 2 | ||||
-rw-r--r-- | meta/lib/oe/package_manager/deb/sdk.py | 11 | ||||
-rw-r--r-- | meta/lib/oe/package_manager/ipk/__init__.py | 48 | ||||
-rw-r--r-- | meta/lib/oe/package_manager/ipk/manifest.py | 3 | ||||
-rw-r--r-- | meta/lib/oe/package_manager/ipk/rootfs.py | 41 | ||||
-rw-r--r-- | meta/lib/oe/package_manager/ipk/sdk.py | 11 | ||||
-rw-r--r-- | meta/lib/oe/package_manager/rpm/__init__.py | 47 | ||||
-rw-r--r-- | meta/lib/oe/package_manager/rpm/manifest.py | 2 | ||||
-rw-r--r-- | meta/lib/oe/package_manager/rpm/rootfs.py | 4 | ||||
-rw-r--r-- | meta/lib/oe/package_manager/rpm/sdk.py | 10 |
13 files changed, 157 insertions, 96 deletions
diff --git a/meta/lib/oe/package_manager/__init__.py b/meta/lib/oe/package_manager/__init__.py index 8e7128b195..d3b2317894 100644 --- a/meta/lib/oe/package_manager/__init__.py +++ b/meta/lib/oe/package_manager/__init__.py | |||
@@ -1,4 +1,6 @@ | |||
1 | # | 1 | # |
2 | # Copyright OpenEmbedded Contributors | ||
3 | # | ||
2 | # SPDX-License-Identifier: GPL-2.0-only | 4 | # SPDX-License-Identifier: GPL-2.0-only |
3 | # | 5 | # |
4 | 6 | ||
@@ -90,7 +92,7 @@ def opkg_query(cmd_output): | |||
90 | 92 | ||
91 | def failed_postinsts_abort(pkgs, log_path): | 93 | def failed_postinsts_abort(pkgs, log_path): |
92 | bb.fatal("""Postinstall scriptlets of %s have failed. If the intention is to defer them to first boot, | 94 | bb.fatal("""Postinstall scriptlets of %s have failed. If the intention is to defer them to first boot, |
93 | then please place them into pkg_postinst_ontarget_${PN} (). | 95 | then please place them into pkg_postinst_ontarget:${PN} (). |
94 | Deferring to first boot via 'exit 1' is no longer supported. | 96 | Deferring to first boot via 'exit 1' is no longer supported. |
95 | Details of the failure are in %s.""" %(pkgs, log_path)) | 97 | Details of the failure are in %s.""" %(pkgs, log_path)) |
96 | 98 | ||
@@ -120,7 +122,8 @@ def generate_locale_archive(d, rootfs, target_arch, localedir): | |||
120 | "riscv32": ["--uint32-align=4", "--little-endian"], | 122 | "riscv32": ["--uint32-align=4", "--little-endian"], |
121 | "i586": ["--uint32-align=4", "--little-endian"], | 123 | "i586": ["--uint32-align=4", "--little-endian"], |
122 | "i686": ["--uint32-align=4", "--little-endian"], | 124 | "i686": ["--uint32-align=4", "--little-endian"], |
123 | "x86_64": ["--uint32-align=4", "--little-endian"] | 125 | "x86_64": ["--uint32-align=4", "--little-endian"], |
126 | "loongarch64": ["--uint32-align=4", "--little-endian"] | ||
124 | } | 127 | } |
125 | if target_arch in locale_arch_options: | 128 | if target_arch in locale_arch_options: |
126 | arch_options = locale_arch_options[target_arch] | 129 | arch_options = locale_arch_options[target_arch] |
@@ -189,7 +192,7 @@ class PackageManager(object, metaclass=ABCMeta): | |||
189 | bb.utils.remove(self.intercepts_dir, True) | 192 | bb.utils.remove(self.intercepts_dir, True) |
190 | bb.utils.mkdirhier(self.intercepts_dir) | 193 | bb.utils.mkdirhier(self.intercepts_dir) |
191 | for intercept in postinst_intercepts: | 194 | for intercept in postinst_intercepts: |
192 | bb.utils.copyfile(intercept, os.path.join(self.intercepts_dir, os.path.basename(intercept))) | 195 | shutil.copy(intercept, os.path.join(self.intercepts_dir, os.path.basename(intercept))) |
193 | 196 | ||
194 | @abstractmethod | 197 | @abstractmethod |
195 | def _handle_intercept_failure(self, failed_script): | 198 | def _handle_intercept_failure(self, failed_script): |
@@ -266,7 +269,7 @@ class PackageManager(object, metaclass=ABCMeta): | |||
266 | pass | 269 | pass |
267 | 270 | ||
268 | @abstractmethod | 271 | @abstractmethod |
269 | def install(self, pkgs, attempt_only=False): | 272 | def install(self, pkgs, attempt_only=False, hard_depends_only=False): |
270 | """ | 273 | """ |
271 | Install a list of packages. 'pkgs' is a list object. If 'attempt_only' is | 274 | Install a list of packages. 'pkgs' is a list object. If 'attempt_only' is |
272 | True, installation failures are ignored. | 275 | True, installation failures are ignored. |
@@ -321,7 +324,7 @@ class PackageManager(object, metaclass=ABCMeta): | |||
321 | # TODO don't have sdk here but have a property on the superclass | 324 | # TODO don't have sdk here but have a property on the superclass |
322 | # (and respect in install_complementary) | 325 | # (and respect in install_complementary) |
323 | if sdk: | 326 | if sdk: |
324 | pkgdatadir = self.d.expand("${TMPDIR}/pkgdata/${SDK_SYS}") | 327 | pkgdatadir = self.d.getVar("PKGDATA_DIR_SDK") |
325 | else: | 328 | else: |
326 | pkgdatadir = self.d.getVar("PKGDATA_DIR") | 329 | pkgdatadir = self.d.getVar("PKGDATA_DIR") |
327 | 330 | ||
@@ -344,10 +347,8 @@ class PackageManager(object, metaclass=ABCMeta): | |||
344 | def install_complementary(self, globs=None): | 347 | def install_complementary(self, globs=None): |
345 | """ | 348 | """ |
346 | Install complementary packages based upon the list of currently installed | 349 | Install complementary packages based upon the list of currently installed |
347 | packages e.g. locales, *-dev, *-dbg, etc. This will only attempt to install | 350 | packages e.g. locales, *-dev, *-dbg, etc. Note: every backend needs to |
348 | these packages, if they don't exist then no error will occur. Note: every | 351 | call this function explicitly after the normal package installation. |
349 | backend needs to call this function explicitly after the normal package | ||
350 | installation | ||
351 | """ | 352 | """ |
352 | if globs is None: | 353 | if globs is None: |
353 | globs = self.d.getVar('IMAGE_INSTALL_COMPLEMENTARY') | 354 | globs = self.d.getVar('IMAGE_INSTALL_COMPLEMENTARY') |
@@ -398,7 +399,7 @@ class PackageManager(object, metaclass=ABCMeta): | |||
398 | bb.note("Installing complementary packages ... %s (skipped already provided packages %s)" % ( | 399 | bb.note("Installing complementary packages ... %s (skipped already provided packages %s)" % ( |
399 | ' '.join(install_pkgs), | 400 | ' '.join(install_pkgs), |
400 | ' '.join(skip_pkgs))) | 401 | ' '.join(skip_pkgs))) |
401 | self.install(install_pkgs, attempt_only=True) | 402 | self.install(install_pkgs, hard_depends_only=True) |
402 | except subprocess.CalledProcessError as e: | 403 | except subprocess.CalledProcessError as e: |
403 | bb.fatal("Could not compute complementary packages list. Command " | 404 | bb.fatal("Could not compute complementary packages list. Command " |
404 | "'%s' returned %d:\n%s" % | 405 | "'%s' returned %d:\n%s" % |
@@ -448,7 +449,7 @@ class PackageManager(object, metaclass=ABCMeta): | |||
448 | return res | 449 | return res |
449 | return _append(uris, base_paths) | 450 | return _append(uris, base_paths) |
450 | 451 | ||
451 | def create_packages_dir(d, subrepo_dir, deploydir, taskname, filterbydependencies): | 452 | def create_packages_dir(d, subrepo_dir, deploydir, taskname, filterbydependencies, include_self=False): |
452 | """ | 453 | """ |
453 | Go through our do_package_write_X dependencies and hardlink the packages we depend | 454 | Go through our do_package_write_X dependencies and hardlink the packages we depend |
454 | upon into the repo directory. This prevents us seeing other packages that may | 455 | upon into the repo directory. This prevents us seeing other packages that may |
@@ -469,7 +470,10 @@ def create_packages_dir(d, subrepo_dir, deploydir, taskname, filterbydependencie | |||
469 | # Detect bitbake -b usage | 470 | # Detect bitbake -b usage |
470 | nodeps = d.getVar("BB_LIMITEDDEPS") or False | 471 | nodeps = d.getVar("BB_LIMITEDDEPS") or False |
471 | if nodeps or not filterbydependencies: | 472 | if nodeps or not filterbydependencies: |
472 | oe.path.symlink(deploydir, subrepo_dir, True) | 473 | for arch in d.getVar("ALL_MULTILIB_PACKAGE_ARCHS").split() + d.getVar("ALL_MULTILIB_PACKAGE_ARCHS").replace("-", "_").split(): |
474 | target = os.path.join(deploydir + "/" + arch) | ||
475 | if os.path.exists(target): | ||
476 | oe.path.symlink(target, subrepo_dir + "/" + arch, True) | ||
473 | return | 477 | return |
474 | 478 | ||
475 | start = None | 479 | start = None |
@@ -482,14 +486,17 @@ def create_packages_dir(d, subrepo_dir, deploydir, taskname, filterbydependencie | |||
482 | bb.fatal("Couldn't find ourself in BB_TASKDEPDATA?") | 486 | bb.fatal("Couldn't find ourself in BB_TASKDEPDATA?") |
483 | pkgdeps = set() | 487 | pkgdeps = set() |
484 | start = [start] | 488 | start = [start] |
485 | seen = set(start) | 489 | if include_self: |
490 | seen = set() | ||
491 | else: | ||
492 | seen = set(start) | ||
486 | # Support direct dependencies (do_rootfs -> do_package_write_X) | 493 | # Support direct dependencies (do_rootfs -> do_package_write_X) |
487 | # or indirect dependencies within PN (do_populate_sdk_ext -> do_rootfs -> do_package_write_X) | 494 | # or indirect dependencies within PN (do_populate_sdk_ext -> do_rootfs -> do_package_write_X) |
488 | while start: | 495 | while start: |
489 | next = [] | 496 | next = [] |
490 | for dep2 in start: | 497 | for dep2 in start: |
491 | for dep in taskdepdata[dep2][3]: | 498 | for dep in taskdepdata[dep2][3]: |
492 | if taskdepdata[dep][0] != pn: | 499 | if include_self or taskdepdata[dep][0] != pn: |
493 | if "do_" + taskname in dep: | 500 | if "do_" + taskname in dep: |
494 | pkgdeps.add(dep) | 501 | pkgdeps.add(dep) |
495 | elif dep not in seen: | 502 | elif dep not in seen: |
diff --git a/meta/lib/oe/package_manager/deb/__init__.py b/meta/lib/oe/package_manager/deb/__init__.py index 2ee68fefb1..0c23c884c1 100644 --- a/meta/lib/oe/package_manager/deb/__init__.py +++ b/meta/lib/oe/package_manager/deb/__init__.py | |||
@@ -1,4 +1,6 @@ | |||
1 | # | 1 | # |
2 | # Copyright OpenEmbedded Contributors | ||
3 | # | ||
2 | # SPDX-License-Identifier: GPL-2.0-only | 4 | # SPDX-License-Identifier: GPL-2.0-only |
3 | # | 5 | # |
4 | 6 | ||
@@ -53,6 +55,7 @@ class DpkgIndexer(Indexer): | |||
53 | 55 | ||
54 | index_cmds = [] | 56 | index_cmds = [] |
55 | deb_dirs_found = False | 57 | deb_dirs_found = False |
58 | index_sign_files = set() | ||
56 | for arch in arch_list: | 59 | for arch in arch_list: |
57 | arch_dir = os.path.join(self.deploy_dir, arch) | 60 | arch_dir = os.path.join(self.deploy_dir, arch) |
58 | if not os.path.isdir(arch_dir): | 61 | if not os.path.isdir(arch_dir): |
@@ -62,7 +65,10 @@ class DpkgIndexer(Indexer): | |||
62 | 65 | ||
63 | cmd += "%s -fcn Packages > Packages.gz;" % gzip | 66 | cmd += "%s -fcn Packages > Packages.gz;" % gzip |
64 | 67 | ||
65 | with open(os.path.join(arch_dir, "Release"), "w+") as release: | 68 | release_file = os.path.join(arch_dir, "Release") |
69 | index_sign_files.add(release_file) | ||
70 | |||
71 | with open(release_file, "w+") as release: | ||
66 | release.write("Label: %s\n" % arch) | 72 | release.write("Label: %s\n" % arch) |
67 | 73 | ||
68 | cmd += "PSEUDO_UNLOAD=1 %s release . >> Release" % apt_ftparchive | 74 | cmd += "PSEUDO_UNLOAD=1 %s release . >> Release" % apt_ftparchive |
@@ -77,7 +83,16 @@ class DpkgIndexer(Indexer): | |||
77 | 83 | ||
78 | oe.utils.multiprocess_launch(create_index, index_cmds, self.d) | 84 | oe.utils.multiprocess_launch(create_index, index_cmds, self.d) |
79 | if self.d.getVar('PACKAGE_FEED_SIGN') == '1': | 85 | if self.d.getVar('PACKAGE_FEED_SIGN') == '1': |
80 | raise NotImplementedError('Package feed signing not implementd for dpkg') | 86 | signer = get_signer(self.d, self.d.getVar('PACKAGE_FEED_GPG_BACKEND')) |
87 | else: | ||
88 | signer = None | ||
89 | if signer: | ||
90 | for f in index_sign_files: | ||
91 | signer.detach_sign(f, | ||
92 | self.d.getVar('PACKAGE_FEED_GPG_NAME'), | ||
93 | self.d.getVar('PACKAGE_FEED_GPG_PASSPHRASE_FILE'), | ||
94 | output_suffix="gpg", | ||
95 | use_sha256=True) | ||
81 | 96 | ||
82 | class PMPkgsList(PkgsList): | 97 | class PMPkgsList(PkgsList): |
83 | 98 | ||
@@ -214,7 +229,7 @@ class DpkgPM(OpkgDpkgPM): | |||
214 | 229 | ||
215 | tmp_sf.write(status) | 230 | tmp_sf.write(status) |
216 | 231 | ||
217 | os.rename(status_file + ".tmp", status_file) | 232 | bb.utils.rename(status_file + ".tmp", status_file) |
218 | 233 | ||
219 | def run_pre_post_installs(self, package_name=None): | 234 | def run_pre_post_installs(self, package_name=None): |
220 | """ | 235 | """ |
@@ -276,14 +291,18 @@ class DpkgPM(OpkgDpkgPM): | |||
276 | 291 | ||
277 | self.deploy_dir_unlock() | 292 | self.deploy_dir_unlock() |
278 | 293 | ||
279 | def install(self, pkgs, attempt_only=False): | 294 | def install(self, pkgs, attempt_only=False, hard_depends_only=False): |
280 | if attempt_only and len(pkgs) == 0: | 295 | if attempt_only and len(pkgs) == 0: |
281 | return | 296 | return |
282 | 297 | ||
283 | os.environ['APT_CONFIG'] = self.apt_conf_file | 298 | os.environ['APT_CONFIG'] = self.apt_conf_file |
284 | 299 | ||
285 | cmd = "%s %s install --allow-downgrades --allow-remove-essential --allow-change-held-packages --allow-unauthenticated --no-remove %s" % \ | 300 | extra_args = "" |
286 | (self.apt_get_cmd, self.apt_args, ' '.join(pkgs)) | 301 | if hard_depends_only: |
302 | extra_args = "--no-install-recommends" | ||
303 | |||
304 | cmd = "%s %s install --allow-downgrades --allow-remove-essential --allow-change-held-packages --allow-unauthenticated --no-remove %s %s" % \ | ||
305 | (self.apt_get_cmd, self.apt_args, extra_args, ' '.join(pkgs)) | ||
287 | 306 | ||
288 | try: | 307 | try: |
289 | bb.note("Installing the following packages: %s" % ' '.join(pkgs)) | 308 | bb.note("Installing the following packages: %s" % ' '.join(pkgs)) |
@@ -299,13 +318,13 @@ class DpkgPM(OpkgDpkgPM): | |||
299 | for dir in dirs: | 318 | for dir in dirs: |
300 | new_dir = re.sub(r"\.dpkg-new", "", dir) | 319 | new_dir = re.sub(r"\.dpkg-new", "", dir) |
301 | if dir != new_dir: | 320 | if dir != new_dir: |
302 | os.rename(os.path.join(root, dir), | 321 | bb.utils.rename(os.path.join(root, dir), |
303 | os.path.join(root, new_dir)) | 322 | os.path.join(root, new_dir)) |
304 | 323 | ||
305 | for file in files: | 324 | for file in files: |
306 | new_file = re.sub(r"\.dpkg-new", "", file) | 325 | new_file = re.sub(r"\.dpkg-new", "", file) |
307 | if file != new_file: | 326 | if file != new_file: |
308 | os.rename(os.path.join(root, file), | 327 | bb.utils.rename(os.path.join(root, file), |
309 | os.path.join(root, new_file)) | 328 | os.path.join(root, new_file)) |
310 | 329 | ||
311 | 330 | ||
@@ -422,7 +441,7 @@ class DpkgPM(OpkgDpkgPM): | |||
422 | multilib_variants = self.d.getVar("MULTILIB_VARIANTS"); | 441 | multilib_variants = self.d.getVar("MULTILIB_VARIANTS"); |
423 | for variant in multilib_variants.split(): | 442 | for variant in multilib_variants.split(): |
424 | localdata = bb.data.createCopy(self.d) | 443 | localdata = bb.data.createCopy(self.d) |
425 | variant_tune = localdata.getVar("DEFAULTTUNE_virtclass-multilib-" + variant, False) | 444 | variant_tune = localdata.getVar("DEFAULTTUNE:virtclass-multilib-" + variant, False) |
426 | orig_arch = localdata.getVar("DPKG_ARCH") | 445 | orig_arch = localdata.getVar("DPKG_ARCH") |
427 | localdata.setVar("DEFAULTTUNE", variant_tune) | 446 | localdata.setVar("DEFAULTTUNE", variant_tune) |
428 | variant_arch = localdata.getVar("DPKG_ARCH") | 447 | variant_arch = localdata.getVar("DPKG_ARCH") |
diff --git a/meta/lib/oe/package_manager/deb/manifest.py b/meta/lib/oe/package_manager/deb/manifest.py index d8eab24a06..72983bae98 100644 --- a/meta/lib/oe/package_manager/deb/manifest.py +++ b/meta/lib/oe/package_manager/deb/manifest.py | |||
@@ -1,4 +1,6 @@ | |||
1 | # | 1 | # |
2 | # Copyright OpenEmbedded Contributors | ||
3 | # | ||
2 | # SPDX-License-Identifier: GPL-2.0-only | 4 | # SPDX-License-Identifier: GPL-2.0-only |
3 | # | 5 | # |
4 | 6 | ||
diff --git a/meta/lib/oe/package_manager/deb/rootfs.py b/meta/lib/oe/package_manager/deb/rootfs.py index 8fbaca11d6..1e25b64ed9 100644 --- a/meta/lib/oe/package_manager/deb/rootfs.py +++ b/meta/lib/oe/package_manager/deb/rootfs.py | |||
@@ -1,4 +1,6 @@ | |||
1 | # | 1 | # |
2 | # Copyright OpenEmbedded Contributors | ||
3 | # | ||
2 | # SPDX-License-Identifier: GPL-2.0-only | 4 | # SPDX-License-Identifier: GPL-2.0-only |
3 | # | 5 | # |
4 | 6 | ||
diff --git a/meta/lib/oe/package_manager/deb/sdk.py b/meta/lib/oe/package_manager/deb/sdk.py index 9859d8f32d..6f3005053e 100644 --- a/meta/lib/oe/package_manager/deb/sdk.py +++ b/meta/lib/oe/package_manager/deb/sdk.py | |||
@@ -1,4 +1,6 @@ | |||
1 | # | 1 | # |
2 | # Copyright OpenEmbedded Contributors | ||
3 | # | ||
2 | # SPDX-License-Identifier: GPL-2.0-only | 4 | # SPDX-License-Identifier: GPL-2.0-only |
3 | # | 5 | # |
4 | 6 | ||
@@ -65,7 +67,14 @@ class PkgSdk(Sdk): | |||
65 | 67 | ||
66 | self.target_pm.install_complementary(self.d.getVar('SDKIMAGE_INSTALL_COMPLEMENTARY')) | 68 | self.target_pm.install_complementary(self.d.getVar('SDKIMAGE_INSTALL_COMPLEMENTARY')) |
67 | 69 | ||
70 | self.target_pm.run_pre_post_installs() | ||
71 | |||
72 | env_bkp = os.environ.copy() | ||
73 | os.environ['PATH'] = self.d.expand("${COREBASE}/scripts/nativesdk-intercept") + \ | ||
74 | os.pathsep + os.environ["PATH"] | ||
75 | |||
68 | self.target_pm.run_intercepts(populate_sdk='target') | 76 | self.target_pm.run_intercepts(populate_sdk='target') |
77 | os.environ.update(env_bkp) | ||
69 | 78 | ||
70 | execute_pre_post_process(self.d, self.d.getVar("POPULATE_SDK_POST_TARGET_COMMAND")) | 79 | execute_pre_post_process(self.d, self.d.getVar("POPULATE_SDK_POST_TARGET_COMMAND")) |
71 | 80 | ||
@@ -78,6 +87,8 @@ class PkgSdk(Sdk): | |||
78 | self._populate_sysroot(self.host_pm, self.host_manifest) | 87 | self._populate_sysroot(self.host_pm, self.host_manifest) |
79 | self.install_locales(self.host_pm) | 88 | self.install_locales(self.host_pm) |
80 | 89 | ||
90 | self.host_pm.run_pre_post_installs() | ||
91 | |||
81 | self.host_pm.run_intercepts(populate_sdk='host') | 92 | self.host_pm.run_intercepts(populate_sdk='host') |
82 | 93 | ||
83 | execute_pre_post_process(self.d, self.d.getVar("POPULATE_SDK_POST_HOST_COMMAND")) | 94 | execute_pre_post_process(self.d, self.d.getVar("POPULATE_SDK_POST_HOST_COMMAND")) |
diff --git a/meta/lib/oe/package_manager/ipk/__init__.py b/meta/lib/oe/package_manager/ipk/__init__.py index da488c1c7f..0f0038d00d 100644 --- a/meta/lib/oe/package_manager/ipk/__init__.py +++ b/meta/lib/oe/package_manager/ipk/__init__.py | |||
@@ -1,7 +1,10 @@ | |||
1 | # | 1 | # |
2 | # Copyright OpenEmbedded Contributors | ||
3 | # | ||
2 | # SPDX-License-Identifier: GPL-2.0-only | 4 | # SPDX-License-Identifier: GPL-2.0-only |
3 | # | 5 | # |
4 | 6 | ||
7 | import glob | ||
5 | import re | 8 | import re |
6 | import shutil | 9 | import shutil |
7 | import subprocess | 10 | import subprocess |
@@ -14,6 +17,7 @@ class OpkgIndexer(Indexer): | |||
14 | ] | 17 | ] |
15 | 18 | ||
16 | opkg_index_cmd = bb.utils.which(os.getenv('PATH'), "opkg-make-index") | 19 | opkg_index_cmd = bb.utils.which(os.getenv('PATH'), "opkg-make-index") |
20 | opkg_index_cmd_extra_params = self.d.getVar('OPKG_MAKE_INDEX_EXTRA_PARAMS') or "" | ||
17 | if self.d.getVar('PACKAGE_FEED_SIGN') == '1': | 21 | if self.d.getVar('PACKAGE_FEED_SIGN') == '1': |
18 | signer = get_signer(self.d, self.d.getVar('PACKAGE_FEED_GPG_BACKEND')) | 22 | signer = get_signer(self.d, self.d.getVar('PACKAGE_FEED_GPG_BACKEND')) |
19 | else: | 23 | else: |
@@ -39,8 +43,8 @@ class OpkgIndexer(Indexer): | |||
39 | if not os.path.exists(pkgs_file): | 43 | if not os.path.exists(pkgs_file): |
40 | open(pkgs_file, "w").close() | 44 | open(pkgs_file, "w").close() |
41 | 45 | ||
42 | index_cmds.add('%s --checksum md5 --checksum sha256 -r %s -p %s -m %s' % | 46 | index_cmds.add('%s --checksum md5 --checksum sha256 -r %s -p %s -m %s %s' % |
43 | (opkg_index_cmd, pkgs_file, pkgs_file, pkgs_dir)) | 47 | (opkg_index_cmd, pkgs_file, pkgs_file, pkgs_dir, opkg_index_cmd_extra_params)) |
44 | 48 | ||
45 | index_sign_files.add(pkgs_file) | 49 | index_sign_files.add(pkgs_file) |
46 | 50 | ||
@@ -102,12 +106,14 @@ class OpkgDpkgPM(PackageManager): | |||
102 | This method extracts the common parts for Opkg and Dpkg | 106 | This method extracts the common parts for Opkg and Dpkg |
103 | """ | 107 | """ |
104 | 108 | ||
105 | try: | 109 | proc = subprocess.run(cmd, capture_output=True, encoding="utf-8", shell=True) |
106 | output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True).decode("utf-8") | 110 | if proc.returncode: |
107 | except subprocess.CalledProcessError as e: | ||
108 | bb.fatal("Unable to list available packages. Command '%s' " | 111 | bb.fatal("Unable to list available packages. Command '%s' " |
109 | "returned %d:\n%s" % (cmd, e.returncode, e.output.decode("utf-8"))) | 112 | "returned %d:\n%s" % (cmd, proc.returncode, proc.stderr)) |
110 | return opkg_query(output) | 113 | elif proc.stderr: |
114 | bb.note("Command '%s' returned stderr: %s" % (cmd, proc.stderr)) | ||
115 | |||
116 | return opkg_query(proc.stdout) | ||
111 | 117 | ||
112 | def extract(self, pkg, pkg_info): | 118 | def extract(self, pkg, pkg_info): |
113 | """ | 119 | """ |
@@ -129,11 +135,16 @@ class OpkgDpkgPM(PackageManager): | |||
129 | tmp_dir = tempfile.mkdtemp() | 135 | tmp_dir = tempfile.mkdtemp() |
130 | current_dir = os.getcwd() | 136 | current_dir = os.getcwd() |
131 | os.chdir(tmp_dir) | 137 | os.chdir(tmp_dir) |
132 | data_tar = 'data.tar.xz' | ||
133 | 138 | ||
134 | try: | 139 | try: |
135 | cmd = [ar_cmd, 'x', pkg_path] | 140 | cmd = [ar_cmd, 'x', pkg_path] |
136 | output = subprocess.check_output(cmd, stderr=subprocess.STDOUT) | 141 | output = subprocess.check_output(cmd, stderr=subprocess.STDOUT) |
142 | data_tar = glob.glob("data.tar.*") | ||
143 | if len(data_tar) != 1: | ||
144 | bb.fatal("Unable to extract %s package. Failed to identify " | ||
145 | "data tarball (found tarballs '%s').", | ||
146 | pkg_path, data_tar) | ||
147 | data_tar = data_tar[0] | ||
137 | cmd = [tar_cmd, 'xf', data_tar] | 148 | cmd = [tar_cmd, 'xf', data_tar] |
138 | output = subprocess.check_output(cmd, stderr=subprocess.STDOUT) | 149 | output = subprocess.check_output(cmd, stderr=subprocess.STDOUT) |
139 | except subprocess.CalledProcessError as e: | 150 | except subprocess.CalledProcessError as e: |
@@ -213,7 +224,7 @@ class OpkgPM(OpkgDpkgPM): | |||
213 | 224 | ||
214 | tmp_sf.write(status) | 225 | tmp_sf.write(status) |
215 | 226 | ||
216 | os.rename(status_file + ".tmp", status_file) | 227 | bb.utils.rename(status_file + ".tmp", status_file) |
217 | 228 | ||
218 | def _create_custom_config(self): | 229 | def _create_custom_config(self): |
219 | bb.note("Building from feeds activated!") | 230 | bb.note("Building from feeds activated!") |
@@ -243,7 +254,7 @@ class OpkgPM(OpkgDpkgPM): | |||
243 | """ | 254 | """ |
244 | if (self.d.getVar('FEED_DEPLOYDIR_BASE_URI') or "") != "": | 255 | if (self.d.getVar('FEED_DEPLOYDIR_BASE_URI') or "") != "": |
245 | for arch in self.pkg_archs.split(): | 256 | for arch in self.pkg_archs.split(): |
246 | cfg_file_name = os.path.join(self.target_rootfs, | 257 | cfg_file_name = oe.path.join(self.target_rootfs, |
247 | self.d.getVar("sysconfdir"), | 258 | self.d.getVar("sysconfdir"), |
248 | "opkg", | 259 | "opkg", |
249 | "local-%s-feed.conf" % arch) | 260 | "local-%s-feed.conf" % arch) |
@@ -337,7 +348,7 @@ class OpkgPM(OpkgDpkgPM): | |||
337 | 348 | ||
338 | self.deploy_dir_unlock() | 349 | self.deploy_dir_unlock() |
339 | 350 | ||
340 | def install(self, pkgs, attempt_only=False): | 351 | def install(self, pkgs, attempt_only=False, hard_depends_only=False): |
341 | if not pkgs: | 352 | if not pkgs: |
342 | return | 353 | return |
343 | 354 | ||
@@ -346,6 +357,8 @@ class OpkgPM(OpkgDpkgPM): | |||
346 | cmd += " --add-exclude %s" % exclude | 357 | cmd += " --add-exclude %s" % exclude |
347 | for bad_recommendation in (self.d.getVar("BAD_RECOMMENDATIONS") or "").split(): | 358 | for bad_recommendation in (self.d.getVar("BAD_RECOMMENDATIONS") or "").split(): |
348 | cmd += " --add-ignore-recommends %s" % bad_recommendation | 359 | cmd += " --add-ignore-recommends %s" % bad_recommendation |
360 | if hard_depends_only: | ||
361 | cmd += " --no-install-recommends" | ||
349 | cmd += " install " | 362 | cmd += " install " |
350 | cmd += " ".join(pkgs) | 363 | cmd += " ".join(pkgs) |
351 | 364 | ||
@@ -443,15 +456,16 @@ class OpkgPM(OpkgDpkgPM): | |||
443 | cmd = "%s %s --noaction install %s " % (self.opkg_cmd, | 456 | cmd = "%s %s --noaction install %s " % (self.opkg_cmd, |
444 | opkg_args, | 457 | opkg_args, |
445 | ' '.join(pkgs)) | 458 | ' '.join(pkgs)) |
446 | try: | 459 | proc = subprocess.run(cmd, capture_output=True, encoding="utf-8", shell=True) |
447 | output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) | 460 | if proc.returncode: |
448 | except subprocess.CalledProcessError as e: | ||
449 | bb.fatal("Unable to dummy install packages. Command '%s' " | 461 | bb.fatal("Unable to dummy install packages. Command '%s' " |
450 | "returned %d:\n%s" % (cmd, e.returncode, e.output.decode("utf-8"))) | 462 | "returned %d:\n%s" % (cmd, proc.returncode, proc.stderr)) |
463 | elif proc.stderr: | ||
464 | bb.note("Command '%s' returned stderr: %s" % (cmd, proc.stderr)) | ||
451 | 465 | ||
452 | bb.utils.remove(temp_rootfs, True) | 466 | bb.utils.remove(temp_rootfs, True) |
453 | 467 | ||
454 | return output | 468 | return proc.stdout |
455 | 469 | ||
456 | def backup_packaging_data(self): | 470 | def backup_packaging_data(self): |
457 | # Save the opkglib for increment ipk image generation | 471 | # Save the opkglib for increment ipk image generation |
@@ -498,6 +512,6 @@ class OpkgPM(OpkgDpkgPM): | |||
498 | "trying to extract the package." % pkg) | 512 | "trying to extract the package." % pkg) |
499 | 513 | ||
500 | tmp_dir = super(OpkgPM, self).extract(pkg, pkg_info) | 514 | tmp_dir = super(OpkgPM, self).extract(pkg, pkg_info) |
501 | bb.utils.remove(os.path.join(tmp_dir, "data.tar.xz")) | 515 | bb.utils.remove(os.path.join(tmp_dir, "data.tar.zst")) |
502 | 516 | ||
503 | return tmp_dir | 517 | return tmp_dir |
diff --git a/meta/lib/oe/package_manager/ipk/manifest.py b/meta/lib/oe/package_manager/ipk/manifest.py index ee4b57bcb0..3549d7428d 100644 --- a/meta/lib/oe/package_manager/ipk/manifest.py +++ b/meta/lib/oe/package_manager/ipk/manifest.py | |||
@@ -1,8 +1,11 @@ | |||
1 | # | 1 | # |
2 | # Copyright OpenEmbedded Contributors | ||
3 | # | ||
2 | # SPDX-License-Identifier: GPL-2.0-only | 4 | # SPDX-License-Identifier: GPL-2.0-only |
3 | # | 5 | # |
4 | 6 | ||
5 | from oe.manifest import Manifest | 7 | from oe.manifest import Manifest |
8 | import re | ||
6 | 9 | ||
7 | class PkgManifest(Manifest): | 10 | class PkgManifest(Manifest): |
8 | """ | 11 | """ |
diff --git a/meta/lib/oe/package_manager/ipk/rootfs.py b/meta/lib/oe/package_manager/ipk/rootfs.py index 26dbee6f6a..ba93eb62ea 100644 --- a/meta/lib/oe/package_manager/ipk/rootfs.py +++ b/meta/lib/oe/package_manager/ipk/rootfs.py | |||
@@ -1,4 +1,6 @@ | |||
1 | # | 1 | # |
2 | # Copyright OpenEmbedded Contributors | ||
3 | # | ||
2 | # SPDX-License-Identifier: GPL-2.0-only | 4 | # SPDX-License-Identifier: GPL-2.0-only |
3 | # | 5 | # |
4 | 6 | ||
@@ -145,51 +147,14 @@ class PkgRootfs(DpkgOpkgRootfs): | |||
145 | self.pm.recover_packaging_data() | 147 | self.pm.recover_packaging_data() |
146 | 148 | ||
147 | bb.utils.remove(self.d.getVar('MULTILIB_TEMP_ROOTFS'), True) | 149 | bb.utils.remove(self.d.getVar('MULTILIB_TEMP_ROOTFS'), True) |
148 | |||
149 | def _prelink_file(self, root_dir, filename): | ||
150 | bb.note('prelink %s in %s' % (filename, root_dir)) | ||
151 | prelink_cfg = oe.path.join(root_dir, | ||
152 | self.d.expand('${sysconfdir}/prelink.conf')) | ||
153 | if not os.path.exists(prelink_cfg): | ||
154 | shutil.copy(self.d.expand('${STAGING_DIR_NATIVE}${sysconfdir_native}/prelink.conf'), | ||
155 | prelink_cfg) | ||
156 | |||
157 | cmd_prelink = self.d.expand('${STAGING_DIR_NATIVE}${sbindir_native}/prelink') | ||
158 | self._exec_shell_cmd([cmd_prelink, | ||
159 | '--root', | ||
160 | root_dir, | ||
161 | '-amR', | ||
162 | '-N', | ||
163 | '-c', | ||
164 | self.d.expand('${sysconfdir}/prelink.conf')]) | ||
165 | |||
166 | ''' | 150 | ''' |
167 | Compare two files with the same key twice to see if they are equal. | 151 | Compare two files with the same key twice to see if they are equal. |
168 | If they are not equal, it means they are duplicated and come from | 152 | If they are not equal, it means they are duplicated and come from |
169 | different packages. | 153 | different packages. |
170 | 1st: Comapre them directly; | ||
171 | 2nd: While incremental image creation is enabled, one of the | ||
172 | files could be probaly prelinked in the previous image | ||
173 | creation and the file has been changed, so we need to | ||
174 | prelink the other one and compare them. | ||
175 | ''' | 154 | ''' |
176 | def _file_equal(self, key, f1, f2): | 155 | def _file_equal(self, key, f1, f2): |
177 | |||
178 | # Both of them are not prelinked | ||
179 | if filecmp.cmp(f1, f2): | 156 | if filecmp.cmp(f1, f2): |
180 | return True | 157 | return True |
181 | |||
182 | if bb.data.inherits_class('image-prelink', self.d): | ||
183 | if self.image_rootfs not in f1: | ||
184 | self._prelink_file(f1.replace(key, ''), f1) | ||
185 | |||
186 | if self.image_rootfs not in f2: | ||
187 | self._prelink_file(f2.replace(key, ''), f2) | ||
188 | |||
189 | # Both of them are prelinked | ||
190 | if filecmp.cmp(f1, f2): | ||
191 | return True | ||
192 | |||
193 | # Not equal | 158 | # Not equal |
194 | return False | 159 | return False |
195 | 160 | ||
@@ -200,7 +165,7 @@ class PkgRootfs(DpkgOpkgRootfs): | |||
200 | """ | 165 | """ |
201 | def _multilib_sanity_test(self, dirs): | 166 | def _multilib_sanity_test(self, dirs): |
202 | 167 | ||
203 | allow_replace = self.d.getVar("MULTILIBRE_ALLOW_REP") | 168 | allow_replace = "|".join((self.d.getVar("MULTILIBRE_ALLOW_REP") or "").split()) |
204 | if allow_replace is None: | 169 | if allow_replace is None: |
205 | allow_replace = "" | 170 | allow_replace = "" |
206 | 171 | ||
diff --git a/meta/lib/oe/package_manager/ipk/sdk.py b/meta/lib/oe/package_manager/ipk/sdk.py index e2ca415c8e..3acd55f548 100644 --- a/meta/lib/oe/package_manager/ipk/sdk.py +++ b/meta/lib/oe/package_manager/ipk/sdk.py | |||
@@ -1,4 +1,6 @@ | |||
1 | # | 1 | # |
2 | # Copyright OpenEmbedded Contributors | ||
3 | # | ||
2 | # SPDX-License-Identifier: GPL-2.0-only | 4 | # SPDX-License-Identifier: GPL-2.0-only |
3 | # | 5 | # |
4 | 6 | ||
@@ -61,12 +63,19 @@ class PkgSdk(Sdk): | |||
61 | 63 | ||
62 | self.target_pm.install_complementary(self.d.getVar('SDKIMAGE_INSTALL_COMPLEMENTARY')) | 64 | self.target_pm.install_complementary(self.d.getVar('SDKIMAGE_INSTALL_COMPLEMENTARY')) |
63 | 65 | ||
66 | env_bkp = os.environ.copy() | ||
67 | os.environ['PATH'] = self.d.expand("${COREBASE}/scripts/nativesdk-intercept") + \ | ||
68 | os.pathsep + os.environ["PATH"] | ||
69 | |||
64 | self.target_pm.run_intercepts(populate_sdk='target') | 70 | self.target_pm.run_intercepts(populate_sdk='target') |
71 | os.environ.update(env_bkp) | ||
65 | 72 | ||
66 | execute_pre_post_process(self.d, self.d.getVar("POPULATE_SDK_POST_TARGET_COMMAND")) | 73 | execute_pre_post_process(self.d, self.d.getVar("POPULATE_SDK_POST_TARGET_COMMAND")) |
67 | 74 | ||
68 | if not bb.utils.contains("SDKIMAGE_FEATURES", "package-management", True, False, self.d): | 75 | if not bb.utils.contains("SDKIMAGE_FEATURES", "package-management", True, False, self.d): |
69 | self.target_pm.remove_packaging_data() | 76 | self.target_pm.remove_packaging_data() |
77 | else: | ||
78 | self.target_pm.remove_lists() | ||
70 | 79 | ||
71 | bb.note("Installing NATIVESDK packages") | 80 | bb.note("Installing NATIVESDK packages") |
72 | self._populate_sysroot(self.host_pm, self.host_manifest) | 81 | self._populate_sysroot(self.host_pm, self.host_manifest) |
@@ -78,6 +87,8 @@ class PkgSdk(Sdk): | |||
78 | 87 | ||
79 | if not bb.utils.contains("SDKIMAGE_FEATURES", "package-management", True, False, self.d): | 88 | if not bb.utils.contains("SDKIMAGE_FEATURES", "package-management", True, False, self.d): |
80 | self.host_pm.remove_packaging_data() | 89 | self.host_pm.remove_packaging_data() |
90 | else: | ||
91 | self.host_pm.remove_lists() | ||
81 | 92 | ||
82 | target_sysconfdir = os.path.join(self.sdk_target_sysroot, self.sysconfdir) | 93 | target_sysconfdir = os.path.join(self.sdk_target_sysroot, self.sysconfdir) |
83 | host_sysconfdir = os.path.join(self.sdk_host_sysroot, self.sysconfdir) | 94 | host_sysconfdir = os.path.join(self.sdk_host_sysroot, self.sysconfdir) |
diff --git a/meta/lib/oe/package_manager/rpm/__init__.py b/meta/lib/oe/package_manager/rpm/__init__.py index 6df0092281..f40c880af4 100644 --- a/meta/lib/oe/package_manager/rpm/__init__.py +++ b/meta/lib/oe/package_manager/rpm/__init__.py | |||
@@ -1,4 +1,6 @@ | |||
1 | # | 1 | # |
2 | # Copyright OpenEmbedded Contributors | ||
3 | # | ||
2 | # SPDX-License-Identifier: GPL-2.0-only | 4 | # SPDX-License-Identifier: GPL-2.0-only |
3 | # | 5 | # |
4 | 6 | ||
@@ -96,11 +98,15 @@ class RpmPM(PackageManager): | |||
96 | archs = ["sdk_provides_dummy_target"] + archs | 98 | archs = ["sdk_provides_dummy_target"] + archs |
97 | confdir = "%s/%s" %(self.target_rootfs, "etc/dnf/vars/") | 99 | confdir = "%s/%s" %(self.target_rootfs, "etc/dnf/vars/") |
98 | bb.utils.mkdirhier(confdir) | 100 | bb.utils.mkdirhier(confdir) |
99 | open(confdir + "arch", 'w').write(":".join(archs)) | 101 | with open(confdir + "arch", 'w') as f: |
102 | f.write(":".join(archs)) | ||
103 | |||
100 | distro_codename = self.d.getVar('DISTRO_CODENAME') | 104 | distro_codename = self.d.getVar('DISTRO_CODENAME') |
101 | open(confdir + "releasever", 'w').write(distro_codename if distro_codename is not None else '') | 105 | with open(confdir + "releasever", 'w') as f: |
106 | f.write(distro_codename if distro_codename is not None else '') | ||
102 | 107 | ||
103 | open(oe.path.join(self.target_rootfs, "etc/dnf/dnf.conf"), 'w').write("") | 108 | with open(oe.path.join(self.target_rootfs, "etc/dnf/dnf.conf"), 'w') as f: |
109 | f.write("") | ||
104 | 110 | ||
105 | 111 | ||
106 | def _configure_rpm(self): | 112 | def _configure_rpm(self): |
@@ -110,14 +116,17 @@ class RpmPM(PackageManager): | |||
110 | platformconfdir = "%s/%s" %(self.target_rootfs, "etc/rpm/") | 116 | platformconfdir = "%s/%s" %(self.target_rootfs, "etc/rpm/") |
111 | rpmrcconfdir = "%s/%s" %(self.target_rootfs, "etc/") | 117 | rpmrcconfdir = "%s/%s" %(self.target_rootfs, "etc/") |
112 | bb.utils.mkdirhier(platformconfdir) | 118 | bb.utils.mkdirhier(platformconfdir) |
113 | open(platformconfdir + "platform", 'w').write("%s-pc-linux" % self.primary_arch) | 119 | with open(platformconfdir + "platform", 'w') as f: |
120 | f.write("%s-pc-linux" % self.primary_arch) | ||
114 | with open(rpmrcconfdir + "rpmrc", 'w') as f: | 121 | with open(rpmrcconfdir + "rpmrc", 'w') as f: |
115 | f.write("arch_compat: %s: %s\n" % (self.primary_arch, self.archs if len(self.archs) > 0 else self.primary_arch)) | 122 | f.write("arch_compat: %s: %s\n" % (self.primary_arch, self.archs if len(self.archs) > 0 else self.primary_arch)) |
116 | f.write("buildarch_compat: %s: noarch\n" % self.primary_arch) | 123 | f.write("buildarch_compat: %s: noarch\n" % self.primary_arch) |
117 | 124 | ||
118 | open(platformconfdir + "macros", 'w').write("%_transaction_color 7\n") | 125 | with open(platformconfdir + "macros", 'w') as f: |
126 | f.write("%_transaction_color 7\n") | ||
119 | if self.d.getVar('RPM_PREFER_ELF_ARCH'): | 127 | if self.d.getVar('RPM_PREFER_ELF_ARCH'): |
120 | open(platformconfdir + "macros", 'a').write("%%_prefer_color %s" % (self.d.getVar('RPM_PREFER_ELF_ARCH'))) | 128 | with open(platformconfdir + "macros", 'a') as f: |
129 | f.write("%%_prefer_color %s" % (self.d.getVar('RPM_PREFER_ELF_ARCH'))) | ||
121 | 130 | ||
122 | if self.d.getVar('RPM_SIGN_PACKAGES') == '1': | 131 | if self.d.getVar('RPM_SIGN_PACKAGES') == '1': |
123 | signer = get_signer(self.d, self.d.getVar('RPM_GPG_BACKEND')) | 132 | signer = get_signer(self.d, self.d.getVar('RPM_GPG_BACKEND')) |
@@ -164,13 +173,13 @@ class RpmPM(PackageManager): | |||
164 | repo_uri = uri + "/" + arch | 173 | repo_uri = uri + "/" + arch |
165 | repo_id = "oe-remote-repo" + "-".join(urlparse(repo_uri).path.split("/")) | 174 | repo_id = "oe-remote-repo" + "-".join(urlparse(repo_uri).path.split("/")) |
166 | repo_name = "OE Remote Repo:" + " ".join(urlparse(repo_uri).path.split("/")) | 175 | repo_name = "OE Remote Repo:" + " ".join(urlparse(repo_uri).path.split("/")) |
167 | open(oe.path.join(self.target_rootfs, "etc", "yum.repos.d", repo_base + ".repo"), 'a').write( | 176 | with open(oe.path.join(self.target_rootfs, "etc", "yum.repos.d", repo_base + ".repo"), 'a') as f: |
168 | "[%s]\nname=%s\nbaseurl=%s\n%s\n" % (repo_id, repo_name, repo_uri, gpg_opts)) | 177 | f.write("[%s]\nname=%s\nbaseurl=%s\n%s\n" % (repo_id, repo_name, repo_uri, gpg_opts)) |
169 | else: | 178 | else: |
170 | repo_name = "OE Remote Repo:" + " ".join(urlparse(uri).path.split("/")) | 179 | repo_name = "OE Remote Repo:" + " ".join(urlparse(uri).path.split("/")) |
171 | repo_uri = uri | 180 | repo_uri = uri |
172 | open(oe.path.join(self.target_rootfs, "etc", "yum.repos.d", repo_base + ".repo"), 'w').write( | 181 | with open(oe.path.join(self.target_rootfs, "etc", "yum.repos.d", repo_base + ".repo"), 'w') as f: |
173 | "[%s]\nname=%s\nbaseurl=%s\n%s" % (repo_base, repo_name, repo_uri, gpg_opts)) | 182 | f.write("[%s]\nname=%s\nbaseurl=%s\n%s" % (repo_base, repo_name, repo_uri, gpg_opts)) |
174 | 183 | ||
175 | def _prepare_pkg_transaction(self): | 184 | def _prepare_pkg_transaction(self): |
176 | os.environ['D'] = self.target_rootfs | 185 | os.environ['D'] = self.target_rootfs |
@@ -181,7 +190,7 @@ class RpmPM(PackageManager): | |||
181 | os.environ['NATIVE_ROOT'] = self.d.getVar('STAGING_DIR_NATIVE') | 190 | os.environ['NATIVE_ROOT'] = self.d.getVar('STAGING_DIR_NATIVE') |
182 | 191 | ||
183 | 192 | ||
184 | def install(self, pkgs, attempt_only = False): | 193 | def install(self, pkgs, attempt_only=False, hard_depends_only=False): |
185 | if len(pkgs) == 0: | 194 | if len(pkgs) == 0: |
186 | return | 195 | return |
187 | self._prepare_pkg_transaction() | 196 | self._prepare_pkg_transaction() |
@@ -192,13 +201,16 @@ class RpmPM(PackageManager): | |||
192 | 201 | ||
193 | output = self._invoke_dnf((["--skip-broken"] if attempt_only else []) + | 202 | output = self._invoke_dnf((["--skip-broken"] if attempt_only else []) + |
194 | (["-x", ",".join(exclude_pkgs)] if len(exclude_pkgs) > 0 else []) + | 203 | (["-x", ",".join(exclude_pkgs)] if len(exclude_pkgs) > 0 else []) + |
195 | (["--setopt=install_weak_deps=False"] if self.d.getVar('NO_RECOMMENDATIONS') == "1" else []) + | 204 | (["--setopt=install_weak_deps=False"] if (hard_depends_only or self.d.getVar('NO_RECOMMENDATIONS') == "1") else []) + |
196 | (["--nogpgcheck"] if self.d.getVar('RPM_SIGN_PACKAGES') != '1' else ["--setopt=gpgcheck=True"]) + | 205 | (["--nogpgcheck"] if self.d.getVar('RPM_SIGN_PACKAGES') != '1' else ["--setopt=gpgcheck=True"]) + |
197 | ["install"] + | 206 | ["install"] + |
198 | pkgs) | 207 | pkgs) |
199 | 208 | ||
200 | failed_scriptlets_pkgnames = collections.OrderedDict() | 209 | failed_scriptlets_pkgnames = collections.OrderedDict() |
201 | for line in output.splitlines(): | 210 | for line in output.splitlines(): |
211 | if line.startswith("Error: Systemctl"): | ||
212 | bb.error(line) | ||
213 | |||
202 | if line.startswith("Error in POSTIN scriptlet in rpm package"): | 214 | if line.startswith("Error in POSTIN scriptlet in rpm package"): |
203 | failed_scriptlets_pkgnames[line.split()[-1]] = True | 215 | failed_scriptlets_pkgnames[line.split()[-1]] = True |
204 | 216 | ||
@@ -326,7 +338,8 @@ class RpmPM(PackageManager): | |||
326 | return e.output.decode("utf-8") | 338 | return e.output.decode("utf-8") |
327 | 339 | ||
328 | def dump_install_solution(self, pkgs): | 340 | def dump_install_solution(self, pkgs): |
329 | open(self.solution_manifest, 'w').write(" ".join(pkgs)) | 341 | with open(self.solution_manifest, 'w') as f: |
342 | f.write(" ".join(pkgs)) | ||
330 | return pkgs | 343 | return pkgs |
331 | 344 | ||
332 | def load_old_install_solution(self): | 345 | def load_old_install_solution(self): |
@@ -360,7 +373,8 @@ class RpmPM(PackageManager): | |||
360 | bb.utils.mkdirhier(target_path) | 373 | bb.utils.mkdirhier(target_path) |
361 | num = self._script_num_prefix(target_path) | 374 | num = self._script_num_prefix(target_path) |
362 | saved_script_name = oe.path.join(target_path, "%d-%s" % (num, pkg)) | 375 | saved_script_name = oe.path.join(target_path, "%d-%s" % (num, pkg)) |
363 | open(saved_script_name, 'w').write(output) | 376 | with open(saved_script_name, 'w') as f: |
377 | f.write(output) | ||
364 | os.chmod(saved_script_name, 0o755) | 378 | os.chmod(saved_script_name, 0o755) |
365 | 379 | ||
366 | def _handle_intercept_failure(self, registered_pkgs): | 380 | def _handle_intercept_failure(self, registered_pkgs): |
@@ -372,11 +386,12 @@ class RpmPM(PackageManager): | |||
372 | self.save_rpmpostinst(pkg) | 386 | self.save_rpmpostinst(pkg) |
373 | 387 | ||
374 | def extract(self, pkg): | 388 | def extract(self, pkg): |
375 | output = self._invoke_dnf(["repoquery", "--queryformat", "%{location}", pkg]) | 389 | output = self._invoke_dnf(["repoquery", "--location", pkg]) |
376 | pkg_name = output.splitlines()[-1] | 390 | pkg_name = output.splitlines()[-1] |
377 | if not pkg_name.endswith(".rpm"): | 391 | if not pkg_name.endswith(".rpm"): |
378 | bb.fatal("dnf could not find package %s in repository: %s" %(pkg, output)) | 392 | bb.fatal("dnf could not find package %s in repository: %s" %(pkg, output)) |
379 | pkg_path = oe.path.join(self.rpm_repo_dir, pkg_name) | 393 | # Strip file: prefix |
394 | pkg_path = pkg_name[5:] | ||
380 | 395 | ||
381 | cpio_cmd = bb.utils.which(os.getenv("PATH"), "cpio") | 396 | cpio_cmd = bb.utils.which(os.getenv("PATH"), "cpio") |
382 | rpm2cpio_cmd = bb.utils.which(os.getenv("PATH"), "rpm2cpio") | 397 | rpm2cpio_cmd = bb.utils.which(os.getenv("PATH"), "rpm2cpio") |
diff --git a/meta/lib/oe/package_manager/rpm/manifest.py b/meta/lib/oe/package_manager/rpm/manifest.py index e6604b301f..6ee7c329f0 100644 --- a/meta/lib/oe/package_manager/rpm/manifest.py +++ b/meta/lib/oe/package_manager/rpm/manifest.py | |||
@@ -1,4 +1,6 @@ | |||
1 | # | 1 | # |
2 | # Copyright OpenEmbedded Contributors | ||
3 | # | ||
2 | # SPDX-License-Identifier: GPL-2.0-only | 4 | # SPDX-License-Identifier: GPL-2.0-only |
3 | # | 5 | # |
4 | 6 | ||
diff --git a/meta/lib/oe/package_manager/rpm/rootfs.py b/meta/lib/oe/package_manager/rpm/rootfs.py index 00d07cd9cc..3ba5396320 100644 --- a/meta/lib/oe/package_manager/rpm/rootfs.py +++ b/meta/lib/oe/package_manager/rpm/rootfs.py | |||
@@ -1,4 +1,6 @@ | |||
1 | # | 1 | # |
2 | # Copyright OpenEmbedded Contributors | ||
3 | # | ||
2 | # SPDX-License-Identifier: GPL-2.0-only | 4 | # SPDX-License-Identifier: GPL-2.0-only |
3 | # | 5 | # |
4 | 6 | ||
@@ -108,7 +110,7 @@ class PkgRootfs(Rootfs): | |||
108 | if self.progress_reporter: | 110 | if self.progress_reporter: |
109 | self.progress_reporter.next_stage() | 111 | self.progress_reporter.next_stage() |
110 | 112 | ||
111 | self._setup_dbg_rootfs(['/etc', '/var/lib/rpm', '/var/cache/dnf', '/var/lib/dnf']) | 113 | self._setup_dbg_rootfs(['/etc/rpm', '/etc/rpmrc', '/etc/dnf', '/var/lib/rpm', '/var/cache/dnf', '/var/lib/dnf']) |
112 | 114 | ||
113 | execute_pre_post_process(self.d, rpm_post_process_cmds) | 115 | execute_pre_post_process(self.d, rpm_post_process_cmds) |
114 | 116 | ||
diff --git a/meta/lib/oe/package_manager/rpm/sdk.py b/meta/lib/oe/package_manager/rpm/sdk.py index c5f232431f..ea79fe050b 100644 --- a/meta/lib/oe/package_manager/rpm/sdk.py +++ b/meta/lib/oe/package_manager/rpm/sdk.py | |||
@@ -1,4 +1,6 @@ | |||
1 | # | 1 | # |
2 | # Copyright OpenEmbedded Contributors | ||
3 | # | ||
2 | # SPDX-License-Identifier: GPL-2.0-only | 4 | # SPDX-License-Identifier: GPL-2.0-only |
3 | # | 5 | # |
4 | 6 | ||
@@ -65,7 +67,12 @@ class PkgSdk(Sdk): | |||
65 | 67 | ||
66 | self.target_pm.install_complementary(self.d.getVar('SDKIMAGE_INSTALL_COMPLEMENTARY')) | 68 | self.target_pm.install_complementary(self.d.getVar('SDKIMAGE_INSTALL_COMPLEMENTARY')) |
67 | 69 | ||
70 | env_bkp = os.environ.copy() | ||
71 | os.environ['PATH'] = self.d.expand("${COREBASE}/scripts/nativesdk-intercept") + \ | ||
72 | os.pathsep + os.environ["PATH"] | ||
73 | |||
68 | self.target_pm.run_intercepts(populate_sdk='target') | 74 | self.target_pm.run_intercepts(populate_sdk='target') |
75 | os.environ.update(env_bkp) | ||
69 | 76 | ||
70 | execute_pre_post_process(self.d, self.d.getVar("POPULATE_SDK_POST_TARGET_COMMAND")) | 77 | execute_pre_post_process(self.d, self.d.getVar("POPULATE_SDK_POST_TARGET_COMMAND")) |
71 | 78 | ||
@@ -110,5 +117,6 @@ class PkgSdk(Sdk): | |||
110 | for f in glob.glob(os.path.join(self.sdk_output, "etc", "rpm*")): | 117 | for f in glob.glob(os.path.join(self.sdk_output, "etc", "rpm*")): |
111 | self.movefile(f, native_sysconf_dir) | 118 | self.movefile(f, native_sysconf_dir) |
112 | for f in glob.glob(os.path.join(self.sdk_output, "etc", "dnf", "*")): | 119 | for f in glob.glob(os.path.join(self.sdk_output, "etc", "dnf", "*")): |
113 | self.movefile(f, native_sysconf_dir) | 120 | self.mkdirhier(native_sysconf_dir + "/dnf") |
121 | self.movefile(f, native_sysconf_dir + "/dnf") | ||
114 | self.remove(os.path.join(self.sdk_output, "etc"), True) | 122 | self.remove(os.path.join(self.sdk_output, "etc"), True) |