| 1 | # Copyright 1999-2007 Gentoo Foundation |
1 | # Copyright 1999-2007 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.99 2010/04/22 18:28:11 armin76 Exp $ |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/toolchain-funcs.eclass,v 1.104 2011/07/12 14:29:41 aballier Exp $ |
| 4 | |
4 | |
| 5 | # @ECLASS: toolchain-funcs.eclass |
5 | # @ECLASS: toolchain-funcs.eclass |
| 6 | # @MAINTAINER: |
6 | # @MAINTAINER: |
| 7 | # Toolchain Ninjas <toolchain@gentoo.org> |
7 | # Toolchain Ninjas <toolchain@gentoo.org> |
| 8 | # @BLURB: functions to query common info about the toolchain |
8 | # @BLURB: functions to query common info about the toolchain |
| … | |
… | |
| 77 | # @RETURN: name of the object copier |
77 | # @RETURN: name of the object copier |
| 78 | tc-getOBJCOPY() { tc-getPROG OBJCOPY objcopy "$@"; } |
78 | tc-getOBJCOPY() { tc-getPROG OBJCOPY objcopy "$@"; } |
| 79 | # @FUNCTION: tc-getF77 |
79 | # @FUNCTION: tc-getF77 |
| 80 | # @USAGE: [toolchain prefix] |
80 | # @USAGE: [toolchain prefix] |
| 81 | # @RETURN: name of the Fortran 77 compiler |
81 | # @RETURN: name of the Fortran 77 compiler |
| 82 | tc-getF77() { tc-getPROG F77 f77 "$@"; } |
82 | tc-getF77() { tc-getPROG F77 gfortran "$@"; } |
| 83 | # @FUNCTION: tc-getFC |
83 | # @FUNCTION: tc-getFC |
| 84 | # @USAGE: [toolchain prefix] |
84 | # @USAGE: [toolchain prefix] |
| 85 | # @RETURN: name of the Fortran 90 compiler |
85 | # @RETURN: name of the Fortran 90 compiler |
| 86 | tc-getFC() { tc-getPROG FC gfortran "$@"; } |
86 | tc-getFC() { tc-getPROG FC gfortran "$@"; } |
| 87 | # @FUNCTION: tc-getGCJ |
87 | # @FUNCTION: tc-getGCJ |
| … | |
… | |
| 187 | tc-is-static-only() { |
187 | tc-is-static-only() { |
| 188 | local host=${CTARGET:-${CHOST}} |
188 | local host=${CTARGET:-${CHOST}} |
| 189 | |
189 | |
| 190 | # *MiNT doesn't have shared libraries, only platform so far |
190 | # *MiNT doesn't have shared libraries, only platform so far |
| 191 | return $([[ ${host} == *-mint* ]]) |
191 | return $([[ ${host} == *-mint* ]]) |
|
|
192 | } |
|
|
193 | |
|
|
194 | # @FUNCTION: tc-has-openmp |
|
|
195 | # @USAGE: [toolchain prefix] |
|
|
196 | # @DESCRIPTION: |
|
|
197 | # See if the toolchain supports OpenMP. |
|
|
198 | tc-has-openmp() { |
|
|
199 | local base="${T}/test-tc-openmp" |
|
|
200 | cat <<-EOF > "${base}.c" |
|
|
201 | #include <omp.h> |
|
|
202 | int main() { |
|
|
203 | int nthreads, tid, ret = 0; |
|
|
204 | #pragma omp parallel private(nthreads, tid) |
|
|
205 | { |
|
|
206 | tid = omp_get_thread_num(); |
|
|
207 | nthreads = omp_get_num_threads(); ret += tid + nthreads; |
|
|
208 | } |
|
|
209 | return ret; |
|
|
210 | } |
|
|
211 | EOF |
|
|
212 | $(tc-getCC "$@") -fopenmp "${base}.c" -o "${base}" >&/dev/null |
|
|
213 | local ret=$? |
|
|
214 | rm -f "${base}"* |
|
|
215 | return ${ret} |
| 192 | } |
216 | } |
| 193 | |
217 | |
| 194 | # @FUNCTION: tc-has-tls |
218 | # @FUNCTION: tc-has-tls |
| 195 | # @USAGE: [-s|-c|-l] [toolchain prefix] |
219 | # @USAGE: [-s|-c|-l] [toolchain prefix] |
| 196 | # @DESCRIPTION: |
220 | # @DESCRIPTION: |
| … | |
… | |
| 251 | m68*) echo m68k;; |
275 | m68*) echo m68k;; |
| 252 | mips*) echo mips;; |
276 | mips*) echo mips;; |
| 253 | nios2*) echo nios2;; |
277 | nios2*) echo nios2;; |
| 254 | nios*) echo nios;; |
278 | nios*) echo nios;; |
| 255 | powerpc*) |
279 | powerpc*) |
| 256 | # Starting with linux-2.6.15, the 'ppc' and 'ppc64' trees |
280 | # Starting with linux-2.6.15, the 'ppc' and 'ppc64' trees |
| 257 | # have been unified into simply 'powerpc', but until 2.6.16, |
281 | # have been unified into simply 'powerpc', but until 2.6.16, |
| 258 | # ppc32 is still using ARCH="ppc" as default |
282 | # ppc32 is still using ARCH="ppc" as default |
| 259 | if [[ $(KV_to_int ${KV}) -ge $(KV_to_int 2.6.16) ]] && [[ ${type} == "kern" ]] ; then |
283 | if [[ ${type} == "kern" ]] && [[ $(KV_to_int ${KV}) -ge $(KV_to_int 2.6.16) ]] ; then |
| 260 | echo powerpc |
284 | echo powerpc |
| 261 | elif [[ $(KV_to_int ${KV}) -eq $(KV_to_int 2.6.15) ]] && [[ ${type} == "kern" ]] ; then |
285 | elif [[ ${type} == "kern" ]] && [[ $(KV_to_int ${KV}) -eq $(KV_to_int 2.6.15) ]] ; then |
| 262 | if [[ ${host} == powerpc64* ]] || [[ ${PROFILE_ARCH} == "ppc64" ]] ; then |
286 | if [[ ${host} == powerpc64* ]] || [[ ${PROFILE_ARCH} == "ppc64" ]] ; then |
| 263 | echo powerpc |
287 | echo powerpc |
| 264 | else |
288 | else |
| 265 | echo ppc |
289 | echo ppc |
| 266 | fi |
290 | fi |
| 267 | elif [[ ${host} == powerpc64* ]] ; then |
291 | elif [[ ${host} == powerpc64* ]] ; then |
| 268 | echo ppc64 |
292 | echo ppc64 |
| 269 | elif [[ ${PROFILE_ARCH} == "ppc64" ]] ; then |
293 | elif [[ ${PROFILE_ARCH} == "ppc64" ]] ; then |
| 270 | ninj ppc64 ppc |
294 | ninj ppc64 ppc |
| 271 | else |
295 | else |
| 272 | echo ppc |
296 | echo ppc |
| 273 | fi |
297 | fi |
| 274 | ;; |
298 | ;; |
| 275 | s390*) echo s390;; |
299 | s390*) echo s390;; |
| 276 | sh64*) ninj sh64 sh;; |
300 | sh64*) ninj sh64 sh;; |
| 277 | sh*) echo sh;; |
301 | sh*) echo sh;; |
| 278 | sparc64*) ninj sparc64 sparc;; |
302 | sparc64*) ninj sparc64 sparc;; |
| 279 | sparc*) [[ ${PROFILE_ARCH} == "sparc64" ]] \ |
303 | sparc*) [[ ${PROFILE_ARCH} == "sparc64" ]] \ |
| 280 | && ninj sparc64 sparc \ |
304 | && ninj sparc64 sparc \ |
| 281 | || echo sparc |
305 | || echo sparc |
| 282 | ;; |
306 | ;; |
| 283 | vax*) echo vax;; |
307 | vax*) echo vax;; |
|
|
308 | x86_64*freebsd*) echo amd64;; |
| 284 | x86_64*) |
309 | x86_64*) |
| 285 | # Starting with linux-2.6.24, the 'x86_64' and 'i386' |
310 | # Starting with linux-2.6.24, the 'x86_64' and 'i386' |
| 286 | # trees have been unified into 'x86'. |
311 | # trees have been unified into 'x86'. |
| 287 | if [[ ${type} == "kern" ]] && [[ $(KV_to_int ${KV}) -ge $(KV_to_int 2.6.24) ]] ; then |
312 | if [[ ${type} == "kern" ]] && [[ $(KV_to_int ${KV}) -ge $(KV_to_int 2.6.24) ]] ; then |
| 288 | echo x86 |
313 | echo x86 |
| … | |
… | |
| 334 | x86_64*) echo little;; |
359 | x86_64*) echo little;; |
| 335 | *) echo wtf;; |
360 | *) echo wtf;; |
| 336 | esac |
361 | esac |
| 337 | } |
362 | } |
| 338 | |
363 | |
|
|
364 | # Internal func. The first argument is the version info to expand. |
|
|
365 | # Query the preprocessor to improve compatibility across different |
|
|
366 | # compilers rather than maintaining a --version flag matrix. #335943 |
|
|
367 | _gcc_fullversion() { |
|
|
368 | local ver="$1"; shift |
|
|
369 | set -- `$(tc-getCPP "$@") -E -P - <<<"__GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__"` |
|
|
370 | eval echo "$ver" |
|
|
371 | } |
|
|
372 | |
| 339 | # @FUNCTION: gcc-fullversion |
373 | # @FUNCTION: gcc-fullversion |
| 340 | # @RETURN: compiler version (major.minor.micro: [3.4.6]) |
374 | # @RETURN: compiler version (major.minor.micro: [3.4.6]) |
| 341 | gcc-fullversion() { |
375 | gcc-fullversion() { |
| 342 | $(tc-getCC "$@") -dumpversion |
376 | _gcc_fullversion '$1.$2.$3' "$@" |
| 343 | } |
377 | } |
| 344 | # @FUNCTION: gcc-version |
378 | # @FUNCTION: gcc-version |
| 345 | # @RETURN: compiler version (major.minor: [3.4].6) |
379 | # @RETURN: compiler version (major.minor: [3.4].6) |
| 346 | gcc-version() { |
380 | gcc-version() { |
| 347 | gcc-fullversion "$@" | cut -f1,2 -d. |
381 | _gcc_fullversion '$1.$2' "$@" |
| 348 | } |
382 | } |
| 349 | # @FUNCTION: gcc-major-version |
383 | # @FUNCTION: gcc-major-version |
| 350 | # @RETURN: major compiler version (major: [3].4.6) |
384 | # @RETURN: major compiler version (major: [3].4.6) |
| 351 | gcc-major-version() { |
385 | gcc-major-version() { |
| 352 | gcc-version "$@" | cut -f1 -d. |
386 | _gcc_fullversion '$1' "$@" |
| 353 | } |
387 | } |
| 354 | # @FUNCTION: gcc-minor-version |
388 | # @FUNCTION: gcc-minor-version |
| 355 | # @RETURN: minor compiler version (minor: 3.[4].6) |
389 | # @RETURN: minor compiler version (minor: 3.[4].6) |
| 356 | gcc-minor-version() { |
390 | gcc-minor-version() { |
| 357 | gcc-version "$@" | cut -f2 -d. |
391 | _gcc_fullversion '$2' "$@" |
| 358 | } |
392 | } |
| 359 | # @FUNCTION: gcc-micro-version |
393 | # @FUNCTION: gcc-micro-version |
| 360 | # @RETURN: micro compiler version (micro: 3.4.[6]) |
394 | # @RETURN: micro compiler version (micro: 3.4.[6]) |
| 361 | gcc-micro-version() { |
395 | gcc-micro-version() { |
| 362 | gcc-fullversion "$@" | cut -f3 -d. | cut -f1 -d- |
396 | _gcc_fullversion '$3' "$@" |
| 363 | } |
397 | } |
| 364 | |
398 | |
| 365 | # Returns the installation directory - internal toolchain |
399 | # Returns the installation directory - internal toolchain |
| 366 | # function for use by _gcc-specs-exists (for flag-o-matic). |
400 | # function for use by _gcc-specs-exists (for flag-o-matic). |
| 367 | _gcc-install-dir() { |
401 | _gcc-install-dir() { |