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

Diff of /eclass/libtool.eclass

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

Revision 1.43 Revision 1.76
1# Copyright 1999-2005 Gentoo Foundation 1# Copyright 1999-2007 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/libtool.eclass,v 1.43 2005/02/27 20:29:04 azarah Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/libtool.eclass,v 1.76 2007/05/30 15:45:34 cardoe Exp $
4# 4#
5# Author: Martin Schlemmer <azarah@gentoo.org> 5# Maintainer: base-system@gentoo.org
6# 6#
7# This eclass patches ltmain.sh distributed with libtoolized packages with the 7# This eclass patches ltmain.sh distributed with libtoolized packages with the
8# relink and portage patch among others 8# relink and portage patch among others
9 9#
10ECLASS="libtool" 10# Note, this eclass does not require libtool as it only applies patches to
11INHERITED="${INHERITED} ${ECLASS}" 11# generated libtool files. We do not run the libtoolize program because that
12 12# requires a regeneration of the main autotool files in order to work properly.
13# 2004.09.25 rac
14# i have verified that at least one package can use this eclass and
15# build properly even without libtool installed yet, probably using
16# the files in the distribution. eliminating this dependency fixes
17# bug 65209, which is a showstopper for people doing installs using
18# stageballs <3. if anybody decides to revert this, please attempt
19# to find an alternate way of resolving that bug at the same time.
20 13
21DESCRIPTION="Based on the ${ECLASS} eclass" 14DESCRIPTION="Based on the ${ECLASS} eclass"
22 15
23ELIBTOOL_VERSION="2.0.1" 16ELIBTOOL_VERSION="2.0.2"
24 17
25ELT_PATCH_DIR="${PORTDIR}/eclass/ELT-patches" 18ELT_PATCH_DIR="${ECLASSDIR}/ELT-patches"
26ELT_APPLIED_PATCHES= 19ELT_APPLIED_PATCHES=
20ELT_LTMAIN_SH=
27 21
28# 22#
29# Returns all the directories containing ltmain.sh 23# Returns all the directories containing ltmain.sh
30# 24#
31ELT_find_ltmain_sh() { 25ELT_find_ltmain_sh() {
42# 36#
43# See if we can apply $2 on $1, and if so, do it 37# See if we can apply $2 on $1, and if so, do it
44# 38#
45ELT_try_and_apply_patch() { 39ELT_try_and_apply_patch() {
46 local ret=0 40 local ret=0
41 local file=$1
47 local patch="$2" 42 local patch=$2
48 43
49 # We only support patchlevel of 0 - why worry if its static patches? 44 # We only support patchlevel of 0 - why worry if its static patches?
50 if patch -p0 --dry-run $1 < ${patch} &> ${T}/elibtool.log ; then 45 if patch -p0 --dry-run "${file}" "${patch}" &> "${T}/elibtool.log" ; then
51 einfo " Applying $(basename "$(dirname "${patch}")")-${patch##*/}.patch ..." 46 einfo " Applying $(basename "$(dirname "${patch}")")-${patch##*/}.patch ..."
52 patch -p0 $1 < ${patch} &>${T}/elibtool.log 47 patch -p0 -g0 --no-backup-if-mismatch "${file}" "${patch}" \
48 &> "${T}/elibtool.log"
53 ret=$? 49 ret=$?
54 export ELT_APPLIED_PATCHES="${ELT_APPLIED_PATCHES} ${patch##*/}" 50 export ELT_APPLIED_PATCHES="${ELT_APPLIED_PATCHES} ${patch##*/}"
55 else 51 else
56 ret=1 52 ret=1
57 fi 53 fi
58 54
59 return ${ret} 55 return "${ret}"
56}
57
58#
59# Get string version of ltmain.sh or ltconfig (passed as $1)
60#
61ELT_libtool_version() {
62 local ltmain_sh=$1
63 local version=
64
65 version=$(eval $(grep -e '^[[:space:]]*VERSION=' "${ltmain_sh}"); \
66 echo "${VERSION}")
67 [[ -z ${version} ]] && version="0"
68
69 echo "${version}"
60} 70}
61 71
62# 72#
63# Run through the patches in $2 and see if any 73# Run through the patches in $2 and see if any
64# apply to $1 ... 74# apply to $1 ...
65# 75#
66ELT_walk_patches() { 76ELT_walk_patches() {
67 local x= 77 local x=
68 local y= 78 local y=
69 local ret=1 79 local ret=1
80 local file=$1
81 local patch_set=$2
70 local patch_dir= 82 local patch_dir=
71 local version=$(eval $(grep -e '^[[:space:]]*VERSION=' $1); echo "${VERSION}") 83 local rem_int_dep=$3
72 84
73 if [[ -n $2 ]] ; then 85 if [[ -n ${patch_set} ]] ; then
74 if [[ -d ${ELT_PATCH_DIR}/$2 ]] ; then 86 if [[ -d ${ELT_PATCH_DIR}/${patch_set} ]] ; then
75 patch_dir="${ELT_PATCH_DIR}/$2" 87 patch_dir="${ELT_PATCH_DIR}/${patch_set}"
76 else 88 else
77 return ${ret} 89 return "${ret}"
78 fi 90 fi
79 91
80 # First check a version specific patch, if not check major.minor* 92 # Go through the patches in reverse order (large to small)
81 for y in ${version} $(echo "${version}" | cut -d. -f1,2) ; do
82 [[ -z ${y} ]] && continue
83 for x in $(ls -d "${patch_dir}/${y}"* 2> /dev/null) ; do 93 for x in $(ls -d "${patch_dir}"/* 2> /dev/null | grep -v 'CVS' | sort -r) ; do
84 if [[ -n ${x} && -f ${x} ]] ; then 94 if [[ -n ${x} && -f ${x} ]] ; then
85 # For --remove-internal-dep ... 95 # For --remove-internal-dep ...
86 if [[ -n $3 ]] ; then 96 if [[ -n ${rem_int_dep} ]] ; then
87 # For replace @REM_INT_DEP@ with what was passed 97 # For replace @REM_INT_DEP@ with what was passed
88 # to --remove-internal-dep 98 # to --remove-internal-dep
89 sed -e "s|@REM_INT_DEP@|$3|g" ${x} > \ 99 sed -e "s|@REM_INT_DEP@|${rem_int_dep}|g" ${x} > \
90 ${T}/$$.rem_int_deps.patch 100 "${T}/$$.rem_int_deps.patch"
91 101
92 x="${T}/$$.rem_int_deps.patch" 102 x="${T}/$$.rem_int_deps.patch"
93 fi
94
95 if ELT_try_and_apply_patch "$1" "${x}" ; then
96 ret=0
97 break
98 fi
99 fi 103 fi
100 done 104
105 if ELT_try_and_apply_patch "${file}" "${x}" ; then
106 ret=0
107 break
108 fi
109 fi
101 done 110 done
102
103 # If still nothing, try the rest.
104 if [[ ${ret} -eq 1 ]]; then
105 for x in $(ls -d "${patch_dir}"/* 2> /dev/null) ; do
106 if [[ -n ${x} && -f ${x} ]] ; then
107 # For --remove-internal-dep ...
108 if [[ -n $3 ]] ; then
109 # For replace @REM_INT_DEP@ with what was passed
110 # to --remove-internal-dep
111 sed -e "s|@REM_INT_DEP@|$3|g" ${x} > \
112 ${T}/$$.rem_int_deps.patch
113
114 x="${T}/$$.rem_int_deps.patch"
115 fi
116
117 if ELT_try_and_apply_patch "$1" "${x}" ; then
118 ret=0
119 break
120 fi
121 fi
122 done
123 fi
124 fi 111 fi
125 112
126 return ${ret} 113 return "${ret}"
127} 114}
128 115
129elibtoolize() { 116elibtoolize() {
130 local x= 117 local x=
131 local y= 118 local y=
132 local do_portage="no" 119 local do_portage="no"
133 local do_reversedeps="no" 120 local do_reversedeps="no"
134 local do_only_patches="no" 121 local do_only_patches="no"
122 local do_uclibc="yes"
135 local deptoremove= 123 local deptoremove=
136 local my_dirlist= 124 local my_dirlist=
137 local elt_patches="portage relink max_cmd_len sed test tmp" 125 local elt_patches="portage relink max_cmd_len sed test tmp"
138 local start_dir="${PWD}" 126 local start_dir=${PWD}
139 127
140 my_dirlist="$(ELT_find_ltmain_sh)" 128 my_dirlist=$(ELT_find_ltmain_sh)
141 129
142 for x in "$@" ; do 130 for x in "$@" ; do
143 case "${x}" in 131 case "${x}" in
144 "--portage") 132 "--portage")
145 # Only apply portage patch, and don't 133 # Only apply portage patch, and don't
157 do_only_patches="yes" 145 do_only_patches="yes"
158 ;; 146 ;;
159 "^--remove-internal-dep="*) 147 "^--remove-internal-dep="*)
160 # We will replace @REM_INT_DEP@ with what is needed 148 # We will replace @REM_INT_DEP@ with what is needed
161 # in ELT_walk_patches() ... 149 # in ELT_walk_patches() ...
162 deptoremove="$(echo "${x}" | sed -e 's|--remove-internal-dep=||')" 150 deptoremove=$(echo "${x}" | sed -e 's|--remove-internal-dep=||')
163 151
164 # Add the patch for this ... 152 # Add the patch for this ...
165 [ -n "${deptoremove}" ] && elt_patches="${elt_patches} rem-int-dep" 153 [[ -n ${deptoremove} ]] && elt_patches="${elt_patches} rem-int-dep"
166 ;; 154 ;;
167 "--shallow") 155 "--shallow")
168 # Only patch the ltmain.sh in ${S} 156 # Only patch the ltmain.sh in ${S}
169 if [ -f "${S}/ltmain.sh" ] 157 if [[ -f ${S}/ltmain.sh ]] ; then
170 then
171 my_dirlist="${S}" 158 my_dirlist=${S}
172 else 159 else
173 my_dirlist= 160 my_dirlist=
174 fi 161 fi
175 ;; 162 ;;
176 "--no-uclibc") 163 "--no-uclibc")
177 NO_UCLIBCTOOLIZE=1 164 do_uclibc="no"
178 ;; 165 ;;
179 *) 166 *)
180 eerror "Invalid elibtoolize option: $x" 167 eerror "Invalid elibtoolize option: ${x}"
181 die "elibtoolize called with $x ??" 168 die "elibtoolize called with ${x} ??"
182 esac 169 esac
183 done 170 done
184 171
185 if use ppc-macos ; then 172 [[ ${do_uclibc} == "yes" ]] && \
186 glibtoolize --copy --force 173 elt_patches="${elt_patches} uclibc-conf uclibc-ltconf"
187 darwintoolize 174
188 fi 175 [[ ${CHOST} == *"-freebsd"* ]] && \
176 elt_patches="${elt_patches} fbsd-conf fbsd-ltconf"
177
178 [[ ${CHOST} == *"-darwin"* ]] && \
179 elt_patches="${elt_patches} darwin-ltconf darwin-ltmain"
189 180
190 for x in ${my_dirlist} ; do 181 for x in ${my_dirlist} ; do
191 local tmp=$(echo "${x}" | sed -e "s|${S}||") 182 local tmp=$(echo "${x}" | sed -e "s|${WORKDIR}||")
192 export ELT_APPLIED_PATCHES= 183 export ELT_APPLIED_PATCHES=
184 export ELT_LTMAIN_SH="${x}/ltmain.sh"
185
186 [[ -f ${x}/.elibtoolized ]] && continue
193 187
194 cd ${x} 188 cd ${x}
195 einfo "Patching \${S}$(echo "/${tmp}/ltmain.sh" | sed -e 's|//|/|g') ..." 189 einfo "Running elibtoolize in: $(echo "/${tmp}" | sed -e 's|//|/|g; s|^/||')"
196 190
197 for y in ${elt_patches} ; do 191 for y in ${elt_patches} ; do
198 local ret=0 192 local ret=0
199 193
200 case "${y}" in 194 case "${y}" in
195 "portage")
196 # Stupid test to see if its already applied ...
197 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
198 ELT_walk_patches "${x}/ltmain.sh" "${y}"
199 ret=$?
200 fi
201 ;;
201 "rem-int-dep") 202 "rem-int-dep")
202 ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}" 203 ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}"
203 ret=$? 204 ret=$?
204 ;; 205 ;;
205 "fix-relink") 206 "fix-relink")
214 if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then 215 if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then
215 ELT_walk_patches "${x}/ltmain.sh" "${y}" 216 ELT_walk_patches "${x}/ltmain.sh" "${y}"
216 ret=$? 217 ret=$?
217 fi 218 fi
218 ;; 219 ;;
220 "uclibc-conf")
221 if [[ -e ${x}/configure && \
222 -n $(grep 'Transform linux' "${x}/configure") ]] ; then
223 ELT_walk_patches "${x}/configure" "${y}"
224 ret=$?
225 # ltmain.sh and co might be in a subdirectory ...
226 elif [[ ! -e ${x}/configure && -e ${x}/../configure && \
227 -n $(grep 'Transform linux' "${x}/../configure") ]] ; then
228 ELT_walk_patches "${x}/../configure" "${y}"
229 ret=$?
230 fi
231 ;;
232 "uclibc-ltconf")
233 # Newer libtoolize clears ltconfig, as not used anymore
234 if [[ -s ${x}/ltconfig ]] ; then
235 ELT_walk_patches "${x}/ltconfig" "${y}"
236 ret=$?
237 fi
238 ;;
239 "fbsd-conf")
240 if [[ -e ${x}/configure && \
241 -n $(grep 'version_type=freebsd-' "${x}/configure") ]] ; then
242 ELT_walk_patches "${x}/configure" "${y}"
243 ret=$?
244 # ltmain.sh and co might be in a subdirectory ...
245 elif [[ ! -e ${x}/configure && -e ${x}/../configure && \
246 -n $(grep 'version_type=freebsd-' "${x}/../configure") ]] ; then
247 ELT_walk_patches "${x}/../configure" "${y}"
248 ret=$?
249 fi
250 ;;
251 "fbsd-ltconf")
252 if [[ -s ${x}/ltconfig ]] ; then
253 ELT_walk_patches "${x}/ltconfig" "${y}"
254 ret=$?
255 fi
256 ;;
257 "darwin-ltconf")
258 # Newer libtoolize clears ltconfig, as not used anymore
259 if [[ -s ${x}/ltconfig ]] ; then
260 ELT_walk_patches "${x}/ltconfig" "${y}"
261 ret=$?
262 fi
263 ;;
219 *) 264 *)
220 ELT_walk_patches "${x}/ltmain.sh" "${y}" 265 ELT_walk_patches "${x}/ltmain.sh" "${y}"
221 ret=$? 266 ret=$?
222 ;; 267 ;;
223 esac 268 esac
224 269
225 if [[ ${ret} -ne 0 ]] ; then 270 if [[ ${ret} -ne 0 ]] ; then
226 case ${y} in 271 case ${y} in
227 "relink") 272 "relink")
273 local version=$(ELT_libtool_version "${x}/ltmain.sh")
228 # Critical patch, but could be applied ... 274 # Critical patch, but could be applied ...
275 # FIXME: Still need a patch for ltmain.sh > 1.4.0
229 if [[ -z $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then 276 if [[ -z $(grep 'inst_prefix_dir' "${x}/ltmain.sh") && \
277 $(VER_to_int "${version}") -ge $(VER_to_int "1.4.0") ]] ; then
230 ewarn " Could not apply relink.patch!" 278 ewarn " Could not apply relink.patch!"
231 fi 279 fi
232 ;; 280 ;;
233 "portage") 281 "portage")
234 # Critical patch - for this one we abort, as it can really 282 # Critical patch - for this one we abort, as it can really
236 if [[ ${do_portage} == "yes" ]] ; then 284 if [[ ${do_portage} == "yes" ]] ; then
237 # Stupid test to see if its already applied ... 285 # Stupid test to see if its already applied ...
238 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then 286 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
239 echo 287 echo
240 eerror "Portage patch requested, but failed to apply!" 288 eerror "Portage patch requested, but failed to apply!"
289 eerror "Please bug azarah or vapier to add proper patch."
241 die "Portage patch requested, but failed to apply!" 290 die "Portage patch requested, but failed to apply!"
242 fi 291 fi
243 else 292 else
244 ewarn " Could not apply portage.patch!" 293 if [[ -n $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
294 # ewarn " Portage patch seems to be already applied."
245 ewarn " Please verify that it is not needed." 295 # ewarn " Please verify that it is not needed."
296 :
297 else
298 local version=$( \
299 eval $(grep -e '^[[:space:]]*VERSION=' "${x}/ltmain.sh"); \
300 echo "${VERSION}")
301
302 echo
303 eerror "Portage patch failed to apply (ltmain.sh version ${version})!"
304 eerror "Please bug azarah or vapier to add proper patch."
305 die "Portage patch failed to apply!"
306 fi
307 # We do not want to run libtoolize ...
308 ELT_APPLIED_PATCHES="portage"
246 fi 309 fi
310 ;;
311 "uclibc-"*)
312 [[ ${CHOST} == *"-uclibc" ]] && \
313 ewarn " uClibc patch set '${y}' failed to apply!"
314 ;;
315 "fbsd-"*)
316 if [[ ${CHOST} == *"-freebsd"* ]] ; then
317 if [[ -z $(grep 'Handle Gentoo/FreeBSD as it was Linux' \
318 "${x}/configure" "${x}/../configure" 2>/dev/null) ]]; then
319 eerror " FreeBSD patch set '${y}' failed to apply!"
320 die "FreeBSD patch set '${y}' failed to apply!"
321 fi
322 fi
323 ;;
324 "darwin-"*)
325 [[ ${CHOST} == *"-darwin"* ]] && \
326 ewarn " Darwin patch set '${y}' failed to apply!"
247 ;; 327 ;;
248 esac 328 esac
249 fi 329 fi
330 done
250 331
251 if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then 332 if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then
252 if [[ ${do_portage} == "no" && \ 333 if [[ ${do_portage} == "no" && \
253 ${do_reversedeps} == "no" && \ 334 ${do_reversedeps} == "no" && \
254 ${do_only_patches} == "no" && \ 335 ${do_only_patches} == "no" && \
255 ${deptoremove} == "" ]] 336 ${deptoremove} == "" ]]
256 then 337 then
257 # Sometimes ltmain.sh is in a subdirectory ... 338 ewarn "Cannot apply any patches, please file a bug about this"
258 if [[ ! -f ${x}/configure.in && ! -f ${x}/configure.ac ]] ; then
259 if [[ -f ${x}/../configure.in || -f ${x}/../configure.ac ]] ; then
260 cd "${x}"/../
261 fi
262 fi
263
264 if type -p libtoolize &> /dev/null ; then
265 ewarn "Cannot apply any patch, running libtoolize..."
266 libtoolize --copy --force
267 fi
268 cd "${x}"
269 break
270 fi 339 die
271 fi 340 fi
272 done 341 fi
342
343 [[ -f ${x}/libtool ]] && rm -f "${x}/libtool"
344
345 touch "${x}/.elibtoolized"
273 done 346 done
274 347
275 if [[ -f libtool ]] ; then 348 cd "${start_dir}"
276 rm -f libtool 349}
350
351uclibctoolize() {
352 ewarn "uclibctoolize() is deprecated, please just use elibtoolize()!"
353 elibtoolize
354}
355
356darwintoolize() {
357 ewarn "darwintoolize() is deprecated, please just use elibtoolize()!"
358 elibtoolize
359}
360
361# char *VER_major(string)
362#
363# Return the Major (X of X.Y.Z) version
364#
365VER_major() {
366 [[ -z $1 ]] && return 1
367
368 local VER=$@
369 echo "${VER%%[^[:digit:]]*}"
370}
371
372# char *VER_minor(string)
373#
374# Return the Minor (Y of X.Y.Z) version
375#
376VER_minor() {
377 [[ -z $1 ]] && return 1
378
379 local VER=$@
380 VER=${VER#*.}
381 echo "${VER%%[^[:digit:]]*}"
382}
383
384# char *VER_micro(string)
385#
386# Return the Micro (Z of X.Y.Z) version.
387#
388VER_micro() {
389 [[ -z $1 ]] && return 1
390
391 local VER=$@
392 VER=${VER#*.*.}
393 echo "${VER%%[^[:digit:]]*}"
394}
395
396# int VER_to_int(string)
397#
398# Convert a string type version (2.4.0) to an int (132096)
399# for easy compairing or versions ...
400#
401VER_to_int() {
402 [[ -z $1 ]] && return 1
403
404 local VER_MAJOR=$(VER_major "$1")
405 local VER_MINOR=$(VER_minor "$1")
406 local VER_MICRO=$(VER_micro "$1")
407 local VER_int=$(( VER_MAJOR * 65536 + VER_MINOR * 256 + VER_MICRO ))
408
409 # We make version 1.0.0 the minimum version we will handle as
410 # a sanity check ... if its less, we fail ...
411 if [[ ${VER_int} -ge 65536 ]] ; then
412 echo "${VER_int}"
413 return 0
277 fi 414 fi
278 415
279 cd "${start_dir}" 416 echo 1
280 417 return 1
281 uclibctoolize
282} 418}
283
284uclibctoolize() {
285 [[ -n ${NO_UCLIBCTOOLIZE} ]] && return 0
286
287 local errmsg=""
288 [[ ${CTARGET:-${CHOST}} == *-uclibc ]] \
289 && errmsg="PLEASE CHECK" \
290 || errmsg="Already patched"
291 local targets=""
292 local x
293
294 if [[ -z $* ]] ; then
295 targets=$(find ${S} -name configure -o -name ltconfig)
296 fi
297
298 einfo "Applying uClibc/libtool patches ..."
299 for x in ${targets} ; do
300 [[ ! -s ${x} ]] && continue
301 case ${x##*/} in
302 configure)
303 if grep 'Transform linux' "${x}" > /dev/null ; then
304 ebegin " Fixing \${S}${x/${S}}"
305 patch -p0 "${x}" "${ELT_PATCH_DIR}/uclibc/configure.patch" > /dev/null
306 eend $? "${errmsg} ${x}"
307 fi
308 ;;
309
310 ltconfig)
311 local ver=$(grep '^VERSION=' ${x})
312 ver=${ver/VERSION=}
313 [[ ${ver:0:3} == "1.4" ]] && ver="1.3" # 1.4 and 1.3 are compat
314 ebegin " Fixing \${S}${x/${S}}"
315 patch -p0 "${x}" "${ELT_PATCH_DIR}/uclibc/ltconfig-${ver:0:3}.patch" > /dev/null
316 eend $? "${errmsg} ${x}"
317 ;;
318 esac
319 done
320}
321
322darwintoolize() {
323 local targets=""
324 local x
325
326 if [[ -z $* ]] ; then
327 targets=$(find ${S} -name ltmain.sh -o -name ltconfig)
328 fi
329
330 einfo "Applying Darwin/libtool patches ..."
331 for x in ${targets} ; do
332 [[ ! -s ${x} ]] && continue
333 case ${x##*/} in
334 ltmain.sh|ltconfig)
335 local ver=$(grep '^VERSION=' ${x})
336 ver=${ver/VERSION=}
337 if [[ ${ver:0:3} == "1.4" || ${ver:0:3} == "1.5" ]] ; then
338 ver="1.3" # 1.4, 1.5 and 1.3 are compat
339 fi
340
341 ebegin " Fixing \${S}${x/${S}}"
342 patch -p0 "${x}" "${ELT_PATCH_DIR}/darwin/${x##*/}-${ver:0:3}.patch" > /dev/null
343 eend $? "PLEASE CHECK ${x}"
344 ;;
345 esac
346 done
347}

Legend:
Removed from v.1.43  
changed lines
  Added in v.1.76

  ViewVC Help
Powered by ViewVC 1.1.20