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

Diff of /eclass/libtool.eclass

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

Revision 1.24 Revision 1.42
1# Copyright 1999-2004 Gentoo Technologies, Inc. 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.24 2004/01/02 21:54:28 azarah Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/libtool.eclass,v 1.42 2005/01/31 03:02:13 vapier 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" 10ECLASS="libtool"
11INHERITED="${INHERITED} ${ECLASS}" 11INHERITED="${INHERITED} ${ECLASS}"
12 12
13newdepend "!bootstrap? ( sys-devel/libtool )" 13# 2004.09.25 rac
14# i have verified that at least one package can use this eclass and
15# build properly even without libtool installed yet, probably using
16# the files in the distribution. eliminating this dependency fixes
17# bug 65209, which is a showstopper for people doing installs using
18# stageballs <3. if anybody decides to revert this, please attempt
19# to find an alternate way of resolving that bug at the same time.
14 20
15DESCRIPTION="Based on the ${ECLASS} eclass" 21DESCRIPTION="Based on the ${ECLASS} eclass"
16 22
17ELIBTOOL_VERSION="2.0.1" 23ELIBTOOL_VERSION="2.0.1"
18
19 24
20ELT_PATCH_DIR="${PORTDIR}/eclass/ELT-patches" 25ELT_PATCH_DIR="${PORTDIR}/eclass/ELT-patches"
21ELT_APPLIED_PATCHES= 26ELT_APPLIED_PATCHES=
22 27
23# 28#
25# 30#
26ELT_find_ltmain_sh() { 31ELT_find_ltmain_sh() {
27 local x= 32 local x=
28 local dirlist= 33 local dirlist=
29 34
30 for x in $(find "${S}" -name 'ltmain.sh') 35 for x in $(find "${S}" -name 'ltmain.sh') ; do
31 do
32 dirlist="${dirlist} ${x%/*}" 36 dirlist="${dirlist} ${x%/*}"
33 done 37 done
34 38
35 echo "${dirlist}" 39 echo "${dirlist}"
36} 40}
37 41
38# 42#
39# See if we can apply $2 on $1, and if so, do it 43# See if we can apply $2 on $1, and if so, do it
40# 44#
41ELT_try_and_apply_patch() { 45ELT_try_and_apply_patch() {
42 local ret=0 46 local ret=0
43 local patch="$2" 47 local patch="$2"
44 48
45 # We only support patchlevel of 0 - why worry if its static patches? 49 # We only support patchlevel of 0 - why worry if its static patches?
46 if patch -p0 --dry-run $1 < ${patch} &>${T}/elibtool.log 50 if patch -p0 --dry-run $1 < ${patch} &> ${T}/elibtool.log ; then
47 then
48 einfo " Applying $(basename "$(dirname "${patch}")")-${patch##*/}.patch..." 51 einfo " Applying $(basename "$(dirname "${patch}")")-${patch##*/}.patch ..."
49 patch -p0 $1 < ${patch} &>${T}/elibtool.log 52 patch -p0 $1 < ${patch} &>${T}/elibtool.log
50 ret=$? 53 ret=$?
51 export ELT_APPLIED_PATCHES="${ELT_APPLIED_PATCHES} ${patch##*/}" 54 export ELT_APPLIED_PATCHES="${ELT_APPLIED_PATCHES} ${patch##*/}"
52 else 55 else
53 ret=1 56 ret=1
64 local x= 67 local x=
65 local y= 68 local y=
66 local ret=1 69 local ret=1
67 local patch_dir= 70 local patch_dir=
68 71
69 if [ -n "$2" ] 72 if [[ -n $2 ]] ; then
70 then
71 if [ -d "${ELT_PATCH_DIR}/$2" ] 73 if [[ -d ${ELT_PATCH_DIR}/$2 ]] ; then
72 then
73 patch_dir="${ELT_PATCH_DIR}/$2" 74 patch_dir="${ELT_PATCH_DIR}/$2"
74 else 75 else
75 return ${ret} 76 return ${ret}
76 fi 77 fi
77 78
78 for x in $(ls -d "${patch_dir}"/* 2>/dev/null) 79 for x in $(ls -d "${patch_dir}"/* 2> /dev/null) ; do
79 do 80 if [[ -n ${x} && -f ${x} ]] ; then
80 if [ -n "${x}" -a -f "${x}" ]
81 then
82 # For --remove-internal-dep ... 81 # For --remove-internal-dep ...
83 if [ -n "$3" ] 82 if [[ -n $3 ]] ; then
84 then
85 # For replace @REM_INT_DEP@ with what was passed 83 # For replace @REM_INT_DEP@ with what was passed
86 # to --remove-internal-dep 84 # to --remove-internal-dep
87 sed -e "s|@REM_INT_DEP@|$3|g" ${x} > \ 85 sed -e "s|@REM_INT_DEP@|$3|g" ${x} > \
88 ${T}/$$.rem_int_deps.patch 86 ${T}/$$.rem_int_deps.patch
89 87
90 x="${T}/$$.rem_int_deps.patch" 88 x="${T}/$$.rem_int_deps.patch"
91 fi 89 fi
92 90
93 if ELT_try_and_apply_patch "$1" "${x}" 91 if ELT_try_and_apply_patch "$1" "${x}" ; then
94 then
95 ret=0 92 ret=0
96 break 93 break
97 fi 94 fi
98 fi 95 fi
99 done 96 done
108 local do_portage="no" 105 local do_portage="no"
109 local do_reversedeps="no" 106 local do_reversedeps="no"
110 local do_only_patches="no" 107 local do_only_patches="no"
111 local deptoremove= 108 local deptoremove=
112 local my_dirlist= 109 local my_dirlist=
113 local elt_patches="portage relink sed test tmp" 110 local elt_patches="portage relink max_cmd_len sed test tmp"
111 local start_dir="${PWD}"
114 112
115 my_dirlist="$(ELT_find_ltmain_sh)" 113 my_dirlist="$(ELT_find_ltmain_sh)"
116 114
117 for x in $* 115 for x in "$@" ; do
118 do
119 case "${x}" in 116 case "${x}" in
120 "--portage") 117 "--portage")
121 # Only apply portage patch, and don't 118 # Only apply portage patch, and don't
122 # 'libtoolize --copy --force' if all patches fail. 119 # 'libtoolize --copy --force' if all patches fail.
123 do_portage="yes" 120 do_portage="yes"
147 my_dirlist="${S}" 144 my_dirlist="${S}"
148 else 145 else
149 my_dirlist= 146 my_dirlist=
150 fi 147 fi
151 ;; 148 ;;
149 "--no-uclibc")
150 NO_UCLIBCTOOLIZE=1
151 ;;
152 *)
153 eerror "Invalid elibtoolize option: $x"
154 die "elibtoolize called with $x ??"
152 esac 155 esac
153 done 156 done
154 157
158 if use ppc-macos ; then
159 glibtoolize --copy --force
160 darwintoolize
161 fi
162
155 for x in ${my_dirlist} 163 for x in ${my_dirlist} ; do
156 do
157 local tmp="$(echo "${x}" | sed -e "s|${S}||")" 164 local tmp=$(echo "${x}" | sed -e "s|${S}||")
158 export ELT_APPLIED_PATCHES= 165 export ELT_APPLIED_PATCHES=
159 166
160 cd ${x} 167 cd ${x}
161 einfo "Patching \${S}$(echo "/${tmp}/ltmain.sh" | sed -e 's|//|/|g')..." 168 einfo "Patching \${S}$(echo "/${tmp}/ltmain.sh" | sed -e 's|//|/|g') ..."
162 169
163 for y in ${elt_patches} 170 for y in ${elt_patches} ; do
164 do
165 local ret=0 171 local ret=0
166 172
167 case "${y}" in 173 case "${y}" in
168 "rem-int-dep") 174 "rem-int-dep")
169 ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}" 175 ELT_walk_patches "${x}/ltmain.sh" "${y}" "${deptoremove}"
170 ret=$? 176 ret=$?
171 ;; 177 ;;
172 "fix-relink") 178 "fix-relink")
173 # Do not apply if we do not have the relink patch applied ... 179 # Do not apply if we do not have the relink patch applied ...
174 if [ -n "$(grep 'inst_prefix_dir' "${x}/ltmain.sh")" ] 180 if [[ -n $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
175 then 181 ELT_walk_patches "${x}/ltmain.sh" "${y}"
182 ret=$?
183 fi
184 ;;
185 "max_cmd_len")
186 # Do not apply if $max_cmd_len is not used ...
187 if [[ -n $(grep 'max_cmd_len' "${x}/ltmain.sh") ]] ; then
176 ELT_walk_patches "${x}/ltmain.sh" "${y}" 188 ELT_walk_patches "${x}/ltmain.sh" "${y}"
177 ret=$? 189 ret=$?
178 fi 190 fi
179 ;; 191 ;;
180 *) 192 *)
181 ELT_walk_patches "${x}/ltmain.sh" "${y}" 193 ELT_walk_patches "${x}/ltmain.sh" "${y}"
182 ret=$? 194 ret=$?
183 ;; 195 ;;
184 esac 196 esac
185 197
186 if [ "${ret}" -ne 0 ] 198 if [[ ${ret} -ne 0 ]] ; then
187 then
188 case ${y} in 199 case ${y} in
189 "relink") 200 "relink")
190 # Critical patch, but could be applied ... 201 # Critical patch, but could be applied ...
191 if [ -z "$(grep 'inst_prefix_dir' "${x}/ltmain.sh")" ] 202 if [[ -z $(grep 'inst_prefix_dir' "${x}/ltmain.sh") ]] ; then
192 then
193 ewarn " Could not apply relink.patch!" 203 ewarn " Could not apply relink.patch!"
194 fi 204 fi
195 ;; 205 ;;
196 "portage") 206 "portage")
197 # Critical patch - for this one we abort, as it can really 207 # Critical patch - for this one we abort, as it can really
198 # cause breakage without it applied! 208 # cause breakage without it applied!
199 if [ "${do_portage}" = "yes" ] 209 if [[ ${do_portage} == "yes" ]] ; then
200 then
201 # Stupid test to see if its already applied ... 210 # Stupid test to see if its already applied ...
202 if [ -z "$(grep 'We do not want portage' "${x}/ltmain.sh")" ] 211 if [[ -z $(grep 'We do not want portage' "${x}/ltmain.sh") ]] ; then
203 then
204 echo 212 echo
205 eerror "Portage patch requested, but failed to apply!" 213 eerror "Portage patch requested, but failed to apply!"
206 die "Portage patch requested, but failed to apply!" 214 die "Portage patch requested, but failed to apply!"
207 fi 215 fi
208 else 216 else
211 fi 219 fi
212 ;; 220 ;;
213 esac 221 esac
214 fi 222 fi
215 223
216 if [ -z "${ELT_APPLIED_PATCHES}" ] 224 if [[ -z ${ELT_APPLIED_PATCHES} ]] ; then
217 then
218 if [ "${do_portage}" = "no" -a \ 225 if [[ ${do_portage} == "no" && \
219 "${do_reversedeps}" = "no" -a \ 226 ${do_reversedeps} == "no" && \
220 "${do_only_patches}" = "no" -a \ 227 ${do_only_patches} == "no" && \
221 "${deptoremove}" = "" ] 228 ${deptoremove} == "" ]]
222 then 229 then
223 # Sometimes ltmain.sh is in a subdirectory ... 230 # Sometimes ltmain.sh is in a subdirectory ...
224 if [ ! -f ${x}/configure.in -a ! -f ${x}/configure.ac ] 231 if [[ ! -f ${x}/configure.in && ! -f ${x}/configure.ac ]] ; then
225 then
226 if [ -f ${x}/../configure.in -o -f ${x}/../configure.ac ] 232 if [[ -f ${x}/../configure.in || -f ${x}/../configure.ac ]] ; then
227 then
228 cd ${x}/../ 233 cd "${x}"/../
229 fi 234 fi
230 fi 235 fi
231 236
232 if which libtoolize &>/dev/null 237 if type -p libtoolize &> /dev/null ; then
233 then
234 ewarn "Cannot apply any patch, running libtoolize..." 238 ewarn "Cannot apply any patch, running libtoolize..."
235 libtoolize --copy --force 239 libtoolize --copy --force
236 fi 240 fi
237 cd ${x} 241 cd "${x}"
238 break 242 break
239 fi 243 fi
240 fi 244 fi
241 done 245 done
242 done 246 done
243 247
244 if [ -f libtool ] 248 if [[ -f libtool ]] ; then
245 then
246 rm -f libtool 249 rm -f libtool
247 fi 250 fi
248 251
249 # We need to change the pwd back to $S, as we may be called in 252 cd "${start_dir}"
250 # src_compile()
251 cd ${S}
252}
253 253
254 uclibctoolize
255}
256
257uclibctoolize() {
258 [[ -n ${NO_UCLIBCTOOLIZE} ]] && return 0
259
260 local errmsg=""
261 [[ ${CTARGET:-${CHOST}} == *-uclibc ]] \
262 && errmsg="PLEASE CHECK" \
263 || errmsg="Already patched"
264 local targets=""
265 local x
266
267 if [[ -z $* ]] ; then
268 targets=$(find ${S} -name configure -o -name ltconfig)
269 fi
270
271 einfo "Applying uClibc/libtool patches ..."
272 for x in ${targets} ; do
273 [[ ! -s ${x} ]] && continue
274 case ${x##*/} in
275 configure)
276 if grep 'Transform linux' "${x}" > /dev/null ; then
277 ebegin " Fixing \${S}${x/${S}}"
278 patch -p0 "${x}" "${ELT_PATCH_DIR}/uclibc/configure.patch" > /dev/null
279 eend $? "${errmsg} ${x}"
280 fi
281 ;;
282
283 ltconfig)
284 local ver=$(grep '^VERSION=' ${x})
285 ver=${ver/VERSION=}
286 [[ ${ver:0:3} == "1.4" ]] && ver="1.3" # 1.4 and 1.3 are compat
287 ebegin " Fixing \${S}${x/${S}}"
288 patch -p0 "${x}" "${ELT_PATCH_DIR}/uclibc/ltconfig-${ver:0:3}.patch" > /dev/null
289 eend $? "${errmsg} ${x}"
290 ;;
291 esac
292 done
293}
294
295darwintoolize() {
296 local targets=""
297 local x
298
299 if [[ -z $* ]] ; then
300 targets=$(find ${S} -name ltmain.sh -o -name ltconfig)
301 fi
302
303 einfo "Applying Darwin/libtool patches ..."
304 for x in ${targets} ; do
305 [[ ! -s ${x} ]] && continue
306 case ${x##*/} in
307 ltmain.sh|ltconfig)
308 local ver=$(grep '^VERSION=' ${x})
309 ver=${ver/VERSION=}
310 if [[ ${ver:0:3} == "1.4" || ${ver:0:3} == "1.5" ]] ; then
311 ver="1.3" # 1.4, 1.5 and 1.3 are compat
312 fi
313
314 ebegin " Fixing \${S}${x/${S}}"
315 patch -p0 "${x}" "${ELT_PATCH_DIR}/darwin/${x##*/}-${ver:0:3}.patch" > /dev/null
316 eend $? "PLEASE CHECK ${x}"
317 ;;
318 esac
319 done
320}

Legend:
Removed from v.1.24  
changed lines
  Added in v.1.42

  ViewVC Help
Powered by ViewVC 1.1.20