Revert "Revert "oran-shell-release: release image for F""
[pti/rtp.git] / meta-starlingx / meta-stx-distro / classes / stx-anaconda-image.bbclass
1
2 RPM_POSTPROCESS_COMMANDS_append = "wrl_installer;"
3 do_rootfs[vardeps] += "INSTALLER_TARGET_BUILD INSTALLER_TARGET_IMAGE"
4
5 # Fix system-shutdown hang at ratelimiting
6 APPEND_append = " printk.devkmsg=on"
7
8 INSTPRODUCT ?= "${DISTRO_NAME}"
9 INSTVER     ?= "${DISTRO_VERSION}"
10 INSTBUGURL  ?= "http://www.windriver.com/"
11
12 # NOTE: Please update anaconda-init when you change INSTALLER_CONFDIR, use "="
13 #       but not "?=" since this is not configurable.
14 INSTALLER_CONFDIR = "${IMAGE_ROOTFS}/installer-config"
15 KICKSTART_FILE ??= ""
16 KICKSTART_FILE_EXTRA ??= ""
17 WRL_INSTALLER_CONF ?= ""
18
19 # Extra packages that will be added in the rpm repo in anaconda installer ISO image
20 REPO_EXTRA_PKG = "\
21     xfsprogs-* \
22     glibc-binary-localedata-* \
23 "
24
25 build_iso_prepend() {
26         install -d ${ISODIR}
27         ln -snf /.discinfo ${ISODIR}/.discinfo
28         ln -snf /.buildstamp ${ISODIR}/.buildstamp
29         ln -snf /Packages ${ISODIR}/Packages
30 }
31
32 build_iso_append() {
33         implantisomd5 ${IMGDEPLOYDIR}/${IMAGE_NAME}.iso
34 }
35
36 # Check WRL_INSTALLER_CONF and copy it to
37 # ${IMAGE_ROOTFS}/.buildstamp.$prj_name when exists
38 wrl_installer_copy_buildstamp() {
39     prj_name=$1
40     buildstamp=$2
41     if [ -f $buildstamp ]; then
42         bbnote "Using $buildstamp as the buildstamp"
43         cp $buildstamp ${IMAGE_ROOTFS}/.buildstamp.$prj_name
44     else
45         bbfatal "Can't find WRL_INSTALLER_CONF: $buildstamp"
46     fi
47 }
48
49 # Hardlink when possible, otherwise copy.
50 # $1: src
51 # $2: target
52 wrl_installer_hardlinktree() {
53     src_dev="`stat -c %d $1`"
54     if [ -e "$2" ]; then
55         tgt_dev="`stat -c %d $2`"
56     else
57         tgt_dev="`stat -c %d $(dirname $2)`"
58     fi
59     hdlink=""
60     if [ "$src_dev" = "$tgt_dev" ]; then
61         hdlink="--link"
62     fi
63     cp -rvf $hdlink $1 $2
64 }
65
66 wrl_installer_copy_local_repos() {
67     deploy_dir_rpm=$1
68     target_build="$2"
69     target_image="$3"
70
71     target_image_input_pkglist=$(sed -n 's/^IMAGE_LIST="\(.*\)"/\1/p' ${target_build}/installersupport_${target_image})
72     if [ ! -f ${target_image_input_pkglist} ]; then
73         bberror "The target image pkglist '${target_image_input_pkglist}' doesn't exist!"
74     fi
75
76     target_image_output_pkglist="${IMGDEPLOYDIR}/${IMAGE_NAME}.${target_image}.pkglist"
77     target_image_output_pkglist_link="${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${target_image}.pkglist"
78
79
80     if [ -d "$deploy_dir_rpm" ]; then
81         echo "Copy rpms from target build to installer image."
82         mkdir -p ${IMAGE_ROOTFS}/Packages.$prj_name
83
84         : > ${IMAGE_ROOTFS}/Packages.$prj_name/.treeinfo
85         echo "[general]" >> ${IMAGE_ROOTFS}/Packages.$prj_name/.treeinfo
86         echo "version = ${DISTRO_VERSION}" >> ${IMAGE_ROOTFS}/Packages.$prj_name/.treeinfo
87
88         # Determine the max channel priority
89         channel_priority=5
90         for pt in $installer_target_archs ; do
91             channel_priority=$(expr $channel_priority + 5)
92         done
93
94         : > ${IMAGE_ROOTFS}/Packages.$prj_name/.feedpriority
95         for arch in $installer_target_archs; do
96             if [ -d "$deploy_dir_rpm/"$arch -a ! -d "${IMAGE_ROOTFS}/Packages.$prj_name/"$arch ]; then
97                 channel_priority=$(expr $channel_priority - 5)
98                 echo "$channel_priority $arch" >> ${IMAGE_ROOTFS}/Packages.$prj_name/.feedpriority
99             fi
100         done
101
102         cd ${deploy_dir_rpm}
103         set -x
104         # Add the packages in target image pkglist
105         cat ${target_image_input_pkglist} > ${target_image_output_pkglist}.tmp
106
107         # Add the extra packages required by anaconda
108         for pkgs in ${REPO_EXTRA_PKG}; do
109             pkg_files=$(find . -type f -name ${pkgs})
110             if [ -z "${pkg_files}" ]; then
111                 bbwarn "Package ${pkgs} not found, please check if there is anything wrong or just remove it from the list."
112             else
113                 for pkg_file in ${pkg_files}; do
114                     basename ${pkg_file} >> ${target_image_output_pkglist}.tmp
115                 done
116             fi
117         done
118
119         cat ${target_image_output_pkglist}.tmp|sort|uniq > ${target_image_output_pkglist}
120         ln -s ${IMAGE_NAME}.${target_image}.pkglist ${target_image_output_pkglist_link}
121         rm -f ${target_image_output_pkglist}.tmp
122
123         for pkg in $(cat ${target_image_output_pkglist}); do
124             pkg_file=$(find . -type f -name ${pkg})
125             if [ -z "${pkg_file}" ]; then
126                 bbwarn "Package ${pkg} not found, please check if there is anything wrong or just remove it from the list."
127             else
128                 cp --parents -vf ${pkg_file} ${IMAGE_ROOTFS}/Packages.$prj_name/
129             fi
130         done
131         cd -
132
133         createrepo_c --update -q ${IMAGE_ROOTFS}/Packages.$prj_name/
134     fi
135 }
136
137 # Update .buildstamp and copy rpm packages to IMAGE_ROOTFS
138 wrl_installer_copy_pkgs() {
139
140     target_build="$1"
141     target_image="$2"
142     prj_name="$3"
143     if [ -n "$4" ]; then
144         installer_conf="$4"
145     else
146         installer_conf=""
147     fi
148
149     common_grep="-e '^ALL_MULTILIB_PACKAGE_ARCHS=.*' \
150             -e '^MULTILIB_VARIANTS=.*' -e '^PACKAGE_ARCHS=.*'\
151             -e '^PACKAGE_ARCH=.*' -e '^PACKAGE_INSTALL_ATTEMPTONLY=.*' \
152             -e '^DISTRO=.*' -e '^DISTRO_NAME=.*' -e '^DISTRO_VERSION=.*' \
153             "
154
155     if [ -f "$installer_conf" ]; then
156         eval "grep -e \"^PACKAGE_INSTALL=.*\" $common_grep $installer_conf \
157             | sed -e 's/=/=\"/' -e 's/$/\"/' > ${BB_LOGFILE}.distro_vals"
158
159         eval "cat $target_build/installersupport_$target_image | \
160             grep -e '^WORKDIR=.*' >> ${BB_LOGFILE}.distro_vals"
161
162         eval `cat ${BB_LOGFILE}.distro_vals`
163         if [ $? -ne 0 ]; then
164             bbfatal "Something is wrong in $installer_conf, please correct it"
165         fi
166         if [ -z "$PACKAGE_ARCHS" -o -z "$PACKAGE_INSTALL" ]; then
167             bbfatal "PACKAGE_ARCHS or PACKAGE_INSTALL is null, please check $installer_conf"
168         fi
169     else
170         eval "cat $target_build/installersupport_$target_image | \
171             grep $common_grep -e '^PN=.*' -e '^SUMMARY=.*' -e '^WORKDIR=.*'\
172             -e '^DESCRIPTION=.*' -e '^export PACKAGE_INSTALL=.*' > ${BB_LOGFILE}.distro_vals"
173
174         eval `cat ${BB_LOGFILE}.distro_vals`
175     fi
176
177     export installer_default_arch="$PACKAGE_ARCH"
178     # Reverse it for priority
179     export installer_default_archs="`for arch in $PACKAGE_ARCHS; do echo $arch; done | tac | tr - _`"
180     installer_target_archs="$installer_default_archs"
181     if [ -n "$MULTILIB_VARIANTS" ]; then
182         export MULTILIB_VARIANTS
183         mlarchs_reversed="`for mlarch in $ALL_MULTILIB_PACKAGE_ARCHS; do echo $mlarch; \
184             done | tac | tr - _`"
185         for arch in $mlarchs_reversed; do
186             if [ "$arch" != "noarch" -a "$arch" != "all" -a "$arch" != "any" ]; then
187                 installer_target_archs="$installer_target_archs $arch"
188             fi
189         done
190     fi
191     export installer_target_archs
192
193     # Save the vars to .buildstamp when no installer_conf
194     if [ ! -f "$installer_conf" ]; then
195         cat >> ${IMAGE_ROOTFS}/.buildstamp.$prj_name <<_EOF
196 DISTRO=$DISTRO
197 DISTRO_NAME=$DISTRO_NAME
198 DISTRO_VERSION=$DISTRO_VERSION
199
200 [Rootfs]
201 LIST=$PN
202
203 [$PN]
204 SUMMARY=$SUMMARY
205 DESCRIPTION=$DESCRIPTION
206
207 PACKAGE_INSTALL=$PACKAGE_INSTALL
208 PACKAGE_INSTALL_ATTEMPTONLY=$PACKAGE_INSTALL_ATTEMPTONLY
209 ALL_MULTILIB_PACKAGE_ARCHS=$ALL_MULTILIB_PACKAGE_ARCHS
210 MULTILIB_VARIANTS=$MULTILIB_VARIANTS
211 PACKAGE_ARCHS=$PACKAGE_ARCHS
212 PACKAGE_ARCH=$PACKAGE_ARCH
213 IMAGE_LINGUAS=${IMAGE_LINGUAS}
214 _EOF
215     fi
216
217     if [ -d "$WORKDIR/oe-rootfs-repo/rpm" ]; then
218         # Copy local repos while the image is not initramfs
219         bpn=${BPN}
220         if [ "${bpn##*initramfs}" = "${bpn%%initramfs*}" ]; then
221             wrl_installer_copy_local_repos $WORKDIR/oe-rootfs-repo/rpm $target_build $target_image
222         fi
223         echo "$DISTRO::$prj_name::$DISTRO_NAME::$DISTRO_VERSION" >> ${IMAGE_ROOTFS}/.target_build_list
224     fi
225 }
226
227 wrl_installer_get_count() {
228     sum=0
229     for i in $*; do
230         sum=$(expr $sum + 1)
231     done
232     echo $sum
233 }
234
235 wrl_installer[vardepsexclude] = "DATETIME"
236 wrl_installer() {
237     cat >${IMAGE_ROOTFS}/.discinfo <<_EOF
238 ${DATETIME}
239 ${DISTRO_NAME} ${DISTRO_VERSION}
240 ${TARGET_ARCH}
241 _EOF
242
243     : > ${IMAGE_ROOTFS}/.target_build_list
244     counter=0
245     targetimage_counter=0
246     for target_build in ${INSTALLER_TARGET_BUILD}; do
247         target_build="`readlink -f $target_build`"
248         echo "Installer Target Build: $target_build"
249         counter=$(expr $counter + 1)
250         prj_name="`echo $target_build | sed -e 's#/ *$##g' -e 's#.*/##'`"
251         prj_name="$prj_name-$counter"
252
253             # Generate .buildstamp
254             if [ -n "${WRL_INSTALLER_CONF}" ]; then
255                 installer_conf="`echo ${WRL_INSTALLER_CONF} | awk '{print $'"$counter"'}'`"
256                 wrl_installer_copy_buildstamp $prj_name $installer_conf
257             else
258                 cat >${IMAGE_ROOTFS}/.buildstamp.$prj_name <<_EOF
259 [Main]
260 Product=${INSTPRODUCT}
261 Version=${INSTVER}
262 BugURL=${INSTBUGURL}
263 IsFinal=True
264 UUID=${DATETIME}.${TARGET_ARCH}
265 _EOF
266             fi
267
268             if [ -f "$target_build" ]; then
269                 filename=$(basename "$target_build")
270                 extension="${filename##*.}"
271                 bpn=${BPN}
272                 # Do not copy image for initramfs
273                 if [ "${bpn##*initramfs}" != "${bpn%%initramfs*}" ]; then
274                     continue
275                 elif [ "x$extension" = "xext2" -o "x$extension" = "xext3" -o "x$extension" = "xext4" ]; then
276                     echo "Image based target install selected."
277                     mkdir -p "${IMAGE_ROOTFS}/LiveOS.$prj_name"
278                     wrl_installer_hardlinktree "$target_build" "${IMAGE_ROOTFS}/LiveOS.$prj_name/rootfs.img"
279                     echo "::$prj_name::" >> ${IMAGE_ROOTFS}/.target_build_list
280                 else
281                     bberror "Unsupported image: $target_build."
282                     bberror "The image must be ext2, ext3 or ext4"
283                     exit 1
284                 fi
285             elif [ -d "$target_build" ]; then
286                 targetimage_counter=$(expr $targetimage_counter + 1)
287                 target_image="`echo ${INSTALLER_TARGET_IMAGE} | awk '{print $'"$targetimage_counter"'}'`"
288                 echo "Target Image: $target_image"
289                 wrl_installer_copy_pkgs $target_build $target_image $prj_name $installer_conf
290             else
291                 bberror "Invalid configuration of INSTALLER_TARGET_BUILD: $target_build."
292                 bberror "It must either point to an image (ext2, ext3 or ext4) or to the root of another build directory"
293                 exit 1
294             fi
295
296             ks_cfg="${INSTALLER_CONFDIR}/ks.cfg.$prj_name"
297             if [ -n "${KICKSTART_FILE}" ]; then
298                 ks_file="`echo ${KICKSTART_FILE} | awk '{print $'"$counter"'}'`"
299                 bbnote "Copying kickstart file $ks_file to $ks_cfg ..."
300                 mkdir -p ${INSTALLER_CONFDIR}
301                 cp $ks_file $ks_cfg
302             fi
303             if [ -n "${KICKSTART_FILE_EXTRA}" ]; then
304                 for ks_file in ${KICKSTART_FILE_EXTRA}; do
305                     if [ -f $ks_file ]; then
306                         cp $ks_file ${INSTALLER_CONFDIR}
307                     else
308                         bbwarn "The kickstart file $ks_file in KICKSTART_FILE_EXTRA doesn't exist!"
309                     fi
310                 done
311             fi
312     done
313
314     # Setup the symlink if only one target build dir.
315     if [ "$counter" = "1" ]; then
316         prj_name="`awk -F:: '{print $2}' ${IMAGE_ROOTFS}/.target_build_list`"
317         entries=".buildstamp LiveOS Packages installer-config/ks.cfg"
318         for i in $entries; do
319             if [ -e ${IMAGE_ROOTFS}/$i.$prj_name ]; then
320                 ln -sf `basename $i.$prj_name` ${IMAGE_ROOTFS}/$i
321             fi
322         done
323     fi
324 }
325
326 python __anonymous() {
327     if "selinux" in d.getVar("DISTRO_FEATURES", True).split():
328         raise bb.parse.SkipPackage("Unable to build the installer when selinux is enabled.")
329
330     if bb.data.inherits_class('image', d):
331         if d.getVar("DISTRO", True) != "anaconda":
332             raise bb.parse.SkipPackage("Set DISTRO = 'anaconda' in local.conf")
333
334         target_builds = d.getVar('INSTALLER_TARGET_BUILD', True)
335         if not target_builds:
336             errmsg = "No INSTALLER_TARGET_BUILD is found,\n"
337             errmsg += "set INSTALLER_TARGET_BUILD = '<target-build-topdir>' and\n"
338             errmsg += "INSTALLER_TARGET_IMAGE = '<target-image-pn>' to do RPMs\n"
339             errmsg += "install, or\n"
340             errmsg += "set INSTALLER_TARGET_BUILD = '<target-build-image>' to do\n"
341             errmsg += "image copy install"
342             raise bb.parse.SkipPackage(errmsg)
343
344         count = 0
345         for target_build in target_builds.split():
346             if not os.path.exists(target_build):
347                 raise bb.parse.SkipPackage("The %s of INSTALLER_TARGET_BUILD does not exist" % target_build)
348
349             if os.path.isdir(target_build):
350                 count += 1
351
352         # While do package management install
353         if count > 0:
354             target_images = d.getVar('INSTALLER_TARGET_IMAGE', True)
355             if not target_images:
356                 errmsg = "The INSTALLER_TARGET_BUILD is a dir, but not found INSTALLER_TARGET_IMAGE,\n"
357                 errmsg += "set INSTALLER_TARGET_IMAGE = '<target-image-pn>' to do RPMs install"
358                 raise bb.parse.SkipPackage(errmsg)
359
360             elif count != len(target_images.split()):
361                 errmsg = "The INSTALLER_TARGET_BUILD has %s build dirs: %s\n" % (count, target_builds)
362                 errmsg += "But INSTALLER_TARGET_IMAGE has %s build images: %s\n" % (len(target_images.split()), target_images)
363                 raise bb.parse.SkipPackage(errmsg)
364
365         # The count of INSTALLER_TARGET_BUILD and WRL_INSTALLER_CONF must match when set.
366         wrlinstaller_confs = d.getVar('WRL_INSTALLER_CONF', True)
367         if wrlinstaller_confs:
368             if len(wrlinstaller_confs.split()) != len(target_builds.split()):
369                 raise bb.parse.SkipPackage("The count of INSTALLER_TARGET_BUILD and WRL_INSTALLER_CONF not match!")
370             for wrlinstaller_conf in wrlinstaller_confs.split():
371                 if not os.path.exists(wrlinstaller_conf):
372                     raise bb.parse.SkipPackage("The installer conf %s in WRL_INSTALLER_CONF doesn't exist!" % wrlinstaller_conf)
373
374         # The count of INSTALLER_TARGET_BUILD and KICKSTART_FILE must match when set.
375         kickstart_files = d.getVar('KICKSTART_FILE', True)
376         if kickstart_files:
377             if len(kickstart_files.split()) != len(target_builds.split()):
378                 raise bb.parse.SkipPackage("The count of INSTALLER_TARGET_BUILD and KICKSTART_FILE not match!")
379             for kickstart_file in kickstart_files.split():
380                 if not os.path.exists(kickstart_file):
381                     bb.warn("The kickstart file %s in KICKSTART_FILE doesn't exist!" % kickstart_file)
382
383 }
384
385 python build_syslinux_cfg () {
386     import copy
387     import sys
388
389     workdir = d.getVar('WORKDIR')
390     if not workdir:
391         bb.error("WORKDIR not defined, unable to package")
392         return
393
394     cfile = d.getVar('SYSLINUX_CFG')
395     if not cfile:
396         bb.fatal('Unable to read SYSLINUX_CFG')
397 }