1 | # Copyright 1999-2008 Gentoo Foundation |
1 | # Copyright 1999-2011 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/multilib.eclass,v 1.77 2009/10/08 20:10:56 grobian Exp $ |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/multilib.eclass,v 1.86 2011/03/18 19:12:08 vapier Exp $ |
4 | |
4 | |
5 | # @ECLASS: multilib.eclass |
5 | # @ECLASS: multilib.eclass |
6 | # @MAINTAINER: |
6 | # @MAINTAINER: |
7 | # amd64@gentoo.org |
7 | # amd64@gentoo.org |
8 | # toolchain@gentoo.org |
8 | # toolchain@gentoo.org |
… | |
… | |
235 | # @DESCRIPTION: |
235 | # @DESCRIPTION: |
236 | # Returns a list of all the libdirs used by this profile. This includes |
236 | # Returns a list of all the libdirs used by this profile. This includes |
237 | # those that might not be touched by the current ebuild and always includes |
237 | # those that might not be touched by the current ebuild and always includes |
238 | # "lib". |
238 | # "lib". |
239 | get_all_libdirs() { |
239 | get_all_libdirs() { |
240 | local libdirs="lib" |
240 | local libdirs |
241 | local abi |
241 | local abi |
242 | local dir |
242 | local dir |
243 | |
243 | |
244 | for abi in ${MULTILIB_ABIS}; do |
244 | for abi in ${MULTILIB_ABIS}; do |
245 | [ "$(get_abi_LIBDIR ${abi})" != "lib" ] && libdirs="${libdirs} $(get_abi_LIBDIR ${abi})" |
245 | libdirs+=" $(get_abi_LIBDIR ${abi})" |
246 | done |
246 | done |
|
|
247 | [[ " ${libdirs} " != *" lib "* ]] && libdirs+=" lib" |
247 | |
248 | |
248 | echo "${libdirs}" |
249 | echo "${libdirs}" |
249 | } |
250 | } |
250 | |
251 | |
251 | # @FUNCTION: is_final_abi |
252 | # @FUNCTION: is_final_abi |
… | |
… | |
253 | # Return true if ${ABI} is the last ABI on our list (or if we're not |
254 | # Return true if ${ABI} is the last ABI on our list (or if we're not |
254 | # using the new multilib configuration. This can be used to determine |
255 | # using the new multilib configuration. This can be used to determine |
255 | # if we're in the last (or only) run through src_{unpack,compile,install} |
256 | # if we're in the last (or only) run through src_{unpack,compile,install} |
256 | is_final_abi() { |
257 | is_final_abi() { |
257 | has_multilib_profile || return 0 |
258 | has_multilib_profile || return 0 |
258 | local ALL_ABIS=$(get_install_abis) |
259 | set -- $(get_install_abis) |
259 | local LAST_ABI=${ALL_ABIS/* /} |
260 | local LAST_ABI=$# |
260 | [[ ${LAST_ABI} == ${ABI} ]] |
261 | [[ ${!LAST_ABI} == ${ABI} ]] |
261 | } |
262 | } |
262 | |
263 | |
263 | # @FUNCTION: number_abis |
264 | # @FUNCTION: number_abis |
264 | # @DESCRIPTION: |
265 | # @DESCRIPTION: |
265 | # echo the number of ABIs we will be installing for |
266 | # echo the number of ABIs we will be installing for |
… | |
… | |
530 | local libname |
531 | local libname |
531 | local ver=$1 |
532 | local ver=$1 |
532 | case ${CHOST} in |
533 | case ${CHOST} in |
533 | *-cygwin|mingw*|*-mingw*) libname="dll";; |
534 | *-cygwin|mingw*|*-mingw*) libname="dll";; |
534 | *-darwin*) libname="dylib";; |
535 | *-darwin*) libname="dylib";; |
535 | *-aix*) libname="a";; |
|
|
536 | *-mint*) libname="irrelevant";; |
536 | *-mint*) libname="irrelevant";; |
537 | hppa*-hpux*) libname="sl";; |
537 | hppa*-hpux*) libname="sl";; |
538 | *) libname="so";; |
538 | *) libname="so";; |
539 | esac |
539 | esac |
540 | |
540 | |
… | |
… | |
542 | echo ".${libname}" |
542 | echo ".${libname}" |
543 | else |
543 | else |
544 | for ver in "$@" ; do |
544 | for ver in "$@" ; do |
545 | case ${CHOST} in |
545 | case ${CHOST} in |
546 | *-darwin*) echo ".${ver}.${libname}";; |
546 | *-darwin*) echo ".${ver}.${libname}";; |
547 | *-aix*) echo ".${libname}";; |
|
|
548 | *-mint*) echo ".${libname}";; |
547 | *-mint*) echo ".${libname}";; |
549 | *) echo ".${libname}.${ver}";; |
548 | *) echo ".${libname}.${ver}";; |
550 | esac |
549 | esac |
551 | done |
550 | done |
552 | fi |
551 | fi |
… | |
… | |
581 | x86_64*) |
580 | x86_64*) |
582 | export CFLAGS_x86=${CFLAGS_x86--m32} |
581 | export CFLAGS_x86=${CFLAGS_x86--m32} |
583 | export CHOST_x86=${CTARGET/x86_64/i686} |
582 | export CHOST_x86=${CTARGET/x86_64/i686} |
584 | export CTARGET_x86=${CHOST_x86} |
583 | export CTARGET_x86=${CHOST_x86} |
585 | export CDEFINE_x86="__i386__" |
584 | export CDEFINE_x86="__i386__" |
|
|
585 | if [[ ${SYMLINK_LIBDIR} == "yes" ]] ; then |
|
|
586 | export LIBDIR_x86="lib32" |
|
|
587 | else |
586 | export LIBDIR_x86="lib" |
588 | export LIBDIR_x86="lib" |
|
|
589 | fi |
587 | |
590 | |
588 | export CFLAGS_amd64=${CFLAGS_amd64--m64} |
591 | export CFLAGS_amd64=${CFLAGS_amd64--m64} |
589 | export CHOST_amd64=${CTARGET} |
592 | export CHOST_amd64=${CTARGET} |
590 | export CTARGET_amd64=${CHOST_amd64} |
593 | export CTARGET_amd64=${CHOST_amd64} |
591 | export CDEFINE_amd64="__x86_64__" |
594 | export CDEFINE_amd64="__x86_64__" |
592 | export LIBDIR_amd64="lib64" |
595 | export LIBDIR_amd64="lib64" |
593 | |
596 | |
|
|
597 | export CFLAGS_x32=${CFLAGS_x32--mx32} |
|
|
598 | export CHOST_x32=${CTARGET} |
|
|
599 | export CTARGET_x32=${CHOST_x32} |
|
|
600 | export CDEFINE_x32="__i386__" |
|
|
601 | export LIBDIR_x32="libx32" |
|
|
602 | |
594 | export MULTILIB_ABIS="amd64 x86" |
603 | : ${MULTILIB_ABIS=amd64 x86} |
595 | export DEFAULT_ABI="amd64" |
604 | : ${DEFAULT_ABI=amd64} |
596 | ;; |
605 | ;; |
597 | mips64*) |
606 | mips64*) |
598 | export CFLAGS_o32=${CFLAGS_o32--mabi=32} |
607 | export CFLAGS_o32=${CFLAGS_o32--mabi=32} |
599 | export CHOST_o32=${CTARGET/mips64/mips} |
608 | export CHOST_o32=${CTARGET/mips64/mips} |
600 | export CTARGET_o32=${CHOST_o32} |
609 | export CTARGET_o32=${CHOST_o32} |
… | |
… | |
611 | export CHOST_n64=${CTARGET} |
620 | export CHOST_n64=${CTARGET} |
612 | export CTARGET_n64=${CHOST_n64} |
621 | export CTARGET_n64=${CHOST_n64} |
613 | export CDEFINE_n64="_MIPS_SIM == _ABI64" |
622 | export CDEFINE_n64="_MIPS_SIM == _ABI64" |
614 | export LIBDIR_n64="lib64" |
623 | export LIBDIR_n64="lib64" |
615 | |
624 | |
616 | export MULTILIB_ABIS="n64 n32 o32" |
625 | : ${MULTILIB_ABIS=n64 n32 o32} |
617 | export DEFAULT_ABI="n32" |
626 | : ${DEFAULT_ABI=n32} |
618 | ;; |
627 | ;; |
619 | powerpc64*) |
628 | powerpc64*) |
620 | export CFLAGS_ppc=${CFLAGS_ppc--m32} |
629 | export CFLAGS_ppc=${CFLAGS_ppc--m32} |
621 | export CHOST_ppc=${CTARGET/powerpc64/powerpc} |
630 | export CHOST_ppc=${CTARGET/powerpc64/powerpc} |
622 | export CTARGET_ppc=${CHOST_ppc} |
631 | export CTARGET_ppc=${CHOST_ppc} |
… | |
… | |
627 | export CHOST_ppc64=${CTARGET} |
636 | export CHOST_ppc64=${CTARGET} |
628 | export CTARGET_ppc64=${CHOST_ppc64} |
637 | export CTARGET_ppc64=${CHOST_ppc64} |
629 | export CDEFINE_ppc64="__powerpc64__" |
638 | export CDEFINE_ppc64="__powerpc64__" |
630 | export LIBDIR_ppc64="lib64" |
639 | export LIBDIR_ppc64="lib64" |
631 | |
640 | |
632 | export MULTILIB_ABIS="ppc64 ppc" |
641 | : ${MULTILIB_ABIS=ppc64 ppc} |
633 | export DEFAULT_ABI="ppc64" |
642 | : ${DEFAULT_ABI=ppc64} |
634 | ;; |
643 | ;; |
635 | s390x*) |
644 | s390x*) |
636 | export CFLAGS_s390=${CFLAGS_s390--m31} # the 31 is not a typo |
645 | export CFLAGS_s390=${CFLAGS_s390--m31} # the 31 is not a typo |
637 | export CHOST_s390=${CTARGET/s390x/s390} |
646 | export CHOST_s390=${CTARGET/s390x/s390} |
638 | export CTARGET_s390=${CHOST_s390} |
647 | export CTARGET_s390=${CHOST_s390} |
… | |
… | |
643 | export CHOST_s390x=${CTARGET} |
652 | export CHOST_s390x=${CTARGET} |
644 | export CTARGET_s390x=${CHOST_s390x} |
653 | export CTARGET_s390x=${CHOST_s390x} |
645 | export CDEFINE_s390x="__s390x__" |
654 | export CDEFINE_s390x="__s390x__" |
646 | export LIBDIR_s390x="lib64" |
655 | export LIBDIR_s390x="lib64" |
647 | |
656 | |
648 | export MULTILIB_ABIS="s390x s390" |
657 | : ${MULTILIB_ABIS=s390x s390} |
649 | export DEFAULT_ABI="s390x" |
658 | : ${DEFAULT_ABI=s390x} |
650 | ;; |
659 | ;; |
651 | sparc*) |
660 | sparc*) |
652 | export CFLAGS_sparc32=${CFLAGS_sparc32} |
661 | export CFLAGS_sparc32=${CFLAGS_sparc32} |
653 | export CHOST_sparc32=${CTARGET/sparc64/sparc} |
662 | export CHOST_sparc32=${CTARGET/sparc64/sparc} |
654 | export CTARGET_sparc32=${CHOST_sparc32} |
663 | export CTARGET_sparc32=${CHOST_sparc32} |
… | |
… | |
659 | export CHOST_sparc64=${CTARGET} |
668 | export CHOST_sparc64=${CTARGET} |
660 | export CTARGET_sparc64=${CHOST_sparc64} |
669 | export CTARGET_sparc64=${CHOST_sparc64} |
661 | export CDEFINE_sparc64="__arch64__" |
670 | export CDEFINE_sparc64="__arch64__" |
662 | export LIBDIR_sparc64="lib64" |
671 | export LIBDIR_sparc64="lib64" |
663 | |
672 | |
664 | export MULTILIB_ABIS="${MULTILIB_ABIS-sparc64 sparc32}" |
673 | : ${MULTILIB_ABIS=sparc64 sparc32} |
665 | export DEFAULT_ABI="${DEFAULT_ABI-sparc64}" |
674 | : ${DEFAULT_ABI=sparc64} |
666 | ;; |
675 | ;; |
667 | *) |
676 | *) |
668 | export MULTILIB_ABIS="default" |
677 | : ${MULTILIB_ABIS=default} |
669 | export DEFAULT_ABI="default" |
678 | : ${DEFAULT_ABI=default} |
670 | ;; |
679 | ;; |
671 | esac |
680 | esac |
|
|
681 | |
|
|
682 | export MULTILIB_ABIS DEFAULT_ABI |
672 | } |
683 | } |
673 | |
684 | |
674 | # @FUNCTION: multilib_toolchain_setup |
685 | # @FUNCTION: multilib_toolchain_setup |
675 | # @DESCRIPTION: |
686 | # @DESCRIPTION: |
676 | # Hide multilib details here for packages which are forced to be compiled for a |
687 | # Hide multilib details here for packages which are forced to be compiled for a |
… | |
… | |
678 | multilib_toolchain_setup() { |
689 | multilib_toolchain_setup() { |
679 | local v vv |
690 | local v vv |
680 | |
691 | |
681 | export ABI=$1 |
692 | export ABI=$1 |
682 | |
693 | |
|
|
694 | # First restore any saved state we have laying around. |
|
|
695 | if [[ ${__DEFAULT_ABI_SAVED} == "true" ]] ; then |
|
|
696 | for v in CHOST CBUILD AS CC CXX LD ; do |
|
|
697 | vv="__abi_saved_${v}" |
|
|
698 | export ${v}="${!vv}" |
|
|
699 | unset ${vv} |
|
|
700 | done |
|
|
701 | unset __DEFAULT_ABI_SAVED |
|
|
702 | fi |
|
|
703 | |
683 | # We want to avoid the behind-the-back magic of gcc-config as it |
704 | # We want to avoid the behind-the-back magic of gcc-config as it |
684 | # screws up ccache and distcc. See #196243 for more info. |
705 | # screws up ccache and distcc. See #196243 for more info. |
685 | if [[ ${ABI} != ${DEFAULT_ABI} ]] ; then |
706 | if [[ ${ABI} != ${DEFAULT_ABI} ]] ; then |
686 | if [[ ${DEFAULT_ABI_SAVED} != "true" ]] ; then |
707 | # Back that multilib-ass up so we can restore it later |
687 | for v in CHOST CBUILD AS CC CXX LD ; do |
708 | for v in CHOST CBUILD AS CC CXX LD ; do |
688 | export __abi_saved_${v}="${!v}" |
709 | export __abi_saved_${v}="${!v}" |
689 | done |
710 | done |
690 | export DEFAULT_ABI_SAVED="true" |
711 | export __DEFAULT_ABI_SAVED="true" |
691 | fi |
|
|
692 | |
712 | |
693 | # Set the CHOST native first so that we pick up the native |
713 | # Set the CHOST native first so that we pick up the native |
694 | # toolchain and not a cross-compiler by accident #202811. |
714 | # toolchain and not a cross-compiler by accident #202811. |
695 | export CHOST=$(get_abi_CHOST ${DEFAULT_ABI}) |
715 | export CHOST=$(get_abi_CHOST ${DEFAULT_ABI}) |
696 | export AS="$(tc-getAS) $(get_abi_ASFLAGS)" |
716 | export AS="$(tc-getAS) $(get_abi_ASFLAGS)" |
697 | export CC="$(tc-getCC) $(get_abi_CFLAGS)" |
717 | export CC="$(tc-getCC) $(get_abi_CFLAGS)" |
698 | export CXX="$(tc-getCXX) $(get_abi_CFLAGS)" |
718 | export CXX="$(tc-getCXX) $(get_abi_CFLAGS)" |
699 | export LD="$(tc-getLD) $(get_abi_LDFLAGS)" |
719 | export LD="$(tc-getLD) $(get_abi_LDFLAGS)" |
700 | export CHOST=$(get_abi_CHOST $1) |
720 | export CHOST=$(get_abi_CHOST $1) |
701 | export CBUILD=$(get_abi_CHOST $1) |
721 | export CBUILD=$(get_abi_CHOST $1) |
702 | |
|
|
703 | elif [[ ${DEFAULT_ABI_SAVED} == "true" ]] ; then |
|
|
704 | for v in CHOST CBUILD AS CC CXX LD ; do |
|
|
705 | vv="__abi_saved_${v}" |
|
|
706 | export ${v}=${!vv} |
|
|
707 | done |
|
|
708 | fi |
722 | fi |
709 | } |
723 | } |