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

Diff of /eclass/libtool.eclass

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

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

Legend:
Removed from v.1.33  
changed lines
  Added in v.1.49

  ViewVC Help
Powered by ViewVC 1.1.20