diff options
| author | Laurentiu Palcu <laurentiu.palcu@intel.com> | 2013-12-18 17:32:18 +0200 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2014-02-11 11:53:38 +0000 |
| commit | 5d34962d1542aec0073fae48cef5f82db292db8e (patch) | |
| tree | a61b216d9d746eb85f41cb745058ac218e4328ad /meta | |
| parent | 8cfe5555a2977ab503cfc843520884d45c1e9338 (diff) | |
| download | poky-5d34962d1542aec0073fae48cef5f82db292db8e.tar.gz | |
lib/oe/manifest.py: add library for image manifest creation
This new library allows for the creation of 2 types of manifests:
* initial manifest - used by the new rootfs creation routines to
generate the rootfs;
* final_manifest - this will contain all the packages in the image,
after all installations finished;
Usage:
Manifest(d, manifest_dir).create_initial()
Manifest(d, manifest_dir).create_final()
or using the provided wrapper function:
create_manifest(d, False, manifest_dir) -> creates initial manifest
create_manifest(d, True, manifest_dir) -> creates final manifest
If manifest_dir argument is ommited, it defaults to ${WORKDIR}.
NOTE: this commit creates fixed manifests for minimal/sato/sato-sdk
images, for Rpm & Opkg backends, in order to help speed up
development of rootfs refactoring. Dpkg initial manifest creation is
implemented.
(From OE-Core rev: a9d8e5e5878d14b4804317a7f7ea6394fca5e010)
Signed-off-by: Laurentiu Palcu <laurentiu.palcu@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
| -rw-r--r-- | meta/lib/oe/manifest.py | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/meta/lib/oe/manifest.py b/meta/lib/oe/manifest.py new file mode 100644 index 0000000000..5d01022c36 --- /dev/null +++ b/meta/lib/oe/manifest.py | |||
| @@ -0,0 +1,165 @@ | |||
| 1 | from abc import ABCMeta, abstractmethod | ||
| 2 | import os | ||
| 3 | import re | ||
| 4 | |||
| 5 | |||
| 6 | class Manifest(object): | ||
| 7 | """ | ||
| 8 | This is an abstract class. Do not instantiate this directly. | ||
| 9 | """ | ||
| 10 | __metaclass__ = ABCMeta | ||
| 11 | |||
| 12 | initial_manifest_file_header = \ | ||
| 13 | "# This file was generated automatically and contains the packages\n" \ | ||
| 14 | "# passed on to the package manager in order to create the rootfs.\n\n" \ | ||
| 15 | "# Format:\n" \ | ||
| 16 | "# <package_type>,<package_name>\n" \ | ||
| 17 | "# where:\n" \ | ||
| 18 | "# <package_type> can be:\n" \ | ||
| 19 | "# 'mip' = must install package\n" \ | ||
| 20 | "# 'aop' = attempt only package\n" \ | ||
| 21 | "# 'mlp' = multilib package\n" \ | ||
| 22 | "# 'lgp' = language package\n\n" | ||
| 23 | |||
| 24 | def __init__(self, d, manifest_dir=None): | ||
| 25 | self.d = d | ||
| 26 | self.image_rootfs = d.getVar('IMAGE_ROOTFS', True) | ||
| 27 | |||
| 28 | if manifest_dir is None: | ||
| 29 | self.manifest_dir = self.d.getVar('WORKDIR', True) | ||
| 30 | else: | ||
| 31 | self.manifest_dir = manifest_dir | ||
| 32 | |||
| 33 | self.initial_manifest = os.path.join(self.manifest_dir, "initial_manifest") | ||
| 34 | self.final_manifest = os.path.join(self.manifest_dir, "final_manifest") | ||
| 35 | |||
| 36 | """ | ||
| 37 | This creates a standard initial manifest for core-image-(minimal|sato|sato-sdk). | ||
| 38 | This will be used for testing until the class is implemented properly! | ||
| 39 | """ | ||
| 40 | def _create_dummy_initial(self): | ||
| 41 | pkg_list = dict() | ||
| 42 | if self.image_rootfs.find("core-image-sato-sdk") > 0: | ||
| 43 | pkg_list['mip'] = \ | ||
| 44 | "packagegroup-core-x11-sato-games packagegroup-base-extended " \ | ||
| 45 | "packagegroup-core-x11-sato packagegroup-core-x11-base " \ | ||
| 46 | "packagegroup-core-sdk packagegroup-core-tools-debug " \ | ||
| 47 | "packagegroup-core-boot packagegroup-core-tools-testapps " \ | ||
| 48 | "packagegroup-core-eclipse-debug packagegroup-core-qt-demoapps " \ | ||
| 49 | "apt packagegroup-core-tools-profile psplash " \ | ||
| 50 | "packagegroup-core-standalone-sdk-target " \ | ||
| 51 | "packagegroup-core-ssh-openssh dpkg kernel-dev" | ||
| 52 | pkg_list['lgp'] = \ | ||
| 53 | "locale-base-en-us locale-base-en-gb" | ||
| 54 | elif self.image_rootfs.find("core-image-sato") > 0: | ||
| 55 | pkg_list['mip'] = \ | ||
| 56 | "packagegroup-core-ssh-dropbear packagegroup-core-x11-sato-games " \ | ||
| 57 | "packagegroup-core-x11-base psplash apt dpkg packagegroup-base-extended " \ | ||
| 58 | "packagegroup-core-x11-sato packagegroup-core-boot" | ||
| 59 | pkg_list['lgp'] = \ | ||
| 60 | "locale-base-en-us locale-base-en-gb" | ||
| 61 | elif self.image_rootfs.find("core-image-minimal") > 0: | ||
| 62 | pkg_list['mip'] = "run-postinsts packagegroup-core-boot" | ||
| 63 | |||
| 64 | with open(self.initial_manifest, "w+") as manifest: | ||
| 65 | manifest.write(self.initial_manifest_file_header) | ||
| 66 | |||
| 67 | for pkg_type in pkg_list: | ||
| 68 | for pkg in pkg_list[pkg_type].split(): | ||
| 69 | manifest.write("%s,%s\n" % (pkg_type, pkg)) | ||
| 70 | |||
| 71 | """ | ||
| 72 | This will create the initial manifest which will be used by Rootfs class to | ||
| 73 | generate the rootfs | ||
| 74 | """ | ||
| 75 | @abstractmethod | ||
| 76 | def create_initial(self): | ||
| 77 | pass | ||
| 78 | |||
| 79 | """ | ||
| 80 | This creates the manifest after everything has been installed. | ||
| 81 | """ | ||
| 82 | @abstractmethod | ||
| 83 | def create_final(self): | ||
| 84 | pass | ||
| 85 | |||
| 86 | """ | ||
| 87 | The following function parses an initial manifest and returns a dictionary | ||
| 88 | object with the must install, attempt only, multilib and language packages. | ||
| 89 | """ | ||
| 90 | def parse_initial_manifest(self): | ||
| 91 | pkgs = dict() | ||
| 92 | |||
| 93 | with open(self.initial_manifest) as manifest: | ||
| 94 | for line in manifest.read().split('\n'): | ||
| 95 | comment = re.match("^#.*", line) | ||
| 96 | pkg = re.match("^(mip|aop|mlp|lgp),(.*)$", line) | ||
| 97 | |||
| 98 | if comment is not None: | ||
| 99 | continue | ||
| 100 | |||
| 101 | if pkg is not None: | ||
| 102 | pkg_type = pkg.group(1) | ||
| 103 | pkg_name = pkg.group(2) | ||
| 104 | |||
| 105 | if not pkg_type in pkgs: | ||
| 106 | pkgs[pkg_type] = [pkg_name] | ||
| 107 | else: | ||
| 108 | pkgs[pkg_type].append(pkg_name) | ||
| 109 | |||
| 110 | return pkgs | ||
| 111 | |||
| 112 | |||
| 113 | class RpmManifest(Manifest): | ||
| 114 | def create_initial(self): | ||
| 115 | self._create_dummy_initial() | ||
| 116 | |||
| 117 | def create_final(self): | ||
| 118 | pass | ||
| 119 | |||
| 120 | |||
| 121 | class OpkgManifest(Manifest): | ||
| 122 | def create_initial(self): | ||
| 123 | self._create_dummy_initial() | ||
| 124 | |||
| 125 | def create_final(self): | ||
| 126 | pass | ||
| 127 | |||
| 128 | |||
| 129 | class DpkgManifest(Manifest): | ||
| 130 | def create_initial(self): | ||
| 131 | var_map = {"PACKAGE_INSTALL": "mip", | ||
| 132 | "PACKAGE_INSTALL_ATTEMPTONLY": "aop", | ||
| 133 | "LINGUAS_INSTALL": "lgp"} | ||
| 134 | |||
| 135 | with open(self.initial_manifest, "w+") as manifest: | ||
| 136 | manifest.write(self.initial_manifest_file_header) | ||
| 137 | |||
| 138 | for var in var_map: | ||
| 139 | pkg_list = self.d.getVar(var, True) | ||
| 140 | |||
| 141 | if pkg_list is None: | ||
| 142 | continue | ||
| 143 | |||
| 144 | for pkg in pkg_list.split(): | ||
| 145 | manifest.write("%s,%s\n" % (var_map[var], pkg)) | ||
| 146 | |||
| 147 | def create_final(self): | ||
| 148 | pass | ||
| 149 | |||
| 150 | |||
| 151 | def create_manifest(d, final_manifest=False, manifest_dir=None): | ||
| 152 | manifest_map = {'rpm': RpmManifest, | ||
| 153 | 'ipk': OpkgManifest, | ||
| 154 | 'deb': DpkgManifest} | ||
| 155 | |||
| 156 | manifest = manifest_map[d.getVar('IMAGE_PKGTYPE', True)](d, manifest_dir) | ||
| 157 | |||
| 158 | if final_manifest: | ||
| 159 | manifest.create_final() | ||
| 160 | else: | ||
| 161 | manifest.create_initial() | ||
| 162 | |||
| 163 | |||
| 164 | if __name__ == "__main__": | ||
| 165 | pass | ||
