diff options
Diffstat (limited to 'meta/classes/rootfs_rpm.bbclass')
-rw-r--r-- | meta/classes/rootfs_rpm.bbclass | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/meta/classes/rootfs_rpm.bbclass b/meta/classes/rootfs_rpm.bbclass new file mode 100644 index 0000000000..6c68ac89fb --- /dev/null +++ b/meta/classes/rootfs_rpm.bbclass | |||
@@ -0,0 +1,224 @@ | |||
1 | # | ||
2 | # Creates a root filesystem out of rpm packages | ||
3 | # | ||
4 | |||
5 | ROOTFS_PKGMANAGE = "rpm smartpm" | ||
6 | ROOTFS_PKGMANAGE_BOOTSTRAP = "run-postinsts" | ||
7 | |||
8 | # Add 50Meg of extra space for Smart | ||
9 | IMAGE_ROOTFS_EXTRA_SPACE_append = "${@base_contains("PACKAGE_INSTALL", "smartpm", " + 51200", "" ,d)}" | ||
10 | |||
11 | # Smart is python based, so be sure python-native is available to us. | ||
12 | EXTRANATIVEPATH += "python-native" | ||
13 | |||
14 | do_rootfs[depends] += "rpm-native:do_populate_sysroot" | ||
15 | do_rootfs[depends] += "rpmresolve-native:do_populate_sysroot" | ||
16 | do_rootfs[depends] += "python-smartpm-native:do_populate_sysroot" | ||
17 | |||
18 | # Needed for update-alternatives | ||
19 | do_rootfs[depends] += "opkg-native:do_populate_sysroot" | ||
20 | |||
21 | # Creating the repo info in do_rootfs | ||
22 | do_rootfs[depends] += "createrepo-native:do_populate_sysroot" | ||
23 | |||
24 | do_rootfs[recrdeptask] += "do_package_write_rpm" | ||
25 | rootfs_rpm_do_rootfs[vardepsexclude] += "BUILDNAME" | ||
26 | |||
27 | RPM_PREPROCESS_COMMANDS = "package_update_index_rpm; " | ||
28 | RPM_POSTPROCESS_COMMANDS = "rpm_setup_smart_target_config; " | ||
29 | |||
30 | rpmlibdir = "/var/lib/rpm" | ||
31 | opkglibdir = "${localstatedir}/lib/opkg" | ||
32 | |||
33 | RPMOPTS="--dbpath ${rpmlibdir}" | ||
34 | RPM="rpm ${RPMOPTS}" | ||
35 | |||
36 | # RPM doesn't work with multiple rootfs generation at once due to collisions in the use of files | ||
37 | # in ${DEPLOY_DIR_RPM}. This can be removed if package_update_index_rpm can be called concurrently | ||
38 | do_rootfs[lockfiles] += "${DEPLOY_DIR_RPM}/rpm.lock" | ||
39 | |||
40 | fakeroot rootfs_rpm_do_rootfs () { | ||
41 | ${RPM_PREPROCESS_COMMANDS} | ||
42 | |||
43 | # install packages | ||
44 | # This needs to work in the same way as populate_sdk_rpm.bbclass! | ||
45 | export INSTALL_ROOTFS_RPM="${IMAGE_ROOTFS}" | ||
46 | export INSTALL_PLATFORM_RPM="$(echo ${TARGET_ARCH} | tr - _)${TARGET_VENDOR}-${TARGET_OS}" | ||
47 | export INSTALL_PACKAGES_RPM="${PACKAGE_INSTALL}" | ||
48 | export INSTALL_PACKAGES_ATTEMPTONLY_RPM="${PACKAGE_INSTALL_ATTEMPTONLY}" | ||
49 | export INSTALL_PACKAGES_LINGUAS_RPM="${LINGUAS_INSTALL}" | ||
50 | export INSTALL_PROVIDENAME_RPM="" | ||
51 | export INSTALL_TASK_RPM="rootfs_rpm_do_rootfs" | ||
52 | export INSTALL_COMPLEMENTARY_RPM="" | ||
53 | |||
54 | # Setup base system configuration | ||
55 | mkdir -p ${INSTALL_ROOTFS_RPM}/etc/rpm/ | ||
56 | |||
57 | # List must be prefered to least preferred order | ||
58 | default_extra_rpm="" | ||
59 | INSTALL_PLATFORM_EXTRA_RPM="" | ||
60 | for os in ${MULTILIB_OS_LIST} ; do | ||
61 | old_IFS="$IFS" | ||
62 | IFS=":" | ||
63 | set -- $os | ||
64 | IFS="$old_IFS" | ||
65 | mlib=$1 | ||
66 | mlib_os=$2 | ||
67 | for prefix in ${MULTILIB_PREFIX_LIST} ; do | ||
68 | old_IFS="$IFS" | ||
69 | IFS=":" | ||
70 | set -- $prefix | ||
71 | IFS="$old_IFS" | ||
72 | if [ "$mlib" != "$1" ]; then | ||
73 | continue | ||
74 | fi | ||
75 | shift #remove mlib | ||
76 | while [ -n "$1" ]; do | ||
77 | platform="$(echo $1 | tr - _)-.*-$mlib_os" | ||
78 | if [ "$mlib" = "${BBEXTENDVARIANT}" ]; then | ||
79 | default_extra_rpm="$default_extra_rpm $platform" | ||
80 | else | ||
81 | INSTALL_PLATFORM_EXTRA_RPM="$INSTALL_PLATFORM_EXTRA_RPM $platform" | ||
82 | fi | ||
83 | shift | ||
84 | done | ||
85 | done | ||
86 | done | ||
87 | if [ -n "$default_extra_rpm" ]; then | ||
88 | INSTALL_PLATFORM_EXTRA_RPM="$default_extra_rpm $INSTALL_PLATFORM_EXTRA_RPM" | ||
89 | fi | ||
90 | export INSTALL_PLATFORM_EXTRA_RPM | ||
91 | |||
92 | package_install_internal_rpm | ||
93 | |||
94 | rootfs_install_complementary | ||
95 | |||
96 | export D=${IMAGE_ROOTFS} | ||
97 | export OFFLINE_ROOT=${IMAGE_ROOTFS} | ||
98 | export IPKG_OFFLINE_ROOT=${IMAGE_ROOTFS} | ||
99 | export OPKG_OFFLINE_ROOT=${IMAGE_ROOTFS} | ||
100 | |||
101 | ${ROOTFS_POSTINSTALL_COMMAND} | ||
102 | |||
103 | # Report delayed package scriptlets | ||
104 | for i in ${IMAGE_ROOTFS}/etc/rpm-postinsts/*; do | ||
105 | if [ -f $i ]; then | ||
106 | echo "Delayed package scriptlet: `head -n 3 $i | tail -n 1`" | ||
107 | fi | ||
108 | done | ||
109 | |||
110 | install -d ${IMAGE_ROOTFS}/${sysconfdir} | ||
111 | echo ${BUILDNAME} > ${IMAGE_ROOTFS}/${sysconfdir}/version | ||
112 | |||
113 | ${RPM_POSTPROCESS_COMMANDS} | ||
114 | ${ROOTFS_POSTPROCESS_COMMAND} | ||
115 | |||
116 | if ${@base_contains("IMAGE_FEATURES", "read-only-rootfs", "true", "false" ,d)}; then | ||
117 | if [ -d ${IMAGE_ROOTFS}${sysconfdir}/rpm-postinsts ] ; then | ||
118 | if [ "`ls -A ${IMAGE_ROOTFS}${sysconfdir}/rpm-postinsts`" != "" ] ; then | ||
119 | bberror "Some packages could not be configured offline and rootfs is read-only." | ||
120 | exit 1 | ||
121 | fi | ||
122 | fi | ||
123 | fi | ||
124 | |||
125 | rm -rf ${IMAGE_ROOTFS}/var/cache2/ | ||
126 | rm -rf ${IMAGE_ROOTFS}/var/run2/ | ||
127 | rm -rf ${IMAGE_ROOTFS}/var/log2/ | ||
128 | |||
129 | # remove lock files | ||
130 | rm -f ${IMAGE_ROOTFS}${rpmlibdir}/__db.* | ||
131 | |||
132 | # Remove all remaining resolver files | ||
133 | rm -rf ${IMAGE_ROOTFS}/install | ||
134 | |||
135 | log_check rootfs | ||
136 | } | ||
137 | |||
138 | rootfs_rpm_do_rootfs[vardeps] += "delayed_postinsts" | ||
139 | |||
140 | delayed_postinsts() { | ||
141 | if [ -d ${IMAGE_ROOTFS}${sysconfdir}/rpm-postinsts ]; then | ||
142 | ls ${IMAGE_ROOTFS}${sysconfdir}/rpm-postinsts | ||
143 | fi | ||
144 | } | ||
145 | |||
146 | save_postinsts() { | ||
147 | # this is just a stub. For RPM, the failed postinstalls are already saved in | ||
148 | # /etc/rpm-postinsts | ||
149 | true | ||
150 | } | ||
151 | |||
152 | remove_packaging_data_files() { | ||
153 | # Save the rpmlib for increment rpm image generation | ||
154 | t="${T}/saved_rpmlib/var/lib" | ||
155 | rm -fr $t | ||
156 | mkdir -p $t | ||
157 | mv ${IMAGE_ROOTFS}${rpmlibdir} $t | ||
158 | rm -rf ${IMAGE_ROOTFS}${opkglibdir} | ||
159 | rm -rf ${IMAGE_ROOTFS}/var/lib/smart | ||
160 | } | ||
161 | |||
162 | rpm_setup_smart_target_config() { | ||
163 | # Set up smart configuration for the target | ||
164 | rm -rf ${IMAGE_ROOTFS}/var/lib/smart | ||
165 | smart --data-dir=${IMAGE_ROOTFS}/var/lib/smart channel --add rpmsys type=rpm-sys -y | ||
166 | package_write_smart_config ${IMAGE_ROOTFS} | ||
167 | rm -f ${IMAGE_ROOTFS}/var/lib/smart/config.old | ||
168 | } | ||
169 | |||
170 | rootfs_install_packages() { | ||
171 | # Note - we expect the variables not set here to already have been set | ||
172 | export INSTALL_PACKAGES_RPM="" | ||
173 | export INSTALL_PACKAGES_ATTEMPTONLY_RPM="`cat $1`" | ||
174 | export INSTALL_PROVIDENAME_RPM="" | ||
175 | export INSTALL_TASK_RPM="rootfs_install_packages" | ||
176 | export INSTALL_COMPLEMENTARY_RPM="1" | ||
177 | |||
178 | package_install_internal_rpm | ||
179 | } | ||
180 | |||
181 | rootfs_uninstall_packages() { | ||
182 | rpm -e --nodeps --root=${IMAGE_ROOTFS} --dbpath=/var/lib/rpm\ | ||
183 | --define='_cross_scriptlet_wrapper ${WORKDIR}/scriptlet_wrapper'\ | ||
184 | --define='_tmppath /install/tmp' $@ | ||
185 | |||
186 | # remove temp directory | ||
187 | rm -rf ${IMAGE_ROOTFS}/install | ||
188 | } | ||
189 | |||
190 | python () { | ||
191 | if d.getVar('BUILD_IMAGES_FROM_FEEDS', True): | ||
192 | flags = d.getVarFlag('do_rootfs', 'recrdeptask') | ||
193 | flags = flags.replace("do_package_write_rpm", "") | ||
194 | flags = flags.replace("do_deploy", "") | ||
195 | flags = flags.replace("do_populate_sysroot", "") | ||
196 | d.setVarFlag('do_rootfs', 'recrdeptask', flags) | ||
197 | d.setVar('RPM_PREPROCESS_COMMANDS', '') | ||
198 | d.setVar('RPM_POSTPROCESS_COMMANDS', '') | ||
199 | |||
200 | # The following code should be kept in sync w/ the populate_sdk_rpm version. | ||
201 | |||
202 | # package_arch order is reversed. This ensures the -best- match is listed first! | ||
203 | package_archs = d.getVar("PACKAGE_ARCHS", True) or "" | ||
204 | package_archs = ":".join(package_archs.split()[::-1]) | ||
205 | package_os = d.getVar("TARGET_OS", True) or "" | ||
206 | ml_prefix_list = "%s:%s" % ('default', package_archs) | ||
207 | ml_os_list = "%s:%s" % ('default', package_os) | ||
208 | multilibs = d.getVar('MULTILIBS', True) or "" | ||
209 | for ext in multilibs.split(): | ||
210 | eext = ext.split(':') | ||
211 | if len(eext) > 1 and eext[0] == 'multilib': | ||
212 | localdata = bb.data.createCopy(d) | ||
213 | default_tune = localdata.getVar("DEFAULTTUNE_virtclass-multilib-" + eext[1], False) | ||
214 | if default_tune: | ||
215 | localdata.setVar("DEFAULTTUNE", default_tune) | ||
216 | bb.data.update_data(localdata) | ||
217 | package_archs = localdata.getVar("PACKAGE_ARCHS", True) or "" | ||
218 | package_archs = ":".join([i in "all noarch any".split() and i or eext[1]+"_"+i for i in package_archs.split()][::-1]) | ||
219 | package_os = localdata.getVar("TARGET_OS", True) or "" | ||
220 | ml_prefix_list += " %s:%s" % (eext[1], package_archs) | ||
221 | ml_os_list += " %s:%s" % (eext[1], package_os) | ||
222 | d.setVar('MULTILIB_PREFIX_LIST', ml_prefix_list) | ||
223 | d.setVar('MULTILIB_OS_LIST', ml_os_list) | ||
224 | } | ||