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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.54 - (show annotations) (download)
Sun Sep 4 15:15:37 2005 UTC (8 years, 10 months ago) by swegener
Branch: MAIN
Changes since 1.53: +2 -2 lines
Apply whitespace check from repoman to eclasses.

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

  ViewVC Help
Powered by ViewVC 1.1.20