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

Contents of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.57 - (show annotations) (download)
Sun Sep 4 20:35:42 2005 UTC (8 years, 10 months ago) by azarah
Branch: MAIN
Changes since 1.56: +32 -29 lines
Quoting/style fixes.

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

  ViewVC Help
Powered by ViewVC 1.1.20