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

Contents of /eclass/multilib.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.92 - (hide annotations) (download)
Thu Aug 18 14:58:57 2011 UTC (2 years, 8 months ago) by vapier
Branch: MAIN
Changes since 1.91: +2 -2 lines
eat trailing whitespace

1 vapier 1.85 # Copyright 1999-2011 Gentoo Foundation
2 eradicator 1.1 # Distributed under the terms of the GNU General Public License v2
3 vapier 1.92 # $Header: /var/cvsroot/gentoo-x86/eclass/multilib.eclass,v 1.91 2011/07/08 11:35:01 ssuominen Exp $
4 vapier 1.65
5     # @ECLASS: multilib.eclass
6     # @MAINTAINER:
7     # amd64@gentoo.org
8     # toolchain@gentoo.org
9     # @BLURB: This eclass is for all functions pertaining to handling multilib configurations.
10     # @DESCRIPTION:
11     # This eclass is for all functions pertaining to handling multilib configurations.
12 eradicator 1.1
13 vapier 1.60 ___ECLASS_RECUR_MULTILIB="yes"
14     [[ -z ${___ECLASS_RECUR_TOOLCHAIN_FUNCS} ]] && inherit toolchain-funcs
15    
16 eradicator 1.19 # Defaults:
17 eradicator 1.21 export MULTILIB_ABIS=${MULTILIB_ABIS:-"default"}
18     export DEFAULT_ABI=${DEFAULT_ABI:-"default"}
19 eradicator 1.23 export CFLAGS_default
20     export LDFLAGS_default
21     export CHOST_default=${CHOST_default:-${CHOST}}
22 eradicator 1.39 export CTARGET_default=${CTARGET_default:-${CTARGET:-${CHOST_default}}}
23 eradicator 1.21 export LIBDIR_default=${CONF_LIBDIR:-"lib"}
24 blubb 1.48 export KERNEL_ABI=${KERNEL_ABI:-${DEFAULT_ABI}}
25 eradicator 1.19
26 vapier 1.65 # @FUNCTION: has_multilib_profile
27     # @DESCRIPTION:
28     # Return true if the current profile is a multilib profile and lists more than
29     # one abi in ${MULTILIB_ABIS}. When has_multilib_profile returns true, that
30     # profile should enable the 'multilib' use flag. This is so you can DEPEND on
31     # a package only for multilib or not multilib.
32 eradicator 1.14 has_multilib_profile() {
33 eradicator 1.15 [ -n "${MULTILIB_ABIS}" -a "${MULTILIB_ABIS}" != "${MULTILIB_ABIS/ /}" ]
34 eradicator 1.14 }
35    
36 vapier 1.65 # @FUNCTION: get_libdir
37     # @RETURN: the libdir for the selected ABI
38     # @DESCRIPTION:
39 eradicator 1.1 # This function simply returns the desired lib directory. With portage
40     # 2.0.51, we now have support for installing libraries to lib32/lib64
41     # to accomidate the needs of multilib systems. It's no longer a good idea
42     # to assume all libraries will end up in lib. Replace any (sane) instances
43     # where lib is named directly with $(get_libdir) if possible.
44     #
45     # Jeremy Huddleston <eradicator@gentoo.org> (23 Dec 2004):
46     # Added support for ${ABI} and ${DEFAULT_ABI}. If they're both not set,
47     # fall back on old behavior. Any profile that has these set should also
48     # depend on a newer version of portage (not yet released) which uses these
49     # over CONF_LIBDIR in econf, dolib, etc...
50     get_libdir() {
51 eradicator 1.19 local CONF_LIBDIR
52     if [ -n "${CONF_LIBDIR_OVERRIDE}" ] ; then
53 eradicator 1.1 # if there is an override, we want to use that... always.
54 eradicator 1.19 echo ${CONF_LIBDIR_OVERRIDE}
55     else
56     get_abi_LIBDIR
57     fi
58 eradicator 1.1 }
59    
60 vapier 1.65 # @FUNCTION: get_multilibdir
61     # @RETURN: Returns the multilibdir
62 eradicator 1.1 get_multilibdir() {
63 eradicator 1.19 if has_multilib_profile; then
64 eradicator 1.1 eerror "get_multilibdir called, but it shouldn't be needed with the new multilib approach. Please file a bug at http://bugs.gentoo.org and assign it to eradicator@gentoo.org"
65     exit 1
66     fi
67     echo ${CONF_MULTILIBDIR:=lib32}
68     }
69    
70 vapier 1.65 # @FUNCTION: get_libdir_override
71     # @DESCRIPTION:
72 eradicator 1.1 # Sometimes you need to override the value returned by get_libdir. A good
73     # example of this is xorg-x11, where lib32 isnt a supported configuration,
74     # and where lib64 -must- be used on amd64 (for applications that need lib
75     # to be 32bit, such as adobe acrobat). Note that this override also bypasses
76     # portage version sanity checking.
77     # get_libdir_override expects one argument, the result get_libdir should
78     # return:
79     #
80     # get_libdir_override lib64
81     get_libdir_override() {
82 eradicator 1.19 if has_multilib_profile; then
83 eradicator 1.1 eerror "get_libdir_override called, but it shouldn't be needed with the new multilib approach. Please file a bug at http://bugs.gentoo.org and assign it to eradicator@gentoo.org"
84     exit 1
85     fi
86     CONF_LIBDIR="$1"
87     CONF_LIBDIR_OVERRIDE="$1"
88 eradicator 1.19 LIBDIR_default="$1"
89 eradicator 1.1 }
90    
91 vapier 1.65 # @FUNCTION: get_abi_var
92     # @USAGE: <VAR> [ABI]
93     # @RETURN: returns the value of ${<VAR>_<ABI>} which should be set in make.defaults
94     # @DESCRIPTION:
95 eradicator 1.1 # ex:
96     # CFLAGS=$(get_abi_var CFLAGS sparc32) # CFLAGS=-m32
97     #
98     # Note that the prefered method is to set CC="$(tc-getCC) $(get_abi_CFLAGS)"
99     # This will hopefully be added to portage soon...
100     #
101     # If <ABI> is not specified, ${ABI} is used.
102     # If <ABI> is not specified and ${ABI} is not defined, ${DEFAULT_ABI} is used.
103     # If <ABI> is not specified and ${ABI} and ${DEFAULT_ABI} are not defined, we return an empty string.
104     get_abi_var() {
105 vapier 1.33 local flag=$1
106 eradicator 1.1 local abi
107     if [ $# -gt 1 ]; then
108     abi=${2}
109 eradicator 1.26 elif [ -n "${ABI}" ]; then
110     abi=${ABI}
111 eradicator 1.1 elif [ -n "${DEFAULT_ABI}" ]; then
112     abi=${DEFAULT_ABI}
113     else
114 eradicator 1.19 abi="default"
115 eradicator 1.1 fi
116    
117     local var="${flag}_${abi}"
118     echo ${!var}
119     }
120    
121 vapier 1.65 # @FUNCTION: get_abi_CFLAGS
122     # @USAGE: [ABI]
123     # @DESCRIPTION:
124     # Alias for 'get_abi_var CFLAGS'
125 vapier 1.33 get_abi_CFLAGS() { get_abi_var CFLAGS "$@"; }
126 vapier 1.65
127     # @FUNCTION: get_abi_ASFLAGS
128     # @USAGE: [ABI]
129     # @DESCRIPTION:
130     # Alias for 'get_abi_var ASFLAGS'
131 eradicator 1.50 get_abi_ASFLAGS() { get_abi_var ASFLAGS "$@"; }
132 vapier 1.65
133     # @FUNCTION: get_abi_LDFLAGS
134     # @USAGE: [ABI]
135     # @DESCRIPTION:
136     # Alias for 'get_abi_var LDFLAGS'
137 vapier 1.33 get_abi_LDFLAGS() { get_abi_var LDFLAGS "$@"; }
138 vapier 1.65
139     # @FUNCTION: get_abi_CHOST
140     # @USAGE: [ABI]
141     # @DESCRIPTION:
142     # Alias for 'get_abi_var CHOST'
143 vapier 1.33 get_abi_CHOST() { get_abi_var CHOST "$@"; }
144 vapier 1.65
145     # @FUNCTION: get_abi_CTARGET
146     # @USAGE: [ABI]
147     # @DESCRIPTION:
148     # Alias for 'get_abi_var CTARGET'
149 vapier 1.52 get_abi_CTARGET() { get_abi_var CTARGET "$@"; }
150 vapier 1.65
151     # @FUNCTION: get_abi_FAKE_TARGETS
152     # @USAGE: [ABI]
153     # @DESCRIPTION:
154     # Alias for 'get_abi_var FAKE_TARGETS'
155 vapier 1.33 get_abi_FAKE_TARGETS() { get_abi_var FAKE_TARGETS "$@"; }
156 vapier 1.65
157     # @FUNCTION: get_abi_LIBDIR
158     # @USAGE: [ABI]
159     # @DESCRIPTION:
160     # Alias for 'get_abi_var LIBDIR'
161 vapier 1.33 get_abi_LIBDIR() { get_abi_var LIBDIR "$@"; }
162 eradicator 1.1
163 vapier 1.65 # @FUNCTION: get_install_abis
164     # @DESCRIPTION:
165 swegener 1.30 # Return a list of the ABIs we want to install for with
166 eradicator 1.2 # the last one in the list being the default.
167 eradicator 1.17 get_install_abis() {
168 eradicator 1.2 local order=""
169    
170 vapier 1.33 if [[ -z ${MULTILIB_ABIS} ]] ; then
171 eradicator 1.19 echo "default"
172     return 0
173 eradicator 1.2 fi
174    
175 peper 1.63 if [[ ${EMULTILIB_PKG} == "true" ]] ; then
176 vapier 1.33 for x in ${MULTILIB_ABIS} ; do
177     if [[ ${x} != "${DEFAULT_ABI}" ]] ; then
178 ssuominen 1.91 has ${x} ${ABI_DENY} || order="${order} ${x}"
179 eradicator 1.2 fi
180     done
181 ssuominen 1.91 has ${DEFAULT_ABI} ${ABI_DENY} || order="${order} ${DEFAULT_ABI}"
182 eradicator 1.2
183 vapier 1.33 if [[ -n ${ABI_ALLOW} ]] ; then
184 eradicator 1.2 local ordera=""
185 vapier 1.33 for x in ${order} ; do
186 ssuominen 1.91 if has ${x} ${ABI_ALLOW} ; then
187 eradicator 1.2 ordera="${ordera} ${x}"
188     fi
189     done
190 vapier 1.33 order=${ordera}
191 eradicator 1.2 fi
192     else
193 vapier 1.33 order=${DEFAULT_ABI}
194 eradicator 1.2 fi
195    
196 vapier 1.33 if [[ -z ${order} ]] ; then
197 eradicator 1.2 die "The ABI list is empty. Are you using a proper multilib profile? Perhaps your USE flags or MULTILIB_ABIS are too restrictive for this package."
198     fi
199    
200     echo ${order}
201     return 0
202     }
203    
204 vapier 1.65 # @FUNCTION: get_all_abis
205 vapier 1.92 # @DESCRIPTION:
206 eradicator 1.17 # Return a list of the ABIs supported by this profile.
207     # the last one in the list being the default.
208     get_all_abis() {
209     local order=""
210    
211 eradicator 1.40 if [[ -z ${MULTILIB_ABIS} ]] ; then
212 eradicator 1.19 echo "default"
213     return 0
214 eradicator 1.17 fi
215    
216     for x in ${MULTILIB_ABIS}; do
217 eradicator 1.40 if [[ ${x} != ${DEFAULT_ABI} ]] ; then
218     order="${order:+${order} }${x}"
219 eradicator 1.17 fi
220     done
221     order="${order:+${order} }${DEFAULT_ABI}"
222    
223     echo ${order}
224     return 0
225     }
226    
227 vapier 1.65 # @FUNCTION: get_all_libdirs
228     # @DESCRIPTION:
229 eradicator 1.2 # Returns a list of all the libdirs used by this profile. This includes
230 vapier 1.65 # those that might not be touched by the current ebuild and always includes
231     # "lib".
232 eradicator 1.1 get_all_libdirs() {
233 vapier 1.85 local libdirs
234 eradicator 1.2 local abi
235     local dir
236    
237 blubb 1.56 for abi in ${MULTILIB_ABIS}; do
238 vapier 1.85 libdirs+=" $(get_abi_LIBDIR ${abi})"
239 blubb 1.56 done
240 vapier 1.85 [[ " ${libdirs} " != *" lib "* ]] && libdirs+=" lib"
241 eradicator 1.2
242     echo "${libdirs}"
243     }
244    
245 vapier 1.65 # @FUNCTION: is_final_abi
246     # @DESCRIPTION:
247 eradicator 1.2 # Return true if ${ABI} is the last ABI on our list (or if we're not
248     # using the new multilib configuration. This can be used to determine
249     # if we're in the last (or only) run through src_{unpack,compile,install}
250     is_final_abi() {
251 eradicator 1.23 has_multilib_profile || return 0
252 vapier 1.83 set -- $(get_install_abis)
253     local LAST_ABI=$#
254     [[ ${!LAST_ABI} == ${ABI} ]]
255 eradicator 1.2 }
256    
257 vapier 1.65 # @FUNCTION: number_abis
258     # @DESCRIPTION:
259 eradicator 1.2 # echo the number of ABIs we will be installing for
260     number_abis() {
261 vapier 1.88 set -- `get_install_abis`
262     echo $#
263 eradicator 1.2 }
264    
265 vapier 1.65 # @FUNCTION: get_libname
266     # @USAGE: [version]
267     # @DESCRIPTION:
268 grobian 1.73 # Returns libname with proper suffix {.so,.dylib,.dll,etc} and optionally
269     # supplied version for the current platform identified by CHOST.
270 vapier 1.65 #
271     # Example:
272 grobian 1.74 # get_libname ${PV}
273     # Returns: .so.${PV} (ELF) || .${PV}.dylib (MACH) || ...
274 kito 1.31 get_libname() {
275 vapier 1.44 local libname
276 kito 1.31 local ver=$1
277 vapier 1.44 case ${CHOST} in
278 vapier 1.69 *-cygwin|mingw*|*-mingw*) libname="dll";;
279     *-darwin*) libname="dylib";;
280 grobian 1.73 *-mint*) libname="irrelevant";;
281 grobian 1.75 hppa*-hpux*) libname="sl";;
282 vapier 1.69 *) libname="so";;
283 vapier 1.44 esac
284    
285 vapier 1.64 if [[ -z $* ]] ; then
286 vapier 1.44 echo ".${libname}"
287 kito 1.31 else
288 vapier 1.44 for ver in "$@" ; do
289     case ${CHOST} in
290     *-darwin*) echo ".${ver}.${libname}";;
291 grobian 1.73 *-mint*) echo ".${libname}";;
292 vapier 1.44 *) echo ".${libname}.${ver}";;
293     esac
294     done
295 kito 1.31 fi
296     }
297 eradicator 1.34
298 grobian 1.76 # @FUNCTION: get_modname
299     # @USAGE:
300     # @DESCRIPTION:
301     # Returns modulename with proper suffix {.so,.bundle,etc} for the current
302     # platform identified by CHOST.
303     #
304     # Example:
305     # libfoo$(get_modname)
306     # Returns: libfoo.so (ELF) || libfoo.bundle (MACH) || ...
307     get_modname() {
308     local modname
309     local ver=$1
310     case ${CHOST} in
311     *-darwin*) modname="bundle";;
312     *) modname="so";;
313     esac
314    
315     echo ".${modname}"
316     }
317    
318 eradicator 1.34 # This is for the toolchain to setup profile variables when pulling in
319     # a crosscompiler (and thus they aren't set in the profile)
320     multilib_env() {
321 vapier 1.41 local CTARGET=${1:-${CTARGET}}
322 eradicator 1.34
323 eradicator 1.37 case ${CTARGET} in
324     x86_64*)
325 eradicator 1.34 export CFLAGS_x86=${CFLAGS_x86--m32}
326 vapier 1.42 export CHOST_x86=${CTARGET/x86_64/i686}
327     export CTARGET_x86=${CHOST_x86}
328 vapier 1.87 if [[ ${SYMLINK_LIB} == "yes" ]] ; then
329 vapier 1.86 export LIBDIR_x86="lib32"
330     else
331     export LIBDIR_x86="lib"
332     fi
333 eradicator 1.34
334     export CFLAGS_amd64=${CFLAGS_amd64--m64}
335 vapier 1.42 export CHOST_amd64=${CTARGET}
336 blubb 1.57 export CTARGET_amd64=${CHOST_amd64}
337 eradicator 1.34 export LIBDIR_amd64="lib64"
338    
339 vapier 1.82 export CFLAGS_x32=${CFLAGS_x32--mx32}
340     export CHOST_x32=${CTARGET}
341     export CTARGET_x32=${CHOST_x32}
342     export LIBDIR_x32="libx32"
343    
344     : ${MULTILIB_ABIS=amd64 x86}
345     : ${DEFAULT_ABI=amd64}
346 eradicator 1.34 ;;
347 eradicator 1.37 mips64*)
348 eradicator 1.34 export CFLAGS_o32=${CFLAGS_o32--mabi=32}
349 vapier 1.42 export CHOST_o32=${CTARGET/mips64/mips}
350     export CTARGET_o32=${CHOST_o32}
351 eradicator 1.34 export LIBDIR_o32="lib"
352    
353     export CFLAGS_n32=${CFLAGS_n32--mabi=n32}
354 vapier 1.42 export CHOST_n32=${CTARGET}
355     export CTARGET_n32=${CHOST_n32}
356 eradicator 1.34 export LIBDIR_n32="lib32"
357    
358     export CFLAGS_n64=${CFLAGS_n64--mabi=64}
359 vapier 1.42 export CHOST_n64=${CTARGET}
360     export CTARGET_n64=${CHOST_n64}
361 eradicator 1.34 export LIBDIR_n64="lib64"
362    
363 vapier 1.82 : ${MULTILIB_ABIS=n64 n32 o32}
364     : ${DEFAULT_ABI=n32}
365 eradicator 1.34 ;;
366 eradicator 1.37 powerpc64*)
367 eradicator 1.34 export CFLAGS_ppc=${CFLAGS_ppc--m32}
368 vapier 1.42 export CHOST_ppc=${CTARGET/powerpc64/powerpc}
369     export CTARGET_ppc=${CHOST_ppc}
370 eradicator 1.34 export LIBDIR_ppc="lib"
371    
372     export CFLAGS_ppc64=${CFLAGS_ppc64--m64}
373 vapier 1.42 export CHOST_ppc64=${CTARGET}
374     export CTARGET_ppc64=${CHOST_ppc64}
375 eradicator 1.34 export LIBDIR_ppc64="lib64"
376    
377 vapier 1.82 : ${MULTILIB_ABIS=ppc64 ppc}
378     : ${DEFAULT_ABI=ppc64}
379 eradicator 1.34 ;;
380 vapier 1.43 s390x*)
381     export CFLAGS_s390=${CFLAGS_s390--m31} # the 31 is not a typo
382     export CHOST_s390=${CTARGET/s390x/s390}
383     export CTARGET_s390=${CHOST_s390}
384     export LIBDIR_s390="lib"
385    
386     export CFLAGS_s390x=${CFLAGS_s390x--m64}
387     export CHOST_s390x=${CTARGET}
388     export CTARGET_s390x=${CHOST_s390x}
389     export LIBDIR_s390x="lib64"
390    
391 vapier 1.82 : ${MULTILIB_ABIS=s390x s390}
392     : ${DEFAULT_ABI=s390x}
393 vapier 1.43 ;;
394 bluebird 1.67 sparc*)
395     export CFLAGS_sparc32=${CFLAGS_sparc32}
396 vapier 1.42 export CHOST_sparc32=${CTARGET/sparc64/sparc}
397     export CTARGET_sparc32=${CHOST_sparc32}
398 eradicator 1.34 export LIBDIR_sparc32="lib"
399    
400     export CFLAGS_sparc64=${CFLAGS_sparc64--m64}
401 vapier 1.42 export CHOST_sparc64=${CTARGET}
402     export CTARGET_sparc64=${CHOST_sparc64}
403 eradicator 1.34 export LIBDIR_sparc64="lib64"
404    
405 vapier 1.82 : ${MULTILIB_ABIS=sparc64 sparc32}
406     : ${DEFAULT_ABI=sparc64}
407 eradicator 1.34 ;;
408     *)
409 vapier 1.82 : ${MULTILIB_ABIS=default}
410     : ${DEFAULT_ABI=default}
411 eradicator 1.36 ;;
412 eradicator 1.34 esac
413 vapier 1.82
414 vapier 1.84 export MULTILIB_ABIS DEFAULT_ABI
415 eradicator 1.34 }
416 eradicator 1.50
417 vapier 1.65 # @FUNCTION: multilib_toolchain_setup
418     # @DESCRIPTION:
419 vapier 1.51 # Hide multilib details here for packages which are forced to be compiled for a
420     # specific ABI when run on another ABI (like x86-specific packages on amd64)
421 eradicator 1.50 multilib_toolchain_setup() {
422 vapier 1.72 local v vv
423    
424 eradicator 1.55 export ABI=$1
425    
426 vapier 1.81 # First restore any saved state we have laying around.
427     if [[ ${__DEFAULT_ABI_SAVED} == "true" ]] ; then
428     for v in CHOST CBUILD AS CC CXX LD ; do
429     vv="__abi_saved_${v}"
430     export ${v}="${!vv}"
431     unset ${vv}
432     done
433     unset __DEFAULT_ABI_SAVED
434     fi
435    
436 vapier 1.72 # We want to avoid the behind-the-back magic of gcc-config as it
437     # screws up ccache and distcc. See #196243 for more info.
438 vapier 1.70 if [[ ${ABI} != ${DEFAULT_ABI} ]] ; then
439 vapier 1.81 # Back that multilib-ass up so we can restore it later
440     for v in CHOST CBUILD AS CC CXX LD ; do
441     export __abi_saved_${v}="${!v}"
442     done
443     export __DEFAULT_ABI_SAVED="true"
444 eradicator 1.50
445 vapier 1.72 # Set the CHOST native first so that we pick up the native
446     # toolchain and not a cross-compiler by accident #202811.
447     export CHOST=$(get_abi_CHOST ${DEFAULT_ABI})
448     export AS="$(tc-getAS) $(get_abi_ASFLAGS)"
449     export CC="$(tc-getCC) $(get_abi_CFLAGS)"
450     export CXX="$(tc-getCXX) $(get_abi_CFLAGS)"
451     export LD="$(tc-getLD) $(get_abi_LDFLAGS)"
452 kevquinn 1.54 export CHOST=$(get_abi_CHOST $1)
453     export CBUILD=$(get_abi_CHOST $1)
454 vapier 1.53 fi
455 eradicator 1.50 }

  ViewVC Help
Powered by ViewVC 1.1.20