| 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.40 2005/07/11 15:08:06 swegener Exp $ |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/toolchain-funcs.eclass,v 1.43 2005/09/15 00:13:10 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 | |
11 | |
| 13 | DESCRIPTION="Based on the ${ECLASS} eclass" |
12 | DESCRIPTION="Based on the ${ECLASS} eclass" |
| 14 | |
13 | |
| 15 | tc-getPROG() { |
14 | tc-getPROG() { |
| 16 | local var=$1 |
15 | local var=$1 |
| … | |
… | |
| 50 | # Returns the name of the java compiler |
49 | # Returns the name of the java compiler |
| 51 | tc-getGCJ() { tc-getPROG GCJ gcj "$@"; } |
50 | tc-getGCJ() { tc-getPROG GCJ gcj "$@"; } |
| 52 | |
51 | |
| 53 | # Returns the name of the C compiler for build |
52 | # Returns the name of the C compiler for build |
| 54 | tc-getBUILD_CC() { |
53 | tc-getBUILD_CC() { |
|
|
54 | local v |
|
|
55 | for v in CC_FOR_BUILD BUILD_CC HOSTCC ; do |
| 55 | if [[ -n ${CC_FOR_BUILD} ]] ; then |
56 | if [[ -n ${!v} ]] ; then |
| 56 | export BUILD_CC=${CC_FOR_BUILD} |
57 | export BUILD_CC=${!v} |
| 57 | echo "${CC_FOR_BUILD}" |
58 | echo "${!v}" |
| 58 | return 0 |
59 | return 0 |
| 59 | fi |
60 | fi |
|
|
61 | done |
| 60 | |
62 | |
| 61 | local search= |
63 | local search= |
| 62 | if [[ -n ${CBUILD} ]] ; then |
64 | if [[ -n ${CBUILD} ]] ; then |
| 63 | search=$(type -p ${CBUILD}-gcc) |
65 | search=$(type -p ${CBUILD}-gcc) |
| 64 | search=${search##*/} |
66 | search=${search##*/} |
| … | |
… | |
| 78 | done |
80 | done |
| 79 | } |
81 | } |
| 80 | |
82 | |
| 81 | # A simple way to see if we're using a cross-compiler ... |
83 | # A simple way to see if we're using a cross-compiler ... |
| 82 | tc-is-cross-compiler() { |
84 | tc-is-cross-compiler() { |
| 83 | if [[ -n ${CBUILD} ]] ; then |
|
|
| 84 | return $([[ ${CBUILD} != ${CHOST} ]]) |
85 | return $([[ ${CBUILD:-${CHOST}} != ${CHOST} ]]) |
| 85 | fi |
|
|
| 86 | return 1 |
|
|
| 87 | } |
86 | } |
| 88 | |
87 | |
| 89 | |
88 | |
| 90 | # Parse information from CBUILD/CHOST/CTARGET rather than |
89 | # Parse information from CBUILD/CHOST/CTARGET rather than |
| 91 | # use external variables from the profile. |
90 | # use external variables from the profile. |
| … | |
… | |
| 170 | } |
169 | } |
| 171 | # Returns the Micro version |
170 | # Returns the Micro version |
| 172 | gcc-micro-version() { |
171 | gcc-micro-version() { |
| 173 | echo "$(gcc-fullversion | cut -f3 -d. | cut -f1 -d-)" |
172 | echo "$(gcc-fullversion | cut -f3 -d. | cut -f1 -d-)" |
| 174 | } |
173 | } |
|
|
174 | |
|
|
175 | # Returns requested gcc specs directive |
|
|
176 | # Note; if a spec exists more than once (e.g. in more than one specs file) |
|
|
177 | # the last one read is the active definition - i.e. they do not accumulate, |
|
|
178 | # each new definition replaces any previous definition. |
|
|
179 | gcc-specs-directive() { |
|
|
180 | local specfiles=$($(tc-getCC) -v 2>&1 | grep "^Reading" | awk '{print $NF}') |
|
|
181 | [[ -z ${specfiles} ]] && return 0 |
|
|
182 | awk -v spec=$1 \ |
|
|
183 | 'BEGIN { sstr=""; outside=1 } |
|
|
184 | $1=="*"spec":" { sstr=""; outside=0; next } |
|
|
185 | outside || NF==0 || ( substr($1,1,1)=="*" && substr($1,length($1),1)==":" ) { outside=1; next } |
|
|
186 | { sstr=sstr $0 } |
|
|
187 | END { print sstr }' ${specfiles} |
|
|
188 | } |
|
|
189 | |
|
|
190 | # Returns true if gcc sets relro |
|
|
191 | gcc-specs-relro() { |
|
|
192 | local directive |
|
|
193 | directive=$(gcc-specs-directive link_command) |
|
|
194 | return $([[ ${directive/\{!norelro:} != ${directive} ]]) |
|
|
195 | } |
|
|
196 | # Returns true if gcc sets now |
|
|
197 | gcc-specs-now() { |
|
|
198 | local directive |
|
|
199 | directive=$(gcc-specs-directive link_command) |
|
|
200 | return $([[ ${directive/\{!nonow:} != ${directive} ]]) |
|
|
201 | } |
|
|
202 | # Returns true if gcc builds PIEs |
|
|
203 | gcc-specs-pie() { |
|
|
204 | local directive |
|
|
205 | directive=$(gcc-specs-directive cc1) |
|
|
206 | return $([[ ${directive/\{!nopie:} != ${directive} ]]) |
|
|
207 | } |
|
|
208 | # Returns true if gcc builds with the stack protector |
|
|
209 | gcc-specs-ssp() { |
|
|
210 | local directive |
|
|
211 | directive=$(gcc-specs-directive cc1) |
|
|
212 | return $([[ ${directive/\{!fno-stack-protector:} != ${directive} ]]) |
|
|
213 | } |