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

Diff of /eclass/libtool.eclass

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

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

Legend:
Removed from v.1.50  
changed lines
  Added in v.1.77

  ViewVC Help
Powered by ViewVC 1.1.20