#!/bin/sh## Cyril Romain 2006# Script that bakes the used flags on a per package basis in a package.use hierarchy treePKGUSE=/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 flagsfunction 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 packagesfunction 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 packagefunction 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