#!/bin/bash # # builds packages from given dir # # $Header: /home/cvsd/magellan-cvs/magellan-src/mage/usr/lib/mage/pkgbuild_dir.sh,v 1.11 2006-01-01 23:46:08 niro Exp $ PKGSUFFIX="mpk" PKGNAME="$1" SEARCHDIRS="$2" MLIBDIR=/usr/lib/mage COLRED="\033[1;6m\033[31m" COLGREEN="\033[1;6m\033[32m" COLDEFAULT="\033[0m" # export default C locale export LC_ALL=C [[ -z $1 ]] && echo "No package name given. Aborting." && exit 1 [[ -z $2 ]] && echo "No source dir given. Aborting." && exit 1 if [ -f /etc/mage.rc ] then source /etc/mage.rc else echo "Your /etc/mage.rc is missing. Aborting." exit 1 fi source ${MLIBDIR}/mage4.functions.sh # set PKGDIR and BUILDDIR and BINDIR to MROOT #if [[ -n ${MROOT} ]] #then # export PKGDIR=${MROOT}/${PKGDIR} # export BUILDDIR=${MROOT}/${BUILDDIR} # export BINDIR=${MROOT}/${BINDIR} #fi build_preinstall() { if [ -d ${BUILDDIR}/${PKGNAME} ] then rm -rf ${BUILDDIR}/${PKGNAME} fi install -d ${BUILDDIR}/${PKGNAME}/binfiles touch ${BUILDDIR}/${PKGNAME}/.dirs touch ${BUILDDIR}/${PKGNAME}/.symlinks touch ${BUILDDIR}/${PKGNAME}/.files touch ${BUILDDIR}/${PKGNAME}/.pipes touch ${BUILDDIR}/${PKGNAME}/.char } build_postinstall() { echo echo "Fetching files for package '${PKGNAME}' ..." # md5sums will only be generated for files: $M_MD5SUM # sets mtime to same value of the $BINDIR: $M_MTIME # only needed for files and symlinks M_MTIME=$(stat -c %Y ${BINDIR}) # install mtime to package (needed for later checks) echo "${M_MTIME}" > ${BUILDDIR}/${PKGNAME}/.mtime # !! we use § as field seperator !! # doing so prevent us to get errors by filenames with spaces BUILD_TODELFILES=$(find ${SEARCHDIRS} -printf %p§) # sets fieldseperator to "§" instead of " " IFS=§ for I in $BUILD_TODELFILES do CHECK_SRCDIR="$(echo ${I#${SEARCHDIRS}*}|grep $BUILDDIR)" if [ -z "$CHECK_SRCDIR" ] then FILETYPE="$(stat -c %F $I)" FILEPOSIX="$(stat -c %a $I)" FILEOWNER="$(stat -c %U $I)" FILEGROUP="$(stat -c %G $I)" [[ ${FILEOWNER} = UNKNOWN ]] && FILEOWNER="root" [[ ${FILEGROUP} = UNKNOWN ]] && FILEGROUP="root" case "${FILETYPE}" in "directory") if [[ $I != ${SEARCHDIRS} ]] then echo "${I#${SEARCHDIRS}*}§${FILEPOSIX}§${FILEOWNER}§${FILEGROUP}" >> ${BUILDDIR}/${PKGNAME}/.dirs fi ;; "symbolic link") LNKDEST="$(readlink $I)" echo "${I#${SEARCHDIRS}*}§${FILEPOSIX}§${LNKDEST#${SEARCHDIRS}*}§${M_MTIME}" >> ${BUILDDIR}/${PKGNAME}/.symlinks ;; "regular empty file") FILEDIR="$(dirname $I)" FILEDIR="${FILEDIR#${SEARCHDIRS}*}" M_MD5SUM="$(md5sum ${I}|cut -d' ' -f1)" echo "${I#${SEARCHDIRS}*}§${FILEPOSIX}§${FILEOWNER}§${FILEGROUP}§${M_MTIME}§${M_MD5SUM}" >> ${BUILDDIR}/${PKGNAME}/.files install -d ${BUILDDIR}/${PKGNAME}/binfiles/${FILEDIR} cp ${I} ${BUILDDIR}/${PKGNAME}/binfiles/${FILEDIR} ;; "regular file" ) FILEDIR="$(dirname $I)" FILEDIR="${FILEDIR#${SEARCHDIRS}*}" M_MD5SUM="$(md5sum ${I}|cut -d' ' -f1)" echo "${I#${SEARCHDIRS}*}§${FILEPOSIX}§${FILEOWNER}§${FILEGROUP}§${M_MTIME}§${M_MD5SUM}" >> ${BUILDDIR}/${PKGNAME}/.files install -d ${BUILDDIR}/${PKGNAME}/binfiles/${FILEDIR} cp ${I} ${BUILDDIR}/${PKGNAME}/binfiles/${FILEDIR} ;; "block special file") echo "${I#${SEARCHDIRS}*}§${FILEPOSIX}" >> ${BUILDDIR}/${PKGNAME}/.pipes ;; "character special file") # convert hex2dec # printf '%d' 0x12 -> 18 local CHAR_MAJOR="$(printf 0x$(stat -c %t $I))" local CHAR_MINOR="$(printf 0x$(stat -c %T $I))" echo "${I#${SEARCHDIRS}*}§${FILEPOSIX}§${CHAR_MAJOR}§${CHAR_MINOR}" >> ${BUILDDIR}/${PKGNAME}/.char ;; *) echo "What I am ? -- $I" echo "$0 paused ... Press Enter" read ;; esac fi done # very important: unsetting the '§' fieldseperator unset IFS # forcing mtime to same value echo -n "Forcing mtime to the same value ..." find ${BUILDDIR}/${PKGNAME}/binfiles \ -exec touch -m -r ${BUILDDIR}/${PKGNAME}/.mtime '{}' ';' \ && echo done || echo false } build_rmtimestamp() { rm /var/tmp/timestamp } build_package() { echo "Building Package ..." cd ${BUILDDIR} tar cvjf ${PKGNAME}.tar.bz2 ./${PKGNAME} install -d ${PKGDIR} mv ${PKGNAME}.tar.bz2 ${PKGDIR}/${PKGNAME}.${PKGSUFFIX} } build_preinstall build_postinstall build_package