aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'profiles/arch/amd64/profile.bashrc')
-rw-r--r--profiles/arch/amd64/profile.bashrc93
1 files changed, 93 insertions, 0 deletions
diff --git a/profiles/arch/amd64/profile.bashrc b/profiles/arch/amd64/profile.bashrc
new file mode 100644
index 00000000..e30b428e
--- /dev/null
+++ b/profiles/arch/amd64/profile.bashrc
@@ -0,0 +1,93 @@
+BAD_FLAGS=( "-fvisibility=hidden" "-fvisibility-hidden" "-fvisibility-inlines-hidden" "-fPIC" "-fpic" "-m32" "-m64" "-g3" "-ggdb3" "-ffast-math" )
+
+getPROG() {
+ local var=$1 prog=$2
+
+ if [[ -n ${!var} ]] ; then
+ echo "${!var}"
+ return 0
+ fi
+
+ local search=
+ [[ -n $3 ]] && search=$(type -p "$3-${prog}")
+ [[ -z ${search} && -n ${CHOST} ]] && search=$(type -p "${CHOST}-${prog}")
+ [[ -n ${search} ]] && prog=${search##*/}
+
+ export ${var}=${prog}
+ echo "${!var}"
+}
+
+get_broken_flags() {
+ local myprog="${1}" lang="${2}"
+ shift 2
+
+ # this finds general broken flags, such as -02 or bogus -f flags
+ echo 'main(){}' | LC_ALL=C ${myprog} ${@} -x ${lang} -o /dev/null - 2>&1 | \
+ egrep "unrecognized .*option" | \
+ egrep -o -- '('\''|\"|`)-.*' | \
+ sed -r 's/('\''|`|")//g; s/^/"/; s/$/"/'
+
+ # this will find bogus debug output types, such as -gfoobar
+ echo 'main(){}' | LC_ALL=C ${myprog} ${@} -x ${lang} -o /dev/null - 2>&1 | \
+ egrep "unrecognised debug output" | \
+ egrep -o -- '('\''|\"|`).*' | \
+ sed -r 's/('\''|`|")//g; s/^/"-g/; s/$/"/'
+}
+
+remove_flag() {
+ local remove="${1}"
+ shift
+
+ while [[ "${1}" ]]; do
+ [[ "${1}" != "${remove}" ]] && echo -n "${1} "
+ shift
+ done
+}
+
+filter_invalid_flags() {
+ local flag broken_flags
+
+ eval broken_flags=( $(get_broken_flags $(getPROG CC gcc) c ${CFLAGS}) )
+ for flag in "${broken_flags[@]}"; do
+ ewarn "Filtering out invalid CFLAG \"${flag}\""
+ CFLAGS="$(remove_flag "${flag}" ${CFLAGS})"
+ done
+
+ eval broken_flags=( $(get_broken_flags $(getPROG CXX g++) c++ ${CXXFLAGS}) )
+ for flag in "${broken_flags[@]}"; do
+ ewarn "Filtering out invalid CXXFLAG \"${flag}\""
+ CXXFLAGS="$(remove_flag "${flag}" ${CXXFLAGS})"
+ done
+}
+
+bashrc_has() {
+ [[ " ${*:2} " == *" $1 "* ]]
+}
+
+if [[ ${EBUILD_PHASE} == "setup" ]]; then
+
+ filter_invalid_flags
+
+ unset trigger
+
+ for flag in "${BAD_FLAGS[@]}"; do
+ if bashrc_has ${flag} ${CFLAGS}; then
+ trigger=1
+ eerror "Your CFLAGS contains \"${flag}\" which can break packages."
+ fi
+ if bashrc_has ${flag} ${CXXFLAGS}; then
+ trigger=1
+ eerror "Your CXXFLAGS contains \"${flag}\" which can break packages."
+ fi
+ done
+ if [[ ${trigger} ]]; then
+ eerror ""
+ eerror "Before you file a bug, please remove these flags and "
+ eerror "re-compile the package in question as well as all its dependencies"
+ sleep 5
+ fi
+
+ unset flag trigger
+fi
+
+unset BAD_FLAGS