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

Diff of /eclass/libtool.eclass

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

Revision 1.24 Revision 1.51
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.24 2004/01/02 21:54:28 azarah Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/libtool.eclass,v 1.51 2005/09/02 09:35:17 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
108 local do_portage="no" 116 local do_portage="no"
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 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
160 cd ${x} 180 cd ${x}
161 einfo "Patching \${S}$(echo "/${tmp}/ltmain.sh" | sed -e 's|//|/|g')..." 181 einfo "Running elibtoolize in: $(echo "/${tmp}" | sed -e 's|//|/|g; s|^/||')"
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 194 ELT_walk_patches "${x}/ltmain.sh" "${y}"
195 ret=$?
196 fi
197 ;;
198 "max_cmd_len")
199 # Do not apply if $max_cmd_len is not used ...
200 if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then
176 ELT_walk_patches "${x}/ltmain.sh" "${y}" 201 ELT_walk_patches "${x}/ltmain.sh" "${y}"
177 ret=$? 202 ret=$?
178 fi 203 fi
179 ;; 204 ;;
180 *) 205 *)
181 ELT_walk_patches "${x}/ltmain.sh" "${y}" 206 ELT_walk_patches "${x}/ltmain.sh" "${y}"
182 ret=$? 207 ret=$?
183 ;; 208 ;;
184 esac 209 esac
185 210
186 if [ "${ret}" -ne 0 ] 211 if [[ ${ret} -ne 0 ]] ; then
187 then
188 case ${y} in 212 case ${y} in
189 "relink") 213 "relink")
190 # Critical patch, but could be applied ... 214 # Critical patch, but could be applied ...
191 if [ -z "$(grep 'inst_prefix_dir' "${x}/ltmain.sh")" ] 215 if [[ -z $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
192 then
193 ewarn " Could not apply relink.patch!" 216 ewarn " Could not apply relink.patch!"
194 fi 217 fi
195 ;; 218 ;;
196 "portage") 219 "portage")
197 # Critical patch - for this one we abort, as it can really 220 # Critical patch - for this one we abort, as it can really
198 # cause breakage without it applied! 221 # cause breakage without it applied!
199 if [ "${do_portage}" = "yes" ] 222 if [[ ${do_portage} == "yes" ]] ; then
200 then
201 # Stupid test to see if its already applied ... 223 # Stupid test to see if its already applied ...
202 if [ -z "$(grep 'We do not want portage' "${x}/ltmain.sh")" ] 224 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
203 then
204 echo 225 echo
205 eerror "Portage patch requested, but failed to apply!" 226 eerror "Portage patch requested, but failed to apply!"
206 die "Portage patch requested, but failed to apply!" 227 die "Portage patch requested, but failed to apply!"
207 fi 228 fi
208 else 229 else
209 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."
210 ewarn " Please verify that it is not needed." 232 # ewarn " Please verify that it is not needed."
233 :
234 else
235 local version=$( \
236 eval $(grep -e '^[[:space:]]*VERSION=' "${x}/ltmain.sh"); \
237 echo "${VERSION}")
238
239 echo
240 eerror "Portage patch failed to apply (ltmain.sh version ${version})!"
241 die "Portage patch failed to apply!"
242 fi
243 # We do not want to run libtoolize ...
244 ELT_APPLIED_PATCHES="portage"
211 fi 245 fi
212 ;; 246 ;;
213 esac 247 esac
214 fi 248 fi
215 249
216 if [ -z "${ELT_APPLIED_PATCHES}" ] 250 if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then
217 then
218 if [ "${do_portage}" = "no" -a \ 251 if [[ ${do_portage} == "no" && \
219 "${do_reversedeps}" = "no" -a \ 252 ${do_reversedeps} == "no" && \
220 "${do_only_patches}" = "no" -a \ 253 ${do_only_patches} == "no" && \
221 "${deptoremove}" = "" ] 254 ${deptoremove} == "" ]]
222 then 255 then
256 ewarn "Cannot apply any patches, please file a bug about this"
257 break
258
223 # Sometimes ltmain.sh is in a subdirectory ... 259 # Sometimes ltmain.sh is in a subdirectory ...
224 if [ ! -f ${x}/configure.in -a ! -f ${x}/configure.ac ] 260 if [[ ! -f ${x}/configure.in && ! -f ${x}/configure.ac ]] ; then
225 then
226 if [ -f ${x}/../configure.in -o -f ${x}/../configure.ac ] 261 if [[ -f ${x}/../configure.in || -f ${x}/../configure.ac ]] ; then
227 then
228 cd ${x}/../ 262 cd "${x}"/../
229 fi 263 fi
230 fi 264 fi
231 265
232 if which libtoolize &>/dev/null 266 if type -p libtoolize &> /dev/null ; then
233 then
234 ewarn "Cannot apply any patch, running libtoolize..." 267 ewarn "Cannot apply any patches, running libtoolize..."
235 libtoolize --copy --force 268 libtoolize --copy --force
236 fi 269 fi
237 cd ${x} 270 cd "${x}"
238 break 271 break
239 fi 272 fi
240 fi 273 fi
241 done 274 done
242 done 275 done
243 276
244 if [ -f libtool ] 277 if [[ -f libtool ]] ; then
245 then
246 rm -f libtool 278 rm -f libtool
247 fi 279 fi
248 280
249 # We need to change the pwd back to $S, as we may be called in 281 cd "${start_dir}"
250 # src_compile()
251 cd ${S}
252}
253 282
283 uclibctoolize
284}
285
286uclibctoolize() {
287 [[ -n ${NO_UCLIBCTOOLIZE} ]] && return 0
288
289 local errmsg=""
290 [[ ${CTARGET:-${CHOST}} == *-uclibc ]] \
291 && errmsg="PLEASE CHECK" \
292 || errmsg="Already patched"
293 local targets=""
294 local x
295
296 if [[ -z $* ]] ; then
297 targets=$(find ${S} -name configure -o -name ltconfig)
298 fi
299
300 einfo "Applying uClibc/libtool patches ..."
301 for x in ${targets} ; do
302 [[ ! -s ${x} ]] && continue
303 case ${x##*/} in
304 configure)
305 if grep 'Transform linux' "${x}" > /dev/null ; then
306 ebegin " Fixing \${S}${x/${S}}"
307 patch -p0 "${x}" "${ELT_PATCH_DIR}/uclibc/configure.patch" > /dev/null
308 eend $? "${errmsg} ${x}"
309 fi
310 ;;
311
312 ltconfig)
313 local ver=$(grep '^VERSION=' ${x})
314 ver=${ver/VERSION=}
315 [[ ${ver:0:3} == "1.4" ]] && ver="1.3" # 1.4 and 1.3 are compat
316 ebegin " Fixing \${S}${x/${S}}"
317 patch -p0 "${x}" "${ELT_PATCH_DIR}/uclibc/ltconfig-${ver:0:3}.patch" > /dev/null
318 eend $? "${errmsg} ${x}"
319 ;;
320 esac
321 done
322}
323
324darwintoolize() {
325 local targets=""
326 local x
327
328 if [[ -z $* ]] ; then
329 targets=$(find ${S} -name ltmain.sh -o -name ltconfig)
330 fi
331
332 einfo "Applying Darwin/libtool patches ..."
333 for x in ${targets} ; do
334 [[ ! -s ${x} ]] && continue
335 case ${x##*/} in
336 ltmain.sh|ltconfig)
337 local ver=$(grep '^VERSION=' ${x})
338 ver=${ver/VERSION=}
339 if [[ ${ver:0:3} == "1.4" || ${ver:0:3} == "1.5" ]] ; then
340 ver="1.3" # 1.4, 1.5 and 1.3 are compat
341 fi
342
343 ebegin " Fixing \${S}${x/${S}}"
344 patch -p0 "${x}" "${ELT_PATCH_DIR}/darwin/${x##*/}-${ver:0:3}.patch" > /dev/null
345 eend $? "PLEASE CHECK ${x}"
346 ;;
347 esac
348 done
349}
350
351# char *VER_major(string)
352#
353# Return the Major (X of X.Y.Z) version
354#
355VER_major() {
356 [[ -z $1 ]] && return 1
357
358 local VER=$@
359 echo ${VER%%[^[:digit:]]*}
360}
361
362# char *VER_minor(string)
363#
364# Return the Minor (Y of X.Y.Z) version
365#
366VER_minor() {
367 [[ -z $1 ]] && return 1
368
369 local VER=$@
370 VER=${VER#*.}
371 echo ${VER%%[^[:digit:]]*}
372}
373
374# char *VER_micro(string)
375#
376# Return the Micro (Z of X.Y.Z) version.
377#
378VER_micro() {
379 [[ -z $1 ]] && return 1
380
381 local VER=$@
382 VER=${VER#*.*.}
383 echo ${VER%%[^[:digit:]]*}
384}
385
386# int VER_to_int(string)
387#
388# Convert a string type version (2.4.0) to an int (132096)
389# for easy compairing or versions ...
390#
391VER_to_int() {
392 [[ -z $1 ]] && return 1
393
394 local VER_MAJOR=$(VER_major "$1")
395 local VER_MINOR=$(VER_minor "$1")
396 local VER_MICRO=$(VER_micro "$1")
397 local VER_int=$(( VER_MAJOR * 65536 + VER_MINOR * 256 + VER_MICRO ))
398
399 # We make version 1.0.0 the minimum version we will handle as
400 # a sanity check ... if its less, we fail ...
401 if [[ ${VER_int} -ge 65536 ]] ; then
402 echo "${VER_int}"
403 return 0
404 fi
405
406 echo 1
407 return 1
408}

Legend:
Removed from v.1.24  
changed lines
  Added in v.1.51

  ViewVC Help
Powered by ViewVC 1.1.20