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

Diff of /eclass/libtool.eclass

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

Revision 1.34 Revision 1.50
1# Copyright 1999-2004 Gentoo Foundation 1# Copyright 1999-2005 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.34 2004/09/25 19:59:51 rac Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/libtool.eclass,v 1.50 2005/07/11 15:08:06 swegener Exp $
4# 4#
5# Author: Martin Schlemmer <azarah@gentoo.org> 5# Author: Martin Schlemmer <azarah@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"
11INHERITED="${INHERITED} ${ECLASS}"
12 10
13# 2004.09.25 rac 11# 2004.09.25 rac
14# i have verified that at least one package can use this eclass and 12# i have verified that at least one package can use this eclass and
15# build properly even without libtool installed yet, probably using 13# build properly even without libtool installed yet, probably using
16# the files in the distribution. eliminating this dependency fixes 14# the files in the distribution. eliminating this dependency fixes
17# bug 65209, which is a showstopper for people doing installs using 15# bug 65209, which is a showstopper for people doing installs using
18# stageballs <3. if anybody decides to revert this, please attempt 16# stageballs <3. if anybody decides to revert this, please attempt
19# to find an alternate way of resolving that bug at the same time. 17# to find an alternate way of resolving that bug at the same time.
20 18
21#DEPEND="!bootstrap? ( sys-devel/libtool )"
22
23DESCRIPTION="Based on the ${ECLASS} eclass" 19DESCRIPTION="Based on the ${ECLASS} eclass"
24 20
25ELIBTOOL_VERSION="2.0.1" 21ELIBTOOL_VERSION="2.0.2"
26
27 22
28ELT_PATCH_DIR="${PORTDIR}/eclass/ELT-patches" 23ELT_PATCH_DIR="${PORTDIR}/eclass/ELT-patches"
29ELT_APPLIED_PATCHES= 24ELT_APPLIED_PATCHES=
30 25
31# 26#
33# 28#
34ELT_find_ltmain_sh() { 29ELT_find_ltmain_sh() {
35 local x= 30 local x=
36 local dirlist= 31 local dirlist=
37 32
38 for x in $(find "${S}" -name 'ltmain.sh') 33 for x in $(find "${S}" -name 'ltmain.sh') ; do
39 do
40 dirlist="${dirlist} ${x%/*}" 34 dirlist="${dirlist} ${x%/*}"
41 done 35 done
42 36
43 echo "${dirlist}" 37 echo "${dirlist}"
44} 38}
49ELT_try_and_apply_patch() { 43ELT_try_and_apply_patch() {
50 local ret=0 44 local ret=0
51 local patch="$2" 45 local patch="$2"
52 46
53 # We only support patchlevel of 0 - why worry if its static patches? 47 # We only support patchlevel of 0 - why worry if its static patches?
54 if patch -p0 --dry-run $1 < ${patch} &>${T}/elibtool.log 48 if patch -p0 --dry-run $1 < ${patch} &> ${T}/elibtool.log ; then
55 then
56 einfo " Applying $(basename "$(dirname "${patch}")")-${patch##*/}.patch..." 49 einfo " Applying $(basename "$(dirname "${patch}")")-${patch##*/}.patch ..."
57 patch -p0 $1 < ${patch} &>${T}/elibtool.log 50 patch -p0 $1 < ${patch} &>${T}/elibtool.log
58 ret=$? 51 ret=$?
59 export ELT_APPLIED_PATCHES="${ELT_APPLIED_PATCHES} ${patch##*/}" 52 export ELT_APPLIED_PATCHES="${ELT_APPLIED_PATCHES} ${patch##*/}"
60 else 53 else
61 ret=1 54 ret=1
71ELT_walk_patches() { 64ELT_walk_patches() {
72 local x= 65 local x=
73 local y= 66 local y=
74 local ret=1 67 local ret=1
75 local patch_dir= 68 local patch_dir=
69 local version=$(eval $(grep -e '^[[:space:]]*VERSION=' $1); \
70 echo "${VERSION}")
76 71
77 if [ -n "$2" ] 72 if [[ -n $2 ]] ; then
78 then
79 if [ -d "${ELT_PATCH_DIR}/$2" ] 73 if [[ -d ${ELT_PATCH_DIR}/$2 ]] ; then
80 then
81 patch_dir="${ELT_PATCH_DIR}/$2" 74 patch_dir="${ELT_PATCH_DIR}/$2"
82 else 75 else
83 return ${ret} 76 return ${ret}
84 fi 77 fi
85 78
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)
86 for x in $(ls -d "${patch_dir}"/* 2>/dev/null) 85 for x in $(ls -d "${patch_dir}"/* 2> /dev/null | sort -r) ; do
87 do 86 if [[ -n ${x} && -f ${x} ]] ; then
88 if [ -n "${x}" -a -f "${x}" ] 87 local ltver=$(VER_to_int "${version}")
89 then 88 local ptver=$(VER_to_int "${x##*/}")
89
90 # If libtool version smaller than patch version, skip patch.
91 [[ ${ltver} -lt ${ptver} ]] && continue
90 # For --remove-internal-dep ... 92 # For --remove-internal-dep ...
91 if [ -n "$3" ] 93 if [[ -n $3 ]] ; then
92 then
93 # For replace @REM_INT_DEP@ with what was passed 94 # For replace @REM_INT_DEP@ with what was passed
94 # to --remove-internal-dep 95 # to --remove-internal-dep
95 sed -e "s|@REM_INT_DEP@|$3|g" ${x} > \ 96 sed -e "s|@REM_INT_DEP@|$3|g" ${x} > \
96 ${T}/$$.rem_int_deps.patch 97 ${T}/$$.rem_int_deps.patch
97 98
98 x="${T}/$$.rem_int_deps.patch" 99 x="${T}/$$.rem_int_deps.patch"
99 fi 100 fi
100 101
101 if ELT_try_and_apply_patch "$1" "${x}" 102 if ELT_try_and_apply_patch "$1" "${x}" ; then
102 then
103 ret=0 103 ret=0
104 break 104 break
105 fi 105 fi
106 fi 106 fi
107 done 107 done
121 local elt_patches="portage relink max_cmd_len sed test tmp" 121 local elt_patches="portage relink max_cmd_len sed test tmp"
122 local start_dir="${PWD}" 122 local start_dir="${PWD}"
123 123
124 my_dirlist="$(ELT_find_ltmain_sh)" 124 my_dirlist="$(ELT_find_ltmain_sh)"
125 125
126 for x in "$@" 126 for x in "$@" ; do
127 do
128 case "${x}" in 127 case "${x}" in
129 "--portage") 128 "--portage")
130 # Only apply portage patch, and don't 129 # Only apply portage patch, and don't
131 # 'libtoolize --copy --force' if all patches fail. 130 # 'libtoolize --copy --force' if all patches fail.
132 do_portage="yes" 131 do_portage="yes"
156 my_dirlist="${S}" 155 my_dirlist="${S}"
157 else 156 else
158 my_dirlist= 157 my_dirlist=
159 fi 158 fi
160 ;; 159 ;;
160 "--no-uclibc")
161 NO_UCLIBCTOOLIZE=1
162 ;;
163 *)
164 eerror "Invalid elibtoolize option: $x"
165 die "elibtoolize called with $x ??"
161 esac 166 esac
162 done 167 done
163 168
169 if use ppc-macos ; then
170 glibtoolize --copy --force
171 darwintoolize
172 fi
173
164 for x in ${my_dirlist} 174 for x in ${my_dirlist} ; do
165 do
166 local tmp="$(echo "${x}" | sed -e "s|${S}||")" 175 local tmp=$(echo "${x}" | sed -e "s|${S}||")
167 export ELT_APPLIED_PATCHES= 176 export ELT_APPLIED_PATCHES=
168 177
169 cd ${x} 178 cd ${x}
170 einfo "Patching \${S}$(echo "/${tmp}/ltmain.sh" | sed -e 's|//|/|g')..." 179 einfo "Patching \${S}$(echo "/${tmp}/ltmain.sh" | sed -e 's|//|/|g') ..."
171 180
172 for y in ${elt_patches} 181 for y in ${elt_patches} ; do
173 do
174 local ret=0 182 local ret=0
175 183
176 case "${y}" in 184 case "${y}" in
177 "rem-int-dep") 185 "rem-int-dep")
178 ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}" 186 ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}"
179 ret=$? 187 ret=$?
180 ;; 188 ;;
181 "fix-relink") 189 "fix-relink")
182 # Do not apply if we do not have the relink patch applied ... 190 # Do not apply if we do not have the relink patch applied ...
183 if [ -n "$(grep 'inst_prefix_dir' "${x}/ltmain.sh")" ] 191 if [[ -n $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
184 then
185 ELT_walk_patches "${x}/ltmain.sh" "${y}" 192 ELT_walk_patches "${x}/ltmain.sh" "${y}"
186 ret=$? 193 ret=$?
187 fi 194 fi
188 ;; 195 ;;
189 "max_cmd_len") 196 "max_cmd_len")
190 # Do not apply if $max_cmd_len is not used ... 197 # Do not apply if $max_cmd_len is not used ...
191 if [ -n "$(grep 'max_cmd_len' "${x}/ltmain.sh")" ] 198 if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then
192 then
193 ELT_walk_patches "${x}/ltmain.sh" "${y}" 199 ELT_walk_patches "${x}/ltmain.sh" "${y}"
194 ret=$? 200 ret=$?
195 fi 201 fi
196 ;; 202 ;;
197 *) 203 *)
198 ELT_walk_patches "${x}/ltmain.sh" "${y}" 204 ELT_walk_patches "${x}/ltmain.sh" "${y}"
199 ret=$? 205 ret=$?
200 ;; 206 ;;
201 esac 207 esac
202 208
203 if [ "${ret}" -ne 0 ] 209 if [[ ${ret} -ne 0 ]] ; then
204 then
205 case ${y} in 210 case ${y} in
206 "relink") 211 "relink")
207 # Critical patch, but could be applied ... 212 # Critical patch, but could be applied ...
208 if [ -z "$(grep 'inst_prefix_dir' "${x}/ltmain.sh")" ] 213 if [[ -z $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
209 then
210 ewarn " Could not apply relink.patch!" 214 ewarn " Could not apply relink.patch!"
211 fi 215 fi
212 ;; 216 ;;
213 "portage") 217 "portage")
214 # Critical patch - for this one we abort, as it can really 218 # Critical patch - for this one we abort, as it can really
215 # cause breakage without it applied! 219 # cause breakage without it applied!
216 if [ "${do_portage}" = "yes" ] 220 if [[ ${do_portage} == "yes" ]] ; then
217 then
218 # Stupid test to see if its already applied ... 221 # Stupid test to see if its already applied ...
219 if [ -z "$(grep 'We do not want portage' "${x}/ltmain.sh")" ] 222 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
220 then
221 echo 223 echo
222 eerror "Portage patch requested, but failed to apply!" 224 eerror "Portage patch requested, but failed to apply!"
223 die "Portage patch requested, but failed to apply!" 225 die "Portage patch requested, but failed to apply!"
224 fi 226 fi
225 else 227 else
226 ewarn " Could not apply portage.patch!" 228 if [[ -n $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
229 ewarn " Portage patch seems to be already applied."
227 ewarn " Please verify that it is not needed." 230 ewarn " Please verify that it is not needed."
231 else
232 local version=$( \
233 eval $(grep -e '^[[:space:]]*VERSION=' "${x}/ltmain.sh"); \
234 echo "${VERSION}")
235
236 echo
237 eerror "Portage patch failed to apply (ltmain.sh version ${version})!"
238 die "Portage patch failed to apply!"
239 fi
240 # We do not want to run libtoolize ...
241 ELT_APPLIED_PATCHES="portage"
228 fi 242 fi
229 ;; 243 ;;
230 esac 244 esac
231 fi 245 fi
232 246
233 if [ -z "${ELT_APPLIED_PATCHES}" ] 247 if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then
234 then
235 if [ "${do_portage}" = "no" -a \ 248 if [[ ${do_portage} == "no" && \
236 "${do_reversedeps}" = "no" -a \ 249 ${do_reversedeps} == "no" && \
237 "${do_only_patches}" = "no" -a \ 250 ${do_only_patches} == "no" && \
238 "${deptoremove}" = "" ] 251 ${deptoremove} == "" ]]
239 then 252 then
253 ewarn "Cannot apply any patches, please file a bug about this"
254 break
255
240 # Sometimes ltmain.sh is in a subdirectory ... 256 # Sometimes ltmain.sh is in a subdirectory ...
241 if [ ! -f ${x}/configure.in -a ! -f ${x}/configure.ac ] 257 if [[ ! -f ${x}/configure.in && ! -f ${x}/configure.ac ]] ; then
242 then
243 if [ -f ${x}/../configure.in -o -f ${x}/../configure.ac ] 258 if [[ -f ${x}/../configure.in || -f ${x}/../configure.ac ]] ; then
244 then
245 cd ${x}/../ 259 cd "${x}"/../
246 fi 260 fi
247 fi 261 fi
248 262
249 if which libtoolize &>/dev/null 263 if type -p libtoolize &> /dev/null ; then
250 then
251 ewarn "Cannot apply any patch, running libtoolize..." 264 ewarn "Cannot apply any patches, running libtoolize..."
252 libtoolize --copy --force 265 libtoolize --copy --force
253 fi 266 fi
254 cd ${x} 267 cd "${x}"
255 break 268 break
256 fi 269 fi
257 fi 270 fi
258 done 271 done
259 done 272 done
260 273
261 if [ -f libtool ] 274 if [[ -f libtool ]] ; then
262 then
263 rm -f libtool 275 rm -f libtool
264 fi 276 fi
265 277
266 cd "${start_dir}" 278 cd "${start_dir}"
267 279
268 uclibctoolize 280 uclibctoolize
269} 281}
270 282
271uclibctoolize() { 283uclibctoolize() {
284 [[ -n ${NO_UCLIBCTOOLIZE} ]] && return 0
285
286 local errmsg=""
287 [[ ${CTARGET:-${CHOST}} == *-uclibc ]] \
288 && errmsg="PLEASE CHECK" \
289 || errmsg="Already patched"
272 local targets="" 290 local targets=""
273 local x 291 local x
274 292
275 if [ -z "$@" ] ; then 293 if [[ -z $* ]] ; then
276 targets="$(find ${S} -name configure -o -name ltconfig)" 294 targets=$(find ${S} -name configure -o -name ltconfig)
277 fi 295 fi
278 296
279 einfo "Applying uClibc/libtool patches ..." 297 einfo "Applying uClibc/libtool patches ..."
280 for x in ${targets} ; do 298 for x in ${targets} ; do
281 case $(basename "${x}") in 299 [[ ! -s ${x} ]] && continue
300 case ${x##*/} in
282 configure) 301 configure)
283 if grep 'Transform linux' "${x}" >/dev/null ; then 302 if grep 'Transform linux' "${x}" > /dev/null ; then
284 ebegin " Fixing \${S}${x/${S}}" 303 ebegin " Fixing \${S}${x/${S}}"
285 patch -p0 "${x}" "${ELT_PATCH_DIR}/uclibc/configure.patch" > /dev/null 304 patch -p0 "${x}" "${ELT_PATCH_DIR}/uclibc/configure.patch" > /dev/null
286 eend $? "PLEASE CHECK ${x}" 305 eend $? "${errmsg} ${x}"
287 fi 306 fi
288 ;; 307 ;;
289 308
290 ltconfig) 309 ltconfig)
291 local ver="$(grep '^VERSION=' ${x})" 310 local ver=$(grep '^VERSION=' ${x})
292 ver="${ver/VERSION=}" 311 ver=${ver/VERSION=}
293 [ "${ver:0:3}" == "1.4" ] && ver="1.3" # 1.4 and 1.3 are compat 312 [[ ${ver:0:3} == "1.4" ]] && ver="1.3" # 1.4 and 1.3 are compat
294 ebegin " Fixing \${S}${x/${S}}" 313 ebegin " Fixing \${S}${x/${S}}"
295 patch -p0 "${x}" "${ELT_PATCH_DIR}/uclibc/ltconfig-${ver:0:3}.patch" > /dev/null 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}
320
321darwintoolize() {
322 local targets=""
323 local x
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
296 eend $? "PLEASE CHECK ${x}" 342 eend $? "PLEASE CHECK ${x}"
297 ;; 343 ;;
298 esac 344 esac
299 done 345 done
300} 346}
347
348# char *VER_major(string)
349#
350# Return the Major (X of X.Y.Z) version
351#
352VER_major() {
353 [[ -z $1 ]] && return 1
354
355 local VER=$@
356 echo ${VER%%[^[:digit:]]*}
357}
358
359# char *VER_minor(string)
360#
361# Return the Minor (Y of X.Y.Z) version
362#
363VER_minor() {
364 [[ -z $1 ]] && return 1
365
366 local VER=$@
367 VER=${VER#*.}
368 echo ${VER%%[^[:digit:]]*}
369}
370
371# char *VER_micro(string)
372#
373# Return the Micro (Z of X.Y.Z) version.
374#
375VER_micro() {
376 [[ -z $1 ]] && return 1
377
378 local VER=$@
379 VER=${VER#*.*.}
380 echo ${VER%%[^[:digit:]]*}
381}
382
383# int VER_to_int(string)
384#
385# Convert a string type version (2.4.0) to an int (132096)
386# for easy compairing or versions ...
387#
388VER_to_int() {
389 [[ -z $1 ]] && return 1
390
391 local VER_MAJOR=$(VER_major "$1")
392 local VER_MINOR=$(VER_minor "$1")
393 local VER_MICRO=$(VER_micro "$1")
394 local VER_int=$(( VER_MAJOR * 65536 + VER_MINOR * 256 + VER_MICRO ))
395
396 # We make version 1.0.0 the minimum version we will handle as
397 # a sanity check ... if its less, we fail ...
398 if [[ ${VER_int} -ge 65536 ]] ; then
399 echo "${VER_int}"
400 return 0
401 fi
402
403 echo 1
404 return 1
405}

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

  ViewVC Help
Powered by ViewVC 1.1.20