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 |
} |