/[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.145 - (hide annotations) (download)
Sun Oct 4 10:00:53 2009 UTC (5 years, 1 month ago) by ssuominen
Branch: MAIN
Changes since 1.144: +9 -1 lines
New function: no-as-needed which returns the value to disable asneeded, for GNU ld only at this time.

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

  ViewVC Help
Powered by ViewVC 1.1.20