Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:executable *