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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.55 - (show annotations) (download)
Sun Sep 4 18:40:48 2005 UTC (9 years ago) by flameeyes
Branch: MAIN
Changes since 1.54: +21 -1 lines
Added elibtoolize patch for Gentoo/FreeBSD, to use linux-style link versioning.

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.54 2005/09/04 15:15:37 swegener 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 deptoremove=
125 local my_dirlist=
126 local elt_patches="portage relink max_cmd_len sed test tmp \
127 uclibc-conf uclibc-ltconf"
128 local start_dir="${PWD}"
129
130 my_dirlist="$(ELT_find_ltmain_sh)"
131
132 [[ ${CHOST} == *"-freebsd"* ]] && \
133 elt_patches="${elt_patches} fbsd-conf"
134
135 for x in "$@" ; do
136 case "${x}" in
137 "--portage")
138 # Only apply portage patch, and don't
139 # 'libtoolize --copy --force' if all patches fail.
140 do_portage="yes"
141 ;;
142 "--reverse-deps")
143 # Apply the reverse-deps patch
144 # http://bugzilla.gnome.org/show_bug.cgi?id=75635
145 do_reversedeps="yes"
146 elt_patches="${elt_patches} fix-relink"
147 ;;
148 "--patch-only")
149 # Do not run libtoolize if none of the patches apply ..
150 do_only_patches="yes"
151 ;;
152 "^--remove-internal-dep="*)
153 # We will replace @REM_INT_DEP@ with what is needed
154 # in ELT_walk_patches() ...
155 deptoremove="$(echo "${x}" | sed -e 's|--remove-internal-dep=||')"
156
157 # Add the patch for this ...
158 [ -n "${deptoremove}" ] && elt_patches="${elt_patches} rem-int-dep"
159 ;;
160 "--shallow")
161 # Only patch the ltmain.sh in ${S}
162 if [ -f "${S}/ltmain.sh" ]
163 then
164 my_dirlist="${S}"
165 else
166 my_dirlist=
167 fi
168 ;;
169 "--no-uclibc")
170 NO_UCLIBCTOOLIZE=1
171 ;;
172 *)
173 eerror "Invalid elibtoolize option: $x"
174 die "elibtoolize called with $x ??"
175 esac
176 done
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
185 for x in ${my_dirlist} ; do
186 local tmp=$(echo "${x}" | sed -e "s|${WORKDIR}||")
187 export ELT_APPLIED_PATCHES=
188 export ELT_LTMAIN_SH="${x}/ltmain.sh"
189
190 [[ -f ${x}/.elibtoolized ]] && continue
191
192 cd ${x}
193 einfo "Running elibtoolize in: $(echo "/${tmp}" | sed -e 's|//|/|g; s|^/||')"
194
195 for y in ${elt_patches} ; do
196 local ret=0
197
198 case "${y}" in
199 "rem-int-dep")
200 ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}"
201 ret=$?
202 ;;
203 "fix-relink")
204 # Do not apply if we do not have the relink patch applied ...
205 if [[ -n $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
206 ELT_walk_patches "${x}/ltmain.sh" "${y}"
207 ret=$?
208 fi
209 ;;
210 "max_cmd_len")
211 # Do not apply if $max_cmd_len is not used ...
212 if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then
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}"
244 ret=$?
245 fi
246 ;;
247 *)
248 ELT_walk_patches "${x}/ltmain.sh" "${y}"
249 ret=$?
250 ;;
251 esac
252
253 if [[ ${ret} -ne 0 ]] ; then
254 case ${y} in
255 "relink")
256 # Critical patch, but could be applied ...
257 if [[ -z $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
258 ewarn " Could not apply relink.patch!"
259 fi
260 ;;
261 "portage")
262 # Critical patch - for this one we abort, as it can really
263 # cause breakage without it applied!
264 if [[ ${do_portage} == "yes" ]] ; then
265 # Stupid test to see if its already applied ...
266 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
267 echo
268 eerror "Portage patch requested, but failed to apply!"
269 die "Portage patch requested, but failed to apply!"
270 fi
271 else
272 if [[ -n $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
273 # ewarn " Portage patch seems to be already applied."
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"
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!"
297 ;;
298 esac
299 fi
300 done
301
302 if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then
303 if [[ ${do_portage} == "no" && \
304 ${do_reversedeps} == "no" && \
305 ${do_only_patches} == "no" && \
306 ${deptoremove} == "" ]]
307 then
308 ewarn "Cannot apply any patches, please file a bug about this"
309 break
310
311 # Sometimes ltmain.sh is in a subdirectory ...
312 if [[ ! -f ${x}/configure.in && ! -f ${x}/configure.ac ]] ; then
313 if [[ -f ${x}/../configure.in || -f ${x}/../configure.ac ]] ; then
314 cd "${x}"/../
315 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
324 fi
325 fi
326
327 [[ -f ${x}/libtool ]] && rm -f "${x}/libtool"
328
329 touch "${x}/.elibtoolized"
330 done
331
332 cd "${start_dir}"
333 }
334
335 uclibctoolize() {
336 ewarn "uclibctoolize() is depreciated, please just use libtoolize()!"
337 elibtoolize
338 }
339
340 darwintoolize() {
341 local targets=""
342 local x
343
344 if [[ -z $* ]] ; then
345 targets=$(find ${S} -name ltmain.sh -o -name ltconfig)
346 fi
347
348 einfo "Applying Darwin/libtool patches ..."
349 for x in ${targets} ; do
350 [[ ! -s ${x} ]] && continue
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
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 #
371 VER_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 #
382 VER_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 #
394 VER_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 #
407 VER_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 }

  ViewVC Help
Powered by ViewVC 1.1.20