/[gentoo-x86]/eclass/multilib.eclass
Gentoo

Diff of /eclass/multilib.eclass

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

Revision 1.54 Revision 1.65
1# Copyright 1999-2004 Gentoo Foundation 1# Copyright 1999-2008 Gentoo Foundation
2# Distributed under the terms of the GNU General Public License v2 2# Distributed under the terms of the GNU General Public License v2
3# $Header: /var/cvsroot/gentoo-x86/eclass/multilib.eclass,v 1.54 2006/07/12 07:40:49 kevquinn Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/multilib.eclass,v 1.65 2008/06/01 01:37:29 vapier Exp $
4# 4
5# Author: Jeremy Huddleston <eradicator@gentoo.org> 5# @ECLASS: multilib.eclass
6# 6# @MAINTAINER:
7# amd64@gentoo.org
8# toolchain@gentoo.org
9# @BLURB: This eclass is for all functions pertaining to handling multilib configurations.
10# @DESCRIPTION:
7# This eclass is for all functions pertaining to handling multilib. 11# This eclass is for all functions pertaining to handling multilib configurations.
8# configurations.
9 12
10DESCRIPTION="Based on the ${ECLASS} eclass" 13___ECLASS_RECUR_MULTILIB="yes"
11 14[[ -z ${___ECLASS_RECUR_TOOLCHAIN_FUNCS} ]] && inherit toolchain-funcs
12# has_multilib_profile:
13# Return true if the current profile is a multilib profile and lists more than
14# one abi in ${MULTILIB_ABIS}. You might want to use this like
15# 'use multilib || has_multilib_profile' until all profiles utilizing the
16# 'multilib' use flag are removed from portage
17 15
18# is_final_abi: 16# is_final_abi:
19# Return true if ${ABI} is the final abi to be installed (and thus we are 17# Return true if ${ABI} is the final abi to be installed (and thus we are
20# on our last run through a src_* function. 18# on our last run through a src_* function.
21 19
102export CTARGET_default=${CTARGET_default:-${CTARGET:-${CHOST_default}}} 100export CTARGET_default=${CTARGET_default:-${CTARGET:-${CHOST_default}}}
103export LIBDIR_default=${CONF_LIBDIR:-"lib"} 101export LIBDIR_default=${CONF_LIBDIR:-"lib"}
104export CDEFINE_default="__unix__" 102export CDEFINE_default="__unix__"
105export KERNEL_ABI=${KERNEL_ABI:-${DEFAULT_ABI}} 103export KERNEL_ABI=${KERNEL_ABI:-${DEFAULT_ABI}}
106 104
107# has_multilib_profile() 105# @FUNCTION: has_multilib_profile
106# @DESCRIPTION:
107# Return true if the current profile is a multilib profile and lists more than
108# one abi in ${MULTILIB_ABIS}. When has_multilib_profile returns true, that
109# profile should enable the 'multilib' use flag. This is so you can DEPEND on
110# a package only for multilib or not multilib.
108has_multilib_profile() { 111has_multilib_profile() {
109 [ -n "${MULTILIB_ABIS}" -a "${MULTILIB_ABIS}" != "${MULTILIB_ABIS/ /}" ] 112 [ -n "${MULTILIB_ABIS}" -a "${MULTILIB_ABIS}" != "${MULTILIB_ABIS/ /}" ]
110} 113}
111 114
115# @FUNCTION: get_libdir
116# @RETURN: the libdir for the selected ABI
117# @DESCRIPTION:
112# This function simply returns the desired lib directory. With portage 118# This function simply returns the desired lib directory. With portage
113# 2.0.51, we now have support for installing libraries to lib32/lib64 119# 2.0.51, we now have support for installing libraries to lib32/lib64
114# to accomidate the needs of multilib systems. It's no longer a good idea 120# to accomidate the needs of multilib systems. It's no longer a good idea
115# to assume all libraries will end up in lib. Replace any (sane) instances 121# to assume all libraries will end up in lib. Replace any (sane) instances
116# where lib is named directly with $(get_libdir) if possible. 122# where lib is named directly with $(get_libdir) if possible.
117#
118# Travis Tilley <lv@gentoo.org> (24 Aug 2004)
119# 123#
120# Jeremy Huddleston <eradicator@gentoo.org> (23 Dec 2004): 124# Jeremy Huddleston <eradicator@gentoo.org> (23 Dec 2004):
121# Added support for ${ABI} and ${DEFAULT_ABI}. If they're both not set, 125# Added support for ${ABI} and ${DEFAULT_ABI}. If they're both not set,
122# fall back on old behavior. Any profile that has these set should also 126# fall back on old behavior. Any profile that has these set should also
123# depend on a newer version of portage (not yet released) which uses these 127# depend on a newer version of portage (not yet released) which uses these
130 else 134 else
131 get_abi_LIBDIR 135 get_abi_LIBDIR
132 fi 136 fi
133} 137}
134 138
139# @FUNCTION: get_multilibdir
140# @RETURN: Returns the multilibdir
135get_multilibdir() { 141get_multilibdir() {
136 if has_multilib_profile; then 142 if has_multilib_profile; then
137 eerror "get_multilibdir called, but it shouldn't be needed with the new multilib approach. Please file a bug at http://bugs.gentoo.org and assign it to eradicator@gentoo.org" 143 eerror "get_multilibdir called, but it shouldn't be needed with the new multilib approach. Please file a bug at http://bugs.gentoo.org and assign it to eradicator@gentoo.org"
138 exit 1 144 exit 1
139 fi 145 fi
140 echo ${CONF_MULTILIBDIR:=lib32} 146 echo ${CONF_MULTILIBDIR:=lib32}
141} 147}
142 148
149# @FUNCTION: get_libdir_override
150# @DESCRIPTION:
143# Sometimes you need to override the value returned by get_libdir. A good 151# Sometimes you need to override the value returned by get_libdir. A good
144# example of this is xorg-x11, where lib32 isnt a supported configuration, 152# example of this is xorg-x11, where lib32 isnt a supported configuration,
145# and where lib64 -must- be used on amd64 (for applications that need lib 153# and where lib64 -must- be used on amd64 (for applications that need lib
146# to be 32bit, such as adobe acrobat). Note that this override also bypasses 154# to be 32bit, such as adobe acrobat). Note that this override also bypasses
147# portage version sanity checking. 155# portage version sanity checking.
148# get_libdir_override expects one argument, the result get_libdir should 156# get_libdir_override expects one argument, the result get_libdir should
149# return: 157# return:
150# 158#
151# get_libdir_override lib64 159# get_libdir_override lib64
152#
153# Travis Tilley <lv@gentoo.org> (31 Aug 2004)
154get_libdir_override() { 160get_libdir_override() {
155 if has_multilib_profile; then 161 if has_multilib_profile; then
156 eerror "get_libdir_override called, but it shouldn't be needed with the new multilib approach. Please file a bug at http://bugs.gentoo.org and assign it to eradicator@gentoo.org" 162 eerror "get_libdir_override called, but it shouldn't be needed with the new multilib approach. Please file a bug at http://bugs.gentoo.org and assign it to eradicator@gentoo.org"
157 exit 1 163 exit 1
158 fi 164 fi
159 CONF_LIBDIR="$1" 165 CONF_LIBDIR="$1"
160 CONF_LIBDIR_OVERRIDE="$1" 166 CONF_LIBDIR_OVERRIDE="$1"
161 LIBDIR_default="$1" 167 LIBDIR_default="$1"
162} 168}
163 169
164# get_abi_var <VAR> [<ABI>] 170# @FUNCTION: get_abi_var
171# @USAGE: <VAR> [ABI]
165# returns the value of ${<VAR>_<ABI>} which should be set in make.defaults 172# @RETURN: returns the value of ${<VAR>_<ABI>} which should be set in make.defaults
166# 173# @DESCRIPTION:
167# ex: 174# ex:
168# CFLAGS=$(get_abi_var CFLAGS sparc32) # CFLAGS=-m32 175# CFLAGS=$(get_abi_var CFLAGS sparc32) # CFLAGS=-m32
169# 176#
170# Note that the prefered method is to set CC="$(tc-getCC) $(get_abi_CFLAGS)" 177# Note that the prefered method is to set CC="$(tc-getCC) $(get_abi_CFLAGS)"
171# This will hopefully be added to portage soon... 178# This will hopefully be added to portage soon...
172# 179#
173# If <ABI> is not specified, ${ABI} is used. 180# If <ABI> is not specified, ${ABI} is used.
174# If <ABI> is not specified and ${ABI} is not defined, ${DEFAULT_ABI} is used. 181# If <ABI> is not specified and ${ABI} is not defined, ${DEFAULT_ABI} is used.
175# If <ABI> is not specified and ${ABI} and ${DEFAULT_ABI} are not defined, we return an empty string. 182# If <ABI> is not specified and ${ABI} and ${DEFAULT_ABI} are not defined, we return an empty string.
176#
177# Jeremy Huddleston <eradicator@gentoo.org>
178get_abi_var() { 183get_abi_var() {
179 local flag=$1 184 local flag=$1
180 local abi 185 local abi
181 if [ $# -gt 1 ]; then 186 if [ $# -gt 1 ]; then
182 abi=${2} 187 abi=${2}
190 195
191 local var="${flag}_${abi}" 196 local var="${flag}_${abi}"
192 echo ${!var} 197 echo ${!var}
193} 198}
194 199
200# @FUNCTION: get_abi_CFLAGS
201# @USAGE: [ABI]
202# @DESCRIPTION:
203# Alias for 'get_abi_var CFLAGS'
195get_abi_CFLAGS() { get_abi_var CFLAGS "$@"; } 204get_abi_CFLAGS() { get_abi_var CFLAGS "$@"; }
205
206# @FUNCTION: get_abi_ASFLAGS
207# @USAGE: [ABI]
208# @DESCRIPTION:
209# Alias for 'get_abi_var ASFLAGS'
196get_abi_ASFLAGS() { get_abi_var ASFLAGS "$@"; } 210get_abi_ASFLAGS() { get_abi_var ASFLAGS "$@"; }
211
212# @FUNCTION: get_abi_LDFLAGS
213# @USAGE: [ABI]
214# @DESCRIPTION:
215# Alias for 'get_abi_var LDFLAGS'
197get_abi_LDFLAGS() { get_abi_var LDFLAGS "$@"; } 216get_abi_LDFLAGS() { get_abi_var LDFLAGS "$@"; }
217
218# @FUNCTION: get_abi_CHOST
219# @USAGE: [ABI]
220# @DESCRIPTION:
221# Alias for 'get_abi_var CHOST'
198get_abi_CHOST() { get_abi_var CHOST "$@"; } 222get_abi_CHOST() { get_abi_var CHOST "$@"; }
223
224# @FUNCTION: get_abi_CTARGET
225# @USAGE: [ABI]
226# @DESCRIPTION:
227# Alias for 'get_abi_var CTARGET'
199get_abi_CTARGET() { get_abi_var CTARGET "$@"; } 228get_abi_CTARGET() { get_abi_var CTARGET "$@"; }
229
230# @FUNCTION: get_abi_FAKE_TARGETS
231# @USAGE: [ABI]
232# @DESCRIPTION:
233# Alias for 'get_abi_var FAKE_TARGETS'
200get_abi_FAKE_TARGETS() { get_abi_var FAKE_TARGETS "$@"; } 234get_abi_FAKE_TARGETS() { get_abi_var FAKE_TARGETS "$@"; }
235
236# @FUNCTION: get_abi_CDEFINE
237# @USAGE: [ABI]
238# @DESCRIPTION:
239# Alias for 'get_abi_var CDEFINE'
201get_abi_CDEFINE() { get_abi_var CDEFINE "$@"; } 240get_abi_CDEFINE() { get_abi_var CDEFINE "$@"; }
241
242# @FUNCTION: get_abi_LIBDIR
243# @USAGE: [ABI]
244# @DESCRIPTION:
245# Alias for 'get_abi_var LIBDIR'
202get_abi_LIBDIR() { get_abi_var LIBDIR "$@"; } 246get_abi_LIBDIR() { get_abi_var LIBDIR "$@"; }
203 247
248# @FUNCTION: get_install_abis
249# @DESCRIPTION:
204# Return a list of the ABIs we want to install for with 250# Return a list of the ABIs we want to install for with
205# the last one in the list being the default. 251# the last one in the list being the default.
206get_install_abis() { 252get_install_abis() {
207 local order="" 253 local order=""
208 254
209 if [[ -z ${MULTILIB_ABIS} ]] ; then 255 if [[ -z ${MULTILIB_ABIS} ]] ; then
210 echo "default" 256 echo "default"
211 return 0 257 return 0
212 fi 258 fi
213 259
214 if hasq multilib-pkg-force ${RESTRICT} || 260 if [[ ${EMULTILIB_PKG} == "true" ]] ; then
215 { hasq multilib-pkg ${FEATURES} && hasq multilib-pkg ${RESTRICT}; }; then
216 for x in ${MULTILIB_ABIS} ; do 261 for x in ${MULTILIB_ABIS} ; do
217 if [[ ${x} != "${DEFAULT_ABI}" ]] ; then 262 if [[ ${x} != "${DEFAULT_ABI}" ]] ; then
218 hasq ${x} ${ABI_DENY} || ordera="${ordera} ${x}" 263 hasq ${x} ${ABI_DENY} || ordera="${ordera} ${x}"
219 fi 264 fi
220 done 265 done
239 284
240 echo ${order} 285 echo ${order}
241 return 0 286 return 0
242} 287}
243 288
289# @FUNCTION: get_all_abis
290# @DESCRIPTION:
244# Return a list of the ABIs supported by this profile. 291# Return a list of the ABIs supported by this profile.
245# the last one in the list being the default. 292# the last one in the list being the default.
246get_all_abis() { 293get_all_abis() {
247 local order="" 294 local order=""
248 295
260 307
261 echo ${order} 308 echo ${order}
262 return 0 309 return 0
263} 310}
264 311
265# get_all_libdirs() 312# @FUNCTION: get_all_libdirs
313# @DESCRIPTION:
266# Returns a list of all the libdirs used by this profile. This includes 314# Returns a list of all the libdirs used by this profile. This includes
267# those that might not be touched by the current ebuild. 315# those that might not be touched by the current ebuild and always includes
316# "lib".
268get_all_libdirs() { 317get_all_libdirs() {
269 local libdirs="lib" 318 local libdirs="lib"
270 local abi 319 local abi
271 local dir 320 local dir
272 321
273 # Remove when amd64's 2004.3 is purged.
274 if [[ -n "${CONF_LIBDIR}" ]]; then
275 for dir in ${CONF_LIBDIR} ${CONF_MULTILIBDIR:-lib32}; do
276 [ "${dir}" != "lib" ] && libdirs="${libdirs} ${dir}"
277 done
278 else
279 for abi in ${MULTILIB_ABIS}; do 322 for abi in ${MULTILIB_ABIS}; do
280 [ "$(get_abi_LIBDIR ${abi})" != "lib" ] && libdirs="${libdirs} $(get_abi_LIBDIR ${abi})" 323 [ "$(get_abi_LIBDIR ${abi})" != "lib" ] && libdirs="${libdirs} $(get_abi_LIBDIR ${abi})"
281 done 324 done
282 fi
283 325
284 echo "${libdirs}" 326 echo "${libdirs}"
285} 327}
286 328
329# @FUNCTION: is_final_abi
330# @DESCRIPTION:
287# Return true if ${ABI} is the last ABI on our list (or if we're not 331# Return true if ${ABI} is the last ABI on our list (or if we're not
288# using the new multilib configuration. This can be used to determine 332# using the new multilib configuration. This can be used to determine
289# if we're in the last (or only) run through src_{unpack,compile,install} 333# if we're in the last (or only) run through src_{unpack,compile,install}
290is_final_abi() { 334is_final_abi() {
291 has_multilib_profile || return 0 335 has_multilib_profile || return 0
292 local ALL_ABIS=$(get_install_abis) 336 local ALL_ABIS=$(get_install_abis)
293 local LAST_ABI=${ALL_ABIS/* /} 337 local LAST_ABI=${ALL_ABIS/* /}
294 [[ ${LAST_ABI} == ${ABI} ]] 338 [[ ${LAST_ABI} == ${ABI} ]]
295} 339}
296 340
341# @FUNCTION: number_abis
342# @DESCRIPTION:
297# echo the number of ABIs we will be installing for 343# echo the number of ABIs we will be installing for
298number_abis() { 344number_abis() {
299 get_install_abis | wc -w 345 get_install_abis | wc -w
300} 346}
301 347
302# get_ml_incdir [<include dir> [<ABI>]] 348# @FUNCTION: get_ml_incdir
349# @USAGE: [include_dir] [ABI]
350# @DESCRIPTION:
303# include dir defaults to /usr/include 351# include dir defaults to /usr/include
304# ABI defaults to ${ABI} or ${DEFAULT_ABI} 352# ABI defaults to ${ABI} or ${DEFAULT_ABI}
353#
354# If a multilib include dir is associated with the passed include dir, then
355# we return it, otherwise, we just echo back the include dir. This is
356# neccessary when a built script greps header files rather than testing them
357# via #include (like perl) to figure out features.
305get_ml_incdir() { 358get_ml_incdir() {
306 local dir=/usr/include 359 local dir=/usr/include
307 360
308 if [[ $# -gt 0 ]]; then 361 if [[ $# -gt 0 ]]; then
309 incdir=$1 362 incdir=$1
326 else 379 else
327 echo ${dir} 380 echo ${dir}
328 fi 381 fi
329} 382}
330 383
331# prep_ml_includes: 384# @FUNCTION: prep_ml_includes
332# 385# @DESCRIPTION:
333# Some includes (include/asm, glibc, etc) are ABI dependent. In this case, 386# Some includes (include/asm, glibc, etc) are ABI dependent. In this case,
334# We can install them in different locations for each ABI and create a common 387# We can install them in different locations for each ABI and create a common
335# header which includes the right one based on CDEFINE_${ABI}. If your 388# header which includes the right one based on CDEFINE_${ABI}. If your
336# package installs ABI-specific headers, just add 'prep_ml_includes' to the 389# package installs ABI-specific headers, just add 'prep_ml_includes' to the
337# end of your src_install(). It takes a list of directories that include 390# end of your src_install(). It takes a list of directories that include
338# files are installed in (default is /usr/include if none are passed). 391# files are installed in (default is /usr/include if none are passed).
339# 392#
340# Example: 393# Example:
341# src_install() { 394# src_install() {
342# ... 395# ...
343# prep_ml_includes /usr/qt/3/include 396# prep_ml_includes /usr/qt/3/include
344# } 397# }
345
346prep_ml_includes() { 398prep_ml_includes() {
347 if [[ $(number_abis) -gt 1 ]] ; then 399 if [[ $(number_abis) -gt 1 ]] ; then
348 local dir 400 local dir
349 local dirs 401 local dirs
350 local base 402 local base
381 done 433 done
382 fi 434 fi
383 fi 435 fi
384} 436}
385 437
438# @FUNCTION: create_ml_includes
439# @USAGE: <include_dir> <symbol_1>:<dir_1> [<symbol_2>:<dir_2>...]
440# @DESCRIPTION:
386# If you need more control than prep_ml_includes can offer (like linux-headers 441# If you need more control than prep_ml_includes can offer (like linux-headers
387# for the asm-* dirs, then use create_ml_includes. The firs argument is the 442# for the asm-* dirs, then use create_ml_includes. The firs argument is the
388# common dir. The remaining args are of the form <symbol>:<dir> where 443# common dir. The remaining args are of the form <symbol>:<dir> where
389# <symbol> is what is put in the #ifdef for choosing that dir. 444# <symbol> is what is put in the #ifdef for choosing that dir.
390# 445#
391# Ideas for this code came from debian's sparc-linux headers package. 446# Ideas for this code came from debian's sparc-linux headers package.
392# 447#
393# Example: 448# Example:
394# create_ml_includes /usr/include/asm __sparc__:/usr/include/asm-sparc __sparc64__:/usr/include/asm-sparc64 449# create_ml_includes /usr/include/asm __sparc__:/usr/include/asm-sparc __sparc64__:/usr/include/asm-sparc64
395# create_ml_includes /usr/include/asm __i386__:/usr/include/asm-i386 __x86_64__:/usr/include/asm-x86_64 450# create_ml_includes /usr/include/asm __i386__:/usr/include/asm-i386 __x86_64__:/usr/include/asm-x86_64
396# 451#
397# Warning: Be careful with the ordering here. The default ABI has to be the 452# Warning: Be careful with the ordering here. The default ABI has to be the
398# last, because it is always defined (by GCC) 453# last, because it is always defined (by GCC)
399create_ml_includes() { 454create_ml_includes() {
400 local dest=$1 455 local dest=$1
536 echo "Shouldn't be here -- create_ml_includes-sym_for_dir $1 $@" 591 echo "Shouldn't be here -- create_ml_includes-sym_for_dir $1 $@"
537 # exit because we'll likely be called from a subshell 592 # exit because we'll likely be called from a subshell
538 exit 1 593 exit 1
539} 594}
540 595
596# @FUNCTION: get_libname
597# @USAGE: [version]
598# @DESCRIPTION:
599# Returns libname with proper suffix {.so,.dylib} and optionally supplied version
600# for ELF/MACH-O shared objects
601#
602# Example:
603# get_libname libfoo ${PV}
604# Returns: libfoo.so.${PV} (ELF) || libfoo.${PV}.dylib (MACH)
541get_libname() { 605get_libname() {
542 local libname 606 local libname
543 local ver=$1 607 local ver=$1
544 case ${CHOST} in 608 case ${CHOST} in
609 mingw*|*-mingw*) libname="dll";;
545 *-darwin*) libname="dylib";; 610 *-darwin*) libname="dylib";;
546 *) libname="so";; 611 *) libname="so";;
547 esac 612 esac
548 613
549 if [[ -z $@ ]] ; then 614 if [[ -z $* ]] ; then
550 echo ".${libname}" 615 echo ".${libname}"
551 else 616 else
552 for ver in "$@" ; do 617 for ver in "$@" ; do
553 case ${CHOST} in 618 case ${CHOST} in
554 *-darwin*) echo ".${ver}.${libname}";; 619 *-darwin*) echo ".${ver}.${libname}";;
571 export CDEFINE_x86="__i386__" 636 export CDEFINE_x86="__i386__"
572 export LIBDIR_x86="lib" 637 export LIBDIR_x86="lib"
573 638
574 export CFLAGS_amd64=${CFLAGS_amd64--m64} 639 export CFLAGS_amd64=${CFLAGS_amd64--m64}
575 export CHOST_amd64=${CTARGET} 640 export CHOST_amd64=${CTARGET}
576 export CTARGET_amd64=${CTARGET_amd64} 641 export CTARGET_amd64=${CHOST_amd64}
577 export CDEFINE_amd64="__x86_64__" 642 export CDEFINE_amd64="__x86_64__"
578 export LIBDIR_amd64="lib64" 643 export LIBDIR_amd64="lib64"
579 644
580 export MULTILIB_ABIS="amd64 x86" 645 export MULTILIB_ABIS="amd64 x86"
581 export DEFAULT_ABI="amd64" 646 export DEFAULT_ABI="amd64"
655 export DEFAULT_ABI="default" 720 export DEFAULT_ABI="default"
656 ;; 721 ;;
657 esac 722 esac
658} 723}
659 724
725# @FUNCTION: multilib_toolchain_setup
726# @DESCRIPTION:
660# Hide multilib details here for packages which are forced to be compiled for a 727# Hide multilib details here for packages which are forced to be compiled for a
661# specific ABI when run on another ABI (like x86-specific packages on amd64) 728# specific ABI when run on another ABI (like x86-specific packages on amd64)
662multilib_toolchain_setup() { 729multilib_toolchain_setup() {
730 export ABI=$1
731
663 if has_version app-admin/eselect-compiler ; then 732 if has_version app-admin/eselect-compiler ; then
664 # Binutils doesn't have wrappers for ld and as (yet). Eventually it 733 # Binutils doesn't have wrappers for ld and as (yet). Eventually it
665 # will, and all this can just be handled with CHOST. 734 # will, and all this can just be handled with CHOST.
666 export LD="ld $(get_abi_LDFLAGS $1)" 735 export LD="ld $(get_abi_LDFLAGS $1)"
667 export AS="as $(get_abi_ASFLAGS $1)" 736 export AS="as $(get_abi_ASFLAGS $1)"
668 737
669 export CHOST=$(get_abi_CHOST $1) 738 export CHOST=$(get_abi_CHOST $1)
670 export CBUILD=$(get_abi_CHOST $1) 739 export CBUILD=$(get_abi_CHOST $1)
671 else 740 else
672 tc-export CC 741 tc-export CC
673 export ABI=$1
674 fi 742 fi
675} 743}

Legend:
Removed from v.1.54  
changed lines
  Added in v.1.65

  ViewVC Help
Powered by ViewVC 1.1.20