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

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

  ViewVC Help
Powered by ViewVC 1.1.20