Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


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