| 1 | # Copyright 1999-2005 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/flag-o-matic.eclass,v 1.106 2006/02/19 23:18:30 vapier Exp $ |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/flag-o-matic.eclass,v 1.115 2006/12/29 21:30:38 vapier Exp $ |
| 4 | |
4 | # |
|
|
5 | # Maintainer: base-system@gentoo.org |
| 5 | |
6 | |
| 6 | # need access to emktemp() |
7 | # need access to emktemp() |
| 7 | inherit eutils toolchain-funcs multilib |
8 | inherit eutils toolchain-funcs multilib |
| 8 | |
9 | |
| 9 | # |
10 | # |
| … | |
… | |
| 97 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -O -O0 -O1 -O2 -mcpu -march -mtune" |
98 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -O -O0 -O1 -O2 -mcpu -march -mtune" |
| 98 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -fstack-protector -fstack-protector-all" |
99 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -fstack-protector -fstack-protector-all" |
| 99 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -fbounds-checking -fno-bounds-checking" |
100 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -fbounds-checking -fno-bounds-checking" |
| 100 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -fno-PIE -fno-pie -fno-unit-at-a-time" |
101 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -fno-PIE -fno-pie -fno-unit-at-a-time" |
| 101 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -g -g0 -g1 -g2 -g3 -ggdb -ggdb0 -ggdb1 -ggdb2 -ggdb3" |
102 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -g -g0 -g1 -g2 -g3 -ggdb -ggdb0 -ggdb1 -ggdb2 -ggdb3" |
|
|
103 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -fno-ident" |
| 102 | fi |
104 | fi |
| 103 | # allow a bunch of flags that negate features / control ABI |
105 | # allow a bunch of flags that negate features / control ABI |
| 104 | ALLOWED_FLAGS="${ALLOWED_FLAGS} -fno-stack-protector -fno-stack-protector-all" |
106 | ALLOWED_FLAGS="${ALLOWED_FLAGS} -fno-stack-protector -fno-stack-protector-all" |
| 105 | ALLOWED_FLAGS="${ALLOWED_FLAGS} -mregparm -mno-app-regs -mapp-regs \ |
107 | ALLOWED_FLAGS="${ALLOWED_FLAGS} -mregparm -mno-app-regs -mapp-regs \ |
| 106 | -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-3dnow \ |
108 | -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-3dnow \ |
| 107 | -mips1 -mips2 -mips3 -mips4 -mips32 -mips64 -mips16 \ |
109 | -mips1 -mips2 -mips3 -mips4 -mips32 -mips64 -mips16 \ |
| 108 | -msoft-float -mno-soft-float -mhard-float -mno-hard-float -mfpu \ |
110 | -msoft-float -mno-soft-float -mhard-float -mno-hard-float -mfpu \ |
| 109 | -mieee -mieee-with-inexact \ |
111 | -mieee -mieee-with-inexact -mschedule \ |
| 110 | -mtls-direct-seg-refs -mno-tls-direct-seg-refs \ |
112 | -mtls-direct-seg-refs -mno-tls-direct-seg-refs \ |
| 111 | -mflat -mno-flat -mno-faster-structs -mfaster-structs \ |
113 | -mflat -mno-flat -mno-faster-structs -mfaster-structs \ |
| 112 | -m32 -m64 -mabi -mlittle-endian -mbig-endian -EL -EB -fPIC \ |
114 | -m32 -m64 -mabi -mlittle-endian -mbig-endian -EL -EB -fPIC \ |
| 113 | -mlive-g0 -mcmodel -mstack-bias -mno-stack-bias" |
115 | -mlive-g0 -mcmodel -mstack-bias -mno-stack-bias \ |
|
|
116 | -msecure-plt -D*" |
| 114 | |
117 | |
| 115 | # C[XX]FLAGS that we are think is ok, but needs testing |
118 | # C[XX]FLAGS that we are think is ok, but needs testing |
| 116 | # NOTE: currently -Os have issues with gcc3 and K6* arch's |
119 | # NOTE: currently -Os have issues with gcc3 and K6* arch's |
| 117 | export UNSTABLE_FLAGS="-Os -O3 -freorder-blocks" |
120 | export UNSTABLE_FLAGS="-Os -O3 -freorder-blocks" |
| 118 | return 0 |
121 | return 0 |
| … | |
… | |
| 210 | |
213 | |
| 211 | replace-cpu-flags() { |
214 | replace-cpu-flags() { |
| 212 | local newcpu="$#" ; newcpu="${!newcpu}" |
215 | local newcpu="$#" ; newcpu="${!newcpu}" |
| 213 | while [ $# -gt 1 ] ; do |
216 | while [ $# -gt 1 ] ; do |
| 214 | # quote to make sure that no globbing is done (particularly on |
217 | # quote to make sure that no globbing is done (particularly on |
| 215 | # ${oldcpu} prior to calling replace-flags |
218 | # ${oldcpu}) prior to calling replace-flags |
| 216 | replace-flags "-march=${1}" "-march=${newcpu}" |
219 | replace-flags "-march=${1}" "-march=${newcpu}" |
| 217 | replace-flags "-mcpu=${1}" "-mcpu=${newcpu}" |
220 | replace-flags "-mcpu=${1}" "-mcpu=${newcpu}" |
| 218 | replace-flags "-mtune=${1}" "-mtune=${newcpu}" |
221 | replace-flags "-mtune=${1}" "-mtune=${newcpu}" |
| 219 | shift |
222 | shift |
| 220 | done |
223 | done |
| 221 | return 0 |
224 | return 0 |
| 222 | } |
225 | } |
| 223 | |
226 | |
|
|
227 | _is_flagq() { |
|
|
228 | local x |
|
|
229 | for x in ${!1} ; do |
|
|
230 | [[ ${x} == $2 ]] && return 0 |
|
|
231 | done |
|
|
232 | return 1 |
|
|
233 | } |
|
|
234 | |
| 224 | is-flagq() { |
235 | is-flagq() { |
| 225 | local x |
236 | [[ -n $2 ]] && die "Usage: is-flag <flag>" |
| 226 | |
237 | _is_flagq CFLAGS $1 || _is_flagq CXXFLAGS $1 |
| 227 | for x in ${CFLAGS} ${CXXFLAGS} ; do |
|
|
| 228 | # Note this should work with globs like -mcpu=ultrasparc* |
|
|
| 229 | if [[ ${x} == ${1} ]]; then |
|
|
| 230 | return 0 |
|
|
| 231 | fi |
|
|
| 232 | done |
|
|
| 233 | return 1 |
|
|
| 234 | } |
238 | } |
| 235 | |
239 | |
| 236 | is-flag() { |
240 | is-flag() { |
| 237 | if is-flagq ${1}; then |
241 | is-flagq "$@" && echo true |
| 238 | echo true |
|
|
| 239 | return 0 |
|
|
| 240 | fi |
|
|
| 241 | return 1 |
|
|
| 242 | } |
242 | } |
| 243 | |
243 | |
| 244 | is-ldflagq() { |
244 | is-ldflagq() { |
| 245 | local x |
245 | [[ -n $2 ]] && die "Usage: is-ldflag <flag>" |
| 246 | |
246 | _is_flagq LDFLAGS $1 |
| 247 | for x in ${LDFLAGS} ; do |
|
|
| 248 | # Note this should work with globs like -mcpu=ultrasparc* |
|
|
| 249 | if [[ ${x} == ${1} ]]; then |
|
|
| 250 | return 0 |
|
|
| 251 | fi |
|
|
| 252 | done |
|
|
| 253 | return 1 |
|
|
| 254 | } |
247 | } |
| 255 | |
248 | |
| 256 | is-ldflag() { |
249 | is-ldflag() { |
| 257 | if is-ldflagq ${1}; then |
250 | is-ldflagq "$@" && echo true |
| 258 | echo true |
|
|
| 259 | return 0 |
|
|
| 260 | fi |
|
|
| 261 | return 1 |
|
|
| 262 | } |
251 | } |
| 263 | |
252 | |
| 264 | filter-mfpmath() { |
253 | filter-mfpmath() { |
| 265 | local orig_mfpmath new_math prune_math |
254 | local orig_mfpmath new_math prune_math |
| 266 | |
255 | |
| 267 | # save the original -mfpmath flag |
256 | # save the original -mfpmath flag |
| 268 | orig_mfpmath="`get-flag -mfpmath`" |
257 | orig_mfpmath=$(get-flag -mfpmath) |
| 269 | # get the value of the current -mfpmath flag |
258 | # get the value of the current -mfpmath flag |
| 270 | new_math=" `get-flag mfpmath | tr , ' '` " |
259 | new_math=$(get-flag mfpmath) |
|
|
260 | new_math=" ${new_math//,/ } " |
| 271 | # figure out which math values are to be removed |
261 | # figure out which math values are to be removed |
| 272 | prune_math="" |
262 | prune_math="" |
| 273 | for prune_math in "$@" ; do |
263 | for prune_math in "$@" ; do |
| 274 | new_math="${new_math/ ${prune_math} / }" |
264 | new_math=${new_math/ ${prune_math} / } |
| 275 | done |
265 | done |
| 276 | new_math="`echo ${new_math:1:${#new_math}-2} | tr ' ' ,`" |
266 | new_math=$(echo ${new_math}) |
|
|
267 | new_math=${new_math// /,} |
| 277 | |
268 | |
| 278 | if [ -z "${new_math}" ] ; then |
269 | if [[ -z ${new_math} ]] ; then |
| 279 | # if we're removing all user specified math values are |
270 | # if we're removing all user specified math values are |
| 280 | # slated for removal, then we just filter the flag |
271 | # slated for removal, then we just filter the flag |
| 281 | filter-flags ${orig_mfpmath} |
272 | filter-flags ${orig_mfpmath} |
| 282 | else |
273 | else |
| 283 | # if we only want to filter some of the user specified |
274 | # if we only want to filter some of the user specified |
| … | |
… | |
| 360 | local flags |
351 | local flags |
| 361 | local x |
352 | local x |
| 362 | |
353 | |
| 363 | shift |
354 | shift |
| 364 | |
355 | |
| 365 | [[ -z ${comp} ]] && \ |
356 | [[ -z ${comp} ]] && return 1 |
| 366 | return 1 |
|
|
| 367 | |
357 | |
|
|
358 | x="" |
| 368 | for x in "$@" ; do |
359 | for x in "$@" ; do |
| 369 | test-flag-${comp} "${x}" && flags="${flags} ${x}" |
360 | test-flag-${comp} "${x}" && flags="${flags}${flags:+ }${x}" |
| 370 | done |
361 | done |
| 371 | |
362 | |
| 372 | echo "${flags}" |
363 | echo "${flags}" |
| 373 | |
364 | |
| 374 | # Just bail if we dont have any flags |
365 | # Just bail if we dont have any flags |
| … | |
… | |
| 399 | return 1 |
390 | return 1 |
| 400 | fi |
391 | fi |
| 401 | } |
392 | } |
| 402 | |
393 | |
| 403 | strip-unsupported-flags() { |
394 | strip-unsupported-flags() { |
| 404 | local x NEW_CFLAGS NEW_CXXFLAGS |
395 | export CFLAGS=$(test-flags-CC ${CFLAGS}) |
| 405 | |
396 | export CXXFLAGS=$(test-flags-CXX ${CXXFLAGS}) |
| 406 | for x in ${CFLAGS} ; do |
|
|
| 407 | NEW_CFLAGS="${NEW_CFLAGS} $(test-flags ${x})" |
|
|
| 408 | done |
|
|
| 409 | for x in ${CXXFLAGS} ; do |
|
|
| 410 | NEW_CXXFLAGS="${NEW_CXXFLAGS} $(test-flags ${x})" |
|
|
| 411 | done |
|
|
| 412 | |
|
|
| 413 | export CFLAGS=${NEW_CFLAGS} |
|
|
| 414 | export CXXFLAGS=${NEW_CXXFLAGS} |
|
|
| 415 | } |
397 | } |
| 416 | |
398 | |
| 417 | get-flag() { |
399 | get-flag() { |
| 418 | local f findflag="$1" |
400 | local f findflag="$1" |
| 419 | |
401 | |
| … | |
… | |
| 522 | if [ "${CFLAGS/mtune}" != "${CFLAGS}" ]; then |
504 | if [ "${CFLAGS/mtune}" != "${CFLAGS}" ]; then |
| 523 | for x in ${SPARC64_CPUS}; do |
505 | for x in ${SPARC64_CPUS}; do |
| 524 | CFLAGS="${CFLAGS/-mcpu=${x}/-mcpu=v8}" |
506 | CFLAGS="${CFLAGS/-mcpu=${x}/-mcpu=v8}" |
| 525 | done |
507 | done |
| 526 | else |
508 | else |
| 527 | for x in ${SPARC64_CPUS}; do |
509 | for x in ${SPARC64_CPUS}; do |
| 528 | CFLAGS="${CFLAGS/-mcpu=${x}/-mcpu=v8 -mtune=${x}}" |
510 | CFLAGS="${CFLAGS/-mcpu=${x}/-mcpu=v8 -mtune=${x}}" |
| 529 | done |
511 | done |
| 530 | fi |
512 | fi |
| 531 | |
513 | |
| 532 | if [ "${CXXFLAGS/mtune}" != "${CXXFLAGS}" ]; then |
514 | if [ "${CXXFLAGS/mtune}" != "${CXXFLAGS}" ]; then |
| 533 | for x in ${SPARC64_CPUS}; do |
515 | for x in ${SPARC64_CPUS}; do |
| 534 | CXXFLAGS="${CXXFLAGS/-mcpu=${x}/-mcpu=v8}" |
516 | CXXFLAGS="${CXXFLAGS/-mcpu=${x}/-mcpu=v8}" |
| 535 | done |
517 | done |
| 536 | else |
518 | else |
| 537 | for x in ${SPARC64_CPUS}; do |
519 | for x in ${SPARC64_CPUS}; do |
| 538 | CXXFLAGS="${CXXFLAGS/-mcpu=${x}/-mcpu=v8 -mtune=${x}}" |
520 | CXXFLAGS="${CXXFLAGS/-mcpu=${x}/-mcpu=v8 -mtune=${x}}" |
| 539 | done |
521 | done |
| 540 | fi |
522 | fi |
| 541 | |
523 | |
| 542 | export CFLAGS CXXFLAGS |
524 | export CFLAGS CXXFLAGS |
| … | |
… | |
| 565 | for x in ${input} ; do |
547 | for x in ${input} ; do |
| 566 | x=${x#-Wl,} |
548 | x=${x#-Wl,} |
| 567 | set -- "$@" ${x//,/ } |
549 | set -- "$@" ${x//,/ } |
| 568 | done |
550 | done |
| 569 | echo "$@" |
551 | echo "$@" |
| 570 | } |
|
|
| 571 | |
|
|
| 572 | # This is thanks to great work from Paul de Vrieze <gentoo-user@devrieze.net>, |
|
|
| 573 | # bug #9016. Also thanks to Jukka Salmi <salmi@gmx.net> (bug #13907) for more |
|
|
| 574 | # fixes. |
|
|
| 575 | # |
|
|
| 576 | # Export CFLAGS and CXXFLAGS that are compadible with gcc-2.95.3 |
|
|
| 577 | gcc2-flags() { |
|
|
| 578 | if [[ $(tc-arch) == "x86" || $(tc-arch) == "amd64" ]] ; then |
|
|
| 579 | CFLAGS=${CFLAGS//-mtune=/-mcpu=} |
|
|
| 580 | CXXFLAGS=${CXXFLAGS//-mtune=/-mcpu=} |
|
|
| 581 | fi |
|
|
| 582 | |
|
|
| 583 | replace-cpu-flags k6-{2,3} k6 |
|
|
| 584 | replace-cpu-flags athlon{,-{tbird,4,xp,mp}} i686 |
|
|
| 585 | |
|
|
| 586 | replace-cpu-flags pentium-mmx i586 |
|
|
| 587 | replace-cpu-flags pentium{2,3,4} i686 |
|
|
| 588 | |
|
|
| 589 | replace-cpu-flags ev6{7,8} ev6 |
|
|
| 590 | |
|
|
| 591 | export CFLAGS CXXFLAGS |
|
|
| 592 | } |
552 | } |
| 593 | |
553 | |
| 594 | # Gets the flags needed for "NOW" binding |
554 | # Gets the flags needed for "NOW" binding |
| 595 | bindnow-flags() { |
555 | bindnow-flags() { |
| 596 | case $($(tc-getLD) -v 2>&1 </dev/null) in |
556 | case $($(tc-getLD) -v 2>&1 </dev/null) in |
| … | |
… | |
| 605 | echo "-Wl,-z,now" ;; |
565 | echo "-Wl,-z,now" ;; |
| 606 | esac |
566 | esac |
| 607 | ;; |
567 | ;; |
| 608 | esac |
568 | esac |
| 609 | } |
569 | } |
|
|
570 | |
|
|
571 | |
|
|
572 | # Some tests for when we screw with things and want to make |
|
|
573 | # sure we didn't break anything |
|
|
574 | #TESTS() { |
|
|
575 | # CFLAGS="-a -b -c=1" |
|
|
576 | # CXXFLAGS="-x -y -z=2" |
|
|
577 | # LDFLAGS="-l -m -n=3" |
|
|
578 | # |
|
|
579 | # die() { exit 1; } |
|
|
580 | # (is-flag 1 2 3) && die |
|
|
581 | # (is-ldflag 1 2 3) && die |
|
|
582 | # |
|
|
583 | # is-flagq -l && die |
|
|
584 | # is-ldflagq -a && die |
|
|
585 | # is-flagq -a || die |
|
|
586 | # is-flagq -x || die |
|
|
587 | # is-ldflagq -n=* || die |
|
|
588 | # is-ldflagq -n && die |
|
|
589 | # |
|
|
590 | # strip-unsupported-flags |
|
|
591 | # [[ ${CFLAGS} == "-c=1" ]] || die |
|
|
592 | # [[ ${CXXFLAGS} == "-y -z=2" ]] || die |
|
|
593 | # |
|
|
594 | # echo "All tests pass" |
|
|
595 | #} |
|
|
596 | #TESTS |