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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.82 - (show annotations) (download)
Sat Mar 14 13:02:08 2009 UTC (5 years, 9 months ago) by vapier
Branch: MAIN
Changes since 1.81: +10 -2 lines
start an elibtoolize cross category #262042 by Sven Rebhan.

1 # Copyright 1999-2007 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.81 2008/07/31 20:01:43 drac Exp $
4 #
5 # Maintainer: base-system@gentoo.org
6 #
7 # This eclass patches ltmain.sh distributed with libtoolized packages with the
8 # relink and portage patch among others
9 #
10 # Note, this eclass does not require libtool as it only applies patches to
11 # generated libtool files. We do not run the libtoolize program because that
12 # requires a regeneration of the main autotool files in order to work properly.
13
14 DESCRIPTION="Based on the ${ECLASS} eclass"
15
16 ELIBTOOL_VERSION="2.0.2"
17
18 inherit toolchain-funcs
19
20 ELT_PATCH_DIR="${ECLASSDIR}/ELT-patches"
21 ELT_APPLIED_PATCHES=
22 ELT_LTMAIN_SH=
23
24 #
25 # Returns all the directories containing ltmain.sh
26 #
27 ELT_find_ltmain_sh() {
28 local x=
29 local dirlist=
30
31 for x in $(find "${S}" -name 'ltmain.sh') ; do
32 dirlist="${dirlist} ${x%/*}"
33 done
34
35 echo "${dirlist}"
36 }
37
38 #
39 # See if we can apply $2 on $1, and if so, do it
40 #
41 ELT_try_and_apply_patch() {
42 local ret=0
43 local file=$1
44 local patch=$2
45
46 # We only support patchlevel of 0 - why worry if its static patches?
47 if patch -p0 --dry-run "${file}" "${patch}" &> "${T}/elibtool.log" ; then
48 einfo " Applying $(basename "$(dirname "${patch}")")-${patch##*/}.patch ..."
49 patch -p0 -g0 --no-backup-if-mismatch "${file}" "${patch}" \
50 &> "${T}/elibtool.log"
51 ret=$?
52 export ELT_APPLIED_PATCHES="${ELT_APPLIED_PATCHES} ${patch##*/}"
53 else
54 ret=1
55 fi
56
57 return "${ret}"
58 }
59
60 #
61 # Get string version of ltmain.sh or ltconfig (passed as $1)
62 #
63 ELT_libtool_version() {
64 local ltmain_sh=$1
65 local version=
66
67 version=$(eval $(grep -e '^[[:space:]]*VERSION=' "${ltmain_sh}"); \
68 echo "${VERSION}")
69 [[ -z ${version} ]] && version="0"
70
71 echo "${version}"
72 }
73
74 #
75 # Run through the patches in $2 and see if any
76 # apply to $1 ...
77 #
78 ELT_walk_patches() {
79 local x=
80 local y=
81 local ret=1
82 local file=$1
83 local patch_set=$2
84 local patch_dir=
85 local rem_int_dep=$3
86
87 if [[ -n ${patch_set} ]] ; then
88 if [[ -d ${ELT_PATCH_DIR}/${patch_set} ]] ; then
89 patch_dir="${ELT_PATCH_DIR}/${patch_set}"
90 else
91 return "${ret}"
92 fi
93
94 # Go through the patches in reverse order (large to small)
95 for x in $(ls -d "${patch_dir}"/* 2> /dev/null | grep -v 'CVS' | sort -r) ; do
96 if [[ -n ${x} && -f ${x} ]] ; then
97 # For --remove-internal-dep ...
98 if [[ -n ${rem_int_dep} ]] ; then
99 # For replace @REM_INT_DEP@ with what was passed
100 # to --remove-internal-dep
101 sed -e "s|@REM_INT_DEP@|${rem_int_dep}|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 "${file}" "${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="install-sh ltmain portage relink max_cmd_len sed test tmp cross"
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 ]] ; then
160 my_dirlist=${S}
161 else
162 my_dirlist=
163 fi
164 ;;
165 "--no-uclibc")
166 do_uclibc="no"
167 ;;
168 *)
169 eerror "Invalid elibtoolize option: ${x}"
170 die "elibtoolize called with ${x} ??"
171 esac
172 done
173
174 [[ ${do_uclibc} == "yes" ]] && \
175 elt_patches="${elt_patches} uclibc-conf uclibc-ltconf"
176
177 [[ ${CHOST} == *"-freebsd"* ]] && \
178 elt_patches="${elt_patches} fbsd-conf fbsd-ltconf"
179
180 [[ ${CHOST} == *"-darwin"* ]] && \
181 elt_patches="${elt_patches} darwin-ltconf darwin-ltmain"
182
183 for x in ${my_dirlist} ; do
184 local tmp=$(echo "${x}" | sed -e "s|${WORKDIR}||")
185 export ELT_APPLIED_PATCHES=
186 export ELT_LTMAIN_SH="${x}/ltmain.sh"
187
188 [[ -f ${x}/.elibtoolized ]] && continue
189
190 cd ${x}
191 einfo "Running elibtoolize in: $(echo "/${tmp}" | sed -e 's|//|/|g; s|^/||')"
192
193 for y in ${elt_patches} ; do
194 local ret=0
195
196 case "${y}" in
197 "portage")
198 # Stupid test to see if its already applied ...
199 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
200 ELT_walk_patches "${x}/ltmain.sh" "${y}"
201 ret=$?
202 fi
203 ;;
204 "rem-int-dep")
205 ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}"
206 ret=$?
207 ;;
208 "fix-relink")
209 # Do not apply if we do not have the relink patch applied ...
210 if [[ -n $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
211 ELT_walk_patches "${x}/ltmain.sh" "${y}"
212 ret=$?
213 fi
214 ;;
215 "max_cmd_len")
216 # Do not apply if $max_cmd_len is not used ...
217 if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then
218 ELT_walk_patches "${x}/ltmain.sh" "${y}"
219 ret=$?
220 fi
221 ;;
222 "uclibc-conf")
223 if [[ -e ${x}/configure && \
224 -n $(grep 'Transform linux' "${x}/configure") ]] ; then
225 ELT_walk_patches "${x}/configure" "${y}"
226 ret=$?
227 # ltmain.sh and co might be in a subdirectory ...
228 elif [[ ! -e ${x}/configure && -e ${x}/../configure && \
229 -n $(grep 'Transform linux' "${x}/../configure") ]] ; then
230 ELT_walk_patches "${x}/../configure" "${y}"
231 ret=$?
232 fi
233 ;;
234 "uclibc-ltconf")
235 # Newer libtoolize clears ltconfig, as not used anymore
236 if [[ -s ${x}/ltconfig ]] ; then
237 ELT_walk_patches "${x}/ltconfig" "${y}"
238 ret=$?
239 fi
240 ;;
241 "fbsd-conf")
242 if [[ -e ${x}/configure && \
243 -n $(grep 'version_type=freebsd-' "${x}/configure") ]] ; then
244 ELT_walk_patches "${x}/configure" "${y}"
245 ret=$?
246 # ltmain.sh and co might be in a subdirectory ...
247 elif [[ ! -e ${x}/configure && -e ${x}/../configure && \
248 -n $(grep 'version_type=freebsd-' "${x}/../configure") ]] ; then
249 ELT_walk_patches "${x}/../configure" "${y}"
250 ret=$?
251 fi
252 ;;
253 "fbsd-ltconf")
254 if [[ -s ${x}/ltconfig ]] ; then
255 ELT_walk_patches "${x}/ltconfig" "${y}"
256 ret=$?
257 fi
258 ;;
259 "darwin-ltconf")
260 # Newer libtoolize clears ltconfig, as not used anymore
261 if [[ -s ${x}/ltconfig ]] ; then
262 ELT_walk_patches "${x}/ltconfig" "${y}"
263 ret=$?
264 fi
265 ;;
266 "install-sh")
267 ELT_walk_patches "${x}/install-sh" "${y}"
268 ret=$?
269 ;;
270 "cross")
271 if tc-is-cross-compiler ; then
272 ELT_walk_patches "${x}/ltmain.sh" "${y}"
273 ret=$?
274 fi
275 ;;
276 *)
277 ELT_walk_patches "${x}/ltmain.sh" "${y}"
278 ret=$?
279 ;;
280 esac
281
282 if [[ ${ret} -ne 0 ]] ; then
283 case ${y} in
284 "relink")
285 local version=$(ELT_libtool_version "${x}/ltmain.sh")
286 # Critical patch, but could be applied ...
287 # FIXME: Still need a patch for ltmain.sh > 1.4.0
288 if [[ -z $(grep 'inst_prefix_dir' "${x}/ltmain.sh") && \
289 $(VER_to_int "${version}") -ge $(VER_to_int "1.4.0") ]] ; then
290 ewarn " Could not apply relink.patch!"
291 fi
292 ;;
293 "portage")
294 # Critical patch - for this one we abort, as it can really
295 # cause breakage without it applied!
296 if [[ ${do_portage} == "yes" ]] ; then
297 # Stupid test to see if its already applied ...
298 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
299 echo
300 eerror "Portage patch requested, but failed to apply!"
301 eerror "Please bug azarah or vapier to add proper patch."
302 die "Portage patch requested, but failed to apply!"
303 fi
304 else
305 if [[ -n $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
306 # ewarn " Portage patch seems to be already applied."
307 # ewarn " Please verify that it is not needed."
308 :
309 else
310 local version=$( \
311 eval $(grep -e '^[[:space:]]*VERSION=' "${x}/ltmain.sh"); \
312 echo "${VERSION}")
313
314 echo
315 eerror "Portage patch failed to apply (ltmain.sh version ${version})!"
316 eerror "Please bug azarah or vapier to add proper patch."
317 die "Portage patch failed to apply!"
318 fi
319 # We do not want to run libtoolize ...
320 ELT_APPLIED_PATCHES="portage"
321 fi
322 ;;
323 "uclibc-"*)
324 [[ ${CHOST} == *"-uclibc" ]] && \
325 ewarn " uClibc patch set '${y}' failed to apply!"
326 ;;
327 "fbsd-"*)
328 if [[ ${CHOST} == *"-freebsd"* ]] ; then
329 if [[ -z $(grep 'Handle Gentoo/FreeBSD as it was Linux' \
330 "${x}/configure" "${x}/../configure" 2>/dev/null) ]]; then
331 eerror " FreeBSD patch set '${y}' failed to apply!"
332 die "FreeBSD patch set '${y}' failed to apply!"
333 fi
334 fi
335 ;;
336 "darwin-"*)
337 [[ ${CHOST} == *"-darwin"* ]] && \
338 ewarn " Darwin patch set '${y}' failed to apply!"
339 ;;
340 esac
341 fi
342 done
343
344 if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then
345 if [[ ${do_portage} == "no" && \
346 ${do_reversedeps} == "no" && \
347 ${do_only_patches} == "no" && \
348 ${deptoremove} == "" ]]
349 then
350 ewarn "Cannot apply any patches, please file a bug about this"
351 die
352 fi
353 fi
354
355 [[ -f ${x}/libtool ]] && rm -f "${x}/libtool"
356
357 >> "${x}/.elibtoolized"
358 done
359
360 cd "${start_dir}"
361 }
362
363 uclibctoolize() {
364 ewarn "uclibctoolize() is deprecated, please just use elibtoolize()!"
365 elibtoolize
366 }
367
368 darwintoolize() {
369 ewarn "darwintoolize() is deprecated, please just use elibtoolize()!"
370 elibtoolize
371 }
372
373 # char *VER_major(string)
374 #
375 # Return the Major (X of X.Y.Z) version
376 #
377 VER_major() {
378 [[ -z $1 ]] && return 1
379
380 local VER=$@
381 echo "${VER%%[^[:digit:]]*}"
382 }
383
384 # char *VER_minor(string)
385 #
386 # Return the Minor (Y of X.Y.Z) version
387 #
388 VER_minor() {
389 [[ -z $1 ]] && return 1
390
391 local VER=$@
392 VER=${VER#*.}
393 echo "${VER%%[^[:digit:]]*}"
394 }
395
396 # char *VER_micro(string)
397 #
398 # Return the Micro (Z of X.Y.Z) version.
399 #
400 VER_micro() {
401 [[ -z $1 ]] && return 1
402
403 local VER=$@
404 VER=${VER#*.*.}
405 echo "${VER%%[^[:digit:]]*}"
406 }
407
408 # int VER_to_int(string)
409 #
410 # Convert a string type version (2.4.0) to an int (132096)
411 # for easy compairing or versions ...
412 #
413 VER_to_int() {
414 [[ -z $1 ]] && return 1
415
416 local VER_MAJOR=$(VER_major "$1")
417 local VER_MINOR=$(VER_minor "$1")
418 local VER_MICRO=$(VER_micro "$1")
419 local VER_int=$(( VER_MAJOR * 65536 + VER_MINOR * 256 + VER_MICRO ))
420
421 # We make version 1.0.0 the minimum version we will handle as
422 # a sanity check ... if its less, we fail ...
423 if [[ ${VER_int} -ge 65536 ]] ; then
424 echo "${VER_int}"
425 return 0
426 fi
427
428 echo 1
429 return 1
430 }

  ViewVC Help
Powered by ViewVC 1.1.20