Inital Commit - on Clang+LTO
This commit is contained in:
768
bashrc.d/10-flag.sh
Executable file
768
bashrc.d/10-flag.sh
Executable file
@@ -0,0 +1,768 @@
|
||||
#!/bin/bash
|
||||
# (C) Martin V\"ath <martin at mvath.de>
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
FLAG_FILTER_C_CXX=(
|
||||
'-fall-intrinsics'
|
||||
'-fbackslash'
|
||||
'-fcray-pointer'
|
||||
'-fd-lines-as-*'
|
||||
'-fdec*'
|
||||
'-fdefault-*'
|
||||
'-fdollar-ok'
|
||||
'-ffixed-*'
|
||||
'-ffree-*'
|
||||
'-fimplicit-none'
|
||||
'-finteger-4-integer-8'
|
||||
'-fmax-identifier-length*'
|
||||
'-fmodule-private'
|
||||
'-fno-range-check'
|
||||
'-freal-*'
|
||||
'-ftest-forall-temp'
|
||||
'-std=f*'
|
||||
'-std=gnu'
|
||||
'-std=legacy'
|
||||
)
|
||||
|
||||
FLAG_FILTER_CXX_FORTRAN=(
|
||||
'-std=c1*'
|
||||
'-std=c8*'
|
||||
'-std=c9*'
|
||||
'-std=gnu1*'
|
||||
'-std=gnu8*'
|
||||
'-std=gnu9*'
|
||||
'-std=iso*'
|
||||
'-Wimplicit-function-declaration'
|
||||
)
|
||||
|
||||
FLAG_FILTER_C_FORTRAN=(
|
||||
'-fabi-*'
|
||||
'-faligned-new'
|
||||
'-fcheck-new'
|
||||
'-fconcepts'
|
||||
'-fconstexpr-*'
|
||||
'-fdeduce-init-list'
|
||||
'-fext*'
|
||||
'-ffor-scope'
|
||||
'-ffriend-injection'
|
||||
'-fms-extensions'
|
||||
'-fnew-inheriting-ctors'
|
||||
'-fnew-ttp-matching'
|
||||
'-fno-access-control'
|
||||
'-fno-elide-constructors'
|
||||
'-fno-enforce-eh-specs'
|
||||
'-fno-extern-tls-init'
|
||||
'-fno-for-scope'
|
||||
'-fno-gnu-keywords'
|
||||
'-fno-implement-inlines'
|
||||
'-fno-implicit-*'
|
||||
'-fno-nonansi-builtins'
|
||||
'-fno-operator-names'
|
||||
'-fno-optional-diags'
|
||||
'-fno-pretty-templates'
|
||||
'-fno-rtti'
|
||||
'-fno-threadsafe-statics'
|
||||
'-fno-use-cxa-get-exception-ptr'
|
||||
'-fno-weak'
|
||||
'-fnothrow-opt'
|
||||
'-fpermissive'
|
||||
'-frepo'
|
||||
'-fsized-deallocation'
|
||||
'-fstrict-enums'
|
||||
'-fstrong-eval-order'
|
||||
'-ftemplate-*'
|
||||
'-fuse-cxa-atexit'
|
||||
'-fvisibility-*'
|
||||
'-nostdinc++'
|
||||
'-std=c++*'
|
||||
'-std=gnu++*'
|
||||
'-Wabi*'
|
||||
'-Wctor-dtor-privacy'
|
||||
'-Wdelete-non-virtual-dtor'
|
||||
'-Weffc++'
|
||||
'-Wliteral-suffix'
|
||||
'-Wlto-type-mismatch'
|
||||
'-Wmultiple-inheritance'
|
||||
'-Wnamespaces'
|
||||
'-Wno-narrowing'
|
||||
'-Wno-non-template-friend'
|
||||
'-Wno-pmf-conversions'
|
||||
'-Wno-terminate'
|
||||
'-Wnoexcept'
|
||||
'-Wnon-virtual-dtor'
|
||||
'-Wold-style-cast'
|
||||
'-Woverloaded-virtual'
|
||||
'-Wregister'
|
||||
'-Wreorder'
|
||||
'-Wsign-promo'
|
||||
'-Wstrict-null-sentinel'
|
||||
'-Wtemplates'
|
||||
'-Wvirtual-inheritance'
|
||||
)
|
||||
|
||||
FLAG_FILTER_CFLAGS=(
|
||||
)
|
||||
|
||||
FLAG_FILTER_CXXFLAGS=(
|
||||
)
|
||||
|
||||
FLAG_FILTER_FORTRAN=(
|
||||
'-ansi'
|
||||
'-fallow-parameterless-variadic-functions'
|
||||
'-fcilkplus'
|
||||
'-fcond-mismatch'
|
||||
'-fdirectives-only'
|
||||
'-ffreestanding'
|
||||
'-fgimple'
|
||||
'-fgnu-tm'
|
||||
'-fgnu89-inline'
|
||||
'-fhosted'
|
||||
'-flax-vector-conversions'
|
||||
'-fms-extensions'
|
||||
'-fno-asm'
|
||||
'-fno-builtin*'
|
||||
'-fno-signed-bitfields'
|
||||
'-fno-unsigned-bitfields'
|
||||
'-fpermitted-flt-eval-methods*'
|
||||
'-fplan9-extensions'
|
||||
'-fsigned-*'
|
||||
'-fsso-struct*'
|
||||
'-funsigned-*'
|
||||
'-Wchkp'
|
||||
'-Wclobbered'
|
||||
'-Wformat*'
|
||||
'-Wvolatile-register-var'
|
||||
)
|
||||
|
||||
FLAG_FILTER_FFLAGS=(
|
||||
)
|
||||
|
||||
FLAG_FILTER_FCFLAGS=(
|
||||
)
|
||||
|
||||
FLAG_FILTER_F77FLAGS=(
|
||||
)
|
||||
|
||||
FLAG_FILTER_NONGNU=(
|
||||
'-fcf-protection*'
|
||||
'-fdevirtualize-at-ltrans'
|
||||
'-fdevirtualize-speculatively'
|
||||
'-fdirectives-only'
|
||||
'-ffat-lto-objects'
|
||||
'-fgcse*'
|
||||
'-fgraphite*'
|
||||
'-finline-functions'
|
||||
'-fipa-pta'
|
||||
'-fira-loop-pressure'
|
||||
'-fisolate-erroneous-paths-attribute'
|
||||
'-fivopts'
|
||||
'-flimit-function-alignment'
|
||||
'-floop*'
|
||||
'-flto=[0-9]*'
|
||||
'-flto=auto'
|
||||
'-flto=jobserver'
|
||||
'-flto-partition=*'
|
||||
'-flto-compression-level=*'
|
||||
'-fmodulo*'
|
||||
'-fno-enforce-eh-specs'
|
||||
'-fno-ident'
|
||||
'-fno-ipa-cp-clone'
|
||||
'-fno-plt' # causes various runtime segfaults for clang:6 compiled code
|
||||
'-fno-semantic-interposition'
|
||||
'-fnothrow-opt'
|
||||
'-fpredictive-commoning'
|
||||
'-frename-registers'
|
||||
'-freorder-functions'
|
||||
'-frerun-cse-after-loop'
|
||||
'-fsched*'
|
||||
'-fsection-anchors'
|
||||
'-fstack-clash-protection'
|
||||
'-ftree*'
|
||||
'-funsafe-loop*'
|
||||
'-fuse-linker-plugin'
|
||||
'-fvect-cost-model'
|
||||
'-fweb'
|
||||
'-fwhole-program'
|
||||
'-malign-data*'
|
||||
'-mfunction-return*'
|
||||
'-mindirect-branch*'
|
||||
'-mvectorize*'
|
||||
'-Wl,-z,retpolineplt' # does not work, currently
|
||||
)
|
||||
|
||||
FLAG_FILTER_GNU=(
|
||||
'-emit-llvm'
|
||||
'-flto=full'
|
||||
'-flto=thin'
|
||||
'-flto-jobs=*'
|
||||
'-fopenmp=*'
|
||||
'-frewrite-includes'
|
||||
'-fsanitize=cfi'
|
||||
'-fsanitize=safe-stack'
|
||||
'-mllvm'
|
||||
'-mretpoline*'
|
||||
'-polly*'
|
||||
'-Wl,-z,retpolineplt'
|
||||
)
|
||||
|
||||
FlagEval() {
|
||||
case $- in
|
||||
*f*) eval "$*";;
|
||||
*) set -f
|
||||
eval "$*"
|
||||
set +f;;
|
||||
esac
|
||||
}
|
||||
|
||||
FlagNodupAdd() {
|
||||
local addres addf addvar dups
|
||||
dups=$1
|
||||
shift
|
||||
addvar=$1
|
||||
shift
|
||||
eval addres=\$$addvar
|
||||
for addf
|
||||
do case " $addres $dups " in
|
||||
*[[:space:]]"$addf"[[:space:]]*)
|
||||
continue;;
|
||||
esac
|
||||
addres=$addres${addres:+\ }$addf
|
||||
done
|
||||
eval $addvar=\$addres
|
||||
}
|
||||
|
||||
FlagAdd() {
|
||||
FlagNodupAdd '' "$@"
|
||||
}
|
||||
|
||||
FlagSub() {
|
||||
local subres subpat subf subvar sublist
|
||||
subvar=$1
|
||||
shift
|
||||
subres=
|
||||
eval sublist=\$$subvar
|
||||
for subf in $sublist
|
||||
do for subpat
|
||||
do [ -n "${subpat:++}" ] || continue
|
||||
case $subf in
|
||||
$subpat)
|
||||
subf=
|
||||
break;;
|
||||
esac
|
||||
done
|
||||
[ -z "${subf:++}" ] || subres=$subres${subres:+\ }$subf
|
||||
done
|
||||
eval $subvar=\$subres
|
||||
}
|
||||
|
||||
FlagReplace() {
|
||||
local repres repf repcurr repvar reppat
|
||||
repvar=$1
|
||||
shift
|
||||
eval repf=\$$repvar
|
||||
reppat=$1
|
||||
shift
|
||||
repres=
|
||||
for repcurr in $repf
|
||||
do case $repcurr in
|
||||
$reppat)
|
||||
$repfound && FlagAdd repres "$@"
|
||||
continue;;
|
||||
esac
|
||||
repres=$repres${repres:+\ }$repcurr
|
||||
done
|
||||
eval $repvar=\$repres
|
||||
}
|
||||
|
||||
FlagSet() {
|
||||
local setvar
|
||||
setvar=$1
|
||||
shift
|
||||
eval $setvar=\$*
|
||||
}
|
||||
|
||||
FlagAddCFlags() {
|
||||
FlagAdd CFLAGS "$@"
|
||||
FlagAdd CXXFLAGS "$@"
|
||||
}
|
||||
|
||||
FlagSubCFlags() {
|
||||
FlagSub CFLAGS "$@"
|
||||
FlagSub CXXFLAGS "$@"
|
||||
FlagSub CPPFLAGS "$@"
|
||||
FlagSub OPTCFLAGS "$@"
|
||||
FlagSub OPTCXXFLAGS "$@"
|
||||
FlagSub OPTCPPFLAGS "$@"
|
||||
}
|
||||
|
||||
FlagReplaceCFlags() {
|
||||
FlagReplace CFLAGS "$@"
|
||||
FlagReplace CXXFLAGS "$@"
|
||||
FlagReplace CPPFLAGS "$@"
|
||||
FlagSub OPTCFLAGS "$1"
|
||||
FlagSub OPTCXXFLAGS "$1"
|
||||
FlagSub OPTCPPFLAGS "$1"
|
||||
}
|
||||
|
||||
FlagSetCFlags() {
|
||||
FlagSet CFLAGS "$@"
|
||||
CXXFLAGS=$CFLAGS
|
||||
CPPFLAGS=
|
||||
OPTCFLAGS=
|
||||
OPTCXXFLAGS=
|
||||
OPTCPPFLAGS=
|
||||
}
|
||||
|
||||
FlagAddFFlags() {
|
||||
FlagAdd FFLAGS "$@"
|
||||
FlagAdd FCFLAGS "$@"
|
||||
FlagAdd F77FLAGS "$@"
|
||||
}
|
||||
|
||||
FlagSubFFlags() {
|
||||
FlagSub FFLAGS "$@"
|
||||
FlagSub FCFLAGS "$@"
|
||||
FlagSub F77FLAGS "$@"
|
||||
}
|
||||
|
||||
FlagReplaceFFlags() {
|
||||
FlagReplace FFLAGS "$@"
|
||||
FlagReplace FCFLAGS "$@"
|
||||
FlagReplace F77FLAGS "$@"
|
||||
}
|
||||
|
||||
FlagSetFFlags() {
|
||||
FlagSet FFLAGS "$@"
|
||||
FlagSet FCFLAGS "$@"
|
||||
FlagSet F77FLAGS "$@"
|
||||
}
|
||||
|
||||
FlagAddAllFlags() {
|
||||
FlagAddCFlags "$@"
|
||||
FlagAddFFlags "$@"
|
||||
}
|
||||
|
||||
FlagSubAllFlags() {
|
||||
FlagSubCFlags "$@"
|
||||
FlagSubFFlags "$@"
|
||||
FlagSub LDFLAGS "$@"
|
||||
FlagSub OPTLDFLAGS "$@"
|
||||
}
|
||||
|
||||
FlagReplaceAllFlags() {
|
||||
FlagReplaceCFlags "$@"
|
||||
FlagReplaceFFlags "$@"
|
||||
FlagSub LDFLAGS "$1"
|
||||
FlagSub OPTLDFLAGS "$1"
|
||||
}
|
||||
|
||||
FlagSetAllFlags() {
|
||||
FlagSetCFlags "$@"
|
||||
FlagSetFFlags "$@"
|
||||
LDFLAGS=
|
||||
OPTLDFLAGS=
|
||||
}
|
||||
|
||||
FlagAthlon() {
|
||||
FlagSubCFlags '-march=*'
|
||||
FlagAddCFlags '-march=athlon-4'
|
||||
command -v x86_64-pc-linux-gnu-gcc32 >/dev/null 2>&1 && \
|
||||
export CC=x86_64-pc-linux-gnu-gcc32
|
||||
command -v x86_64-pc-linux-gnu-g++32 >/dev/null 2>&1 && \
|
||||
export CXX=x86_64-pc-linux-gnu-g++32
|
||||
}
|
||||
|
||||
FlagExecute() {
|
||||
local ex exy excurr
|
||||
for excurr
|
||||
do case $excurr in
|
||||
'#'*)
|
||||
return;;
|
||||
'!'*)
|
||||
[ "$HOSTTYPE" = 'i686' ] || continue
|
||||
ex=${excurr#?};;
|
||||
'~'*)
|
||||
[ "$HOSTTYPE" = 'x86_64' ] || continue
|
||||
ex=${excurr#?};;
|
||||
*)
|
||||
ex=$excurr;;
|
||||
esac
|
||||
case $ex in
|
||||
/*/*)
|
||||
ex=${ex%/}
|
||||
ex=${ex#/}
|
||||
FlagEval FlagReplaceAllFlags "${ex%%/*}" "${ex#*/}";;
|
||||
'-'*)
|
||||
FlagAddCFlags "$ex";;
|
||||
'+flto*')
|
||||
FlagSubAllFlags '-flto*' '-fuse-linker-plugin' '-emit-llvm';;
|
||||
'+'*)
|
||||
FlagSubAllFlags "-${ex#+}";;
|
||||
'C*FLAGS-='*)
|
||||
FlagEval FlagSubCFlags ${ex#*-=};;
|
||||
'C*FLAGS+='*)
|
||||
FlagEval FlagAddCFlags ${ex#*+=};;
|
||||
'C*FLAGS='*)
|
||||
FlagEval FlagSetCFlags "${ex#*=}";;
|
||||
'C*FLAGS/=/'*/*)
|
||||
ex=${ex%/}
|
||||
ex=${ex#*/=/}
|
||||
FlagEval FlagReplaceCFlags "${ex%%/*}" "${ex#*/}";;
|
||||
'F*FLAGS-='*)
|
||||
FlagEval FlagSubFFlags ${ex#*-=};;
|
||||
'F*FLAGS+='*)
|
||||
FlagEval FlagAddFFlags ${ex#*+=};;
|
||||
'F*FLAGS='*)
|
||||
FlagEval FlagSetFFlags "${ex#*=}";;
|
||||
'F*FLAGS/=/'*/*)
|
||||
ex=${ex%/}
|
||||
ex=${ex#*/=/}
|
||||
FlagEval FlagReplaceFFlags "${ex%%/*}" "${ex#*/}";;
|
||||
'*FLAGS-='*)
|
||||
FlagEval FlagSubAllFlags ${ex#*-=};;
|
||||
'*FLAGS+='*)
|
||||
FlagEval FlagAddAllFlags ${ex#*+=};;
|
||||
'*FLAGS='*)
|
||||
FlagEval FlagSetAllFlags "${ex#*=}";;
|
||||
'*FLAGS/=/'*/*)
|
||||
ex=${ex%/}
|
||||
ex=${ex#*/=/}
|
||||
FlagEval FlagReplaceAllFlags "${ex%%/*}" "${ex#*/}";;
|
||||
'ATHLON32')
|
||||
FlagAthlon;;
|
||||
'NOC*OPT='*|'NOC*='*)
|
||||
FlagEval FlagSet NOCOPT "${ex#*=}"
|
||||
NOCXXOPT=$NOCOPT
|
||||
NOCPPOPT=$NOCOPT;;
|
||||
'NO*OPT='*)
|
||||
FlagEval FlagSet NOCOPT "${ex#*=}"
|
||||
NOCXXOPT=$NOCOPT
|
||||
NOCPPOPT=$NOCOPT
|
||||
NOLDOPT=$NOCOPT;;
|
||||
'NOLD*='*)
|
||||
FlagEval FlagSet NOLDOPT "${ex#*=}"
|
||||
NOLDADD=$NOLDOPT;;
|
||||
'NO*'*)
|
||||
FlagEval FlagSet NOCOPT "${ex#*=}"
|
||||
NOCXXOPT=$NOCOPT
|
||||
NOCPPOPT=$NOCOPT
|
||||
NOLDOPT=$NOCOPT
|
||||
NOLDADD=$NOCOPT
|
||||
NOFFLAGS=$NOCOPT
|
||||
NOFCFLAGS=$NOCOPT
|
||||
NOF77FLAGS=$NOCOPT;;
|
||||
'SAFE')
|
||||
NOCOPT=1
|
||||
NOCXXOPT=1
|
||||
NOCPPOPT=1
|
||||
NOLDOPT=1
|
||||
MESONDEDUP=1
|
||||
LDFLAGS=
|
||||
CONFIG_SITE=
|
||||
NOLAFILEREMOVE=1
|
||||
unset CMAKE_MAKEFILE_GENERATOR;;
|
||||
*' '*'='*)
|
||||
FlagEval "$ex";;
|
||||
*'/=/'*'/'*)
|
||||
ex=${ex%/}
|
||||
exy=${ex#*/=/}
|
||||
FlagEval FlagReplace "${ex%%/=/*}" "${exy%%/*}" "${exy#*/}";;
|
||||
*'-='*)
|
||||
FlagEval FlagSub "${ex%%-=*}" ${ex#*-=};;
|
||||
*'+='*)
|
||||
FlagEval FlagAdd "${ex%%+=*}" ${ex#*+=};;
|
||||
*'='*)
|
||||
FlagEval FlagSet "${ex%%=*}" "${ex#*=}";;
|
||||
*)
|
||||
FlagEval "$ex";;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
FlagMask() {
|
||||
if command -v masked-packages >/dev/null 2>&1
|
||||
then
|
||||
FlagMask() {
|
||||
masked-packages -qm "$1" -- "$CATEGORY/$PF:${SLOT:-0}${PORTAGE_REPO_NAME:+::}${PORTAGE_REPO_NAME-}"
|
||||
}
|
||||
else
|
||||
FlagMask() {
|
||||
local add=
|
||||
case ${1%::*} in
|
||||
*':'*)
|
||||
add=:${SLOT:-0};;
|
||||
esac
|
||||
case $1 in
|
||||
*'::'*)
|
||||
add=$add::$PORTAGE_REPO_NAME;;
|
||||
esac
|
||||
case $1 in
|
||||
'~'*)
|
||||
case "~$CATEGORY/$PN-$PV$add" in
|
||||
$1)
|
||||
return;;
|
||||
esac;;
|
||||
'='*)
|
||||
case "=$CATEGORY/$PF$add" in
|
||||
$1)
|
||||
return;;
|
||||
esac;;
|
||||
*)
|
||||
case "$CATEGORY/$PN$add" in
|
||||
$1)
|
||||
return;;
|
||||
esac;;
|
||||
esac
|
||||
return 1
|
||||
}
|
||||
fi
|
||||
FlagMask "$@"
|
||||
}
|
||||
|
||||
FlagParseLine() {
|
||||
local scanp scanl scansaveifs
|
||||
scanl=$2
|
||||
while :
|
||||
do case $scanl in
|
||||
[[:space:]]*)
|
||||
scanl=${scanl#?}
|
||||
continue;;
|
||||
'#'*)
|
||||
return;;
|
||||
*[[:space:]]*)
|
||||
break;;
|
||||
esac
|
||||
return
|
||||
done
|
||||
scanp=${scanl%%[[:space:]]*}
|
||||
scanl=${scanl#*[[:space:]]}
|
||||
[ -n "${scanl:++}" ] || return 0
|
||||
FlagMask "$scanp" || return 0
|
||||
scansaveifs=$IFS
|
||||
IFS=$1
|
||||
BashrcdEcho "$scanfile -> $scanp: $scanl"
|
||||
FlagEval FlagExecute $scanl
|
||||
IFS=$scansaveifs
|
||||
}
|
||||
|
||||
FlagScanFiles() {
|
||||
local scanfile scanl oldifs scanifs
|
||||
scanifs=$IFS
|
||||
IFS=
|
||||
for scanfile
|
||||
do [ -z "${scanfile:++}" ] && continue
|
||||
test -r "$scanfile" || continue
|
||||
while read -r scanl
|
||||
do FlagParseLine "$scanifs" "$scanl"
|
||||
done <"$scanfile"
|
||||
done
|
||||
IFS=$scanifs
|
||||
}
|
||||
|
||||
FlagScanDir() {
|
||||
local scantmp scanifs scanfile
|
||||
scanifs=$IFS
|
||||
if test -d "$1"
|
||||
then IFS='
|
||||
'
|
||||
for scantmp in `find -L "$1" \
|
||||
'(' '(' -name '.*' -o -name '*~' ')' -prune ')' -o \
|
||||
-type f -print`
|
||||
do IFS=$scanifs
|
||||
FlagScanFiles "$scantmp"
|
||||
done
|
||||
else FlagScanFiles "$1"
|
||||
fi
|
||||
scanfile='FLAG_ADDLINES'
|
||||
IFS='
|
||||
'
|
||||
for scantmp in $FLAG_ADDLINES
|
||||
do FlagParseLine "$scanifs" "$scantmp"
|
||||
done
|
||||
IFS=$scanifs
|
||||
}
|
||||
|
||||
FlagSetUseNonGNU() {
|
||||
case $CC$CXX in
|
||||
*clang*)
|
||||
return 0;;
|
||||
esac
|
||||
return 1
|
||||
}
|
||||
|
||||
FlagSetNonGNU() {
|
||||
: ${NOLDADD:=1}
|
||||
FlagSubAllFlags "${FLAG_FILTER_NONGNU[@]}"
|
||||
FlagReplaceAllFlags '-fstack-check*' '-fstack-check'
|
||||
# FlagAddCFlags '-flto' '-emit-llvm'
|
||||
}
|
||||
|
||||
FlagSetGNU() {
|
||||
FlagSubAllFlags "${FLAG_FILTER_GNU[@]}"
|
||||
}
|
||||
|
||||
FlagMesonDedup() {
|
||||
local newld=
|
||||
FlagNodupAdd "$CFLAGS $CXXFLAGS $CPPFLAGS $FFLAGS $FCFLAGS $F77FLAGS" \
|
||||
newld $LDFLAGS
|
||||
LDFLAGS=$newld
|
||||
}
|
||||
|
||||
FlagSetFlags() {
|
||||
local ld i
|
||||
ld=
|
||||
: ${PGO_PARENT:=/var/cache/pgo}
|
||||
: ${PGO_DIR:=$PGO_PARENT/$CATEGORY:$P}
|
||||
FlagScanDir "${PORTAGE_CONFIGROOT%/}/etc/portage/package.cflags"
|
||||
[ -z "${USE_NONGNU++}" ] && FlagSetUseNonGNU && USE_NONGNU=1
|
||||
if BashrcdTrue "${USE_NONGNU-}"
|
||||
then FlagSetNonGNU
|
||||
else FlagSetGNU
|
||||
fi
|
||||
if [ -n "$FLAG_ADD" ]
|
||||
then BashrcdEcho "FLAG_ADD: $FLAG_ADD"
|
||||
FlagEval FlagExecute "$FLAG_ADD"
|
||||
fi
|
||||
PGO_DIR=${PGO_DIR%/}
|
||||
case ${PGO_DIR:-/} in
|
||||
/)
|
||||
error 'PGO_DIR must not be empty'
|
||||
false;;
|
||||
/*)
|
||||
:;;
|
||||
*)
|
||||
error 'PGO_DIR must be an absolute path'
|
||||
false;;
|
||||
esac || {
|
||||
die 'Bad PGO_DIR'
|
||||
exit 2
|
||||
}
|
||||
use_pgo=false
|
||||
if test -r "$PGO_DIR"
|
||||
then unset PGO
|
||||
BashrcdTrue $NOPGO || use_pgo=:
|
||||
fi
|
||||
if BashrcdTrue $PGO
|
||||
then FlagAddCFlags "-fprofile-generate=$PGO_DIR" \
|
||||
-fvpt -fprofile-arcs
|
||||
FlagAdd LDFLAGS -fprofile-arcs
|
||||
addpredict "$PGO_PARENT"
|
||||
elif $use_pgo
|
||||
then FlagAddCFlags "-fprofile-use=$PGO_DIR" \
|
||||
-fvpt -fbranch-probabilities -fprofile-correction
|
||||
else : ${KEEPPGO:=:}
|
||||
fi
|
||||
BashrcdTrue $NOLDOPT || FlagAdd LDFLAGS $OPTLDFLAGS
|
||||
BashrcdTrue $NOCADD || BashrcdTrue $MESONDEDUP || \
|
||||
case " $LDFLAGS $CFLAGS $CXXFLAGS" in
|
||||
*[[:space:]]'-flto'*)
|
||||
ld="$CFLAGS $CXXFLAGS";;
|
||||
esac
|
||||
BashrcdTrue $NOLDADD || BashrcdTrue $MESONDEDUP || FlagAddCFlags $LDFLAGS
|
||||
FlagAdd LDFLAGS $ld
|
||||
BashrcdTrue $NOCOPT || FlagAdd CFLAGS $OPTCFLAGS
|
||||
BashrcdTrue $NOCXXOPT || FlagAdd CXXFLAGS $OPTCXXFLAGS
|
||||
BashrcdTrue $NOCPPOPT || FlagAdd CPPFLAGS $OPTCPPFLAGS
|
||||
BashrcdTrue $NOFFLAGS || FFLAGS=$CFLAGS
|
||||
BashrcdTrue $NOFCFLAGS || FCFLAGS=$FFLAGS
|
||||
BashrcdTrue $NOF77FLAGS || F77FLAGS=$FFLAGS
|
||||
BashrcdTrue $NOFILTER_CXXFLAGS || FlagSub CXXFLAGS \
|
||||
"${FLAG_FILTER_C_CXX[@]}" "${FLAG_FILTER_CXX_FORTRAN[@]}" \
|
||||
"${FLAG_FILTER_CXXFLAGS[@]}"
|
||||
BashrcdTrue $NOFILTER_CFLAGS || FlagSub CFLAGS \
|
||||
"${FLAG_FILTER_C_CXX[@]}" "${FLAG_FILTER_C_FORTRAN[@]}" \
|
||||
"${FLAG_FILTER_CFLAGS[@]}"
|
||||
BashrcdTrue $NOFILTER_FFLAGS || FlagSub FFLAGS \
|
||||
"${FLAG_FILTER_C_FORTRAN[@]}" "${FLAG_FILTER_CXX_FORTRAN[@]}" \
|
||||
"${FLAG_FILTER_FORTRAN[@]}" "${FLAG_FILTER_FFLAGS[@]}"
|
||||
BashrcdTrue $NOFILTER_FCFLAGS || FlagSub FCFLAGS \
|
||||
"${FLAG_FILTER_C_FORTRAN[@]}" "${FLAG_FILTER_CXX_FORTRAN[@]}" \
|
||||
"${FLAG_FILTER_FORTRAN[@]}" "${FLAG_FILTER_FCFLAGS[@]}"
|
||||
BashrcdTrue $NOFILTER_F77FLAGS || FlagSub FCFLAGS \
|
||||
"${FLAG_FILTER_C_FORTRAN[@]}" "${FLAG_FILTER_CXX_FORTRAN[@]}" \
|
||||
"${FLAG_FILTER_FORTRAN[@]}" "${FLAG_FILTER_F77LAGS[@]}"
|
||||
! BashrcdTrue $MESONDEDUP || FlagMesonDedup
|
||||
unset OPTCFLAGS OPTCXXFLAGS OPTCPPFLAGS OPTLDFLAGS
|
||||
unset NOLDOPT NOLDADD NOCOPT NOCXXOPT NOFFLAGS NOFCFLAGS NOF77FLAGS
|
||||
unset NOFILTER_CXXFLAGS NOFILTER_CFLAGS
|
||||
unset NOFILTER_FFLAGS NOFILTER_FCFLAGS NOFILTER_F77FLAGS
|
||||
}
|
||||
|
||||
FlagInfoExport() {
|
||||
local out
|
||||
for out in FEATURES CFLAGS CXXFLAGS CPPFLAGS FFLAGS FCFLAGS F77FLAGS \
|
||||
LDFLAGS MAKEOPTS EXTRA_ECONF EXTRA_EMAKE USE_NONGNU
|
||||
do eval "if [ -n \"\${$out:++}\" ]
|
||||
then export $out
|
||||
BashrcdEcho \"$out='\$$out'\"
|
||||
else unset $out
|
||||
fi"
|
||||
done
|
||||
if BashrcdTrue $PGO
|
||||
then BashrcdEcho "Create PGO into $PGO_DIR"
|
||||
elif $use_pgo
|
||||
then BashrcdEcho "Using PGO from $PGO_DIR"
|
||||
fi
|
||||
out=`${CC:-gcc} --version | head -n 1` || out=
|
||||
BashrcdEcho "${out:-cannot determine gcc version}"
|
||||
out=`${CXX:-g++} --version | head -n 1` || out=
|
||||
BashrcdEcho "${out:-cannot determine g++ version}"
|
||||
out=`${LD:-ld} --version | head -n 1` || out=
|
||||
BashrcdEcho "${out:-cannot determine ld version}"
|
||||
BashrcdEcho "`uname -a`"
|
||||
}
|
||||
|
||||
FlagCompile() {
|
||||
eerror \
|
||||
"${PORTAGE_CONFIGROOT%/}/etc/portage/bashrc.d/*flag.sh strange order of EBUILD_PHASE:"
|
||||
die "compile or preinst before setup"
|
||||
exit 2
|
||||
}
|
||||
|
||||
FlagPreinst() {
|
||||
FlagCompile
|
||||
}
|
||||
|
||||
FlagSetup() {
|
||||
FlagCompile() {
|
||||
:
|
||||
}
|
||||
local use_pgo
|
||||
FlagSetFlags
|
||||
if BashrcdTrue $PGO
|
||||
then
|
||||
FlagPreinst() {
|
||||
test -d "$PGO_DIR" || mkdir -p -m +1777 -- "$PGO_DIR" || {
|
||||
eerror "cannot create pgo directory $PGO_DIR"
|
||||
die 'cannot create PGO_DIR'
|
||||
exit 2
|
||||
}
|
||||
ewarn "$CATEGORY/$PN will write profile info to world-writable"
|
||||
ewarn "$PGO_DIR"
|
||||
ewarn 'Reemerge it soon for an optimized version and removal of that directory'
|
||||
}
|
||||
elif BashrcdTrue $KEEPPGO
|
||||
then
|
||||
FlagPreinst() {
|
||||
:
|
||||
}
|
||||
else
|
||||
FlagPreinst() {
|
||||
test -d "$PGO_DIR" || return 0
|
||||
BashrcdLog "removing pgo directory $PGO_DIR"
|
||||
rm -r -f -- "$PGO_DIR" || {
|
||||
eerror "cannot remove pgo directory $PGO_DIR"
|
||||
die 'cannot remove PGO_DIR'
|
||||
exit 2
|
||||
}
|
||||
local g
|
||||
g=${PGO_DIR%/*}
|
||||
[ -z "$g" ] || rmdir -p -- "$g" >/dev/null 2>&1
|
||||
}
|
||||
fi
|
||||
FlagInfoExport
|
||||
}
|
||||
|
||||
BashrcdPhase compile FlagCompile
|
||||
BashrcdPhase preinst FlagPreinst
|
||||
BashrcdPhase setup FlagSetup
|
||||
Reference in New Issue
Block a user