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

Diff of /eclass/libtool.eclass

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

Revision 1.62 Revision 1.86
1# Copyright 1999-2005 Gentoo Foundation 1# Copyright 1999-2007 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.62 2005/12/07 22:50:05 azarah Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/libtool.eclass,v 1.86 2010/04/14 02:13:54 vapier Exp $
4# 4#
5# Author: Martin Schlemmer <azarah@gentoo.org> 5# Maintainer: base-system@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#
10 10# Note, this eclass does not require libtool as it only applies patches to
11# 2004.09.25 rac 11# generated libtool files. We do not run the libtoolize program because that
12# i have verified that at least one package can use this eclass and 12# requires a regeneration of the main autotool files in order to work properly.
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 13
19DESCRIPTION="Based on the ${ECLASS} eclass" 14DESCRIPTION="Based on the ${ECLASS} eclass"
20 15
21ELIBTOOL_VERSION="2.0.2" 16ELIBTOOL_VERSION="2.0.2"
22 17
18inherit toolchain-funcs
19
23ELT_PATCH_DIR="${PORTDIR}/eclass/ELT-patches" 20ELT_PATCH_DIR="${ECLASSDIR}/ELT-patches"
24ELT_APPLIED_PATCHES= 21ELT_APPLIED_PATCHES=
25ELT_LTMAIN_SH= 22ELT_LTMAIN_SH=
26 23
27# 24#
28# Returns all the directories containing ltmain.sh 25# Returns all the directories containing ltmain.sh
77# 74#
78# Run through the patches in $2 and see if any 75# Run through the patches in $2 and see if any
79# apply to $1 ... 76# apply to $1 ...
80# 77#
81ELT_walk_patches() { 78ELT_walk_patches() {
82 local x= 79 local patch
83 local y=
84 local ret=1 80 local ret=1
85 local file=$1 81 local file=$1
86 local patch_set=$2 82 local patch_set=$2
87 local patch_dir= 83 local patch_dir="${ELT_PATCH_DIR}/${patch_set}"
88 local rem_int_dep=$3 84 local rem_int_dep=$3
89 local version=
90 local ltmain_sh=$1
91 85
92 [[ ${file} == *"/configure" ]] && ltmain_sh=${ELT_LTMAIN_SH} 86 [[ -z ${patch_set} ]] && return 1
93 version=$(ELT_libtool_version "${ltmain_sh}") 87 [[ ! -d ${patch_dir} ]] && return 1
94 88
95 if [[ -n ${patch_set} ]] ; then 89 pushd "${ELT_PATCH_DIR}" >/dev/null
96 if [[ -d ${ELT_PATCH_DIR}/${patch_set} ]] ; then 90
97 patch_dir="${ELT_PATCH_DIR}/${patch_set}" 91 # Go through the patches in reverse order (newer version to older)
98 else 92 for patch in $(find "${patch_set}" -maxdepth 1 -type f | LC_ALL=C sort -r) ; do
99 return "${ret}" 93 # For --remove-internal-dep ...
94 if [[ -n ${rem_int_dep} ]] ; then
95 # For replace @REM_INT_DEP@ with what was passed
96 # to --remove-internal-dep
97 local tmp="${T}/$$.rem_int_deps.patch"
98 sed -e "s|@REM_INT_DEP@|${rem_int_dep}|g" "${patch}" > "${tmp}"
99 patch=${tmp}
100 fi 100 fi
101 101
102 if [[ ${version} == "0" ]] ; then 102 if ELT_try_and_apply_patch "${file}" "${patch}" ; then
103 eerror "Could not get VERSION for ${file##*/}!" 103 # Break to unwind w/popd rather than return directly
104 die "Could not get VERSION for ${file##*/}!" 104 ret=0
105 break
105 fi 106 fi
106
107 # Go through the patches in reverse order (large to small)
108 for x in $(ls -d "${patch_dir}"/* 2> /dev/null | grep -v 'CVS' | sort -r) ; do
109 if [[ -n ${x} && -f ${x} ]] ; then
110 local ltver=$(VER_to_int "${version}")
111 local ptver=$(VER_to_int "${x##*/}")
112
113 # If libtool version smaller than patch version, skip patch.
114 [[ ${ltver} -lt ${ptver} ]] && continue
115 # For --remove-internal-dep ...
116 if [[ -n ${rem_int_dep} ]] ; then
117 # For replace @REM_INT_DEP@ with what was passed
118 # to --remove-internal-dep
119 sed -e "s|@REM_INT_DEP@|${rem_int_dep}|g" ${x} > \
120 "${T}/$$.rem_int_deps.patch"
121
122 x="${T}/$$.rem_int_deps.patch"
123 fi
124
125 if ELT_try_and_apply_patch "${file}" "${x}" ; then
126 ret=0
127 break
128 fi
129 fi
130 done 107 done
131 fi
132 108
109 popd "${patch_dir}" >/dev/null
133 return "${ret}" 110 return ${ret}
134} 111}
135 112
136elibtoolize() { 113elibtoolize() {
137 local x= 114 local x=
138 local y= 115 local y=
140 local do_reversedeps="no" 117 local do_reversedeps="no"
141 local do_only_patches="no" 118 local do_only_patches="no"
142 local do_uclibc="yes" 119 local do_uclibc="yes"
143 local deptoremove= 120 local deptoremove=
144 local my_dirlist= 121 local my_dirlist=
145 local elt_patches="portage relink max_cmd_len sed test tmp" 122 local elt_patches="install-sh ltmain portage relink max_cmd_len sed test tmp cross as-needed"
146 local start_dir=${PWD} 123 local start_dir=${PWD}
147 124
148 my_dirlist=$(ELT_find_ltmain_sh) 125 my_dirlist=$(ELT_find_ltmain_sh)
149 126
150 for x in "$@" ; do 127 for x in "$@" ; do
190 done 167 done
191 168
192 [[ ${do_uclibc} == "yes" ]] && \ 169 [[ ${do_uclibc} == "yes" ]] && \
193 elt_patches="${elt_patches} uclibc-conf uclibc-ltconf" 170 elt_patches="${elt_patches} uclibc-conf uclibc-ltconf"
194 171
195 [[ ${CHOST} == *"-freebsd"* ]] && \ 172 case "${CHOST}" in
173 *-aix*)
196 elt_patches="${elt_patches} fbsd-conf" 174 elt_patches="${elt_patches} hardcode aixrtl"
197 175 ;;
198 if useq ppc-macos ; then 176 *-darwin*)
199 local opts
200 [[ -f Makefile.am ]] && opts="--automake"
201 glibtoolize --copy --force ${opts}
202
203 elt_patches="${elt_patches} darwin-ltconf darwin-ltmain" 177 elt_patches="${elt_patches} darwin-ltconf darwin-ltmain darwin-conf"
204 fi 178 ;;
179 *-freebsd*)
180 elt_patches="${elt_patches} fbsd-conf fbsd-ltconf"
181 ;;
182 *-hpux*)
183 elt_patches="${elt_patches} hpux-conf deplibs hc-flag-ld hardcode hardcode-relink relink-prog no-lc"
184 ;;
185 *-irix*)
186 elt_patches="${elt_patches} irix-ltmain"
187 ;;
188 *-mint*)
189 elt_patches="${elt_patches} mint-conf"
190 ;;
191 esac
205 192
206 for x in ${my_dirlist} ; do 193 for x in ${my_dirlist} ; do
207 local tmp=$(echo "${x}" | sed -e "s|${WORKDIR}||") 194 local tmp=$(echo "${x}" | sed -e "s|${WORKDIR}||")
208 export ELT_APPLIED_PATCHES= 195 export ELT_APPLIED_PATCHES=
209 export ELT_LTMAIN_SH="${x}/ltmain.sh" 196 export ELT_LTMAIN_SH="${x}/ltmain.sh"
215 202
216 for y in ${elt_patches} ; do 203 for y in ${elt_patches} ; do
217 local ret=0 204 local ret=0
218 205
219 case "${y}" in 206 case "${y}" in
207 "portage")
208 # Stupid test to see if its already applied ...
209 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
210 ELT_walk_patches "${x}/ltmain.sh" "${y}"
211 ret=$?
212 fi
213 ;;
220 "rem-int-dep") 214 "rem-int-dep")
221 ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}" 215 ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}"
222 ret=$? 216 ret=$?
223 ;; 217 ;;
224 "fix-relink") 218 "fix-relink")
233 if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then 227 if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then
234 ELT_walk_patches "${x}/ltmain.sh" "${y}" 228 ELT_walk_patches "${x}/ltmain.sh" "${y}"
235 ret=$? 229 ret=$?
236 fi 230 fi
237 ;; 231 ;;
232 "as-needed")
233 ELT_walk_patches "${x}/ltmain.sh" "${y}"
234 ret=$?
235 ;;
238 "uclibc-conf") 236 "uclibc-conf")
239 if [[ -e ${x}/configure && \ 237 if [[ -e ${x}/configure && \
240 -n $(grep 'Transform linux' "${x}/configure") ]] ; then 238 -n $(grep 'Transform linux' "${x}/configure") ]] ; then
241 ELT_walk_patches "${x}/configure" "${y}" 239 ELT_walk_patches "${x}/configure" "${y}"
242 ret=$? 240 ret=$?
264 -n $(grep 'version_type=freebsd-' "${x}/../configure") ]] ; then 262 -n $(grep 'version_type=freebsd-' "${x}/../configure") ]] ; then
265 ELT_walk_patches "${x}/../configure" "${y}" 263 ELT_walk_patches "${x}/../configure" "${y}"
266 ret=$? 264 ret=$?
267 fi 265 fi
268 ;; 266 ;;
267 "fbsd-ltconf")
268 if [[ -s ${x}/ltconfig ]] ; then
269 ELT_walk_patches "${x}/ltconfig" "${y}"
270 ret=$?
271 fi
272 ;;
273 "darwin-conf")
274 if [[ -e ${x}/configure && \
275 -n $(grep '&& echo \.so ||' "${x}/configure") ]] ; then
276 ELT_walk_patches "${x}/configure" "${y}"
277 ret=$?
278 # ltmain.sh and co might be in a subdirectory ...
279 elif [[ ! -e ${x}/configure && -e ${x}/../configure && \
280 -n $(grep '&& echo \.so ||' "${x}/../configure") ]] ; then
281 ELT_walk_patches "${x}/../configure" "${y}"
282 ret=$?
283 fi
284 ;;
269 "darwin-ltconf") 285 "darwin-ltconf")
270 # Newer libtoolize clears ltconfig, as not used anymore 286 # Newer libtoolize clears ltconfig, as not used anymore
271 if [[ -s ${x}/ltconfig ]] ; then 287 if [[ -s ${x}/ltconfig ]] ; then
272 ELT_walk_patches "${x}/ltconfig" "${y}" 288 ELT_walk_patches "${x}/ltconfig" "${y}"
289 ret=$?
290 fi
291 ;;
292 "darwin-ltmain")
293 # special case to avoid false positives (failing to apply
294 # ltmain.sh path message), newer libtools have this patch
295 # built in, so not much to patch around then
296 if [[ -e ${x}/ltmain.sh && \
297 -z $(grep 'verstring="-compatibility_version' "${x}/ltmain.sh") ]] ; then
298 ELT_walk_patches "${x}/ltmain.sh" "${y}"
299 ret=$?
300 fi
301 ;;
302 "aixrtl" | "hpux-conf")
303 ret=1
304 local subret=0
305 # apply multiple patches as often as they match
306 while [[ $subret -eq 0 ]]; do
307 subret=1
308 if [[ -e ${x}/configure ]]; then
309 ELT_walk_patches "${x}/configure" "${y}"
310 subret=$?
311 # ltmain.sh and co might be in a subdirectory ...
312 elif [[ ! -e ${x}/configure && -e ${x}/../configure ]] ; then
313 ELT_walk_patches "${x}/../configure" "${y}"
314 subret=$?
315 fi
316 if [[ $subret -eq 0 ]]; then
317 # have at least one patch succeeded.
318 ret=0
319 fi
320 done
321 ;;
322 "mint-conf")
323 ret=1
324 local subret=1
325 if [[ -e ${x}/configure ]]; then
326 ELT_walk_patches "${x}/configure" "${y}"
327 subret=$?
328 # ltmain.sh and co might be in a subdirectory ...
329 elif [[ ! -e ${x}/configure && -e ${x}/../configure ]] ; then
330 ELT_walk_patches "${x}/../configure" "${y}"
331 subret=$?
332 fi
333 if [[ $subret -eq 0 ]]; then
334 # have at least one patch succeeded.
335 ret=0
336 fi
337 ;;
338 "install-sh")
339 ELT_walk_patches "${x}/install-sh" "${y}"
340 ret=$?
341 ;;
342 "cross")
343 if tc-is-cross-compiler ; then
344 ELT_walk_patches "${x}/ltmain.sh" "${y}"
273 ret=$? 345 ret=$?
274 fi 346 fi
275 ;; 347 ;;
276 *) 348 *)
277 ELT_walk_patches "${x}/ltmain.sh" "${y}" 349 ELT_walk_patches "${x}/ltmain.sh" "${y}"
296 if [[ ${do_portage} == "yes" ]] ; then 368 if [[ ${do_portage} == "yes" ]] ; then
297 # Stupid test to see if its already applied ... 369 # Stupid test to see if its already applied ...
298 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then 370 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
299 echo 371 echo
300 eerror "Portage patch requested, but failed to apply!" 372 eerror "Portage patch requested, but failed to apply!"
373 eerror "Please bug azarah or vapier to add proper patch."
301 die "Portage patch requested, but failed to apply!" 374 die "Portage patch requested, but failed to apply!"
302 fi 375 fi
303 else 376 else
304 if [[ -n $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then 377 if [[ -n $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
305 # ewarn " Portage patch seems to be already applied." 378 # ewarn " Portage patch seems to be already applied."
310 eval $(grep -e '^[[:space:]]*VERSION=' "${x}/ltmain.sh"); \ 383 eval $(grep -e '^[[:space:]]*VERSION=' "${x}/ltmain.sh"); \
311 echo "${VERSION}") 384 echo "${VERSION}")
312 385
313 echo 386 echo
314 eerror "Portage patch failed to apply (ltmain.sh version ${version})!" 387 eerror "Portage patch failed to apply (ltmain.sh version ${version})!"
388 eerror "Please bug azarah or vapier to add proper patch."
315 die "Portage patch failed to apply!" 389 die "Portage patch failed to apply!"
316 fi 390 fi
317 # We do not want to run libtoolize ... 391 # We do not want to run libtoolize ...
318 ELT_APPLIED_PATCHES="portage" 392 ELT_APPLIED_PATCHES="portage"
319 fi 393 fi
322 [[ ${CHOST} == *"-uclibc" ]] && \ 396 [[ ${CHOST} == *"-uclibc" ]] && \
323 ewarn " uClibc patch set '${y}' failed to apply!" 397 ewarn " uClibc patch set '${y}' failed to apply!"
324 ;; 398 ;;
325 "fbsd-"*) 399 "fbsd-"*)
326 if [[ ${CHOST} == *"-freebsd"* ]] ; then 400 if [[ ${CHOST} == *"-freebsd"* ]] ; then
327 if [[ -z $(grep 'Handle Gentoo/FreeBSD as it was Linux' "${x}/configure") ]]; then 401 if [[ -z $(grep 'Handle Gentoo/FreeBSD as it was Linux' \
402 "${x}/configure" "${x}/../configure" 2>/dev/null) ]]; then
328 eerror " FreeBSD patch set '${y}' failed to apply!" 403 eerror " FreeBSD patch set '${y}' failed to apply!"
329 die "FreeBSD patch set '${y}' failed to apply!" 404 die "FreeBSD patch set '${y}' failed to apply!"
330 fi 405 fi
331 fi 406 fi
332 ;; 407 ;;
333 "darwin-"*) 408 "darwin-"*)
334 useq ppc-macos && \ 409 [[ ${CHOST} == *"-darwin"* ]] && \
335 ewarn " Darwin patch set '${y}' failed to apply!" 410 ewarn " Darwin patch set '${y}' failed to apply!"
336 ;; 411 ;;
337 esac 412 esac
338 fi 413 fi
339 done 414 done
343 ${do_reversedeps} == "no" && \ 418 ${do_reversedeps} == "no" && \
344 ${do_only_patches} == "no" && \ 419 ${do_only_patches} == "no" && \
345 ${deptoremove} == "" ]] 420 ${deptoremove} == "" ]]
346 then 421 then
347 ewarn "Cannot apply any patches, please file a bug about this" 422 ewarn "Cannot apply any patches, please file a bug about this"
348 break
349
350 # Sometimes ltmain.sh is in a subdirectory ...
351 if [[ ! -f ${x}/configure.in && ! -f ${x}/configure.ac ]] ; then
352 if [[ -f ${x}/../configure.in || -f ${x}/../configure.ac ]] ; then
353 cd "${x}"/../
354 fi
355 fi 423 die
356
357 if type -p libtoolize &> /dev/null ; then
358 ewarn "Cannot apply any patches, running libtoolize..."
359 libtoolize --copy --force
360 fi
361 cd "${x}"
362 break
363 fi 424 fi
364 fi 425 fi
365 426
366 [[ -f ${x}/libtool ]] && rm -f "${x}/libtool" 427 [[ -f ${x}/libtool ]] && rm -f "${x}/libtool"
367 428
368 touch "${x}/.elibtoolized" 429 >> "${x}/.elibtoolized"
369 done 430 done
370 431
371 cd "${start_dir}" 432 cd "${start_dir}"
372} 433}
373 434
374uclibctoolize() { 435uclibctoolize() {
375 ewarn "uclibctoolize() is depreciated, please just use elibtoolize()!" 436 ewarn "uclibctoolize() is deprecated, please just use elibtoolize()!"
376 elibtoolize 437 elibtoolize
377} 438}
378 439
379darwintoolize() { 440darwintoolize() {
380 ewarn "darwintoolize() is depreciated, please just use elibtoolize()!" 441 ewarn "darwintoolize() is deprecated, please just use elibtoolize()!"
381 elibtoolize 442 elibtoolize
382} 443}
383 444
384# char *VER_major(string) 445# char *VER_major(string)
385# 446#

Legend:
Removed from v.1.62  
changed lines
  Added in v.1.86

  ViewVC Help
Powered by ViewVC 1.1.20