USE flag conditional code
Often a particular block of code must only be executed if a given USE flag is
set (or unset). For large blocks, if use foo
is best, or for inverse tests
either if ! use foo
or if use !foo
can be used (the former is more
common and is recommended for readability). For single-statement conditions, the
use foo && blah
(or use foo || blah
for negatives) form is often more
readable.
The if [ "`use foo`" ]
and if [ -n "`use foo`" ]
forms which are
occasionally seen in older code must not be used. This is because, since Portage 2.1, the 'use' Portage helper does not produce any output when the use flag is enabled or disabled so the [ "`use foo`" ] statement is pretty much identical to [ "" ] which always evaluates to false.
die
will not work as expected within a subshell, so code in the
form use foo && ( blah ; blah )
should be avoided in favour of a proper if
statement. See die and subshells.
# USE conditional blocks...
if use livecd ; then
# remove some extra files for a small livecd install
rm -fr "${vimfiles}"/{compiler,doc,ftplugin,indent} || die
fi
# Inverse USE conditional blocks...
if ! use cscope ; then
# the --disable-cscope configure arg doesn't quite work properly,
# so sed it out of feature.h if we're not USEing cscope.
sed -i -e '/# define FEAT_CSCOPE/d' src/feature.h || die "couldn't disable cscope"
fi
# USE conditional statements...
use ssl && eapply "${FILESDIR}/${P}-ssl.patch"
use sparc && filter-flags -fomit-frame-pointer
# Inverse USE conditional statements...
use ncurses || eapply "${FILESDIR}/${P}-no-ncurses.patch"
For echoing content based upon a USE flag, there is often a better helper function available.
It is guaranteed that use
produces no output. If you need output
displayed, use the usev
function; it echoes the USE flag's name
if the condition is met.
The useq
function is a deprecated synonym for use
, don't
use it in new code.