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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.59 - (show annotations) (download)
Mon Sep 5 22:23:10 2005 UTC (8 years, 10 months ago) by azarah
Branch: MAIN
Changes since 1.58: +21 -5 lines
Move version retrieve stuff to ELT_libtool_version().  Do not warn on relink patch for libtool < 1.4.0.

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

  ViewVC Help
Powered by ViewVC 1.1.20