--- trunk/mage/usr/lib/mage/smage2.sh 2006/07/17 20:44:44 384 +++ trunk/mage/usr/lib/mage/smage2.sh 2012/01/13 18:31:48 1641 @@ -1,52 +1,28 @@ #!/bin/bash +# $Id$ # compiles/installs .smage2 source install scripts # needs pkgbuild_dir (mage) -# SMAGE2 -# $Header: /home/cvsd/magellan-cvs/magellan-src/mage/usr/lib/mage/smage2.sh,v 1.43 2006-07-17 20:44:44 niro Exp $ +# TODO: record dynlib, gz | xz database -#01.10.2004 -# added ccache support -# added distcc support -## setup ## -PKGSUFFIX="mpk" -SMAGENAME="$1" -SMAGESUFFIX="smage2" -MLIBDIR=/usr/lib/mage -SMAGEVERSION="$( < ${MLIBDIR}/version)" - -## only for tests -> normally in /etc/rc.d/init.d/functions -COLRED="\033[1;6m\033[31m" -COLGREEN="\033[1;6m\033[32m" -COLYELLOW="\033[1;6m\033[33m" -COLBLUE="\033[1;6m\033[34m" -COLMAGENTA="\033[1;6m\033[35m" -COLWHITE="\033[1;6m\033[37m" -COLGRAY="\033[0;6m\033[37m" -COLBOLD="\033[1m" -COLDEFAULT="\033[0m" - -if [[ ${NOCOLORS} = true ]] -then - COLRED="" - COLGREEN="" - COLYELLOW="" - COLBLUE="" - COLMAGENTA="" - COLWHITE="" - COLGRAY="" - COLBOLD="" - COLDEFAULT="" -fi +# set default user mage.rc +: ${MAGERC="/etc/mage.rc"} # export default C locale export LC_ALL=C -source /etc/mage.rc +source /etc/mage.rc.global +source ${MAGERC} +source ${MLIBDIR}/mage4.functions.sh +source ${MLIBDIR}/smage2.functions.sh + +## setup ## +SMAGENAME="$1" +SMAGEVERSION="$(< ${MLIBDIR}/version)" -# set PKGDIR and BUILDDIR and BINDIR to MROOT +# expand PKGDIR, BUILDDIR and BINDIR with MROOT if [[ -n ${MROOT} ]] then export PKGDIR=${MROOT}/${PKGDIR} @@ -54,732 +30,20 @@ export BINDIR=${MROOT}/${BINDIR} fi -showversion() -{ - echo -en "Magellan Source Install v${SMAGEVERSION} " - echo -e "-- Niels Rogalla (niro@magellan-linux.de)" -} - -die() -{ - xtitleclean - echo "SMAGE failed: $@" - exit 1 -} - -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 \ - --recursive \ - --links \ - --perms \ - --times \ - --devices \ - --timeout=600 \ - --verbose \ - --compress \ - --progress \ - --stats \ - --delete \ - --delete-after \ - ${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 EOA=${#SRC_URI[*]} - local my_SRC_URI - local my_SRC_URI_DEST - local my_SRC_URI_MIRROR - local my_SOURCEDIR - local DB_MD5_SUM_FILE="${MD5DIR}/$(basename ${SMAGENAME} .${SMAGESUFFIX}).md5" - local FETCHING - local i mirror - - - # install SRCDIR/PNAME if not exist - [ ! -d ${SOURCEDIR}/${PNAME} ] && install -d ${SOURCEDIR}/${PNAME} - - # check if FETCHING is needed - ( cd ${SOURCEDIR}/${PNAME}; md5sum --check ${DB_MD5_SUM_FILE} &> /dev/null ) - if [[ $? = 0 ]] - then - # md5's ok, not fetching needed - FETCHING=false - else - FETCHING=true - fi - - for ((i=0; i < EOA; i++)) - do - # url to file - my_SRC_URI="$(echo ${SRC_URI[${i}]} | cut -d' ' -f1)" - - # subdir in sources dir; the my_SRCI_URI file goes to there - my_SRC_URI_DEST="$(echo ${SRC_URI[${i}]} | cut -d' ' -f2)" - - # if my_src_uri_dest is not equal my_src_uri; than an other dir is used - if [[ ${my_SRC_URI_DEST} != ${my_SRC_URI} ]] - then - my_SOURCEDIR="${SOURCEDIR}/${PNAME}/${my_SRC_URI_DEST}" - else - my_SOURCEDIR="${SOURCEDIR}/${PNAME}" - fi - - # if an mirrored file than replace first the mirror uri - if [ -n "$(echo ${my_SRC_URI} | grep 'mirror://')" ] - then - for mirror in ${MIRRORS} - do - my_SRC_URI_MIRROR="$(echo ${my_SRC_URI} | sed "s|mirror:/|${mirror}/sources|g")" - - if [[ ${FETCHING} = true ]] - then - echo "==> fetching ${my_SRC_URI_MIRROR}" - wget \ - --passive-ftp \ - --tries 3 \ - --continue \ - --progress bar \ - --directory-prefix="${my_SOURCEDIR}" \ - "${my_SRC_URI_MIRROR}" - if [[ $? = 0 ]] - then - break - else - continue - fi - fi - done - else - if [[ ${FETCHING} = true ]] - then - echo "==> fetching ${my_SRC_URI}" - wget \ - --passive-ftp \ - --tries 3 \ - --continue \ - --progress bar \ - --directory-prefix="${my_SOURCEDIR}" \ - "${my_SRC_URI}" - fi - fi - - # unset them to be shure - unset my_SRC_URI - unset my_SRC_URI_DEST - unset my_SRC_URI_MIRROR - unset my_SOURCEDIR - done - - # recheck md5 sums - echo - echo ">== Checking MD5 sums:" - ( cd ${SOURCEDIR}/${PNAME}; md5sum --check ${DB_MD5_SUM_FILE} ) || die "md5 failed" - echo - - # not needed anymore - unset SRC_URI -} - -# dummy function, used if that not exist in smage file -src_prepare() -{ - echo "no src_prepare defined" - sleep 2 - return 0 -} - -# dummy function, used if that not exist in smage file -src_compile() -{ - echo "no src_compile defined" - sleep 2 - return 0 -} - -# dummy function, used if that not exist in smage file -src_install() -{ - echo "no src_install defined" - sleep 2 - return 0 -} - -mlibdir() -{ - local libdir=lib - [[ ${ARCH} = x86_64 ]] && libdir=lib64 - - echo "${libdir}" -} - -mconfigure() -{ - if [ -x ./configure ] - then - ./configure \ - --prefix=/usr \ - --host=${CHOST} \ - --mandir=/usr/share/man \ - --infodir=/usr/share/info \ - --datadir=/usr/share \ - --sysconfdir=/etc \ - --localstatedir=/var/lib \ - --libdir=/usr/$(mlibdir) \ - "$@" || 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 - - case "${SRCFILE##*.}" in - bz2) - IFTAR="$(basename $SRCFILE .bz2)" - IFTAR="${IFTAR##*.}" - if [[ ${IFTAR} = tar ]] - then - tar --no-same-owner -xvjf ${SOURCEDIR}/${PNAME}/${SRCFILE} -C ${DEST} - fi - ;; - gz) - IFTAR="$(basename $SRCFILE .gz)" - IFTAR="${IFTAR##*.}" - if [[ ${IFTAR} = tar ]] - then - tar --no-same-owner -xvzf ${SOURCEDIR}/${PNAME}/${SRCFILE} -C ${DEST} - fi - ;; - tbz2) - tar --no-same-owner -xvjf ${SOURCEDIR}/${PNAME}/${SRCFILE} -C ${DEST} - ;; - tgz) - tar --no-same-owner -xvzf ${SOURCEDIR}/${PNAME}/${SRCFILE} -C ${DEST} - ;; - *) - die "munpack failed" - ;; - esac -} - -mpatch() -{ - local PATCHOPTS - local PATCHFILE - - PATCHOPTS=$1 - PATCHFILE=$2 - - echo -e "${COLBLUE}*** ${COLGREEN}Applying patch '${PATCHFILE}'${COLDEFAULT}" - patch "${PATCHOPTS}" -i ${SOURCEDIR}/${PNAME}/${PATCHFILE} -} - - -minstalldocs() -{ - local docfiles - docfiles="$@" - - if [ ! -d ${BINDIR}/usr/share/doc/${PNAME}-${PVER} ] - then - install -d ${BINDIR}/usr/share/doc/${PNAME}-${PVER} || die "creating doc dirs." - fi - - for i in ${docfiles} - do - cat ${i} | gzip -9c > ${i}.gz || die "gzipping docs." - install -m 0644 ${SRCDIR}/${i}.gz \ - ${BINDIR}/usr/share/doc/${PNAME}-${PVER} || die "coping docs." - done -} - -mstriplibs() -{ - local stripdir="$@" - - [ -z "${stripdir}" ] && stripdir=${BINDIR} - find ${stripdir} | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null -} - -mstripbins() -{ - local stripdir="$@" - - [ -z "${stripdir}" ] && stripdir=${BINDIR} - find ${stripdir} | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null -} - -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 "Using DistCC for compilation ..." - 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 "Using CCache for compilation ..." - 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 - 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 -# PCATEGORIE categorie of the pkg -# STATE state of pkg stable|unstable|old -# DESCRIPTION va short description (opt) -# HOMEPAGE homepage (opt) -# DEPEND runtime dependencies (opt) -# SDEPEND add. 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 wich should also be added -# warning: they get killed before the build starts ! -# -# 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 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 - [ -n "$1" ] && target="-$1" - - # name of magefile - magefile="${PNAME}${target}-${PVER}-${PBUILD}.mage" - - # destination to magefile - dest="${MAGE_TREE_DEST}/${PCATEGORIE}/${PNAME}${target}/${magefile}" - - # show what we are doing - echo "Generating Mage file:" - echo " ${dest}" - - install -d "$(dirname ${dest})" - # now build the mage file - > ${dest} - - # header - echo '# $Header: /home/cvsd/magellan-cvs/magellan-src/mage/usr/lib/mage/smage2.sh,v 1.43 2006-07-17 20:44:44 niro Exp $' >> ${dest} - echo >> ${dest} - - # pgkname and state - echo "PKGNAME=\"${PNAME}${target}-${PVER}-\${ARCH}-${PBUILD}\"" >> ${dest} - echo "STATE=\"${STATE}\"" >> ${dest} - echo >> ${dest} - - # description and homepage - echo "DESCRIPTION=\"${DESCRIPTION}\"" >> ${dest} - echo "HOMEPAGE=\"${HOMEPAGE}\"" >> ${dest} - echo >> ${dest} - - # special tags and vars - echo "PKGTYPE=\"${PKGTYPE}\"" >> ${dest} - - # echo MAGE_TARGETS ## note -target is needed ! - echo "MAGE_TARGETS=\"${target}\"" >> ${dest} - echo >> ${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 - echo >> ${dest} - 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 - echo >> ${dest} - fi - echo >> ${dest} - - # deps and provides - echo "DEPEND=\"$(fix_mage_deps "${target}" "${DEPEND}")\"" >> ${dest} - echo >> ${dest} - echo "SDEPEND=\"$(fix_mage_deps "${target}" "${SDEPEND}")\"" >> ${dest} - echo >> ${dest} - echo "PROVIDE=\"${PROVIDE}\"" >> ${dest} - echo >> ${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} - echo >> ${dest} - # unset to be safe (quotes needed !) - #unset "${i}" <-- later to get every target built - done - echo >> ${dest} - fi - - # pre|post-install|removes - typeset -f preinstall >> ${dest} - echo >> ${dest} - typeset -f postinstall >> ${dest} - echo >> ${dest} - typeset -f preremove >> ${dest} - echo >> ${dest} - typeset -f postremove >> ${dest} - echo >> ${dest} -} - -regen_mage_tree() -{ - local i - - # build them only if requested - if [[ ${REGEN_MAGE_TREE} = true ]] - then - # run it without targets - if [ -z "${MAGE_TARGETS}" ] - then - echo - build_mage_script - echo - else - - # build for each target an mage file - # run it with several targets - for i in ${MAGE_TARGETS} - do - echo - build_mage_script "${i}" - echo - done - 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 - unset INHERITS - unset DEPEND - unset SDEPEND - unset PROVIDE - unset preinstall - unset postinstall - unset preremove - unset postremove -} - -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}-${pbuild}" - - # build pkg-md5-sum only if requested - if [[ ${REGEN_MAGE_TREE} = true ]] - then - echo -n "Generating a md5sum for ${pkgname}.${PKGSUFFIX} ... " - - # abort if not exist - if [ ! -f ${PKGDIR}/${pkgname}.${PKGSUFFIX} ] - then - echo "! exists" - 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}/md5" - install -d ${dest} - - # gen md5sum - ( cd ${PKGDIR}; md5sum "${pkgname}.${PKGSUFFIX}" ) \ - > ${dest}/${pkgname}.md5 - echo "done" - fi -} - # print out our version showversion echo -if [ -z "$1" ] +if [[ -z ${SMAGENAME} ]] then echo "No .smage2 file given. Exiting." echo exit 1 fi +# load supported mage features +load_mage_features + # updating smage2-scripts if [[ $1 = update ]] then @@ -794,11 +58,13 @@ # creates md5sums for smages to given dir if [[ $1 = calcmd5 ]] then - if [ $# -ge 3 ] + if [ $# -ge 2 ] then SMAGENAME="$2" MD5DIR="$3" - source ${SMAGENAME} || die "download source failed" + [[ -z ${MD5DIR} ]] && MD5DIR="$(dirname ${SMAGENAME})/md5" + + smagesource ${SMAGENAME} || die "download source failed" # overridable sourcedir; must be declared after source of the smage2 CALC_SOURCEDIR="${CALC_SOURCEDIR:="${SOURCEDIR}/${PNAME}"}" @@ -850,7 +116,7 @@ echo else echo "Usage: Calculating MD5 Sums:" - echo " $(basename $0) calcmd5 /path/to/SMAGENAME /path/to/MD5DIR" + echo " $(basename $0) calcmd5 /path/to/SMAGENAME [/path/to/MD5DIR]" echo echo echo "Export the CALC_SOURCEDIR variable to override current SOURCEDIRs." @@ -872,7 +138,7 @@ # get smage SMAGENAME="$2" MD5DIR="$(dirname ${SMAGENAME})/md5" - source ${SMAGENAME} || die "download source failed" + smagesource ${SMAGENAME} || die "download source failed" download_sources exit 0 @@ -884,183 +150,498 @@ # set correct SMAGENAME SMAGENAME="$2" MD5DIR="$(dirname ${SMAGENAME})/md5" - source ${SMAGENAME} || die "regen: smage2 not found" + smagesource ${SMAGENAME} || die "regen: smage2 not found" regen_mage_tree - # build md5sum for existing packages - generate_package_md5sum \ - --pcat "${PCATEGORIE}" \ - --pname "${PNAME}" \ - --pver "${PVER}" \ - --pbuild "${PBUILD}" \ - --parch "${ARCH}" \ - --target "${target}" + # build several targets + if [[ -n ${MAGE_TARGETS} ]] + then + for target in ${MAGE_TARGETS} + do + # build md5sum for existing packages + generate_package_md5sum \ + --pcat "${PCAT}" \ + --pname "${PNAME}" \ + --pver "${PVER}" \ + --pbuild "${PBUILD}" \ + --parch "${ARCH}" \ + --target "${target}" + done + + # build several subpackages + elif [[ -n ${SPLIT_PACKAGES} ]] + then + split_save_variables + for subpackage in ${SPLIT_PACKAGES} + do + # get the right variables for the split + export PNAME="${subpackage}" + split_info_${subpackage} + # build md5sum for existing packages + generate_package_md5sum \ + --pcat "${PCAT}" \ + --pname "${PNAME}" \ + --pver "${PVER}" \ + --pbuild "${PBUILD}" \ + --parch "${ARCH}" + # restore smage environment + split_restore_variables + done + # unset all saved smage variables + split_unset_variables + + else + # build md5sum for existing packages + generate_package_md5sum \ + --pcat "${PCAT}" \ + --pname "${PNAME}" \ + --pver "${PVER}" \ + --pbuild "${PBUILD}" \ + --parch "${ARCH}" + fi + + exit 0 +fi +if [ "$1" == "--create-src-tarball" -a -n "$2" ] +then + # set correct SMAGENAME + SMAGENAME="$2" + MD5DIR="$(dirname ${SMAGENAME})/md5" + + echo -e "${COLGREEN}create-src-tarball called for ${COLBLUE}${SMAGENAME}${COLGREEN} ...${COLDEFAULT}" + + smagesource ${SMAGENAME} || die "regen: smage2 not found" + + if [[ -d ${SOURCEDIR}/${PNAME} ]] + then + echo -e "${COLGREEN}Deleting old sourcefiles ${COLBLUE}${SOURCEDIR}/${PNAME}${COLGREEN} ...${COLDEFAULT}" + rm -rf ${SOURCEDIR}/${PKGNAME} + fi + + download_sources + source_pkg_build ${SMAGENAME} exit 0 fi +if [ "$1" == "--src-tarball" -a -n "$2" ] || [ "$1" == "-st" -a -n "$2" ] +then + SRCPKGTARBALL="${2}" + msetfeature "srcpkgtarball" + + # abort if given file is not a source pkg + [[ ${SRCPKGTARBALL##*.} != ${SRCPKGSUFFIX} ]] && die "${SRCPKGTARBALL} is not a valid src-pkg file." + + # set correct SMAGENAME; use the one that the src_pkg provide + # /path/to/SOURCEDIR/PNAME/SMAGENAME + SMAGENAME="${SOURCEDIR}/$(basename ${SRCPKGTARBALL%-*-*})/$(basename ${SRCPKGTARBALL} .${SRCPKGSUFFIX}).${SMAGESUFFIX}" + + echo -e "${COLGREEN}Using src-tarball ${COLBLUE}${SRCPKGTARBALL}${COLGREEN} ...${COLDEFAULT}" + + [[ ! -d ${SOURCEDIR} ]] && install -d ${SOURCEDIR} + + # unpack srctarball + [[ ! -f ${SRCPKGTARBALL} ]] && die "Error: ${SRCPKGTARBALL} does not exist. Aborting." + + tar xvjf ${SRCPKGTARBALL} -C ${SOURCEDIR} || die "Error unpackung src-tarball ${SRCPKGTARBALL}" + + [[ ! -f ${SMAGENAME} ]] && die "Included smage2 file in src-tarball not found: ${SMAGENAME}" +fi + +if [ "$1" == "--resume" -a -n "$2" ] +then + msetfeature "resume" + SMAGENAME="$2" +fi + [ ! -e ${MLIBDIR}/pkgbuild_dir.sh ] && die "Error: ${MLIBDIR}/pkgbuild_dir.sh not found. Aborting." [ -z "$(basename ${SMAGENAME} | grep .${SMAGESUFFIX})" ] && die "File '$(basename ${SMAGENAME})' is not a sMage v${SMAGEVERSION} file. Aborting." -[ -z "${SOURCEDIR}" ] && die "\$SOURCEDIR not found. Please setup your mage.rc correctly." -[ -z "${SMAGESCRIPTSDIR}" ] && die "\$SMAGESCRIPTSDIR not found. Please setup your mage.rc correctly." -[ -z "${SMAGE2RSYNC}" ] && die "\$SMAGE2RSYNC not found. Please setup your mage.rc correctly." -[ -z "${BINDIR}" ] && die "no BINDIR variable found in /etc/mage.rc" -[ -z "${CHOST}" ] && die "no CHOST variable found in /etc/mage.rc" -[ -z "${CFLAGS}" ] && die "no CFLAGS variable found in /etc/mage.rc" -[ -z "${CXXFLAGS}" ] && die "no CXXFLAGS variable found in /etc/mage.rc" +[ -z "${SOURCEDIR}" ] && die "\$SOURCEDIR not found. Please setup your ${MAGERC} correctly." +[ -z "${SMAGESCRIPTSDIR}" ] && die "\$SMAGESCRIPTSDIR not found. Please setup your ${MAGERC} correctly." +[ -z "${SMAGE2RSYNC}" ] && die "\$SMAGE2RSYNC not found. Please setup your ${MAGERC} correctly." +[ -z "${BINDIR}" ] && die "no BINDIR variable found in ${MAGERC}" +[ -z "${CHOST}" ] && die "no CHOST variable found in ${MAGERC}" +[ -z "${CFLAGS}" ] && die "no CFLAGS variable found in ${MAGERC}" +[ -z "${CXXFLAGS}" ] && die "no CXXFLAGS variable found in ${MAGERC}" -source ${SMAGENAME} || die "source failed" +smagesource ${SMAGENAME} || die "source failed" PKGNAME="${PNAME}-${PVER}-${ARCH}-${PBUILD}" MD5DIR="$(dirname ${SMAGENAME})/md5" +SMAGE_LOG_CMD="tee -a /var/log/smage/${PKGNAME}.log" xtitle "Compiling ${PKGNAME}" -echo "Compiling ${PKGNAME}" +echo -e "${COLGREEN}Compiling ${PKGNAME}${COLDEFAULT}" # auto regen mage tree if requested regen_mage_tree +if mqueryfeature "srcpkgbuild" +then + if [[ -d ${SOURCEDIR}/${PNAME} ]] + then + echo -e "${COLBLUE}===${COLGREEN} deleting old sourcefiles ${COLBLUE}${SOURCEDIR}/${PNAME}${COLGREEN} ...${COLDEFAULT}" + rm -rf ${SOURCEDIR}/${PNAME} + fi +fi + # download sources -download_sources +mqueryfeature "srcpkgtarball" || download_sources # fixes some issues with these functions export -f src_prepare || die "src_prepare export failed" export -f src_compile || die "src_compile export failed" +export -f src_check || die "src_check export failed" export -f src_install || die "src_install export failed" # fixes some compile issues export CHOST="${CHOST}" || die "CHOST export failed" export CFLAGS="${CFLAGS}" || die "CFLAGS export failed" -export CXXFLAGS="${CFLAGS}" || die "CXXFLAGS export failed" +if [[ -z ${CXXFLAGS} ]] +then + export CXXFLAGS="${CFLAGS}" || die "CXXFLAGS export failed" +else + export CXXFLAGS="${CXXFLAGS}" || die "CXXFLAGS export failed" +fi +export LDFLAGS="${LDFLAGS}" || die "LDFLAGS export failed" export BINDIR="${BINDIR}" || die "BINDIR export failed" export MAKEOPTS="${MAKEOPTS}" || die "MAKEOPTS export failed" - # setup distcc # setup for distcc goes *before* ccache, so ccache comes before distcc in path -[[ ${SMAGE_USE_DISTCC} = true ]] && setup_distcc_environment +mqueryfeature "distcc" && setup_distcc_environment # setup ccache -[[ ${SMAGE_USE_CCACHE} = true ]] && setup_ccache_environment - -# small sleep to show our settings -sleep 1 +mqueryfeature "ccache" && setup_ccache_environment -# cleans up build if a previously one exists -if [ -d ${BUILDDIR} ] +if mqueryfeature "resume" then - rm -rf ${BUILDDIR}/* || die "couldn't cleanup \$BUILDDIR." -fi -install -d ${BUILDDIR} || die "couldn't create \$BUILDDIR." + echo -e "${COLMAGENTA}Resume requested; continuing previous build${COLDEFAULT}" -# cleans up srcdir if a previously unpacked one exists -if [ -d ${SRCDIR} ] -then - rm -rf ${SRCDIR} + # setup build logging + [[ ! -d /var/log/smage ]] && install -d /var/log/smage + if [[ -f /var/log/smage/${PKGNAME}.log.bz2 ]] + then + bunzip2 -f /var/log/smage/${PKGNAME}.log.bz2 + fi + echo -e "### Resume started on $(date) ###\n" >> /var/log/smage/${PKGNAME}.log + +else + # clean up builddir if a previously one exist + if [ -d ${BUILDDIR} ] + then + rm -rf ${BUILDDIR}/* || die "couldn't cleanup \$BUILDDIR." + fi + install -d ${BUILDDIR} || die "couldn't create \$BUILDDIR." + + # clean up srcdir if a previously unpacked one exist + if [ -d ${SRCDIR} ] + then + rm -rf ${SRCDIR} + fi + + # clean up bindir if a previous build exist or create a new one + if [ -d ${BINDIR} ] + then + rm -rf ${BINDIR} + fi + install -d ${BINDIR} || die "couldn't create \$BINDIR." + + # clean up package temp dir if a previous build exist + if [ -d ${BUILDDIR}/${PKGNAME} ] + then + rm -rf ${BUILDDIR}/${PKGNAME} + fi + + # clean up stamps dir + if [ -d ${BUILDDIR}/.stamps ] + then + rm -rf ${BUILDDIR}/.stamps + fi + + # setup build logging + [[ ! -d /var/log/smage ]] && install -d /var/log/smage + echo -e "### Build started on $(date) ###\n" > /var/log/smage/${PKGNAME}.log fi -# cleans up bindir if a previous build exists or creates a new one -if [ -d ${BINDIR} ] +if [[ ${PKGTYPE} = virtual ]] then - rm -rf ${BINDIR} + echo "virtual package detected; nothing will be build ..." + # automatically set !pkgbuild here too + msetfeature "!pkgbuild" +else + ( run_resume src_prepare || src_prepare ) | ${SMAGE_LOG_CMD} + die_pipestatus 0 "src_prepare failed" + resume_stamp src_prepare + step_by_step src_prepare + + ( run_resume src_compile || src_compile ) | ${SMAGE_LOG_CMD} + die_pipestatus 0 "src_compile failed" + resume_stamp src_compile + step_by_step src_compile + + # only run checks if requested + if mqueryfeature "!check" + then + echo "!check detected; src_check() will not be run!" | ${SMAGE_LOG_CMD} + else + ( run_resume src_check || src_check ) | ${SMAGE_LOG_CMD} + die_pipestatus 0 "src_check failed" + resume_stamp src_check + fi + step_by_step src_check + + # build several subpackages + if [[ -n ${SPLIT_PACKAGES} ]] + then + # save bindir & pname + split_save_variables + export SAVED_BINDIR="${BINDIR}" + for subpackage in ${SPLIT_PACKAGES} + do + if typeset -f src_install_${subpackage} > /dev/null + then + # export subpackage bindir + export BINDIR="${SAVED_BINDIR}_${subpackage}" + # export PNAME, several internal function and include + # rely on this variable + export PNAME="${subpackage}" + + echo + echo -en "${COLBLUE}*** ${COLDEFAULT}" + echo -en " Running ${COLGREEN}split src_install()${COLDEFAULT}" + echo -en " for subpkg: ${COLBLUE}${PNAME}${COLDEFAULT}" + echo -e " - basepkg: ${COLBLUE}${SPLIT_PACKAGE_BASE}${COLDEFAULT} ..." + + ( run_resume src_install_${subpackage} || src_install_${subpackage} ) | ${SMAGE_LOG_CMD} + die_pipestatus 0 "src_install_${subpackage} failed" + resume_stamp src_install_${subpackage} + step_by_step src_install_${subpackage} + fi + done + # restore bindir & pname + split_restore_variables + # unset all saved smage variables + split_unset_variables + else + ( run_resume src_install || src_install ) | ${SMAGE_LOG_CMD} + die_pipestatus 0 "src_install failed" + resume_stamp src_install + step_by_step src_install + fi fi -install -d ${BINDIR} || die "couldn't create \$BINDIR." -# cleans up package temp dir if a previous build exists -if [ -d ${BUILDDIR}/${PKGNAME} ] +# echo for sake of good-looking +echo + +if mqueryfeature "!compressdoc" then - rm -rf ${BUILDDIR}/${PKGNAME} + echo -e "!compressdoc detected; documentation will not be compressed ..." +elif mqueryfeature "!pkgbuild" +then + echo "!pkgbuild detected; skipping documentation compression..." +else + # compressing doc, info & man files + if [[ -n ${SPLIT_PACKAGES} ]] + then + for subpackage in ${SPLIT_PACKAGES} + do + run_resume post-mcompressdoc_${subpackage} || mcompressdocs ${BINDIR}_${subpackage} + resume_stamp post-mcompressdoc_${subpackage} + done + else + run_resume post-mcompressdoc || mcompressdocs ${BINDIR} + resume_stamp post-mcompressdoc + fi fi -# cleans up timestamp if one exists -if [ -f /var/tmp/timestamp ] +if mqueryfeature "!libtool" then - mage rmstamp + if mqueryfeature "!pkgbuild" + then + echo "!pkgbuild detected; skipping libtool archive stripping ..." + else + if [[ -n ${SPLIT_PACKAGES} ]] + then + for subpackage in ${SPLIT_PACKAGES} + do + echo -e "${COLBLUE}===${COLGREEN} stripping libtool archives for '${subpackage}' ...${COLDEFAULT}" + run_resume post-mstriplibtoolarchive_${subpackage} || mstriplibtoolarchive ${BINDIR}_${subpackage} + resume_stamp post-mstriplibtoolarchive_${subpackage} + done + else + echo -e "${COLBLUE}===${COLGREEN} stripping libtool archives ...${COLDEFAULT}" + run_resume post-mstriplibtoolarchive || mstriplibtoolarchive ${BINDIR} + resume_stamp post-mstriplibtoolarchive + fi + fi fi -src_prepare || die "src_prepare failed" -src_compile || die "src_compile failed" -src_install || die "src_install failed" - - -# compressing doc, info & man files -echo -e "Compressing man-pages ..." -if [ -d ${BUILDDIR}/builded/usr/share/man ] +if mqueryfeature "purge" then - ${MLIBDIR}/compressdoc -g -9 ${BUILDDIR}/builded/usr/share/man + if mqueryfeature "!pkgbuild" + then + echo "!pkgbuild detected; skipping file purgation..." + else + if [[ -n ${SPLIT_PACKAGES} ]] + then + for subpackage in ${SPLIT_PACKAGES} + do + echo -e "${COLBLUE}===${COLGREEN} purging all purge targets in '${subpackage}' ...${COLDEFAULT}" + run_resume post-mpurgetargets_${subpackage} || mpurgetargets ${BINDIR}_${subpackage} + resume_stamp post-mpurgetargets_${subpackage} + done + else + echo -e "${COLBLUE}===${COLGREEN} purging all purge targets ...${COLDEFAULT}" + run_resume post-mpurgetargets || mpurgetargets ${BINDIR} + resume_stamp post-mpurgetargets + fi + fi fi -echo -e "Compressing info-pages ..." -if [ -d ${BUILDDIR}/builded/usr/share/info ] +# stripping all bins and libs +if mqueryfeature "!strip" then - ${MLIBDIR}/compressdoc -g -9 ${BUILDDIR}/builded/usr/share/info + echo -e "!strip detected; Package will not be stripped ..." +elif mqueryfeature "!pkgbuild" +then + echo "!pkgbuild detected; skipping stripping of the package ..." +else + if [[ -n ${SPLIT_PACKAGES} ]] + then + for subpackage in ${SPLIT_PACKAGES} + do + echo -e "${COLBLUE}===${COLGREEN} stripping binaries for '${subpackage}' ...${COLDEFAULT}" + run_resume post-mstripbins_${subpackage} || mstripbins ${BINDIR}_${subpackage} + resume_stamp post-mstripbins_${subpackage} + echo -e "${COLBLUE}===${COLGREEN} stripping dynamic libraries for '${subpackage}' ...${COLDEFAULT}" + run_resume post-mstriplibs_${subpackage} || mstriplibs ${BINDIR}_${subpackage} + resume_stamp post-mstriplibs_${subpackage} + echo -e "${COLBLUE}===${COLGREEN} stripping static libraries for '${subpackage}' ...${COLDEFAULT}" + run_resume post-mstripstatic_${subpackage} || mstripstatic ${BINDIR}_${subpackage} + resume_stamp post-mstripstatic_${subpackage} + done + else + echo -e "${COLBLUE}===${COLGREEN} stripping binaries ...${COLDEFAULT}" + run_resume post-mstripbins || mstripbins ${BINDIR} + resume_stamp post-mstripbins + echo -e "${COLBLUE}===${COLGREEN} stripping dynamic libraries ...${COLDEFAULT}" + run_resume post-mstriplibs || mstriplibs ${BINDIR} + resume_stamp post-mstriplibs + echo -e "${COLBLUE}===${COLGREEN} stripping static libraries ...${COLDEFAULT}" + run_resume post-mstripstatic || mstripstatic ${BINDIR} + resume_stamp post-mstripstatic + fi fi -# stripping all bins and libs -case ${NOSTRIP} in - true|TRUE|yes|y) - echo -e "NOSTRIP=true detected; Package will not be stripped ..." - ;; - *) - echo -e "Stripping binaries ..." - mstripbins ${BINDIR} - echo -e "Stripping libraries ..." - mstriplibs ${BINDIR} - ;; -esac - -# the new buildpkg command -case ${NOPKGBUILD} in - true|TRUE|yes|y) - echo -e "NOPGKBUILD=true detected; Package will not be build ..." - ;; - *) +if mqueryfeature "!pkgbuild" +then + echo -e "!pkgbuild detected; Package will not be build ..." +else # build several targets - if [ -n "${MAGE_TARGETS}" ] + if [[ -n ${MAGE_TARGETS} ]] then for target in ${MAGE_TARGETS} do - # check if an special target_pkgbuild exists + # check if a special target_pkgbuild exists if typeset -f ${target}_pkgbuild > /dev/null then # run it - ${target}_pkgbuild + run_resume post-${target}_pkgbuild || ${target}_pkgbuild + resume_stamp post-${target}_pkgbuild fi # now create the target package - ${MLIBDIR}/pkgbuild_dir.sh \ + run_resume post-pkg_builddir_${target} || ${MLIBDIR}/pkgbuild_dir.sh \ "${PNAME}-${target}-${PVER}-${ARCH}-${PBUILD}" \ ${BINDIR} || die "target: ${target} package-build failed" + resume_stamp post-pkg_builddir_${target} # build pkg-md5-sum if requested - generate_package_md5sum \ - --pcat "${PCATEGORIE}" \ + run_resume post-md5sum_${target} || generate_package_md5sum \ + --pcat "${PCAT}" \ --pname "${PNAME}" \ --pver "${PVER}" \ --pbuild "${PBUILD}" \ --parch "${ARCH}" \ --target "${target}" + resume_stamp post-md5sum_${target} + + echo -e "${COLGREEN}\nPackage ${PNAME}-${target}-${PVER}-${ARCH}-${PBUILD} successfully builded.\n${COLDEFAULT}" + done + + # build several subpackages + elif [[ -n ${SPLIT_PACKAGES} ]] + then + split_save_variables + for subpackage in ${SPLIT_PACKAGES} + do + # get the right variables for the split + export PNAME="${subpackage}" + split_info_${PNAME} + + # jump to next one if !pkgbuild is set in split_info + mqueryfeature "!pkgbuild" && continue + + # check if an special subpackage_pkgbuild exists + if typeset -f ${PNAME}_pkgbuild > /dev/null + then + # run it + run_resume post-${PNAME}_pkgbuild || ${PNAME}_pkgbuild + resume_stamp post-${PNAME}_pkgbuild + fi + # now create the target package + run_resume post-pkg_builddir_${PNAME} || ${MLIBDIR}/pkgbuild_dir.sh \ + "${PNAME}-${PVER}-${ARCH}-${PBUILD}" \ + "${BINDIR}_${PNAME}" || die "split_package: ${PNAME} package-build failed" + resume_stamp post-pkg_builddir_${PNAME} + + # build pkg-md5-sum if requested + run_resume post-md5sum_${PNAME} || generate_package_md5sum \ + --pcat "${PCAT}" \ + --pname "${PNAME}" \ + --pver "${PVER}" \ + --pbuild "${PBUILD}" \ + --parch "${ARCH}" + resume_stamp post-md5sum_${PNAME} - echo -e "\nPackage ${PNAME}-${target}-${PVER}-${ARCH}-${PBUILD} successfully builded.\n" + echo -e "${COLGREEN}\nPackage ${PNAME}-${PVER}-${ARCH}-${PBUILD} successfully builded.\n${COLDEFAULT}" + + # restore smage environment + split_restore_variables done + # unset all saved smage variables + split_unset_variables + else - ${MLIBDIR}/pkgbuild_dir.sh ${PKGNAME} ${BINDIR} || die "package-build failed" + run_resume post-pkg_builddir || ${MLIBDIR}/pkgbuild_dir.sh ${PKGNAME} ${BINDIR} || die "package-build failed" + resume_stamp post-pkg_builddir # build pkg-md5-sum if requested - generate_package_md5sum \ - --pcat "${PCATEGORIE}" \ + run_resume post-md5sum || generate_package_md5sum \ + --pcat "${PCAT}" \ --pname "${PNAME}" \ --pver "${PVER}" \ --pbuild "${PBUILD}" \ --parch "${ARCH}" + resume_stamp post-md5sum - echo -e "\nPackage ${PKGNAME} successfully builded.\n" + echo -e "${COLGREEN}\nPackage ${PKGNAME} successfully builded.\n${COLDEFAULT}" fi - ;; -esac -# for sure -unset NOPKGBUILD -unset NOSTRIP + # build src-pkg-tarball if requested + if mqueryfeature "srcpkgbuild" + then + run_resume post-srcpkgbuild || source_pkg_build ${SMAGENAME} + resume_stamp post-srcpkgbuild + fi +fi + +if mqueryfeature "buildlog" +then + bzip2 -9f /var/log/smage/${PKGNAME}.log +else + [[ -f /var/log/smage/${PKGNAME}.log ]] && rm /var/log/smage/${PKGNAME}.log +fi xtitleclean