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

Diff of /eclass/libtool.eclass

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

Revision 1.25 Revision 1.47
1# Copyright 1999-2004 Gentoo Technologies, Inc. 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.25 2004/02/11 19:33:14 azarah 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
9 9
10ECLASS="libtool" 10ECLASS="libtool"
11INHERITED="${INHERITED} ${ECLASS}" 11INHERITED="${INHERITED} ${ECLASS}"
12 12
13newdepend "!bootstrap? ( sys-devel/libtool )" 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.
14 20
15DESCRIPTION="Based on the ${ECLASS} eclass" 21DESCRIPTION="Based on the ${ECLASS} eclass"
16 22
17ELIBTOOL_VERSION="2.0.1" 23ELIBTOOL_VERSION="2.0.2"
18
19 24
20ELT_PATCH_DIR="${PORTDIR}/eclass/ELT-patches" 25ELT_PATCH_DIR="${PORTDIR}/eclass/ELT-patches"
21ELT_APPLIED_PATCHES= 26ELT_APPLIED_PATCHES=
22 27
23# 28#
25# 30#
26ELT_find_ltmain_sh() { 31ELT_find_ltmain_sh() {
27 local x= 32 local x=
28 local dirlist= 33 local dirlist=
29 34
30 for x in $(find "${S}" -name 'ltmain.sh') 35 for x in $(find "${S}" -name 'ltmain.sh') ; do
31 do
32 dirlist="${dirlist} ${x%/*}" 36 dirlist="${dirlist} ${x%/*}"
33 done 37 done
34 38
35 echo "${dirlist}" 39 echo "${dirlist}"
36} 40}
37 41
38# 42#
39# See if we can apply $2 on $1, and if so, do it 43# See if we can apply $2 on $1, and if so, do it
40# 44#
41ELT_try_and_apply_patch() { 45ELT_try_and_apply_patch() {
42 local ret=0 46 local ret=0
43 local patch="$2" 47 local patch="$2"
44 48
45 # 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?
46 if patch -p0 --dry-run $1 < ${patch} &>${T}/elibtool.log 50 if patch -p0 --dry-run $1 < ${patch} &> ${T}/elibtool.log ; then
47 then
48 einfo " Applying $(basename "$(dirname "${patch}")")-${patch##*/}.patch..." 51 einfo " Applying $(basename "$(dirname "${patch}")")-${patch##*/}.patch ..."
49 patch -p0 $1 < ${patch} &>${T}/elibtool.log 52 patch -p0 $1 < ${patch} &>${T}/elibtool.log
50 ret=$? 53 ret=$?
51 export ELT_APPLIED_PATCHES="${ELT_APPLIED_PATCHES} ${patch##*/}" 54 export ELT_APPLIED_PATCHES="${ELT_APPLIED_PATCHES} ${patch##*/}"
52 else 55 else
53 ret=1 56 ret=1
63ELT_walk_patches() { 66ELT_walk_patches() {
64 local x= 67 local x=
65 local y= 68 local y=
66 local ret=1 69 local ret=1
67 local patch_dir= 70 local patch_dir=
71 local version=$(eval $(grep -e '^[[:space:]]*VERSION=' $1); \
72 echo "${VERSION}")
68 73
69 if [ -n "$2" ] 74 if [[ -n $2 ]] ; then
70 then
71 if [ -d "${ELT_PATCH_DIR}/$2" ] 75 if [[ -d ${ELT_PATCH_DIR}/$2 ]] ; then
72 then
73 patch_dir="${ELT_PATCH_DIR}/$2" 76 patch_dir="${ELT_PATCH_DIR}/$2"
74 else 77 else
75 return ${ret} 78 return ${ret}
76 fi 79 fi
77 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)
78 for x in $(ls -d "${patch_dir}"/* 2>/dev/null) 87 for x in $(ls -d "${patch_dir}"/* 2> /dev/null | sort -r) ; do
79 do 88 if [[ -n ${x} && -f ${x} ]] ; then
80 if [ -n "${x}" -a -f "${x}" ] 89 local ltver=$(VER_to_int "${version}")
81 then 90 local ptver=$(VER_to_int "${x##*/}")
91
92 # If libtool version smaller than patch version, skip patch.
93 [[ ${ltver} -lt ${ptver} ]] && continue
82 # For --remove-internal-dep ... 94 # For --remove-internal-dep ...
83 if [ -n "$3" ] 95 if [[ -n $3 ]] ; then
84 then
85 # For replace @REM_INT_DEP@ with what was passed 96 # For replace @REM_INT_DEP@ with what was passed
86 # to --remove-internal-dep 97 # to --remove-internal-dep
87 sed -e "s|@REM_INT_DEP@|$3|g" ${x} > \ 98 sed -e "s|@REM_INT_DEP@|$3|g" ${x} > \
88 ${T}/$$.rem_int_deps.patch 99 ${T}/$$.rem_int_deps.patch
89 100
90 x="${T}/$$.rem_int_deps.patch" 101 x="${T}/$$.rem_int_deps.patch"
91 fi 102 fi
92 103
93 if ELT_try_and_apply_patch "$1" "${x}" 104 if ELT_try_and_apply_patch "$1" "${x}" ; then
94 then
95 ret=0 105 ret=0
96 break 106 break
97 fi 107 fi
98 fi 108 fi
99 done 109 done
109 local do_reversedeps="no" 119 local do_reversedeps="no"
110 local do_only_patches="no" 120 local do_only_patches="no"
111 local deptoremove= 121 local deptoremove=
112 local my_dirlist= 122 local my_dirlist=
113 local elt_patches="portage relink max_cmd_len sed test tmp" 123 local elt_patches="portage relink max_cmd_len sed test tmp"
124 local start_dir="${PWD}"
114 125
115 my_dirlist="$(ELT_find_ltmain_sh)" 126 my_dirlist="$(ELT_find_ltmain_sh)"
116 127
117 for x in $* 128 for x in "$@" ; do
118 do
119 case "${x}" in 129 case "${x}" in
120 "--portage") 130 "--portage")
121 # Only apply portage patch, and don't 131 # Only apply portage patch, and don't
122 # 'libtoolize --copy --force' if all patches fail. 132 # 'libtoolize --copy --force' if all patches fail.
123 do_portage="yes" 133 do_portage="yes"
147 my_dirlist="${S}" 157 my_dirlist="${S}"
148 else 158 else
149 my_dirlist= 159 my_dirlist=
150 fi 160 fi
151 ;; 161 ;;
162 "--no-uclibc")
163 NO_UCLIBCTOOLIZE=1
164 ;;
165 *)
166 eerror "Invalid elibtoolize option: $x"
167 die "elibtoolize called with $x ??"
152 esac 168 esac
153 done 169 done
154 170
171 if use ppc-macos ; then
172 glibtoolize --copy --force
173 darwintoolize
174 fi
175
155 for x in ${my_dirlist} 176 for x in ${my_dirlist} ; do
156 do
157 local tmp="$(echo "${x}" | sed -e "s|${S}||")" 177 local tmp=$(echo "${x}" | sed -e "s|${S}||")
158 export ELT_APPLIED_PATCHES= 178 export ELT_APPLIED_PATCHES=
159 179
160 cd ${x} 180 cd ${x}
161 einfo "Patching \${S}$(echo "/${tmp}/ltmain.sh" | sed -e 's|//|/|g')..." 181 einfo "Patching \${S}$(echo "/${tmp}/ltmain.sh" | sed -e 's|//|/|g') ..."
162 182
163 for y in ${elt_patches} 183 for y in ${elt_patches} ; do
164 do
165 local ret=0 184 local ret=0
166 185
167 case "${y}" in 186 case "${y}" in
168 "rem-int-dep") 187 "rem-int-dep")
169 ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}" 188 ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}"
170 ret=$? 189 ret=$?
171 ;; 190 ;;
172 "fix-relink") 191 "fix-relink")
173 # 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 ...
174 if [ -n "$(grep 'inst_prefix_dir' "${x}/ltmain.sh")" ] 193 if [[ -n $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
175 then
176 ELT_walk_patches "${x}/ltmain.sh" "${y}" 194 ELT_walk_patches "${x}/ltmain.sh" "${y}"
177 ret=$? 195 ret=$?
178 fi 196 fi
179 ;; 197 ;;
180 "max_cmd_len") 198 "max_cmd_len")
181 # Do not apply if $max_cmd_len is not used ... 199 # Do not apply if $max_cmd_len is not used ...
182 if [ -n "$(grep 'max_cmd_len' "${x}/ltmain.sh")" ] 200 if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then
183 then
184 ELT_walk_patches "${x}/ltmain.sh" "${y}" 201 ELT_walk_patches "${x}/ltmain.sh" "${y}"
185 ret=$? 202 ret=$?
186 fi 203 fi
187 ;; 204 ;;
188 *) 205 *)
189 ELT_walk_patches "${x}/ltmain.sh" "${y}" 206 ELT_walk_patches "${x}/ltmain.sh" "${y}"
190 ret=$? 207 ret=$?
191 ;; 208 ;;
192 esac 209 esac
193 210
194 if [ "${ret}" -ne 0 ] 211 if [[ ${ret} -ne 0 ]] ; then
195 then
196 case ${y} in 212 case ${y} in
197 "relink") 213 "relink")
198 # Critical patch, but could be applied ... 214 # Critical patch, but could be applied ...
199 if [ -z "$(grep 'inst_prefix_dir' "${x}/ltmain.sh")" ] 215 if [[ -z $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
200 then
201 ewarn " Could not apply relink.patch!" 216 ewarn " Could not apply relink.patch!"
202 fi 217 fi
203 ;; 218 ;;
204 "portage") 219 "portage")
205 # Critical patch - for this one we abort, as it can really 220 # Critical patch - for this one we abort, as it can really
206 # cause breakage without it applied! 221 # cause breakage without it applied!
207 if [ "${do_portage}" = "yes" ] 222 if [[ ${do_portage} == "yes" ]] ; then
208 then
209 # Stupid test to see if its already applied ... 223 # Stupid test to see if its already applied ...
210 if [ -z "$(grep 'We do not want portage' "${x}/ltmain.sh")" ] 224 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
211 then
212 echo 225 echo
213 eerror "Portage patch requested, but failed to apply!" 226 eerror "Portage patch requested, but failed to apply!"
214 die "Portage patch requested, but failed to apply!" 227 die "Portage patch requested, but failed to apply!"
215 fi 228 fi
216 else 229 else
217 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."
218 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"
219 fi 244 fi
220 ;; 245 ;;
221 esac 246 esac
222 fi 247 fi
223 248
224 if [ -z "${ELT_APPLIED_PATCHES}" ] 249 if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then
225 then
226 if [ "${do_portage}" = "no" -a \ 250 if [[ ${do_portage} == "no" && \
227 "${do_reversedeps}" = "no" -a \ 251 ${do_reversedeps} == "no" && \
228 "${do_only_patches}" = "no" -a \ 252 ${do_only_patches} == "no" && \
229 "${deptoremove}" = "" ] 253 ${deptoremove} == "" ]]
230 then 254 then
255 ewarn "Cannot apply any patches, please file a bug about this"
256 break
257
231 # Sometimes ltmain.sh is in a subdirectory ... 258 # Sometimes ltmain.sh is in a subdirectory ...
232 if [ ! -f ${x}/configure.in -a ! -f ${x}/configure.ac ] 259 if [[ ! -f ${x}/configure.in && ! -f ${x}/configure.ac ]] ; then
233 then
234 if [ -f ${x}/../configure.in -o -f ${x}/../configure.ac ] 260 if [[ -f ${x}/../configure.in || -f ${x}/../configure.ac ]] ; then
235 then
236 cd ${x}/../ 261 cd "${x}"/../
237 fi 262 fi
238 fi 263 fi
239 264
240 if which libtoolize &>/dev/null 265 if type -p libtoolize &> /dev/null ; then
241 then
242 ewarn "Cannot apply any patch, running libtoolize..." 266 ewarn "Cannot apply any patches, running libtoolize..."
243 libtoolize --copy --force 267 libtoolize --copy --force
244 fi 268 fi
245 cd ${x} 269 cd "${x}"
246 break 270 break
247 fi 271 fi
248 fi 272 fi
249 done 273 done
250 done 274 done
251 275
252 if [ -f libtool ] 276 if [[ -f libtool ]] ; then
253 then
254 rm -f libtool 277 rm -f libtool
255 fi 278 fi
256 279
257 # We need to change the pwd back to $S, as we may be called in 280 cd "${start_dir}"
258 # src_compile()
259 cd ${S}
260}
261 281
282 uclibctoolize
283}
284
285uclibctoolize() {
286 [[ -n ${NO_UCLIBCTOOLIZE} ]] && return 0
287
288 local errmsg=""
289 [[ ${CTARGET:-${CHOST}} == *-uclibc ]] \
290 && errmsg="PLEASE CHECK" \
291 || errmsg="Already patched"
292 local targets=""
293 local x
294
295 if [[ -z $* ]] ; then
296 targets=$(find ${S} -name configure -o -name ltconfig)
297 fi
298
299 einfo "Applying uClibc/libtool patches ..."
300 for x in ${targets} ; do
301 [[ ! -s ${x} ]] && continue
302 case ${x##*/} in
303 configure)
304 if grep 'Transform linux' "${x}" > /dev/null ; then
305 ebegin " Fixing \${S}${x/${S}}"
306 patch -p0 "${x}" "${ELT_PATCH_DIR}/uclibc/configure.patch" > /dev/null
307 eend $? "${errmsg} ${x}"
308 fi
309 ;;
310
311 ltconfig)
312 local ver=$(grep '^VERSION=' ${x})
313 ver=${ver/VERSION=}
314 [[ ${ver:0:3} == "1.4" ]] && ver="1.3" # 1.4 and 1.3 are compat
315 ebegin " Fixing \${S}${x/${S}}"
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
344 eend $? "PLEASE CHECK ${x}"
345 ;;
346 esac
347 done
348}
349
350# char *VER_major(string)
351#
352# Return the Major (X of X.Y.Z) version
353#
354VER_major() {
355 [[ -z $1 ]] && return 1
356
357 local VER=$@
358 echo ${VER%%[^[:digit:]]*}
359}
360
361# char *VER_minor(string)
362#
363# Return the Minor (Y of X.Y.Z) version
364#
365VER_minor() {
366 [[ -z $1 ]] && return 1
367
368 local VER=$@
369 VER=${VER#*.}
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
403 fi
404
405 echo 1
406 return 1
407}

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

  ViewVC Help
Powered by ViewVC 1.1.20