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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.60 - (show annotations) (download)
Tue Oct 4 15:48:05 2005 UTC (9 years, 2 months ago) by azarah
Branch: MAIN
Changes since 1.59: +22 -30 lines
Update elibtoolize to apply darwin patches.

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

  ViewVC Help
Powered by ViewVC 1.1.20