Skip to content

Instantly share code, notes, and snippets.

@ormaaj
Created April 15, 2013 14:53
Show Gist options
  • Select an option

  • Save ormaaj/5388684 to your computer and use it in GitHub Desktop.

Select an option

Save ormaaj/5388684 to your computer and use it in GitHub Desktop.
/etc/portage/bashrc -- Magic hook functions for Gentoo
#!/usr/bin/env bash
# /etc/portage/bashrc
# Dan Douglas <ormaaj@gmail.com>
[[ $EBUILD_PHASE != setup ]] && return
# Set up the initial associative array of CFLAGS and CXXFLAGS.
# Takes an array name to assign and optionally the names of "flag groups" to include.
# setupFlags arrname groupname [ groupname ... ]
setupFlags() {
if [[ $FUNCNAME != "${FUNCNAME[1]}" ]]; then
if [[ -z $1 ]]; then
eerror "${FUNCNAME}: Must pass at least a non-empty associative array name argument."
return 1
else
# Base CFLAG groups
local -A groups=(
[base]='(-march=native -Ofast -mmmx -pipe)'
[graphite]='(-floop-interchange -floop-strip-mine -floop-block)'
[debug]='(-ggdb)'
[dragonegg]='(-fplugin=/usr/lib64/llvm/dragonegg.so -fplugin-arg-dragonegg-enable-gcc-optzns)'
)
local x
for x in "${@:2}"; do
if ${groups[$x]:+false}; then
eerror "${FUNCNAME}: Invalid flag group name: ${x}"
return 1
else
local -a "y=${groups[$x]}" 'z+=("${y[@]}")'
fi
done
"$FUNCNAME" "$1" "$(printf '[%q]= ' "${z[@]}")"
fi
else
unset -v x y z groups
eval "${1}=(${2})"
fi
}
# runHooks "$CATEGORY" "$PN"
runHooks() {
local x
for x; do
[[ $x ]] || return
done
# Define mappings from package names to hook functions.
local -A categoryDefs=(
[dev-db]='([sqlite]=noFast)'
[dev-util]='([valgrind]=noFast)'
[media-gfx]='([digikam]=dgKamFix)'
[sys-devel]='([binutils]=xdoBinutils)'
) ${1:+${categoryDefs[$1]:+"packageDefs=${categoryDefs[$1]}"}}
# If a hook is defined for the current package, run it. Otherwise setup
# default flags. Remember if you want to use default flags as a base for a
# hook, you must run setupFlags within the hook. This allows using
# different default flag groups as a base per-package.
local -A flags
if declare -f "${packageDefs[$2]:-:}" >/dev/null 2>&1; then
${2:+"${packageDefs[$2]:-false}"} || return
${2:+unset -f "${packageDefs[$2]}"}
einfo "Hook function: ${packageDefs[$2]} -- finished successfully. :)"
else
# Each defined key of the "flags" array will become part of CFLAGS.
setupFlags flags base graphite debug || die 'setupFlags failed'
einfo "No hook function defined for ${1}/${2} -- used default flag groups. :)"
fi
export C{,XX}"FLAGS=${!flags[*]}"
}
# Clean up our mess.
cleanup() {
unset -f setupFlags runHooks main cleanup
}
main() {
local -a shopts=(extglob lastpipe)
local opt
for opt in "${!shopts[@]}"; do
if shopt -q "${shopts[opt]}"; then
unset -v 'shopts[opt]'
else
shopt -s "${shopts[opt]}"
fi
done
(( ${#shopts[@]} )) && trap 'trap RETURN; shopt -u "${shopts[@]}"' RETURN
runHooks "$CATEGORY" "$PN" || die 'hook failed'
I_PROMISE_TO_SUPPLY_PATCHES_WITH_BUGS=1
cleanup
}
#########
# All package hooks below
#########
dgKamFix() {
setupFlags flags base graphite debug || return
export MYSQL_TOOLS_PATH=/usr/share/mysql/scripts
}
doBinutils() {
setupFlags flags base graphite debug || return
export EXTRA_ECONF=--enable-gold=default
}
_doKsh() {
setupFlags flags base graphite debug || return
pre_pkg_setup() {
local d='printf "<%s> " "${FUNCNAME[@]}"; echo; inherit flag-o-matic; trap -- DEBUG RETURN'
local -a dcmd=( trap "$(printf %q "$d")" DEBUG )
trap "${dcmd[*]}" RETURN
printf "<%s> " "${FUNCNAME[@]}"; echo
}
pre_src_prepare() {
append-flags "-fplugin=/usr/$(get_libdir)/llvm/dragonegg.so" -fplugin-arg-dragonegg-enable-gcc-optzns
einfo "${FUNCNAME}: applied - $_"
local x srcdir=/home/smorg/doc/programs/ast-open
pushd "$srcdir"
addwrite "$srcdir"
git checkout 2012-05-15
for x in **/Mamfile; do
[[ -d ${WORKDIR}/${x%Mamfile} ]] && cp "$x" "${WORKDIR}/${x%Mamfile}"
done
git checkout master
adddeny "$srcdir"
popd
}
}
noFast() {
setupFlags flags base graphite debug || return
unset -v 'flags[-Ofast]'
flags[-O3]=
}
doChromium() {
setupFlags flags base graphite debug || return
pre_src_configure() {
egyp() {
replace-flags -O2 -O3
append-flags -floop-interchange -floop-strip-mine -floop-block
local -a cmd=( build/gyp_chromium --depth=. "$@" )
printf '<%q> ' "${cmd[@]}" >&2
"${cmd[@]}"
}
}
}
main "$@"
# vim: set fenc=utf-8 ff=unix ft=sh :
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment