Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 447 - (show annotations) (download) (as text)
Tue Mar 20 01:15:31 2007 UTC (17 years, 1 month ago) by niro
File MIME type: application/x-sh
File size: 28149 byte(s)
added patch level autodetection to mpatch()

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

Properties

Name Value
svn:executable *