| 1 | # Copyright 1999-2008 Gentoo Foundation |
1 | # Copyright 1999-2009 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.124 2008/07/03 05:30:54 dberkholz Exp $ |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/flag-o-matic.eclass,v 1.149 2011/02/01 05:41:30 dirtyepic Exp $ |
| 4 | |
4 | |
| 5 | # @ECLASS: flag-o-matic.eclass |
5 | # @ECLASS: flag-o-matic.eclass |
| 6 | # @MAINTAINER: |
6 | # @MAINTAINER: |
| 7 | # toolchain@gentoo.org |
7 | # toolchain@gentoo.org |
| 8 | # @BLURB: common functions to manipulate and query toolchain flags |
8 | # @BLURB: common functions to manipulate and query toolchain flags |
| … | |
… | |
| 31 | setup-allowed-flags() { |
31 | setup-allowed-flags() { |
| 32 | if [[ -z ${ALLOWED_FLAGS} ]] ; then |
32 | if [[ -z ${ALLOWED_FLAGS} ]] ; then |
| 33 | export ALLOWED_FLAGS="-pipe" |
33 | export ALLOWED_FLAGS="-pipe" |
| 34 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -O -O0 -O1 -O2 -mcpu -march -mtune" |
34 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -O -O0 -O1 -O2 -mcpu -march -mtune" |
| 35 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -fstack-protector -fstack-protector-all" |
35 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -fstack-protector -fstack-protector-all" |
| 36 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -fbounds-checking" |
36 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -fbounds-checking -fno-strict-overflow" |
| 37 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -fno-PIE -fno-pie -fno-unit-at-a-time" |
37 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -fno-PIE -fno-pie -fno-unit-at-a-time" |
| 38 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -g -g[0-9] -ggdb -ggdb[0-9] -gstabs -gstabs+" |
38 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -g -g[0-9] -ggdb -ggdb[0-9] -gstabs -gstabs+" |
| 39 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -fno-ident" |
39 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -fno-ident" |
| 40 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -W* -w" |
40 | export ALLOWED_FLAGS="${ALLOWED_FLAGS} -W* -w" |
| 41 | fi |
41 | fi |
| 42 | # allow a bunch of flags that negate features / control ABI |
42 | # allow a bunch of flags that negate features / control ABI |
| 43 | ALLOWED_FLAGS="${ALLOWED_FLAGS} -fno-stack-protector -fno-stack-protector-all \ |
43 | ALLOWED_FLAGS="${ALLOWED_FLAGS} -fno-stack-protector -fno-stack-protector-all \ |
| 44 | -fno-strict-aliasing -fno-bounds-checking" |
44 | -fno-strict-aliasing -fno-bounds-checking -fstrict-overflow -fno-omit-frame-pointer" |
| 45 | ALLOWED_FLAGS="${ALLOWED_FLAGS} -mregparm -mno-app-regs -mapp-regs \ |
45 | ALLOWED_FLAGS="${ALLOWED_FLAGS} -mregparm -mno-app-regs -mapp-regs \ |
| 46 | -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-3dnow \ |
46 | -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-ssse3 -mno-sse4 -mno-sse4.1 \ |
|
|
47 | -mno-sse4.2 -mno-avx -mno-aes -mno-pclmul -mno-sse4a -mno-3dnow \ |
|
|
48 | -mno-popcnt -mno-abm \ |
| 47 | -mips1 -mips2 -mips3 -mips4 -mips32 -mips64 -mips16 \ |
49 | -mips1 -mips2 -mips3 -mips4 -mips32 -mips64 -mips16 -mplt \ |
| 48 | -msoft-float -mno-soft-float -mhard-float -mno-hard-float -mfpu \ |
50 | -msoft-float -mno-soft-float -mhard-float -mno-hard-float -mfpu \ |
| 49 | -mieee -mieee-with-inexact -mschedule \ |
51 | -mieee -mieee-with-inexact -mschedule -mfloat-gprs -mspe -mno-spe \ |
| 50 | -mtls-direct-seg-refs -mno-tls-direct-seg-refs \ |
52 | -mtls-direct-seg-refs -mno-tls-direct-seg-refs \ |
| 51 | -mflat -mno-flat -mno-faster-structs -mfaster-structs \ |
53 | -mflat -mno-flat -mno-faster-structs -mfaster-structs \ |
| 52 | -m32 -m64 -mabi -mlittle-endian -mbig-endian -EL -EB -fPIC \ |
54 | -m32 -m64 -mabi -mlittle-endian -mbig-endian -EL -EB -fPIC \ |
| 53 | -mlive-g0 -mcmodel -mstack-bias -mno-stack-bias \ |
55 | -mlive-g0 -mcmodel -mstack-bias -mno-stack-bias \ |
| 54 | -msecure-plt -D*" |
56 | -msecure-plt -m*-toc -D* -U*" |
|
|
57 | |
|
|
58 | # 4.5 |
|
|
59 | ALLOWED_FLAGS="${ALLOWED_FLAGS} -mno-fma4 -mno-movbe -mno-xop -mno-lwp" |
|
|
60 | # 4.6 |
|
|
61 | ALLOWED_FLAGS="${ALLOWED_FLAGS} -mno-fsgsbase -mno-rdrnd -mno-f16c \ |
|
|
62 | -mno-bmi -mno-tbm" |
| 55 | |
63 | |
| 56 | # {C,CXX,F,FC}FLAGS that we are think is ok, but needs testing |
64 | # {C,CXX,F,FC}FLAGS that we are think is ok, but needs testing |
| 57 | # NOTE: currently -Os have issues with gcc3 and K6* arch's |
65 | # NOTE: currently -Os have issues with gcc3 and K6* arch's |
| 58 | export UNSTABLE_FLAGS="-Os -O3 -freorder-blocks" |
66 | export UNSTABLE_FLAGS="-Os -O3 -freorder-blocks" |
| 59 | return 0 |
67 | return 0 |
| … | |
… | |
| 71 | -fPIC|-fpic|-fPIE|-fpie|-Wl,pie|-pie) |
79 | -fPIC|-fpic|-fPIE|-fpie|-Wl,pie|-pie) |
| 72 | gcc-specs-pie || continue |
80 | gcc-specs-pie || continue |
| 73 | is-flagq -nopie || append-flags -nopie;; |
81 | is-flagq -nopie || append-flags -nopie;; |
| 74 | -fstack-protector) |
82 | -fstack-protector) |
| 75 | gcc-specs-ssp || continue |
83 | gcc-specs-ssp || continue |
| 76 | is-flagq -fno-stack-protector || append-flags -fno-stack-protector;; |
84 | is-flagq -fno-stack-protector || append-flags $(test-flags -fno-stack-protector);; |
| 77 | -fstack-protector-all) |
85 | -fstack-protector-all) |
| 78 | gcc-specs-ssp-to-all || continue |
86 | gcc-specs-ssp-to-all || continue |
| 79 | is-flagq -fno-stack-protector-all || append-flags -fno-stack-protector-all;; |
87 | is-flagq -fno-stack-protector-all || append-flags $(test-flags -fno-stack-protector-all);; |
|
|
88 | -fno-strict-overflow) |
|
|
89 | gcc-specs-nostrict || continue |
|
|
90 | is-flagq -fstrict-overflow || append-flags $(test-flags -fstrict-overflow);; |
| 80 | esac |
91 | esac |
| 81 | done |
92 | done |
| 82 | } |
93 | } |
| 83 | |
94 | |
| 84 | # Remove occurrences of strings from variable given in $1 |
95 | # Remove occurrences of strings from variable given in $1 |
| … | |
… | |
| 131 | [[ -z $* ]] && return 0 |
142 | [[ -z $* ]] && return 0 |
| 132 | export CPPFLAGS="${CPPFLAGS} $*" |
143 | export CPPFLAGS="${CPPFLAGS} $*" |
| 133 | return 0 |
144 | return 0 |
| 134 | } |
145 | } |
| 135 | |
146 | |
|
|
147 | # @FUNCTION: append-cflags |
|
|
148 | # @USAGE: <flags> |
|
|
149 | # @DESCRIPTION: |
|
|
150 | # Add extra <flags> to the current CFLAGS. |
|
|
151 | append-cflags() { |
|
|
152 | [[ -z $* ]] && return 0 |
|
|
153 | export CFLAGS="${CFLAGS} $*" |
|
|
154 | return 0 |
|
|
155 | } |
|
|
156 | |
|
|
157 | # @FUNCTION: append-cxxflags |
|
|
158 | # @USAGE: <flags> |
|
|
159 | # @DESCRIPTION: |
|
|
160 | # Add extra <flags> to the current CXXFLAGS. |
|
|
161 | append-cxxflags() { |
|
|
162 | [[ -z $* ]] && return 0 |
|
|
163 | export CXXFLAGS="${CXXFLAGS} $*" |
|
|
164 | return 0 |
|
|
165 | } |
|
|
166 | |
| 136 | # @FUNCTION: append-fflags |
167 | # @FUNCTION: append-fflags |
| 137 | # @USAGE: <flags> |
168 | # @USAGE: <flags> |
| 138 | # @DESCRIPTION: |
169 | # @DESCRIPTION: |
| 139 | # Add extra <flags> to the current {F,FC}FLAGS. |
170 | # Add extra <flags> to the current {F,FC}FLAGS. |
| 140 | append-fflags() { |
171 | append-fflags() { |
| … | |
… | |
| 156 | # @USAGE: <flags> |
187 | # @USAGE: <flags> |
| 157 | # @DESCRIPTION: |
188 | # @DESCRIPTION: |
| 158 | # Add extra <flags> to your current {C,CXX,F,FC}FLAGS. |
189 | # Add extra <flags> to your current {C,CXX,F,FC}FLAGS. |
| 159 | append-flags() { |
190 | append-flags() { |
| 160 | [[ -z $* ]] && return 0 |
191 | [[ -z $* ]] && return 0 |
| 161 | export CFLAGS="${CFLAGS} $*" |
192 | append-cflags "$@" |
| 162 | export CXXFLAGS="${CXXFLAGS} $*" |
193 | append-cxxflags "$@" |
| 163 | export FFLAGS="${FFLAGS} $*" |
194 | append-fflags "$@" |
| 164 | export FCFLAGS="${FCFLAGS} $*" |
|
|
| 165 | return 0 |
195 | return 0 |
| 166 | } |
196 | } |
| 167 | |
197 | |
| 168 | # @FUNCTION: replace-flags |
198 | # @FUNCTION: replace-flags |
| 169 | # @USAGE: <old> <new> |
199 | # @USAGE: <old> <new> |
| … | |
… | |
| 173 | [[ $# != 2 ]] \ |
203 | [[ $# != 2 ]] \ |
| 174 | && echo && eerror "Usage: replace-flags <old flag> <new flag>" \ |
204 | && echo && eerror "Usage: replace-flags <old flag> <new flag>" \ |
| 175 | && die "replace-flags takes 2 arguments, not $#" |
205 | && die "replace-flags takes 2 arguments, not $#" |
| 176 | |
206 | |
| 177 | local f fset |
207 | local f fset |
| 178 | declare -a new_CFLAGS new_CXXFLAGS |
208 | declare -a new_CFLAGS new_CXXFLAGS new_FFLAGS new_FCFLAGS |
| 179 | |
209 | |
| 180 | for fset in CFLAGS CXXFLAGS FFLAGS FCFLAGS; do |
210 | for fset in CFLAGS CXXFLAGS FFLAGS FCFLAGS; do |
| 181 | # Looping over the flags instead of using a global |
211 | # Looping over the flags instead of using a global |
| 182 | # substitution ensures that we're working with flag atoms. |
212 | # substitution ensures that we're working with flag atoms. |
| 183 | # Otherwise globs like -O* have the potential to wipe out the |
213 | # Otherwise globs like -O* have the potential to wipe out the |
| … | |
… | |
| 299 | local NEW_CXXFLAGS="" |
329 | local NEW_CXXFLAGS="" |
| 300 | local NEW_FFLAGS="" |
330 | local NEW_FFLAGS="" |
| 301 | local NEW_FCFLAGS="" |
331 | local NEW_FCFLAGS="" |
| 302 | |
332 | |
| 303 | # Allow unstable C[XX]FLAGS if we are using unstable profile ... |
333 | # Allow unstable C[XX]FLAGS if we are using unstable profile ... |
| 304 | if has ~$(tc-arch) ${ACCEPT_KEYWORDS} ; then |
334 | if has "~$(tc-arch)" ${ACCEPT_KEYWORDS} ; then |
| 305 | ALLOWED_FLAGS="${ALLOWED_FLAGS} ${UNSTABLE_FLAGS}" |
335 | ALLOWED_FLAGS="${ALLOWED_FLAGS} ${UNSTABLE_FLAGS}" |
| 306 | fi |
336 | fi |
| 307 | |
337 | |
| 308 | set -f # disable pathname expansion |
338 | set -f # disable pathname expansion |
| 309 | |
339 | |
| … | |
… | |
| 553 | ewarn "has_ssp_all: deprecated, please use gcc-specs-ssp()!" >&2 |
583 | ewarn "has_ssp_all: deprecated, please use gcc-specs-ssp()!" >&2 |
| 554 | |
584 | |
| 555 | # note; this matches only -fstack-protector-all |
585 | # note; this matches only -fstack-protector-all |
| 556 | [[ ${CFLAGS/-fstack-protector-all} != ${CFLAGS} || \ |
586 | [[ ${CFLAGS/-fstack-protector-all} != ${CFLAGS} || \ |
| 557 | -n $(echo | $(tc-getCC) ${CFLAGS} -E -dM - | grep __SSP_ALL__) ]] || \ |
587 | -n $(echo | $(tc-getCC) ${CFLAGS} -E -dM - | grep __SSP_ALL__) ]] || \ |
| 558 | gcc-specs-ssp-all |
588 | gcc-specs-ssp-to-all |
| 559 | } |
589 | } |
| 560 | |
590 | |
| 561 | # @FUNCTION: has_ssp |
591 | # @FUNCTION: has_ssp |
| 562 | # @DESCRIPTION: |
592 | # @DESCRIPTION: |
| 563 | # DEPRECATED - use gcc-specs-ssp from toolchain-funcs |
593 | # DEPRECATED - use gcc-specs-ssp from toolchain-funcs |
| … | |
… | |
| 640 | CXXFLAGS="${CXXFLAGS/-mcpu=${x}/-mcpu=v8 -mtune=${x}}" |
670 | CXXFLAGS="${CXXFLAGS/-mcpu=${x}/-mcpu=v8 -mtune=${x}}" |
| 641 | done |
671 | done |
| 642 | fi |
672 | fi |
| 643 | |
673 | |
| 644 | export CFLAGS CXXFLAGS |
674 | export CFLAGS CXXFLAGS |
|
|
675 | } |
|
|
676 | |
|
|
677 | # @FUNCTION: append-libs |
|
|
678 | # @USAGE: <libs> |
|
|
679 | # @DESCRIPTION: |
|
|
680 | # Add extra <libs> to the current LIBS. |
|
|
681 | append-libs() { |
|
|
682 | [[ -z $* ]] && return 0 |
|
|
683 | local flag |
|
|
684 | for flag in "$@"; do |
|
|
685 | [[ ${flag} == -l* ]] && flag=${flag#-l} |
|
|
686 | export LIBS="${LIBS} -l${flag}" |
|
|
687 | done |
|
|
688 | |
|
|
689 | return 0 |
| 645 | } |
690 | } |
| 646 | |
691 | |
| 647 | # @FUNCTION: append-ldflags |
692 | # @FUNCTION: append-ldflags |
| 648 | # @USAGE: <flags> |
693 | # @USAGE: <flags> |
| 649 | # @DESCRIPTION: |
694 | # @DESCRIPTION: |
| … | |
… | |
| 684 | set -- "$@" ${x//,/ } |
729 | set -- "$@" ${x//,/ } |
| 685 | done |
730 | done |
| 686 | echo "$@" |
731 | echo "$@" |
| 687 | } |
732 | } |
| 688 | |
733 | |
| 689 | # @FUNCTION: bindnow-flags |
734 | # @FUNCTION: no-as-needed |
| 690 | # @RETURN: Returns the flags to enable "now" binding in the current selected linker. |
735 | # @RETURN: Flag to disable asneeded behavior for use with append-ldflags. |
| 691 | # @DESCRIPTION: |
736 | no-as-needed() { |
| 692 | # DEPRECATED - Gets the flags needed for "NOW" binding |
|
|
| 693 | bindnow-flags() { |
|
|
| 694 | ewarn "QA: stop using the bindnow-flags function ... simply drop it from your ebuild" >&2 |
|
|
| 695 | |
|
|
| 696 | case $($(tc-getLD) -v 2>&1 </dev/null) in |
737 | case $($(tc-getLD) -v 2>&1 </dev/null) in |
| 697 | *GNU* | *'with BFD'*) # GNU ld |
738 | *GNU*) # GNU ld |
| 698 | echo "-Wl,-z,now" ;; |
739 | echo "-Wl,--no-as-needed" ;; |
| 699 | *Apple*) # Darwin ld |
|
|
| 700 | echo "-bind_at_load" ;; |
|
|
| 701 | *) |
|
|
| 702 | # Some linkers just recognize -V instead of -v |
|
|
| 703 | case $($(tc-getLD) -V 2>&1 </dev/null) in |
|
|
| 704 | *Solaris*) # Solaris accept almost the same GNU options |
|
|
| 705 | echo "-Wl,-z,now" ;; |
|
|
| 706 | esac |
|
|
| 707 | ;; |
|
|
| 708 | esac |
740 | esac |
| 709 | } |
741 | } |
| 710 | |
|
|
| 711 | |
742 | |
| 712 | # Some tests for when we screw with things and want to make |
743 | # Some tests for when we screw with things and want to make |
| 713 | # sure we didn't break anything |
744 | # sure we didn't break anything |
| 714 | #TESTS() { |
745 | #TESTS() { |
| 715 | # CFLAGS="-a -b -c=1" |
746 | # CFLAGS="-a -b -c=1" |