/[gentoo-x86]/eclass/flag-o-matic.eclass
Gentoo

Contents of /eclass/flag-o-matic.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.121 - (hide annotations) (download)
Sat Feb 16 22:43:04 2008 UTC (6 years, 5 months ago) by vapier
Branch: MAIN
Changes since 1.120: +142 -89 lines
add eclass documentation #210394 by mren

1 vapier 1.121 # Copyright 1999-2008 Gentoo Foundation
2 verwilst 1.1 # Distributed under the terms of the GNU General Public License v2
3 vapier 1.121 # $Header: $
4    
5     # @ECLASS: flag-o-matic.eclass
6     # @MAINTAINER:
7     # toolchain@gentoo.org
8     # @BLURB: common functions to manipulate and query toolchain flags
9     # @DESCRIPTION:
10     # This eclass contains a suite of functions to help developers sanely
11     # and safely manage toolchain flags in their builds.
12 vapier 1.63
13 eradicator 1.80 inherit eutils toolchain-funcs multilib
14 vapier 1.72
15 kevquinn 1.92 ################ DEPRECATED functions ################
16     # The following are still present to avoid breaking existing
17     # code more than necessary; however they are deprecated. Please
18     # use gcc-specs-* from toolchain-funcs.eclass instead, if you
19     # need to know which hardened techs are active in the compiler.
20     # See bug #100974
21     #
22 vapier 1.121 # has_hardened
23     # has_pie
24     # has_pic
25     # has_ssp_all
26     # has_ssp
27    
28 verwilst 1.3
29 azarah 1.17 # C[XX]FLAGS that we allow in strip-flags
30 vapier 1.117 # Note: shell globs and character lists are allowed
31 vapier 1.36 setup-allowed-flags() {
32 vapier 1.84 if [[ -z ${ALLOWED_FLAGS} ]] ; then
33 vapier 1.76 export ALLOWED_FLAGS="-pipe"
34     export ALLOWED_FLAGS="${ALLOWED_FLAGS} -O -O0 -O1 -O2 -mcpu -march -mtune"
35 vapier 1.87 export ALLOWED_FLAGS="${ALLOWED_FLAGS} -fstack-protector -fstack-protector-all"
36 vapier 1.119 export ALLOWED_FLAGS="${ALLOWED_FLAGS} -fbounds-checking"
37 kevquinn 1.105 export ALLOWED_FLAGS="${ALLOWED_FLAGS} -fno-PIE -fno-pie -fno-unit-at-a-time"
38 vapier 1.117 export ALLOWED_FLAGS="${ALLOWED_FLAGS} -g -g[0-9] -ggdb -ggdb[0-9] -gstabs -gstabs+"
39 vapier 1.107 export ALLOWED_FLAGS="${ALLOWED_FLAGS} -fno-ident"
40 dberkholz 1.120 export ALLOWED_FLAGS="${ALLOWED_FLAGS} -W* -w"
41 vapier 1.44 fi
42 vapier 1.65 # allow a bunch of flags that negate features / control ABI
43 vapier 1.119 ALLOWED_FLAGS="${ALLOWED_FLAGS} -fno-stack-protector -fno-stack-protector-all \
44     -fno-strict-aliasing -fno-bounds-checking"
45 vapier 1.87 ALLOWED_FLAGS="${ALLOWED_FLAGS} -mregparm -mno-app-regs -mapp-regs \
46     -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-3dnow \
47     -mips1 -mips2 -mips3 -mips4 -mips32 -mips64 -mips16 \
48     -msoft-float -mno-soft-float -mhard-float -mno-hard-float -mfpu \
49 vapier 1.110 -mieee -mieee-with-inexact -mschedule \
50 vapier 1.91 -mtls-direct-seg-refs -mno-tls-direct-seg-refs \
51 vapier 1.87 -mflat -mno-flat -mno-faster-structs -mfaster-structs \
52     -m32 -m64 -mabi -mlittle-endian -mbig-endian -EL -EB -fPIC \
53 vapier 1.114 -mlive-g0 -mcmodel -mstack-bias -mno-stack-bias \
54 vapier 1.115 -msecure-plt -D*"
55 vapier 1.36
56     # C[XX]FLAGS that we are think is ok, but needs testing
57     # NOTE: currently -Os have issues with gcc3 and K6* arch's
58 vapier 1.106 export UNSTABLE_FLAGS="-Os -O3 -freorder-blocks"
59 vapier 1.36 return 0
60 aliz 1.24 }
61 verwilst 1.13
62 kevquinn 1.105 # inverted filters for hardened compiler. This is trying to unpick
63     # the hardened compiler defaults.
64     _filter-hardened() {
65     local f
66     for f in "$@" ; do
67     case "${f}" in
68     # Ideally we should only concern ourselves with PIE flags,
69     # not -fPIC or -fpic, but too many places filter -fPIC without
70     # thinking about -fPIE.
71     -fPIC|-fpic|-fPIE|-fpie|-Wl,pie|-pie)
72     gcc-specs-pie || continue
73     is-flagq -nopie || append-flags -nopie;;
74     -fstack-protector)
75     gcc-specs-ssp || continue
76     is-flagq -fno-stack-protector || append-flags -fno-stack-protector;;
77     -fstack-protector-all)
78     gcc-specs-ssp-to-all || continue
79     is-flagq -fno-stack-protector-all || append-flags -fno-stack-protector-all;;
80 solar 1.27 esac
81     done
82 kevquinn 1.105 }
83    
84     # Remove occurrences of strings from variable given in $1
85     # Strings removed are matched as globs, so for example
86     # '-O*' would remove -O1, -O2 etc.
87     _filter-var() {
88     local f x VAR VAL
89     declare -a new
90 vapier 1.36
91 kevquinn 1.105 VAR=$1
92     shift
93     eval VAL=\${${VAR}}
94     for f in ${VAL}; do
95     for x in "$@"; do
96     # Note this should work with globs like -O*
97     [[ ${f} == ${x} ]] && continue 2
98 agriffis 1.61 done
99 kevquinn 1.105 eval new\[\${\#new\[@]}]=\${f}
100 verwilst 1.1 done
101 kevquinn 1.105 eval export ${VAR}=\${new\[*]}
102     }
103 agriffis 1.61
104 vapier 1.121 # @FUNCTION: filter-flags
105     # @USAGE: <flags>
106     # @DESCRIPTION:
107     # Remove particular <flags> from {C,CPP,CXX}FLAGS. Accepts shell globs.
108 kevquinn 1.105 filter-flags() {
109     _filter-hardened "$@"
110     _filter-var CFLAGS "$@"
111 vapier 1.118 _filter-var CPPFLAGS "$@"
112 kevquinn 1.105 _filter-var CXXFLAGS "$@"
113 vapier 1.36 return 0
114 verwilst 1.2 }
115    
116 vapier 1.121 # @FUNCTION: filter-lfs-flags
117     # @DESCRIPTION:
118     # Remove flags that enable Large File Support.
119 vapier 1.40 filter-lfs-flags() {
120 vapier 1.93 [[ -n $@ ]] && die "filter-lfs-flags takes no arguments"
121 vapier 1.40 filter-flags -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
122     }
123    
124 vapier 1.121 # @FUNCTION: append-cppflags
125     # @USAGE: <flags>
126     # @DESCRIPTION:
127     # Add extra <flags> to the current CPPFLAGS.
128 vapier 1.118 append-cppflags() {
129     [[ -z $* ]] && return 0
130     export CPPFLAGS="${CPPFLAGS} $*"
131     return 0
132     }
133    
134 vapier 1.121 # @FUNCTION: append-lfs-flags
135     # @DESCRIPTION:
136     # Add flags that enable Large File Support.
137 vapier 1.48 append-lfs-flags() {
138 vapier 1.93 [[ -n $@ ]] && die "append-lfs-flags takes no arguments"
139 vapier 1.118 append-cppflags -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
140 vapier 1.48 }
141    
142 vapier 1.121 # @FUNCTION: append-flags
143     # @USAGE: <flags>
144     # @DESCRIPTION:
145     # Add extra <flags> to your current C[XX]FLAGS.
146 vapier 1.18 append-flags() {
147 solar 1.82 [[ -z $* ]] && return 0
148 agriffis 1.58 export CFLAGS="${CFLAGS} $*"
149     export CXXFLAGS="${CXXFLAGS} $*"
150 vapier 1.28 return 0
151 verwilst 1.1 }
152    
153 vapier 1.121 # @FUNCTION: replace-flags
154     # @USAGE: <old> <new>
155     # @DESCRIPTION:
156     # Replace the <old> flag with <new>. Accepts shell globs for <old>.
157 vapier 1.18 replace-flags() {
158 vapier 1.93 [[ $# != 2 ]] \
159     && echo && eerror "Usage: replace-flags <old flag> <new flag>" \
160     && die "replace-flags takes 2 arguments, not $#"
161    
162 mr_bones_ 1.83 local f fset
163 agriffis 1.64 declare -a new_CFLAGS new_CXXFLAGS
164    
165     for fset in CFLAGS CXXFLAGS; do
166     # Looping over the flags instead of using a global
167     # substitution ensures that we're working with flag atoms.
168     # Otherwise globs like -O* have the potential to wipe out the
169     # list of flags.
170     for f in ${!fset}; do
171     # Note this should work with globs like -O*
172     [[ ${f} == ${1} ]] && f=${2}
173     eval new_${fset}\[\${\#new_${fset}\[@]}]=\${f}
174     done
175     eval export ${fset}=\${new_${fset}\[*]}
176     done
177    
178 vapier 1.28 return 0
179 danarmak 1.7 }
180    
181 vapier 1.121 # @FUNCTION: replace-cpu-flags
182     # @USAGE: <old> <new>
183     # @DESCRIPTION:
184     # Replace cpu flags (like -march/-mcpu/-mtune) that select the <old> cpu
185     # with flags that select the <new> cpu. Accepts shell globs for <old>.
186 vapier 1.37 replace-cpu-flags() {
187 vapier 1.70 local newcpu="$#" ; newcpu="${!newcpu}"
188     while [ $# -gt 1 ] ; do
189 agriffis 1.64 # quote to make sure that no globbing is done (particularly on
190 vapier 1.113 # ${oldcpu}) prior to calling replace-flags
191 vapier 1.70 replace-flags "-march=${1}" "-march=${newcpu}"
192     replace-flags "-mcpu=${1}" "-mcpu=${newcpu}"
193     replace-flags "-mtune=${1}" "-mtune=${newcpu}"
194     shift
195 vapier 1.37 done
196     return 0
197     }
198    
199 vapier 1.113 _is_flagq() {
200 kevquinn 1.105 local x
201 vapier 1.113 for x in ${!1} ; do
202     [[ ${x} == $2 ]] && return 0
203 kevquinn 1.105 done
204     return 1
205     }
206    
207 vapier 1.121 # @FUNCTION: is-flagq
208     # @USAGE: <flag>
209     # @DESCRIPTION:
210     # Returns shell true if <flag> is in C[XX]FLAGS, else returns shell false. Accepts shell globs.
211 vapier 1.113 is-flagq() {
212     [[ -n $2 ]] && die "Usage: is-flag <flag>"
213     _is_flagq CFLAGS $1 || _is_flagq CXXFLAGS $1
214     }
215    
216 vapier 1.121 # @FUNCTION: is-flag
217     # @USAGE: <flag>
218     # @DESCRIPTION:
219     # Echo's "true" if flag is set in C[XX]FLAGS. Accepts shell globs.
220 danarmak 1.7 is-flag() {
221 vapier 1.113 is-flagq "$@" && echo true
222 kevquinn 1.105 }
223    
224 vapier 1.121 # @FUNCTION: is-ldflagq
225     # @USAGE: <flag>
226     # @DESCRIPTION:
227     # Returns shell true if <flag> is in LDFLAGS, else returns shell false. Accepts shell globs.
228 kevquinn 1.105 is-ldflagq() {
229 vapier 1.113 [[ -n $2 ]] && die "Usage: is-ldflag <flag>"
230     _is_flagq LDFLAGS $1
231 verwilst 1.1 }
232 azarah 1.8
233 vapier 1.121 # @FUNCTION: is-ldflag
234     # @USAGE: <flag>
235     # @DESCRIPTION:
236     # Echo's "true" if flag is set in LDFLAGS. Accepts shell globs.
237 kevquinn 1.105 is-ldflag() {
238 vapier 1.113 is-ldflagq "$@" && echo true
239 kevquinn 1.105 }
240    
241 vapier 1.121 # @FUNCTION: filter-mfpmath
242     # @USAGE: <math types>
243     # @DESCRIPTION:
244     # Remove specified math types from the fpmath flag. For example, if the user
245     # has -mfpmath=sse,386, running `filter-mfpmath sse` will leave the user with
246     # -mfpmath=386.
247 vapier 1.36 filter-mfpmath() {
248 agriffis 1.58 local orig_mfpmath new_math prune_math
249    
250 vapier 1.36 # save the original -mfpmath flag
251 vapier 1.109 orig_mfpmath=$(get-flag -mfpmath)
252 vapier 1.36 # get the value of the current -mfpmath flag
253 vapier 1.109 new_math=$(get-flag mfpmath)
254     new_math=" ${new_math//,/ } "
255 vapier 1.36 # figure out which math values are to be removed
256 agriffis 1.58 prune_math=""
257 vapier 1.36 for prune_math in "$@" ; do
258 vapier 1.109 new_math=${new_math/ ${prune_math} / }
259 vapier 1.36 done
260 vapier 1.109 new_math=$(echo ${new_math})
261     new_math=${new_math// /,}
262 vapier 1.36
263 vapier 1.109 if [[ -z ${new_math} ]] ; then
264 vapier 1.36 # if we're removing all user specified math values are
265     # slated for removal, then we just filter the flag
266     filter-flags ${orig_mfpmath}
267     else
268     # if we only want to filter some of the user specified
269     # math values, then we replace the current flag
270     replace-flags ${orig_mfpmath} -mfpmath=${new_math}
271     fi
272     return 0
273     }
274    
275 vapier 1.121 # @FUNCTION: strip-flags
276     # @DESCRIPTION:
277     # Strip C[XX]FLAGS of everything except known good/safe flags.
278 azarah 1.8 strip-flags() {
279 agriffis 1.58 local x y flag NEW_CFLAGS NEW_CXXFLAGS
280    
281 vapier 1.36 setup-allowed-flags
282    
283 azarah 1.8 local NEW_CFLAGS=""
284     local NEW_CXXFLAGS=""
285    
286 azarah 1.17 # Allow unstable C[XX]FLAGS if we are using unstable profile ...
287 vapier 1.84 if has ~$(tc-arch) ${ACCEPT_KEYWORDS} ; then
288 azarah 1.17 ALLOWED_FLAGS="${ALLOWED_FLAGS} ${UNSTABLE_FLAGS}"
289     fi
290    
291 agriffis 1.58 set -f # disable pathname expansion
292 azarah 1.8
293 agriffis 1.58 for x in ${CFLAGS}; do
294     for y in ${ALLOWED_FLAGS}; do
295 lostlogic 1.14 flag=${x%%=*}
296 vapier 1.65 if [ "${flag%%${y}}" = "" ] ; then
297 lostlogic 1.14 NEW_CFLAGS="${NEW_CFLAGS} ${x}"
298     break
299 azarah 1.8 fi
300     done
301     done
302    
303 agriffis 1.58 for x in ${CXXFLAGS}; do
304     for y in ${ALLOWED_FLAGS}; do
305 lostlogic 1.14 flag=${x%%=*}
306 vapier 1.65 if [ "${flag%%${y}}" = "" ] ; then
307 lostlogic 1.14 NEW_CXXFLAGS="${NEW_CXXFLAGS} ${x}"
308     break
309 azarah 1.8 fi
310     done
311     done
312 azarah 1.30
313     # In case we filtered out all optimization flags fallback to -O2
314     if [ "${CFLAGS/-O}" != "${CFLAGS}" -a "${NEW_CFLAGS/-O}" = "${NEW_CFLAGS}" ]; then
315     NEW_CFLAGS="${NEW_CFLAGS} -O2"
316     fi
317     if [ "${CXXFLAGS/-O}" != "${CXXFLAGS}" -a "${NEW_CXXFLAGS/-O}" = "${NEW_CXXFLAGS}" ]; then
318     NEW_CXXFLAGS="${NEW_CXXFLAGS} -O2"
319     fi
320 azarah 1.8
321 agriffis 1.58 set +f # re-enable pathname expansion
322 azarah 1.8
323     export CFLAGS="${NEW_CFLAGS}"
324     export CXXFLAGS="${NEW_CXXFLAGS}"
325 vapier 1.36 return 0
326 puggy 1.29 }
327    
328 azarah 1.96 test-flag-PROG() {
329     local comp=$1
330     local flags="$2"
331    
332     [[ -z ${comp} || -z ${flags} ]] && \
333     return 1
334    
335     local PROG=$(tc-get${comp})
336     ${PROG} ${flags} -S -o /dev/null -xc /dev/null \
337     > /dev/null 2>&1
338     }
339    
340 vapier 1.121 # @FUNCTION: test-flag-CC
341     # @USAGE: <flag>
342     # @DESCRIPTION:
343     # Returns shell true if <flag> is supported by the C compiler, else returns shell false.
344 azarah 1.96 test-flag-CC() { test-flag-PROG "CC" "$1"; }
345    
346 vapier 1.121 # @FUNCTION: test-flag-CXX
347     # @USAGE: <flag>
348     # @DESCRIPTION:
349     # Returns shell true if <flag> is supported by the C++ compiler, else returns shell false.
350 azarah 1.96 test-flag-CXX() { test-flag-PROG "CXX" "$1"; }
351    
352 azarah 1.99 test-flags-PROG() {
353     local comp=$1
354     local flags
355 azarah 1.96 local x
356 azarah 1.99
357     shift
358    
359 vapier 1.113 [[ -z ${comp} ]] && return 1
360 swegener 1.101
361 vapier 1.113 x=""
362 azarah 1.96 for x in "$@" ; do
363 vapier 1.113 test-flag-${comp} "${x}" && flags="${flags}${flags:+ }${x}"
364 azarah 1.96 done
365    
366 azarah 1.99 echo "${flags}"
367 azarah 1.96
368 azarah 1.99 # Just bail if we dont have any flags
369     [[ -n ${flags} ]]
370 azarah 1.96 }
371    
372 vapier 1.121 # @FUNCTION: test-flags-CC
373     # @USAGE: <flags>
374     # @DESCRIPTION:
375     # Returns shell true if <flags> are supported by the C compiler, else returns shell false.
376 azarah 1.99 test-flags-CC() { test-flags-PROG "CC" "$@"; }
377    
378 vapier 1.121 # @FUNCTION: test-flags-CXX
379     # @USAGE: <flags>
380     # @DESCRIPTION:
381     # Returns shell true if <flags> are supported by the C++ compiler, else returns shell false.
382 azarah 1.99 test-flags-CXX() { test-flags-PROG "CXX" "$@"; }
383    
384 vapier 1.121 # @FUNCTION: test-flags
385     # @USAGE: <flags>
386     # @DESCRIPTION:
387 azarah 1.99 # Short-hand that should hopefully work for both C and C++ compiler, but
388 azarah 1.100 # its really only present due to the append-flags() abomination.
389 azarah 1.99 test-flags() { test-flags-CC "$@"; }
390    
391 vapier 1.121 # @FUNCTION: test_flag
392     # @DESCRIPTION:
393     # DEPRICIATED, use test-flags()
394 vapier 1.36 test_flag() {
395 kevquinn 1.104 ewarn "test_flag: deprecated, please use test-flags()!" >&2
396 azarah 1.96
397 azarah 1.99 test-flags-CC "$@"
398 puggy 1.29 }
399    
400 vapier 1.121 # @FUNCTION: test_version_info
401     # @USAGE: <version>
402     # @DESCRIPTION:
403     # Returns shell true if the current C compiler version matches <version>, else returns shell false.
404     # Accepts shell globs.
405 agriffis 1.58 test_version_info() {
406 vapier 1.75 if [[ $($(tc-getCC) --version 2>&1) == *$1* ]]; then
407 agriffis 1.58 return 0
408     else
409     return 1
410     fi
411     }
412    
413 vapier 1.121 # @FUNCTION: strip-unsupported-flags
414     # @DESCRIPTION:
415     # Strip C[XX]FLAGS of any flags not supported by the active toolchain.
416 puggy 1.29 strip-unsupported-flags() {
417 vapier 1.113 export CFLAGS=$(test-flags-CC ${CFLAGS})
418     export CXXFLAGS=$(test-flags-CXX ${CXXFLAGS})
419 azarah 1.8 }
420    
421 vapier 1.121 # @FUNCTION: get-flag
422     # @USAGE: <flag>
423     # @DESCRIPTION:
424     # Find and echo the value for a particular flag. Accepts shell globs.
425 vapier 1.10 get-flag() {
426 agriffis 1.58 local f findflag="$1"
427    
428 vapier 1.36 # this code looks a little flaky but seems to work for
429     # everything we want ...
430     # for example, if CFLAGS="-march=i686":
431 agriffis 1.58 # `get-flag -march` == "-march=i686"
432     # `get-flag march` == "i686"
433 vapier 1.10 for f in ${CFLAGS} ${CXXFLAGS} ; do
434     if [ "${f/${findflag}}" != "${f}" ] ; then
435 agriffis 1.58 printf "%s\n" "${f/-${findflag}=}"
436 vapier 1.28 return 0
437 vapier 1.10 fi
438     done
439 vapier 1.28 return 1
440 joker 1.16 }
441    
442 vapier 1.121 # @FUNCTION: has_hardened
443     # @DESCRIPTION:
444 kevquinn 1.92 # DEPRECATED - use gcc-specs-relro or gcc-specs-now from toolchain-funcs
445 solar 1.53 has_hardened() {
446 kevquinn 1.104 ewarn "has_hardened: deprecated, please use gcc-specs-{relro,now}()!" >&2
447 swegener 1.101
448 lv 1.69 test_version_info Hardened && return 0
449 azarah 1.96 # The specs file wont exist unless gcc has GCC_SPECS support
450     [[ -f ${GCC_SPECS} && ${GCC_SPECS} != ${GCC_SPECS/hardened/} ]]
451 solar 1.53 }
452    
453 vapier 1.121 # @FUNCTION: has_pic
454     # @DESCRIPTION:
455 kevquinn 1.92 # DEPRECATED - use gcc-specs-pie from toolchain-funcs
456 solar 1.81 # indicate whether PIC is set
457 tseng 1.42 has_pic() {
458 kevquinn 1.104 ewarn "has_pic: deprecated, please use gcc-specs-pie()!" >&2
459 swegener 1.101
460 azarah 1.96 [[ ${CFLAGS/-fPIC} != ${CFLAGS} || \
461 kevquinn 1.105 ${CFLAGS/-fpic} != ${CFLAGS} ]] || \
462     gcc-specs-pie
463 tseng 1.42 }
464    
465 vapier 1.121 # @FUNCTION: has_pie
466     # @DESCRIPTION:
467 kevquinn 1.92 # DEPRECATED - use gcc-specs-pie from toolchain-funcs
468 solar 1.81 # indicate whether PIE is set
469 mr_bones_ 1.83 has_pie() {
470 kevquinn 1.104 ewarn "has_pie: deprecated, please use gcc-specs-pie()!" >&2
471 swegener 1.101
472 azarah 1.96 [[ ${CFLAGS/-fPIE} != ${CFLAGS} || \
473 kevquinn 1.105 ${CFLAGS/-fpie} != ${CFLAGS} ]] || \
474     gcc-specs-pie
475 tseng 1.42 }
476 mr_bones_ 1.83
477 vapier 1.121 # @FUNCTION: has_ssp_all
478     # @DESCRIPTION:
479 kevquinn 1.92 # DEPRECATED - use gcc-specs-ssp from toolchain-funcs
480 solar 1.86 # indicate whether code for SSP is being generated for all functions
481     has_ssp_all() {
482 kevquinn 1.104 ewarn "has_ssp_all: deprecated, please use gcc-specs-ssp()!" >&2
483 swegener 1.101
484 solar 1.86 # note; this matches only -fstack-protector-all
485 azarah 1.96 [[ ${CFLAGS/-fstack-protector-all} != ${CFLAGS} || \
486     -n $(echo | $(tc-getCC) ${CFLAGS} -E -dM - | grep __SSP_ALL__) ]] || \
487 kevquinn 1.105 gcc-specs-ssp-all
488 solar 1.86 }
489    
490 vapier 1.121 # @FUNCTION: has_ssp
491     # @DESCRIPTION:
492 kevquinn 1.92 # DEPRECATED - use gcc-specs-ssp from toolchain-funcs
493 solar 1.81 # indicate whether code for SSP is being generated
494 tseng 1.42 has_ssp() {
495 kevquinn 1.104 ewarn "has_ssp: deprecated, please use gcc-specs-ssp()!" >&2
496 swegener 1.101
497 solar 1.81 # note; this matches both -fstack-protector and -fstack-protector-all
498 azarah 1.96 [[ ${CFLAGS/-fstack-protector} != ${CFLAGS} || \
499     -n $(echo | $(tc-getCC) ${CFLAGS} -E -dM - | grep __SSP__) ]] || \
500     gcc-specs-ssp
501 tseng 1.42 }
502    
503 vapier 1.121 # @FUNCTION: has_m64
504     # @DESCRIPTION:
505     # This doesn't test if the flag is accepted, it tests if the flag actually
506     # WORKS. Non-multilib gcc will take both -m32 and -m64. If the flag works
507     # return code is 0, else the return code is 1.
508 lv 1.56 has_m64() {
509 lv 1.62 # this doesnt test if the flag is accepted, it tests if the flag
510     # actually -WORKS-. non-multilib gcc will take both -m32 and -m64!
511     # please dont replace this function with test_flag in some future
512     # clean-up!
513 swegener 1.101
514 vapier 1.72 local temp="$(emktemp)"
515 azarah 1.96 echo "int main() { return(0); }" > "${temp}".c
516 kugelfang 1.74 MY_CC=$(tc-getCC)
517 azarah 1.96 ${MY_CC/ .*/} -m64 -o "$(emktemp)" "${temp}".c > /dev/null 2>&1
518 vapier 1.72 local ret=$?
519 azarah 1.96 rm -f "${temp}".c
520     [[ ${ret} != 1 ]] && return 0
521 lv 1.62 return 1
522 lv 1.56 }
523    
524 vapier 1.121 # @FUNCTION: has_m32
525     # @DESCRIPTION:
526     # This doesn't test if the flag is accepted, it tests if the flag actually
527     # WORKS. Non-mulilib gcc will take both -m32 and -64. If the flag works return
528     # code is 0, else return code is 1.
529 lv 1.56 has_m32() {
530 lv 1.62 # this doesnt test if the flag is accepted, it tests if the flag
531     # actually -WORKS-. non-multilib gcc will take both -m32 and -m64!
532     # please dont replace this function with test_flag in some future
533     # clean-up!
534 eradicator 1.80
535     [ "$(tc-arch)" = "amd64" ] && has_multilib_profile && return 0
536    
537 vapier 1.95 local temp=$(emktemp)
538     echo "int main() { return(0); }" > "${temp}".c
539 kugelfang 1.74 MY_CC=$(tc-getCC)
540 vapier 1.95 ${MY_CC/ .*/} -m32 -o "$(emktemp)" "${temp}".c > /dev/null 2>&1
541 vapier 1.72 local ret=$?
542 vapier 1.95 rm -f "${temp}".c
543 azarah 1.96 [[ ${ret} != 1 ]] && return 0
544 lv 1.62 return 1
545 lv 1.56 }
546    
547 vapier 1.121 # @FUNCTION: replace-sparc64-flags
548     # @DESCRIPTION:
549     # Sets mcpu to v8 and uses the original value as mtune if none specified.
550 vapier 1.18 replace-sparc64-flags() {
551 fmccor 1.98 local SPARC64_CPUS="ultrasparc3 ultrasparc v9"
552 joker 1.16
553 mr_bones_ 1.83 if [ "${CFLAGS/mtune}" != "${CFLAGS}" ]; then
554 agriffis 1.58 for x in ${SPARC64_CPUS}; do
555 joker 1.16 CFLAGS="${CFLAGS/-mcpu=${x}/-mcpu=v8}"
556     done
557 mr_bones_ 1.83 else
558 swegener 1.111 for x in ${SPARC64_CPUS}; do
559 joker 1.16 CFLAGS="${CFLAGS/-mcpu=${x}/-mcpu=v8 -mtune=${x}}"
560     done
561     fi
562 mr_bones_ 1.83
563     if [ "${CXXFLAGS/mtune}" != "${CXXFLAGS}" ]; then
564 agriffis 1.58 for x in ${SPARC64_CPUS}; do
565 joker 1.16 CXXFLAGS="${CXXFLAGS/-mcpu=${x}/-mcpu=v8}"
566     done
567     else
568 swegener 1.111 for x in ${SPARC64_CPUS}; do
569 joker 1.16 CXXFLAGS="${CXXFLAGS/-mcpu=${x}/-mcpu=v8 -mtune=${x}}"
570     done
571     fi
572 vapier 1.59
573     export CFLAGS CXXFLAGS
574 solar 1.27 }
575    
576 vapier 1.121 # @FUNCTION: append-ldflags
577     # @USAGE: <flags>
578     # @DESCRIPTION:
579     # Add extra <flags> to the current LDFLAGS.
580 solar 1.27 append-ldflags() {
581 kevquinn 1.105 [[ -z $* ]] && return 0
582 vapier 1.59 export LDFLAGS="${LDFLAGS} $*"
583 vapier 1.28 return 0
584 solar 1.27 }
585    
586 vapier 1.121 # @FUNCTION: filter-ldflags
587     # @USAGE: <flags>
588     # @DESCRIPTION:
589     # Remove particular <flags> from LDFLAGS. Accepts shell globs.
590 solar 1.41 filter-ldflags() {
591 kevquinn 1.105 _filter-var LDFLAGS "$@"
592 solar 1.41 return 0
593     }
594    
595 vapier 1.121 # @FUNCTION: raw-ldflags
596     # @USAGE: <flags>
597     # @DESCRIPTION:
598 kevquinn 1.105 # Turn C style ldflags (-Wl,-foo) into straight ldflags - the results
599     # are suitable for passing directly to 'ld'; note LDFLAGS is usually passed
600     # to gcc where it needs the '-Wl,'.
601 vapier 1.102 raw-ldflags() {
602     local x input="$@"
603     [[ -z ${input} ]] && input=${LDFLAGS}
604     set --
605     for x in ${input} ; do
606 vapier 1.103 x=${x#-Wl,}
607     set -- "$@" ${x//,/ }
608 vapier 1.102 done
609     echo "$@"
610     }
611    
612 vapier 1.121 # @FUNCTION: bindnow-flags
613     # @RETURN: Returns the flags to enable "now" binding in the current selected linker.
614     # @DESCRIPTION:
615     # DEPRECATED - Gets the flags needed for "NOW" binding
616 flameeyes 1.94 bindnow-flags() {
617 vapier 1.121 ewarn "QA: stop using the bindnow-flags function ... simply drop it from your ebuild"
618    
619 flameeyes 1.94 case $($(tc-getLD) -v 2>&1 </dev/null) in
620     *GNU* | *'with BFD'*) # GNU ld
621     echo "-Wl,-z,now" ;;
622     *Apple*) # Darwin ld
623     echo "-bind_at_load" ;;
624     *)
625     # Some linkers just recognize -V instead of -v
626     case $($(tc-getLD) -V 2>&1 </dev/null) in
627     *Solaris*) # Solaris accept almost the same GNU options
628     echo "-Wl,-z,now" ;;
629     esac
630     ;;
631     esac
632     }
633 vapier 1.113
634    
635     # Some tests for when we screw with things and want to make
636     # sure we didn't break anything
637     #TESTS() {
638     # CFLAGS="-a -b -c=1"
639     # CXXFLAGS="-x -y -z=2"
640     # LDFLAGS="-l -m -n=3"
641     #
642     # die() { exit 1; }
643     # (is-flag 1 2 3) && die
644     # (is-ldflag 1 2 3) && die
645     #
646     # is-flagq -l && die
647     # is-ldflagq -a && die
648     # is-flagq -a || die
649     # is-flagq -x || die
650     # is-ldflagq -n=* || die
651     # is-ldflagq -n && die
652     #
653     # strip-unsupported-flags
654     # [[ ${CFLAGS} == "-c=1" ]] || die
655     # [[ ${CXXFLAGS} == "-y -z=2" ]] || die
656     #
657     # echo "All tests pass"
658     #}
659     #TESTS

  ViewVC Help
Powered by ViewVC 1.1.20