Magellan Linux

Annotation of /trunk/mage/usr/lib/mage/smage2.functions.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1640 - (hide annotations) (download) (as text)
Fri Jan 13 18:29:52 2012 UTC (12 years, 4 months ago) by niro
File MIME type: application/x-sh
File size: 27241 byte(s)
-split of smage2-functions into an extra include
1 niro 1640 #!/bin/bash
2     # smage2 releated functions
3     # $Id$
4    
5     # sources the smage file and uses state from distribution file if exist
6     # may helpful for repository support later on
7     smagesource()
8     {
9     local file="$1"
10     local mystate
11     local mycodename
12    
13     source ${file}
14    
15     [[ -n ${STATE} ]] && mystate="${STATE}"
16    
17     # do not overide if local state was broken or disabled!
18     case ${STATE} in
19     broken) return ;;
20     disabled) return ;;
21     esac
22    
23     if [ -f ${SMAGESCRIPTSDIR}/distribution ]
24     then
25     source ${SMAGESCRIPTSDIR}/distribution
26     [[ -n ${STATE} ]] && mystate="${STATE}"
27     fi
28     # now switch state and export it
29     STATE="${mystate}"
30     }
31    
32     showversion()
33     {
34     echo -en "Magellan Source Install v${SMAGEVERSION} "
35     echo -e "-- Niels Rogalla (niro@magellan-linux.de)"
36     }
37    
38     die()
39     {
40     xtitleclean
41     echo -e ${COLRED}"Exited ${BASH_SOURCE} at line no ${BASH_LINENO}."${COLDEFAULT}
42     echo "SMAGE failed: $@"
43     exit 1
44     }
45    
46     die_pipestatus()
47     {
48     # the status change if we do any parameter declarations!!
49     # dont do this anymore, keep this in mind!
50     #
51     # local pos="$1"
52     # local comment="$2"
53     #
54     # [ ${PIPESTATUS[${pos}]} -ne 0 ] && die "${comment}"
55     #
56     [ ${PIPESTATUS[$1]} -ne 0 ] && die "$2"
57     }
58    
59     xtitle()
60     {
61     if [[ ${TERM} = xterm ]]
62     then
63     echo -ne "\033]0;[sMage: $@]\007"
64     fi
65     return 0
66     }
67    
68     xtitleclean()
69     {
70     if [[ ${TERM} = xterm ]]
71     then
72     echo -ne "\033]0;\007"
73     fi
74     return 0
75     }
76    
77     syncsmage2()
78     {
79     xtitle "Updating smage2-script tree ..."
80     local i
81     for i in ${SMAGE2RSYNC}
82     do
83     rsync ${RSYNC_FETCH_OPTIONS} ${i} ${SMAGESCRIPTSDIR}
84     if [[ $? = 0 ]]
85     then
86     break
87     else
88     continue
89     fi
90     done
91    
92     # clean up backup files (foo~)
93     find ${SMAGESCRIPTSDIR} -name *~ -exec rm '{}' ';'
94    
95     xtitleclean
96     }
97    
98     # $1 filename
99     get_db_md5_sum()
100     {
101     local DB_FILE
102     local MD5_FILE
103     local i
104    
105     DB_ENTRY="$(basename $1)"
106     MD5_FILE="${MD5DIR}/$(basename ${SMAGENAME} ${SMAGESUFFIX})"
107    
108     i="$(cat ${MD5_FILE}| grep ${DB_ENTRY} | cut -d' ' -f1)"
109    
110     echo "${i}"
111     }
112    
113     download_sources()
114     {
115     [ -z "${SRC_URI}" ] && echo -e "\nNothing declared to download.\n" && return 0
116    
117     local count=${#SRC_URI[*]}
118     local uri
119     local subdir
120     local outputdir
121     local db_md5_file="${MD5DIR}/$(basename ${SMAGENAME} .${SMAGESUFFIX}).md5"
122     local fetching
123     local i
124    
125     # check if FETCHING is needed
126     if mchecksum --rundir "${SOURCEDIR}/${PNAME}" --file "${db_md5_file}" --method md5
127     then
128     # md5's ok, no fetching needed
129     fetching=false
130     else
131     fetching=true
132     fi
133    
134     if [[ ${fetching} = true ]]
135     then
136     for ((i=0; i < count; i++))
137     do
138     # url to file
139     uri="${SRC_URI[${i}]%%' '*}"
140    
141     # subdir in sources dir; the my_SRCI_URI file goes to there
142     subdir="${SRC_URI[${i}]##*' '}"
143    
144     # if $subdir is not equal with $uri then an other dir is used
145     if [[ ${uri} != ${subdir} ]]
146     then
147     outputdir="${SOURCEDIR}/${PNAME}/${subdir}"
148     else
149     outputdir="${SOURCEDIR}/${PNAME}"
150     fi
151    
152     echo -e "${COLBLUE}==>${COLGREEN} fetching ${uri}${COLDEFAULT}"
153     # always use verbose mode for source downloads
154     FVERBOSE=off msetfeature "verbose"
155     # do not die here, mchecksum catches download errors
156     mdownload --uri "${uri}" --dir "${outputdir}"
157    
158     # unset them to be sure
159     unset uri
160     unset subdir
161     unset outputdir
162     done
163    
164     # recheck md5 sums after download
165     echo
166     echo -e "${COLBLUE}===${COLGREEN} Checking MD5 sums:${COLDEFAULT}"
167     mchecksum --rundir "${SOURCEDIR}/${PNAME}" --file "${db_md5_file}" --method md5 || die "md5 failed"
168     echo
169     else
170     echo -e "${COLBLUE}===${COLGREEN} All sources already fetched, nothing to do${COLDEFAULT}"
171     fi
172    
173     # not needed anymore
174     unset SRC_URI
175     }
176    
177     # dummy function, used if that does not exist in smage file
178     src_prepare()
179     {
180     echo "no src_prepare defined; doing nothing ..."
181     return 0
182     }
183    
184     # dummy function, used if that does not exist in smage file
185     src_compile()
186     {
187     echo "no src_compile defined; doing nothing ..."
188     return 0
189     }
190    
191     # dummy function, used if that does not exist in smage file
192     src_check()
193     {
194     echo "no src_check defined; doing nothing ..."
195     return 0
196     }
197    
198     # dummy function, used if that does not exist in smage file
199     src_install()
200     {
201     echo "no src_install defined; doing nothing ..."
202     return 0
203     }
204    
205     mlibdir()
206     {
207     local libdir=lib
208     [[ ${ARCH} = x86_64 ]] && libdir=lib64
209    
210     echo "${libdir}"
211     }
212    
213     mconfigure()
214     {
215     local myopts
216     if [[ ! -z ${CTARGET} ]]
217     then
218     myopts+=" --target=${CTARGET}"
219     fi
220    
221     if [ -x ./configure ]
222     then
223     # if requested disable-static
224     if [[ ! -z $(./configure --help | grep -- '--.*able-static') ]]
225     then
226     if mqueryfeature '!static'
227     then
228     myopts+=" --disable-static"
229     else
230     myopts+=" --enable-static"
231     fi
232     fi
233    
234     # always enable shared by default
235     if [[ ! -z $(./configure --help | grep -- '--.*able-shared') ]]
236     then
237     myopts+=" --enable-shared"
238     fi
239    
240     ./configure \
241     --prefix=/usr \
242     --host=${CHOST} \
243     --build=${CHOST} \
244     --mandir=/usr/share/man \
245     --infodir=/usr/share/info \
246     --datadir=/usr/share \
247     --sysconfdir=/etc \
248     --localstatedir=/var/lib \
249     --libdir=/usr/$(mlibdir) \
250     ${myopts} \
251     "$@" || die "mconfigure failed"
252     else
253     echo "configure is not an executable ..."
254     exit 1
255     fi
256     }
257    
258     minstall()
259     {
260     if [ -f ./[mM]akefile -o -f ./GNUmakefile ]
261     then
262     make prefix=${BINDIR}/usr \
263     datadir=${BINDIR}/usr/share \
264     infodir=${BINDIR}/usr/share/info \
265     localstatedir=${BINDIR}/var/lib \
266     mandir=${BINDIR}/usr/share/man \
267     sysconfdir=${BINDIR}/etc \
268     libdir=${BINDIR}/usr/$(mlibdir) \
269     "$@" install || die "minstall failed"
270     else
271     die "no Makefile found"
272     fi
273     }
274    
275     mmake()
276     {
277     make ${MAKEOPTS} ${EXTRA_EMAKE} "$@"
278     }
279    
280     munpack()
281     {
282     local SRCFILE
283     local IFTAR
284     local DEST
285    
286     SRCFILE=$1
287    
288     if [[ -z $2 ]]
289     then
290     DEST=${BUILDDIR}
291     else
292     DEST=$2
293     fi
294    
295     [[ ! -d ${DEST} ]] && install -d ${DEST}
296    
297     case "${SRCFILE##*.}" in
298     bz2)
299     IFTAR="$(basename $SRCFILE .bz2)"
300     IFTAR="${IFTAR##*.}"
301     if [[ ${IFTAR} = tar ]]
302     then
303     tar --no-same-owner -xvjf ${SOURCEDIR}/${PNAME}/${SRCFILE} -C ${DEST} || die ".tar.bz2 unpack failed."
304     else
305     pushd ${DEST} > /dev/null
306     bzcat ${SOURCEDIR}/${PNAME}/${SRCFILE} > ${DEST}/$(basename ${SRCFILE} .bz2) || die ".bz2 unpack failed."
307     popd > /dev/null
308     fi
309     ;;
310     gz)
311     IFTAR="$(basename $SRCFILE .gz)"
312     IFTAR="${IFTAR##*.}"
313     if [[ ${IFTAR} = tar ]]
314     then
315     tar --no-same-owner -xvzf ${SOURCEDIR}/${PNAME}/${SRCFILE} -C ${DEST} || die ".tar.gz unpack failed."
316     else
317     pushd ${DEST} > /dev/null
318     zcat ${SOURCEDIR}/${PNAME}/${SRCFILE} > ${DEST}/$(basename ${SRCFILE} .gz) || die ".gz unpack failed."
319     popd > /dev/null
320     fi
321     ;;
322     xz)
323     IFTAR="$(basename $SRCFILE .xz)"
324     IFTAR="${IFTAR##*.}"
325     if [[ ${IFTAR} = tar ]]
326     then
327     tar --no-same-owner -xvJf ${SOURCEDIR}/${PNAME}/${SRCFILE} -C ${DEST} || die ".tar.xz unpack failed."
328     else
329     pushd ${DEST} > /dev/null
330     xzcat ${SOURCEDIR}/${PNAME}/${SRCFILE} > ${DEST}/$(basename ${SRCFILE} .xz) || die ".xz unpack failed."
331     popd > /dev/null
332     fi
333     ;;
334     tbz2|mpks|mpk)
335     tar --no-same-owner -xvjf ${SOURCEDIR}/${PNAME}/${SRCFILE} -C ${DEST} || die ".tbz2 unpack failed."
336     ;;
337     tgz)
338     tar --no-same-owner -xvzf ${SOURCEDIR}/${PNAME}/${SRCFILE} -C ${DEST} || die ".tgz unpack failed."
339     ;;
340     txz|mpkzs|mpkz)
341     tar --no-same-owner -xvJf ${SOURCEDIR}/${PNAME}/${SRCFILE} -C ${DEST} || die ".txz unpack failed."
342     ;;
343     rar)
344     unrar x ${SOURCEDIR}/${PNAME}/${SRCFILE} ${DEST} || die ".rar unpack failed."
345     ;;
346     zip|xpi|jar)
347     unzip ${SOURCEDIR}/${PNAME}/${SRCFILE} -d ${DEST} || die ".zip unpack failed."
348     ;;
349     rpm)
350     pushd ${DEST} > /dev/null
351     rpm2targz ${SOURCEDIR}/${PNAME}/${SRCFILE} || die "rpm2targz: .rpm unpack failed."
352     tar --no-same-owner -xvzf ${SRCFILE/.rpm/.tar.gz} || die "tar: .rpm unpack failed."
353     if [[ -f ${DEST}/${SRCFILE/.rpm/.tar.gz} ]]
354     then
355     rm ${DEST}/${SRCFILE/.rpm/.tar.gz}
356     fi
357     ;;
358     *)
359     die "munpack failed"
360     ;;
361     esac
362     }
363    
364     mpatch()
365     {
366     local PATCHOPTS
367     local PATCHFILE
368     local i
369    
370     PATCHOPTS=$1
371     PATCHFILE=$2
372    
373     if [[ -z $2 ]]
374     then
375     PATCHFILE=$1
376    
377     ## patch level auto-detection, get patch level
378     for ((i=0; i < 10; i++))
379     do
380     patch --dry-run -Np${i} -i ${SOURCEDIR}/${PNAME}/${PATCHFILE} > /dev/null
381     if [[ $? = 0 ]]
382     then
383     PATCHOPTS="-Np${i}"
384     break
385     fi
386     done
387     fi
388    
389     echo -e "${COLBLUE}*** ${COLGREEN}Applying patch '${PATCHFILE}'${COLDEFAULT}"
390     patch "${PATCHOPTS}" -i ${SOURCEDIR}/${PNAME}/${PATCHFILE}
391     }
392    
393     mlibtoolize()
394     {
395     local opts="$@"
396     [[ -z ${opts} ]] && opts="--verbose --install --force"
397    
398     libtoolize ${opts} || die "running: mlibtoolize ${opts}"
399     }
400    
401     mautoreconf()
402     {
403     local opts="$@"
404     [[ -z ${opts} ]] && opts="--verbose --install --force"
405    
406     autoreconf ${opts} || die "running: mautoreconf ${opts}"
407     }
408    
409     minstalldocs()
410     {
411     local docfiles
412     local doc
413     docfiles="$@"
414    
415     if [ ! -d ${BINDIR}/usr/share/doc/${PNAME}-${PVER} ]
416     then
417     install -d ${BINDIR}/usr/share/doc/${PNAME}-${PVER} || die "creating doc dirs."
418     fi
419    
420     for doc in ${docfiles}
421     do
422     if [ -f ${doc} ]
423     then
424     if mqueryfeature "compressdoc"
425     then
426     cat ${doc} | gzip -9c > ${BINDIR}/usr/share/doc/${PNAME}-${PVER}/$(basename ${doc}).gz || die "gzipping +installing ${doc}."
427     chmod 0644 ${BINDIR}/usr/share/doc/${PNAME}-${PVER}/$(basename ${doc}).gz || die "fixing permissions of ${doc}."
428     else
429     install -m 0644 ${doc} ${BINDIR}/usr/share/doc/${PNAME}-${PVER} || die "installing ${doc}."
430     fi
431     fi
432     done
433     }
434    
435     mstriplibs()
436     {
437     local stripdir="$@"
438    
439     [[ -z ${stripdir} ]] && stripdir="${BINDIR}"
440     [[ -z ${STRIP_DYN_LIB} ]] && STRIP_DYN_LIB="--strip-debug"
441     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
442     }
443    
444     mstripbins()
445     {
446     local stripdir="$@"
447    
448     [[ -z ${stripdir} ]] && stripdir="${BINDIR}"
449     [[ -z ${STRIP_DYN_BIN} ]] && STRIP_DYN_BIN="--strip-debug"
450     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
451     }
452    
453     mstripstatic()
454     {
455     local stripdir="$@"
456    
457     [[ -z ${stripdir} ]] && stripdir="${BINDIR}"
458     [[ -z ${STRIP_STATIC_LIB} ]] && STRIP_STATIC_LIB="--strip-debug"
459     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
460     }
461    
462     mstriplibtoolarchive()
463     {
464     local stripdir="$@"
465    
466     [[ -z ${stripdir} ]] && stripdir="${BINDIR}"
467     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
468     }
469    
470     mpurgetargets()
471     {
472     local stripdir="$@"
473     local target
474    
475     [[ -z ${stripdir} ]] && stripdir=${BINDIR}
476     # nothing to do in this case
477     [[ -z ${PURGE_TARGETS[*]} ]] && return
478    
479     for target in ${PURGE_TARGETS[*]}
480     do
481     # check if target is a regex pattern without any slashes
482     if [[ ${target} = ${target//\/} ]]
483     then
484     find ${BINDIR} -type f -name "${target}" | xargs --no-run-if-empty rm -f -- 2> /dev/null
485     else
486     rm -f -- ${target} 2> /dev/null
487     fi
488     done
489     }
490    
491     mcompressdocs()
492     {
493     local bindir="$@"
494    
495     if [ -d ${bindir}/usr/share/man ]
496     then
497     echo -e "${COLBLUE}===${COLGREEN} compressing man-pages ...${COLDEFAULT}"
498     ${MLIBDIR}/compressdoc -g -9 ${bindir}/usr/share/man
499     fi
500    
501     if [ -d ${bindir}/usr/share/info ]
502     then
503     echo -e "${COLBLUE}===${COLGREEN} compressing info-pages ...${COLDEFAULT}"
504     ${MLIBDIR}/compressdoc -g -9 ${bindir}/usr/share/info
505     fi
506     }
507    
508     sminclude()
509     {
510     local i
511    
512     if [[ -n "$@" ]]
513     then
514     for i in $@
515     do
516     echo "--- Including ${SMAGESCRIPTSDIR}/include/${i}.sminc"
517     source ${SMAGESCRIPTSDIR}/include/${i}.sminc
518     done
519     echo
520     fi
521     }
522    
523     setup_distcc_environment()
524     {
525     if [ -x /usr/bin/distcc ]
526     then
527     echo -e "${COLBLUE}---${COLGREEN} Using DistCC for compilation ...${COLDEFAULT}"
528     export PATH=/usr/$(mlibdir)/distcc/bin:${PATH} || die "distcc: could not export new $PATH"
529    
530     export DISTCC_DIR="${DISTCC_DIR}" || die "distcc_dir export failed"
531    
532     # creating distcc tempdir
533     install -o distcc -g daemon -d ${DISTCC_DIR}
534     chmod 1777 ${DISTCC_DIR}
535     fi
536     }
537    
538     setup_ccache_environment()
539     {
540     if [ -x /usr/bin/ccache ]
541     then
542     echo -e "${COLBLUE}---${COLGREEN} Using CCache for compilation ...${COLDEFAULT}"
543     export PATH=/usr/$(mlibdir)/ccache/bin:${PATH} || die "ccache: could not export new $PATH"
544     fi
545     }
546    
547     # fixes given dependencies to match a MAGE_TARGET
548     # fix_mage_deps -target s/depend # <-- note -target !
549     fix_mage_deps()
550     {
551     local target="$1"
552     local depend="$2"
553     local NDEPEND
554     local sym dep cat pver pname
555    
556     # deps and provides are special
557     # they must be fixed to match the target
558    
559     # run this only if target and depend is not empty
560     if [ -n "${target}" ] && [ -n "${depend}" ]
561     then
562     # fix DEPEND
563     while read sym dep
564     do
565     # ignore empty lines
566     [[ -z ${dep} ]] && continue
567    
568     cat="$(dirname ${dep})"
569     # change if not virtual
570     if [[ ${cat} = virtual ]]
571     then
572     pname="$(basename ${dep})"
573     else
574     # fix pver to target-pver
575     # to get pname-target-pver
576    
577     # doing it backwards !
578     pver="${dep##*-}"
579     # full pver
580     pname="$(basename ${dep/-${pver}/})${target}-${pver}"
581     fi
582    
583     # do not add empty lines
584     if [ -z "${NDEPEND}" ]
585     then
586     NDEPEND="${sym} ${cat}/${pname}"
587     else
588     NDEPEND="${NDEPEND}
589     ${sym} ${cat}/${pname}"
590     fi
591    
592     unset cat pname pver
593     done << EOF
594     ${depend}
595     EOF
596     # set NDEPEND to DEPEND
597     depend="${NDEPEND}"
598     fi
599    
600     echo "${depend}"
601     }
602    
603     # build_mage_script(): helper functions for regen_mage_tree()
604     # generates an mage file with given information in smage file
605     # needs at least:
606     # PNAME name of pkg
607     # PVER version
608     # PBUILD revision
609     # PCATEGORIE category of the pkg
610     # STATE state of pkg stable|unstable|old
611     # DESCRIPTION a short description (opt)
612     # HOMEPAGE homepage (opt)
613     # DEPEND runtime dependencies (opt)
614     # SDEPEND adds needed deps to build the pkg (opt)
615     # PROVIDE provides a virtual (opt)
616     #
617     # special tags:
618     # PKGTYPE type of pkg
619     # INHERITS which functions get included
620     # SPECIAL_FUNCTIONS special functions which should also be added
621     # warning: they get killed before the build starts !
622     # SPLIT_PACKAGES names of all subpackages which are splitted from parent
623     # SPLIT_PACKAGE_BASE base package name for splitpackages
624     # (only in the resulting magefile}
625     #
626     # MAGE_TREE_DEST target destination of the generated tree
627     # REGEN_MAGE_TREE set to 'true' to enable this
628     #
629     # gets called with build_mage_script target
630     build_mage_script()
631     {
632     local magefile
633     local dest
634     local target
635     local split_pkg_base
636     local sym
637     local depname
638    
639     # if MAGE_TREE_DEST not set use BUILDDIR
640     : ${MAGE_TREE_DEST=${BUILDDIR}/mage-tree}
641    
642     # determinate which suffix this mage file should get, if any
643     [[ $1 = --target ]] && shift && target="-$1"
644    
645     # mark package as splitpackage
646     [[ $1 = --split-pkg-base ]] && shift && split_pkg_base="$1"
647    
648     # name of magefile
649     magefile="${PNAME}${target}-${PVER}-${PBUILD}.mage"
650    
651     # destination to magefile
652     dest="${MAGE_TREE_DEST}/${PCATEGORIE}/${PNAME}${target}/${magefile}"
653    
654     # show what we are doing
655     echo -e "${COLBLUE}===${COLGREEN} generating mage file:${COLDEFAULT}"
656     echo "${dest}"
657    
658     install -d "$(dirname ${dest})"
659     # now build the mage file
660     > ${dest}
661    
662     # pgkname and state
663     echo "PKGNAME=\"${PNAME}${target}-${PVER}-\${ARCH}-${PBUILD}\"" >> ${dest}
664     echo "STATE=\"${STATE}\"" >> ${dest}
665    
666     # description and homepage
667     echo "DESCRIPTION=\"${DESCRIPTION}\"" >> ${dest}
668     echo "HOMEPAGE=\"${HOMEPAGE}\"" >> ${dest}
669    
670     # special tags and vars
671     echo "PKGTYPE=\"${PKGTYPE}\"" >> ${dest}
672    
673     # echo MAGE_TARGETS ## note -target is needed !
674     echo "MAGE_TARGETS=\"${target}\"" >> ${dest}
675    
676     # split package base
677     echo "SPLIT_PACKAGE_BASE=\"${split_pkg_base}\"" >> ${dest}
678    
679     # add special vars
680     if [ -n "${SPECIAL_VARS}" ]
681     then
682     local i
683     for i in ${SPECIAL_VARS}
684     do
685     # being tricky here :)
686     echo "${i}=\"$(eval echo \$${i})\"" >> ${dest}
687     done
688     fi
689    
690     # add at least all includes
691     if [ -n "${INHERITS}" ]
692     then
693     echo -n "minclude" >> ${dest}
694     local i
695     for i in ${INHERITS}
696     do
697     echo -n " ${i}" >> ${dest}
698     done
699     # a CRLF is needed here!
700     echo >> ${dest}
701     fi
702    
703     # deps and provides
704     echo "DEPEND=\"$(fix_mage_deps "${target}" "${DEPEND}")\"" >> ${dest}
705     echo "SDEPEND=\"$(fix_mage_deps "${target}" "${SDEPEND}")\"" >> ${dest}
706     echo "PROVIDE=\"${PROVIDE}\"" >> ${dest}
707    
708     # add special functions
709     if [ -n "${SPECIAL_FUNCTIONS}" ]
710     then
711     local i
712     for i in ${SPECIAL_FUNCTIONS}
713     do
714     # add to mage (quotes needed !)
715     typeset -f "${i}" >> ${dest}
716     # unset to be safe (quotes needed !)
717     #unset "${i}" <-- later to get every target built
718     done
719     fi
720    
721     # pre|post-install|removes
722     typeset -f preinstall >> ${dest}
723     typeset -f postinstall >> ${dest}
724     typeset -f preremove >> ${dest}
725     typeset -f postremove >> ${dest}
726     }
727    
728     regen_mage_tree()
729     {
730     local subpackage
731    
732     # build them only if requested
733     if mqueryfeature regentree
734     then
735     # run it without targets
736     if [[ -n ${MAGE_TARGETS} ]]
737     then
738     # build for each target a mage file
739     # run it with several targets
740     echo
741     for subpackage in ${MAGE_TARGETS}
742     do
743     build_mage_script --target "${subpackage}"
744     done
745     echo
746    
747     # run it for splitpackages
748     elif [[ -n ${SPLIT_PACKAGES} ]]
749     then
750     local split_pkg_base="${PNAME}"
751     # save smage environment
752     split_save_variables
753     # build for each subpackage a mage file
754     # run it with several targets
755     echo
756     for subpackage in ${SPLIT_PACKAGES}
757     do
758     # get the right variables for the split
759     export PNAME="${subpackage}"
760     split_info_${subpackage}
761     # get the preinstall etc
762     split_export_inherits ${subpackage}
763     build_mage_script --split-pkg-base "${split_pkg_base}"
764     # delete split preinstall etc
765     split_delete_inherits ${subpackage}
766     # restore smage environment
767     split_restore_variables
768     done
769     echo
770     # unset all saved smage variables
771     split_unset_variables
772    
773     else
774     echo
775     build_mage_script
776     echo
777     fi
778     fi
779    
780     # now unset all uneeded vars to be safe
781     # unset PKGNAME <-- don't do that; smage needs this var
782     # unset to be safe (quotes needed !)
783     # for i in ${SPECIAL_FUNCTIONS}
784     # do
785     # unset "${i}"
786     # done
787     unset SPECIAL_FUNCTIONS
788     # for i in ${SPECIAL_VARS}
789     # do
790     # unset "${i}"
791     # done
792     unset SPECIAL_VARS
793     unset STATE
794     unset DESCRIPTION
795     unset HOMEPAGE
796     # unset PKGTYPE <-- don't do that either; smage needs this var
797     unset INHERITS
798     unset DEPEND
799     unset SDEPEND
800     unset PROVIDE
801     unset preinstall
802     unset postinstall
803     unset preremove
804     unset postremove
805     }
806    
807     split_save_variables()
808     {
809     export SAVED_PNAME="${PNAME}"
810     export SAVED_PVER="${PVER}"
811     export SAVED_PBUILD="${PBUILD}"
812     export SAVED_PCATEGORIE="${PCATEGORIE}"
813     export SAVED_DESCRIPTION="${DESCRIPTION}"
814     export SAVED_HOMEPAGE="${HOMEPAGE}"
815     export SAVED_SPECIAL_VARS="${SPECIAL_VARS}"
816     export SAVED_STATE="${STATE}"
817     export SAVED_PKGTYPE="${PKGTYPE}"
818     export SAVED_INHERITS="${INHERITS}"
819     export SAVED_DEPEND="${DEPEND}"
820     export SAVED_SDEPEND="${SDEPEND}"
821     export SAVED_PROVIDE="${PROVIDE}"
822     export SAVED_PKGTYPE="${PKGTYPE}"
823    
824     # special handling needed for mage features
825     # pkgbuild
826     mqueryfeature "pkgbuild" && export SAVED_FEATURE_PKGBUILD="pkgbuild"
827     mqueryfeature "!pkgbuild" && export SAVED_FEATURE_PKGBUILD="!pkgbuild"
828     # strip
829     mqueryfeature "strip" && export SAVED_FEATURE_STRIP="strip"
830     mqueryfeature "!strip" && export SAVED_FEATURE_STRIP="!strip"
831     # libtool
832     mqueryfeature "libtool" && export SAVED_FEATURE_LIBTOOL="libtool"
833     mqueryfeature "!libtool" && export SAVED_FEATURE_LIBTOOL="!libtool"
834     # compressdoc
835     mqueryfeature "compressdoc" && export SAVED_FEATURE_COMPRESSDOC="compressdoc"
836     mqueryfeature "!compressdoc" && export SAVED_FEATURE_COMPRESSDOC="!compressdoc"
837    
838     # bindir too
839     export SAVED_BINDIR="${BINDIR}"
840    
841     # export the SPLIT_PACKAGE_BASE
842     export SPLIT_PACKAGE_BASE="${SAVED_PNAME}"
843    
844     # functions
845     if [[ ! -z $(typeset -f preinstall) ]]
846     then
847     # rename the old one
848     local saved_preinstall
849     saved_preinstall=SAVED_$(typeset -f preinstall)
850     eval "${saved_preinstall}"
851     export -f SAVED_preinstall
852     fi
853    
854     if [[ ! -z $(typeset -f postinstall) ]]
855     then
856     # rename the old one
857     local saved_postinstall
858     saved_postinstall=SAVED_$(typeset -f postinstall)
859     eval "${saved_postinstall}"
860     export -f SAVED_postinstall
861     fi
862    
863     if [[ ! -z $(typeset -f preremove) ]]
864     then
865     # rename the old one
866     local saved_preremove
867     saved_preremove=SAVED_$(typeset -f preremove)
868     eval "${saved_preremove}"
869     export -f SAVED_preremove
870     fi
871    
872     if [[ ! -z $(typeset -f postremove) ]]
873     then
874     # rename the old one
875     local saved_postremove
876     saved_postremove=SAVED_$(typeset -f postremove)
877     eval "${saved_postremove}"
878     export -f SAVED_postremove
879     fi
880     }
881    
882     split_restore_variables()
883     {
884     export PNAME="${SAVED_PNAME}"
885     export PVER="${SAVED_PVER}"
886     export PBUILD="${SAVED_PBUILD}"
887     export PCATEGORIE="${SAVED_PCATEGORIE}"
888     export DESCRIPTION="${SAVED_DESCRIPTION}"
889     export HOMEPAGE="${SAVED_HOMEPAGE}"
890     export SPECIAL_VARS="${SAVED_SPECIAL_VARS}"
891     export STATE="${SAVED_STATE}"
892     export PKGTYPE="${SAVED_PKGTYPE}"
893     export INHERITS="${SAVED_INHERITS}"
894     export DEPEND="${SAVED_DEPEND}"
895     export SDEPEND="${SAVED_SDEPEND}"
896     export PROVIDE="${SAVED_PROVIDE}"
897     export PKGTYPE="${SAVED_PKGTYPE}"
898    
899     # special handling needed for mage features
900     # pkgbuild
901     FVERBOSE=off msetfeature "${SAVED_FEATURE_PKGBUILD}"
902     # strip
903     FVERBOSE=off msetfeature "${SAVED_FEATURE_STRIP}"
904     # libtool
905     FVERBOSE=off msetfeature "${SAVED_FEATURE_LIBTOOL}"
906     # compressdoc
907     FVERBOSE=off msetfeature "${SAVED_FEATURE_COMPRESSDOC}"
908    
909     # bindir too
910     export BINDIR="${SAVED_BINDIR}"
911    
912     # functions
913     if [[ ! -z $(typeset -f SAVED_preinstall) ]]
914     then
915     # rename the old one
916     local saved_preinstall
917     saved_preinstall=$(typeset -f SAVED_preinstall)
918     eval "${saved_preinstall/SAVED_/}"
919     export -f preinstall
920     fi
921    
922     if [[ ! -z $(typeset -f SAVED_postinstall) ]]
923     then
924     # rename the old one
925     local saved_postinstall
926     saved_postinstall=$(typeset -f SAVED_postinstall)
927     eval "${saved_postinstall/SAVED_/}"
928     export -f postinstall
929     fi
930    
931     if [[ ! -z $(typeset -f SAVED_preremove) ]]
932     then
933     # rename the old one
934     local saved_preremove
935     saved_preremove=$(typeset -f SAVED_preremove)
936     eval "${saved_preremove/SAVED_/}"
937     export -f preremove
938     fi
939    
940     if [[ ! -z $(typeset -f SAVED_postremove) ]]
941     then
942     # rename the old one
943     local saved_postremove
944     saved_postremove=$(typeset -f SAVED_postremove)
945     eval "${saved_postremove/SAVED_/}"
946     export -f postremove
947     fi
948     }
949    
950     split_unset_variables()
951     {
952     # unset saved vars; not needed anymore
953     unset SAVED_PNAME
954     unset SAVED_PVER
955     unset SAVED_PBUILD
956     unset SAVED_PCATEGORIE
957     unset SAVED_DESCRIPTION
958     unset SAVED_HOMEPAGE
959     unset SAVED_SPECIAL_VARS
960     unset SAVED_STATE
961     unset SAVED_PKGTYPE
962     unset SAVED_INHERITS
963     unset SAVED_DEPEND
964     unset SAVED_SDEPEND
965     unset SAVED_PROVIDE
966     unset SAVED_BINDIR
967     unset SAVED_PKGTYPE
968     unset SAVED_FEATURE_PKGBUILD
969     unset SAVED_FEATURE_STRIP
970     unset SAVED_FEATURE_LIBTOOL
971     unset SAVED_FEATURE_COMPRESSDOC
972     unset SPLIT_PACKAGE_BASE
973     unset -f SAVED_preinstall
974     unset -f SAVED_postinstall
975     unset -f SAVED_preremove
976     unset -f SAVED_postremove
977     }
978    
979     split_export_inherits()
980     {
981     local subpackage="$1"
982     local func
983     local newfunc
984    
985     for func in preinstall postinstall preremove postremove
986     do
987     if [[ ! -z $(typeset -f ${func}_${subpackage}) ]]
988     then
989     newfunc=$(typeset -f ${func}_${subpackage})
990     newfunc="${newfunc/_${subpackage} (/ (}"
991     eval "${newfunc}"
992     fi
993     done
994     }
995    
996     split_delete_inherits()
997     {
998     local subpackage="$1"
999     local func
1000    
1001     for func in preinstall postinstall preremove postremove
1002     do
1003     if [[ ! -z $(typeset -f ${func}_${subpackage}) ]]
1004     then
1005     unset -f ${func}
1006     fi
1007     done
1008     }
1009    
1010     export_inherits()
1011     {
1012     local include="$1"
1013     shift
1014    
1015     while [ "$1" ]
1016     do
1017     local functions="$1"
1018    
1019     # sanity checks
1020     [ -z "${include}" ] && die "export_inherits(): \$include not given."
1021     [ -z "${functions}" ] && die "export_inherits(): \$functions not given."
1022    
1023     eval "${functions}() { ${include}_${functions} ; }"
1024    
1025     # debug
1026     [[ ${MAGEDEBUG} = on ]] && typeset -f "${functions}"
1027    
1028     shift
1029     done
1030     }
1031    
1032     generate_package_md5sum()
1033     {
1034     local dest
1035     local pcat
1036     local pname
1037     local pver
1038     local pbuild
1039     local parch
1040     local target
1041     local pkgname
1042    
1043     # very basic getops
1044     for i in $*
1045     do
1046     case $1 in
1047     --pcat|-c) shift; pcat="$1" ;;
1048     --pname|-n) shift; pname="$1" ;;
1049     --pver|-v) shift; pver="$1" ;;
1050     --pbuild|-b) shift; pbuild="$1" ;;
1051     --parch|a) shift; parch="$1" ;;
1052     --target|t) shift; target="$1" ;;
1053     esac
1054     shift
1055     done
1056    
1057     # sanity checks; abort if not given
1058     [ -z "${pcat}" ] && die "generate_package_md5sum() \$pcat not given."
1059     [ -z "${pname}" ] && die "generate_package_md5sum() \$pname not given."
1060     [ -z "${pver}" ] && die "generate_package_md5sum() \$pver not given."
1061     [ -z "${pbuild}" ] && die "generate_package_md5sum() \$pbuild not given."
1062     [ -z "${parch}" ] && die "generate_package_md5sum() \$parch not given."
1063    
1064     # check needed global vars
1065     [ -z "${PKGDIR}" ] && die "generate_package_md5sum() \$PKGDIR not set."
1066     [ -z "${PKGSUFFIX}" ] && die "generate_package_md5sum() \$PKGSUFFIX not set."
1067    
1068     # fix target as it may be empty !
1069     [ -n "${target}" ] && target="-${target}"
1070    
1071     # build pkgname
1072     pkgname="${pname}${target}-${pver}-${parch}-${pbuild}"
1073    
1074     # build pkg-md5-sum only if requested
1075     if mqueryfeature regentree
1076     then
1077     echo -ne "${COLBLUE}===${COLGREEN} generating md5's for ${pkgname}.${PKGSUFFIX} ... ${COLDEFAULT}"
1078    
1079     # abort if not exist
1080     if [ ! -f ${PKGDIR}/${pkgname}.${PKGSUFFIX} ]
1081     then
1082     echo -e "${COLRED}! exists${COLDEFAULT}"
1083     return 0
1084     fi
1085    
1086     # if MAGE_TREE_DEST not set use BUILDDIR
1087     : ${MAGE_TREE_DEST=${BUILDDIR}/mage-tree}
1088    
1089     # setup md5 dir
1090     dest="${MAGE_TREE_DEST}/${pcat}/${pname}${target}/md5"
1091     install -d ${dest}
1092    
1093     # gen md5sum
1094     ( cd ${PKGDIR}; md5sum "${pkgname}.${PKGSUFFIX}" ) \
1095     > ${dest}/${pkgname}.md5
1096     echo -e "${COLGREEN}done${COLDEFAULT}"
1097     fi
1098     }
1099    
1100     source_pkg_build()
1101     {
1102     if [[ ${PKGTYPE} = virtual ]]
1103     then
1104     echo "Virtual package detected; src-pkg-tarball not necessary ..."
1105     return 0
1106     fi
1107    
1108     if [[ ! -d ${SOURCEDIR}/${PNAME} ]]
1109     then
1110     echo "No SRC_URI defined; src-pkg-tarball not necessary ..."
1111     return 0
1112     fi
1113    
1114     [ -z "${SRCPKGDIR}" ] && die "\$SRCPKGDIR not found. Please setup your ${MAGERC} correctly."
1115    
1116     echo -e "${COLGREEN}Creating source package tarball ... ${COLDEFAULT}"
1117    
1118     # include the smage2 file
1119     cp ${SMAGENAME} ${SOURCEDIR}/${PNAME}
1120    
1121     ( cd ${SOURCEDIR}; tar cvjf ${BUILDDIR}/${PNAME}-${PVER}-${PBUILD}.tar.bz2 ${PNAME}; )
1122     [[ ! -d ${SRCPKGDIR} ]] && install -d ${SRCPKGDIR}
1123     mv ${BUILDDIR}/${PNAME}-${PVER}-${PBUILD}.tar.bz2 ${SRCPKGDIR}/${PNAME}-${PVER}-${PBUILD}.${SRCPKGSUFFIX}
1124    
1125     echo -e "${COLGREEN}Source package ${COLBLUE}${PNAME}-${PVER}-${PBUILD}.${SRCPKGSUFFIX} ${COLGREEN}successfully builded.${COLDEFAULT}"
1126     }
1127    
1128     step_by_step()
1129     {
1130     if mqueryfeature stepbystep
1131     then
1132     echo -e "${COLRED}Step-by-step enabled! Paused after $1.${COLDEFAULT}"
1133     echo "Press [enter] to continue"
1134     read
1135     fi
1136     }
1137    
1138     resume_stamp()
1139     {
1140     local step="$1"
1141     [[ ! -d ${BUILDDIR}/.stamps ]] && install -d ${BUILDDIR}/.stamps
1142     touch ${BUILDDIR}/.stamps/smage-${PKGNAME}-${step}
1143     }
1144    
1145     run_resume()
1146     {
1147     local step="$1"
1148    
1149     if mqueryfeature "resume" && [[ -f ${BUILDDIR}/.stamps/smage-${PKGNAME}-${step} ]]
1150     then
1151     echo -e "${COLMAGENTA}${step} already processed; doing nothing${COLDEFAULT}"
1152     return 0
1153     else
1154     return 1
1155     fi
1156     }