Created
April 15, 2013 14:53
-
-
Save ormaaj/5388684 to your computer and use it in GitHub Desktop.
/etc/portage/bashrc -- Magic hook functions for Gentoo
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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