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

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

  ViewVC Help
Powered by ViewVC 1.1.20