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

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

  ViewVC Help
Powered by ViewVC 1.1.20