Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.40  
changed lines
  Added in v.408