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

Diff of /eclass/libtool.eclass

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.1.37  
changed lines
  Added in v.1.51

  ViewVC Help
Powered by ViewVC 1.1.20