#!/bin/bash # smage2 releated functions # $Id$ # sources the smage file and uses state from distribution file if exist # may helpful for repository support later on smagesource() { local file="$1" local localstate local distfilestate local mytag source ${file} # if PCAT was not set and PCATEGORIE was found # inform the user and use PCATEGORIE as PCAT if [[ -z ${PCAT} ]] then if [[ -n ${PCATEGORIE} ]] then PCAT="${PCATEGORIE}" unset PCATEGORIE # print a warning echo -e "${COLYELLOW}Warning: 'PCATEGORIE' is deprecated and gets removed in the future.${COLDEFAULT}" echo -e "${COLYELLOW} Please modify this smage2 script to use the 'PCAT' variable.${COLDEFAULT}" echo else die "Neither PCAT nor PCATEGORIE are defined!" fi fi [[ -n ${STATE} ]] && localstate="${STATE}" [[ -n ${DISTROTAG} ]] && mytag="${DISTROTAG}" if [ -f ${SMAGESCRIPTSDIR}/distribution ] then source ${SMAGESCRIPTSDIR}/distribution [[ -n ${STATE} ]] && distfilestate="${STATE}" [[ -n ${DISTROTAG} ]] && mytag="${DISTROTAG}" fi # now switch state and export it but do not overide any local states if [[ ! -z ${localstate} ]] then STATE="${localstate}" else STATE="${distfilestate}" fi if mqueryfeature "pkgdistrotag" then # if DISTROTAG was not defined globally # or in distribution file then deactivate this feature! # at this point $mytag must have the distrotag if [[ -z ${mytag} ]] then FVERBOSE=off msetfeature "!pkgdistrotag" unset DISTROTAG echo -e "${COLRED}Requested 'pkgdistrotag' but no \$DISTROTAG found!${COLDEFAULT}" echo -e "${COLRED}Disabled the feature for pkgbuild sanity!${COLDEFAULT}" else # now switch state and export it but do not overide any local states export DISTROTAG="${mytag}" fi else unset DISTROTAG fi } print_distrotag() { if FVERBOSE=off mqueryfeature "pkgdistrotag" then if [[ ! -z ${DISTROTAG} ]] then # add a point as prefix echo ".${DISTROTAG}" fi fi } showversion() { echo -en "Magellan Source Install v${SMAGEVERSION} " echo -e "-- Niels Rogalla (niro@magellan-linux.de)" } die() { xtitleclean echo -e ${COLRED}"Exited ${BASH_SOURCE} at line no ${BASH_LINENO}."${COLDEFAULT} echo "SMAGE failed: $@" exit 1 } die_pipestatus() { # the status change if we do any parameter declarations!! # dont do this anymore, keep this in mind! # # local pos="$1" # local comment="$2" # # [ ${PIPESTATUS[${pos}]} -ne 0 ] && die "${comment}" # [ ${PIPESTATUS[$1]} -ne 0 ] && die "$2" } xtitle() { if [[ ${TERM} = xterm ]] then echo -ne "\033]0;[sMage: $@]\007" fi return 0 } xtitleclean() { if [[ ${TERM} = xterm ]] then echo -ne "\033]0;\007" fi return 0 } syncsmage2() { xtitle "Updating smage2-script tree ..." local i for i in ${SMAGE2RSYNC} do rsync ${RSYNC_FETCH_OPTIONS} ${i} ${SMAGESCRIPTSDIR} if [[ $? = 0 ]] then break else continue fi done # clean up backup files (foo~) find ${SMAGESCRIPTSDIR} -name *~ -exec rm '{}' ';' xtitleclean } # $1 filename get_db_md5_sum() { local DB_FILE local MD5_FILE local i DB_ENTRY="$(basename $1)" MD5_FILE="${MD5DIR}/$(basename ${SMAGENAME} ${SMAGESUFFIX})" i="$(cat ${MD5_FILE}| grep ${DB_ENTRY} | cut -d' ' -f1)" echo "${i}" } download_sources() { [ -z "${SRC_URI}" ] && echo -e "\nNothing declared to download.\n" && return 0 local count=${#SRC_URI[*]} local uri local subdir local outputdir local db_md5_file="${MD5DIR}/$(basename ${SMAGENAME} .${SMAGESUFFIX}).md5" local fetching local i # check if FETCHING is needed if mchecksum --rundir "${SOURCEDIR}/${PNAME}" --file "${db_md5_file}" --method md5 then # md5's ok, no fetching needed fetching=false else fetching=true fi if [[ ${fetching} = true ]] then for ((i=0; i < count; i++)) do # url to file uri="${SRC_URI[${i}]%%' '*}" # subdir in sources dir; the my_SRCI_URI file goes to there subdir="${SRC_URI[${i}]##*' '}" # if $subdir is not equal with $uri then an other dir is used if [[ ${uri} != ${subdir} ]] then outputdir="${SOURCEDIR}/${PNAME}/${subdir}" else outputdir="${SOURCEDIR}/${PNAME}" fi echo -e "${COLBLUE}==>${COLGREEN} fetching ${uri}${COLDEFAULT}" # always use verbose mode for source downloads FVERBOSE=off msetfeature "verbose" # do not die here, mchecksum catches download errors mdownload --uri "${uri}" --dir "${outputdir}" # unset them to be sure unset uri unset subdir unset outputdir done # recheck md5 sums after download echo echo -e "${COLBLUE}===${COLGREEN} Checking MD5 sums:${COLDEFAULT}" mchecksum --rundir "${SOURCEDIR}/${PNAME}" --file "${db_md5_file}" --method md5 || die "md5 failed" echo else echo -e "${COLBLUE}===${COLGREEN} All sources already fetched, nothing to do${COLDEFAULT}" fi # not needed anymore unset SRC_URI } # dummy function, used if that does not exist in smage file src_prepare() { echo "no src_prepare defined; doing nothing ..." return 0 } # dummy function, used if that does not exist in smage file src_compile() { echo "no src_compile defined; doing nothing ..." return 0 } # dummy function, used if that does not exist in smage file src_check() { echo "no src_check defined; doing nothing ..." return 0 } # dummy function, used if that does not exist in smage file src_install() { echo "no src_install defined; doing nothing ..." return 0 } mlibdir() { local libdir=lib [[ ${ARCH} = x86_64 ]] && libdir=lib64 echo "${libdir}" } mconfigure() { local myopts if [[ ! -z ${CTARGET} ]] then myopts+=" --target=${CTARGET}" fi if [ -x ./configure ] then # if requested disable-static if [[ ! -z $(./configure --help | grep -- '--.*able-static') ]] then if mqueryfeature '!static' then myopts+=" --disable-static" else myopts+=" --enable-static" fi fi # always enable shared by default but not for waf configure if [[ ! -z $(./configure --help | grep -- '--.*able-shared') ]] && [[ -z $(./configure --version | grep waf) ]] then myopts+=" --enable-shared" fi ./configure \ --prefix=/usr \ --host=${CHOST} \ --build=${CHOST} \ --mandir=/usr/share/man \ --infodir=/usr/share/info \ --datadir=/usr/share \ --sysconfdir=/etc \ --localstatedir=/var/lib \ --libdir=/usr/$(mlibdir) \ ${myopts} \ "$@" || die "mconfigure failed" else echo "configure is not an executable ..." exit 1 fi } minstall() { if [ -f ./[mM]akefile -o -f ./GNUmakefile ] then make prefix=${BINDIR}/usr \ datadir=${BINDIR}/usr/share \ infodir=${BINDIR}/usr/share/info \ localstatedir=${BINDIR}/var/lib \ mandir=${BINDIR}/usr/share/man \ sysconfdir=${BINDIR}/etc \ libdir=${BINDIR}/usr/$(mlibdir) \ "$@" install || die "minstall failed" else die "no Makefile found" fi } mmake() { make ${MAKEOPTS} ${EXTRA_EMAKE} "$@" } munpack() { local SRCFILE local IFTAR local DEST SRCFILE=$1 if [[ -z $2 ]] then DEST=${BUILDDIR} else DEST=$2 fi [[ ! -d ${DEST} ]] && install -d ${DEST} case "${SRCFILE##*.}" in bz2) IFTAR="$(basename $SRCFILE .bz2)" IFTAR="${IFTAR##*.}" if [[ ${IFTAR} = tar ]] then tar --no-same-owner -xvjf ${SOURCEDIR}/${PNAME}/${SRCFILE} -C ${DEST} || die ".tar.bz2 unpack failed." else pushd ${DEST} > /dev/null bzcat ${SOURCEDIR}/${PNAME}/${SRCFILE} > ${DEST}/$(basename ${SRCFILE} .bz2) || die ".bz2 unpack failed." popd > /dev/null fi ;; gz) IFTAR="$(basename $SRCFILE .gz)" IFTAR="${IFTAR##*.}" if [[ ${IFTAR} = tar ]] then tar --no-same-owner -xvzf ${SOURCEDIR}/${PNAME}/${SRCFILE} -C ${DEST} || die ".tar.gz unpack failed." else pushd ${DEST} > /dev/null zcat ${SOURCEDIR}/${PNAME}/${SRCFILE} > ${DEST}/$(basename ${SRCFILE} .gz) || die ".gz unpack failed." popd > /dev/null fi ;; xz) IFTAR="$(basename $SRCFILE .xz)" IFTAR="${IFTAR##*.}" if [[ ${IFTAR} = tar ]] then tar --no-same-owner -xvJf ${SOURCEDIR}/${PNAME}/${SRCFILE} -C ${DEST} || die ".tar.xz unpack failed." else pushd ${DEST} > /dev/null xzcat ${SOURCEDIR}/${PNAME}/${SRCFILE} > ${DEST}/$(basename ${SRCFILE} .xz) || die ".xz unpack failed." popd > /dev/null fi ;; tbz2|mpks|mpk) tar --no-same-owner -xvjf ${SOURCEDIR}/${PNAME}/${SRCFILE} -C ${DEST} || die ".tbz2 unpack failed." ;; tgz) tar --no-same-owner -xvzf ${SOURCEDIR}/${PNAME}/${SRCFILE} -C ${DEST} || die ".tgz unpack failed." ;; txz|mpkzs|mpkz) tar --no-same-owner -xvJf ${SOURCEDIR}/${PNAME}/${SRCFILE} -C ${DEST} || die ".txz unpack failed." ;; rar) unrar x ${SOURCEDIR}/${PNAME}/${SRCFILE} ${DEST} || die ".rar unpack failed." ;; zip|xpi|jar) unzip ${SOURCEDIR}/${PNAME}/${SRCFILE} -d ${DEST} || die ".zip unpack failed." ;; rpm) pushd ${DEST} > /dev/null rpm2targz ${SOURCEDIR}/${PNAME}/${SRCFILE} || die "rpm2targz: .rpm unpack failed." tar --no-same-owner -xvzf ${SRCFILE/.rpm/.tar.gz} || die "tar: .rpm unpack failed." if [[ -f ${DEST}/${SRCFILE/.rpm/.tar.gz} ]] then rm ${DEST}/${SRCFILE/.rpm/.tar.gz} fi ;; *) die "munpack failed" ;; esac } mpatch() { local PATCHOPTS local PATCHFILE local i PATCHOPTS=$1 PATCHFILE=$2 if [[ -z $2 ]] then PATCHFILE=$1 ## patch level auto-detection, get patch level for ((i=0; i < 10; i++)) do patch --dry-run -Np${i} -i ${SOURCEDIR}/${PNAME}/${PATCHFILE} > /dev/null if [[ $? = 0 ]] then PATCHOPTS="-Np${i}" break fi done fi echo -e "${COLBLUE}*** ${COLGREEN}Applying patch '${PATCHFILE}'${COLDEFAULT}" patch "${PATCHOPTS}" -i ${SOURCEDIR}/${PNAME}/${PATCHFILE} } mlibtoolize() { local opts="$@" [[ -z ${opts} ]] && opts="--verbose --install --force" libtoolize ${opts} || die "running: mlibtoolize ${opts}" } mautoreconf() { local opts="$@" [[ -z ${opts} ]] && opts="--verbose --install --force" autoreconf ${opts} || die "running: mautoreconf ${opts}" } minstalldocs() { local docfiles local doc docfiles="$@" if [ ! -d ${BINDIR}/usr/share/doc/${PNAME}-${PVER} ] then install -d ${BINDIR}/usr/share/doc/${PNAME}-${PVER} || die "creating doc dirs." fi for doc in ${docfiles} do if [ -f ${doc} ] then if mqueryfeature "compressdoc" then cat ${doc} | gzip -9c > ${BINDIR}/usr/share/doc/${PNAME}-${PVER}/$(basename ${doc}).gz || die "gzipping +installing ${doc}." chmod 0644 ${BINDIR}/usr/share/doc/${PNAME}-${PVER}/$(basename ${doc}).gz || die "fixing permissions of ${doc}." else install -m 0644 ${doc} ${BINDIR}/usr/share/doc/${PNAME}-${PVER} || die "installing ${doc}." fi fi done } mstriplibs() { local stripdir="$@" [[ -z ${stripdir} ]] && stripdir="${BINDIR}" [[ -z ${STRIP_DYN_LIB} ]] && STRIP_DYN_LIB="--strip-debug" find ${stripdir} ! -type d | xargs --no-run-if-empty file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs --no-run-if-empty strip ${STRIP_DYN_LIB} 2> /dev/null } mstripbins() { local stripdir="$@" [[ -z ${stripdir} ]] && stripdir="${BINDIR}" [[ -z ${STRIP_DYN_BIN} ]] && STRIP_DYN_BIN="--strip-debug" find ${stripdir} ! -type d | xargs --no-run-if-empty file | grep "executable" | grep ELF | cut -f 1 -d : | xargs --no-run-if-empty strip ${STRIP_DYN_BIN} 2> /dev/null } mstripstatic() { local stripdir="$@" [[ -z ${stripdir} ]] && stripdir="${BINDIR}" [[ -z ${STRIP_STATIC_LIB} ]] && STRIP_STATIC_LIB="--strip-debug" find ${stripdir} ! -type d | xargs --no-run-if-empty file | grep "ar archive" | cut -f 1 -d : | xargs --no-run-if-empty strip ${STRIP_STATIC_LIB} 2> /dev/null } mstriplibtoolarchive() { local stripdir="$@" [[ -z ${stripdir} ]] && stripdir="${BINDIR}" find ${stripdir} ! -type d -name \*.la | xargs --no-run-if-empty file | grep "libtool library" | cut -f 1 -d : | xargs --no-run-if-empty rm -f -- 2> /dev/null } mpurgetargets() { local stripdir="$@" local target [[ -z ${stripdir} ]] && stripdir=${BINDIR} # nothing to do in this case [[ -z ${PURGE_TARGETS[*]} ]] && return for target in ${PURGE_TARGETS[*]} do # check if target is a regex pattern without any slashes if [[ ${target} = ${target//\/} ]] then find ${BINDIR} -type f -name "${target}" | xargs --no-run-if-empty rm -f -- 2> /dev/null else rm -f -- ${target} 2> /dev/null fi done } mcompressdocs() { local bindir="$@" if [ -d ${bindir}/usr/share/man ] then echo -e "${COLBLUE}===${COLGREEN} compressing man-pages ...${COLDEFAULT}" ${MLIBDIR}/compressdoc -g -9 ${bindir}/usr/share/man fi if [ -d ${bindir}/usr/share/info ] then echo -e "${COLBLUE}===${COLGREEN} compressing info-pages ...${COLDEFAULT}" ${MLIBDIR}/compressdoc -g -9 ${bindir}/usr/share/info fi } sminclude() { local i if [[ -n "$@" ]] then for i in $@ do echo "--- Including ${SMAGESCRIPTSDIR}/include/${i}.sminc" source ${SMAGESCRIPTSDIR}/include/${i}.sminc done echo fi } setup_distcc_environment() { if [ -x /usr/bin/distcc ] then echo -e "${COLBLUE}---${COLGREEN} Using DistCC for compilation ...${COLDEFAULT}" export PATH=/usr/$(mlibdir)/distcc/bin:${PATH} || die "distcc: could not export new $PATH" export DISTCC_DIR="${DISTCC_DIR}" || die "distcc_dir export failed" # creating distcc tempdir install -o distcc -g daemon -d ${DISTCC_DIR} chmod 1777 ${DISTCC_DIR} fi } setup_ccache_environment() { if [ -x /usr/bin/ccache ] then echo -e "${COLBLUE}---${COLGREEN} Using CCache for compilation ...${COLDEFAULT}" export PATH=/usr/$(mlibdir)/ccache/bin:${PATH} || die "ccache: could not export new $PATH" fi } # fixes given dependencies to match a MAGE_TARGET # fix_mage_deps -target s/depend # <-- note -target ! fix_mage_deps() { local target="$1" local depend="$2" local NDEPEND local sym dep cat pver pname # deps and provides are special # they must be fixed to match the target # run this only if target and depend is not empty if [ -n "${target}" ] && [ -n "${depend}" ] then # fix DEPEND while read sym dep do # ignore empty lines [[ -z ${dep} ]] && continue cat="$(dirname ${dep})" # change if not virtual if [[ ${cat} = virtual ]] then pname="$(basename ${dep})" else # fix pver to target-pver # to get pname-target-pver # doing it backwards ! pver="${dep##*-}" # full pver pname="$(basename ${dep/-${pver}/})${target}-${pver}" fi # do not add empty lines if [ -z "${NDEPEND}" ] then NDEPEND="${sym} ${cat}/${pname}" else NDEPEND="${NDEPEND} ${sym} ${cat}/${pname}" fi unset cat pname pver done << EOF ${depend} EOF # set NDEPEND to DEPEND depend="${NDEPEND}" fi echo "${depend}" } # build_mage_script(): helper functions for regen_mage_tree() # generates an mage file with given information in smage file # needs at least: # PNAME name of pkg # PVER version # PBUILD revision # PCAT category of the pkg # PCATEGORIE category of the pkg (deprecated, use PCAT!) # STATE state of pkg stable|unstable|old # DESCRIPTION a short description (opt) # HOMEPAGE homepage (opt) # LICENSE license information of the pkg (opt) # DEPEND runtime dependencies (opt) # SDEPEND adds needed deps to build the pkg (opt) # PROVIDE provides a virtual (opt) # # special tags: # PKGTYPE type of pkg # INHERITS which functions get included # SPECIAL_FUNCTIONS special functions which should also be added # warning: they get killed before the build starts ! # SPLIT_PACKAGES names of all subpackages which are splitted from parent # SPLIT_PACKAGE_BASE base package name for splitpackages # (only in the resulting magefile} # # MAGE_TREE_DEST target destination of the generated tree # REGEN_MAGE_TREE set to 'true' to enable this # # gets called with build_mage_script target build_mage_script() { local magefile local dest local target local split_pkg_base local sym local depname # if MAGE_TREE_DEST not set use BUILDDIR : ${MAGE_TREE_DEST=${BUILDDIR}/mage-tree} # determinate which suffix this mage file should get, if any [[ $1 = --target ]] && shift && target="-$1" # mark package as splitpackage [[ $1 = --split-pkg-base ]] && shift && split_pkg_base="$1" # name of magefile magefile="${PNAME}${target}-${PVER}-${PBUILD}.mage" # destination to magefile dest="${MAGE_TREE_DEST}/${PCAT}/${PNAME}${target}/${magefile}" # show what we are doing echo -e "${COLBLUE}===${COLGREEN} generating mage file:${COLDEFAULT}" echo "${dest}" install -d "$(dirname ${dest})" # now build the mage file > ${dest} # pgkname and state echo "PKGNAME=\"${PNAME}${target}-${PVER}-\${ARCH}$(print_distrotag)-${PBUILD}\"" >> ${dest} echo "STATE=\"${STATE}\"" >> ${dest} # description and homepage echo "DESCRIPTION=\"${DESCRIPTION}\"" >> ${dest} echo "HOMEPAGE=\"${HOMEPAGE}\"" >> ${dest} # license information echo "LICENSE=\"${LICENSE}\"" >> ${dest} # special tags and vars echo "PKGTYPE=\"${PKGTYPE}\"" >> ${dest} # echo MAGE_TARGETS ## note -target is needed ! echo "MAGE_TARGETS=\"${target}\"" >> ${dest} # split package base echo "SPLIT_PACKAGE_BASE=\"${split_pkg_base}\"" >> ${dest} # add special vars if [ -n "${SPECIAL_VARS}" ] then local i for i in ${SPECIAL_VARS} do # being tricky here :) echo "${i}=\"$(eval echo \$${i})\"" >> ${dest} done fi # add at least all includes if [ -n "${INHERITS}" ] then echo -n "minclude" >> ${dest} local i for i in ${INHERITS} do echo -n " ${i}" >> ${dest} done # a CRLF is needed here! echo >> ${dest} fi # deps and provides echo "DEPEND=\"$(fix_mage_deps "${target}" "${DEPEND}")\"" >> ${dest} echo "SDEPEND=\"$(fix_mage_deps "${target}" "${SDEPEND}")\"" >> ${dest} echo "PROVIDE=\"${PROVIDE}\"" >> ${dest} # add special functions if [ -n "${SPECIAL_FUNCTIONS}" ] then local i for i in ${SPECIAL_FUNCTIONS} do # add to mage (quotes needed !) typeset -f "${i}" >> ${dest} # unset to be safe (quotes needed !) #unset "${i}" <-- later to get every target built done fi # pre|post-install|removes typeset -f preinstall >> ${dest} typeset -f postinstall >> ${dest} typeset -f preremove >> ${dest} typeset -f postremove >> ${dest} } regen_mage_tree() { local subpackage # build them only if requested if mqueryfeature regentree then # run it without targets if [[ -n ${MAGE_TARGETS} ]] then # build for each target a mage file # run it with several targets echo for subpackage in ${MAGE_TARGETS} do build_mage_script --target "${subpackage}" done echo # run it for splitpackages elif [[ -n ${SPLIT_PACKAGES} ]] then local split_pkg_base="${PNAME}" # save smage environment split_save_variables # build for each subpackage a mage file # run it with several targets echo for subpackage in ${SPLIT_PACKAGES} do # get the right variables for the split export PNAME="${subpackage}" split_info_${subpackage} # fix PCATEGORIE -> PCAT if [[ ! -z ${PCATEGORIE} ]] then PCAT="${PCATEGORIE}" unset PCATEGORIE fi # get the preinstall etc split_export_inherits ${subpackage} build_mage_script --split-pkg-base "${split_pkg_base}" # delete split preinstall etc split_delete_inherits ${subpackage} # restore smage environment split_restore_variables done echo # unset all saved smage variables split_unset_variables else echo build_mage_script echo fi fi # now unset all uneeded vars to be safe # unset PKGNAME <-- don't do that; smage needs this var # unset to be safe (quotes needed !) # for i in ${SPECIAL_FUNCTIONS} # do # unset "${i}" # done unset SPECIAL_FUNCTIONS # for i in ${SPECIAL_VARS} # do # unset "${i}" # done unset SPECIAL_VARS unset STATE unset DESCRIPTION unset HOMEPAGE # unset PKGTYPE <-- don't do that either; smage needs this var unset INHERITS unset DEPEND unset SDEPEND unset PROVIDE unset preinstall unset postinstall unset preremove unset postremove } split_save_variables() { export SAVED_PNAME="${PNAME}" export SAVED_PVER="${PVER}" export SAVED_PBUILD="${PBUILD}" export SAVED_PCAT="${PCAT}" export SAVED_DESCRIPTION="${DESCRIPTION}" export SAVED_HOMEPAGE="${HOMEPAGE}" export SAVED_SPECIAL_VARS="${SPECIAL_VARS}" export SAVED_STATE="${STATE}" export SAVED_PKGTYPE="${PKGTYPE}" export SAVED_INHERITS="${INHERITS}" export SAVED_DEPEND="${DEPEND}" export SAVED_SDEPEND="${SDEPEND}" export SAVED_PROVIDE="${PROVIDE}" export SAVED_PKGTYPE="${PKGTYPE}" # special handling needed for mage features # pkgbuild mqueryfeature "pkgbuild" && export SAVED_FEATURE_PKGBUILD="pkgbuild" mqueryfeature "!pkgbuild" && export SAVED_FEATURE_PKGBUILD="!pkgbuild" # strip mqueryfeature "strip" && export SAVED_FEATURE_STRIP="strip" mqueryfeature "!strip" && export SAVED_FEATURE_STRIP="!strip" # libtool mqueryfeature "libtool" && export SAVED_FEATURE_LIBTOOL="libtool" mqueryfeature "!libtool" && export SAVED_FEATURE_LIBTOOL="!libtool" # compressdoc mqueryfeature "compressdoc" && export SAVED_FEATURE_COMPRESSDOC="compressdoc" mqueryfeature "!compressdoc" && export SAVED_FEATURE_COMPRESSDOC="!compressdoc" # bindir too export SAVED_BINDIR="${BINDIR}" # export the SPLIT_PACKAGE_BASE export SPLIT_PACKAGE_BASE="${SAVED_PNAME}" # functions if [[ ! -z $(typeset -f preinstall) ]] then # rename the old one local saved_preinstall saved_preinstall=SAVED_$(typeset -f preinstall) eval "${saved_preinstall}" export -f SAVED_preinstall fi if [[ ! -z $(typeset -f postinstall) ]] then # rename the old one local saved_postinstall saved_postinstall=SAVED_$(typeset -f postinstall) eval "${saved_postinstall}" export -f SAVED_postinstall fi if [[ ! -z $(typeset -f preremove) ]] then # rename the old one local saved_preremove saved_preremove=SAVED_$(typeset -f preremove) eval "${saved_preremove}" export -f SAVED_preremove fi if [[ ! -z $(typeset -f postremove) ]] then # rename the old one local saved_postremove saved_postremove=SAVED_$(typeset -f postremove) eval "${saved_postremove}" export -f SAVED_postremove fi } split_restore_variables() { export PNAME="${SAVED_PNAME}" export PVER="${SAVED_PVER}" export PBUILD="${SAVED_PBUILD}" export PCAT="${SAVED_PCAT}" export DESCRIPTION="${SAVED_DESCRIPTION}" export HOMEPAGE="${SAVED_HOMEPAGE}" export SPECIAL_VARS="${SAVED_SPECIAL_VARS}" export STATE="${SAVED_STATE}" export PKGTYPE="${SAVED_PKGTYPE}" export INHERITS="${SAVED_INHERITS}" export DEPEND="${SAVED_DEPEND}" export SDEPEND="${SAVED_SDEPEND}" export PROVIDE="${SAVED_PROVIDE}" export PKGTYPE="${SAVED_PKGTYPE}" # special handling needed for mage features # pkgbuild FVERBOSE=off msetfeature "${SAVED_FEATURE_PKGBUILD}" # strip FVERBOSE=off msetfeature "${SAVED_FEATURE_STRIP}" # libtool FVERBOSE=off msetfeature "${SAVED_FEATURE_LIBTOOL}" # compressdoc FVERBOSE=off msetfeature "${SAVED_FEATURE_COMPRESSDOC}" # bindir too export BINDIR="${SAVED_BINDIR}" # functions if [[ ! -z $(typeset -f SAVED_preinstall) ]] then # rename the old one local saved_preinstall saved_preinstall=$(typeset -f SAVED_preinstall) eval "${saved_preinstall/SAVED_/}" export -f preinstall fi if [[ ! -z $(typeset -f SAVED_postinstall) ]] then # rename the old one local saved_postinstall saved_postinstall=$(typeset -f SAVED_postinstall) eval "${saved_postinstall/SAVED_/}" export -f postinstall fi if [[ ! -z $(typeset -f SAVED_preremove) ]] then # rename the old one local saved_preremove saved_preremove=$(typeset -f SAVED_preremove) eval "${saved_preremove/SAVED_/}" export -f preremove fi if [[ ! -z $(typeset -f SAVED_postremove) ]] then # rename the old one local saved_postremove saved_postremove=$(typeset -f SAVED_postremove) eval "${saved_postremove/SAVED_/}" export -f postremove fi } split_unset_variables() { # unset saved vars; not needed anymore unset SAVED_PNAME unset SAVED_PVER unset SAVED_PBUILD unset SAVED_PCAT unset SAVED_DESCRIPTION unset SAVED_HOMEPAGE unset SAVED_SPECIAL_VARS unset SAVED_STATE unset SAVED_PKGTYPE unset SAVED_INHERITS unset SAVED_DEPEND unset SAVED_SDEPEND unset SAVED_PROVIDE unset SAVED_BINDIR unset SAVED_PKGTYPE unset SAVED_FEATURE_PKGBUILD unset SAVED_FEATURE_STRIP unset SAVED_FEATURE_LIBTOOL unset SAVED_FEATURE_COMPRESSDOC unset SPLIT_PACKAGE_BASE unset -f SAVED_preinstall unset -f SAVED_postinstall unset -f SAVED_preremove unset -f SAVED_postremove } split_export_inherits() { local subpackage="$1" local func local newfunc for func in preinstall postinstall preremove postremove do if [[ ! -z $(typeset -f ${func}_${subpackage}) ]] then newfunc=$(typeset -f ${func}_${subpackage}) newfunc="${newfunc/_${subpackage} (/ (}" eval "${newfunc}" fi done } split_delete_inherits() { local subpackage="$1" local func for func in preinstall postinstall preremove postremove do if [[ ! -z $(typeset -f ${func}_${subpackage}) ]] then unset -f ${func} fi done } export_inherits() { local include="$1" shift while [ "$1" ] do local functions="$1" # sanity checks [ -z "${include}" ] && die "export_inherits(): \$include not given." [ -z "${functions}" ] && die "export_inherits(): \$functions not given." eval "${functions}() { ${include}_${functions} ; }" # debug [[ ${MAGEDEBUG} = on ]] && typeset -f "${functions}" shift done } generate_package_md5sum() { local dest local pcat local pname local pver local pbuild local parch local target local pkgname # very basic getops for i in $* do case $1 in --pcat|-c) shift; pcat="$1" ;; --pname|-n) shift; pname="$1" ;; --pver|-v) shift; pver="$1" ;; --pbuild|-b) shift; pbuild="$1" ;; --parch|a) shift; parch="$1" ;; --target|t) shift; target="$1" ;; esac shift done # sanity checks; abort if not given [ -z "${pcat}" ] && die "generate_package_md5sum() \$pcat not given." [ -z "${pname}" ] && die "generate_package_md5sum() \$pname not given." [ -z "${pver}" ] && die "generate_package_md5sum() \$pver not given." [ -z "${pbuild}" ] && die "generate_package_md5sum() \$pbuild not given." [ -z "${parch}" ] && die "generate_package_md5sum() \$parch not given." # check needed global vars [ -z "${PKGDIR}" ] && die "generate_package_md5sum() \$PKGDIR not set." [ -z "${PKGSUFFIX}" ] && die "generate_package_md5sum() \$PKGSUFFIX not set." # fix target as it may be empty ! [ -n "${target}" ] && target="-${target}" # build pkgname pkgname="${pname}${target}-${pver}-${parch}$(print_distrotag)-${pbuild}" # build pkg-md5-sum only if requested if mqueryfeature regentree then echo -ne "${COLBLUE}===${COLGREEN} generating md5's for ${pkgname}.${PKGSUFFIX} ... ${COLDEFAULT}" # abort if not exist if [ ! -f ${PKGDIR}/${pkgname}.${PKGSUFFIX} ] then echo -e "${COLRED}! exists${COLDEFAULT}" return 0 fi # if MAGE_TREE_DEST not set use BUILDDIR : ${MAGE_TREE_DEST=${BUILDDIR}/mage-tree} # setup md5 dir dest="${MAGE_TREE_DEST}/${pcat}/${pname}${target}/md5" install -d ${dest} # gen md5sum ( cd ${PKGDIR}; md5sum "${pkgname}.${PKGSUFFIX}" ) \ > ${dest}/${pkgname}.md5 echo -e "${COLGREEN}done${COLDEFAULT}" fi } source_pkg_build() { if [[ ${PKGTYPE} = virtual ]] then echo "Virtual package detected; src-pkg-tarball not necessary ..." return 0 fi if [[ ! -d ${SOURCEDIR}/${PNAME} ]] then echo "No SRC_URI defined; src-pkg-tarball not necessary ..." return 0 fi [ -z "${SRCPKGDIR}" ] && die "\$SRCPKGDIR not found. Please setup your ${MAGERC} correctly." echo -e "${COLGREEN}Creating source package tarball ... ${COLDEFAULT}" # include the smage2 file cp ${SMAGENAME} ${SOURCEDIR}/${PNAME} ( cd ${SOURCEDIR}; tar cvjf ${BUILDDIR}/${PNAME}-${PVER}-${PBUILD}.tar.bz2 ${PNAME}; ) [[ ! -d ${SRCPKGDIR} ]] && install -d ${SRCPKGDIR} mv ${BUILDDIR}/${PNAME}-${PVER}-${PBUILD}.tar.bz2 ${SRCPKGDIR}/${PNAME}-${PVER}-${PBUILD}.${SRCPKGSUFFIX} echo -e "${COLGREEN}Source package ${COLBLUE}${PNAME}-${PVER}-${PBUILD}.${SRCPKGSUFFIX} ${COLGREEN}successfully builded.${COLDEFAULT}\n" } step_by_step() { if mqueryfeature stepbystep then echo -e "${COLRED}Step-by-step enabled! Paused after $1.${COLDEFAULT}" echo "Press [enter] to continue" read fi } resume_stamp() { local step="$1" [[ ! -d ${BUILDDIR}/.stamps ]] && install -d ${BUILDDIR}/.stamps touch ${BUILDDIR}/.stamps/smage-${PKGNAME}-${step} } run_resume() { local step="$1" if mqueryfeature "resume" && [[ -f ${BUILDDIR}/.stamps/smage-${PKGNAME}-${step} ]] then echo -e "${COLMAGENTA}${step} already processed; doing nothing${COLDEFAULT}" return 0 else return 1 fi }