| 1 | # Copyright 1999-2006 Gentoo Foundation |
1 | # Copyright 1999-2006 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.58 2006/04/02 10:10:59 robbat2 Exp $ |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/toolchain-funcs.eclass,v 1.63 2006/12/16 10:31:12 vapier Exp $ |
| 4 | # |
4 | # |
| 5 | # Author: Toolchain Ninjas <toolchain@gentoo.org> |
5 | # Author: Toolchain Ninjas <toolchain@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...) |
| … | |
… | |
| 39 | tc-getCPP() { tc-getPROG CPP cpp "$@"; } |
39 | tc-getCPP() { tc-getPROG CPP cpp "$@"; } |
| 40 | # Returns the name of the C++ compiler |
40 | # Returns the name of the C++ compiler |
| 41 | tc-getCXX() { tc-getPROG CXX g++ "$@"; } |
41 | tc-getCXX() { tc-getPROG CXX g++ "$@"; } |
| 42 | # Returns the name of the linker |
42 | # Returns the name of the linker |
| 43 | tc-getLD() { tc-getPROG LD ld "$@"; } |
43 | tc-getLD() { tc-getPROG LD ld "$@"; } |
|
|
44 | # Returns the name of the strip prog |
|
|
45 | tc-getSTRIP() { tc-getPROG STRIP strip "$@"; } |
| 44 | # Returns the name of the symbol/object thingy |
46 | # Returns the name of the symbol/object thingy |
| 45 | tc-getNM() { tc-getPROG NM nm "$@"; } |
47 | tc-getNM() { tc-getPROG NM nm "$@"; } |
| 46 | # Returns the name of the archiver indexer |
48 | # Returns the name of the archiver indexer |
| 47 | tc-getRANLIB() { tc-getPROG RANLIB ranlib "$@"; } |
49 | tc-getRANLIB() { tc-getPROG RANLIB ranlib "$@"; } |
|
|
50 | # Returns the name of the fortran 77 compiler |
|
|
51 | tc-getF77() { tc-getPROG F77 f77 "$@"; } |
|
|
52 | # Returns the name of the fortran 90 compiler |
|
|
53 | tc-getF90() { tc-getPROG F90 gfortran "$@"; } |
| 48 | # Returns the name of the fortran compiler |
54 | # Returns the name of the fortran compiler |
| 49 | tc-getF77() { tc-getPROG F77 f77 "$@"; } |
55 | tc-getFORTRAN() { tc-getPROG FORTRAN gfortran "$@"; } |
| 50 | # Returns the name of the java compiler |
56 | # Returns the name of the java compiler |
| 51 | tc-getGCJ() { tc-getPROG GCJ gcj "$@"; } |
57 | tc-getGCJ() { tc-getPROG GCJ gcj "$@"; } |
| 52 | |
58 | |
| 53 | # Returns the name of the C compiler for build |
59 | # Returns the name of the C compiler for build |
| 54 | tc-getBUILD_CC() { |
60 | tc-getBUILD_CC() { |
| … | |
… | |
| 172 | esac |
178 | esac |
| 173 | } |
179 | } |
| 174 | |
180 | |
| 175 | # Returns the version as by `$CC -dumpversion` |
181 | # Returns the version as by `$CC -dumpversion` |
| 176 | gcc-fullversion() { |
182 | gcc-fullversion() { |
| 177 | echo "$($(tc-getCC) -dumpversion)" |
183 | $(tc-getCC "$@") -dumpversion |
| 178 | } |
184 | } |
| 179 | # Returns the version, but only the <major>.<minor> |
185 | # Returns the version, but only the <major>.<minor> |
| 180 | gcc-version() { |
186 | gcc-version() { |
| 181 | echo "$(gcc-fullversion | cut -f1,2 -d.)" |
187 | gcc-fullversion "$@" | cut -f1,2 -d. |
| 182 | } |
188 | } |
| 183 | # Returns the Major version |
189 | # Returns the Major version |
| 184 | gcc-major-version() { |
190 | gcc-major-version() { |
| 185 | echo "$(gcc-version | cut -f1 -d.)" |
191 | gcc-version "$@" | cut -f1 -d. |
| 186 | } |
192 | } |
| 187 | # Returns the Minor version |
193 | # Returns the Minor version |
| 188 | gcc-minor-version() { |
194 | gcc-minor-version() { |
| 189 | echo "$(gcc-version | cut -f2 -d.)" |
195 | gcc-version "$@" | cut -f2 -d. |
| 190 | } |
196 | } |
| 191 | # Returns the Micro version |
197 | # Returns the Micro version |
| 192 | gcc-micro-version() { |
198 | gcc-micro-version() { |
| 193 | echo "$(gcc-fullversion | cut -f3 -d. | cut -f1 -d-)" |
199 | gcc-fullversion "$@" | cut -f3 -d. | cut -f1 -d- |
| 194 | } |
200 | } |
| 195 | |
201 | |
| 196 | # Returns requested gcc specs directive |
202 | # Returns requested gcc specs directive |
| 197 | # Note; later specs normally overwrite earlier ones; however if a later |
203 | # Note; later specs normally overwrite earlier ones; however if a later |
| 198 | # spec starts with '+' then it appends. |
204 | # spec starts with '+' then it appends. |
| … | |
… | |
| 239 | gcc-specs-ssp-to-all() { |
245 | gcc-specs-ssp-to-all() { |
| 240 | local directive |
246 | local directive |
| 241 | directive=$(gcc-specs-directive cc1) |
247 | directive=$(gcc-specs-directive cc1) |
| 242 | return $([[ ${directive/\{!fno-stack-protector-all:} != ${directive} ]]) |
248 | return $([[ ${directive/\{!fno-stack-protector-all:} != ${directive} ]]) |
| 243 | } |
249 | } |
|
|
250 | |
|
|
251 | |
|
|
252 | # This function generate linker scripts in /usr/lib for dynamic |
|
|
253 | # libs in /lib. This is to fix linking problems when you have |
|
|
254 | # the .so in /lib, and the .a in /usr/lib. What happens is that |
|
|
255 | # in some cases when linking dynamic, the .a in /usr/lib is used |
|
|
256 | # instead of the .so in /lib due to gcc/libtool tweaking ld's |
|
|
257 | # library search path. This cause many builds to fail. |
|
|
258 | # See bug #4411 for more info. |
|
|
259 | # |
|
|
260 | # To use, simply call: |
|
|
261 | # |
|
|
262 | # gen_usr_ldscript libfoo.so |
|
|
263 | # |
|
|
264 | # Note that you should in general use the unversioned name of |
|
|
265 | # the library, as ldconfig should usually update it correctly |
|
|
266 | # to point to the latest version of the library present. |
|
|
267 | _tc_gen_usr_ldscript() { |
|
|
268 | local lib libdir=$(get_libdir) output_format="" |
|
|
269 | # Just make sure it exists |
|
|
270 | dodir /usr/${libdir} |
|
|
271 | |
|
|
272 | # OUTPUT_FORMAT gives hints to the linker as to what binary format |
|
|
273 | # is referenced ... makes multilib saner |
|
|
274 | output_format=$($(tc-getCC) ${CFLAGS} ${LDFLAGS} -Wl,--verbose 2>&1 | sed -n 's/^OUTPUT_FORMAT("\([^"]*\)",.*/\1/p') |
|
|
275 | [[ -n ${output_format} ]] && output_format="OUTPUT_FORMAT ( ${output_format} )" |
|
|
276 | |
|
|
277 | for lib in "$@" ; do |
|
|
278 | if [[ ${USERLAND} == "Darwin" ]] ; then |
|
|
279 | ewarn "Not creating fake dynamic library for $lib on Darwin;" |
|
|
280 | ewarn "making a symlink instead." |
|
|
281 | dosym "/${libdir}/${lib}" "/usr/${libdir}/${lib}" |
|
|
282 | else |
|
|
283 | cat > "${D}/usr/${libdir}/${lib}" <<-END_LDSCRIPT |
|
|
284 | /* GNU ld script |
|
|
285 | Since Gentoo has critical dynamic libraries |
|
|
286 | in /lib, and the static versions in /usr/lib, |
|
|
287 | we need to have a "fake" dynamic lib in /usr/lib, |
|
|
288 | otherwise we run into linking problems. |
|
|
289 | |
|
|
290 | See bug http://bugs.gentoo.org/4411 for more info. |
|
|
291 | */ |
|
|
292 | ${output_format} |
|
|
293 | GROUP ( /${libdir}/${lib} ) |
|
|
294 | END_LDSCRIPT |
|
|
295 | fi |
|
|
296 | fperms a+x "/usr/${libdir}/${lib}" || die "could not change perms on ${lib}" |
|
|
297 | done |
|
|
298 | } |
|
|
299 | gen_usr_ldscript() { _tc_gen_usr_ldscript "$@" ; } |