| 1 | # Copyright 1999-2005 Gentoo Foundation |
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/toolchain-funcs.eclass,v 1.37 2005/07/01 22:31:40 dostrow Exp $ |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/toolchain-funcs.eclass,v 1.45 2005/10/06 01:52:51 vapier Exp $ |
| 4 | # |
4 | # |
| 5 | # Author: Toolchain Ninjas <ninjas@gentoo.org> |
5 | # Author: Toolchain Ninjas <ninjas@gentoo.org> |
| 6 | # |
6 | # |
| 7 | # This eclass contains (or should) functions to get common info |
7 | # This eclass contains (or should) functions to get common info |
| 8 | # about the toolchain (libc/compiler/binutils/etc...) |
8 | # about the toolchain (libc/compiler/binutils/etc...) |
| 9 | |
9 | |
| 10 | inherit multilib |
10 | inherit multilib |
| 11 | |
|
|
| 12 | ECLASS=toolchain-funcs |
|
|
| 13 | INHERITED="$INHERITED $ECLASS" |
|
|
| 14 | |
11 | |
| 15 | DESCRIPTION="Based on the ${ECLASS} eclass" |
12 | DESCRIPTION="Based on the ${ECLASS} eclass" |
| 16 | |
13 | |
| 17 | tc-getPROG() { |
14 | tc-getPROG() { |
| 18 | local var=$1 |
15 | local var=$1 |
| … | |
… | |
| 52 | # Returns the name of the java compiler |
49 | # Returns the name of the java compiler |
| 53 | tc-getGCJ() { tc-getPROG GCJ gcj "$@"; } |
50 | tc-getGCJ() { tc-getPROG GCJ gcj "$@"; } |
| 54 | |
51 | |
| 55 | # Returns the name of the C compiler for build |
52 | # Returns the name of the C compiler for build |
| 56 | tc-getBUILD_CC() { |
53 | tc-getBUILD_CC() { |
|
|
54 | local v |
|
|
55 | for v in CC_FOR_BUILD BUILD_CC HOSTCC ; do |
| 57 | if [[ -n ${CC_FOR_BUILD} ]] ; then |
56 | if [[ -n ${!v} ]] ; then |
| 58 | export BUILD_CC=${CC_FOR_BUILD} |
57 | export BUILD_CC=${!v} |
| 59 | echo "${CC_FOR_BUILD}" |
58 | echo "${!v}" |
| 60 | return 0 |
59 | return 0 |
| 61 | fi |
60 | fi |
|
|
61 | done |
| 62 | |
62 | |
| 63 | local search= |
63 | local search= |
| 64 | if [[ -n ${CBUILD} ]] ; then |
64 | if [[ -n ${CBUILD} ]] ; then |
| 65 | search=$(type -p ${CBUILD}-gcc) |
65 | search=$(type -p ${CBUILD}-gcc) |
| 66 | search=${search##*/} |
66 | search=${search##*/} |
| 67 | else |
|
|
| 68 | search=gcc |
|
|
| 69 | fi |
67 | fi |
|
|
68 | search=${search:-gcc} |
| 70 | |
69 | |
| 71 | export BUILD_CC=${search} |
70 | export BUILD_CC=${search} |
| 72 | echo "${search}" |
71 | echo "${search}" |
| 73 | } |
72 | } |
| 74 | |
73 | |
| … | |
… | |
| 80 | done |
79 | done |
| 81 | } |
80 | } |
| 82 | |
81 | |
| 83 | # A simple way to see if we're using a cross-compiler ... |
82 | # A simple way to see if we're using a cross-compiler ... |
| 84 | tc-is-cross-compiler() { |
83 | tc-is-cross-compiler() { |
| 85 | if [[ -n ${CBUILD} ]] ; then |
|
|
| 86 | return $([[ ${CBUILD} != ${CHOST} ]]) |
84 | return $([[ ${CBUILD:-${CHOST}} != ${CHOST} ]]) |
| 87 | fi |
|
|
| 88 | return 1 |
|
|
| 89 | } |
85 | } |
| 90 | |
86 | |
| 91 | |
87 | |
| 92 | # Parse information from CBUILD/CHOST/CTARGET rather than |
88 | # Parse information from CBUILD/CHOST/CTARGET rather than |
| 93 | # use external variables from the profile. |
89 | # use external variables from the profile. |
| 94 | tc-ninja_magic_to_arch() { |
90 | tc-ninja_magic_to_arch() { |
| 95 | ninj() { [[ ${type} == "kern" ]] && echo $1 || echo $2 ; } |
91 | ninj() { [[ ${type} == "kern" ]] && echo $1 || echo $2 ; } |
| 96 | |
92 | |
| 97 | local type=$1 |
93 | local type=$1 |
| … | |
… | |
| 100 | |
96 | |
| 101 | case ${host} in |
97 | case ${host} in |
| 102 | alpha*) echo alpha;; |
98 | alpha*) echo alpha;; |
| 103 | x86_64*) ninj x86_64 amd64;; |
99 | x86_64*) ninj x86_64 amd64;; |
| 104 | arm*) echo arm;; |
100 | arm*) echo arm;; |
|
|
101 | thumb*) echo arm;; |
| 105 | hppa*) ninj parisc hppa;; |
102 | hppa*) ninj parisc hppa;; |
| 106 | ia64*) echo ia64;; |
103 | ia64*) echo ia64;; |
| 107 | m68*) echo m68k;; |
104 | m68*) echo m68k;; |
| 108 | mips*) echo mips;; |
105 | mips*) echo mips;; |
| 109 | powerpc64*) echo ppc64;; |
106 | powerpc64*) echo ppc64;; |
| … | |
… | |
| 137 | case ${host} in |
134 | case ${host} in |
| 138 | alpha*) echo big;; |
135 | alpha*) echo big;; |
| 139 | x86_64*) echo little;; |
136 | x86_64*) echo little;; |
| 140 | arm*b*) echo big;; |
137 | arm*b*) echo big;; |
| 141 | arm*) echo little;; |
138 | arm*) echo little;; |
|
|
139 | thumb*) echo little;; |
| 142 | hppa*) echo big;; |
140 | hppa*) echo big;; |
| 143 | ia64*) echo little;; |
141 | ia64*) echo little;; |
| 144 | m68*) echo big;; |
142 | m68*) echo big;; |
| 145 | mips*l*) echo little;; |
143 | mips*l*) echo little;; |
| 146 | mips*) echo big;; |
144 | mips*) echo big;; |
| … | |
… | |
| 172 | } |
170 | } |
| 173 | # Returns the Micro version |
171 | # Returns the Micro version |
| 174 | gcc-micro-version() { |
172 | gcc-micro-version() { |
| 175 | echo "$(gcc-fullversion | cut -f3 -d. | cut -f1 -d-)" |
173 | echo "$(gcc-fullversion | cut -f3 -d. | cut -f1 -d-)" |
| 176 | } |
174 | } |
|
|
175 | |
|
|
176 | # Returns requested gcc specs directive |
|
|
177 | # Note; if a spec exists more than once (e.g. in more than one specs file) |
|
|
178 | # the last one read is the active definition - i.e. they do not accumulate, |
|
|
179 | # each new definition replaces any previous definition. |
|
|
180 | gcc-specs-directive() { |
|
|
181 | local specfiles=$($(tc-getCC) -v 2>&1 | grep "^Reading" | awk '{print $NF}') |
|
|
182 | [[ -z ${specfiles} ]] && return 0 |
|
|
183 | awk -v spec=$1 \ |
|
|
184 | 'BEGIN { sstr=""; outside=1 } |
|
|
185 | $1=="*"spec":" { sstr=""; outside=0; next } |
|
|
186 | outside || NF==0 || ( substr($1,1,1)=="*" && substr($1,length($1),1)==":" ) { outside=1; next } |
|
|
187 | { sstr=sstr $0 } |
|
|
188 | END { print sstr }' ${specfiles} |
|
|
189 | } |
|
|
190 | |
|
|
191 | # Returns true if gcc sets relro |
|
|
192 | gcc-specs-relro() { |
|
|
193 | local directive |
|
|
194 | directive=$(gcc-specs-directive link_command) |
|
|
195 | return $([[ ${directive/\{!norelro:} != ${directive} ]]) |
|
|
196 | } |
|
|
197 | # Returns true if gcc sets now |
|
|
198 | gcc-specs-now() { |
|
|
199 | local directive |
|
|
200 | directive=$(gcc-specs-directive link_command) |
|
|
201 | return $([[ ${directive/\{!nonow:} != ${directive} ]]) |
|
|
202 | } |
|
|
203 | # Returns true if gcc builds PIEs |
|
|
204 | gcc-specs-pie() { |
|
|
205 | local directive |
|
|
206 | directive=$(gcc-specs-directive cc1) |
|
|
207 | return $([[ ${directive/\{!nopie:} != ${directive} ]]) |
|
|
208 | } |
|
|
209 | # Returns true if gcc builds with the stack protector |
|
|
210 | gcc-specs-ssp() { |
|
|
211 | local directive |
|
|
212 | directive=$(gcc-specs-directive cc1) |
|
|
213 | return $([[ ${directive/\{!fno-stack-protector:} != ${directive} ]]) |
|
|
214 | } |