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