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

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

  ViewVC Help
Powered by ViewVC 1.1.20