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

Diff of /eclass/libtool.eclass

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

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

Legend:
Removed from v.1.40  
changed lines
  Added in v.1.56

  ViewVC Help
Powered by ViewVC 1.1.20