Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:executable *