source: trunk/kBuild/env.sh@ 1566

Last change on this file since 1566 was 1542, checked in by bird, 17 years ago

Fixed script rc.

  • Property svn:eol-style set to LF
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 17.7 KB
Line 
1#!/bin/sh
2# $Id: env.sh 1542 2008-04-22 01:20:45Z bird $
3## @file
4# Environment setup script.
5#
6
7#
8# Copyright (c) 2005-2008 knut st. osmundsen <bird-kBuild-spam@anduin.net>
9#
10# This file is part of kBuild.
11#
12# kBuild is free software; you can redistribute it and/or modify
13# it under the terms of the GNU General Public License as published by
14# the Free Software Foundation; either version 2 of the License, or
15# (at your option) any later version.
16#
17# kBuild is distributed in the hope that it will be useful,
18# but WITHOUT ANY WARRANTY; without even the implied warranty of
19# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20# GNU General Public License for more details.
21#
22# You should have received a copy of the GNU General Public License
23# along with kBuild; if not, write to the Free Software
24# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25#
26#
27#set -x
28
29#
30# Check if we're in eval mode or not.
31#
32ERR_REDIR=1
33DBG_REDIR=1
34EVAL_OPT=
35EVAL_EXPORT="export "
36DBG_OPT=
37QUIET_OPT=
38FULL_OPT=
39LEGACY_OPT="true"
40VAR_OPT=
41VALUE_ONLY_OPT=
42EXP_TYPE_OPT=
43while test $# -gt 0;
44do
45 case "$1" in
46 "--debug-script")
47 DBG_OPT="true"
48 ;;
49 "--no-debug-script")
50 DBG_OPT=
51 ;;
52 "--quiet")
53 QUIET_OPT="true"
54 ;;
55 "--verbose")
56 QUIET_OPT=
57 ;;
58 "--full")
59 FULL_OPT="true"
60 ;;
61 "--normal")
62 FULL_OPT=
63 ;;
64 "--legacy")
65 LEGACY_OPT="true"
66 ;;
67 "--no-legacy")
68 LEGACY_OPT=
69 ;;
70 "--eval")
71 EVAL_OPT="true"
72 ERR_REDIR=2
73 DBG_REDIR=2
74 ;;
75 "--set")
76 EVAL_OPT="true"
77 EVAL_EXPORT=""
78 ERR_REDIR=2
79 DBG_REDIR=2
80 ;;
81 "--var")
82 shift
83 VAR_OPT="${VAR_OPT} $1"
84 ERR_REDIR=2
85 DBG_REDIR=2
86 ;;
87 "--value-only")
88 VALUE_ONLY_OPT="true"
89 ;;
90 "--name-and-value")
91 VALUE_ONLY_OPT=
92 ;;
93 "--release")
94 EXP_TYPE_OPT=1
95 KBUILD_TYPE=release
96 BUILD_TYPE=
97 ;;
98 "--debug")
99 EXP_TYPE_OPT=1
100 KBUILD_TYPE=debug
101 BUILD_TYPE=
102 ;;
103 "--profile")
104 EXP_TYPE_OPT=1
105 KBUILD_TYPE=profile
106 BUILD_TYPE=
107 ;;
108
109 "--help")
110 echo "kBuild Environment Setup Script, v0.1.3"
111 echo ""
112 echo "syntax: $0 [options] [command [args]]"
113 echo " or: $0 [options] --var <varname>"
114 echo " or: $0 [options] --eval"
115 echo " or: $0 [options] --eval --var <varname>"
116 echo ""
117 echo "The first form will execute the command, or if no command is givne start"
118 echo "an interactive shell."
119 echo "The second form will print the specfified variable(s)."
120 echo "The third form will print all exported variables suitable for bourne shell"
121 echo "evalutation."
122 echo "The forth form will only print the specified variable(s)."
123 echo ""
124 echo "Options:"
125 echo " --debug, --release, --profile"
126 echo " Alternative way of specifying KBUILD_TYPE."
127 echo " --debug-script, --no-debug-script"
128 echo " Controls debug output. Default: --no-debug-script"
129 echo " --quiet, --verbose"
130 echo " Controls informational output. Default: --verbose"
131 echo " --full, --normal"
132 echo " Controls the variable set. Default: --normal"
133 echo " --legacy, --no-legacy"
134 echo " Include legacy variables in result. Default: --legacy"
135 echo " --value-only, --name-and-value"
136 echo " Controls what the result of a --var query. Default: --name-and-value"
137 echo " --set, --export"
138 echo " Whether --eval explicitly export the variables. --set is useful for"
139 echo " getting a list of environment vars for a commandline, while --eval"
140 echo " is useful for eval `env.sh`. Default: --export"
141 echo ""
142 exit 1
143 ;;
144 *)
145 break
146 ;;
147 esac
148 shift
149done
150
151
152#
153# Deal with legacy environment variables.
154#
155if test -n "$PATH_KBUILD"; then
156 if test -n "$KBUILD_PATH" -a "$KBUILD_PATH" != "$PATH_KBUILD"; then
157 echo "$0: error: KBUILD_PATH ($KBUILD_PATH) and PATH_KBUILD ($PATH_KBUILD) disagree." 1>&${ERR_REDIR}
158 sleep 1
159 exit 1
160 fi
161 KBUILD_PATH=$PATH_KBUILD
162fi
163if test -n "$PATH_KBUILD_BIN"; then
164 if test -n "$KBUILD_BIN_PATH" -a "$KBUILD_BIN_PATH" != "$PATH_KBUILD_BIN"; then
165 echo "$0: error: KBUILD_BIN_PATH ($KBUILD_BIN_PATH) and PATH_KBUILD_BIN ($PATH_KBUILD_BIN) disagree." 1>&${ERR_REDIR}
166 sleep 1
167 exit 1
168 fi
169 KBUILD_BIN_PATH=$PATH_KBUILD_BIN
170fi
171
172if test -n "$BUILD_TYPE"; then
173 if test -n "$KBUILD_TYPE" -a "$KBUILD_TYPE" != "$BUILD_TYPE"; then
174 echo "$0: error: KBUILD_TYPE ($KBUILD_TYPE) and BUILD_TYPE ($BUILD_TYPE) disagree." 1>&${ERR_REDIR}
175 sleep 1
176 exit 1
177 fi
178 KBUILD_TYPE=$BUILD_TYPE
179fi
180
181if test -n "$BUILD_PLATFORM"; then
182 if test -n "$KBUILD_HOST" -a "$KBUILD_HOST" != "$BUILD_PLATFORM"; then
183 echo "$0: error: KBUILD_HOST ($KBUILD_HOST) and BUILD_PLATFORM ($BUILD_PLATFORM) disagree." 1>&${ERR_REDIR}
184 sleep 1
185 exit 1
186 fi
187 KBUILD_HOST=$BUILD_PLATFORM
188fi
189if test -n "$BUILD_PLATFORM_ARCH"; then
190 if test -n "$KBUILD_HOST_ARCH" -a "$KBUILD_HOST_ARCH" != "$BUILD_PLATFORM_ARCH"; then
191 echo "$0: error: KBUILD_HOST_ARCH ($KBUILD_HOST_ARCH) and BUILD_PLATFORM_ARCH ($BUILD_PLATFORM_ARCH) disagree." 1>&${ERR_REDIR}
192 sleep 1
193 exit 1
194 fi
195 KBUILD_HOST_ARCH=$BUILD_PLATFORM_ARCH
196fi
197if test -n "$BUILD_PLATFORM_CPU"; then
198 if test -n "$KBUILD_HOST_CPU" -a "$KBUILD_HOST_CPU" != "$BUILD_PLATFORM_CPU"; then
199 echo "$0: error: KBUILD_HOST_CPU ($KBUILD_HOST_CPU) and BUILD_PLATFORM_CPU ($BUILD_PLATFORM_CPU) disagree." 1>&${ERR_REDIR}
200 sleep 1
201 exit 1
202 fi
203 KBUILD_HOST_CPU=$BUILD_PLATFORM_CPU
204fi
205
206if test -n "$BUILD_TARGET"; then
207 if test -n "$KBUILD_TARGET" -a "$KBUILD_TARGET" != "$BUILD_TARGET"; then
208 echo "$0: error: KBUILD_TARGET ($KBUILD_TARGET) and BUILD_TARGET ($BUILD_TARGET) disagree." 1>&${ERR_REDIR}
209 sleep 1
210 exit 1
211 fi
212 KBUILD_TARGET=$BUILD_TARGET
213fi
214if test -n "$BUILD_TARGET_ARCH"; then
215 if test -n "$KBUILD_TARGET_ARCH" -a "$KBUILD_TARGET_ARCH" != "$BUILD_TARGET_ARCH"; then
216 echo "$0: error: KBUILD_TARGET_ARCH ($KBUILD_TARGET_ARCH) and BUILD_TARGET_ARCH ($BUILD_TARGET_ARCH) disagree." 1>&${ERR_REDIR}
217 sleep 1
218 exit 1
219 fi
220 KBUILD_TARGET_ARCH=$BUILD_TARGET_ARCH
221fi
222if test -n "$BUILD_TARGET_CPU"; then
223 if test -n "$KBUILD_TARGET_CPU" -a "$KBUILD_TARGET_CPU" != "$BUILD_TARGET_CPU"; then
224 echo "$0: error: KBUILD_TARGET_CPU ($KBUILD_TARGET_CPU) and BUILD_TARGET_CPU ($BUILD_TARGET_CPU) disagree." 1>&${ERR_REDIR}
225 sleep 1
226 exit 1
227 fi
228 KBUILD_TARGET_CPU=$BUILD_TARGET_CPU
229fi
230
231
232#
233# Set default build type.
234#
235if test -z "$KBUILD_TYPE"; then
236 KBUILD_TYPE=release
237fi
238test -n "$DBG_OPT" && echo "dbg: KBUILD_TYPE=$KBUILD_TYPE" 1>&${DBG_REDIR}
239
240#
241# Determin the host platform.
242#
243# The CPU isn't important, only the other two are. But, since the cpu,
244# arch and platform (and build type) share a common key space, try make
245# sure any new additions are unique. (See header.kmk, KBUILD_OSES/ARCHES.)
246#
247if test -z "$KBUILD_HOST"; then
248 KBUILD_HOST=`uname`
249 case "$KBUILD_HOST" in
250 linux|Linux|GNU/Linux|LINUX)
251 KBUILD_HOST=linux
252 ;;
253
254 os2|OS/2|OS2)
255 KBUILD_HOST=os2
256 ;;
257
258 freebsd|FreeBSD|FREEBSD)
259 KBUILD_HOST=freebsd
260 ;;
261
262 openbsd|OpenBSD|OPENBSD)
263 KBUILD_HOST=openbsd
264 ;;
265
266 netbsd|NetBSD|NETBSD)
267 KBUILD_HOST=netbsd
268 ;;
269
270 Darwin|darwin)
271 KBUILD_HOST=darwin
272 ;;
273
274 SunOS)
275 KBUILD_HOST=solaris
276 ;;
277
278 WindowsNT|CYGWIN_NT-*)
279 KBUILD_HOST=win
280 ;;
281
282 *)
283 echo "$0: unknown os $KBUILD_HOST" 1>&${ERR_REDIR}
284 sleep 1
285 exit 1
286 ;;
287 esac
288fi
289test -n "$DBG_OPT" && echo "dbg: KBUILD_HOST=$KBUILD_HOST" 1>&${DBG_REDIR}
290
291if test -z "$KBUILD_HOST_ARCH"; then
292 # Try deduce it from the cpu if given.
293 if test -n "$KBUILD_HOST_CPU"; then
294 case "$KBUILD_HOST_CPU" in
295 i[3456789]86)
296 KBUILD_HOST_ARCH='x86'
297 ;;
298 k8|k8l|k9|k10)
299 KBUILD_HOST_ARCH='amd64'
300 ;;
301 esac
302 fi
303fi
304if test -z "$KBUILD_HOST_ARCH"; then
305 # Use uname -m or isainfo (lots of guesses here, please help clean this up...)
306 if test "$KBUILD_HOST" = "solaris"; then
307 KBUILD_HOST_ARCH=`isainfo | cut -f 1 -d ' '`
308
309 else
310 KBUILD_HOST_ARCH=`uname -m`
311 fi
312 case "$KBUILD_HOST_ARCH" in
313 x86_64|AMD64|amd64|k8|k8l|k9|k10)
314 KBUILD_HOST_ARCH='amd64'
315 ;;
316 x86|i86pc|ia32|i[3456789]86)
317 KBUILD_HOST_ARCH='x86'
318 ;;
319 sparc32|sparc)
320 KBUILD_HOST_ARCH='sparc32'
321 ;;
322 sparc64)
323 KBUILD_HOST_ARCH='sparc64'
324 ;;
325 s390)
326 KBUILD_HOST_ARCH='s390'
327 ;;
328 s390x)
329 KBUILD_HOST_ARCH='s390x'
330 ;;
331 ppc32|ppc|powerpc)
332 KBUILD_HOST_ARCH='ppc32'
333 ;;
334 ppc64|powerpc64)
335 KBUILD_HOST_ARCH='ppc64'
336 ;;
337 mips32|mips)
338 KBUILD_HOST_ARCH='mips32'
339 ;;
340 mips64)
341 KBUILD_HOST_ARCH='mips64'
342 ;;
343 ia64)
344 KBUILD_HOST_ARCH='ia64'
345 ;;
346 #hppa32|hppa|parisc32|parisc)?
347 hppa32|parisc32)
348 KBUILD_HOST_ARCH='hppa32'
349 ;;
350 hppa64|parisc64)
351 KBUILD_HOST_ARCH='hppa64'
352 ;;
353 arm|armv4l|armv5tel)
354 KBUILD_HOST_ARCH='arm'
355 ;;
356 alpha)
357 KBUILD_HOST_ARCH='alpha'
358 ;;
359
360 *) echo "$0: unknown cpu/arch - $KBUILD_HOST_ARCH" 1>&${ERR_REDIR}
361 sleep 1
362 exit 1
363 ;;
364 esac
365
366fi
367test -n "$DBG_OPT" && echo "dbg: KBUILD_HOST_ARCH=$KBUILD_HOST_ARCH" 1>&${DBG_REDIR}
368
369if test -z "$KBUILD_HOST_CPU"; then
370 KBUILD_HOST_CPU="blend"
371fi
372test -n "$DBG_OPT" && echo "dbg: KBUILD_HOST_CPU=$KBUILD_HOST_CPU" 1>&${DBG_REDIR}
373
374#
375# The target platform.
376# Defaults to the host when not specified.
377#
378if test -z "$KBUILD_TARGET"; then
379 KBUILD_TARGET="$KBUILD_HOST"
380fi
381test -n "$DBG_OPT" && echo "dbg: KBUILD_TARGET=$KBUILD_TARGET" 1>&${DBG_REDIR}
382
383if test -z "$KBUILD_TARGET_ARCH"; then
384 KBUILD_TARGET_ARCH="$KBUILD_HOST_ARCH"
385fi
386test -n "$DBG_OPT" && echo "dbg: KBUILD_TARGET_ARCH=$KBUILD_TARGET_ARCH" 1>&${DBG_REDIR}
387
388if test -z "$KBUILD_TARGET_CPU"; then
389 if test "$KBUILD_TARGET_ARCH" = "$KBUILD_HOST_ARCH"; then
390 KBUILD_TARGET_CPU="$KBUILD_HOST_CPU"
391 else
392 KBUILD_TARGET_CPU="blend"
393 fi
394fi
395test -n "$DBG_OPT" && echo "dbg: KBUILD_TARGET_CPU=$KBUILD_TARGET_CPU" 1>&${DBG_REDIR}
396
397#
398# Determin executable extension and path separator.
399#
400_SUFF_EXE=
401_PATH_SEP=":"
402case "$KBUILD_HOST" in
403 os2|win|nt)
404 _SUFF_EXE=".exe"
405 _PATH_SEP=";"
406 ;;
407esac
408
409#
410# Determin KBUILD_PATH from the script location and calc KBUILD_BIN_PATH from there.
411#
412if test -z "$KBUILD_PATH"; then
413 KBUILD_PATH=`dirname "$0"`
414 KBUILD_PATH=`cd "$KBUILD_PATH" ; /bin/pwd`
415fi
416if test ! -f "$KBUILD_PATH/footer.kmk" -o ! -f "$KBUILD_PATH/header.kmk" -o ! -f "$KBUILD_PATH/rules.kmk"; then
417 echo "$0: error: KBUILD_PATH ($KBUILD_PATH) is not pointing to a popluated kBuild directory." 1>&${ERR_REDIR}
418 sleep 1
419 exit 1
420fi
421test -n "$DBG_OPT" && echo "dbg: KBUILD_PATH=$KBUILD_PATH" 1>&${DBG_REDIR}
422
423if test -z "$KBUILD_BIN_PATH"; then
424 KBUILD_BIN_PATH="${KBUILD_PATH}/bin/${KBUILD_HOST}.${KBUILD_HOST_ARCH}"
425fi
426test -n "$DBG_OPT" && echo "dbg: KBUILD_BIN_PATH=${KBUILD_BIN_PATH}" 1>&${DBG_REDIR}
427
428#
429# Make shell - OS/2 only.
430# Remove this!
431#
432if test "$KBUILD_HOST" = "os2"; then
433 export MAKESHELL="${KBUILD_BIN_PATH}/kmk_ash${_SUFF_EXE}";
434fi
435
436#
437# Add the bin/x.y/ directory to the PATH.
438# NOTE! Once bootstrapped this is the only thing that is actually necessary.
439#
440PATH="${KBUILD_BIN_PATH}${_PATH_SEP}$PATH"
441test -n "$DBG_OPT" && echo "dbg: PATH=$PATH" 1>&${DBG_REDIR}
442
443#
444# Sanity and x bits.
445#
446if test ! -d "${KBUILD_BIN_PATH}/"; then
447 echo "$0: warning: The bin directory for this platform doesn't exist. (${KBUILD_BIN_PATH}/)" 1>&${ERR_REDIR}
448else
449 for prog in kmk kDepPre kDepIDB kmk_append kmk_ash kmk_cat kmk_cp kmk_echo kmk_install kmk_ln kmk_mkdir kmk_mv kmk_rm kmk_rmdir kmk_sed;
450 do
451 chmod a+x ${KBUILD_BIN_PATH}/${prog} > /dev/null 2>&1
452 if test ! -f "${KBUILD_BIN_PATH}/${prog}${_SUFF_EXE}"; then
453 echo "$0: warning: The ${prog} program doesn't exist for this platform. (${KBUILD_BIN_PATH}/${prog}${_SUFF_EXE})" 1>&${ERR_REDIR}
454 fi
455 done
456fi
457
458#
459# The environment is in place, now take the requested action.
460#
461MY_RC=0
462if test -n "${VAR_OPT}"; then
463 # Echo variable values or variable export statements.
464 for var in ${VAR_OPT};
465 do
466 val=
467 case "$var" in
468 PATH)
469 val=$PATH
470 ;;
471 KBUILD_PATH)
472 val=$KBUILD_PATH
473 ;;
474 KBUILD_BIN_PATH)
475 val=$KBUILD_BIN_PATH
476 ;;
477 KBUILD_HOST)
478 val=$KBUILD_HOST
479 ;;
480 KBUILD_HOST_ARCH)
481 val=$KBUILD_HOST_ARCH
482 ;;
483 KBUILD_HOST_CPU)
484 val=$KBUILD_HOST_CPU
485 ;;
486 KBUILD_TARGET)
487 val=$KBUILD_TARGET
488 ;;
489 KBUILD_TARGET_ARCH)
490 val=$KBUILD_TARGET_ARCH
491 ;;
492 KBUILD_TARGET_CPU)
493 val=$KBUILD_TARGET_CPU
494 ;;
495 KBUILD_TYPE)
496 val=$KBUILD_TYPE
497 ;;
498 *)
499 echo "$0: error: Unknown variable $var specified in --var request." 1>&${ERR_REDIR}
500 sleep 1
501 exit 1
502 ;;
503 esac
504
505 if test -n "$EVAL_OPT"; then
506 echo "${EVAL_EXPORT} $var=$val"
507 else
508 if test -n "$VALUE_ONLY_OPT"; then
509 echo "$val"
510 else
511 echo "$var=$val"
512 fi
513 fi
514 done
515else
516 if test -n "$EVAL_OPT"; then
517 # Echo statements for the shell to evaluate.
518 test -n "$DBG_OPT" && echo "dbg: echoing exported variables" 1>&${DBG_REDIR}
519 echo "${EVAL_EXPORT} PATH=${PATH}"
520 test -n "${FULL_OPT}" -o "${EXP_TYPE_OPT}" && echo "${EVAL_EXPORT} KBUILD_TYPE=${KBUILD_TYPE}"
521 if test -n "${FULL_OPT}"; then
522 echo "${EVAL_EXPORT} KBUILD_PATH=${KBUILD_PATH}"
523 echo "${EVAL_EXPORT} KBUILD_HOST=${KBUILD_HOST}"
524 echo "${EVAL_EXPORT} KBUILD_HOST_ARCH=${KBUILD_HOST_ARCH}"
525 echo "${EVAL_EXPORT} KBUILD_HOST_CPU=${KBUILD_HOST_CPU}"
526 echo "${EVAL_EXPORT} KBUILD_TARGET=${KBUILD_TARGET}"
527 echo "${EVAL_EXPORT} KBUILD_TARGET_ARCH=${KBUILD_TARGET_ARCH}"
528 echo "${EVAL_EXPORT} KBUILD_TARGET_CPU=${KBUILD_TARGET_CPU}"
529
530 if test -n "${LEGACY_OPT}"; then
531 echo "${EVAL_EXPORT} PATH_KBUILD=${KBUILD_PATH}"
532 echo "${EVAL_EXPORT} BUILD_TYPE=${KBUILD_TYPE}"
533 echo "${EVAL_EXPORT} BUILD_PLATFORM=${KBUILD_HOST}"
534 echo "${EVAL_EXPORT} BUILD_PLATFORM_ARCH=${KBUILD_HOST_ARCH}"
535 echo "${EVAL_EXPORT} BUILD_PLATFORM_CPU=${KBUILD_HOST_CPU}"
536 echo "${EVAL_EXPORT} BUILD_TARGET=${KBUILD_TARGET}"
537 echo "${EVAL_EXPORT} BUILD_TARGET_ARCH=${KBUILD_TARGET_ARCH}"
538 echo "${EVAL_EXPORT} BUILD_TARGET_CPU=${KBUILD_TARGET_CPU}"
539 fi
540 fi
541 else
542 # Export variables.
543 export PATH
544 test -n "${FULL_OPT}" -o "${EXP_TYPE_OPT}" && export KBUILD_TYPE
545 if test -n "${FULL_OPT}"; then
546 export KBUILD_PATH
547 export KBUILD_HOST
548 export KBUILD_HOST_ARCH
549 export KBUILD_HOST_CPU
550 export KBUILD_TARGET
551 export KBUILD_TARGET_ARCH
552 export KBUILD_TARGET_CPU
553
554 if test -n "${LEGACY_OPT}"; then
555 export PATH_KBUILD=$KBUILD_PATH
556 export BUILD_TYPE=$KBUILD_TYPE
557 export BUILD_PLATFORM=$KBUILD_HOST
558 export BUILD_PLATFORM_ARCH=$KBUILD_HOST_ARCH
559 export BUILD_PLATFORM_CPU=$KBUILD_HOST_CPU
560 export BUILD_TARGET=$KBUILD_TARGET
561 export BUILD_TARGET_ARCH=$KBUILD_TARGET_ARCH
562 export BUILD_TARGET_CPU=$KBUILD_TARGET_CPU
563 fi
564 fi
565
566 # Execute command or spawn shell.
567 if test $# -eq 0; then
568 test -z "${QUIET_OPT}" && echo "$0: info: Spawning work shell..." 1>&${ERR_REDIR}
569 if test "$TERM" != 'dumb' -a -n "$BASH"; then
570 export PS1='\[\033[01;32m\]\u@\h \[\033[01;34m\]\W \$ \[\033[00m\]'
571 fi
572 $SHELL -i
573 MY_RC=$?
574 else
575 test -z "${QUIET_OPT}" && echo "$0: info: Executing command: $*" 1>&${ERR_REDIR}
576 $*
577 MY_RC=$?
578 test -z "${QUIET_OPT}" -a "$MY_RC" -ne 0 && echo "$0: info: rc=$MY_RC: $*" 1>&${ERR_REDIR}
579 fi
580 fi
581fi
582test -n "$DBG_OPT" && echo "dbg: finished (rc=$MY_RC)" 1>&${DBG_REDIR}
583exit $MY_RC
584
Note: See TracBrowser for help on using the repository browser.