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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.20