RPM_POSTPROCESS_COMMANDS_append = "wrl_installer;" do_rootfs[vardeps] += "INSTALLER_TARGET_BUILD INSTALLER_TARGET_IMAGE" # Fix system-shutdown hang at ratelimiting APPEND_append = " printk.devkmsg=on" INSTPRODUCT ?= "${DISTRO_NAME}" INSTVER ?= "${DISTRO_VERSION}" INSTBUGURL ?= "http://www.windriver.com/" # NOTE: Please update anaconda-init when you change INSTALLER_CONFDIR, use "=" # but not "?=" since this is not configurable. INSTALLER_CONFDIR = "${IMAGE_ROOTFS}/installer-config" KICKSTART_FILE ??= "" KICKSTART_FILE_EXTRA ??= "" WRL_INSTALLER_CONF ?= "" # Extra packages that will be added in the rpm repo in anaconda installer ISO image REPO_EXTRA_PKG = "\ xfsprogs-* \ glibc-binary-localedata-* \ " build_iso_prepend() { install -d ${ISODIR} ln -snf /.discinfo ${ISODIR}/.discinfo ln -snf /.buildstamp ${ISODIR}/.buildstamp ln -snf /Packages ${ISODIR}/Packages } build_iso_append() { implantisomd5 ${IMGDEPLOYDIR}/${IMAGE_NAME}.iso } # Check WRL_INSTALLER_CONF and copy it to # ${IMAGE_ROOTFS}/.buildstamp.$prj_name when exists wrl_installer_copy_buildstamp() { prj_name=$1 buildstamp=$2 if [ -f $buildstamp ]; then bbnote "Using $buildstamp as the buildstamp" cp $buildstamp ${IMAGE_ROOTFS}/.buildstamp.$prj_name else bbfatal "Can't find WRL_INSTALLER_CONF: $buildstamp" fi } # Hardlink when possible, otherwise copy. # $1: src # $2: target wrl_installer_hardlinktree() { src_dev="`stat -c %d $1`" if [ -e "$2" ]; then tgt_dev="`stat -c %d $2`" else tgt_dev="`stat -c %d $(dirname $2)`" fi hdlink="" if [ "$src_dev" = "$tgt_dev" ]; then hdlink="--link" fi cp -rvf $hdlink $1 $2 } wrl_installer_copy_local_repos() { deploy_dir_rpm=$1 target_build="$2" target_image="$3" target_image_input_pkglist=$(sed -n 's/^IMAGE_LIST="\(.*\)"/\1/p' ${target_build}/installersupport_${target_image}) if [ ! -f ${target_image_input_pkglist} ]; then bberror "The target image pkglist '${target_image_input_pkglist}' doesn't exist!" fi target_image_output_pkglist="${IMGDEPLOYDIR}/${IMAGE_NAME}.${target_image}.pkglist" target_image_output_pkglist_link="${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${target_image}.pkglist" if [ -d "$deploy_dir_rpm" ]; then echo "Copy rpms from target build to installer image." mkdir -p ${IMAGE_ROOTFS}/Packages.$prj_name : > ${IMAGE_ROOTFS}/Packages.$prj_name/.treeinfo echo "[general]" >> ${IMAGE_ROOTFS}/Packages.$prj_name/.treeinfo echo "version = ${DISTRO_VERSION}" >> ${IMAGE_ROOTFS}/Packages.$prj_name/.treeinfo # Determine the max channel priority channel_priority=5 for pt in $installer_target_archs ; do channel_priority=$(expr $channel_priority + 5) done : > ${IMAGE_ROOTFS}/Packages.$prj_name/.feedpriority for arch in $installer_target_archs; do if [ -d "$deploy_dir_rpm/"$arch -a ! -d "${IMAGE_ROOTFS}/Packages.$prj_name/"$arch ]; then channel_priority=$(expr $channel_priority - 5) echo "$channel_priority $arch" >> ${IMAGE_ROOTFS}/Packages.$prj_name/.feedpriority fi done cd ${deploy_dir_rpm} set -x # Add the packages in target image pkglist cat ${target_image_input_pkglist} > ${target_image_output_pkglist}.tmp # Add the extra packages required by anaconda for pkgs in ${REPO_EXTRA_PKG}; do pkg_files=$(find . -type f -name ${pkgs}) if [ -z "${pkg_files}" ]; then bbwarn "Package ${pkgs} not found, please check if there is anything wrong or just remove it from the list." else for pkg_file in ${pkg_files}; do basename ${pkg_file} >> ${target_image_output_pkglist}.tmp done fi done cat ${target_image_output_pkglist}.tmp|sort|uniq > ${target_image_output_pkglist} ln -s ${IMAGE_NAME}.${target_image}.pkglist ${target_image_output_pkglist_link} rm -f ${target_image_output_pkglist}.tmp for pkg in $(cat ${target_image_output_pkglist}); do pkg_file=$(find . -type f -name ${pkg}) if [ -z "${pkg_file}" ]; then bbwarn "Package ${pkg} not found, please check if there is anything wrong or just remove it from the list." else cp --parents -vf ${pkg_file} ${IMAGE_ROOTFS}/Packages.$prj_name/ fi done cd - createrepo_c --update -q ${IMAGE_ROOTFS}/Packages.$prj_name/ fi } # Update .buildstamp and copy rpm packages to IMAGE_ROOTFS wrl_installer_copy_pkgs() { target_build="$1" target_image="$2" prj_name="$3" if [ -n "$4" ]; then installer_conf="$4" else installer_conf="" fi common_grep="-e '^ALL_MULTILIB_PACKAGE_ARCHS=.*' \ -e '^MULTILIB_VARIANTS=.*' -e '^PACKAGE_ARCHS=.*'\ -e '^PACKAGE_ARCH=.*' -e '^PACKAGE_INSTALL_ATTEMPTONLY=.*' \ -e '^DISTRO=.*' -e '^DISTRO_NAME=.*' -e '^DISTRO_VERSION=.*' \ " if [ -f "$installer_conf" ]; then eval "grep -e \"^PACKAGE_INSTALL=.*\" $common_grep $installer_conf \ | sed -e 's/=/=\"/' -e 's/$/\"/' > ${BB_LOGFILE}.distro_vals" eval "cat $target_build/installersupport_$target_image | \ grep -e '^WORKDIR=.*' >> ${BB_LOGFILE}.distro_vals" eval `cat ${BB_LOGFILE}.distro_vals` if [ $? -ne 0 ]; then bbfatal "Something is wrong in $installer_conf, please correct it" fi if [ -z "$PACKAGE_ARCHS" -o -z "$PACKAGE_INSTALL" ]; then bbfatal "PACKAGE_ARCHS or PACKAGE_INSTALL is null, please check $installer_conf" fi else eval "cat $target_build/installersupport_$target_image | \ grep $common_grep -e '^PN=.*' -e '^SUMMARY=.*' -e '^WORKDIR=.*'\ -e '^DESCRIPTION=.*' -e '^export PACKAGE_INSTALL=.*' > ${BB_LOGFILE}.distro_vals" eval `cat ${BB_LOGFILE}.distro_vals` fi export installer_default_arch="$PACKAGE_ARCH" # Reverse it for priority export installer_default_archs="`for arch in $PACKAGE_ARCHS; do echo $arch; done | tac | tr - _`" installer_target_archs="$installer_default_archs" if [ -n "$MULTILIB_VARIANTS" ]; then export MULTILIB_VARIANTS mlarchs_reversed="`for mlarch in $ALL_MULTILIB_PACKAGE_ARCHS; do echo $mlarch; \ done | tac | tr - _`" for arch in $mlarchs_reversed; do if [ "$arch" != "noarch" -a "$arch" != "all" -a "$arch" != "any" ]; then installer_target_archs="$installer_target_archs $arch" fi done fi export installer_target_archs # Save the vars to .buildstamp when no installer_conf if [ ! -f "$installer_conf" ]; then cat >> ${IMAGE_ROOTFS}/.buildstamp.$prj_name <<_EOF DISTRO=$DISTRO DISTRO_NAME=$DISTRO_NAME DISTRO_VERSION=$DISTRO_VERSION [Rootfs] LIST=$PN [$PN] SUMMARY=$SUMMARY DESCRIPTION=$DESCRIPTION PACKAGE_INSTALL=$PACKAGE_INSTALL PACKAGE_INSTALL_ATTEMPTONLY=$PACKAGE_INSTALL_ATTEMPTONLY ALL_MULTILIB_PACKAGE_ARCHS=$ALL_MULTILIB_PACKAGE_ARCHS MULTILIB_VARIANTS=$MULTILIB_VARIANTS PACKAGE_ARCHS=$PACKAGE_ARCHS PACKAGE_ARCH=$PACKAGE_ARCH IMAGE_LINGUAS=${IMAGE_LINGUAS} _EOF fi if [ -d "$WORKDIR/oe-rootfs-repo/rpm" ]; then # Copy local repos while the image is not initramfs bpn=${BPN} if [ "${bpn##*initramfs}" = "${bpn%%initramfs*}" ]; then wrl_installer_copy_local_repos $WORKDIR/oe-rootfs-repo/rpm $target_build $target_image fi echo "$DISTRO::$prj_name::$DISTRO_NAME::$DISTRO_VERSION" >> ${IMAGE_ROOTFS}/.target_build_list fi } wrl_installer_get_count() { sum=0 for i in $*; do sum=$(expr $sum + 1) done echo $sum } wrl_installer[vardepsexclude] = "DATETIME" wrl_installer() { cat >${IMAGE_ROOTFS}/.discinfo <<_EOF ${DATETIME} ${DISTRO_NAME} ${DISTRO_VERSION} ${TARGET_ARCH} _EOF : > ${IMAGE_ROOTFS}/.target_build_list counter=0 targetimage_counter=0 for target_build in ${INSTALLER_TARGET_BUILD}; do target_build="`readlink -f $target_build`" echo "Installer Target Build: $target_build" counter=$(expr $counter + 1) prj_name="`echo $target_build | sed -e 's#/ *$##g' -e 's#.*/##'`" prj_name="$prj_name-$counter" # Generate .buildstamp if [ -n "${WRL_INSTALLER_CONF}" ]; then installer_conf="`echo ${WRL_INSTALLER_CONF} | awk '{print $'"$counter"'}'`" wrl_installer_copy_buildstamp $prj_name $installer_conf else cat >${IMAGE_ROOTFS}/.buildstamp.$prj_name <<_EOF [Main] Product=${INSTPRODUCT} Version=${INSTVER} BugURL=${INSTBUGURL} IsFinal=True UUID=${DATETIME}.${TARGET_ARCH} _EOF fi if [ -f "$target_build" ]; then filename=$(basename "$target_build") extension="${filename##*.}" bpn=${BPN} # Do not copy image for initramfs if [ "${bpn##*initramfs}" != "${bpn%%initramfs*}" ]; then continue elif [ "x$extension" = "xext2" -o "x$extension" = "xext3" -o "x$extension" = "xext4" ]; then echo "Image based target install selected." mkdir -p "${IMAGE_ROOTFS}/LiveOS.$prj_name" wrl_installer_hardlinktree "$target_build" "${IMAGE_ROOTFS}/LiveOS.$prj_name/rootfs.img" echo "::$prj_name::" >> ${IMAGE_ROOTFS}/.target_build_list else bberror "Unsupported image: $target_build." bberror "The image must be ext2, ext3 or ext4" exit 1 fi elif [ -d "$target_build" ]; then targetimage_counter=$(expr $targetimage_counter + 1) target_image="`echo ${INSTALLER_TARGET_IMAGE} | awk '{print $'"$targetimage_counter"'}'`" echo "Target Image: $target_image" wrl_installer_copy_pkgs $target_build $target_image $prj_name $installer_conf else bberror "Invalid configuration of INSTALLER_TARGET_BUILD: $target_build." bberror "It must either point to an image (ext2, ext3 or ext4) or to the root of another build directory" exit 1 fi ks_cfg="${INSTALLER_CONFDIR}/ks.cfg.$prj_name" if [ -n "${KICKSTART_FILE}" ]; then ks_file="`echo ${KICKSTART_FILE} | awk '{print $'"$counter"'}'`" bbnote "Copying kickstart file $ks_file to $ks_cfg ..." mkdir -p ${INSTALLER_CONFDIR} cp $ks_file $ks_cfg fi if [ -n "${KICKSTART_FILE_EXTRA}" ]; then for ks_file in ${KICKSTART_FILE_EXTRA}; do if [ -f $ks_file ]; then cp $ks_file ${INSTALLER_CONFDIR} else bbwarn "The kickstart file $ks_file in KICKSTART_FILE_EXTRA doesn't exist!" fi done fi done # Setup the symlink if only one target build dir. if [ "$counter" = "1" ]; then prj_name="`awk -F:: '{print $2}' ${IMAGE_ROOTFS}/.target_build_list`" entries=".buildstamp LiveOS Packages installer-config/ks.cfg" for i in $entries; do if [ -e ${IMAGE_ROOTFS}/$i.$prj_name ]; then ln -sf `basename $i.$prj_name` ${IMAGE_ROOTFS}/$i fi done fi } python __anonymous() { if "selinux" in d.getVar("DISTRO_FEATURES", True).split(): raise bb.parse.SkipPackage("Unable to build the installer when selinux is enabled.") if bb.data.inherits_class('image', d): if d.getVar("DISTRO", True) != "anaconda": raise bb.parse.SkipPackage("Set DISTRO = 'anaconda' in local.conf") target_builds = d.getVar('INSTALLER_TARGET_BUILD', True) if not target_builds: errmsg = "No INSTALLER_TARGET_BUILD is found,\n" errmsg += "set INSTALLER_TARGET_BUILD = '' and\n" errmsg += "INSTALLER_TARGET_IMAGE = '' to do RPMs\n" errmsg += "install, or\n" errmsg += "set INSTALLER_TARGET_BUILD = '' to do\n" errmsg += "image copy install" raise bb.parse.SkipPackage(errmsg) count = 0 for target_build in target_builds.split(): if not os.path.exists(target_build): raise bb.parse.SkipPackage("The %s of INSTALLER_TARGET_BUILD does not exist" % target_build) if os.path.isdir(target_build): count += 1 # While do package management install if count > 0: target_images = d.getVar('INSTALLER_TARGET_IMAGE', True) if not target_images: errmsg = "The INSTALLER_TARGET_BUILD is a dir, but not found INSTALLER_TARGET_IMAGE,\n" errmsg += "set INSTALLER_TARGET_IMAGE = '' to do RPMs install" raise bb.parse.SkipPackage(errmsg) elif count != len(target_images.split()): errmsg = "The INSTALLER_TARGET_BUILD has %s build dirs: %s\n" % (count, target_builds) errmsg += "But INSTALLER_TARGET_IMAGE has %s build images: %s\n" % (len(target_images.split()), target_images) raise bb.parse.SkipPackage(errmsg) # The count of INSTALLER_TARGET_BUILD and WRL_INSTALLER_CONF must match when set. wrlinstaller_confs = d.getVar('WRL_INSTALLER_CONF', True) if wrlinstaller_confs: if len(wrlinstaller_confs.split()) != len(target_builds.split()): raise bb.parse.SkipPackage("The count of INSTALLER_TARGET_BUILD and WRL_INSTALLER_CONF not match!") for wrlinstaller_conf in wrlinstaller_confs.split(): if not os.path.exists(wrlinstaller_conf): raise bb.parse.SkipPackage("The installer conf %s in WRL_INSTALLER_CONF doesn't exist!" % wrlinstaller_conf) # The count of INSTALLER_TARGET_BUILD and KICKSTART_FILE must match when set. kickstart_files = d.getVar('KICKSTART_FILE', True) if kickstart_files: if len(kickstart_files.split()) != len(target_builds.split()): raise bb.parse.SkipPackage("The count of INSTALLER_TARGET_BUILD and KICKSTART_FILE not match!") for kickstart_file in kickstart_files.split(): if not os.path.exists(kickstart_file): bb.warn("The kickstart file %s in KICKSTART_FILE doesn't exist!" % kickstart_file) } python build_syslinux_cfg () { import copy import sys workdir = d.getVar('WORKDIR') if not workdir: bb.error("WORKDIR not defined, unable to package") return cfile = d.getVar('SYSLINUX_CFG') if not cfile: bb.fatal('Unable to read SYSLINUX_CFG') }