#!/bin/sh # # Cyril Romain 2006 # Script that bakes the used flags on a per package basis in a package.use hierarchy tree PKGUSE=/etc/portage/package.use # check that package.use does not already exist as a file # note: portage >=2.1 accept package.use to be a directory [ -f $PKGUSE ] && (echo "$PKGUSE already exists but as a file. Please update to portage 2.1 or above and make it a directory." ; exit 1) usage() { echo "Usage: `basename $0` [OPTION] packages" echo "Try '`basename $0` --help' for more information." exit $E_OPTERROR } # Exit and explain usage, if no argument(s) given. [ $# -eq 0 ] && usage # add a package to the package.use directory # $1 the full package name to bake (e.g.' dev-lang/python') function add_package() { # if the package is not in the package.use directory is_installed=`equery u $1 2> /dev/null` if [ "$is_installed" ] ; then # bake the used flags of the package Iflags=`echo $is_installed | sed 's/[-+]\([-+]\)/\1/g' | sed 's/+//'` bakeuse $1 $Iflags else # bake the ready-to-use USE flags of the package emergeFind=`emerge -pv --columns $1` if [ "`echo $emergeFind | grep Error`" ] ; then echo "Bad package name: $1" else available_flags=`echo $emergeFind | grep $1 | egrep -o 'USE="[^"]*' | sed 's/USE="//' | sed 's/[*%]//g'` bakeuse $1 $available_flags fi fi } # bake the use flags of one package # $1 the full package name to bake (e.g.' dev-lang/python') # $2, $3, ..., $n the list of USE flags function bakeuse() { mkdir -p $PKGUSE/$1 echo "Add/update the package.use directory with $1" echo $@ > $PKGUSE/$1/package.use } # bake the use flags of all installed packages function bakeuse_installed() { installed_packages=`emerge -pev --columns world | awk '{ if ($1 ~ /\[ebuild/) print $4 }'` for p in $installed_packages ; do Iflags=`equery u $p | sed 's/[-+]\([-+]\)/\1/g' | sed 's/+//'` bakeuse $p $Iflags done } # check for USE flag conflict - i.e. per-package vs global settings - of installed package function bake_check() { installed_packages=`emerge -pev --columns world | awk '{ if ($1 ~ /\[ebuild/) print $4 }'` for p in $installed_packages ; do flags=`equery u $p` for i in $flags; do globalOveride=`echo $i | grep '+-'` && echo "Warning: $p has $globalOveride" done done } main() { while getopts ":bc-:" Option do case $Option in b ) echo "Bake the USE flags of all installed package." bakeuse_installed;; c ) echo "Check for conflict between per-package and global USE flags." bake_check;; - ) case $OPTARG in bake ) echo "Bake the USE flags of all installed package." bakeuse_installed;; check) echo "Check for conflict between per-package and global USE flags." bake_check;; help ) echo "Usage: `basename $0` [OPTION] packages" echo "Example: `basename $0` dev-lang/lua dev-lang/erlang" echo echo "Options:" echo " --bake (-b short option): to bake the USE flags of all installed package." echo " --check (-c short option): to check for conflict between per-package anf global USE flags." echo " --help to display this help." return 0;; * ) echo "Illegal option chosen --$OPTARG" usage return 1;; # DEFAULT esac;; * ) echo "Illegal option chosen $OPTARG" usage return 1;; # DEFAULT esac done shift $(($OPTIND - 1)) # add packages given in arguments while [ -n "$1" ] ; do add_package $1 shift done } main $* exit 0