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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.47 - (show annotations) (download)
Fri May 27 23:46:13 2005 UTC (9 years, 2 months ago) by vapier
Branch: MAIN
Changes since 1.46: +5 -2 lines
dont run libtoolize anymore

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

  ViewVC Help
Powered by ViewVC 1.1.20