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

Diff of /eclass/libtool.eclass

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

Revision 1.59 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.59 2005/09/05 22:23:10 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
45 local ret=0 42 local ret=0
46 local file=$1 43 local file=$1
47 local patch=$2 44 local patch=$2
48 45
49 # We only support patchlevel of 0 - why worry if its static patches? 46 # We only support patchlevel of 0 - why worry if its static patches?
50 if patch -p0 --dry-run "${file}" < "${patch}" &> "${T}/elibtool.log" ; then 47 if patch -p0 --dry-run "${file}" "${patch}" &> "${T}/elibtool.log" ; then
51 einfo " Applying $(basename "$(dirname "${patch}")")-${patch##*/}.patch ..." 48 einfo " Applying $(basename "$(dirname "${patch}")")-${patch##*/}.patch ..."
52 patch -p0 "${file}" < "${patch}" &> "${T}/elibtool.log" 49 patch -p0 -g0 --no-backup-if-mismatch "${file}" "${patch}" \
50 &> "${T}/elibtool.log"
53 ret=$? 51 ret=$?
54 export ELT_APPLIED_PATCHES="${ELT_APPLIED_PATCHES} ${patch##*/}" 52 export ELT_APPLIED_PATCHES="${ELT_APPLIED_PATCHES} ${patch##*/}"
55 else 53 else
56 ret=1 54 ret=1
57 fi 55 fi
76# 74#
77# Run through the patches in $2 and see if any 75# Run through the patches in $2 and see if any
78# apply to $1 ... 76# apply to $1 ...
79# 77#
80ELT_walk_patches() { 78ELT_walk_patches() {
81 local x= 79 local patch
82 local y=
83 local ret=1 80 local ret=1
84 local file=$1 81 local file=$1
85 local patch_set=$2 82 local patch_set=$2
86 local patch_dir= 83 local patch_dir="${ELT_PATCH_DIR}/${patch_set}"
87 local rem_int_dep=$3 84 local rem_int_dep=$3
88 local version=
89 local ltmain_sh=$1
90 85
91 [[ ${file} == *"/configure" ]] && ltmain_sh=${ELT_LTMAIN_SH} 86 [[ -z ${patch_set} ]] && return 1
92 version=$(ELT_libtool_version "${ltmain_sh}") 87 [[ ! -d ${patch_dir} ]] && return 1
93 88
94 if [[ -n ${patch_set} ]] ; then 89 pushd "${ELT_PATCH_DIR}" >/dev/null
95 if [[ -d ${ELT_PATCH_DIR}/${patch_set} ]] ; then 90
96 patch_dir="${ELT_PATCH_DIR}/${patch_set}" 91 # Go through the patches in reverse order (newer version to older)
97 else 92 for patch in $(find "${patch_set}" -maxdepth 1 -type f | LC_ALL=C sort -r) ; do
98 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}
99 fi 100 fi
100 101
101 if [[ ${version} == "0" ]] ; then 102 if ELT_try_and_apply_patch "${file}" "${patch}" ; then
102 eerror "Could not get VERSION for ${file##*/}!" 103 # Break to unwind w/popd rather than return directly
103 die "Could not get VERSION for ${file##*/}!" 104 ret=0
105 break
104 fi 106 fi
105
106 # Go through the patches in reverse order (large to small)
107 for x in $(ls -d "${patch_dir}"/* 2> /dev/null | sort -r) ; do
108 if [[ -n ${x} && -f ${x} ]] ; then
109 local ltver=$(VER_to_int "${version}")
110 local ptver=$(VER_to_int "${x##*/}")
111
112 # If libtool version smaller than patch version, skip patch.
113 [[ ${ltver} -lt ${ptver} ]] && continue
114 # For --remove-internal-dep ...
115 if [[ -n ${rem_int_dep} ]] ; then
116 # For replace @REM_INT_DEP@ with what was passed
117 # to --remove-internal-dep
118 sed -e "s|@REM_INT_DEP@|${rem_int_dep}|g" ${x} > \
119 "${T}/$$.rem_int_deps.patch"
120
121 x="${T}/$$.rem_int_deps.patch"
122 fi
123
124 if ELT_try_and_apply_patch "${file}" "${x}" ; then
125 ret=0
126 break
127 fi
128 fi
129 done 107 done
130 fi
131 108
109 popd "${patch_dir}" >/dev/null
132 return "${ret}" 110 return ${ret}
133} 111}
134 112
135elibtoolize() { 113elibtoolize() {
136 local x= 114 local x=
137 local y= 115 local y=
139 local do_reversedeps="no" 117 local do_reversedeps="no"
140 local do_only_patches="no" 118 local do_only_patches="no"
141 local do_uclibc="yes" 119 local do_uclibc="yes"
142 local deptoremove= 120 local deptoremove=
143 local my_dirlist= 121 local my_dirlist=
144 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"
145 local start_dir=${PWD} 123 local start_dir=${PWD}
146 124
147 my_dirlist=$(ELT_find_ltmain_sh) 125 my_dirlist=$(ELT_find_ltmain_sh)
148 126
149 for x in "$@" ; do 127 for x in "$@" ; do
189 done 167 done
190 168
191 [[ ${do_uclibc} == "yes" ]] && \ 169 [[ ${do_uclibc} == "yes" ]] && \
192 elt_patches="${elt_patches} uclibc-conf uclibc-ltconf" 170 elt_patches="${elt_patches} uclibc-conf uclibc-ltconf"
193 171
194 [[ ${CHOST} == *"-freebsd"* ]] && \ 172 case "${CHOST}" in
173 *-aix*)
174 elt_patches="${elt_patches} hardcode aixrtl"
175 ;;
176 *-darwin*)
177 elt_patches="${elt_patches} darwin-ltconf darwin-ltmain darwin-conf"
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*)
195 elt_patches="${elt_patches} fbsd-conf" 189 elt_patches="${elt_patches} mint-conf"
196 190 ;;
197 if use ppc-macos ; then 191 esac
198 local opts
199 [[ -f Makefile.am ]] && opts="--automake"
200 glibtoolize --copy --force ${opts}
201 darwintoolize
202 fi
203 192
204 for x in ${my_dirlist} ; do 193 for x in ${my_dirlist} ; do
205 local tmp=$(echo "${x}" | sed -e "s|${WORKDIR}||") 194 local tmp=$(echo "${x}" | sed -e "s|${WORKDIR}||")
206 export ELT_APPLIED_PATCHES= 195 export ELT_APPLIED_PATCHES=
207 export ELT_LTMAIN_SH="${x}/ltmain.sh" 196 export ELT_LTMAIN_SH="${x}/ltmain.sh"
213 202
214 for y in ${elt_patches} ; do 203 for y in ${elt_patches} ; do
215 local ret=0 204 local ret=0
216 205
217 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 ;;
218 "rem-int-dep") 214 "rem-int-dep")
219 ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}" 215 ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}"
220 ret=$? 216 ret=$?
221 ;; 217 ;;
222 "fix-relink") 218 "fix-relink")
231 if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then 227 if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then
232 ELT_walk_patches "${x}/ltmain.sh" "${y}" 228 ELT_walk_patches "${x}/ltmain.sh" "${y}"
233 ret=$? 229 ret=$?
234 fi 230 fi
235 ;; 231 ;;
232 "as-needed")
233 ELT_walk_patches "${x}/ltmain.sh" "${y}"
234 ret=$?
235 ;;
236 "uclibc-conf") 236 "uclibc-conf")
237 if [[ -e ${x}/configure && \ 237 if [[ -e ${x}/configure && \
238 -n $(grep 'Transform linux' "${x}/configure") ]] ; then 238 -n $(grep 'Transform linux' "${x}/configure") ]] ; then
239 ELT_walk_patches "${x}/configure" "${y}" 239 ELT_walk_patches "${x}/configure" "${y}"
240 ret=$? 240 ret=$?
244 ELT_walk_patches "${x}/../configure" "${y}" 244 ELT_walk_patches "${x}/../configure" "${y}"
245 ret=$? 245 ret=$?
246 fi 246 fi
247 ;; 247 ;;
248 "uclibc-ltconf") 248 "uclibc-ltconf")
249 # Newer libtoolize clears ltconfig, as not used anymore
249 if [[ -e ${x}/ltconfig ]] ; then 250 if [[ -s ${x}/ltconfig ]] ; then
250 ELT_walk_patches "${x}/ltconfig" "${y}" 251 ELT_walk_patches "${x}/ltconfig" "${y}"
251 ret=$? 252 ret=$?
252 fi 253 fi
253 ;; 254 ;;
254 "fbsd-conf") 255 "fbsd-conf")
258 ret=$? 259 ret=$?
259 # ltmain.sh and co might be in a subdirectory ... 260 # ltmain.sh and co might be in a subdirectory ...
260 elif [[ ! -e ${x}/configure && -e ${x}/../configure && \ 261 elif [[ ! -e ${x}/configure && -e ${x}/../configure && \
261 -n $(grep 'version_type=freebsd-' "${x}/../configure") ]] ; then 262 -n $(grep 'version_type=freebsd-' "${x}/../configure") ]] ; then
262 ELT_walk_patches "${x}/../configure" "${y}" 263 ELT_walk_patches "${x}/../configure" "${y}"
264 ret=$?
265 fi
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 ;;
285 "darwin-ltconf")
286 # Newer libtoolize clears ltconfig, as not used anymore
287 if [[ -s ${x}/ltconfig ]] ; then
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}"
263 ret=$? 345 ret=$?
264 fi 346 fi
265 ;; 347 ;;
266 *) 348 *)
267 ELT_walk_patches "${x}/ltmain.sh" "${y}" 349 ELT_walk_patches "${x}/ltmain.sh" "${y}"
286 if [[ ${do_portage} == "yes" ]] ; then 368 if [[ ${do_portage} == "yes" ]] ; then
287 # Stupid test to see if its already applied ... 369 # Stupid test to see if its already applied ...
288 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
289 echo 371 echo
290 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."
291 die "Portage patch requested, but failed to apply!" 374 die "Portage patch requested, but failed to apply!"
292 fi 375 fi
293 else 376 else
294 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
295 # ewarn " Portage patch seems to be already applied." 378 # ewarn " Portage patch seems to be already applied."
300 eval $(grep -e '^[[:space:]]*VERSION=' "${x}/ltmain.sh"); \ 383 eval $(grep -e '^[[:space:]]*VERSION=' "${x}/ltmain.sh"); \
301 echo "${VERSION}") 384 echo "${VERSION}")
302 385
303 echo 386 echo
304 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."
305 die "Portage patch failed to apply!" 389 die "Portage patch failed to apply!"
306 fi 390 fi
307 # We do not want to run libtoolize ... 391 # We do not want to run libtoolize ...
308 ELT_APPLIED_PATCHES="portage" 392 ELT_APPLIED_PATCHES="portage"
309 fi 393 fi
311 "uclibc-"*) 395 "uclibc-"*)
312 [[ ${CHOST} == *"-uclibc" ]] && \ 396 [[ ${CHOST} == *"-uclibc" ]] && \
313 ewarn " uClibc patch set '${y}' failed to apply!" 397 ewarn " uClibc patch set '${y}' failed to apply!"
314 ;; 398 ;;
315 "fbsd-"*) 399 "fbsd-"*)
316 [[ ${CHOST} == *"-freebsd"* ]] && \ 400 if [[ ${CHOST} == *"-freebsd"* ]] ; then
401 if [[ -z $(grep 'Handle Gentoo/FreeBSD as it was Linux' \
402 "${x}/configure" "${x}/../configure" 2>/dev/null) ]]; then
317 eerror " FreeBSD patch set '${y}' failed to apply!" 403 eerror " FreeBSD patch set '${y}' failed to apply!"
318 die "FreeBSD patch set '${y}' failed to apply!" 404 die "FreeBSD patch set '${y}' failed to apply!"
405 fi
406 fi
407 ;;
408 "darwin-"*)
409 [[ ${CHOST} == *"-darwin"* ]] && \
410 ewarn " Darwin patch set '${y}' failed to apply!"
319 ;; 411 ;;
320 esac 412 esac
321 fi 413 fi
322 done 414 done
323 415
326 ${do_reversedeps} == "no" && \ 418 ${do_reversedeps} == "no" && \
327 ${do_only_patches} == "no" && \ 419 ${do_only_patches} == "no" && \
328 ${deptoremove} == "" ]] 420 ${deptoremove} == "" ]]
329 then 421 then
330 ewarn "Cannot apply any patches, please file a bug about this" 422 ewarn "Cannot apply any patches, please file a bug about this"
331 break
332
333 # Sometimes ltmain.sh is in a subdirectory ...
334 if [[ ! -f ${x}/configure.in && ! -f ${x}/configure.ac ]] ; then
335 if [[ -f ${x}/../configure.in || -f ${x}/../configure.ac ]] ; then
336 cd "${x}"/../
337 fi
338 fi 423 die
339
340 if type -p libtoolize &> /dev/null ; then
341 ewarn "Cannot apply any patches, running libtoolize..."
342 libtoolize --copy --force
343 fi
344 cd "${x}"
345 break
346 fi 424 fi
347 fi 425 fi
348 426
349 [[ -f ${x}/libtool ]] && rm -f "${x}/libtool" 427 [[ -f ${x}/libtool ]] && rm -f "${x}/libtool"
350 428
351 touch "${x}/.elibtoolized" 429 >> "${x}/.elibtoolized"
352 done 430 done
353 431
354 cd "${start_dir}" 432 cd "${start_dir}"
355} 433}
356 434
357uclibctoolize() { 435uclibctoolize() {
358 ewarn "uclibctoolize() is depreciated, please just use libtoolize()!" 436 ewarn "uclibctoolize() is deprecated, please just use elibtoolize()!"
359 elibtoolize 437 elibtoolize
360} 438}
361 439
362darwintoolize() { 440darwintoolize() {
363 local targets="" 441 ewarn "darwintoolize() is deprecated, please just use elibtoolize()!"
364 local x 442 elibtoolize
365
366 if [[ -z $* ]] ; then
367 targets=$(find ${S} -name ltmain.sh -o -name ltconfig)
368 fi
369
370 einfo "Applying Darwin/libtool patches ..."
371 for x in ${targets} ; do
372 [[ ! -s ${x} ]] && continue
373 case ${x##*/} in
374 ltmain.sh|ltconfig)
375 local ver=$(grep '^VERSION=' ${x})
376 ver=${ver/VERSION=}
377 if [[ ${ver:0:3} == "1.4" || ${ver:0:3} == "1.5" ]] ; then
378 ver="1.3" # 1.4, 1.5 and 1.3 are compat
379 fi
380
381 ebegin " Fixing \${S}${x/${S}}"
382 patch -p0 "${x}" "${ELT_PATCH_DIR}/darwin/${x##*/}-${ver:0:3}.patch" > /dev/null
383 eend $? "PLEASE CHECK ${x}"
384 ;;
385 esac
386 done
387} 443}
388 444
389# char *VER_major(string) 445# char *VER_major(string)
390# 446#
391# Return the Major (X of X.Y.Z) version 447# Return the Major (X of X.Y.Z) version

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

  ViewVC Help
Powered by ViewVC 1.1.20