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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.56 - (show annotations) (download)
Sun Sep 4 20:23:42 2005 UTC (8 years, 10 months ago) by azarah
Branch: MAIN
Changes since 1.55: +10 -7 lines
Make --no-uclibc work again.

1 # Copyright 1999-2005 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
3 # $Header: /var/cvsroot/gentoo-x86/eclass/libtool.eclass,v 1.55 2005/09/04 18:40:48 flameeyes Exp $
4 #
5 # Author: Martin Schlemmer <azarah@gentoo.org>
6 #
7 # This eclass patches ltmain.sh distributed with libtoolized packages with the
8 # relink and portage patch among others
9
10
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.
18
19 DESCRIPTION="Based on the ${ECLASS} eclass"
20
21 ELIBTOOL_VERSION="2.0.2"
22
23 ELT_PATCH_DIR="${PORTDIR}/eclass/ELT-patches"
24 ELT_APPLIED_PATCHES=
25 ELT_LTMAIN_SH=
26
27 #
28 # Returns all the directories containing ltmain.sh
29 #
30 ELT_find_ltmain_sh() {
31 local x=
32 local dirlist=
33
34 for x in $(find "${S}" -name 'ltmain.sh') ; do
35 dirlist="${dirlist} ${x%/*}"
36 done
37
38 echo "${dirlist}"
39 }
40
41 #
42 # See if we can apply $2 on $1, and if so, do it
43 #
44 ELT_try_and_apply_patch() {
45 local ret=0
46 local patch="$2"
47
48 # We only support patchlevel of 0 - why worry if its static patches?
49 if patch -p0 --dry-run $1 < ${patch} &> ${T}/elibtool.log ; then
50 einfo " Applying $(basename "$(dirname "${patch}")")-${patch##*/}.patch ..."
51 patch -p0 $1 < ${patch} &>${T}/elibtool.log
52 ret=$?
53 export ELT_APPLIED_PATCHES="${ELT_APPLIED_PATCHES} ${patch##*/}"
54 else
55 ret=1
56 fi
57
58 return ${ret}
59 }
60
61 #
62 # Run through the patches in $2 and see if any
63 # apply to $1 ...
64 #
65 ELT_walk_patches() {
66 local x=
67 local y=
68 local ret=1
69 local patch_dir=
70 local version=
71 local ltmain_sh=$1
72
73 [[ $1 == *"/configure" ]] && ltmain_sh=${ELT_LTMAIN_SH}
74 version=$(eval $(grep -e '^[[:space:]]*VERSION=' "${ltmain_sh}"); \
75 echo "${VERSION}")
76
77 if [[ -n $2 ]] ; then
78 if [[ -d ${ELT_PATCH_DIR}/$2 ]] ; then
79 patch_dir="${ELT_PATCH_DIR}/$2"
80 else
81 return ${ret}
82 fi
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)
90 for x in $(ls -d "${patch_dir}"/* 2> /dev/null | sort -r) ; do
91 if [[ -n ${x} && -f ${x} ]] ; then
92 local ltver=$(VER_to_int "${version}")
93 local ptver=$(VER_to_int "${x##*/}")
94
95 # If libtool version smaller than patch version, skip patch.
96 [[ ${ltver} -lt ${ptver} ]] && continue
97 # For --remove-internal-dep ...
98 if [[ -n $3 ]] ; then
99 # For replace @REM_INT_DEP@ with what was passed
100 # to --remove-internal-dep
101 sed -e "s|@REM_INT_DEP@|$3|g" ${x} > \
102 ${T}/$$.rem_int_deps.patch
103
104 x="${T}/$$.rem_int_deps.patch"
105 fi
106
107 if ELT_try_and_apply_patch "$1" "${x}" ; then
108 ret=0
109 break
110 fi
111 fi
112 done
113 fi
114
115 return ${ret}
116 }
117
118 elibtoolize() {
119 local x=
120 local y=
121 local do_portage="no"
122 local do_reversedeps="no"
123 local do_only_patches="no"
124 local do_uclibc="yes"
125 local deptoremove=
126 local my_dirlist=
127 local elt_patches="portage relink max_cmd_len sed test tmp"
128 local start_dir="${PWD}"
129
130 my_dirlist="$(ELT_find_ltmain_sh)"
131
132 for x in "$@" ; do
133 case "${x}" in
134 "--portage")
135 # Only apply portage patch, and don't
136 # 'libtoolize --copy --force' if all patches fail.
137 do_portage="yes"
138 ;;
139 "--reverse-deps")
140 # Apply the reverse-deps patch
141 # http://bugzilla.gnome.org/show_bug.cgi?id=75635
142 do_reversedeps="yes"
143 elt_patches="${elt_patches} fix-relink"
144 ;;
145 "--patch-only")
146 # Do not run libtoolize if none of the patches apply ..
147 do_only_patches="yes"
148 ;;
149 "^--remove-internal-dep="*)
150 # We will replace @REM_INT_DEP@ with what is needed
151 # in ELT_walk_patches() ...
152 deptoremove="$(echo "${x}" | sed -e 's|--remove-internal-dep=||')"
153
154 # Add the patch for this ...
155 [ -n "${deptoremove}" ] && elt_patches="${elt_patches} rem-int-dep"
156 ;;
157 "--shallow")
158 # Only patch the ltmain.sh in ${S}
159 if [ -f "${S}/ltmain.sh" ]
160 then
161 my_dirlist="${S}"
162 else
163 my_dirlist=
164 fi
165 ;;
166 "--no-uclibc")
167 do_uclibc="no"
168 ;;
169 *)
170 eerror "Invalid elibtoolize option: $x"
171 die "elibtoolize called with $x ??"
172 esac
173 done
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
188 for x in ${my_dirlist} ; do
189 local tmp=$(echo "${x}" | sed -e "s|${WORKDIR}||")
190 export ELT_APPLIED_PATCHES=
191 export ELT_LTMAIN_SH="${x}/ltmain.sh"
192
193 [[ -f ${x}/.elibtoolized ]] && continue
194
195 cd ${x}
196 einfo "Running elibtoolize in: $(echo "/${tmp}" | sed -e 's|//|/|g; s|^/||')"
197
198 for y in ${elt_patches} ; do
199 local ret=0
200
201 case "${y}" in
202 "rem-int-dep")
203 ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}"
204 ret=$?
205 ;;
206 "fix-relink")
207 # Do not apply if we do not have the relink patch applied ...
208 if [[ -n $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
209 ELT_walk_patches "${x}/ltmain.sh" "${y}"
210 ret=$?
211 fi
212 ;;
213 "max_cmd_len")
214 # Do not apply if $max_cmd_len is not used ...
215 if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then
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}"
247 ret=$?
248 fi
249 ;;
250 *)
251 ELT_walk_patches "${x}/ltmain.sh" "${y}"
252 ret=$?
253 ;;
254 esac
255
256 if [[ ${ret} -ne 0 ]] ; then
257 case ${y} in
258 "relink")
259 # Critical patch, but could be applied ...
260 if [[ -z $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
261 ewarn " Could not apply relink.patch!"
262 fi
263 ;;
264 "portage")
265 # Critical patch - for this one we abort, as it can really
266 # cause breakage without it applied!
267 if [[ ${do_portage} == "yes" ]] ; then
268 # Stupid test to see if its already applied ...
269 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
270 echo
271 eerror "Portage patch requested, but failed to apply!"
272 die "Portage patch requested, but failed to apply!"
273 fi
274 else
275 if [[ -n $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
276 # ewarn " Portage patch seems to be already applied."
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"
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!"
300 ;;
301 esac
302 fi
303 done
304
305 if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then
306 if [[ ${do_portage} == "no" && \
307 ${do_reversedeps} == "no" && \
308 ${do_only_patches} == "no" && \
309 ${deptoremove} == "" ]]
310 then
311 ewarn "Cannot apply any patches, please file a bug about this"
312 break
313
314 # Sometimes ltmain.sh is in a subdirectory ...
315 if [[ ! -f ${x}/configure.in && ! -f ${x}/configure.ac ]] ; then
316 if [[ -f ${x}/../configure.in || -f ${x}/../configure.ac ]] ; then
317 cd "${x}"/../
318 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
327 fi
328 fi
329
330 [[ -f ${x}/libtool ]] && rm -f "${x}/libtool"
331
332 touch "${x}/.elibtoolized"
333 done
334
335 cd "${start_dir}"
336 }
337
338 uclibctoolize() {
339 ewarn "uclibctoolize() is depreciated, please just use libtoolize()!"
340 elibtoolize
341 }
342
343 darwintoolize() {
344 local targets=""
345 local x
346
347 if [[ -z $* ]] ; then
348 targets=$(find ${S} -name ltmain.sh -o -name ltconfig)
349 fi
350
351 einfo "Applying Darwin/libtool patches ..."
352 for x in ${targets} ; do
353 [[ ! -s ${x} ]] && continue
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
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 #
374 VER_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 #
385 VER_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 #
397 VER_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 #
410 VER_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 }

  ViewVC Help
Powered by ViewVC 1.1.20