Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:executable *