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.92 2009/08/15 15:11:17 grobian Exp $ |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/toolchain-funcs.eclass,v 1.102 2010/09/11 17:12:20 vapier 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 |
88 | # @USAGE: [toolchain prefix] |
88 | # @USAGE: [toolchain prefix] |
89 | # @RETURN: name of the java compiler |
89 | # @RETURN: name of the java compiler |
90 | tc-getGCJ() { tc-getPROG GCJ gcj "$@"; } |
90 | tc-getGCJ() { tc-getPROG GCJ gcj "$@"; } |
|
|
91 | # @FUNCTION: tc-getPKG_CONFIG |
|
|
92 | # @USAGE: [toolchain prefix] |
|
|
93 | # @RETURN: name of the pkg-config tool |
|
|
94 | tc-getPKG_CONFIG() { tc-getPROG PKG_CONFIG pkg-config "$@"; } |
|
|
95 | # @FUNCTION: tc-getRC |
|
|
96 | # @USAGE: [toolchain prefix] |
|
|
97 | # @RETURN: name of the Windows resource compiler |
|
|
98 | tc-getRC() { tc-getPROG RC windres "$@"; } |
|
|
99 | # @FUNCTION: tc-getDLLWRAP |
|
|
100 | # @USAGE: [toolchain prefix] |
|
|
101 | # @RETURN: name of the Windows dllwrap utility |
|
|
102 | tc-getDLLWRAP() { tc-getPROG DLLWRAP dllwrap "$@"; } |
91 | |
103 | |
92 | # @FUNCTION: tc-getBUILD_CC |
104 | # @FUNCTION: tc-getBUILD_CC |
93 | # @USAGE: [toolchain prefix] |
105 | # @USAGE: [toolchain prefix] |
94 | # @RETURN: name of the C compiler for building binaries to run on the build machine |
106 | # @RETURN: name of the C compiler for building binaries to run on the build machine |
95 | tc-getBUILD_CC() { |
107 | tc-getBUILD_CC() { |
… | |
… | |
136 | # See if this toolchain is a softfloat based one. |
148 | # See if this toolchain is a softfloat based one. |
137 | # @CODE |
149 | # @CODE |
138 | # The possible return values: |
150 | # The possible return values: |
139 | # - only: the target is always softfloat (never had fpu) |
151 | # - only: the target is always softfloat (never had fpu) |
140 | # - yes: the target should support softfloat |
152 | # - yes: the target should support softfloat |
141 | # - no: the target should support hardfloat |
153 | # - no: the target doesn't support softfloat |
142 | # @CODE |
154 | # @CODE |
143 | # This allows us to react differently where packages accept |
155 | # This allows us to react differently where packages accept |
144 | # softfloat flags in the case where support is optional, but |
156 | # softfloat flags in the case where support is optional, but |
145 | # rejects softfloat flags where the target always lacks an fpu. |
157 | # rejects softfloat flags where the target always lacks an fpu. |
146 | tc-is-softfloat() { |
158 | tc-is-softfloat() { |
… | |
… | |
153 | || echo "no" |
165 | || echo "no" |
154 | ;; |
166 | ;; |
155 | esac |
167 | esac |
156 | } |
168 | } |
157 | |
169 | |
|
|
170 | # @FUNCTION: tc-is-hardfloat |
|
|
171 | # @DESCRIPTION: |
|
|
172 | # See if this toolchain is a hardfloat based one. |
|
|
173 | # @CODE |
|
|
174 | # The possible return values: |
|
|
175 | # - yes: the target should support hardfloat |
|
|
176 | # - no: the target doesn't support hardfloat |
|
|
177 | tc-is-hardfloat() { |
|
|
178 | [[ ${CTARGET//_/-} == *-hardfloat-* ]] \ |
|
|
179 | && echo "yes" \ |
|
|
180 | || echo "no" |
|
|
181 | } |
|
|
182 | |
158 | # @FUNCTION: tc-is-static-only |
183 | # @FUNCTION: tc-is-static-only |
159 | # @DESCRIPTION: |
184 | # @DESCRIPTION: |
160 | # Return shell true if the target does not support shared libs, shell false |
185 | # Return shell true if the target does not support shared libs, shell false |
161 | # otherwise. |
186 | # otherwise. |
162 | tc-is-static-only() { |
187 | tc-is-static-only() { |
163 | local host=${CTARGET:-${CHOST}} |
188 | local host=${CTARGET:-${CHOST}} |
164 | |
189 | |
165 | # *MiNT doesn't have shared libraries, only platform so far |
190 | # *MiNT doesn't have shared libraries, only platform so far |
166 | 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} |
|
|
216 | } |
|
|
217 | |
|
|
218 | # @FUNCTION: tc-has-tls |
|
|
219 | # @USAGE: [-s|-c|-l] [toolchain prefix] |
|
|
220 | # @DESCRIPTION: |
|
|
221 | # See if the toolchain supports thread local storage (TLS). Use -s to test the |
|
|
222 | # compiler, -c to also test the assembler, and -l to also test the C library |
|
|
223 | # (the default). |
|
|
224 | tc-has-tls() { |
|
|
225 | local base="${T}/test-tc-tls" |
|
|
226 | cat <<-EOF > "${base}.c" |
|
|
227 | int foo(int *i) { |
|
|
228 | static __thread int j = 0; |
|
|
229 | return *i ? j : *i; |
|
|
230 | } |
|
|
231 | EOF |
|
|
232 | local flags |
|
|
233 | case $1 in |
|
|
234 | -s) flags="-S";; |
|
|
235 | -c) flags="-c";; |
|
|
236 | -l) ;; |
|
|
237 | -*) die "Usage: tc-has-tls [-c|-l] [toolchain prefix]";; |
|
|
238 | esac |
|
|
239 | : ${flags:=-fPIC -shared -Wl,-z,defs} |
|
|
240 | [[ $1 == -* ]] && shift |
|
|
241 | $(tc-getCC "$@") ${flags} "${base}.c" -o "${base}" >&/dev/null |
|
|
242 | local ret=$? |
|
|
243 | rm -f "${base}"* |
|
|
244 | return ${ret} |
167 | } |
245 | } |
168 | |
246 | |
169 | |
247 | |
170 | # Parse information from CBUILD/CHOST/CTARGET rather than |
248 | # Parse information from CBUILD/CHOST/CTARGET rather than |
171 | # use external variables from the profile. |
249 | # use external variables from the profile. |
… | |
… | |
280 | x86_64*) echo little;; |
358 | x86_64*) echo little;; |
281 | *) echo wtf;; |
359 | *) echo wtf;; |
282 | esac |
360 | esac |
283 | } |
361 | } |
284 | |
362 | |
|
|
363 | # Internal func. The first argument is the version info to expand. |
|
|
364 | # Query the preprocessor to improve compatibility across different |
|
|
365 | # compilers rather than maintaining a --version flag matrix. #335943 |
|
|
366 | _gcc_fullversion() { |
|
|
367 | local ver="$1"; shift |
|
|
368 | set -- `$(tc-getCPP "$@") -E -P - <<<"__GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__"` |
|
|
369 | eval echo "$ver" |
|
|
370 | } |
|
|
371 | |
285 | # @FUNCTION: gcc-fullversion |
372 | # @FUNCTION: gcc-fullversion |
286 | # @RETURN: compiler version (major.minor.micro: [3.4.6]) |
373 | # @RETURN: compiler version (major.minor.micro: [3.4.6]) |
287 | gcc-fullversion() { |
374 | gcc-fullversion() { |
288 | $(tc-getCC "$@") -dumpversion |
375 | _gcc_fullversion '$1.$2.$3' "$@" |
289 | } |
376 | } |
290 | # @FUNCTION: gcc-version |
377 | # @FUNCTION: gcc-version |
291 | # @RETURN: compiler version (major.minor: [3.4].6) |
378 | # @RETURN: compiler version (major.minor: [3.4].6) |
292 | gcc-version() { |
379 | gcc-version() { |
293 | gcc-fullversion "$@" | cut -f1,2 -d. |
380 | _gcc_fullversion '$1.$2' "$@" |
294 | } |
381 | } |
295 | # @FUNCTION: gcc-major-version |
382 | # @FUNCTION: gcc-major-version |
296 | # @RETURN: major compiler version (major: [3].4.6) |
383 | # @RETURN: major compiler version (major: [3].4.6) |
297 | gcc-major-version() { |
384 | gcc-major-version() { |
298 | gcc-version "$@" | cut -f1 -d. |
385 | _gcc_fullversion '$1' "$@" |
299 | } |
386 | } |
300 | # @FUNCTION: gcc-minor-version |
387 | # @FUNCTION: gcc-minor-version |
301 | # @RETURN: minor compiler version (minor: 3.[4].6) |
388 | # @RETURN: minor compiler version (minor: 3.[4].6) |
302 | gcc-minor-version() { |
389 | gcc-minor-version() { |
303 | gcc-version "$@" | cut -f2 -d. |
390 | _gcc_fullversion '$2' "$@" |
304 | } |
391 | } |
305 | # @FUNCTION: gcc-micro-version |
392 | # @FUNCTION: gcc-micro-version |
306 | # @RETURN: micro compiler version (micro: 3.4.[6]) |
393 | # @RETURN: micro compiler version (micro: 3.4.[6]) |
307 | gcc-micro-version() { |
394 | gcc-micro-version() { |
308 | gcc-fullversion "$@" | cut -f3 -d. | cut -f1 -d- |
395 | _gcc_fullversion '$3' "$@" |
309 | } |
396 | } |
310 | |
397 | |
311 | # Returns the installation directory - internal toolchain |
398 | # Returns the installation directory - internal toolchain |
312 | # function for use by _gcc-specs-exists (for flag-o-matic). |
399 | # function for use by _gcc-specs-exists (for flag-o-matic). |
313 | _gcc-install-dir() { |
400 | _gcc-install-dir() { |
… | |
… | |
469 | # Since we moved the lib from usr/lib into lib this reference is |
556 | # Since we moved the lib from usr/lib into lib this reference is |
470 | # wrong. Hence, we update it here. We don't configure with |
557 | # wrong. Hence, we update it here. We don't configure with |
471 | # libdir=/lib because that messes up libtool files. |
558 | # libdir=/lib because that messes up libtool files. |
472 | # Make sure we don't lose the specific version, so just modify the |
559 | # Make sure we don't lose the specific version, so just modify the |
473 | # existing install_name |
560 | # existing install_name |
|
|
561 | if [[ ! -w "${ED}/${libdir}/${tlib}" ]] ; then |
|
|
562 | chmod u+w "${ED}${libdir}/${tlib}" # needed to write to it |
|
|
563 | local nowrite=yes |
|
|
564 | fi |
474 | install_name_tool \ |
565 | install_name_tool \ |
475 | -id "${EPREFIX}"/${libdir}/${tlib} \ |
566 | -id "${EPREFIX}"/${libdir}/${tlib} \ |
476 | "${ED}"/${libdir}/${tlib} |
567 | "${ED}"/${libdir}/${tlib} || die "install_name_tool failed" |
|
|
568 | [[ -n ${nowrite} ]] && chmod u-w "${ED}${libdir}/${tlib}" |
477 | # Now as we don't use GNU binutils and our linker doesn't |
569 | # Now as we don't use GNU binutils and our linker doesn't |
478 | # understand linker scripts, just create a symlink. |
570 | # understand linker scripts, just create a symlink. |
479 | pushd "${ED}/usr/${libdir}" > /dev/null |
571 | pushd "${ED}/usr/${libdir}" > /dev/null |
480 | ln -snf "../../${libdir}/${tlib}" "${lib}" |
572 | ln -snf "../../${libdir}/${tlib}" "${lib}" |
481 | popd > /dev/null |
573 | popd > /dev/null |
482 | ;; |
574 | ;; |
483 | *-aix*|*-irix*|*-hpux*|*-interix*|*-winnt*) |
575 | *-aix*|*-irix*|*64*-hpux*|*-interix*|*-winnt*) |
484 | if ${auto} ; then |
576 | if ${auto} ; then |
485 | mv "${ED}"/usr/${libdir}/${lib}* "${ED}"/${libdir}/ || die |
577 | mv "${ED}"/usr/${libdir}/${lib}* "${ED}"/${libdir}/ || die |
486 | # no way to retrieve soname on these platforms (?) |
578 | # no way to retrieve soname on these platforms (?) |
487 | tlib=$(readlink "${ED}"/${libdir}/${lib}) |
579 | tlib=$(readlink "${ED}"/${libdir}/${lib}) |
488 | tlib=${tlib##*/} |
580 | tlib=${tlib##*/} |
… | |
… | |
512 | # command line by itself). |
604 | # command line by itself). |
513 | pushd "${ED}/usr/${libdir}" > /dev/null |
605 | pushd "${ED}/usr/${libdir}" > /dev/null |
514 | ln -snf "../../${libdir}/${tlib}" "${lib}" |
606 | ln -snf "../../${libdir}/${tlib}" "${lib}" |
515 | popd > /dev/null |
607 | popd > /dev/null |
516 | ;; |
608 | ;; |
|
|
609 | hppa*-hpux*) # PA-RISC 32bit (SOM) only, others (ELF) match *64*-hpux* above. |
|
|
610 | if ${auto} ; then |
|
|
611 | tlib=$(chatr "${ED}"/usr/${libdir}/${lib} | sed -n '/internal name:/{n;s/^ *//;p;q}') |
|
|
612 | [[ -z ${tlib} ]] && tlib=${lib} |
|
|
613 | tlib=${tlib##*/} # 'internal name' can have a path component |
|
|
614 | mv "${ED}"/usr/${libdir}/${lib}* "${ED}"/${libdir}/ || die |
|
|
615 | # some SONAMEs are funky: they encode a version before the .so |
|
|
616 | if [[ ${tlib} != ${lib}* ]] ; then |
|
|
617 | mv "${ED}"/usr/${libdir}/${tlib}* "${ED}"/${libdir}/ || die |
|
|
618 | fi |
|
|
619 | [[ ${tlib} != ${lib} ]] && |
|
|
620 | rm -f "${ED}"/${libdir}/${lib} |
|
|
621 | else |
|
|
622 | tlib=$(chatr "${ED}"/${libdir}/${lib} | sed -n '/internal name:/{n;s/^ *//;p;q}') |
|
|
623 | [[ -z ${tlib} ]] && tlib=${lib} |
|
|
624 | tlib=${tlib##*/} # 'internal name' can have a path component |
|
|
625 | fi |
|
|
626 | pushd "${ED}"/usr/${libdir} >/dev/null |
|
|
627 | ln -snf "../../${libdir}/${tlib}" "${lib}" |
|
|
628 | # need the internal name in usr/lib too, to be available at runtime |
|
|
629 | # when linked with /path/to/lib.sl (hardcode_direct_absolute=yes) |
|
|
630 | [[ ${tlib} != ${lib} ]] && |
|
|
631 | ln -snf "../../${libdir}/${tlib}" "${tlib}" |
|
|
632 | popd >/dev/null |
|
|
633 | ;; |
517 | *) |
634 | *) |
518 | if ${auto} ; then |
635 | if ${auto} ; then |
519 | tlib=$(scanelf -qF'%S#F' "${ED}"/usr/${libdir}/${lib}) |
636 | tlib=$(scanelf -qF'%S#F' "${ED}"/usr/${libdir}/${lib}) |
520 | [[ -z ${tlib} ]] && die "unable to read SONAME from ${lib}" |
637 | [[ -z ${tlib} ]] && die "unable to read SONAME from ${lib}" |
521 | mv "${ED}"/usr/${libdir}/${lib}* "${ED}"/${libdir}/ || die |
638 | mv "${ED}"/usr/${libdir}/${lib}* "${ED}"/${libdir}/ || die |