ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/xyz2pov/ac-tools/shtool
Revision: 509
Committed: Tue Apr 29 17:45:47 2003 UTC (21 years, 2 months ago) by mmeineke
File size: 20295 byte(s)
Log Message:
Rearranged the source tree to be easier to distribute.
Added autoconf and automatic dependency generation

File Contents

# Content
1 #!/bin/sh
2 ##
3 ## GNU shtool -- The GNU Portable Shell Tool
4 ## Copyright (c) 1994-2001 Ralf S. Engelschall <rse@engelschall.com>
5 ##
6 ## See http://www.gnu.org/software/shtool/ for more information.
7 ## See ftp://ftp.gnu.org/gnu/shtool/ for latest version.
8 ##
9 ## Version: 1.5.2 (27-Feb-2001)
10 ## Contents: 3/17 available modules
11 ##
12
13 ##
14 ## This program is free software; you can redistribute it and/or modify
15 ## it under the terms of the GNU General Public License as published by
16 ## the Free Software Foundation; either version 2 of the License, or
17 ## (at your option) any later version.
18 ##
19 ## This program is distributed in the hope that it will be useful,
20 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
21 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 ## General Public License for more details.
23 ##
24 ## You should have received a copy of the GNU General Public License
25 ## along with this program; if not, write to the Free Software
26 ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
27 ## USA, or contact Ralf S. Engelschall <rse@engelschall.com>.
28 ##
29 ## Notice: Given that you include this file verbatim into your own
30 ## source tree, you are justified in saying that it remains separate
31 ## from your package, and that this way you are simply just using GNU
32 ## shtool. So, in this situation, there is no requirement that your
33 ## package itself is licensed under the GNU General Public License in
34 ## order to take advantage of GNU shtool.
35 ##
36
37 ##
38 ## Usage: shtool [<options>] [<cmd-name> [<cmd-options>] [<cmd-args>]]
39 ##
40 ## Available commands:
41 ## install Install a program, script or datafile
42 ## mkdir Make one or more directories
43 ## mkshadow Make a shadow tree through symbolic links
44 ##
45 ## Not available commands (because module was not built-in):
46 ## echo Print string with optional construct expansion
47 ## mdate Pretty-print modification time of a file or dir
48 ## table Pretty-print a field-separated list as a table
49 ## prop Display progress with a running propeller
50 ## move Move files with simultaneous substitution
51 ## mkln Make link with calculation of relative paths
52 ## fixperm Fix file permissions inside a source tree
53 ## tarball Roll distribution tarballs
54 ## guessos Simple operating system guesser
55 ## arx Extended archive command
56 ## slo Separate linker options by library class
57 ## scpp Sharing C Pre-Processor
58 ## version Maintain a version information file
59 ## path Deal with program paths
60 ##
61
62 if [ $# -eq 0 ]; then
63 echo "$0:Error: invalid command line" 1>&2
64 echo "$0:Hint: run \`$0 -h' for usage" 1>&2
65 exit 1
66 fi
67 if [ ".$1" = ".-h" -o ".$1" = ".--help" ]; then
68 echo "This is GNU shtool, version 1.5.2 (27-Feb-2001)"
69 echo "Copyright (c) 1994-2001 Ralf S. Engelschall <rse@engelschall.com>"
70 echo "Report bugs to <bug-shtool@gnu.org>"
71 echo ''
72 echo "Usage: shtool [<options>] [<cmd-name> [<cmd-options>] [<cmd-args>]]"
73 echo ''
74 echo 'Available global <options>:'
75 echo ' -v, --version display shtool version information'
76 echo ' -h, --help display shtool usage help page (this one)'
77 echo ' -d, --debug display shell trace information'
78 echo ' -r, --recreate recreate this shtool script via shtoolize'
79 echo ''
80 echo 'Available <cmd-name> [<cmd-options>] [<cmd-args>]:'
81 echo ' install [-v] [-t] [-c] [-C] [-s] [-m<mode>] [-o<owner>] [-g<group>]'
82 echo ' [-e<sed-cmd>] <file> [<file> ...] <path>'
83 echo ' mkdir [-t] [-f] [-p] [-m<mode>] <dir> [<dir> ...]'
84 echo ' mkshadow [-v] [-t] [-a] <src-dir> <dst-dir>'
85 echo ''
86 echo 'Not available <cmd-name> (because module was not built-in):'
87 echo ' echo [-n] [-e] [<str> ...]'
88 echo ' mdate [-n] [-z] [-s] [-d] [-f<str>] [-o<spec>] <path>'
89 echo ' table [-F<sep>] [-w<width>] [-c<cols>] [-s<strip>] <str><sep><str>...'
90 echo ' prop [-p<str>]'
91 echo ' move [-v] [-t] [-e] [-p] <src-file> <dst-file>'
92 echo ' mkln [-t] [-f] [-s] <src-path> [<src-path> ...] <dst-path>'
93 echo ' fixperm [-v] [-t] <path> [<path> ...]'
94 echo ' tarball [-t] [-v] [-o <tarball>] [-c <prog>] [-d <dir>] [-u'
95 echo ' <user>] [-g <group>] [-e <pattern>] <path> [<path> ...]'
96 echo ' guessos '
97 echo ' arx [-t] [-C<cmd>] <op> <archive> [<file> ...]'
98 echo ' slo [-p<str>] -- -L<dir> -l<lib> [-L<dir> -l<lib> ...]'
99 echo ' scpp [-v] [-p] [-f<filter>] [-o<ofile>] [-t<tfile>] [-M<mark>]'
100 echo ' [-D<dname>] [-C<cname>] <file> [<file> ...]'
101 echo ' version [-l<lang>] [-n<name>] [-p<prefix>] [-s<version>] [-e]'
102 echo ' [-i<knob>] [-d<type>] <file>'
103 echo ' path [-s] [-r] [-d] [-b] [-m] [-p<path>] <str> [<str> ...]'
104 echo ''
105 exit 0
106 fi
107 if [ ".$1" = ".-v" -o ".$1" = ."--version" ]; then
108 echo "GNU shtool 1.5.2 (27-Feb-2001)"
109 exit 0
110 fi
111 if [ ".$1" = ".-r" -o ".$1" = ."--recreate" ]; then
112 shtoolize -oshtool install mkdir mkshadow
113 exit 0
114 fi
115 if [ ".$1" = ".-d" -o ".$1" = ."--debug" ]; then
116 shift
117 set -x
118 fi
119 name=`echo "$0" | sed -e 's;.*/\([^/]*\)$;\1;' -e 's;-sh$;;' -e 's;\.sh$;;'`
120 case "$name" in
121 install|mkdir|mkshadow )
122 # implicit tool command selection
123 tool="$name"
124 ;;
125 * )
126 # explicit tool command selection
127 tool="$1"
128 shift
129 ;;
130 esac
131 arg_spec=""
132 opt_spec=""
133 gen_tmpfile=no
134
135 ##
136 ## DISPATCH INTO SCRIPT PROLOG
137 ##
138
139 case $tool in
140 install )
141 str_tool="install"
142 str_usage="[-v] [-t] [-c] [-C] [-s] [-m<mode>] [-o<owner>] [-g<group>] [-e<sed-cmd>] <file> [<file> ...] <path>"
143 arg_spec="2+"
144 opt_spec="v.t.c.C.s.m:o:g:e+"
145 opt_v=no
146 opt_t=no
147 opt_c=no
148 opt_C=no
149 opt_s=no
150 opt_m="0755"
151 opt_o=""
152 opt_g=""
153 opt_e=""
154 ;;
155 mkdir )
156 str_tool="mkdir"
157 str_usage="[-t] [-f] [-p] [-m<mode>] <dir> [<dir> ...]"
158 arg_spec="1+"
159 opt_spec="t.f.p.m:"
160 opt_t=no
161 opt_f=no
162 opt_p=no
163 opt_m=""
164 ;;
165 mkshadow )
166 str_tool="mkshadow"
167 str_usage="[-v] [-t] [-a] <src-dir> <dst-dir>"
168 arg_spec="2="
169 opt_spec="v.t.a."
170 opt_v=no
171 opt_t=no
172 opt_a=no
173 ;;
174 -* )
175 echo "$0:Error: unknown option \`$tool'" 2>&1
176 echo "$0:Hint: run \`$0 -h' for usage" 2>&1
177 exit 1
178 ;;
179 * )
180 echo "$0:Error: unknown command \`$tool'" 2>&1
181 echo "$0:Hint: run \`$0 -h' for usage" 2>&1
182 exit 1
183 ;;
184 esac
185
186 ##
187 ## COMMON UTILITY CODE
188 ##
189
190 # determine name of tool
191 if [ ".$tool" != . ]; then
192 # used inside shtool script
193 toolcmd="$0 $tool"
194 toolcmdhelp="shtool $tool"
195 msgprefix="shtool:$tool"
196 else
197 # used as standalone script
198 toolcmd="$0"
199 toolcmdhelp="sh $0"
200 msgprefix="$str_tool"
201 fi
202
203 # parse argument specification string
204 eval `echo $arg_spec |\
205 sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'`
206
207 # parse option specification string
208 eval `echo h.$opt_spec |\
209 sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'`
210
211 # interate over argument line
212 opt_PREV=''
213 while [ $# -gt 0 ]; do
214 # special option stops processing
215 if [ ".$1" = ".--" ]; then
216 shift
217 break
218 fi
219
220 # determine option and argument
221 opt_ARG_OK=no
222 if [ ".$opt_PREV" != . ]; then
223 # merge previous seen option with argument
224 opt_OPT="$opt_PREV"
225 opt_ARG="$1"
226 opt_ARG_OK=yes
227 opt_PREV=''
228 else
229 # split argument into option and argument
230 case "$1" in
231 -[a-zA-Z0-9]*)
232 eval `echo "x$1" |\
233 sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \
234 -e 's/";\(.*\)$/"; opt_ARG="\1"/'`
235 ;;
236 -[a-zA-Z0-9])
237 opt_OPT=`echo "x$1" | cut -c3-`
238 opt_ARG=''
239 ;;
240 *)
241 break
242 ;;
243 esac
244 fi
245
246 # eat up option
247 shift
248
249 # determine whether option needs an argument
250 eval "opt_MODE=\$opt_MODE_${opt_OPT}"
251 if [ ".$opt_ARG" = . -a ".$opt_ARG_OK" != .yes ]; then
252 if [ ".$opt_MODE" = ".:" -o ".$opt_MODE" = ".+" ]; then
253 opt_PREV="$opt_OPT"
254 continue
255 fi
256 fi
257
258 # process option
259 case $opt_MODE in
260 '.' )
261 # boolean option
262 eval "opt_${opt_OPT}=yes"
263 ;;
264 ':' )
265 # option with argument (multiple occurances override)
266 eval "opt_${opt_OPT}=\"\$opt_ARG\""
267 ;;
268 '+' )
269 # option with argument (multiple occurances append)
270 eval "opt_${opt_OPT}=\"\$opt_${opt_OPT} \$opt_ARG\""
271 ;;
272 * )
273 echo "$msgprefix:Error: unknown option: \`-$opt_OPT'" 1>&2
274 echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2
275 exit 1
276 ;;
277 esac
278 done
279 if [ ".$opt_PREV" != . ]; then
280 echo "$msgprefix:Error: missing argument to option \`-$opt_PREV'" 1>&2
281 echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2
282 exit 1
283 fi
284
285 # process help option
286 if [ ".$opt_h" = .yes ]; then
287 echo "Usage: $toolcmdhelp $str_usage"
288 exit 0
289 fi
290
291 # complain about incorrect number of arguments
292 case $arg_MODE in
293 '=' )
294 if [ $# -ne $arg_NUMS ]; then
295 echo "$msgprefix:Error: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2
296 echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2
297 exit 1
298 fi
299 ;;
300 '+' )
301 if [ $# -lt $arg_NUMS ]; then
302 echo "$msgprefix:Error: invalid number of arguments (at least $arg_NUMS expected)" 1>&2
303 echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2
304 exit 1
305 fi
306 ;;
307 esac
308
309 # establish a temporary file on request
310 if [ ".$gen_tmpfile" = .yes ]; then
311 if [ ".$TMPDIR" != . ]; then
312 tmpdir="$TMPDIR"
313 elif [ ".$TEMPDIR" != . ]; then
314 tmpdir="$TEMPDIR"
315 else
316 tmpdir="/tmp"
317 fi
318 tmpfile="$tmpdir/.shtool.$$"
319 rm -f $tmpfile >/dev/null 2>&1
320 touch $tmpfile
321 chmod 600 $tmpfile
322 fi
323
324 ##
325 ## DISPATCH INTO SCRIPT BODY
326 ##
327
328 case $tool in
329
330 install )
331 ##
332 ## install -- Install a program, script or datafile
333 ## Copyright (c) 1997-2001 Ralf S. Engelschall <rse@engelschall.com>
334 ## Originally written for shtool
335 ##
336
337 # determine source(s) and destination
338 argc=$#
339 srcs=""
340 while [ $# -gt 1 ]; do
341 srcs="$srcs $1"
342 shift
343 done
344 dstpath="$1"
345
346 # type check for destination
347 dstisdir=0
348 if [ -d $dstpath ]; then
349 dstpath=`echo "$dstpath" | sed -e 's:/$::'`
350 dstisdir=1
351 fi
352
353 # consistency check for destination
354 if [ $argc -gt 2 -a $dstisdir = 0 ]; then
355 echo "$msgprefix:Error: multiple sources require destination to be directory" 1>&2
356 exit 1
357 fi
358
359 # iterate over all source(s)
360 for src in $srcs; do
361 dst=$dstpath
362
363 # if destination is a directory, append the input filename
364 if [ $dstisdir = 1 ]; then
365 dstfile=`echo "$src" | sed -e 's;.*/\([^/]*\)$;\1;'`
366 dst="$dst/$dstfile"
367 fi
368
369 # check for correct arguments
370 if [ ".$src" = ".$dst" ]; then
371 echo "$msgprefix:Warning: source and destination are the same - skipped" 1>&2
372 continue
373 fi
374 if [ -d "$src" ]; then
375 echo "$msgprefix:Warning: source \`$src' is a directory - skipped" 1>&2
376 continue
377 fi
378
379 # make a temp file name in the destination directory
380 dsttmp=`echo $dst |\
381 sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;' \
382 -e "s;\$;/#INST@$$#;"`
383
384 # verbosity
385 if [ ".$opt_v" = .yes ]; then
386 echo "$src -> $dst" 1>&2
387 fi
388
389 # copy or move the file name to the temp name
390 # (because we might be not allowed to change the source)
391 if [ ".$opt_C" = .yes ]; then
392 opt_c=yes
393 fi
394 if [ ".$opt_c" = .yes ]; then
395 if [ ".$opt_t" = .yes ]; then
396 echo "cp $src $dsttmp" 1>&2
397 fi
398 cp $src $dsttmp || exit $?
399 else
400 if [ ".$opt_t" = .yes ]; then
401 echo "mv $src $dsttmp" 1>&2
402 fi
403 mv $src $dsttmp || exit $?
404 fi
405
406 # adjust the target file
407 if [ ".$opt_e" != . ]; then
408 sed='sed'
409 for e in $opt_e; do
410 sed="$sed -e '$e'"
411 done
412 cp $dsttmp $dsttmp.old
413 eval "$sed <$dsttmp.old >$dsttmp" || exit $?
414 rm -f $dsttmp.old
415 fi
416 if [ ".$opt_s" = .yes ]; then
417 if [ ".$opt_t" = .yes ]; then
418 echo "strip $dsttmp" 1>&2
419 fi
420 strip $dsttmp || exit $?
421 fi
422 if [ ".$opt_o" != . ]; then
423 if [ ".$opt_t" = .yes ]; then
424 echo "chown $opt_o $dsttmp" 1>&2
425 fi
426 chown $opt_o $dsttmp || exit $?
427 fi
428 if [ ".$opt_g" != . ]; then
429 if [ ".$opt_t" = .yes ]; then
430 echo "chgrp $opt_g $dsttmp" 1>&2
431 fi
432 chgrp $opt_g $dsttmp || exit $?
433 fi
434 if [ ".$opt_m" != ".-" ]; then
435 if [ ".$opt_t" = .yes ]; then
436 echo "chmod $opt_m $dsttmp" 1>&2
437 fi
438 chmod $opt_m $dsttmp || exit $?
439 fi
440
441 # determine whether to do a quick install
442 # (has to be done _after_ the strip was already done)
443 quick=no
444 if [ ".$opt_C" = .yes ]; then
445 if [ -r $dst ]; then
446 if cmp -s $src $dst; then
447 quick=yes
448 fi
449 fi
450 fi
451
452 # finally, install the file to the real destination
453 if [ $quick = yes ]; then
454 if [ ".$opt_t" = .yes ]; then
455 echo "rm -f $dsttmp" 1>&2
456 fi
457 rm -f $dsttmp
458 else
459 if [ ".$opt_t" = .yes ]; then
460 echo "rm -f $dst && mv $dsttmp $dst" 1>&2
461 fi
462 rm -f $dst && mv $dsttmp $dst
463 fi
464 done
465 ;;
466
467 mkdir )
468 ##
469 ## mkdir -- Make one or more directories
470 ## Copyright (c) 1996-2001 Ralf S. Engelschall <rse@engelschall.com>
471 ## Originally written for public domain by Noah Friedman <friedman@prep.ai.mit.edu>
472 ## Cleaned up and enhanced for shtool
473 ##
474
475 errstatus=0
476 for p in ${1+"$@"}; do
477 # if the directory already exists...
478 if [ -d "$p" ]; then
479 if [ ".$opt_f" = .no -a ".$opt_p" = .no ]; then
480 echo "$msgprefix:Error: directory already exists: $p" 1>&2
481 errstatus=1
482 break
483 else
484 continue
485 fi
486 fi
487 # if the directory has to be created...
488 if [ ".$opt_p" = .no ]; then
489 if [ ".$opt_t" = .yes ]; then
490 echo "mkdir $p" 1>&2
491 fi
492 mkdir $p || errstatus=$?
493 else
494 # the smart situation
495 set fnord `echo ":$p" |\
496 sed -e 's/^:\//%/' \
497 -e 's/^://' \
498 -e 's/\// /g' \
499 -e 's/^%/\//'`
500 shift
501 pathcomp=''
502 for d in ${1+"$@"}; do
503 pathcomp="$pathcomp$d"
504 case "$pathcomp" in
505 -* ) pathcomp="./$pathcomp" ;;
506 esac
507 if [ ! -d "$pathcomp" ]; then
508 if [ ".$opt_t" = .yes ]; then
509 echo "mkdir $pathcomp" 1>&2
510 fi
511 mkdir $pathcomp || errstatus=$?
512 if [ ".$opt_m" != . ]; then
513 if [ ".$opt_t" = .yes ]; then
514 echo "chmod $opt_m $pathcomp" 1>&2
515 fi
516 chmod $opt_m $pathcomp || errstatus=$?
517 fi
518 fi
519 pathcomp="$pathcomp/"
520 done
521 fi
522 done
523 exit $errstatus
524 ;;
525
526 mkshadow )
527 ##
528 ## mkshadow -- Make a shadow tree through symbolic links
529 ## Copyright (c) 1998-2001 Ralf S. Engelschall <rse@engelschall.com>
530 ## Originally written for Apache
531 ##
532
533 # source and destination directory
534 src=`echo "$1" | sed -e 's:/$::' -e 's:^\./\(.\):\1:'`
535 dst=`echo "$2" | sed -e 's:/$::' -e 's:^\./\(.\):\1:'`
536
537 # check whether source exists
538 if [ ! -d $src ]; then
539 echo "$msgprefix:Error: source directory not found: \`$src'" 1>&2
540 exit 1
541 fi
542
543 # determine if one of the paths is an absolute path,
544 # because then we have to use an absolute symlink
545 oneisabs=0
546 case $src in
547 /* ) oneisabs=1 ;;
548 esac
549 case $dst in
550 /* ) oneisabs=1 ;;
551 esac
552
553 # determine reverse directory for destination directory
554 dstrevdir=''
555 if [ $oneisabs = 0 ]; then
556 # derive reverse path from forward path
557 pwd=`pwd`
558 OIFS="$IFS"; IFS='/'
559 for pe in $dst; do
560 if [ "x$pe" = "x.." ]; then
561 OIFS2="$IFS"; IFS="$DIFS"
562 eval `echo "$pwd" |\
563 sed -e 's:\([^/]*\)$:; dir="\1":' \
564 -e 's:^\(.*\)/[^/]*;:pwd="\1";:'\
565 -e 's:^;:pwd="";:'`
566 dstrevdir="$dir/$dstrevdir"
567 IFS="$OIFS2"
568 else
569 dstrevdir="../$dstrevdir"
570 fi
571 done
572 IFS="$OIFS"
573 else
574 src="`cd $src; pwd`";
575 fi
576
577 # create directory tree at destination
578 if [ ! -d $dst ]; then
579 if [ ".$opt_t" = .yes ]; then
580 echo "mkdir $dst" 1>&2
581 fi
582 mkdir $dst
583 fi
584 if [ ".$opt_a" = .yes ]; then
585 DIRS=`cd $src; find . -type d -print |\
586 sed -e '/^\.$/d' -e 's:^\./::'`
587 else
588 DIRS=`cd $src; find . -type d -print |\
589 sed -e '/\/CVS/d' -e '/^\.$/d' -e 's:^\./::'`
590 fi
591 for dir in $DIRS; do
592 if [ ".$opt_t" = .yes ]; then
593 echo "mkdir $dst/$dir" 1>&2
594 fi
595 mkdir $dst/$dir
596 done
597
598 # fill directory tree with symlinks to files
599 if [ ".$opt_a" = .yes ]; then
600 FILES="`cd $src; find . -depth -print |\
601 sed -e 's/^\.\///'`"
602 else
603 FILES="`cd $src; find . -depth -print |\
604 sed -e '/\.o$/d' -e '/\.a$/d' -e '/\.so$/d' \
605 -e '/\.cvsignore$/d' -e '/\/CVS/d' \
606 -e '/\/\.#/d' -e '/\.orig$/d' \
607 -e 's/^\.\///'`"
608 fi
609 for file in $FILES; do
610 # don't use `-type f' above for find because of symlinks
611 if [ -d "$src/$file" ]; then
612 continue
613 fi
614 basename=`echo $file | sed -e 's:^.*/::'`
615 dir=`echo $file | sed -e 's:[^/]*$::' -e 's:/$::' -e 's:$:/:' -e 's:^/$::'`
616 from=`echo "$src/$file" | sed -e 's/^\.\///'`
617 to="$dst/$dir$basename"
618 if [ $oneisabs = 0 ]; then
619 if [ ".$dir" != . ]; then
620 subdir=`echo $dir | sed -e 's:/$::'`
621 # derive reverse path from forward path
622 revdir=''
623 OIFS="$IFS"; IFS='/'
624 for pe in $subdir; do
625 revdir="../$revdir"
626 done
627 IFS="$OIFS"
628 # finalize from
629 from="$revdir$from"
630 fi
631 from="$dstrevdir$from"
632 fi
633 if [ ".$opt_v" = .yes ]; then
634 echo " $to" 1>&2
635 fi
636 if [ ".$opt_t" = .yes ]; then
637 echo "ln -s $from $to" 1>&2
638 fi
639 ln -s $from $to
640 done
641 ;;
642
643 esac
644
645 exit 0
646
647 ##EOF##

Properties

Name Value
svn:executable *