/[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.84
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.84 2010/01/27 20:41:27 grobian 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
83 local ret=1 81 local ret=1
84 local file=$1 82 local file=$1
85 local patch_set=$2 83 local patch_set=$2
86 local patch_dir= 84 local patch_dir=
87 local rem_int_dep=$3 85 local rem_int_dep=$3
88 local version=
89 local ltmain_sh=$1
90
91 [[ ${file} == *"/configure" ]] && ltmain_sh=${ELT_LTMAIN_SH}
92 version=$(ELT_libtool_version "${ltmain_sh}")
93 86
94 if [[ -n ${patch_set} ]] ; then 87 if [[ -n ${patch_set} ]] ; then
95 if [[ -d ${ELT_PATCH_DIR}/${patch_set} ]] ; then 88 if [[ -d ${ELT_PATCH_DIR}/${patch_set} ]] ; then
96 patch_dir="${ELT_PATCH_DIR}/${patch_set}" 89 patch_dir="${ELT_PATCH_DIR}/${patch_set}"
97 else 90 else
98 return "${ret}" 91 return "${ret}"
99 fi 92 fi
100 93
101 if [[ ${version} == "0" ]] ; then
102 eerror "Could not get VERSION for ${file##*/}!"
103 die "Could not get VERSION for ${file##*/}!"
104 fi
105
106 # Go through the patches in reverse order (large to small) 94 # Go through the patches in reverse order (large to small)
107 for x in $(ls -d "${patch_dir}"/* 2> /dev/null | sort -r) ; do 95 for x in $(ls -d "${patch_dir}"/* 2> /dev/null | grep -v 'CVS' | sort -r) ; do
108 if [[ -n ${x} && -f ${x} ]] ; then 96 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 ... 97 # For --remove-internal-dep ...
115 if [[ -n ${rem_int_dep} ]] ; then 98 if [[ -n ${rem_int_dep} ]] ; then
116 # For replace @REM_INT_DEP@ with what was passed 99 # For replace @REM_INT_DEP@ with what was passed
117 # to --remove-internal-dep 100 # to --remove-internal-dep
118 sed -e "s|@REM_INT_DEP@|${rem_int_dep}|g" ${x} > \ 101 sed -e "s|@REM_INT_DEP@|${rem_int_dep}|g" ${x} > \
139 local do_reversedeps="no" 122 local do_reversedeps="no"
140 local do_only_patches="no" 123 local do_only_patches="no"
141 local do_uclibc="yes" 124 local do_uclibc="yes"
142 local deptoremove= 125 local deptoremove=
143 local my_dirlist= 126 local my_dirlist=
144 local elt_patches="portage relink max_cmd_len sed test tmp" 127 local elt_patches="install-sh ltmain portage relink max_cmd_len sed test tmp cross as-needed"
145 local start_dir=${PWD} 128 local start_dir=${PWD}
146 129
147 my_dirlist=$(ELT_find_ltmain_sh) 130 my_dirlist=$(ELT_find_ltmain_sh)
148 131
149 for x in "$@" ; do 132 for x in "$@" ; do
189 done 172 done
190 173
191 [[ ${do_uclibc} == "yes" ]] && \ 174 [[ ${do_uclibc} == "yes" ]] && \
192 elt_patches="${elt_patches} uclibc-conf uclibc-ltconf" 175 elt_patches="${elt_patches} uclibc-conf uclibc-ltconf"
193 176
194 [[ ${CHOST} == *"-freebsd"* ]] && \ 177 case "${CHOST}" in
178 *-aix*)
179 elt_patches="${elt_patches} hardcode aixrtl"
180 ;;
181 *-darwin*)
182 elt_patches="${elt_patches} darwin-ltconf darwin-ltmain darwin-conf"
183 ;;
184 *-freebsd*)
185 elt_patches="${elt_patches} fbsd-conf fbsd-ltconf"
186 ;;
187 *-hpux*)
188 elt_patches="${elt_patches} hpux-conf deplibs hc-flag-ld hardcode hardcode-relink relink-prog no-lc"
189 ;;
190 *-irix*)
191 elt_patches="${elt_patches} irix-ltmain"
192 ;;
193 *-mint*)
195 elt_patches="${elt_patches} fbsd-conf" 194 elt_patches="${elt_patches} mint-conf"
196 195 ;;
197 if use ppc-macos ; then 196 esac
198 local opts
199 [[ -f Makefile.am ]] && opts="--automake"
200 glibtoolize --copy --force ${opts}
201 darwintoolize
202 fi
203 197
204 for x in ${my_dirlist} ; do 198 for x in ${my_dirlist} ; do
205 local tmp=$(echo "${x}" | sed -e "s|${WORKDIR}||") 199 local tmp=$(echo "${x}" | sed -e "s|${WORKDIR}||")
206 export ELT_APPLIED_PATCHES= 200 export ELT_APPLIED_PATCHES=
207 export ELT_LTMAIN_SH="${x}/ltmain.sh" 201 export ELT_LTMAIN_SH="${x}/ltmain.sh"
213 207
214 for y in ${elt_patches} ; do 208 for y in ${elt_patches} ; do
215 local ret=0 209 local ret=0
216 210
217 case "${y}" in 211 case "${y}" in
212 "portage")
213 # Stupid test to see if its already applied ...
214 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
215 ELT_walk_patches "${x}/ltmain.sh" "${y}"
216 ret=$?
217 fi
218 ;;
218 "rem-int-dep") 219 "rem-int-dep")
219 ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}" 220 ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}"
220 ret=$? 221 ret=$?
221 ;; 222 ;;
222 "fix-relink") 223 "fix-relink")
231 if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then 232 if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then
232 ELT_walk_patches "${x}/ltmain.sh" "${y}" 233 ELT_walk_patches "${x}/ltmain.sh" "${y}"
233 ret=$? 234 ret=$?
234 fi 235 fi
235 ;; 236 ;;
237 "as-needed")
238 ELT_walk_patches "${x}/ltmain.sh" "${y}"
239 ret=$?
240 ;;
236 "uclibc-conf") 241 "uclibc-conf")
237 if [[ -e ${x}/configure && \ 242 if [[ -e ${x}/configure && \
238 -n $(grep 'Transform linux' "${x}/configure") ]] ; then 243 -n $(grep 'Transform linux' "${x}/configure") ]] ; then
239 ELT_walk_patches "${x}/configure" "${y}" 244 ELT_walk_patches "${x}/configure" "${y}"
240 ret=$? 245 ret=$?
244 ELT_walk_patches "${x}/../configure" "${y}" 249 ELT_walk_patches "${x}/../configure" "${y}"
245 ret=$? 250 ret=$?
246 fi 251 fi
247 ;; 252 ;;
248 "uclibc-ltconf") 253 "uclibc-ltconf")
254 # Newer libtoolize clears ltconfig, as not used anymore
249 if [[ -e ${x}/ltconfig ]] ; then 255 if [[ -s ${x}/ltconfig ]] ; then
250 ELT_walk_patches "${x}/ltconfig" "${y}" 256 ELT_walk_patches "${x}/ltconfig" "${y}"
251 ret=$? 257 ret=$?
252 fi 258 fi
253 ;; 259 ;;
254 "fbsd-conf") 260 "fbsd-conf")
258 ret=$? 264 ret=$?
259 # ltmain.sh and co might be in a subdirectory ... 265 # ltmain.sh and co might be in a subdirectory ...
260 elif [[ ! -e ${x}/configure && -e ${x}/../configure && \ 266 elif [[ ! -e ${x}/configure && -e ${x}/../configure && \
261 -n $(grep 'version_type=freebsd-' "${x}/../configure") ]] ; then 267 -n $(grep 'version_type=freebsd-' "${x}/../configure") ]] ; then
262 ELT_walk_patches "${x}/../configure" "${y}" 268 ELT_walk_patches "${x}/../configure" "${y}"
269 ret=$?
270 fi
271 ;;
272 "fbsd-ltconf")
273 if [[ -s ${x}/ltconfig ]] ; then
274 ELT_walk_patches "${x}/ltconfig" "${y}"
275 ret=$?
276 fi
277 ;;
278 "darwin-conf")
279 if [[ -e ${x}/configure && \
280 -n $(grep '&& echo \.so ||' "${x}/configure") ]] ; then
281 ELT_walk_patches "${x}/configure" "${y}"
282 ret=$?
283 # ltmain.sh and co might be in a subdirectory ...
284 elif [[ ! -e ${x}/configure && -e ${x}/../configure && \
285 -n $(grep '&& echo \.so ||' "${x}/../configure") ]] ; then
286 ELT_walk_patches "${x}/../configure" "${y}"
287 ret=$?
288 fi
289 ;;
290 "darwin-ltconf")
291 # Newer libtoolize clears ltconfig, as not used anymore
292 if [[ -s ${x}/ltconfig ]] ; then
293 ELT_walk_patches "${x}/ltconfig" "${y}"
294 ret=$?
295 fi
296 ;;
297 "darwin-ltmain")
298 # special case to avoid false positives (failing to apply
299 # ltmain.sh path message), newer libtools have this patch
300 # built in, so not much to patch around then
301 if [[ -e ${x}/ltmain.sh && \
302 -z $(grep 'verstring="-compatibility_version' "${x}/ltmain.sh") ]] ; then
303 ELT_walk_patches "${x}/ltmain.sh" "${y}"
304 ret=$?
305 fi
306 ;;
307 "aixrtl" | "hpux-conf" | "mint-conf" )
308 ret=1
309 local subret=1
310 if [[ -e ${x}/configure ]]; then
311 ELT_walk_patches "${x}/configure" "${y}"
312 subret=$?
313 # ltmain.sh and co might be in a subdirectory ...
314 elif [[ ! -e ${x}/configure && -e ${x}/../configure ]] ; then
315 ELT_walk_patches "${x}/../configure" "${y}"
316 subret=$?
317 fi
318 if [[ $subret -eq 0 ]]; then
319 # have at least one patch succeeded.
320 ret=0
321 fi
322 ;;
323 "install-sh")
324 ELT_walk_patches "${x}/install-sh" "${y}"
325 ret=$?
326 ;;
327 "cross")
328 if tc-is-cross-compiler ; then
329 ELT_walk_patches "${x}/ltmain.sh" "${y}"
263 ret=$? 330 ret=$?
264 fi 331 fi
265 ;; 332 ;;
266 *) 333 *)
267 ELT_walk_patches "${x}/ltmain.sh" "${y}" 334 ELT_walk_patches "${x}/ltmain.sh" "${y}"
286 if [[ ${do_portage} == "yes" ]] ; then 353 if [[ ${do_portage} == "yes" ]] ; then
287 # Stupid test to see if its already applied ... 354 # Stupid test to see if its already applied ...
288 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then 355 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
289 echo 356 echo
290 eerror "Portage patch requested, but failed to apply!" 357 eerror "Portage patch requested, but failed to apply!"
358 eerror "Please bug azarah or vapier to add proper patch."
291 die "Portage patch requested, but failed to apply!" 359 die "Portage patch requested, but failed to apply!"
292 fi 360 fi
293 else 361 else
294 if [[ -n $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then 362 if [[ -n $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
295 # ewarn " Portage patch seems to be already applied." 363 # ewarn " Portage patch seems to be already applied."
300 eval $(grep -e '^[[:space:]]*VERSION=' "${x}/ltmain.sh"); \ 368 eval $(grep -e '^[[:space:]]*VERSION=' "${x}/ltmain.sh"); \
301 echo "${VERSION}") 369 echo "${VERSION}")
302 370
303 echo 371 echo
304 eerror "Portage patch failed to apply (ltmain.sh version ${version})!" 372 eerror "Portage patch failed to apply (ltmain.sh version ${version})!"
373 eerror "Please bug azarah or vapier to add proper patch."
305 die "Portage patch failed to apply!" 374 die "Portage patch failed to apply!"
306 fi 375 fi
307 # We do not want to run libtoolize ... 376 # We do not want to run libtoolize ...
308 ELT_APPLIED_PATCHES="portage" 377 ELT_APPLIED_PATCHES="portage"
309 fi 378 fi
311 "uclibc-"*) 380 "uclibc-"*)
312 [[ ${CHOST} == *"-uclibc" ]] && \ 381 [[ ${CHOST} == *"-uclibc" ]] && \
313 ewarn " uClibc patch set '${y}' failed to apply!" 382 ewarn " uClibc patch set '${y}' failed to apply!"
314 ;; 383 ;;
315 "fbsd-"*) 384 "fbsd-"*)
316 [[ ${CHOST} == *"-freebsd"* ]] && \ 385 if [[ ${CHOST} == *"-freebsd"* ]] ; then
386 if [[ -z $(grep 'Handle Gentoo/FreeBSD as it was Linux' \
387 "${x}/configure" "${x}/../configure" 2>/dev/null) ]]; then
317 eerror " FreeBSD patch set '${y}' failed to apply!" 388 eerror " FreeBSD patch set '${y}' failed to apply!"
318 die "FreeBSD patch set '${y}' failed to apply!" 389 die "FreeBSD patch set '${y}' failed to apply!"
390 fi
391 fi
392 ;;
393 "darwin-"*)
394 [[ ${CHOST} == *"-darwin"* ]] && \
395 ewarn " Darwin patch set '${y}' failed to apply!"
319 ;; 396 ;;
320 esac 397 esac
321 fi 398 fi
322 done 399 done
323 400
326 ${do_reversedeps} == "no" && \ 403 ${do_reversedeps} == "no" && \
327 ${do_only_patches} == "no" && \ 404 ${do_only_patches} == "no" && \
328 ${deptoremove} == "" ]] 405 ${deptoremove} == "" ]]
329 then 406 then
330 ewarn "Cannot apply any patches, please file a bug about this" 407 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 408 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 409 fi
347 fi 410 fi
348 411
349 [[ -f ${x}/libtool ]] && rm -f "${x}/libtool" 412 [[ -f ${x}/libtool ]] && rm -f "${x}/libtool"
350 413
351 touch "${x}/.elibtoolized" 414 >> "${x}/.elibtoolized"
352 done 415 done
353 416
354 cd "${start_dir}" 417 cd "${start_dir}"
355} 418}
356 419
357uclibctoolize() { 420uclibctoolize() {
358 ewarn "uclibctoolize() is depreciated, please just use libtoolize()!" 421 ewarn "uclibctoolize() is deprecated, please just use elibtoolize()!"
359 elibtoolize 422 elibtoolize
360} 423}
361 424
362darwintoolize() { 425darwintoolize() {
363 local targets="" 426 ewarn "darwintoolize() is deprecated, please just use elibtoolize()!"
364 local x 427 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} 428}
388 429
389# char *VER_major(string) 430# char *VER_major(string)
390# 431#
391# Return the Major (X of X.Y.Z) version 432# Return the Major (X of X.Y.Z) version

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

  ViewVC Help
Powered by ViewVC 1.1.20