Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 497 - (show annotations) (download) (as text)
Thu Jun 7 13:16:03 2007 UTC (16 years, 10 months ago) by niro
File MIME type: application/x-sh
File size: 29414 byte(s)
-added mlibtoolize() function

1 #!/bin/bash
2
3 # compiles/installs .smage2 source install scripts
4 # needs pkgbuild_dir (mage)
5
6 # SMAGE2
7 # $Header: /home/cvsd/magellan-cvs/magellan-src/mage/usr/lib/mage/smage2.sh,v 1.58 2007-06-07 13:16:03 niro Exp $
8
9 #01.10.2004
10 # added ccache support
11 # added distcc support
12
13 # set default user mage.rc
14 : ${MAGERC="/etc/mage.rc"}
15
16 ## setup ##
17 PKGSUFFIX="mpk"
18 SRCPKGSUFFIX="mpks"
19 SMAGENAME="$1"
20 SMAGESUFFIX="smage2"
21 MLIBDIR=/usr/lib/mage
22 SMAGEVERSION="$( < ${MLIBDIR}/version)"
23
24 ## only for tests -> normally in /etc/rc.d/init.d/functions
25 COLRED="\033[1;6m\033[31m"
26 COLGREEN="\033[1;6m\033[32m"
27 COLYELLOW="\033[1;6m\033[33m"
28 COLBLUE="\033[1;6m\033[34m"
29 COLMAGENTA="\033[1;6m\033[35m"
30 COLWHITE="\033[1;6m\033[37m"
31 COLGRAY="\033[0;6m\033[37m"
32 COLBOLD="\033[1m"
33 COLDEFAULT="\033[0m"
34
35 if [[ ${NOCOLORS} = true ]]
36 then
37 COLRED=""
38 COLGREEN=""
39 COLYELLOW=""
40 COLBLUE=""
41 COLMAGENTA=""
42 COLWHITE=""
43 COLGRAY=""
44 COLBOLD=""
45 COLDEFAULT=""
46 fi
47
48 # export default C locale
49 export LC_ALL=C
50
51 source /etc/mage.rc.global
52 source ${MAGERC}
53
54 # set PKGDIR and BUILDDIR and BINDIR to MROOT
55 if [[ -n ${MROOT} ]]
56 then
57 export PKGDIR=${MROOT}/${PKGDIR}
58 export BUILDDIR=${MROOT}/${BUILDDIR}
59 export BINDIR=${MROOT}/${BINDIR}
60 fi
61
62 showversion()
63 {
64 echo -en "Magellan Source Install v${SMAGEVERSION} "
65 echo -e "-- Niels Rogalla (niro@magellan-linux.de)"
66 }
67
68 die()
69 {
70 xtitleclean
71 echo -e ${COLRED}"Exited ${BASH_SOURCE} at line no ${BASH_LINENO}."${COLDEFAULT}
72 echo "SMAGE failed: $@"
73 exit 1
74 }
75
76 xtitle()
77 {
78 if [[ ${TERM} = xterm ]]
79 then
80 echo -ne "\033]0;[sMage: $@]\007"
81 fi
82 return 0
83 }
84
85 xtitleclean()
86 {
87 if [[ ${TERM} = xterm ]]
88 then
89 echo -ne "\033]0;\007"
90 fi
91 return 0
92 }
93
94 syncsmage2()
95 {
96 xtitle "Updating smage2-script tree ..."
97 local i
98 for i in ${SMAGE2RSYNC}
99 do
100 rsync ${RSYNC_FETCH_OPTIONS} ${i} ${SMAGESCRIPTSDIR}
101 if [[ $? = 0 ]]
102 then
103 break
104 else
105 continue
106 fi
107 done
108
109 # clean up backup files (foo~)
110 find ${SMAGESCRIPTSDIR} -name *~ -exec rm '{}' ';'
111
112 xtitleclean
113 }
114
115 # $1 filename
116 get_db_md5_sum()
117 {
118 local DB_FILE
119 local MD5_FILE
120 local i
121
122 DB_ENTRY="$(basename $1)"
123 MD5_FILE="${MD5DIR}/$(basename ${SMAGENAME} ${SMAGESUFFIX})"
124
125 i="$(cat ${MD5_FILE}| grep ${DB_ENTRY} | cut -d' ' -f1)"
126
127 echo "${i}"
128 }
129
130 download_sources()
131 {
132
133 [ -z "${SRC_URI}" ] && echo -e "\nNothing declared to download.\n" && return 0
134
135 local EOA=${#SRC_URI[*]}
136 local my_SRC_URI
137 local my_SRC_URI_DEST
138 local my_SRC_URI_MIRROR
139 local my_SOURCEDIR
140 local DB_MD5_SUM_FILE="${MD5DIR}/$(basename ${SMAGENAME} .${SMAGESUFFIX}).md5"
141 local FETCHING
142 local i mirror
143
144
145 # install SRCDIR/PNAME if not exist
146 [ ! -d ${SOURCEDIR}/${PNAME} ] && install -d ${SOURCEDIR}/${PNAME}
147
148 # check if FETCHING is needed
149 ( cd ${SOURCEDIR}/${PNAME}; md5sum --check ${DB_MD5_SUM_FILE} &> /dev/null )
150 if [[ $? = 0 ]]
151 then
152 # md5's ok, no fetching needed
153 FETCHING=false
154 else
155 FETCHING=true
156 fi
157
158 for ((i=0; i < EOA; i++))
159 do
160 # url to file
161 my_SRC_URI="$(echo ${SRC_URI[${i}]} | cut -d' ' -f1)"
162
163 # subdir in sources dir; the my_SRCI_URI file goes to there
164 my_SRC_URI_DEST="$(echo ${SRC_URI[${i}]} | cut -d' ' -f2)"
165
166 # if my_src_uri_dest is not equal my_src_uri; than an other dir is used
167 if [[ ${my_SRC_URI_DEST} != ${my_SRC_URI} ]]
168 then
169 my_SOURCEDIR="${SOURCEDIR}/${PNAME}/${my_SRC_URI_DEST}"
170 else
171 my_SOURCEDIR="${SOURCEDIR}/${PNAME}"
172 fi
173
174 # if an mirrored file than replace first the mirror uri
175 if [[ -n $(echo ${my_SRC_URI} | grep 'mirror://') ]]
176 then
177 for mirror in ${MIRRORS}
178 do
179 my_SRC_URI_MIRROR="$(echo ${my_SRC_URI} | sed "s|mirror:/|${mirror}/sources|g")"
180
181 if [[ ${FETCHING} = true ]]
182 then
183 echo -e "${COLBLUE}==>${COLGREEN} fetching ${my_SRC_URI_MIRROR}${COLDEFAULT}"
184 wget \
185 --passive-ftp \
186 --tries 3 \
187 --continue \
188 --progress bar \
189 --directory-prefix="${my_SOURCEDIR}" \
190 "${my_SRC_URI_MIRROR}"
191 if [[ $? = 0 ]]
192 then
193 break
194 else
195 continue
196 fi
197 fi
198 done
199 elif [[ -n $(echo ${my_SRC_URI} | grep 'sourceforge://') ]]
200 then
201 for mirror in ${SOURCEFORGE_MIRRORS}
202 do
203 my_SRC_URI_MIRROR="$(echo ${my_SRC_URI} | sed "s|sourceforge:/|${mirror}|g")"
204
205 if [[ ${FETCHING} = true ]]
206 then
207 echo -e "${COLBLUE}==>${COLGREEN} fetching ${my_SRC_URI_MIRROR}${COLDEFAULT}"
208 wget \
209 --passive-ftp \
210 --tries 3 \
211 --continue \
212 --progress bar \
213 --directory-prefix="${my_SOURCEDIR}" \
214 "${my_SRC_URI_MIRROR}"
215 if [[ $? = 0 ]]
216 then
217 break
218 else
219 continue
220 fi
221 fi
222 done
223 elif [[ -n $(echo ${my_SRC_URI} | grep 'gnu://') ]]
224 then
225 for mirror in ${GNU_MIRRORS}
226 do
227 my_SRC_URI_MIRROR="$(echo ${my_SRC_URI} | sed "s|gnu:/|${mirror}|g")"
228
229 if [[ ${FETCHING} = true ]]
230 then
231 echo -e "${COLBLUE}==>${COLGREEN} fetching ${my_SRC_URI_MIRROR}${COLDEFAULT}"
232 wget \
233 --passive-ftp \
234 --tries 3 \
235 --continue \
236 --progress bar \
237 --directory-prefix="${my_SOURCEDIR}" \
238 "${my_SRC_URI_MIRROR}"
239 if [[ $? = 0 ]]
240 then
241 break
242 else
243 continue
244 fi
245 fi
246 done
247 elif [[ -n $(echo ${my_SRC_URI} | grep 'kde://') ]]
248 then
249 for mirror in ${KDE_MIRRORS}
250 do
251 my_SRC_URI_MIRROR="$(echo ${my_SRC_URI} | sed "s|kde:/|${mirror}|g")"
252
253 if [[ ${FETCHING} = true ]]
254 then
255 echo -e "${COLBLUE}==>${COLGREEN} fetching ${my_SRC_URI_MIRROR}${COLDEFAULT}"
256 wget \
257 --passive-ftp \
258 --tries 3 \
259 --continue \
260 --progress bar \
261 --directory-prefix="${my_SOURCEDIR}" \
262 "${my_SRC_URI_MIRROR}"
263 if [[ $? = 0 ]]
264 then
265 break
266 else
267 continue
268 fi
269 fi
270 done
271 elif [[ -n $(echo ${my_SRC_URI} | grep 'gnome://') ]]
272 then
273 for mirror in ${GNOME_MIRRORS}
274 do
275 my_SRC_URI_MIRROR="$(echo ${my_SRC_URI} | sed "s|gnome:/|${mirror}|g")"
276
277 if [[ ${FETCHING} = true ]]
278 then
279 echo -e "${COLBLUE}==>${COLGREEN} fetching ${my_SRC_URI_MIRROR}${COLDEFAULT}"
280 wget \
281 --passive-ftp \
282 --tries 3 \
283 --continue \
284 --progress bar \
285 --directory-prefix="${my_SOURCEDIR}" \
286 "${my_SRC_URI_MIRROR}"
287 if [[ $? = 0 ]]
288 then
289 break
290 else
291 continue
292 fi
293 fi
294 done
295 else
296 if [[ ${FETCHING} = true ]]
297 then
298 echo -e "${COLBLUE}==>${COLGREEN} fetching ${my_SRC_URI}${COLDEFAULT}"
299 wget \
300 --passive-ftp \
301 --tries 3 \
302 --continue \
303 --progress bar \
304 --directory-prefix="${my_SOURCEDIR}" \
305 "${my_SRC_URI}"
306 fi
307 fi
308
309 # unset them to be shure
310 unset my_SRC_URI
311 unset my_SRC_URI_DEST
312 unset my_SRC_URI_MIRROR
313 unset my_SOURCEDIR
314 done
315
316 # recheck md5 sums
317 echo
318 echo -e "${COLBLUE}===${COLGREEN} Checking MD5 sums:${COLDEFAULT}"
319 ( cd ${SOURCEDIR}/${PNAME}; md5sum --check ${DB_MD5_SUM_FILE} ) || die "md5 failed"
320 echo
321
322 # not needed anymore
323 unset SRC_URI
324 }
325
326 # dummy function, used if that not exist in smage file
327 src_prepare()
328 {
329 echo "no src_prepare defined"
330 sleep 2
331 return 0
332 }
333
334 # dummy function, used if that not exist in smage file
335 src_compile()
336 {
337 echo "no src_compile defined"
338 sleep 2
339 return 0
340 }
341
342 # dummy function, used if that not exist in smage file
343 src_install()
344 {
345 echo "no src_install defined"
346 sleep 2
347 return 0
348 }
349
350 mlibdir()
351 {
352 local libdir=lib
353 [[ ${ARCH} = x86_64 ]] && libdir=lib64
354
355 echo "${libdir}"
356 }
357
358 mconfigure()
359 {
360 if [ -x ./configure ]
361 then
362 ./configure \
363 --prefix=/usr \
364 --host=${CHOST} \
365 --mandir=/usr/share/man \
366 --infodir=/usr/share/info \
367 --datadir=/usr/share \
368 --sysconfdir=/etc \
369 --localstatedir=/var/lib \
370 --libdir=/usr/$(mlibdir) \
371 "$@" || die "mconfigure failed"
372 else
373 echo "configure is not an executable ..."
374 exit 1
375 fi
376 }
377
378 minstall()
379 {
380 if [ -f ./[mM]akefile -o -f ./GNUmakefile ]
381 then
382 make prefix=${BINDIR}/usr \
383 datadir=${BINDIR}/usr/share \
384 infodir=${BINDIR}/usr/share/info \
385 localstatedir=${BINDIR}/var/lib \
386 mandir=${BINDIR}/usr/share/man \
387 sysconfdir=${BINDIR}/etc \
388 libdir=${BINDIR}/usr/$(mlibdir) \
389 "$@" install || die "minstall failed"
390 else
391 die "no Makefile found"
392 fi
393 }
394
395 mmake()
396 {
397 make ${MAKEOPTS} ${EXTRA_EMAKE} "$@"
398 }
399
400 munpack()
401 {
402 local SRCFILE
403 local IFTAR
404 local DEST
405
406 SRCFILE=$1
407
408 if [ -z "$2" ]
409 then
410 DEST=${BUILDDIR}
411 else
412 DEST=$2
413 fi
414
415 [[ ! -d ${DEST} ]] && install -d ${DEST}
416
417 case "${SRCFILE##*.}" in
418 bz2)
419 IFTAR="$(basename $SRCFILE .bz2)"
420 IFTAR="${IFTAR##*.}"
421 if [[ ${IFTAR} = tar ]]
422 then
423 tar --no-same-owner -xvjf ${SOURCEDIR}/${PNAME}/${SRCFILE} -C ${DEST}
424 fi
425 ;;
426 gz)
427 IFTAR="$(basename $SRCFILE .gz)"
428 IFTAR="${IFTAR##*.}"
429 if [[ ${IFTAR} = tar ]]
430 then
431 tar --no-same-owner -xvzf ${SOURCEDIR}/${PNAME}/${SRCFILE} -C ${DEST}
432 fi
433 ;;
434 tbz2)
435 tar --no-same-owner -xvjf ${SOURCEDIR}/${PNAME}/${SRCFILE} -C ${DEST}
436 ;;
437 tgz)
438 tar --no-same-owner -xvzf ${SOURCEDIR}/${PNAME}/${SRCFILE} -C ${DEST}
439 ;;
440 *)
441 die "munpack failed"
442 ;;
443 esac
444 }
445
446 mpatch()
447 {
448 local PATCHOPTS
449 local PATCHFILE
450 local i
451
452 PATCHOPTS=$1
453 PATCHFILE=$2
454
455 if [[ -z $2 ]]
456 then
457 PATCHFILE=$1
458
459 ## patch level auto-detection, get patch level
460 for ((i=0; i < 10; i++))
461 do
462 patch --dry-run -Np${i} -i ${SOURCEDIR}/${PNAME}/${PATCHFILE} > /dev/null
463 if [[ $? = 0 ]]
464 then
465 PATCHOPTS="-Np${i}"
466 break
467 fi
468 done
469 fi
470
471 echo -e "${COLBLUE}*** ${COLGREEN}Applying patch '${PATCHFILE}'${COLDEFAULT}"
472 patch "${PATCHOPTS}" -i ${SOURCEDIR}/${PNAME}/${PATCHFILE}
473 }
474
475 mlibtoolize()
476 {
477 local opts="$@"
478 [[ -z ${opts} ]] && opts="--copy --force"
479
480 libtoolize ${opts} || die "running: mlibtoolize ${opts}"
481 }
482
483 minstalldocs()
484 {
485 local docfiles
486 docfiles="$@"
487
488 if [ ! -d ${BINDIR}/usr/share/doc/${PNAME}-${PVER} ]
489 then
490 install -d ${BINDIR}/usr/share/doc/${PNAME}-${PVER} || die "creating doc dirs."
491 fi
492
493 for i in ${docfiles}
494 do
495 cat ${i} | gzip -9c > ${i}.gz || die "gzipping docs."
496 install -m 0644 ${SRCDIR}/${i}.gz \
497 ${BINDIR}/usr/share/doc/${PNAME}-${PVER} || die "coping docs."
498 done
499 }
500
501 mstriplibs()
502 {
503 local stripdir="$@"
504
505 [ -z "${stripdir}" ] && stripdir=${BINDIR}
506 find ${stripdir} | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
507 }
508
509 mstripbins()
510 {
511 local stripdir="$@"
512
513 [ -z "${stripdir}" ] && stripdir=${BINDIR}
514 find ${stripdir} | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null
515 }
516
517 sminclude()
518 {
519 local i
520
521 if [[ -n "$@" ]]
522 then
523 for i in $@
524 do
525 echo "--- Including ${SMAGESCRIPTSDIR}/include/${i}.sminc"
526 source ${SMAGESCRIPTSDIR}/include/${i}.sminc
527 done
528 echo
529 fi
530 }
531
532 setup_distcc_environment()
533 {
534 if [ -x /usr/bin/distcc ]
535 then
536 echo -e "${COLBLUE}---${COLGREEN} Using DistCC for compilation ...${COLDEFAULT}"
537 export PATH=/usr/$(mlibdir)/distcc/bin:${PATH} || die "distcc: could not export new $PATH"
538
539 export DISTCC_DIR="${DISTCC_DIR}" || die "distcc_dir export failed"
540
541 # creating distcc tempdir
542 install -o distcc -g daemon -d ${DISTCC_DIR}
543 chmod 1777 ${DISTCC_DIR}
544 fi
545 }
546
547 setup_ccache_environment()
548 {
549 if [ -x /usr/bin/ccache ]
550 then
551 echo -e "${COLBLUE}---${COLGREEN} Using CCache for compilation ...${COLDEFAULT}"
552 export PATH=/usr/$(mlibdir)/ccache/bin:${PATH} || die "ccache: could not export new $PATH"
553 fi
554 }
555
556
557 # fixes given dependencies to match a MAGE_TARGET
558 # fix_mage_deps -target s/depend # <-- note -target !
559 fix_mage_deps()
560 {
561 local target="$1"
562 local depend="$2"
563 local NDEPEND
564 local sym dep cat pver pname
565
566 # deps and provides are special
567 # they must be fixed to match the target
568
569 # run this only if target and depend is not empty
570 if [ -n "${target}" ] && [ -n "${depend}" ]
571 then
572 # fix DEPEND
573 while read sym dep
574 do
575 # ignore empty lines
576 [[ -z ${dep} ]] && continue
577
578 cat="$(dirname ${dep})"
579 # change if not virtual
580 if [[ ${cat} = virtual ]]
581 then
582 pname="$(basename ${dep})"
583 else
584 # fix pver to target-pver
585 # to get pname-target-pver
586
587 # doing it backwards !
588 pver="${dep##*-}"
589 # full pver
590 pname="$(basename ${dep/-${pver}/})${target}-${pver}"
591 fi
592
593 # do not add empty lines
594 if [ -z "${NDEPEND}" ]
595 then
596 NDEPEND="${sym} ${cat}/${pname}"
597 else
598 NDEPEND="${NDEPEND}
599 ${sym} ${cat}/${pname}"
600 fi
601
602 unset cat pname pver
603 done << EOF
604 ${depend}
605 EOF
606 # set NDEPEND to DEPEND
607 depend="${NDEPEND}"
608 fi
609
610 echo "${depend}"
611 }
612
613 # build_mage_script(): helper functions for regen_mage_tree()
614 # generates an mage file with given information in smage file
615 # needs at least:
616 # PNAME name of pkg
617 # PVER version
618 # PBUILD revision
619 # PCATEGORIE categorie of the pkg
620 # STATE state of pkg stable|unstable|old
621 # DESCRIPTION va short description (opt)
622 # HOMEPAGE homepage (opt)
623 # DEPEND runtime dependencies (opt)
624 # SDEPEND add. needed deps to build the pkg (opt)
625 # PROVIDE provides a virtual (opt)
626 #
627 # special tags:
628 # PKGTYPE type of pkg
629 # INHERITS which functions get included
630 # SPECIAL_FUNCTIONS special functions wich should also be added
631 # warning: they get killed before the build starts !
632 #
633 # MAGE_TREE_DEST target destination of the generated tree
634 # REGEN_MAGE_TREE set to 'true' to enable this
635 #
636 # gets called with build_mage_script target
637 build_mage_script()
638 {
639 local magefile
640 local dest
641 local target
642 local sym
643 local depname
644
645 # if MAGE_TREE_DEST not set use BUILDDIR
646 : ${MAGE_TREE_DEST=${BUILDDIR}/mage-tree}
647
648 # determinate which suffix this mage file should get, if any
649 [ -n "$1" ] && target="-$1"
650
651 # name of magefile
652 magefile="${PNAME}${target}-${PVER}-${PBUILD}.mage"
653
654 # destination to magefile
655 dest="${MAGE_TREE_DEST}/${PCATEGORIE}/${PNAME}${target}/${magefile}"
656
657 # show what we are doing
658 echo -e "${COLBLUE}===${COLGREEN} generating mage file:${COLDEFAULT}"
659 echo "${dest}"
660
661 install -d "$(dirname ${dest})"
662 # now build the mage file
663 > ${dest}
664
665 # header
666 echo '# $Header: /home/cvsd/magellan-cvs/magellan-src/mage/usr/lib/mage/smage2.sh,v 1.58 2007-06-07 13:16:03 niro Exp $' >> ${dest}
667 echo >> ${dest}
668
669 # pgkname and state
670 echo "PKGNAME=\"${PNAME}${target}-${PVER}-\${ARCH}-${PBUILD}\"" >> ${dest}
671 echo "STATE=\"${STATE}\"" >> ${dest}
672 echo >> ${dest}
673
674 # description and homepage
675 echo "DESCRIPTION=\"${DESCRIPTION}\"" >> ${dest}
676 echo "HOMEPAGE=\"${HOMEPAGE}\"" >> ${dest}
677 echo >> ${dest}
678
679 # special tags and vars
680 echo "PKGTYPE=\"${PKGTYPE}\"" >> ${dest}
681
682 # echo MAGE_TARGETS ## note -target is needed !
683 echo "MAGE_TARGETS=\"${target}\"" >> ${dest}
684 echo >> ${dest}
685
686 # add special vars
687 if [ -n "${SPECIAL_VARS}" ]
688 then
689 local i
690 for i in ${SPECIAL_VARS}
691 do
692 # being tricky here :)
693 echo "${i}=\"$(eval echo \$${i})\"" >> ${dest}
694 done
695 echo >> ${dest}
696 fi
697
698 # add at least all includes
699 if [ -n "${INHERITS}" ]
700 then
701 echo -n "minclude" >> ${dest}
702 local i
703 for i in ${INHERITS}
704 do
705 echo -n " ${i}" >> ${dest}
706 done
707 echo >> ${dest}
708 fi
709 echo >> ${dest}
710
711 # deps and provides
712 echo "DEPEND=\"$(fix_mage_deps "${target}" "${DEPEND}")\"" >> ${dest}
713 echo >> ${dest}
714 echo "SDEPEND=\"$(fix_mage_deps "${target}" "${SDEPEND}")\"" >> ${dest}
715 echo >> ${dest}
716 echo "PROVIDE=\"${PROVIDE}\"" >> ${dest}
717 echo >> ${dest}
718
719 # add special functions
720 if [ -n "${SPECIAL_FUNCTIONS}" ]
721 then
722 local i
723 for i in ${SPECIAL_FUNCTIONS}
724 do
725 # add to mage (quotes needed !)
726 typeset -f "${i}" >> ${dest}
727 echo >> ${dest}
728 # unset to be safe (quotes needed !)
729 #unset "${i}" <-- later to get every target built
730 done
731 echo >> ${dest}
732 fi
733
734 # pre|post-install|removes
735 typeset -f preinstall >> ${dest}
736 echo >> ${dest}
737 typeset -f postinstall >> ${dest}
738 echo >> ${dest}
739 typeset -f preremove >> ${dest}
740 echo >> ${dest}
741 typeset -f postremove >> ${dest}
742 echo >> ${dest}
743 }
744
745 regen_mage_tree()
746 {
747 local i
748
749 # build them only if requested
750 if [[ ${REGEN_MAGE_TREE} = true ]]
751 then
752 # run it without targets
753 if [ -z "${MAGE_TARGETS}" ]
754 then
755 echo
756 build_mage_script
757 echo
758 else
759
760 # build for each target an mage file
761 # run it with several targets
762 for i in ${MAGE_TARGETS}
763 do
764 echo
765 build_mage_script "${i}"
766 echo
767 done
768 fi
769 fi
770
771 # now unset all uneeded vars to be safe
772 # unset PKGNAME <-- don't do that; smage needs this var
773 # unset to be safe (quotes needed !)
774 # for i in ${SPECIAL_FUNCTIONS}
775 # do
776 # unset "${i}"
777 # done
778 unset SPECIAL_FUNCTIONS
779 # for i in ${SPECIAL_VARS}
780 # do
781 # unset "${i}"
782 # done
783 unset SPECIAL_VARS
784 unset STATE
785 unset DESCRIPTION
786 unset HOMEPAGE
787 unset PKGTYPE
788 unset INHERITS
789 unset DEPEND
790 unset SDEPEND
791 unset PROVIDE
792 unset preinstall
793 unset postinstall
794 unset preremove
795 unset postremove
796 }
797
798 export_inherits()
799 {
800 local include="$1"
801 shift
802
803 while [ "$1" ]
804 do
805 local functions="$1"
806
807 # sanity checks
808 [ -z "${include}" ] && die "export_inherits(): \$include not given."
809 [ -z "${functions}" ] && die "export_inherits(): \$functions not given."
810
811 eval "${functions}() { ${include}_${functions} ; }"
812
813 # debug
814 [[ ${MAGEDEBUG} = on ]] && typeset -f "${functions}"
815
816 shift
817 done
818 }
819
820 generate_package_md5sum()
821 {
822 local dest
823 local pcat
824 local pname
825 local pver
826 local pbuild
827 local parch
828 local target
829 local pkgname
830
831 # very basic getops
832 for i in $*
833 do
834 case $1 in
835 --pcat|-c) shift; pcat="$1" ;;
836 --pname|-n) shift; pname="$1" ;;
837 --pver|-v) shift; pver="$1" ;;
838 --pbuild|-b) shift; pbuild="$1" ;;
839 --parch|a) shift; parch="$1" ;;
840 --target|t) shift; target="$1" ;;
841 esac
842 shift
843 done
844
845 # sanity checks; abort if not given
846 [ -z "${pcat}" ] && die "generate_package_md5sum() \$pcat not given."
847 [ -z "${pname}" ] && die "generate_package_md5sum() \$pname not given."
848 [ -z "${pver}" ] && die "generate_package_md5sum() \$pver not given."
849 [ -z "${pbuild}" ] && die "generate_package_md5sum() \$pbuild not given."
850 [ -z "${parch}" ] && die "generate_package_md5sum() \$parch not given."
851
852 # check needed global vars
853 [ -z "${PKGDIR}" ] && die "generate_package_md5sum() \$PKGDIR not set."
854 [ -z "${PKGSUFFIX}" ] && die "generate_package_md5sum() \$PKGSUFFIX not set."
855
856 # fix target as it may be empty !
857 [ -n "${target}" ] && target="-${target}"
858
859 # build pkgname
860 pkgname="${pname}${target}-${pver}-${parch}-${pbuild}"
861
862 # build pkg-md5-sum only if requested
863 if [[ ${REGEN_MAGE_TREE} = true ]]
864 then
865 echo -ne "${COLBLUE}===${COLGREEN} generating md5's for ${pkgname}.${PKGSUFFIX} ... ${COLDEFAULT}"
866
867 # abort if not exist
868 if [ ! -f ${PKGDIR}/${pkgname}.${PKGSUFFIX} ]
869 then
870 echo -e "${COLRED}! exists${COLDEFAULT}"
871 return 0
872 fi
873
874 # if MAGE_TREE_DEST not set use BUILDDIR
875 : ${MAGE_TREE_DEST=${BUILDDIR}/mage-tree}
876
877 # setup md5 dir
878 dest="${MAGE_TREE_DEST}/${pcat}/${pname}/md5"
879 install -d ${dest}
880
881 # gen md5sum
882 ( cd ${PKGDIR}; md5sum "${pkgname}.${PKGSUFFIX}" ) \
883 > ${dest}/${pkgname}.md5
884 echo -e "${COLGREEN}done${COLDEFAULT}"
885 fi
886 }
887
888 source_pkg_build()
889 {
890 if [[ ${PKGTYPE} = virtual ]]
891 then
892 echo "Virtual package detected; src-pkg-tarball not necessary ..."
893 return 0
894 fi
895
896 if [[ ! -d ${SOURCEDIR}/${PNAME} ]]
897 then
898 echo "No SRC_URI defined; src-pkg-tarball not necessary ..."
899 return 0
900 fi
901
902 [ -z "${SRCPKGDIR}" ] && die "\$SRCPKGDIR not found. Please setup your ${MAGERC} correctly."
903
904 echo -e "${COLGREEN}Creating source package tarball ... ${COLDEFAULT}"
905
906 # include the smage2 file
907 cp ${SMAGENAME} ${SOURCEDIR}/${PNAME}
908
909 ( cd ${SOURCEDIR}; tar cvjf ${BUILDDIR}/${PNAME}-${PVER}-${PBUILD}.tar.bz2 ${PNAME}; )
910 [[ ! -d ${SRCPKGDIR} ]] && install -d ${SRCPKGDIR}
911 mv ${BUILDDIR}/${PNAME}-${PVER}-${PBUILD}.tar.bz2 ${SRCPKGDIR}/${PNAME}-${PVER}-${PBUILD}.${SRCPKGSUFFIX}
912
913 echo -e "${COLGREEN}Source package ${COLBLUE}${PNAME}-${PVER}-${PBUILD}.${SRCPKGSUFFIX} ${COLGREEN}successfully builded.${COLDEFAULT}"
914 }
915
916
917 # print out our version
918 showversion
919 echo
920
921 if [ -z "$1" ]
922 then
923 echo "No .smage2 file given. Exiting."
924 echo
925 exit 1
926 fi
927
928 # updating smage2-scripts
929 if [[ $1 = update ]]
930 then
931 if [ ! -d ${SOURCEDIR} ]
932 then
933 install -d ${SOURCEDIR}
934 fi
935 syncsmage2
936 exit 0
937 fi
938
939 # creates md5sums for smages to given dir
940 if [[ $1 = calcmd5 ]]
941 then
942 if [ $# -ge 3 ]
943 then
944 SMAGENAME="$2"
945 MD5DIR="$3"
946 source ${SMAGENAME} || die "download source failed"
947
948 # overridable sourcedir; must be declared after source of the smage2
949 CALC_SOURCEDIR="${CALC_SOURCEDIR:="${SOURCEDIR}/${PNAME}"}"
950
951 [ -z "${SRC_URI}" ] && die "Nothing declared to calculate."
952
953 # end of array
954 EOA=${#SRC_URI[*]}
955
956 [ ! -d ${MD5DIR} ] && install -d ${MD5DIR}
957
958 # clear md5sum file
959 MY_MD5_FILE="${MD5DIR}/$(basename ${SMAGENAME} .${SMAGESUFFIX}).md5"
960 echo -n > ${MY_MD5_FILE}
961
962 for ((i=0; i < EOA; i++))
963 do
964 # url to file
965 my_SRC_URI="$(echo ${SRC_URI[${i}]} | cut -d' ' -f1)"
966
967 # subdir in sources dir; the my_SRCI_URI file goes to there
968 my_SRC_URI_DEST="$(echo ${SRC_URI[${i}]} | cut -d' ' -f2)"
969
970 # if my_src_uri_dest is not equal my_src_uri; than an other dir is used
971 if [[ ${my_SRC_URI_DEST} != ${my_SRC_URI} ]]
972 then
973 MY_SRC_FILE="${my_SRC_URI_DEST}/$(basename ${SRC_URI[${i}]})"
974 else
975 MY_SRC_FILE="$(basename ${SRC_URI[${i}]})"
976 fi
977
978 if [ -e "${CALC_SOURCEDIR}/${MY_SRC_FILE}" ]
979 then
980 echo "calculating $(basename ${MY_SRC_FILE}) ..."
981 ( cd ${CALC_SOURCEDIR}; md5sum "${MY_SRC_FILE}" ) >> ${MY_MD5_FILE}
982 else
983 echo "WARNING: File '$(basename ${MY_SRC_FILE}) not found in ${CALC_SOURCEDIR}."
984 fi
985
986 # unset them to be shure
987 unset my_SRC_URI
988 unset my_SRC_URI_DEST
989 unset my_SRC_URI_MIRROR
990 unset my_SOURCEDIR
991 done
992
993 echo
994 echo "Calculating of md5 sums for '$(basename ${SMAGENAME} .${SMAGESUFFIX})' done."
995 echo
996 else
997 echo "Usage: Calculating MD5 Sums:"
998 echo " $(basename $0) calcmd5 /path/to/SMAGENAME /path/to/MD5DIR"
999 echo
1000 echo
1001 echo "Export the CALC_SOURCEDIR variable to override current SOURCEDIRs."
1002 echo
1003 exit 1
1004 fi
1005
1006 exit 0
1007 fi
1008
1009 # download sources
1010 if [ "$1" == "download" -a -n "$2" ]
1011 then
1012 if [ ! -d ${SMAGESCRIPTSDIR} ]
1013 then
1014 install -d ${SMAGESCRIPTSDIR}
1015 fi
1016
1017 # get smage
1018 SMAGENAME="$2"
1019 MD5DIR="$(dirname ${SMAGENAME})/md5"
1020 source ${SMAGENAME} || die "download source failed"
1021
1022 download_sources
1023 exit 0
1024 fi
1025
1026 # regen-mage-tree
1027 if [ "$1" == "only-regen-tree" -a -n "$2" ]
1028 then
1029 # set correct SMAGENAME
1030 SMAGENAME="$2"
1031 MD5DIR="$(dirname ${SMAGENAME})/md5"
1032 source ${SMAGENAME} || die "regen: smage2 not found"
1033
1034 regen_mage_tree
1035
1036 # build md5sum for existing packages
1037 generate_package_md5sum \
1038 --pcat "${PCATEGORIE}" \
1039 --pname "${PNAME}" \
1040 --pver "${PVER}" \
1041 --pbuild "${PBUILD}" \
1042 --parch "${ARCH}" \
1043 --target "${target}"
1044
1045 exit 0
1046 fi
1047
1048 if [ "$1" == "--create-src-tarball" -a -n "$2" ]
1049 then
1050 # set correct SMAGENAME
1051 SMAGENAME="$2"
1052 MD5DIR="$(dirname ${SMAGENAME})/md5"
1053
1054 echo -e "${COLGREEN}create-src-tarball called for ${COLBLUE}${SMAGENAME}${COLGREEN} ...${COLDEFAULT}"
1055
1056 source ${SMAGENAME} || die "regen: smage2 not found"
1057
1058 if [[ -d ${SOURCEDIR}/${PNAME} ]]
1059 then
1060 echo -e "${COLGREEN}Deleting old sourcefiles ${COLBLUE}${SOURCEDIR}/${PNAME}${COLGREEN} ...${COLDEFAULT}"
1061 rm -rf ${SOURCEDIR}/${PKGNAME}
1062 fi
1063
1064 download_sources
1065 source_pkg_build ${SMAGENAME}
1066 exit 0
1067 fi
1068
1069 if [ "$1" == "--src-tarball" -a -n "$2" ] || [ "$1" == "-st" -a -n "$2" ]
1070 then
1071 SRCPKGTARBALL="${2}"
1072 USE_SRC_PKG_TARBALL=true
1073
1074 # abort if given file is not a source pkg
1075 [[ ${SRCPKGTARBALL##*.} != ${SRCPKGSUFFIX} ]] && die "${SRCPKGTARBALL} is not a valid src-pkg file."
1076
1077 # set correct SMAGENAME; use the one that the src_pkg provide
1078 # /path/to/SOURCEDIR/PNAME/SMAGENAME
1079 SMAGENAME="${SOURCEDIR}/$(basename ${SRCPKGTARBALL%-*-*})/$(basename ${SRCPKGTARBALL} .${SRCPKGSUFFIX}).${SMAGESUFFIX}"
1080
1081 echo -e "${COLGREEN}Using src-tarball ${COLBLUE}${SRCPKGTARBALL}${COLGREEN} ...${COLDEFAULT}"
1082
1083 [[ ! -d ${SOURCEDIR} ]] && install -d ${SOURCEDIR}
1084
1085 # unpack srctarball
1086 [[ ! -f ${SRCPKGTARBALL} ]] && die "Error: ${SRCPKGTARBALL} does not exist. Aborting."
1087
1088 tar xvjf ${SRCPKGTARBALL} -C ${SOURCEDIR} || die "Error unpackung src-tarball ${SRCPKGTARBALL}"
1089
1090 [[ ! -f ${SMAGENAME} ]] && die "Included smage2 file in src-tarball not found: ${SMAGENAME}"
1091 fi
1092
1093
1094 [ ! -e ${MLIBDIR}/pkgbuild_dir.sh ] && die "Error: ${MLIBDIR}/pkgbuild_dir.sh not found. Aborting."
1095 [ -z "$(basename ${SMAGENAME} | grep .${SMAGESUFFIX})" ] &&
1096 die "File '$(basename ${SMAGENAME})' is not a sMage v${SMAGEVERSION} file. Aborting."
1097 [ -z "${SOURCEDIR}" ] && die "\$SOURCEDIR not found. Please setup your ${MAGERC} correctly."
1098 [ -z "${SMAGESCRIPTSDIR}" ] && die "\$SMAGESCRIPTSDIR not found. Please setup your ${MAGERC} correctly."
1099 [ -z "${SMAGE2RSYNC}" ] && die "\$SMAGE2RSYNC not found. Please setup your ${MAGERC} correctly."
1100 [ -z "${BINDIR}" ] && die "no BINDIR variable found in ${MAGERC}"
1101 [ -z "${CHOST}" ] && die "no CHOST variable found in ${MAGERC}"
1102 [ -z "${CFLAGS}" ] && die "no CFLAGS variable found in ${MAGERC}"
1103 [ -z "${CXXFLAGS}" ] && die "no CXXFLAGS variable found in ${MAGERC}"
1104
1105 source ${SMAGENAME} || die "source failed"
1106 PKGNAME="${PNAME}-${PVER}-${ARCH}-${PBUILD}"
1107 MD5DIR="$(dirname ${SMAGENAME})/md5"
1108
1109 xtitle "Compiling ${PKGNAME}"
1110 echo -e "${COLGREEN}Compiling ${PKGNAME}${COLDEFAULT}"
1111
1112 # auto regen mage tree if requested
1113 regen_mage_tree
1114
1115 if [[ ${CREATE_SRC_PKG_TARBALL} = true ]]
1116 then
1117 if [[ -d ${SOURCEDIR}/${PNAME} ]]
1118 then
1119 echo -e "${COLBLUE}===${COLGREEN} deleting old sourcefiles ${COLBLUE}${SOURCEDIR}/${PNAME}${COLGREEN} ...${COLDEFAULT}"
1120 rm -rf ${SOURCEDIR}/${PNAME}
1121 fi
1122 fi
1123
1124 # download sources
1125 [[ ${USE_SRC_PKG_TARBALL} != true ]] && download_sources
1126
1127 # fixes some issues with these functions
1128 export -f src_prepare || die "src_prepare export failed"
1129 export -f src_compile || die "src_compile export failed"
1130 export -f src_install || die "src_install export failed"
1131
1132 # fixes some compile issues
1133 export CHOST="${CHOST}" || die "CHOST export failed"
1134 export CFLAGS="${CFLAGS}" || die "CFLAGS export failed"
1135 export CXXFLAGS="${CFLAGS}" || die "CXXFLAGS export failed"
1136 export BINDIR="${BINDIR}" || die "BINDIR export failed"
1137 export MAKEOPTS="${MAKEOPTS}" || die "MAKEOPTS export failed"
1138
1139
1140 # setup distcc
1141 # setup for distcc goes *before* ccache, so ccache comes before distcc in path
1142 [[ ${SMAGE_USE_DISTCC} = true ]] && setup_distcc_environment
1143
1144 # setup ccache
1145 [[ ${SMAGE_USE_CCACHE} = true ]] && setup_ccache_environment
1146
1147 # small sleep to show our settings
1148 sleep 1
1149
1150 # cleans up build if a previously one exists
1151 if [ -d ${BUILDDIR} ]
1152 then
1153 rm -rf ${BUILDDIR}/* || die "couldn't cleanup \$BUILDDIR."
1154 fi
1155 install -d ${BUILDDIR} || die "couldn't create \$BUILDDIR."
1156
1157 # cleans up srcdir if a previously unpacked one exists
1158 if [ -d ${SRCDIR} ]
1159 then
1160 rm -rf ${SRCDIR}
1161 fi
1162
1163 # cleans up bindir if a previous build exists or creates a new one
1164 if [ -d ${BINDIR} ]
1165 then
1166 rm -rf ${BINDIR}
1167 fi
1168 install -d ${BINDIR} || die "couldn't create \$BINDIR."
1169
1170 # cleans up package temp dir if a previous build exists
1171 if [ -d ${BUILDDIR}/${PKGNAME} ]
1172 then
1173 rm -rf ${BUILDDIR}/${PKGNAME}
1174 fi
1175
1176 # cleans up timestamp if one exists
1177 if [ -f /var/tmp/timestamp ]
1178 then
1179 mage rmstamp
1180 fi
1181
1182 src_prepare || die "src_prepare failed"
1183 src_compile || die "src_compile failed"
1184 src_install || die "src_install failed"
1185
1186
1187 # compressing doc, info & man files
1188 if [ -d ${BUILDDIR}/builded/usr/share/man ]
1189 then
1190 echo -e "${COLBLUE}===${COLGREEN} compressing man-pages ...${COLDEFAULT}"
1191 ${MLIBDIR}/compressdoc -g -9 ${BUILDDIR}/builded/usr/share/man
1192 fi
1193
1194 if [ -d ${BUILDDIR}/builded/usr/share/info ]
1195 then
1196 echo -e "${COLBLUE}===${COLGREEN} compressing info-pages ...${COLDEFAULT}"
1197 ${MLIBDIR}/compressdoc -g -9 ${BUILDDIR}/builded/usr/share/info
1198 fi
1199
1200 # stripping all bins and libs
1201 case ${NOSTRIP} in
1202 true|TRUE|yes|y)
1203 echo -e "NOSTRIP=true detected; Package will not be stripped ..."
1204 ;;
1205 *)
1206 echo -e "${COLBLUE}===${COLGREEN} stripping binaries ...${COLDEFAULT}"
1207 mstripbins ${BINDIR}
1208 echo -e "${COLBLUE}===${COLGREEN} stripping libraries ...${COLDEFAULT}"
1209 mstriplibs ${BINDIR}
1210 ;;
1211 esac
1212
1213 # the new buildpkg command
1214 case ${NOPKGBUILD} in
1215 true|TRUE|yes|y)
1216 echo -e "NOPGKBUILD=true detected; Package will not be build ..."
1217 ;;
1218 *)
1219 # build several targets
1220 if [ -n "${MAGE_TARGETS}" ]
1221 then
1222 for target in ${MAGE_TARGETS}
1223 do
1224 # check if an special target_pkgbuild exists
1225 if typeset -f ${target}_pkgbuild > /dev/null
1226 then
1227 # run it
1228 ${target}_pkgbuild
1229 fi
1230 # now create the target package
1231 ${MLIBDIR}/pkgbuild_dir.sh \
1232 "${PNAME}-${target}-${PVER}-${ARCH}-${PBUILD}" \
1233 ${BINDIR} || die "target: ${target} package-build failed"
1234
1235 # build pkg-md5-sum if requested
1236 generate_package_md5sum \
1237 --pcat "${PCATEGORIE}" \
1238 --pname "${PNAME}" \
1239 --pver "${PVER}" \
1240 --pbuild "${PBUILD}" \
1241 --parch "${ARCH}" \
1242 --target "${target}"
1243
1244 echo -e "${COLGREEN}\nPackage ${PNAME}-${target}-${PVER}-${ARCH}-${PBUILD} successfully builded.\n${COLDEFAULT}"
1245 done
1246 else
1247 ${MLIBDIR}/pkgbuild_dir.sh ${PKGNAME} ${BINDIR} || die "package-build failed"
1248
1249 # build pkg-md5-sum if requested
1250 generate_package_md5sum \
1251 --pcat "${PCATEGORIE}" \
1252 --pname "${PNAME}" \
1253 --pver "${PVER}" \
1254 --pbuild "${PBUILD}" \
1255 --parch "${ARCH}"
1256
1257 echo -e "${COLGREEN}\nPackage ${PKGNAME} successfully builded.\n${COLDEFAULT}"
1258 fi
1259
1260 # build src-pkg-tarball if requested
1261 [[ ${CREATE_SRC_PKG_TARBALL} = true ]] && source_pkg_build ${SMAGENAME}
1262 ;;
1263 esac
1264
1265 # for sure
1266 unset NOPKGBUILD
1267 unset NOSTRIP
1268
1269 xtitleclean

Properties

Name Value
svn:executable *