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

Diff of /eclass/libtool.eclass

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

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

Legend:
Removed from v.1.38  
changed lines
  Added in v.1.47

  ViewVC Help
Powered by ViewVC 1.1.20