diff options
author | Paul Eggleton <paul.eggleton@linux.intel.com> | 2012-11-29 15:43:16 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2012-12-17 17:24:50 +0000 |
commit | 019ba25654cd3ae63a6b6c0f2d67da520bf10bc6 (patch) | |
tree | 14b580e66114d16448bf956069e2993ff716fa5b | |
parent | b05efc27d03381f32d612122ae75c8d1224d7b5d (diff) | |
download | poky-019ba25654cd3ae63a6b6c0f2d67da520bf10bc6.tar.gz |
classes/*_rpm: integrate Smart into RPM filesystem construction
Use Smart to construct the root filesystem for images and the contents
of SDKs rather than the custom scripts around rpm we had previously.
This ensures the result when producing an updated image will be the
same as upgrading to the same package versions from an older image on
the target, as well as allowing us to remove a substantial amount of
code making the rpm classes much easier to follow.
Some bugfixes from Bogdan Marinescu <bogdan.marinescu@intel.com>.
SDK implementation and testing as well as a number of bugfixes from
Mark Hatle <mark.hatle@windriver.com>.
(From OE-Core rev: a726ae7c032fac1aa49ce34180fa2ed2dcaf87d3)
Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
Signed-off-by: Saul Wold <sgw@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r-- | meta/classes/package_rpm.bbclass | 531 | ||||
-rw-r--r-- | meta/classes/populate_sdk_rpm.bbclass | 51 | ||||
-rw-r--r-- | meta/classes/rootfs_rpm.bbclass | 34 |
3 files changed, 121 insertions, 495 deletions
diff --git a/meta/classes/package_rpm.bbclass b/meta/classes/package_rpm.bbclass index 293c52c629..4b81b68bf7 100644 --- a/meta/classes/package_rpm.bbclass +++ b/meta/classes/package_rpm.bbclass | |||
@@ -16,88 +16,27 @@ python package_rpm_install () { | |||
16 | bb.fatal("package_rpm_install not implemented!") | 16 | bb.fatal("package_rpm_install not implemented!") |
17 | } | 17 | } |
18 | 18 | ||
19 | RPMCONF_TARGET_BASE = "${DEPLOY_DIR_RPM}/solvedb" | ||
20 | RPMCONF_HOST_BASE = "${DEPLOY_DIR_RPM}/solvedb-sdk" | ||
21 | # | 19 | # |
22 | # Update the Packages depsolver db in ${DEPLOY_DIR_RPM} | 20 | # Update the packages indexes ${DEPLOY_DIR_RPM} |
23 | # | 21 | # |
24 | package_update_index_rpm () { | 22 | package_update_index_rpm () { |
25 | if [ ! -z "${DEPLOY_KEEP_PACKAGES}" -o ! -e "${DEPLOY_DIR_RPM}" ]; then | 23 | if [ ! -z "${DEPLOY_KEEP_PACKAGES}" -o ! -e "${DEPLOY_DIR_RPM}" ]; then |
26 | return | 24 | return |
27 | fi | 25 | fi |
28 | 26 | ||
29 | # Update target packages | ||
30 | base_archs="`echo ${PACKAGE_ARCHS} | sed 's/-/_/g'`" | 27 | base_archs="`echo ${PACKAGE_ARCHS} | sed 's/-/_/g'`" |
31 | ml_archs="`echo ${MULTILIB_PACKAGE_ARCHS} | sed 's/-/_/g'`" | 28 | ml_archs="`echo ${MULTILIB_PACKAGE_ARCHS} | sed 's/-/_/g'`" |
32 | package_update_index_rpm_common "${RPMCONF_TARGET_BASE}" base_archs ml_archs | 29 | sdk_archs="`echo ${SDK_PACKAGE_ARCHS} | sed 's/-/_/g'`" |
33 | 30 | ||
34 | # Update SDK packages | 31 | archs=`for arch in $base_archs $ml_archs $sdk_archs ; do |
35 | base_archs="`echo ${SDK_PACKAGE_ARCHS} | sed 's/-/_/g'`" | 32 | echo $arch |
36 | package_update_index_rpm_common "${RPMCONF_HOST_BASE}" base_archs | 33 | done | sort | uniq` |
37 | } | ||
38 | |||
39 | package_update_index_rpm_common () { | ||
40 | rpmconf_base="$1" | ||
41 | shift | ||
42 | |||
43 | createdirs="" | ||
44 | for archvar in "$@"; do | ||
45 | eval archs=\${${archvar}} | ||
46 | packagedirs="" | ||
47 | for arch in $archs; do | ||
48 | packagedirs="${DEPLOY_DIR_RPM}/$arch $packagedirs" | ||
49 | rm -rf ${DEPLOY_DIR_RPM}/$arch/solvedb.done | ||
50 | done | ||
51 | |||
52 | cat /dev/null > ${rpmconf_base}-${archvar}.conf | ||
53 | for pkgdir in $packagedirs; do | ||
54 | if [ -e $pkgdir/ ]; then | ||
55 | echo "Generating solve db for $pkgdir..." | ||
56 | echo $pkgdir/solvedb >> ${rpmconf_base}-${archvar}.conf | ||
57 | createdirs="$createdirs $pkgdir" | ||
58 | fi | ||
59 | done | ||
60 | done | ||
61 | rpm-createsolvedb.py "${RPM}" $createdirs | ||
62 | } | ||
63 | |||
64 | # | ||
65 | # Generate an rpm configuration suitable for use against the | ||
66 | # generated depsolver db's... | ||
67 | # | ||
68 | package_generate_rpm_conf () { | ||
69 | # Update target packages | ||
70 | package_generate_rpm_conf_common "${RPMCONF_TARGET_BASE}" base_archs ml_archs | ||
71 | |||
72 | # Update SDK packages | ||
73 | package_generate_rpm_conf_common "${RPMCONF_HOST_BASE}" base_archs | ||
74 | } | ||
75 | |||
76 | package_generate_rpm_conf_common() { | ||
77 | rpmconf_base="$1" | ||
78 | shift | ||
79 | 34 | ||
80 | printf "_solve_dbpath " > ${rpmconf_base}.macro | 35 | for arch in $archs; do |
81 | o_colon="false" | 36 | if [ -d ${DEPLOY_DIR_RPM}/$arch ] ; then |
82 | 37 | createrepo --update -q ${DEPLOY_DIR_RPM}/$arch | |
83 | for archvar in "$@"; do | 38 | fi |
84 | printf "_solve_dbpath " > ${rpmconf_base}-${archvar}.macro | ||
85 | colon="false" | ||
86 | for each in `cat ${rpmconf_base}-${archvar}.conf` ; do | ||
87 | if [ "$o_colon" = "true" ]; then | ||
88 | printf ":" >> ${rpmconf_base}.macro | ||
89 | fi | ||
90 | if [ "$colon" = "true" ]; then | ||
91 | printf ":" >> ${rpmconf_base}-${archvar}.macro | ||
92 | fi | ||
93 | printf "%s" $each >> ${rpmconf_base}.macro | ||
94 | o_colon="true" | ||
95 | printf "%s" $each >> ${rpmconf_base}-${archvar}.macro | ||
96 | colon="true" | ||
97 | done | ||
98 | printf "\n" >> ${rpmconf_base}-${archvar}.macro | ||
99 | done | 39 | done |
100 | printf "\n" >> ${rpmconf_base}.macro | ||
101 | } | 40 | } |
102 | 41 | ||
103 | rpm_log_check() { | 42 | rpm_log_check() { |
@@ -122,150 +61,23 @@ rpm_log_check() { | |||
122 | 61 | ||
123 | 62 | ||
124 | # | 63 | # |
125 | # Resolve package names to filepaths | ||
126 | # resolve_pacakge <pkgname> <solvdb conffile> | ||
127 | # | ||
128 | resolve_package_rpm () { | ||
129 | local conffile="$1" | ||
130 | shift | ||
131 | local pkg_name="" | ||
132 | for solve in `cat ${conffile}`; do | ||
133 | pkg_name=$(${RPM} -D "_dbpath $solve" -D "__dbi_txn create nofsync" -q --qf "%{packageorigin}\n" "$@" | grep -v "is not installed" || true) | ||
134 | if [ -n "$pkg_name" -a "$pkg_name" != "(none)" ]; then | ||
135 | echo $pkg_name | ||
136 | break; | ||
137 | fi | ||
138 | done | ||
139 | } | ||
140 | |||
141 | # rpm common command and options | ||
142 | rpm_common_comand () { | ||
143 | |||
144 | local target_rootfs="${INSTALL_ROOTFS_RPM}" | ||
145 | |||
146 | ${RPM} --root ${target_rootfs} \ | ||
147 | --predefine "_rpmds_sysinfo_path ${target_rootfs}/etc/rpm/sysinfo" \ | ||
148 | --predefine "_rpmrc_platform_path ${target_rootfs}/etc/rpm/platform" \ | ||
149 | -D "_var ${localstatedir}" \ | ||
150 | -D "_dbpath ${rpmlibdir}" \ | ||
151 | -D "_tmppath /install/tmp" \ | ||
152 | --noparentdirs --nolinktos \ | ||
153 | -D "__dbi_txn create nofsync private" \ | ||
154 | -D "_cross_scriptlet_wrapper ${WORKDIR}/scriptlet_wrapper" $@ | ||
155 | } | ||
156 | |||
157 | # install or remove the pkg | ||
158 | rpm_update_pkg () { | ||
159 | |||
160 | manifest=$1 | ||
161 | # The manifest filename, e.g. total_solution.manifest | ||
162 | m_name=${manifest##/*/} | ||
163 | local target_rootfs="${INSTALL_ROOTFS_RPM}" | ||
164 | installdir=$target_rootfs/install | ||
165 | pre_btmanifest=$installdir/pre_bt.manifest | ||
166 | cur_btmanifest=$installdir/cur_bt.manifest | ||
167 | |||
168 | # Install/remove the different pkgs when total_solution.manifest is | ||
169 | # comming and incremental image generation is enabled. | ||
170 | if [ "${INC_RPM_IMAGE_GEN}" = "1" -a -d "${target_rootfs}${rpmlibdir}" \ | ||
171 | -a "$m_name" = "total_solution.manifest" \ | ||
172 | -a "${INSTALL_COMPLEMENTARY_RPM}" != "1" ]; then | ||
173 | # Get the previous installed list | ||
174 | rpm --root $target_rootfs --dbpath ${rpmlibdir} \ | ||
175 | -qa --qf '%{PACKAGEORIGIN} %{BUILDTIME}\n' | sort -u -o $pre_btmanifest | ||
176 | # Get the current installed list (based on install/var/lib/rpm) | ||
177 | rpm --root $installdir -D "_dbpath $installdir" \ | ||
178 | -qa --qf '%{PACKAGEORIGIN} %{BUILDTIME}\n' | sort -u -o $cur_btmanifest | ||
179 | comm -1 -3 $cur_btmanifest $pre_btmanifest | sed 's#.*/\(.*\)\.rpm .*#\1#' > \ | ||
180 | $installdir/remove.manifest | ||
181 | comm -2 -3 $cur_btmanifest $pre_btmanifest | awk '{print $1}' > \ | ||
182 | $installdir/incremental.manifest | ||
183 | |||
184 | # Attempt to remove unwanted pkgs, the scripts(pre, post, etc.) has not | ||
185 | # been run by now, so don't have to run them(preun, postun, etc.) when | ||
186 | # erase the pkg | ||
187 | if [ -s $installdir/remove.manifest ]; then | ||
188 | rpm_common_comand --noscripts --nodeps \ | ||
189 | -e `cat $installdir/remove.manifest` | ||
190 | fi | ||
191 | |||
192 | # Attempt to install the incremental pkgs | ||
193 | if [ -s $installdir/incremental.manifest ]; then | ||
194 | rpm_common_comand --replacefiles --replacepkgs \ | ||
195 | -Uvh $installdir/incremental.manifest | ||
196 | fi | ||
197 | else | ||
198 | # Attempt to install | ||
199 | rpm_common_comand --replacepkgs -Uhv $manifest | ||
200 | fi | ||
201 | } | ||
202 | |||
203 | process_pkg_list_rpm() { | ||
204 | local insttype=$1 | ||
205 | shift | ||
206 | # $@ is special POSIX linear array can not be assigned | ||
207 | # to a local variable directly in dash since its separated by | ||
208 | # space and dash expands it before assignment | ||
209 | # and local x=1 2 3 and not x="1 2 3" | ||
210 | local pkgs | ||
211 | pkgs="$@" | ||
212 | local confbase=${INSTALL_CONFBASE_RPM} | ||
213 | |||
214 | printf "" > ${target_rootfs}/install/base_archs.pkglist | ||
215 | printf "" > ${target_rootfs}/install/ml_archs.pkglist | ||
216 | |||
217 | for pkg in $pkgs; do | ||
218 | echo "Processing $pkg..." | ||
219 | |||
220 | archvar=base_archs | ||
221 | ml_pkg=$pkg | ||
222 | for i in ${MULTILIB_PREFIX_LIST} ; do | ||
223 | subst=${pkg#${i}-} | ||
224 | if [ $subst != $pkg ] ; then | ||
225 | ml_pkg=$subst | ||
226 | archvar=ml_archs | ||
227 | break | ||
228 | fi | ||
229 | done | ||
230 | |||
231 | echo $ml_pkg >> ${target_rootfs}/install/$archvar.pkglist | ||
232 | done | ||
233 | |||
234 | local manifestpfx="install" | ||
235 | local extraopt="" | ||
236 | if [ "$insttype" = "attemptonly" ] ; then | ||
237 | manifestpfx="install_attemptonly" | ||
238 | extraopt="-i" | ||
239 | fi | ||
240 | |||
241 | rpmresolve $extraopt ${confbase}-base_archs.conf ${target_rootfs}/install/base_archs.pkglist -o ${target_rootfs}/install/${manifestpfx}.manifest | ||
242 | if [ -s ${target_rootfs}/install/ml_archs.pkglist ] ; then | ||
243 | rpmresolve $extraopt ${confbase}-ml_archs.conf ${target_rootfs}/install/ml_archs.pkglist -o ${target_rootfs}/install/${manifestpfx}_multilib.manifest | ||
244 | fi | ||
245 | } | ||
246 | |||
247 | # | ||
248 | # Install a bunch of packages using rpm. | 64 | # Install a bunch of packages using rpm. |
249 | # There are 3 solutions in an image's FRESH generation: | 65 | # There are two solutions in an image's FRESH generation: |
250 | # 1) initial_solution | 66 | # 1) main package solution |
251 | # 2) total_solution | 67 | # 2) complementary solution |
252 | # 3) COMPLEMENTARY solution | ||
253 | # | 68 | # |
254 | # It is different when incremental image generation is enabled in the | 69 | # It is different when incremental image generation is enabled: |
255 | # SECOND generation: | 70 | # 1) The incremental image generation takes action during the main package |
256 | # 1) The initial_solution is skipped. | 71 | # installation, the previous installed complementary packages would |
257 | # 2) The incremental image generation takes action during the total_solution | 72 | # usually be removed here, and the new complementary ones would be |
258 | # installation, the previous installed COMPLEMENTARY pkgs usually would be | 73 | # installed in the next step. |
259 | # removed here, the new COMPLEMENTARY ones would be installed in the next | 74 | # 2) The complementary would always be installed since it is |
260 | # step. | 75 | # generated based on the first step's image. |
261 | # 3) The COMPLEMENTARY would always be installed since it is | ||
262 | # generated based on the second step's image. | ||
263 | # | 76 | # |
264 | # the following shell variables needs to be set before calling this func: | 77 | # the following shell variables needs to be set before calling this func: |
265 | # INSTALL_ROOTFS_RPM - install root dir | 78 | # INSTALL_ROOTFS_RPM - install root dir |
266 | # INSTALL_PLATFORM_RPM - main platform | 79 | # INSTALL_PLATFORM_RPM - main platform |
267 | # INSTALL_PLATFORM_EXTRA_RPM - extra platform | 80 | # INSTALL_PLATFORM_EXTRA_RPM - extra platform |
268 | # INSTALL_CONFBASE_RPM - configuration file base name | ||
269 | # INSTALL_PACKAGES_RPM - packages to be installed | 81 | # INSTALL_PACKAGES_RPM - packages to be installed |
270 | # INSTALL_PACKAGES_ATTEMPTONLY_RPM - packages attemped to be installed only | 82 | # INSTALL_PACKAGES_ATTEMPTONLY_RPM - packages attemped to be installed only |
271 | # INSTALL_PACKAGES_LINGUAS_RPM - additional packages for uclibc | 83 | # INSTALL_PACKAGES_LINGUAS_RPM - additional packages for uclibc |
@@ -275,15 +87,20 @@ process_pkg_list_rpm() { | |||
275 | 87 | ||
276 | package_install_internal_rpm () { | 88 | package_install_internal_rpm () { |
277 | 89 | ||
278 | local target_rootfs="${INSTALL_ROOTFS_RPM}" | 90 | local target_rootfs="$INSTALL_ROOTFS_RPM" |
279 | local platform="`echo ${INSTALL_PLATFORM_RPM} | sed 's#-#_#g'`" | 91 | local platform="`echo $INSTALL_PLATFORM_RPM | sed 's#-#_#g'`" |
280 | local platform_extra="`echo ${INSTALL_PLATFORM_EXTRA_RPM} | sed 's#-#_#g'`" | 92 | local platform_extra="`echo $INSTALL_PLATFORM_EXTRA_RPM | sed 's#-#_#g'`" |
281 | local confbase="${INSTALL_CONFBASE_RPM}" | 93 | local package_to_install="$INSTALL_PACKAGES_RPM" |
282 | local package_to_install="${INSTALL_PACKAGES_RPM}" | 94 | local package_attemptonly="$INSTALL_PACKAGES_ATTEMPTONLY_RPM" |
283 | local package_attemptonly="${INSTALL_PACKAGES_ATTEMPTONLY_RPM}" | 95 | local package_linguas="$INSTALL_PACKAGES_LINGUAS_RPM" |
284 | local package_linguas="${INSTALL_PACKAGES_LINGUAS_RPM}" | 96 | local providename="$INSTALL_PROVIDENAME_RPM" |
285 | local providename="${INSTALL_PROVIDENAME_RPM}" | 97 | local task="$INSTALL_TASK_RPM" |
286 | local task="${INSTALL_TASK_RPM}" | 98 | |
99 | # Configure internal RPM environment when using Smart | ||
100 | export RPM_ETCRPM=${target_rootfs}/etc/rpm | ||
101 | |||
102 | # Setup temporary directory -- install... | ||
103 | mkdir -p ${target_rootfs}/install | ||
287 | 104 | ||
288 | if [ "${INSTALL_COMPLEMENTARY_RPM}" != "1" ] ; then | 105 | if [ "${INSTALL_COMPLEMENTARY_RPM}" != "1" ] ; then |
289 | # Setup base system configuration | 106 | # Setup base system configuration |
@@ -306,166 +123,74 @@ package_install_internal_rpm () { | |||
306 | # Tell RPM that the "/" directory exist and is available | 123 | # Tell RPM that the "/" directory exist and is available |
307 | mkdir -p ${target_rootfs}/etc/rpm/sysinfo | 124 | mkdir -p ${target_rootfs}/etc/rpm/sysinfo |
308 | echo "/" >${target_rootfs}/etc/rpm/sysinfo/Dirnames | 125 | echo "/" >${target_rootfs}/etc/rpm/sysinfo/Dirnames |
126 | |||
309 | if [ ! -z "$providename" ]; then | 127 | if [ ! -z "$providename" ]; then |
310 | cat /dev/null > ${target_rootfs}/etc/rpm/sysinfo/Providename | 128 | cat /dev/null > ${target_rootfs}/etc/rpm/sysinfo/Providename |
311 | for provide in $providename ; do | 129 | for provide in $providename ; do |
312 | echo $provide >> ${target_rootfs}/etc/rpm/sysinfo/Providename | 130 | echo $provide >> ${target_rootfs}/etc/rpm/sysinfo/Providename |
313 | done | 131 | done |
314 | fi | 132 | fi |
315 | else | ||
316 | # We may run through the complementary installs multiple times. For each time | ||
317 | # we should add the previous solution manifest to the full "original" set to | ||
318 | # avoid duplicate install steps. | ||
319 | echo "Update original solution..." | ||
320 | for m in ${target_rootfs}/install/initial_solution.manifest \ | ||
321 | ${target_rootfs}/install/total_solution.manifest; do | ||
322 | if [ -s $m ]; then | ||
323 | cat $m >> ${target_rootfs}/install/original_solution.manifest | ||
324 | rm -f $m | ||
325 | fi | ||
326 | done | ||
327 | sort -u ${target_rootfs}/install/original_solution.manifest -o ${target_rootfs}/install/original_solution.manifest.new | ||
328 | mv ${target_rootfs}/install/original_solution.manifest.new ${target_rootfs}/install/original_solution.manifest | ||
329 | fi | ||
330 | 133 | ||
331 | # Setup manifest of packages to install... | 134 | # Configure RPM... we enforce these settings! |
332 | mkdir -p ${target_rootfs}/install | 135 | mkdir -p ${target_rootfs}${rpmlibdir} |
333 | rm -f ${target_rootfs}/install/install.manifest | 136 | mkdir -p ${target_rootfs}${rpmlibdir}/log |
334 | rm -f ${target_rootfs}/install/install_multilib.manifest | 137 | # After change the __db.* cache size, log file will not be generated automatically, |
335 | rm -f ${target_rootfs}/install/install_attemptonly.manifest | 138 | # that will raise some warnings, so touch a bare log for rpm write into it. |
139 | touch ${target_rootfs}${rpmlibdir}/log/log.0000000001 | ||
140 | if [ ! -e ${target_rootfs}${rpmlibdir}/DB_CONFIG ]; then | ||
141 | cat > ${target_rootfs}${rpmlibdir}/DB_CONFIG << EOF | ||
142 | # ================ Environment | ||
143 | set_data_dir . | ||
144 | set_create_dir . | ||
145 | set_lg_dir ./log | ||
146 | set_tmp_dir ./tmp | ||
147 | set_flags db_log_autoremove on | ||
336 | 148 | ||
337 | # Uclibc builds don't provide this stuff... | 149 | # -- thread_count must be >= 8 |
338 | if [ x${TARGET_OS} = "xlinux" ] || [ x${TARGET_OS} = "xlinux-gnueabi" ] ; then | 150 | set_thread_count 64 |
339 | if [ ! -z "${package_linguas}" ]; then | ||
340 | process_pkg_list_rpm linguas ${package_linguas} | ||
341 | fi | ||
342 | fi | ||
343 | 151 | ||
344 | if [ ! -z "${package_to_install}" ]; then | 152 | # ================ Logging |
345 | process_pkg_list_rpm default ${package_to_install} | ||
346 | fi | ||
347 | 153 | ||
348 | # Normal package installation | 154 | # ================ Memory Pool |
349 | 155 | set_cachesize 0 1048576 0 | |
350 | # Generate an install solution by doing a --justdb install, then recreate it with | 156 | set_mp_mmapsize 268435456 |
351 | # an actual package install! | ||
352 | if [ -s ${target_rootfs}/install/install.manifest ]; then | ||
353 | echo "# Install manifest padding" >> ${target_rootfs}/install/install.manifest | ||
354 | ${RPM} --predefine "_rpmds_sysinfo_path ${target_rootfs}/etc/rpm/sysinfo" \ | ||
355 | --predefine "_rpmrc_platform_path ${target_rootfs}/etc/rpm/platform" \ | ||
356 | --root "${target_rootfs}/install" \ | ||
357 | -D "_dbpath ${target_rootfs}/install" -D "`cat ${confbase}-base_archs.macro`" \ | ||
358 | -D "__dbi_txn create nofsync" \ | ||
359 | -U --justdb --replacepkgs --noscripts --notriggers --noparentdirs --nolinktos --ignoresize \ | ||
360 | ${target_rootfs}/install/install.manifest | ||
361 | fi | ||
362 | 157 | ||
363 | if [ ! -z "${package_attemptonly}" ]; then | 158 | # ================ Locking |
364 | echo "Adding attempt only packages..." | 159 | set_lk_max_locks 16384 |
365 | process_pkg_list_rpm attemptonly ${package_attemptonly} | 160 | set_lk_max_lockers 16384 |
366 | cat ${target_rootfs}/install/install_attemptonly.manifest | while read pkg_name | 161 | set_lk_max_objects 16384 |
367 | do | 162 | mutex_set_max 163840 |
368 | echo "Attempting $pkg_name..." >> "`dirname ${BB_LOGFILE}`/log.do_${task}_attemptonly.${PID}" | ||
369 | ${RPM} --predefine "_rpmds_sysinfo_path ${target_rootfs}/etc/rpm/sysinfo" \ | ||
370 | --predefine "_rpmrc_platform_path ${target_rootfs}/etc/rpm/platform" \ | ||
371 | --root "${target_rootfs}/install" \ | ||
372 | -D "_dbpath ${target_rootfs}/install" -D "`cat ${confbase}.macro`" \ | ||
373 | -D "__dbi_txn create nofsync private" \ | ||
374 | -U --justdb --replacepkgs --noscripts --notriggers --noparentdirs --nolinktos --ignoresize \ | ||
375 | $pkg_name >> "`dirname ${BB_LOGFILE}`/log.do_${task}_attemptonly.${PID}" 2>&1 || true | ||
376 | done | ||
377 | fi | ||
378 | 163 | ||
379 | #### Note: 'Recommends' is an arbitrary tag that means _SUGGESTS_ in OE-core.. | 164 | # ================ Replication |
380 | # Add any recommended packages to the image | 165 | EOF |
381 | # RPM does not solve for recommended packages because they are optional... | 166 | fi |
382 | # So we query them and tree them like the ATTEMPTONLY packages above... | ||
383 | # Change the loop to "1" to run this code... | ||
384 | loop=0 | ||
385 | if [ $loop -eq 1 ]; then | ||
386 | echo "Processing recommended packages..." | ||
387 | cat /dev/null > ${target_rootfs}/install/recommend.list | ||
388 | while [ $loop -eq 1 ]; do | ||
389 | # Dump the full set of recommends... | ||
390 | ${RPM} --predefine "_rpmds_sysinfo_path ${target_rootfs}/etc/rpm/sysinfo" \ | ||
391 | --predefine "_rpmrc_platform_path ${target_rootfs}/etc/rpm/platform" \ | ||
392 | --root "${target_rootfs}/install" \ | ||
393 | -D "_dbpath ${target_rootfs}/install" -D "`cat ${confbase}.macro`" \ | ||
394 | -D "__dbi_txn create nofsync private" \ | ||
395 | -qa --qf "[%{RECOMMENDS}\n]" | sort -u > ${target_rootfs}/install/recommend | ||
396 | # Did we add more to the list? | ||
397 | grep -v -x -F -f ${target_rootfs}/install/recommend.list ${target_rootfs}/install/recommend > ${target_rootfs}/install/recommend.new || true | ||
398 | # We don't want to loop unless there is a change to the list! | ||
399 | loop=0 | ||
400 | cat ${target_rootfs}/install/recommend.new | \ | ||
401 | while read pkg ; do | ||
402 | # Ohh there was a new one, we'll need to loop again... | ||
403 | loop=1 | ||
404 | echo "Processing $pkg..." | ||
405 | found=0 | ||
406 | for archvar in base_archs ml_archs ; do | ||
407 | pkg_name=$(resolve_package_rpm ${confbase}-${archvar}.conf ${pkg}) | ||
408 | if [ -n "$pkg_name" ]; then | ||
409 | found=1 | ||
410 | break | ||
411 | fi | ||
412 | done | ||
413 | 167 | ||
414 | if [ $found -eq 0 ]; then | 168 | # Create database so that smart doesn't complain (lazy init) |
415 | echo "Note: Unable to find package $pkg -- suggests" | 169 | rpm --root $target_rootfs --dbpath /var/lib/rpm -qa > /dev/null |
416 | echo "Unable to find package $pkg." >> "`dirname ${BB_LOGFILE}`/log.do_${task}_recommend.${PID}" | 170 | |
417 | continue | 171 | # Configure smart |
172 | rm -rf ${target_rootfs}/var/lib/smart | ||
173 | smart --data-dir=${target_rootfs}/var/lib/smart config --set rpm-root=${target_rootfs} | ||
174 | smart --data-dir=${target_rootfs}/var/lib/smart config --set rpm-dbpath=${rpmlibdir} | ||
175 | smart --data-dir=${target_rootfs}/var/lib/smart config --set rpm-nolinktos=1 | ||
176 | smart --data-dir=${target_rootfs}/var/lib/smart config --set rpm-noparentdirs=1 | ||
177 | smart --data-dir=${target_rootfs}/var/lib/smart config --set rpm-extra-macros._var=${localstatedir} | ||
178 | smart --data-dir=${target_rootfs}/var/lib/smart config --set rpm-extra-macros._tmppath=/install/tmp | ||
179 | smart --data-dir=${target_rootfs}/var/lib/smart channel --add rpmsys type=rpm-sys -y | ||
180 | |||
181 | for arch in $platform_extra ; do | ||
182 | if [ -d ${DEPLOY_DIR_RPM}/$arch -a ! -e ${target_rootfs}/install/channel.$arch.stamp ] ; then | ||
183 | smart --data-dir=${target_rootfs}/var/lib/smart channel --add $arch type=rpm-md type=rpm-md baseurl=${DEPLOY_DIR_RPM}/$arch -y | ||
184 | touch ${target_rootfs}/install/channel.$arch.stamp | ||
418 | fi | 185 | fi |
419 | echo "Attempting $pkg_name..." >> "`dirname ${BB_LOGFILE}`/log.do_{task}_recommend.${PID}" | ||
420 | ${RPM} --predefine "_rpmds_sysinfo_path ${target_rootfs}/etc/rpm/sysinfo" \ | ||
421 | --predefine "_rpmrc_platform_path ${target_rootfs}/etc/rpm/platform" \ | ||
422 | --root "${target_rootfs}/install" \ | ||
423 | -D "_dbpath ${target_rootfs}/install" -D "`cat ${confbase}.macro`" \ | ||
424 | -D "__dbi_txn create nofsync private" \ | ||
425 | -U --justdb --replacepkgs --noscripts --notriggers --noparentdirs --nolinktos --ignoresize \ | ||
426 | $pkg_name >> "`dirname ${BB_LOGFILE}`/log.do_${task}_recommend.${PID}" 2>&1 || true | ||
427 | done | 186 | done |
428 | cat ${target_rootfs}/install/recommend.list ${target_rootfs}/install/recommend.new | sort -u > ${target_rootfs}/install/recommend.new.list | ||
429 | mv -f ${target_rootfs}/install/recommend.new.list ${target_rootfs}/install/recommend.list | ||
430 | rm ${target_rootfs}/install/recommend ${target_rootfs}/install/recommend.new | ||
431 | done | ||
432 | fi | 187 | fi |
433 | 188 | ||
434 | # Now that we have a solution, pull out a list of what to install... | 189 | # Uclibc builds don't provide this stuff... |
435 | echo "Manifest: ${target_rootfs}/install/install_solution.manifest" | 190 | if [ x${TARGET_OS} != "xlinux" ] && [ x${TARGET_OS} != "xlinux-gnueabi" ] ; then |
436 | ${RPM} -D "_dbpath ${target_rootfs}/install" -qa --qf "%{packageorigin}\n" \ | 191 | package_linguas="" |
437 | --root "${target_rootfs}/install" \ | ||
438 | -D "__dbi_txn create nofsync private" \ | ||
439 | > ${target_rootfs}/install/install_solution.manifest | ||
440 | |||
441 | touch ${target_rootfs}/install/install_multilib_solution.manifest | ||
442 | |||
443 | if [ -s "${target_rootfs}/install/install_multilib.manifest" ]; then | ||
444 | # multilib package installation | ||
445 | echo "# Install multilib manifest padding" >> ${target_rootfs}/install/install_multilib.manifest | ||
446 | |||
447 | # Generate an install solution by doing a --justdb install, then recreate it with | ||
448 | # an actual package install! | ||
449 | ${RPM} --predefine "_rpmds_sysinfo_path ${target_rootfs}/etc/rpm/sysinfo" \ | ||
450 | --predefine "_rpmrc_platform_path ${target_rootfs}/etc/rpm/platform" \ | ||
451 | --root "${target_rootfs}/install" \ | ||
452 | -D "_dbpath ${target_rootfs}/install" -D "`cat ${confbase}-ml_archs.macro`" \ | ||
453 | -D "__dbi_txn create nofsync" \ | ||
454 | -U --justdb --replacepkgs --noscripts --notriggers --noparentdirs --nolinktos --ignoresize \ | ||
455 | ${target_rootfs}/install/install_multilib.manifest | ||
456 | |||
457 | # Now that we have a solution, pull out a list of what to install... | ||
458 | echo "Manifest: ${target_rootfs}/install/install_multilib.manifest" | ||
459 | ${RPM} -D "_dbpath ${target_rootfs}/install" -qa --qf "%{packageorigin}\n" \ | ||
460 | --root "${target_rootfs}/install" \ | ||
461 | -D "__dbi_txn create nofsync private" \ | ||
462 | > ${target_rootfs}/install/install_multilib_solution.manifest | ||
463 | |||
464 | fi | 192 | fi |
465 | 193 | ||
466 | cat ${target_rootfs}/install/install_solution.manifest \ | ||
467 | ${target_rootfs}/install/install_multilib_solution.manifest | sort -u > ${target_rootfs}/install/total_solution.manifest | ||
468 | |||
469 | # Construct install scriptlet wrapper | 194 | # Construct install scriptlet wrapper |
470 | cat << EOF > ${WORKDIR}/scriptlet_wrapper | 195 | cat << EOF > ${WORKDIR}/scriptlet_wrapper |
471 | #!/bin/bash | 196 | #!/bin/bash |
@@ -491,93 +216,17 @@ fi | |||
491 | EOF | 216 | EOF |
492 | 217 | ||
493 | chmod 0755 ${WORKDIR}/scriptlet_wrapper | 218 | chmod 0755 ${WORKDIR}/scriptlet_wrapper |
219 | smart --data-dir=${target_rootfs}/var/lib/smart config --set rpm-extra-macros._cross_scriptlet_wrapper=${WORKDIR}/scriptlet_wrapper | ||
494 | 220 | ||
495 | # Configure RPM... we enforce these settings! | 221 | smart --data-dir=${target_rootfs}/var/lib/smart install -y ${package_to_install} ${package_linguas} |
496 | mkdir -p ${target_rootfs}${rpmlibdir} | ||
497 | mkdir -p ${target_rootfs}${rpmlibdir}/log | ||
498 | # After change the __db.* cache size, log file will not be generated automatically, | ||
499 | # that will raise some warnings, so touch a bare log for rpm write into it. | ||
500 | touch ${target_rootfs}${rpmlibdir}/log/log.0000000001 | ||
501 | cat > ${target_rootfs}${rpmlibdir}/DB_CONFIG << EOF | ||
502 | # ================ Environment | ||
503 | set_data_dir . | ||
504 | set_create_dir . | ||
505 | set_lg_dir ./log | ||
506 | set_tmp_dir ./tmp | ||
507 | set_flags db_log_autoremove on | ||
508 | |||
509 | # -- thread_count must be >= 8 | ||
510 | set_thread_count 64 | ||
511 | |||
512 | # ================ Logging | ||
513 | 222 | ||
514 | # ================ Memory Pool | 223 | if [ ! -z "${package_attemptonly}" ]; then |
515 | set_cachesize 0 1048576 0 | 224 | echo "Installing attempt only packages..." |
516 | set_mp_mmapsize 268435456 | 225 | for pkg_name in ${package_attemptonly} ; do |
517 | 226 | echo "Attempting $pkg_name..." >> "`dirname ${BB_LOGFILE}`/log.do_${task}_attemptonly.${PID}" | |
518 | # ================ Locking | 227 | smart --data-dir=${target_rootfs}/var/lib/smart install -y $pkg_name >> "`dirname ${BB_LOGFILE}`/log.do_${task}_attemptonly.${PID}" 2>&1 || true |
519 | set_lk_max_locks 16384 | 228 | done |
520 | set_lk_max_lockers 16384 | ||
521 | set_lk_max_objects 16384 | ||
522 | mutex_set_max 163840 | ||
523 | |||
524 | # ================ Replication | ||
525 | EOF | ||
526 | |||
527 | if [ "${INSTALL_COMPLEMENTARY_RPM}" = "1" ] ; then | ||
528 | # Only install packages not already installed (dependency calculation will | ||
529 | # almost certainly have added some that have been) | ||
530 | sort -u ${target_rootfs}/install/original_solution.manifest > ${target_rootfs}/install/original_solution_sorted.manifest | ||
531 | sort -u ${target_rootfs}/install/total_solution.manifest > ${target_rootfs}/install/total_solution_sorted.manifest | ||
532 | comm -2 -3 ${target_rootfs}/install/total_solution_sorted.manifest \ | ||
533 | ${target_rootfs}/install/original_solution_sorted.manifest > \ | ||
534 | ${target_rootfs}/install/diff.manifest | ||
535 | mv ${target_rootfs}/install/diff.manifest ${target_rootfs}/install/total_solution.manifest | ||
536 | elif [ "${INC_RPM_IMAGE_GEN}" = "1" -a -f "${target_rootfs}/etc/passwd" ]; then | ||
537 | echo "Skipping pre install due to existing image" | ||
538 | else | ||
539 | # RPM is special. It can't handle dependencies and preinstall scripts correctly. Its | ||
540 | # probably a feature. The only way to convince rpm to actually run the preinstall scripts | ||
541 | # for base-passwd and shadow first before installing packages that depend on these packages | ||
542 | # is to do two image installs, installing one set of packages, then the other. | ||
543 | rm -f ${target_rootfs}/install/initial_install.manifest | ||
544 | echo "Installing base dependencies first (base-passwd, base-files and shadow) since rpm is special" | ||
545 | grep /base-passwd-[0-9] ${target_rootfs}/install/total_solution.manifest >> ${target_rootfs}/install/initial_install.manifest || true | ||
546 | grep /base-files-[0-9] ${target_rootfs}/install/total_solution.manifest >> ${target_rootfs}/install/initial_install.manifest || true | ||
547 | grep /shadow-[0-9] ${target_rootfs}/install/total_solution.manifest >> ${target_rootfs}/install/initial_install.manifest || true | ||
548 | |||
549 | if [ -s ${target_rootfs}/install/initial_install.manifest ]; then | ||
550 | echo "# Initial Install manifest padding..." >> ${target_rootfs}/install/initial_install.manifest | ||
551 | |||
552 | # Generate an install solution by doing a --justdb install, then recreate it with | ||
553 | # an actual package install! | ||
554 | mkdir -p ${target_rootfs}/initial | ||
555 | |||
556 | ${RPM} --predefine "_rpmds_sysinfo_path ${target_rootfs}/etc/rpm/sysinfo" \ | ||
557 | --predefine "_rpmrc_platform_path ${target_rootfs}/etc/rpm/platform" \ | ||
558 | --root "${target_rootfs}/install" \ | ||
559 | -D "_dbpath ${target_rootfs}/initial" -D "`cat ${confbase}.macro`" \ | ||
560 | -D "__dbi_txn create nofsync" \ | ||
561 | -U --justdb --replacepkgs --noscripts --notriggers --noparentdirs --nolinktos --ignoresize \ | ||
562 | ${target_rootfs}/install/initial_install.manifest | ||
563 | |||
564 | ${RPM} -D "_dbpath ${target_rootfs}/initial" -qa --qf "%{packageorigin}\n" \ | ||
565 | -D "__dbi_txn create nofsync private" \ | ||
566 | --root "${target_rootfs}/install" \ | ||
567 | > ${target_rootfs}/install/initial_solution.manifest | ||
568 | |||
569 | rpm_update_pkg ${target_rootfs}/install/initial_solution.manifest | ||
570 | |||
571 | grep -Fv -f ${target_rootfs}/install/initial_solution.manifest ${target_rootfs}/install/total_solution.manifest > ${target_rootfs}/install/total_solution.manifest.new | ||
572 | mv ${target_rootfs}/install/total_solution.manifest.new ${target_rootfs}/install/total_solution.manifest | ||
573 | |||
574 | rm -rf ${target_rootfs}/initial | ||
575 | fi | ||
576 | fi | 229 | fi |
577 | |||
578 | echo "Installing main solution manifest (${target_rootfs}/install/total_solution.manifest)" | ||
579 | |||
580 | rpm_update_pkg ${target_rootfs}/install/total_solution.manifest | ||
581 | } | 230 | } |
582 | 231 | ||
583 | python write_specfile () { | 232 | python write_specfile () { |
diff --git a/meta/classes/populate_sdk_rpm.bbclass b/meta/classes/populate_sdk_rpm.bbclass index b5aa601f5d..d26867fa9a 100644 --- a/meta/classes/populate_sdk_rpm.bbclass +++ b/meta/classes/populate_sdk_rpm.bbclass | |||
@@ -1,10 +1,20 @@ | |||
1 | # Smart is python based, so be sure python-native is available to us. | ||
2 | EXTRANATIVEPATH += "python-native" | ||
3 | |||
1 | do_populate_sdk[depends] += "rpm-native:do_populate_sysroot" | 4 | do_populate_sdk[depends] += "rpm-native:do_populate_sysroot" |
2 | do_populate_sdk[depends] += "rpmresolve-native:do_populate_sysroot" | 5 | do_populate_sdk[depends] += "rpmresolve-native:do_populate_sysroot" |
6 | do_populate_sdk[depends] += "python-smartpm-native:do_populate_sysroot" | ||
7 | |||
8 | # Needed for update-alternatives | ||
9 | do_populate_sdk[depends] += "opkg-native:do_populate_sysroot" | ||
10 | |||
11 | # Creating the repo info in do_rootfs | ||
3 | do_populate_sdk[depends] += "createrepo-native:do_populate_sysroot" | 12 | do_populate_sdk[depends] += "createrepo-native:do_populate_sysroot" |
13 | |||
4 | do_populate_sdk[recrdeptask] += "do_package_write_rpm" | 14 | do_populate_sdk[recrdeptask] += "do_package_write_rpm" |
5 | 15 | ||
6 | rpmlibdir = "/var/lib/rpm" | 16 | rpmlibdir = "/var/lib/rpm" |
7 | RPMOPTS="--dbpath ${rpmlibdir} --define='_openall_before_chroot 1'" | 17 | RPMOPTS="--dbpath ${rpmlibdir}" |
8 | RPM="rpm ${RPMOPTS}" | 18 | RPM="rpm ${RPMOPTS}" |
9 | 19 | ||
10 | do_populate_sdk[lockfiles] += "${DEPLOY_DIR_RPM}/rpm.lock" | 20 | do_populate_sdk[lockfiles] += "${DEPLOY_DIR_RPM}/rpm.lock" |
@@ -16,28 +26,24 @@ populate_sdk_post_rpm () { | |||
16 | # remove lock files | 26 | # remove lock files |
17 | rm -f ${target_rootfs}/__db.* | 27 | rm -f ${target_rootfs}/__db.* |
18 | 28 | ||
19 | # Move manifests into the directory with the logs | ||
20 | mv ${target_rootfs}/install/*.manifest ${T}/ | ||
21 | |||
22 | # Remove all remaining resolver files | 29 | # Remove all remaining resolver files |
23 | rm -rf ${target_rootfs}/install | 30 | rm -rf ${target_rootfs}/install |
31 | rm -rf ${target_rootfs}/var/lib/smart | ||
24 | } | 32 | } |
25 | 33 | ||
26 | populate_sdk_rpm () { | 34 | populate_sdk_rpm () { |
27 | 35 | ||
28 | package_update_index_rpm | 36 | package_update_index_rpm |
29 | package_generate_rpm_conf | ||
30 | 37 | ||
31 | ## install target ## | 38 | ## install target ## |
32 | # This needs to work in the same way as rootfs_rpm.bbclass! | 39 | # This needs to work in the same way as rootfs_rpm.bbclass! |
33 | # | 40 | # |
34 | export INSTALL_ROOTFS_RPM="${SDK_OUTPUT}/${SDKTARGETSYSROOT}" | 41 | export INSTALL_ROOTFS_RPM="${SDK_OUTPUT}/${SDKTARGETSYSROOT}" |
35 | export INSTALL_PLATFORM_RPM="${TARGET_ARCH}" | 42 | export INSTALL_PLATFORM_RPM="${TARGET_ARCH}" |
36 | export INSTALL_CONFBASE_RPM="${RPMCONF_TARGET_BASE}" | ||
37 | export INSTALL_PACKAGES_RPM="${TOOLCHAIN_TARGET_TASK}" | 43 | export INSTALL_PACKAGES_RPM="${TOOLCHAIN_TARGET_TASK}" |
38 | export INSTALL_PACKAGES_ATTEMPTONLY_RPM="${TOOLCHAIN_TARGET_TASK_ATTEMPTONLY}" | 44 | export INSTALL_PACKAGES_ATTEMPTONLY_RPM="${TOOLCHAIN_TARGET_TASK_ATTEMPTONLY}" |
39 | export INSTALL_PACKAGES_LINGUAS_RPM="" | 45 | export INSTALL_PACKAGES_LINGUAS_RPM="" |
40 | export INSTALL_PROVIDENAME_RPM="/bin/sh /bin/bash /usr/bin/env /usr/bin/perl pkgconfig pkgconfig(pkg-config)" | 46 | export INSTALL_PROVIDENAME_RPM="" |
41 | export INSTALL_TASK_RPM="populate_sdk-target" | 47 | export INSTALL_TASK_RPM="populate_sdk-target" |
42 | export INSTALL_COMPLEMENTARY_RPM="" | 48 | export INSTALL_COMPLEMENTARY_RPM="" |
43 | export INTERCEPT_DIR=${WORKDIR}/intercept_scripts | 49 | export INTERCEPT_DIR=${WORKDIR}/intercept_scripts |
@@ -45,31 +51,6 @@ populate_sdk_rpm () { | |||
45 | 51 | ||
46 | # Setup base system configuration | 52 | # Setup base system configuration |
47 | mkdir -p ${INSTALL_ROOTFS_RPM}/etc/rpm/ | 53 | mkdir -p ${INSTALL_ROOTFS_RPM}/etc/rpm/ |
48 | mkdir -p ${INSTALL_ROOTFS_RPM}${rpmlibdir} | ||
49 | mkdir -p ${INSTALL_ROOTFS_RPM}${rpmlibdir}/log | ||
50 | cat > ${INSTALL_ROOTFS_RPM}${rpmlibdir}/DB_CONFIG << EOF | ||
51 | # ================ Environment | ||
52 | set_data_dir . | ||
53 | set_create_dir . | ||
54 | set_lg_dir ./log | ||
55 | set_tmp_dir ./tmp | ||
56 | |||
57 | # -- thread_count must be >= 8 | ||
58 | set_thread_count 64 | ||
59 | |||
60 | # ================ Logging | ||
61 | |||
62 | # ================ Memory Pool | ||
63 | set_mp_mmapsize 268435456 | ||
64 | |||
65 | # ================ Locking | ||
66 | set_lk_max_locks 16384 | ||
67 | set_lk_max_lockers 16384 | ||
68 | set_lk_max_objects 16384 | ||
69 | mutex_set_max 163840 | ||
70 | |||
71 | # ================ Replication | ||
72 | EOF | ||
73 | 54 | ||
74 | # List must be prefered to least preferred order | 55 | # List must be prefered to least preferred order |
75 | INSTALL_PLATFORM_EXTRA_RPM="" | 56 | INSTALL_PLATFORM_EXTRA_RPM="" |
@@ -86,7 +67,6 @@ EOF | |||
86 | echo "Installing NATIVESDK packages" | 67 | echo "Installing NATIVESDK packages" |
87 | export INSTALL_ROOTFS_RPM="${SDK_OUTPUT}" | 68 | export INSTALL_ROOTFS_RPM="${SDK_OUTPUT}" |
88 | export INSTALL_PLATFORM_RPM="${SDK_ARCH}" | 69 | export INSTALL_PLATFORM_RPM="${SDK_ARCH}" |
89 | export INSTALL_CONFBASE_RPM="${RPMCONF_HOST_BASE}" | ||
90 | export INSTALL_PACKAGES_RPM="${TOOLCHAIN_HOST_TASK}" | 70 | export INSTALL_PACKAGES_RPM="${TOOLCHAIN_HOST_TASK}" |
91 | export INSTALL_PACKAGES_ATTEMPTONLY_RPM="${TOOLCHAIN_TARGET_HOST_ATTEMPTONLY}" | 71 | export INSTALL_PACKAGES_ATTEMPTONLY_RPM="${TOOLCHAIN_TARGET_HOST_ATTEMPTONLY}" |
92 | export INSTALL_PACKAGES_LINGUAS_RPM="" | 72 | export INSTALL_PACKAGES_LINGUAS_RPM="" |
@@ -114,11 +94,6 @@ EOF | |||
114 | rm -rf ${SDK_OUTPUT}/etc | 94 | rm -rf ${SDK_OUTPUT}/etc |
115 | 95 | ||
116 | populate_sdk_log_check populate_sdk | 96 | populate_sdk_log_check populate_sdk |
117 | |||
118 | # Workaround so the parser knows we need the resolve_package function! | ||
119 | if false ; then | ||
120 | resolve_package_rpm foo ${RPMCONF_TARGET_BASE}.conf || true | ||
121 | fi | ||
122 | } | 97 | } |
123 | 98 | ||
124 | python () { | 99 | python () { |
diff --git a/meta/classes/rootfs_rpm.bbclass b/meta/classes/rootfs_rpm.bbclass index 2bb1b08740..d0b0d5793f 100644 --- a/meta/classes/rootfs_rpm.bbclass +++ b/meta/classes/rootfs_rpm.bbclass | |||
@@ -7,11 +7,15 @@ ROOTFS_PKGMANAGE = "rpm zypper" | |||
7 | # Add 50Meg of extra space for zypper database space | 7 | # Add 50Meg of extra space for zypper database space |
8 | IMAGE_ROOTFS_EXTRA_SPACE_append = "${@base_contains("PACKAGE_INSTALL", "zypper", " + 51200", "" ,d)}" | 8 | IMAGE_ROOTFS_EXTRA_SPACE_append = "${@base_contains("PACKAGE_INSTALL", "zypper", " + 51200", "" ,d)}" |
9 | 9 | ||
10 | # Smart is python based, so be sure python-native is available to us. | ||
11 | EXTRANATIVEPATH += "python-native" | ||
12 | |||
10 | # Postinstalls on device are handled within this class at present | 13 | # Postinstalls on device are handled within this class at present |
11 | ROOTFS_PKGMANAGE_BOOTSTRAP = "" | 14 | ROOTFS_PKGMANAGE_BOOTSTRAP = "" |
12 | 15 | ||
13 | do_rootfs[depends] += "rpm-native:do_populate_sysroot" | 16 | do_rootfs[depends] += "rpm-native:do_populate_sysroot" |
14 | do_rootfs[depends] += "rpmresolve-native:do_populate_sysroot" | 17 | do_rootfs[depends] += "rpmresolve-native:do_populate_sysroot" |
18 | do_rootfs[depends] += "python-smartpm-native:do_populate_sysroot" | ||
15 | 19 | ||
16 | # Needed for update-alternatives | 20 | # Needed for update-alternatives |
17 | do_rootfs[depends] += "opkg-native:do_populate_sysroot" | 21 | do_rootfs[depends] += "opkg-native:do_populate_sysroot" |
@@ -21,8 +25,8 @@ do_rootfs[depends] += "createrepo-native:do_populate_sysroot" | |||
21 | 25 | ||
22 | do_rootfs[recrdeptask] += "do_package_write_rpm" | 26 | do_rootfs[recrdeptask] += "do_package_write_rpm" |
23 | 27 | ||
24 | RPM_PREPROCESS_COMMANDS = "package_update_index_rpm; package_generate_rpm_conf; " | 28 | RPM_PREPROCESS_COMMANDS = "package_update_index_rpm; " |
25 | RPM_POSTPROCESS_COMMANDS = "" | 29 | RPM_POSTPROCESS_COMMANDS = "rpm_setup_smart_target_config; " |
26 | 30 | ||
27 | # | 31 | # |
28 | # Allow distributions to alter when [postponed] package install scripts are run | 32 | # Allow distributions to alter when [postponed] package install scripts are run |
@@ -32,7 +36,7 @@ POSTINSTALL_INITPOSITION ?= "98" | |||
32 | rpmlibdir = "/var/lib/rpm" | 36 | rpmlibdir = "/var/lib/rpm" |
33 | opkglibdir = "${localstatedir}/lib/opkg" | 37 | opkglibdir = "${localstatedir}/lib/opkg" |
34 | 38 | ||
35 | RPMOPTS="--dbpath ${rpmlibdir} --define='_openall_before_chroot 1'" | 39 | RPMOPTS="--dbpath ${rpmlibdir}" |
36 | RPM="rpm ${RPMOPTS}" | 40 | RPM="rpm ${RPMOPTS}" |
37 | 41 | ||
38 | # RPM doesn't work with multiple rootfs generation at once due to collisions in the use of files | 42 | # RPM doesn't work with multiple rootfs generation at once due to collisions in the use of files |
@@ -42,13 +46,10 @@ do_rootfs[lockfiles] += "${DEPLOY_DIR_RPM}/rpm.lock" | |||
42 | fakeroot rootfs_rpm_do_rootfs () { | 46 | fakeroot rootfs_rpm_do_rootfs () { |
43 | ${RPM_PREPROCESS_COMMANDS} | 47 | ${RPM_PREPROCESS_COMMANDS} |
44 | 48 | ||
45 | #createrepo "${DEPLOY_DIR_RPM}" | ||
46 | |||
47 | # install packages | 49 | # install packages |
48 | # This needs to work in the same way as populate_sdk_rpm.bbclass! | 50 | # This needs to work in the same way as populate_sdk_rpm.bbclass! |
49 | export INSTALL_ROOTFS_RPM="${IMAGE_ROOTFS}" | 51 | export INSTALL_ROOTFS_RPM="${IMAGE_ROOTFS}" |
50 | export INSTALL_PLATFORM_RPM="${TARGET_ARCH}" | 52 | export INSTALL_PLATFORM_RPM="${TARGET_ARCH}" |
51 | export INSTALL_CONFBASE_RPM="${RPMCONF_TARGET_BASE}" | ||
52 | export INSTALL_PACKAGES_RPM="${PACKAGE_INSTALL}" | 53 | export INSTALL_PACKAGES_RPM="${PACKAGE_INSTALL}" |
53 | export INSTALL_PACKAGES_ATTEMPTONLY_RPM="${PACKAGE_INSTALL_ATTEMPTONLY}" | 54 | export INSTALL_PACKAGES_ATTEMPTONLY_RPM="${PACKAGE_INSTALL_ATTEMPTONLY}" |
54 | export INSTALL_PACKAGES_LINGUAS_RPM="${LINGUAS_INSTALL}" | 55 | export INSTALL_PACKAGES_LINGUAS_RPM="${LINGUAS_INSTALL}" |
@@ -114,18 +115,10 @@ EOF | |||
114 | # remove lock files | 115 | # remove lock files |
115 | rm -f ${IMAGE_ROOTFS}${rpmlibdir}/__db.* | 116 | rm -f ${IMAGE_ROOTFS}${rpmlibdir}/__db.* |
116 | 117 | ||
117 | # Move manifests into the directory with the logs | ||
118 | mv ${IMAGE_ROOTFS}/install/*.manifest ${T}/ | ||
119 | |||
120 | # Remove all remaining resolver files | 118 | # Remove all remaining resolver files |
121 | rm -rf ${IMAGE_ROOTFS}/install | 119 | rm -rf ${IMAGE_ROOTFS}/install |
122 | 120 | ||
123 | log_check rootfs | 121 | log_check rootfs |
124 | |||
125 | # Workaround so the parser knows we need the resolve_package function! | ||
126 | if false ; then | ||
127 | resolve_package_rpm foo ${RPMCONF_TARGET_BASE}.conf || true | ||
128 | fi | ||
129 | } | 122 | } |
130 | 123 | ||
131 | remove_packaging_data_files() { | 124 | remove_packaging_data_files() { |
@@ -135,10 +128,19 @@ remove_packaging_data_files() { | |||
135 | mkdir -p $t | 128 | mkdir -p $t |
136 | mv ${IMAGE_ROOTFS}${rpmlibdir} $t | 129 | mv ${IMAGE_ROOTFS}${rpmlibdir} $t |
137 | rm -rf ${IMAGE_ROOTFS}${opkglibdir} | 130 | rm -rf ${IMAGE_ROOTFS}${opkglibdir} |
131 | rm -rf ${IMAGE_ROOTFS}/var/lib/smart | ||
132 | } | ||
133 | |||
134 | rpm_setup_smart_target_config() { | ||
135 | # Set up smart configuration for the target | ||
136 | rm -rf ${IMAGE_ROOTFS}/var/lib/smart | ||
137 | smart --data-dir=${IMAGE_ROOTFS}/var/lib/smart channel --add rpmsys type=rpm-sys -y | ||
138 | smart --data-dir=${IMAGE_ROOTFS}/var/lib/smart config --set rpm-nolinktos=1 | ||
139 | smart --data-dir=${IMAGE_ROOTFS}/var/lib/smart config --set rpm-noparentdirs=1 | ||
140 | rm -f ${IMAGE_ROOTFS}/var/lib/smart/config.old | ||
138 | } | 141 | } |
139 | 142 | ||
140 | RPM_QUERY_CMD = '${RPM} --root $INSTALL_ROOTFS_RPM -D "_dbpath ${rpmlibdir}" \ | 143 | RPM_QUERY_CMD = '${RPM} --root $INSTALL_ROOTFS_RPM -D "_dbpath ${rpmlibdir}"' |
141 | -D "__dbi_txn create nofsync private"' | ||
142 | 144 | ||
143 | list_installed_packages() { | 145 | list_installed_packages() { |
144 | GET_LIST=$(${RPM_QUERY_CMD} -qa --qf "[%{NAME} %{ARCH} %{PACKAGEORIGIN} %{Platform}\n]") | 146 | GET_LIST=$(${RPM_QUERY_CMD} -qa --qf "[%{NAME} %{ARCH} %{PACKAGEORIGIN} %{Platform}\n]") |