| 1 | # Copyright 1999-2004 Gentoo Foundation |
1 | # Copyright 1999-2004 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.62 2004/07/15 04:59:44 lv Exp $ |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/flag-o-matic.eclass,v 1.66 2004/07/28 02:18:38 lv Exp $ |
| 4 | # |
4 | # |
| 5 | # Author Bart Verwilst <verwilst@gentoo.org> |
5 | # Author Bart Verwilst <verwilst@gentoo.org> |
| 6 | |
6 | |
| 7 | ECLASS=flag-o-matic |
7 | ECLASS=flag-o-matic |
| 8 | INHERITED="$INHERITED $ECLASS" |
8 | INHERITED="$INHERITED $ECLASS" |
|
|
9 | |
|
|
10 | # Please leave ${IUSE} in this until portage .51 is stable, otherwise |
|
|
11 | # IUSE gets clobbered. |
| 9 | IUSE="$IUSE debug" |
12 | IUSE="${IUSE} debug" |
| 10 | |
13 | |
| 11 | # |
14 | # |
| 12 | #### filter-flags <flags> #### |
15 | #### filter-flags <flags> #### |
| 13 | # Remove particular flags from C[XX]FLAGS |
16 | # Remove particular flags from C[XX]FLAGS |
| 14 | # Matches only complete flags |
17 | # Matches only complete flags |
| … | |
… | |
| 74 | case "${ARCH}" in |
77 | case "${ARCH}" in |
| 75 | mips) ALLOWED_FLAGS="${ALLOWED_FLAGS} -mips1 -mips2 -mips3 -mips4 -mabi" ;; |
78 | mips) ALLOWED_FLAGS="${ALLOWED_FLAGS} -mips1 -mips2 -mips3 -mips4 -mabi" ;; |
| 76 | amd64) ALLOWED_FLAGS="${ALLOWED_FLAGS} -fPIC -m64" ;; |
79 | amd64) ALLOWED_FLAGS="${ALLOWED_FLAGS} -fPIC -m64" ;; |
| 77 | x86) ALLOWED_FLAGS="${ALLOWED_FLAGS} -m32" ;; |
80 | x86) ALLOWED_FLAGS="${ALLOWED_FLAGS} -m32" ;; |
| 78 | alpha) ALLOWED_FLAGS="${ALLOWED_FLAGS} -fPIC" ;; |
81 | alpha) ALLOWED_FLAGS="${ALLOWED_FLAGS} -fPIC" ;; |
| 79 | ia64) ALLOWED_FLAGS="${ALLOWED_FLAGS} -fPIC" ;; |
82 | ia64) ALLOWED_FLAGS="${ALLOWED_FLAGS} -fPIC" ;; |
| 80 | esac |
83 | esac |
| 81 | fi |
84 | fi |
|
|
85 | # allow a bunch of flags that negate features / control ABI |
|
|
86 | ALLOWED_FLAGS="${ALLOWED_FLAGS} -fno-stack-protector -fno-stack-protector-all" |
|
|
87 | case "${ARCH}" in |
|
|
88 | x86|amd64|ia64) ALLOWED_FLAGS="${ALLOWED_FLAGS} -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-3dnow" ;; |
|
|
89 | esac |
|
|
90 | ALLOWED_FLAGS="${ALLOWED_FLAGS} -mregparm -mno-app-regs -mapp-regs -msoft-float -mflat -mno-faster-structs -mfaster-structs -mlittle-endian -mbig-endian -mlive-g0 -mcmodel -mno-stack-bias -mstack-bias" |
| 82 | |
91 | |
| 83 | # C[XX]FLAGS that we are think is ok, but needs testing |
92 | # C[XX]FLAGS that we are think is ok, but needs testing |
| 84 | # NOTE: currently -Os have issues with gcc3 and K6* arch's |
93 | # NOTE: currently -Os have issues with gcc3 and K6* arch's |
| 85 | export UNSTABLE_FLAGS="-Os -O3 -freorder-blocks -fprefetch-loop-arrays" |
94 | export UNSTABLE_FLAGS="-Os -O3 -freorder-blocks -fprefetch-loop-arrays" |
| 86 | return 0 |
95 | return 0 |
| … | |
… | |
| 96 | -fstack-protector|-fstack-protector-all) fstack-flags;; |
105 | -fstack-protector|-fstack-protector-all) fstack-flags;; |
| 97 | esac |
106 | esac |
| 98 | done |
107 | done |
| 99 | |
108 | |
| 100 | for fset in CFLAGS CXXFLAGS; do |
109 | for fset in CFLAGS CXXFLAGS; do |
|
|
110 | # Looping over the flags instead of using a global |
|
|
111 | # substitution ensures that we're working with flag atoms. |
|
|
112 | # Otherwise globs like -O* have the potential to wipe out the |
|
|
113 | # list of flags. |
| 101 | for f in ${!fset}; do |
114 | for f in ${!fset}; do |
| 102 | for x in "$@"; do |
115 | for x in "$@"; do |
| 103 | # Note this should work with globs like -O* |
116 | # Note this should work with globs like -O* |
| 104 | [[ ${f} == ${x} ]] && continue 2 |
117 | [[ ${f} == ${x} ]] && continue 2 |
| 105 | done |
118 | done |
| … | |
… | |
| 126 | -n "`is-flag -fno-stack-protector-all`" ] && fstack-flags |
139 | -n "`is-flag -fno-stack-protector-all`" ] && fstack-flags |
| 127 | return 0 |
140 | return 0 |
| 128 | } |
141 | } |
| 129 | |
142 | |
| 130 | replace-flags() { |
143 | replace-flags() { |
| 131 | # we do this fancy spacing stuff so as to not filter |
144 | local f fset |
| 132 | # out part of a flag ... we want flag atoms ! :D |
145 | declare -a new_CFLAGS new_CXXFLAGS |
| 133 | CFLAGS=" ${CFLAGS} " |
146 | |
| 134 | CXXFLAGS=" ${CXXFLAGS} " |
147 | for fset in CFLAGS CXXFLAGS; do |
| 135 | CFLAGS="${CFLAGS// ${1} / ${2} }" |
148 | # Looping over the flags instead of using a global |
| 136 | CXXFLAGS="${CXXFLAGS// ${1} / ${2} }" |
149 | # substitution ensures that we're working with flag atoms. |
| 137 | CFLAGS="${CFLAGS:1:${#CFLAGS}-2}" |
150 | # Otherwise globs like -O* have the potential to wipe out the |
| 138 | CXXFLAGS="${CXXFLAGS:1:${#CXXFLAGS}-2}" |
151 | # list of flags. |
| 139 | export CFLAGS CXXFLAGS |
152 | for f in ${!fset}; do |
|
|
153 | # Note this should work with globs like -O* |
|
|
154 | [[ ${f} == ${1} ]] && f=${2} |
|
|
155 | eval new_${fset}\[\${\#new_${fset}\[@]}]=\${f} |
|
|
156 | done |
|
|
157 | eval export ${fset}=\${new_${fset}\[*]} |
|
|
158 | done |
|
|
159 | |
| 140 | return 0 |
160 | return 0 |
| 141 | } |
161 | } |
| 142 | |
162 | |
| 143 | replace-cpu-flags() { |
163 | replace-cpu-flags() { |
| 144 | local oldcpu newcpu="$1" ; shift |
164 | local oldcpu newcpu="$1" ; shift |
| 145 | for oldcpu in "$@" ; do |
165 | for oldcpu in "$@" ; do |
|
|
166 | # quote to make sure that no globbing is done (particularly on |
|
|
167 | # ${oldcpu} prior to calling replace-flags |
| 146 | replace-flags -march=${oldcpu} -march=${newcpu} |
168 | replace-flags "-march=${oldcpu}" "-march=${newcpu}" |
| 147 | replace-flags -mcpu=${oldcpu} -mcpu=${newcpu} |
169 | replace-flags "-mcpu=${oldcpu}" "-mcpu=${newcpu}" |
| 148 | replace-flags -mtune=${oldcpu} -mtune=${newcpu} |
170 | replace-flags "-mtune=${oldcpu}" "-mtune=${newcpu}" |
| 149 | done |
171 | done |
| 150 | return 0 |
172 | return 0 |
| 151 | } |
173 | } |
| 152 | |
174 | |
| 153 | is-flag() { |
175 | is-flag() { |
| … | |
… | |
| 205 | set -f # disable pathname expansion |
227 | set -f # disable pathname expansion |
| 206 | |
228 | |
| 207 | for x in ${CFLAGS}; do |
229 | for x in ${CFLAGS}; do |
| 208 | for y in ${ALLOWED_FLAGS}; do |
230 | for y in ${ALLOWED_FLAGS}; do |
| 209 | flag=${x%%=*} |
231 | flag=${x%%=*} |
| 210 | if [ "${flag%%${y}}" = "" ]; then |
232 | if [ "${flag%%${y}}" = "" ] ; then |
| 211 | NEW_CFLAGS="${NEW_CFLAGS} ${x}" |
233 | NEW_CFLAGS="${NEW_CFLAGS} ${x}" |
| 212 | break |
234 | break |
| 213 | fi |
235 | fi |
| 214 | done |
236 | done |
| 215 | done |
237 | done |
| 216 | |
238 | |
| 217 | for x in ${CXXFLAGS}; do |
239 | for x in ${CXXFLAGS}; do |
| 218 | for y in ${ALLOWED_FLAGS}; do |
240 | for y in ${ALLOWED_FLAGS}; do |
| 219 | flag=${x%%=*} |
241 | flag=${x%%=*} |
| 220 | if [ "${flag%%${y}}" = "" ]; then |
242 | if [ "${flag%%${y}}" = "" ] ; then |
| 221 | NEW_CXXFLAGS="${NEW_CXXFLAGS} ${x}" |
243 | NEW_CXXFLAGS="${NEW_CXXFLAGS} ${x}" |
| 222 | break |
244 | break |
| 223 | fi |
245 | fi |
| 224 | done |
246 | done |
| 225 | done |
247 | done |
| … | |
… | |
| 388 | |
410 | |
| 389 | etexec-flags() { |
411 | etexec-flags() { |
| 390 | # if you're not using a hardened compiler you wont need this |
412 | # if you're not using a hardened compiler you wont need this |
| 391 | # PIC/no-pic kludge in the first place. |
413 | # PIC/no-pic kludge in the first place. |
| 392 | has_hardened || return 0 |
414 | has_hardened || return 0 |
|
|
415 | # this kludge breaks on amd64, and probably other -fPIC dependant |
|
|
416 | # archs. |
|
|
417 | use amd64 && return 0 |
| 393 | |
418 | |
| 394 | if has_pie || has_pic; then |
419 | if has_pie || has_pic; then |
| 395 | [ -z "`is-flag -fno-pic`" ] && |
420 | [ -z "`is-flag -fno-pic`" ] && |
| 396 | export CFLAGS="${CFLAGS} `test_flag -fno-pic`" |
421 | export CFLAGS="${CFLAGS} `test_flag -fno-pic`" |
| 397 | [ -z "`is-flag -nopie`" ] && |
422 | [ -z "`is-flag -nopie`" ] && |